[netcdf] 01/08: Imported Upstream version 4.5.0~rc1

Bas Couwenberg sebastic at debian.org
Tue Jun 6 12:12:38 UTC 2017


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository netcdf.

commit 9e1d50fa02e685adf5763c48a8177c10ccdfff5b
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Jun 6 07:16:49 2017 +0200

    Imported Upstream version 4.5.0~rc1
---
 CMakeLists.txt                                     |   311 +-
 COPYRIGHT                                          |     1 +
 Make0                                              |    13 +-
 Makefile.am                                        |    32 +-
 Makefile.in                                        |    42 +-
 RELEASE_NOTES.md                                   |    30 +-
 acinclude.m4                                       |    22 +
 cf                                                 |    37 +-
 cf.cmake                                           |    92 +-
 config.h.cmake.in                                  |   826 +-
 config.h.cmake.in.old-works                        |   316 +
 config.h.in                                        |    34 +-
 configure                                          |   623 +-
 configure.ac                                       |   199 +-
 dap4_test/CMakeLists.txt                           |    56 +
 dap4_test/Make0                                    |    70 +
 dap4_test/Makefile.am                              |    78 +
 dap4_test/Makefile.in                              |  1155 +
 .../baseline}/CMakeLists.txt                       |     0
 dap4_test/baseline/test_anon_dim.2.syn.d4d         |    13 +
 dap4_test/baseline/test_anon_dim.2.syn.d4m         |    10 +
 dap4_test/baseline/test_anon_dim.2.syn.d4p         |    21 +
 dap4_test/baseline/test_anon_dim.syn.d4d           |    13 +
 dap4_test/baseline/test_anon_dim.syn.d4m           |     9 +
 dap4_test/baseline/test_anon_dim.syn.d4p           |    18 +
 dap4_test/baseline/test_atomic_array.5.nc.d4d      |    28 +
 dap4_test/baseline/test_atomic_array.5.nc.d4m      |    16 +
 dap4_test/baseline/test_atomic_array.5.nc.d4p      |    34 +
 dap4_test/baseline/test_atomic_array.8.nc.d4d      |    13 +
 dap4_test/baseline/test_atomic_array.8.nc.d4m      |    10 +
 dap4_test/baseline/test_atomic_array.8.nc.d4p      |    21 +
 dap4_test/baseline/test_atomic_array.9.nc.d4d      |    13 +
 dap4_test/baseline/test_atomic_array.9.nc.d4m      |    10 +
 dap4_test/baseline/test_atomic_array.9.nc.d4p      |    21 +
 dap4_test/baseline/test_atomic_array.nc.d4d        |    51 +
 dap4_test/baseline/test_atomic_array.nc.d4m        |    27 +
 dap4_test/baseline/test_atomic_array.nc.d4p        |    66 +
 dap4_test/baseline/test_atomic_array.syn.d4d       |    54 +
 dap4_test/baseline/test_atomic_array.syn.d4m       |    27 +
 dap4_test/baseline/test_atomic_array.syn.d4p       |    67 +
 dap4_test/baseline/test_atomic_types.nc.d4d        |    60 +
 dap4_test/baseline/test_atomic_types.nc.d4m        |    29 +
 dap4_test/baseline/test_atomic_types.nc.d4p        |    51 +
 dap4_test/baseline/test_atomic_types.syn.d4d       |    61 +
 dap4_test/baseline/test_atomic_types.syn.d4m       |    29 +
 dap4_test/baseline/test_atomic_types.syn.d4p       |    52 +
 dap4_test/baseline/test_enum.nc.d4d                |    16 +
 dap4_test/baseline/test_enum.nc.d4m                |    13 +
 dap4_test/baseline/test_enum.nc.d4p                |    33 +
 dap4_test/baseline/test_enum_2.nc.d4d              |    19 +
 dap4_test/baseline/test_enum_2.nc.d4m              |    16 +
 dap4_test/baseline/test_enum_2.nc.d4p              |    37 +
 dap4_test/baseline/test_enum_array.4.nc.d4d        |    19 +
 dap4_test/baseline/test_enum_array.4.nc.d4m        |    16 +
 dap4_test/baseline/test_enum_array.4.nc.d4p        |    40 +
 dap4_test/baseline/test_enum_array.nc.d4d          |    18 +
 dap4_test/baseline/test_enum_array.nc.d4m          |    15 +
 dap4_test/baseline/test_enum_array.nc.d4p          |    37 +
 dap4_test/baseline/test_fill.nc.d4d                |    17 +
 dap4_test/baseline/test_fill.nc.d4m                |    10 +
 dap4_test/baseline/test_fill.nc.d4p                |    19 +
 dap4_test/baseline/test_groups1.nc.d4d             |    38 +
 dap4_test/baseline/test_groups1.nc.d4m             |    28 +
 dap4_test/baseline/test_groups1.nc.d4p             |    48 +
 dap4_test/baseline/test_one_var.nc.d4d             |    10 +
 dap4_test/baseline/test_one_var.nc.d4m             |     7 +
 dap4_test/baseline/test_one_var.nc.d4p             |    13 +
 dap4_test/baseline/test_one_vararray.1.nc.d4d      |    13 +
 dap4_test/baseline/test_one_vararray.1.nc.d4m      |    10 +
 dap4_test/baseline/test_one_vararray.1.nc.d4p      |    21 +
 dap4_test/baseline/test_one_vararray.3.nc.d4d      |    13 +
 dap4_test/baseline/test_one_vararray.3.nc.d4m      |    10 +
 dap4_test/baseline/test_one_vararray.3.nc.d4p      |    21 +
 dap4_test/baseline/test_one_vararray.nc.d4d        |    12 +
 dap4_test/baseline/test_one_vararray.nc.d4m        |     9 +
 dap4_test/baseline/test_one_vararray.nc.d4p        |    18 +
 dap4_test/baseline/test_opaque.nc.d4d              |    12 +
 dap4_test/baseline/test_opaque.nc.d4m              |     9 +
 dap4_test/baseline/test_opaque.nc.d4p              |    13 +
 dap4_test/baseline/test_opaque_array.7.nc.d4d      |    18 +
 dap4_test/baseline/test_opaque_array.7.nc.d4m      |    13 +
 dap4_test/baseline/test_opaque_array.7.nc.d4p      |    23 +
 dap4_test/baseline/test_opaque_array.nc.d4d        |    17 +
 dap4_test/baseline/test_opaque_array.nc.d4m        |    11 +
 dap4_test/baseline/test_opaque_array.nc.d4p        |    19 +
 dap4_test/baseline/test_sequence_1.syn.d4d         |    16 +
 dap4_test/baseline/test_sequence_1.syn.d4m         |    13 +
 dap4_test/baseline/test_sequence_1.syn.d4p         |    20 +
 dap4_test/baseline/test_sequence_2.syn.d4d         |    19 +
 dap4_test/baseline/test_sequence_2.syn.d4m         |    15 +
 dap4_test/baseline/test_sequence_2.syn.d4p         |    25 +
 dap4_test/baseline/test_struct1.nc.d4d             |    16 +
 dap4_test/baseline/test_struct1.nc.d4m             |    13 +
 dap4_test/baseline/test_struct1.nc.d4p             |    22 +
 dap4_test/baseline/test_struct_array.6.nc.d4d      |    21 +
 dap4_test/baseline/test_struct_array.6.nc.d4m      |    16 +
 dap4_test/baseline/test_struct_array.6.nc.d4p      |    30 +
 dap4_test/baseline/test_struct_array.nc.d4d        |    23 +
 dap4_test/baseline/test_struct_array.nc.d4m        |    16 +
 dap4_test/baseline/test_struct_array.nc.d4p        |    28 +
 dap4_test/baseline/test_struct_array.syn.d4d       |    31 +
 dap4_test/baseline/test_struct_array.syn.d4m       |    18 +
 dap4_test/baseline/test_struct_array.syn.d4p       |    34 +
 dap4_test/baseline/test_struct_nested.nc.d4d       |    24 +
 dap4_test/baseline/test_struct_nested.nc.d4m       |    21 +
 dap4_test/baseline/test_struct_nested.nc.d4p       |    30 +
 dap4_test/baseline/test_struct_nested3.nc.d4d      |    20 +
 dap4_test/baseline/test_struct_nested3.nc.d4m      |    17 +
 dap4_test/baseline/test_struct_nested3.nc.d4p      |    24 +
 dap4_test/baseline/test_struct_type.nc.d4d         |    16 +
 dap4_test/baseline/test_struct_type.nc.d4m         |    13 +
 dap4_test/baseline/test_struct_type.nc.d4p         |    22 +
 dap4_test/baseline/test_unlim1.nc.d4d              |    36 +
 dap4_test/baseline/test_unlim1.nc.d4m              |    21 +
 dap4_test/baseline/test_unlim1.nc.d4p              |    52 +
 dap4_test/baseline/test_utf8.nc.d4d                |    12 +
 dap4_test/baseline/test_utf8.nc.d4m                |     9 +
 dap4_test/baseline/test_utf8.nc.d4p                |    18 +
 dap4_test/baseline/test_vlen1.nc.d4d               |    15 +
 dap4_test/baseline/test_vlen1.nc.d4m               |    12 +
 dap4_test/baseline/test_vlen1.nc.d4p               |    19 +
 dap4_test/baseline/test_vlen2.nc.d4d               |    21 +
 dap4_test/baseline/test_vlen2.nc.d4m               |    15 +
 dap4_test/baseline/test_vlen2.nc.d4p               |    26 +
 dap4_test/baseline/test_vlen3.nc.d4d               |    18 +
 dap4_test/baseline/test_vlen3.nc.d4m               |    15 +
 dap4_test/baseline/test_vlen3.nc.d4p               |    22 +
 dap4_test/baseline/test_vlen4.nc.d4d               |    20 +
 dap4_test/baseline/test_vlen4.nc.d4m               |    17 +
 dap4_test/baseline/test_vlen4.nc.d4p               |    27 +
 dap4_test/baseline/test_vlen5.nc.d4d               |    20 +
 dap4_test/baseline/test_vlen5.nc.d4m               |    17 +
 dap4_test/baseline/test_vlen5.nc.d4p               |    27 +
 dap4_test/baseline/test_vlen6.nc.d4d               |    17 +
 dap4_test/baseline/test_vlen6.nc.d4m               |    14 +
 dap4_test/baseline/test_vlen6.nc.d4p               |    24 +
 dap4_test/baseline/test_vlen7.nc.d4d               |    17 +
 dap4_test/baseline/test_vlen7.nc.d4m               |    14 +
 dap4_test/baseline/test_vlen7.nc.d4p               |    24 +
 dap4_test/baseline/test_vlen8.nc.d4d               |    20 +
 dap4_test/baseline/test_vlen8.nc.d4m               |    15 +
 dap4_test/baseline/test_vlen8.nc.d4p               |    26 +
 .../baselineraw}/CMakeLists.txt                    |     0
 dap4_test/baselineraw/test_anon_dim.2.syn.dmp      |    13 +
 dap4_test/baselineraw/test_anon_dim.syn.dmp        |    13 +
 dap4_test/baselineraw/test_atomic_array.5.nc.dmp   |    28 +
 dap4_test/baselineraw/test_atomic_array.8.nc.dmp   |    13 +
 dap4_test/baselineraw/test_atomic_array.9.nc.dmp   |    13 +
 dap4_test/baselineraw/test_atomic_array.nc.dmp     |    51 +
 dap4_test/baselineraw/test_atomic_array.syn.dmp    |    54 +
 dap4_test/baselineraw/test_atomic_types.nc.dmp     |    60 +
 dap4_test/baselineraw/test_atomic_types.syn.dmp    |    61 +
 dap4_test/baselineraw/test_enum.nc.dmp             |    16 +
 dap4_test/baselineraw/test_enum_2.nc.dmp           |    19 +
 dap4_test/baselineraw/test_enum_array.4.nc.dmp     |    19 +
 dap4_test/baselineraw/test_enum_array.nc.dmp       |    18 +
 dap4_test/baselineraw/test_fill.nc.dmp             |    17 +
 dap4_test/baselineraw/test_groups1.nc.dmp          |    38 +
 dap4_test/baselineraw/test_one_var.nc.dmp          |    10 +
 dap4_test/baselineraw/test_one_vararray.1.nc.dmp   |    13 +
 dap4_test/baselineraw/test_one_vararray.3.nc.dmp   |    13 +
 dap4_test/baselineraw/test_one_vararray.nc.dmp     |    12 +
 dap4_test/baselineraw/test_opaque.nc.dmp           |    12 +
 dap4_test/baselineraw/test_opaque_array.7.nc.dmp   |    18 +
 dap4_test/baselineraw/test_opaque_array.nc.dmp     |    17 +
 dap4_test/baselineraw/test_sequence_1.syn.dmp      |    16 +
 dap4_test/baselineraw/test_sequence_2.syn.dmp      |    19 +
 dap4_test/baselineraw/test_struct1.nc.dmp          |    16 +
 dap4_test/baselineraw/test_struct_array.6.nc.dmp   |    21 +
 dap4_test/baselineraw/test_struct_array.nc.dmp     |    23 +
 dap4_test/baselineraw/test_struct_array.syn.dmp    |    31 +
 dap4_test/baselineraw/test_struct_nested.nc.dmp    |    24 +
 dap4_test/baselineraw/test_struct_nested3.nc.dmp   |    20 +
 dap4_test/baselineraw/test_struct_type.nc.dmp      |    16 +
 dap4_test/baselineraw/test_unlim1.nc.dmp           |    36 +
 dap4_test/baselineraw/test_utf8.nc.dmp             |    12 +
 dap4_test/baselineraw/test_vlen1.nc.dmp            |    15 +
 dap4_test/baselineraw/test_vlen2.nc.dmp            |    21 +
 dap4_test/baselineraw/test_vlen3.nc.dmp            |    18 +
 dap4_test/baselineraw/test_vlen4.nc.dmp            |    20 +
 dap4_test/baselineraw/test_vlen5.nc.dmp            |    20 +
 dap4_test/baselineraw/test_vlen6.nc.dmp            |    17 +
 dap4_test/baselineraw/test_vlen7.nc.dmp            |    17 +
 dap4_test/baselineraw/test_vlen8.nc.dmp            |    20 +
 .../baselineremote}/CMakeLists.txt                 |     0
 .../baselineremote/nc4_unsigned_types.nc.hyrax     |    53 +
 dap4_test/baselineremote/test_anon_dim.syn.dmp     |    13 +
 dap4_test/baselineremote/test_atomic_array.nc.dmp  |    51 +
 dap4_test/baselineremote/test_atomic_array.syn.dmp |    54 +
 dap4_test/baselineremote/test_atomic_types.nc.dmp  |    60 +
 dap4_test/baselineremote/test_atomic_types.syn.dmp |    61 +
 dap4_test/baselineremote/test_enum.nc.dmp          |    16 +
 dap4_test/baselineremote/test_enum_2.nc.dmp        |    19 +
 dap4_test/baselineremote/test_enum_array.nc.dmp    |    18 +
 dap4_test/baselineremote/test_fill.nc.dmp          |    17 +
 dap4_test/baselineremote/test_groups1.nc.dmp       |    38 +
 dap4_test/baselineremote/test_misc1.nc.dmp         |    29 +
 dap4_test/baselineremote/test_one_var.nc.dmp       |    10 +
 dap4_test/baselineremote/test_one_vararray.nc.dmp  |    12 +
 dap4_test/baselineremote/test_opaque.nc.dmp        |    12 +
 dap4_test/baselineremote/test_opaque_array.nc.dmp  |    17 +
 dap4_test/baselineremote/test_sequence_1.syn.dmp   |    16 +
 dap4_test/baselineremote/test_sequence_2.syn.dmp   |    19 +
 dap4_test/baselineremote/test_struct1.nc.dmp       |    15 +
 dap4_test/baselineremote/test_struct_array.nc.dmp  |    22 +
 dap4_test/baselineremote/test_struct_array.syn.dmp |    31 +
 .../baselineremote/test_struct_nested.hdf5.dmp     |    23 +
 dap4_test/baselineremote/test_struct_nested.nc.dmp |    23 +
 .../baselineremote/test_struct_nested3.hdf5.dmp    |    20 +
 .../baselineremote/test_struct_nested3.nc.dmp      |    20 +
 dap4_test/baselineremote/test_struct_type.nc.dmp   |    15 +
 dap4_test/baselineremote/test_utf8.nc.dmp          |    12 +
 dap4_test/baselineremote/test_vlen1.nc.dmp         |    15 +
 dap4_test/baselineremote/test_vlen10.nc.dmp        |    19 +
 dap4_test/baselineremote/test_vlen11.nc.dmp        |    19 +
 dap4_test/baselineremote/test_vlen2.nc.dmp         |    21 +
 dap4_test/baselineremote/test_vlen3.hdf5.dmp       |    18 +
 dap4_test/baselineremote/test_vlen3.nc.dmp         |    18 +
 dap4_test/baselineremote/test_vlen4.hdf5.dmp       |    20 +
 dap4_test/baselineremote/test_vlen4.nc.dmp         |    20 +
 dap4_test/baselineremote/test_vlen5.hdf5.dmp       |    20 +
 dap4_test/baselineremote/test_vlen5.nc.dmp         |    20 +
 dap4_test/baselineremote/test_vlen6.nc.dmp         |    17 +
 dap4_test/baselineremote/test_vlen7.nc.dmp         |    17 +
 dap4_test/baselineremote/test_vlen8.nc.dmp         |    20 +
 dap4_test/baselineremote/test_vlen9.nc.dmp         |    21 +
 dap4_test/baselineremote/tst_fills.nc.dmp          |    17 +
 .../cdltestfiles}/CMakeLists.txt                   |     0
 dap4_test/cdltestfiles/test_atomic_array.cdl       |    39 +
 dap4_test/cdltestfiles/test_atomic_types.cdl       |    42 +
 dap4_test/cdltestfiles/test_enum.cdl               |    12 +
 dap4_test/cdltestfiles/test_enum_2.cdl             |    15 +
 dap4_test/cdltestfiles/test_enum_array.cdl         |    14 +
 dap4_test/cdltestfiles/test_fill.cdl               |    11 +
 dap4_test/cdltestfiles/test_groups1.cdl            |    35 +
 dap4_test/cdltestfiles/test_one_var.cdl            |     6 +
 dap4_test/cdltestfiles/test_one_vararray.cdl       |     8 +
 dap4_test/cdltestfiles/test_opaque.cdl             |     8 +
 dap4_test/cdltestfiles/test_opaque_array.cdl       |    12 +
 dap4_test/cdltestfiles/test_struct1.cdl            |    11 +
 dap4_test/cdltestfiles/test_struct_array.cdl       |    18 +
 dap4_test/cdltestfiles/test_struct_nested.cdl      |    15 +
 dap4_test/cdltestfiles/test_struct_nested3.cdl     |    16 +
 dap4_test/cdltestfiles/test_struct_type.cdl        |    11 +
 dap4_test/cdltestfiles/test_unlim1.cdl             |    27 +
 dap4_test/cdltestfiles/test_utf8.cdl               |     8 +
 dap4_test/cdltestfiles/test_vlen1.cdl              |    11 +
 dap4_test/cdltestfiles/test_vlen2.cdl              |    15 +
 dap4_test/cdltestfiles/test_vlen3.cdl              |    13 +
 dap4_test/cdltestfiles/test_vlen4.cdl              |    13 +
 dap4_test/cdltestfiles/test_vlen5.cdl              |    16 +
 dap4_test/cdltestfiles/test_vlen6.cdl              |    16 +
 dap4_test/cdltestfiles/test_vlen7.cdl              |    16 +
 dap4_test/cdltestfiles/test_vlen8.cdl              |    19 +
 dap4_test/d4test_common.sh                         |    85 +
 .../daptestfiles}/CMakeLists.txt                   |     0
 dap4_test/daptestfiles/test_anon_dim.2.syn.dap     |   Bin 0 -> 571 bytes
 dap4_test/daptestfiles/test_anon_dim.syn.dap       |   Bin 0 -> 481 bytes
 dap4_test/daptestfiles/test_atomic_array.5.nc.dap  |   Bin 0 -> 943 bytes
 dap4_test/daptestfiles/test_atomic_array.8.nc.dap  |   Bin 0 -> 564 bytes
 dap4_test/daptestfiles/test_atomic_array.9.nc.dap  |   Bin 0 -> 564 bytes
 dap4_test/daptestfiles/test_atomic_array.nc.dap    |   Bin 0 -> 2224 bytes
 dap4_test/daptestfiles/test_atomic_array.syn.dap   |   Bin 0 -> 2214 bytes
 dap4_test/daptestfiles/test_atomic_types.nc.dap    |   Bin 0 -> 1907 bytes
 dap4_test/daptestfiles/test_atomic_types.syn.dap   |   Bin 0 -> 1888 bytes
 dap4_test/daptestfiles/test_enum.nc.dap            |   Bin 0 -> 1228 bytes
 dap4_test/daptestfiles/test_enum_2.nc.dap          |   Bin 0 -> 1286 bytes
 dap4_test/daptestfiles/test_enum_array.4.nc.dap    |   Bin 0 -> 1371 bytes
 dap4_test/daptestfiles/test_enum_array.nc.dap      |   Bin 0 -> 1302 bytes
 dap4_test/daptestfiles/test_fill.nc.dap            |   Bin 0 -> 598 bytes
 dap4_test/daptestfiles/test_groups1.nc.dap         |   Bin 0 -> 1155 bytes
 dap4_test/daptestfiles/test_one_var.nc.dap         |   Bin 0 -> 416 bytes
 dap4_test/daptestfiles/test_one_vararray.1.nc.dap  |   Bin 0 -> 554 bytes
 dap4_test/daptestfiles/test_one_vararray.3.nc.dap  |   Bin 0 -> 599 bytes
 dap4_test/daptestfiles/test_one_vararray.nc.dap    |   Bin 0 -> 502 bytes
 dap4_test/daptestfiles/test_opaque.nc.dap          |   Bin 0 -> 456 bytes
 dap4_test/daptestfiles/test_opaque_array.7.nc.dap  |   Bin 0 -> 644 bytes
 dap4_test/daptestfiles/test_opaque_array.nc.dap    |   Bin 0 -> 615 bytes
 dap4_test/daptestfiles/test_sequence_1.syn.dap     |   Bin 0 -> 506 bytes
 dap4_test/daptestfiles/test_sequence_2.syn.dap     |   Bin 0 -> 565 bytes
 dap4_test/daptestfiles/test_struct1.nc.dap         |   Bin 0 -> 551 bytes
 dap4_test/daptestfiles/test_struct_array.6.nc.dap  |   Bin 0 -> 734 bytes
 dap4_test/daptestfiles/test_struct_array.nc.dap    |   Bin 0 -> 772 bytes
 dap4_test/daptestfiles/test_struct_array.syn.dap   |   Bin 0 -> 938 bytes
 dap4_test/daptestfiles/test_struct_nested.nc.dap   |   Bin 0 -> 763 bytes
 dap4_test/daptestfiles/test_struct_nested3.nc.dap  |   Bin 0 -> 606 bytes
 dap4_test/daptestfiles/test_struct_type.nc.dap     |   Bin 0 -> 555 bytes
 dap4_test/daptestfiles/test_unlim1.nc.dap          |   Bin 0 -> 1735 bytes
 dap4_test/daptestfiles/test_utf8.nc.dap            |   Bin 0 -> 522 bytes
 dap4_test/daptestfiles/test_vlen1.nc.dap           |   Bin 0 -> 480 bytes
 dap4_test/daptestfiles/test_vlen2.nc.dap           |   Bin 0 -> 696 bytes
 dap4_test/daptestfiles/test_vlen3.nc.dap           |   Bin 0 -> 539 bytes
 dap4_test/daptestfiles/test_vlen4.nc.dap           |   Bin 0 -> 586 bytes
 dap4_test/daptestfiles/test_vlen5.nc.dap           |   Bin 0 -> 617 bytes
 dap4_test/daptestfiles/test_vlen6.nc.dap           |   Bin 0 -> 560 bytes
 dap4_test/daptestfiles/test_vlen7.nc.dap           |   Bin 0 -> 540 bytes
 dap4_test/daptestfiles/test_vlen8.nc.dap           |   Bin 0 -> 666 bytes
 .../dmrtestfiles}/CMakeLists.txt                   |     0
 dap4_test/dmrtestfiles/test_anon_dim.2.syn.dmr     |    17 +
 dap4_test/dmrtestfiles/test_anon_dim.syn.dmr       |    15 +
 dap4_test/dmrtestfiles/test_atomic_array.5.nc.dmr  |    29 +
 dap4_test/dmrtestfiles/test_atomic_array.8.nc.dmr  |    17 +
 dap4_test/dmrtestfiles/test_atomic_array.9.nc.dmr  |    17 +
 dap4_test/dmrtestfiles/test_atomic_array.nc.dmr    |    61 +
 dap4_test/dmrtestfiles/test_atomic_array.syn.dmr   |    61 +
 dap4_test/dmrtestfiles/test_atomic_types.nc.dmr    |    48 +
 dap4_test/dmrtestfiles/test_atomic_types.syn.dmr   |    48 +
 dap4_test/dmrtestfiles/test_enum.nc.dmr            |    30 +
 dap4_test/dmrtestfiles/test_enum_2.nc.dmr          |    32 +
 dap4_test/dmrtestfiles/test_enum_array.4.nc.dmr    |    34 +
 dap4_test/dmrtestfiles/test_enum_array.nc.dmr      |    32 +
 dap4_test/dmrtestfiles/test_fill.nc.dmr            |    18 +
 dap4_test/dmrtestfiles/test_groups1.nc.dmr         |    33 +
 dap4_test/dmrtestfiles/test_one_var.nc.dmr         |    12 +
 dap4_test/dmrtestfiles/test_one_vararray.1.nc.dmr  |    17 +
 dap4_test/dmrtestfiles/test_one_vararray.3.nc.dmr  |    18 +
 dap4_test/dmrtestfiles/test_one_vararray.nc.dmr    |    15 +
 dap4_test/dmrtestfiles/test_opaque.nc.dmr          |    12 +
 dap4_test/dmrtestfiles/test_opaque_array.7.nc.dmr  |    18 +
 dap4_test/dmrtestfiles/test_opaque_array.nc.dmr    |    16 +
 dap4_test/dmrtestfiles/test_sequence_1.syn.dmr     |    15 +
 dap4_test/dmrtestfiles/test_sequence_2.syn.dmr     |    17 +
 dap4_test/dmrtestfiles/test_struct1.nc.dmr         |    17 +
 dap4_test/dmrtestfiles/test_struct_array.6.nc.dmr  |    22 +
 dap4_test/dmrtestfiles/test_struct_array.nc.dmr    |    21 +
 dap4_test/dmrtestfiles/test_struct_array.syn.dmr   |    27 +
 dap4_test/dmrtestfiles/test_struct_nested.nc.dmr   |    23 +
 dap4_test/dmrtestfiles/test_struct_nested3.nc.dmr  |    18 +
 dap4_test/dmrtestfiles/test_struct_type.nc.dmr     |    17 +
 dap4_test/dmrtestfiles/test_unlim1.nc.dmr          |    49 +
 dap4_test/dmrtestfiles/test_utf8.nc.dmr            |    15 +
 dap4_test/dmrtestfiles/test_vlen1.nc.dmr           |    14 +
 dap4_test/dmrtestfiles/test_vlen2.nc.dmr           |    18 +
 dap4_test/dmrtestfiles/test_vlen3.nc.dmr           |    16 +
 dap4_test/dmrtestfiles/test_vlen4.nc.dmr           |    18 +
 dap4_test/dmrtestfiles/test_vlen5.nc.dmr           |    18 +
 dap4_test/dmrtestfiles/test_vlen6.nc.dmr           |    16 +
 dap4_test/dmrtestfiles/test_vlen7.nc.dmr           |    16 +
 dap4_test/dmrtestfiles/test_vlen8.nc.dmr           |    18 +
 dap4_test/findtestserver4.c                        |    79 +
 dap4_test/maketests.sh                             |   104 +
 .../nctestfiles}/CMakeLists.txt                    |     0
 dap4_test/nctestfiles/test_atomic_array.nc         |   Bin 0 -> 14523 bytes
 dap4_test/nctestfiles/test_atomic_types.nc         |   Bin 0 -> 13136 bytes
 dap4_test/nctestfiles/test_enum.nc                 |   Bin 0 -> 1239 bytes
 dap4_test/nctestfiles/test_enum_2.nc               |   Bin 0 -> 1428 bytes
 dap4_test/nctestfiles/test_enum_array.nc           |   Bin 0 -> 8293 bytes
 dap4_test/nctestfiles/test_fill.nc                 |   Bin 0 -> 1271 bytes
 dap4_test/nctestfiles/test_groups1.nc              |   Bin 0 -> 8469 bytes
 dap4_test/nctestfiles/test_one_var.nc              |   Bin 0 -> 603 bytes
 dap4_test/nctestfiles/test_one_vararray.nc         |   Bin 0 -> 6248 bytes
 dap4_test/nctestfiles/test_opaque.nc               |   Bin 0 -> 711 bytes
 dap4_test/nctestfiles/test_opaque_array.nc         |   Bin 0 -> 6272 bytes
 dap4_test/nctestfiles/test_struct1.nc              |   Bin 0 -> 805 bytes
 dap4_test/nctestfiles/test_struct_array.nc         |   Bin 0 -> 6534 bytes
 dap4_test/nctestfiles/test_struct_nested.nc        |   Bin 0 -> 1330 bytes
 dap4_test/nctestfiles/test_struct_nested3.nc       |   Bin 0 -> 1206 bytes
 dap4_test/nctestfiles/test_struct_type.nc          |   Bin 0 -> 805 bytes
 dap4_test/nctestfiles/test_unlim1.nc               |   Bin 0 -> 10266 bytes
 dap4_test/nctestfiles/test_utf8.nc                 |   Bin 0 -> 6272 bytes
 dap4_test/nctestfiles/test_vlen1.nc                |   Bin 0 -> 4863 bytes
 dap4_test/nctestfiles/test_vlen2.nc                |   Bin 0 -> 6336 bytes
 dap4_test/nctestfiles/test_vlen3.nc                |   Bin 0 -> 4982 bytes
 dap4_test/nctestfiles/test_vlen4.nc                |   Bin 0 -> 4990 bytes
 dap4_test/nctestfiles/test_vlen5.nc                |   Bin 0 -> 6272 bytes
 dap4_test/nctestfiles/test_vlen6.nc                |   Bin 0 -> 6272 bytes
 dap4_test/nctestfiles/test_vlen7.nc                |   Bin 0 -> 6256 bytes
 dap4_test/nctestfiles/test_vlen8.nc                |   Bin 0 -> 6304 bytes
 dap4_test/test_common.h                            |   186 +
 dap4_test/test_data.c                              |    52 +
 dap4_test/test_data.sh                             |    90 +
 dap4_test/test_environment4.c                      |    46 +
 dap4_test/test_hyrax.sh                            |    47 +
 dap4_test/test_meta.c                              |    29 +
 dap4_test/test_meta.sh                             |    55 +
 dap4_test/test_parse.c                             |    29 +
 dap4_test/test_parse.sh                            |    43 +
 dap4_test/test_raw.sh                              |    66 +
 dap4_test/test_remote.sh                           |    84 +
 dap4_test/test_test.sh                             |     9 +
 dap4_test/tst_data.sh                              |    89 +
 dap4_test/tst_meta.sh                              |    54 +
 dap4_test/tst_parse.sh                             |    42 +
 dap4_test/tst_raw.sh                               |    67 +
 docs/DAP4.dox                                      |   105 +
 docs/Doxyfile.developer                            |     2 +-
 docs/Doxyfile.in                                   |     1 +
 docs/Makefile.in                                   |     4 +
 docs/OPeNDAP.dox                                   |    15 +-
 docs/file_format_specifications.md                 |     2 +-
 docs/footer.html                                   |     0
 docs/guide.dox                                     |     3 +-
 docs/images/Makefile.in                            |     4 +
 docs/install.md                                    |     0
 docs/old/netcdf-cxx.texi                           |     0
 docs/old/netcdf-cxx4.texi                          |     0
 docs/old/netcdf-f90.texi                           |     0
 docs/old/netcdf-install.texi                       |     0
 docs/old/netcdf-internal.texi                      |     0
 .../static-pages/deploy_static_pages.sh            |     0
 docs/static-pages/software.html                    |  6487 +++--
 docs/static-pages/usage.html                       |   521 +
 docs/windows-binaries.md                           |    26 +-
 examples/C/Makefile.in                             |     4 +
 examples/CDL/Makefile.in                           |     4 +
 examples/Makefile.in                               |     4 +
 h5_test/Makefile.in                                |     5 +
 h5_test/h5_err_macros.h                            |     2 +-
 h5_test/run_par_tests.sh                           |     3 +
 h5_test/run_valgrind_tests.sh                      |     3 +
 h5_test/tst_h_par.c                                |     1 +
 include/Makefile.am                                |    11 +-
 include/Makefile.in                                |    25 +-
 include/err_macros.h                               |     2 +-
 include/nc.h                                       |    25 +-
 include/nc3dispatch.h                              |    76 +-
 include/nc3internal.h                              |    15 +-
 include/nc4dispatch.h                              |   271 +
 include/nc4internal.h                              |    17 +-
 include/nc_tests.h                                 |     2 +-
 include/ncbytes.h                                  |    41 +-
 include/ncdap.h                                    |    58 +
 include/ncdispatch.h                               |    49 +-
 include/ncexternl.h                                |    23 +
 include/nchashmap.h                                |    32 +-
 include/nclist.h                                   |    45 +-
 include/nclog.h                                    |    26 +-
 include/ncoffsets.h                                |    56 +
 include/ncrc.h                                     |    26 +
 include/nctestserver.h                             |   154 +
 include/ncuri.h                                    |    93 +-
 include/ncutf8.h                                   |    34 +
 include/ncwinpath.h                                |    35 +
 include/netcdf.h                                   |    12 +-
 include/netcdf_mem.h                               |    16 +-
 include/netcdf_meta.h.in                           |     3 +-
 include/utf8proc.h                                 |   401 -
 lib_flags.am                                       |     4 +
 libdap2/CMakeLists.txt                             |     2 +-
 libdap2/Make0                                      |     0
 libdap2/Makefile.am                                |    10 +-
 libdap2/Makefile.in                                |    62 +-
 libdap2/cache.c                                    |     2 +-
 libdap2/cdf.c                                      |     2 +-
 libdap2/common.c                                   |     2 +-
 libdap2/constraints.c                              |     2 +-
 libdap2/dapalign.c                                 |   331 -
 libdap2/dapalign.h                                 |    55 -
 libdap2/dapattr.c                                  |     2 +-
 libdap2/dapcvt.c                                   |    24 +-
 libdap2/dapdebug.c                                 |     2 +-
 libdap2/dapdump.c                                  |     2 +-
 libdap2/dapincludes.h                              |   113 +
 libdap2/dapodom.c                                  |     2 +-
 libdap2/daputil.c                                  |    71 +-
 libdap2/daputil.h                                  |    13 +-
 libdap2/dceconstraints.c                           |     8 +-
 libdap2/env                                        |    30 +-
 libdap2/getvara.c                                  |     6 +-
 libdap2/main.c                                     |     2 +-
 libdap2/nccommon.h                                 |    41 +-
 libdap2/ncd2dispatch.c                             |    52 +-
 libdap2/ncd2dispatch.h                             |   137 +-
 libdap2/ncdap.c                                    |     4 +-
 libdap2/ncdap.h                                    |   150 -
 libdap2/ncdapa.c                                   |     4 +-
 libdap2/ncdaperr.c                                 |     2 +-
 libdap2/test_vara.c                                |     4 +-
 libdap4/CMakeLists.txt                             |    32 +
 libdap4/Make0                                      |   103 +
 libdap4/Makefile.am                                |    80 +
 libdap4/Makefile.in                                |   940 +
 libdap4/d4bytes.c                                  |    73 +
 libdap4/d4bytes.h                                  |    31 +
 libdap4/d4chunk.c                                  |   207 +
 libdap4/d4chunk.h                                  |    11 +
 libdap4/d4crc32.c                                  |   103 +
 libdap4/d4curlflags.c                              |    33 +
 libdap4/d4curlfunctions.c                          |   367 +
 libdap4/d4curlfunctions.h                          |    30 +
 libdap4/d4cvt.c                                    |   224 +
 libdap4/d4data.c                                   |   361 +
 libdap4/d4debug.c                                  |   155 +
 libdap4/d4debug.h                                  |    70 +
 libdap4/d4dump.c                                   |   110 +
 libdap4/d4file.c                                   |   491 +
 libdap4/d4fix.c                                    |   554 +
 libdap4/d4http.c                                   |   342 +
 libdap4/d4http.h                                   |    24 +
 libdap4/d4includes.h                               |    50 +
 libdap4/d4meta.c                                   |  1112 +
 libdap4/d4odom.c                                   |   170 +
 libdap4/d4odom.h                                   |    38 +
 libdap4/d4parser.c                                 |  1515 +
 libdap4/d4printer.c                                |   591 +
 libdap4/d4rc.c                                     |   621 +
 libdap4/d4read.c                                   |   215 +
 libdap4/d4read.h                                   |    12 +
 libdap4/d4swap.c                                   |   260 +
 libdap4/d4util.c                                   |   452 +
 libdap4/d4util.h                                   |    77 +
 libdap4/d4varx.c                                   |   186 +
 libdap4/ezxml.c                                    |   973 +
 libdap4/ezxml.h                                    |   167 +
 libdap4/ezxml_extra.c                              |    27 +
 libdap4/ncd4.h                                     |   224 +
 libdap4/ncd4dispatch.c                             |   972 +
 libdap4/ncd4dispatch.h                             |    50 +
 libdap4/ncd4types.h                                |   360 +
 libdispatch/CMakeLists.txt                         |     6 +-
 libdispatch/Make0                                  |     0
 libdispatch/Makefile.am                            |    18 +-
 libdispatch/Makefile.in                            |   538 +-
 libdispatch/dattput.c                              |    54 +-
 libdispatch/ddispatch.c                            |   156 +-
 libdispatch/derror.c                               |     3 +-
 libdispatch/dfile.c                                |   179 +-
 libdispatch/doffsets.c                             |   344 +
 libdispatch/drc.c                                  |   424 +
 libdispatch/dstring.c                              |    20 +-
 libdispatch/dutf8.c                                |    96 +
 libdispatch/dutf8proc.c                            |   590 -
 libdispatch/dv2i.c                                 |     7 +-
 libdispatch/dvarget.c                              |    96 +-
 libdispatch/dvarput.c                              |   110 +-
 libdispatch/dwinpath.c                             |   154 +
 m4/empty => libdispatch/heap                       |     0
 libdispatch/json.c                                 |   372 +
 libdispatch/nc.c                                   |     4 +-
 libdispatch/ncbytes.c                              |    14 +-
 libdispatch/nclist.c                               |    32 +-
 libdispatch/nclistmgr.c                            |     2 +-
 libdispatch/nclog.c                                |     4 +-
 libdispatch/ncuri.c                                |  1031 +-
 libdispatch/test_ncuri.c                           |    95 +
 libdispatch/test_pathcvt.c                         |    61 +
 libdispatch/u/utf8proc.c                           |   755 +
 libdispatch/u/utf8proc.h                           |   699 +
 libdispatch/u8.c                                   | 13048 +++++++++
 libdispatch/u8.h                                   |   718 +
 libdispatch/utf8proc.c                             |   759 +
 libdispatch/utf8proc.h                             |   701 +
 libdispatch/utf8proc_data.c                        | 14386 ++++++++++
 libdispatch/utf8proc_data.h                        | 13383 ---------
 liblib/CMakeLists.txt                              |     6 +-
 liblib/Makefile.am                                 |    11 +-
 liblib/Makefile.in                                 |    27 +-
 liblib/nc_initialize.c                             |    17 +-
 libnetcdf.settings.in                              |     3 +-
 libsrc/CMakeLists.txt                              |     6 +-
 libsrc/Makefile.am                                 |     2 +-
 libsrc/Makefile.in                                 |     7 +-
 libsrc/attr.c                                      |  1026 +-
 libsrc/attr.m4                                     |   121 +-
 libsrc/dim.c                                       |    45 +-
 libsrc/ffio.c                                      |    61 +-
 libsrc/lookup3.c                                   |     5 +-
 libsrc/memio.c                                     |    15 +-
 libsrc/mmapio.c                                    |    29 +-
 libsrc/nc3dispatch.h                               |   189 -
 libsrc/nc3internal.c                               |   105 +-
 libsrc/ncio.c                                      |    17 +-
 libsrc/ncx.c                                       | 28112 ++++++++++++++++---
 libsrc/ncx.h                                       |   361 +-
 libsrc/ncx.m4                                      |  2319 +-
 libsrc/ncx_cray.c                                  |     4 +
 libsrc/netcdf.3                                    |  1405 +
 libsrc/posixio.c                                   |    36 +-
 libsrc/putget.c                                    | 10379 ++++++-
 libsrc/putget.m4                                   |    93 +-
 libsrc/t_ncio.c                                    |     9 +-
 libsrc/t_ncxx.m4                                   |     4 +
 libsrc/v1hpg.c                                     |   233 +-
 libsrc/var.c                                       |    31 +-
 libsrc/winceio.c                                   |    44 +-
 libsrc4/Makefile.am                                |     4 +-
 libsrc4/Makefile.in                                |    19 +-
 libsrc4/error4.c                                   |     2 +-
 libsrc4/nc3stub.h                                  |  1026 -
 libsrc4/nc4attr.c                                  |   109 +-
 libsrc4/nc4dispatch.c                              |     3 +-
 libsrc4/nc4dispatch.h                              |   278 -
 libsrc4/nc4file.c                                  |   232 +-
 libsrc4/nc4grp.c                                   |    14 +-
 libsrc4/nc4hdf.c                                   |   110 +-
 libsrc4/nc4info.c                                  |    11 -
 libsrc4/nc4internal.c                              |   141 +-
 libsrc4/nc4printer.c                               |   786 +
 libsrc4/nc4type.c                                  |     6 +-
 libsrc4/nc4var.c                                   |   135 +-
 libsrc4/ncfunc.c                                   |     2 +-
 libsrc4/stub3.c                                    |    24 -
 libsrc4/stub4.c                                    |    18 -
 libsrcp/Makefile.in                                |     5 +
 libsrcp/ncpdispatch.c                              |    14 +-
 mclean                                             |     0
 nc-config.cmake.in                                 |    28 +-
 nc-config.in                                       |     9 +-
 nc_test/CMakeLists.txt                             |    18 +-
 nc_test/Make0                                      |     2 +-
 nc_test/Makefile.am                                |    45 +-
 nc_test/Makefile.in                                |   172 +-
 nc_test/error.c                                    |     2 +-
 nc_test/error.h                                    |     3 +-
 nc_test/nc_test.c                                  |     8 +-
 nc_test/run_diskless.sh                            |    35 +-
 nc_test/run_diskless2.sh                           |     7 +-
 nc_test/run_diskless5.sh                           |    23 +
 nc_test/run_mmap.sh                                |    21 +-
 nc_test/run_pnetcdf_test.sh                        |     1 -
 nc_test/test_get.c                                 | 15598 +++++-----
 nc_test/test_get.m4                                |  1554 +-
 nc_test/test_get_p5.m4                             |    12 +-
 nc_test/test_put.c                                 | 22226 ++++++++-------
 nc_test/test_put.m4                                |  2016 +-
 nc_test/test_read.c                                |  2251 +-
 nc_test/test_read.m4                               |  2054 ++
 nc_test/test_write.c                               |  2372 +-
 nc_test/test_write.m4                              |  2517 ++
 nc_test/testnc3perf.c                              |     0
 nc_test/tests.h                                    |   473 +-
 nc_test/tst_atts3.c                                |    33 +-
 nc_test/tst_diskless5.c                            |  4336 +++
 nc_test/tst_diskless5.cdl                          |  4206 +++
 nc_test/tst_elatefill.c                            |    45 +
 nc_test/tst_global_fillval.c                       |    49 +
 nc_test/tst_small.c                                |     1 +
 nc_test/tst_utf8_phrases.c                         |   342 +
 nc_test/tst_utf8_validate.c                        |   Bin 0 -> 15275 bytes
 nc_test/util.c                                     |   731 +-
 nc_test4/CMakeLists.txt                            |     4 +-
 nc_test4/Makefile.am                               |    17 +-
 nc_test4/Makefile.in                               |   142 +-
 nc_test4/clear_cache.sh                            |     0
 nc_test4/{chunked.hdf4 => ref_chunked.hdf4}        |   Bin
 nc_test4/{contiguous.hdf4 => ref_contiguous.hdf4}  |   Bin
 nc_test4/run_bm.sh                                 |     9 +-
 nc_test4/run_bm_ar4.sh                             |    10 +-
 nc_test4/run_bm_elena.sh                           |    14 +-
 nc_test4/run_bm_radar_2D.sh                        |     3 +
 nc_test4/run_bm_radar_2D_endianness1.sh            |     3 +
 nc_test4/run_bm_test1.sh                           |    47 +-
 nc_test4/run_bm_test2.sh                           |    29 +-
 nc_test4/run_chunk_hdf4.sh                         |    32 +-
 nc_test4/run_empty_vlen_test.sh                    |    13 +-
 nc_test4/run_get_knmi_files.sh                     |     1 -
 nc_test4/run_grp_rename.sh                         |    18 +-
 nc_test4/run_hdf4_valgrind_tests.sh                |     3 +
 nc_test4/run_par_bm_test.sh                        |     7 +-
 nc_test4/run_par_test.sh                           |     3 +
 nc_test4/run_tst_chunks.sh                         |    11 +-
 nc_test4/run_valgrind_tests.sh                     |     4 +
 nc_test4/tst_chunk_hdf4.c                          |     4 +-
 nc_test4/tst_chunks.c                              |     9 +-
 nc_test4/tst_chunks3.c                             |    16 +-
 nc_test4/tst_converts.c                            |    10 +-
 nc_test4/tst_files.c                               |     9 +-
 nc_test4/tst_fill_attr_vanish.c                    |    19 +-
 nc_test4/tst_formatx_hdf4.sh                       |     5 +-
 nc_test4/tst_hdf4_read_var.sh                      |    20 +-
 nc_test4/tst_misc.sh                               |    10 +-
 nc_test4/tst_rehash.c                              |     1 +
 nc_test4/tst_strings2.c                            |     5 +-
 nc_test4/tst_vars.c                                |     2 +-
 nc_test4/tst_vars2.c                               |     8 +-
 ncdap_test/CMakeLists.txt                          |    39 +-
 ncdap_test/Makefile.am                             |    77 +-
 ncdap_test/Makefile.in                             |   216 +-
 ncdap_test/expected3/Makefile.in                   |     4 +
 ncdap_test/expected4/123.nc.dmp                    |    53 -
 ncdap_test/expected4/123bears.nc.dmp               |    53 -
 ncdap_test/expected4/1990-S1700101.HDF.WVC_Lat.dmp |    37 -
 ncdap_test/expected4/1998-6-avhrr.dat.dmp          |    22 -
 ncdap_test/expected4/D1.dmp                        |    16 -
 ncdap_test/expected4/Drifters.dmp                  |    31 -
 ncdap_test/expected4/EOSDB.dmp                     |   129 -
 ncdap_test/expected4/Makefile.am                   |    35 -
 ncdap_test/expected4/Makefile.in                   |   528 -
 ncdap_test/expected4/NestedSeq.dmp                 |    15 -
 ncdap_test/expected4/NestedSeq2.dmp                |    35 -
 ncdap_test/expected4/OverideExample.dmp            |    25 -
 ncdap_test/expected4/SimpleDrdsExample.dmp         |    62 -
 ncdap_test/expected4/b31.dmp                       |    20 -
 ncdap_test/expected4/b31a.dmp                      |    15 -
 ncdap_test/expected4/bears.nc.dmp                  |    53 -
 ncdap_test/expected4/ber-2002-10-01.nc.dmp         |    38 -
 ncdap_test/expected4/ceopL2AIRS2-2.nc.dmp          |  1141 -
 ncdap_test/expected4/data.nc.dmp                   |    25 -
 ncdap_test/expected4/fnoc1.nc.dmp                  |  1129 -
 ncdap_test/expected4/in.nc.dmp                     |   760 -
 ncdap_test/expected4/in1.nc.dmp                    |   838 -
 ncdap_test/expected4/in_2.nc.dmp                   |   770 -
 ncdap_test/expected4/in_no_three_double_dmn.nc.dmp |   763 -
 ncdap_test/expected4/in_v.nc.dmp                   |    16 -
 ncdap_test/expected4/ingrid.dmp                    |    33 -
 ncdap_test/expected4/nestedDAS.dmp                 |    12 -
 ncdap_test/expected4/pbug0001b.dmp                 |    38 -
 ncdap_test/expected4/saco1.nc.dmp                  |   122 -
 ncdap_test/expected4/synth1.dmp                    |    11 -
 ncdap_test/expected4/synth2.dmp                    |    14 -
 ncdap_test/expected4/synth3.dmp                    |    13 -
 ncdap_test/expected4/synth4.dmp                    |    23 -
 ncdap_test/expected4/synth5.dmp                    |    13 -
 ncdap_test/expected4/synth6.dmp                    |    25 -
 ncdap_test/expected4/synth7.dmp                    |     9 -
 ncdap_test/expected4/synth8.dmp                    |    14 -
 ncdap_test/expected4/test.01.dmp                   |    35 -
 ncdap_test/expected4/test.02.dmp                   |    93 -
 ncdap_test/expected4/test.03.dmp                   |  1694 --
 ncdap_test/expected4/test.04.dmp                   |    20 -
 ncdap_test/expected4/test.05.dmp                   |    29 -
 ncdap_test/expected4/test.06a.dmp                  |    13 -
 ncdap_test/expected4/test.07.dmp                   |    36 -
 ncdap_test/expected4/test.07a.dmp                  |    19 -
 ncdap_test/expected4/test.21.dmp                   |    21 -
 ncdap_test/expected4/test.22.dmp                   |    25 -
 ncdap_test/expected4/test.23.dmp                   |    36 -
 ncdap_test/expected4/test.31.dmp                   |    24 -
 ncdap_test/expected4/test.50.dmp                   |    31 -
 ncdap_test/expected4/test.53.dmp                   |    34 -
 ncdap_test/expected4/test.55.dmp                   |    23 -
 ncdap_test/expected4/test.56.dmp                   |    14 -
 ncdap_test/expected4/test.57.dmp                   |    14 -
 ncdap_test/expected4/test.66.dmp                   |    42 -
 ncdap_test/expected4/test.67.dmp                   |    78 -
 ncdap_test/expected4/test.68.dmp                   |     2 -
 ncdap_test/expected4/test.69.dmp                   |   401 -
 ncdap_test/expected4/test.PointFile.dmp            |    67 -
 ncdap_test/expected4/test.an1.dmp                  |     2 -
 ncdap_test/expected4/test.dfp1.dmp                 |     2 -
 ncdap_test/expected4/test.dfr1.dmp                 |    40 -
 ncdap_test/expected4/test.dfr2.dmp                 |    38 -
 ncdap_test/expected4/test.dfr3.dmp                 |    29 -
 ncdap_test/expected4/test.gr1.dmp                  |   177 -
 ncdap_test/expected4/test.gr2.dmp                  |   355 -
 ncdap_test/expected4/test.gr3.dmp                  |    68 -
 ncdap_test/expected4/test.gr4.dmp                  |    26 -
 ncdap_test/expected4/test.gr5.dmp                  |   177 -
 ncdap_test/expected4/test.nc.dmp                   |   961 -
 ncdap_test/expected4/test.sds1.dmp                 |    47 -
 ncdap_test/expected4/test.sds2.dmp                 |    47 -
 ncdap_test/expected4/test.sds3.dmp                 |   223 -
 ncdap_test/expected4/test.sds4.dmp                 |    14 -
 ncdap_test/expected4/test.sds5.dmp                 |    77 -
 ncdap_test/expected4/test.sds6.dmp                 |    89 -
 ncdap_test/expected4/test.sds7.dmp                 |    75 -
 ncdap_test/expected4/test.vs1.dmp                  |   109 -
 ncdap_test/expected4/test.vs2.dmp                  |   145 -
 ncdap_test/expected4/test.vs3.dmp                  |    52 -
 ncdap_test/expected4/test.vs4.dmp                  |   109 -
 ncdap_test/expected4/test.vs5.dmp                  |    38 -
 ncdap_test/expected4/text.nc.dmp                   |   961 -
 ncdap_test/expected4/whoi.dmp                      |    20 -
 ncdap_test/expectremote3/Makefile.in               |     4 +
 ncdap_test/expectremote3/test.01.1.dmp             |     4 -
 ncdap_test/expectremote3/test.07.1.dmp             |     4 -
 ncdap_test/expectremote3/test.07.3.dmp             |     4 -
 ncdap_test/expectremote3/test.07.4.dmp             |     4 -
 ncdap_test/expectremote4/D1.dmp                    |    16 -
 ncdap_test/expectremote4/Drifters.dmp              |    31 -
 ncdap_test/expectremote4/EOSDB.dmp                 |   129 -
 ncdap_test/expectremote4/GLOBEC_cetaceans.1.dmp    |    10 -
 ncdap_test/expectremote4/GLOBEC_cetaceans.2.dmp    |    14 -
 ncdap_test/expectremote4/Makefile.am               |    31 -
 ncdap_test/expectremote4/Makefile.in               |   523 -
 ncdap_test/expectremote4/NestedSeq.dmp             |    15 -
 ncdap_test/expectremote4/NestedSeq2.dmp            |    35 -
 ncdap_test/expectremote4/OverideExample.dmp        |    25 -
 ncdap_test/expectremote4/SimpleDrdsExample.dmp     |    62 -
 ncdap_test/expectremote4/b31.dmp                   |    20 -
 ncdap_test/expectremote4/b31a.dmp                  |    15 -
 ncdap_test/expectremote4/ingrid.dmp                |    33 -
 ncdap_test/expectremote4/nestedDAS.dmp             |    12 -
 ncdap_test/expectremote4/test.01.1.dmp             |    17 -
 ncdap_test/expectremote4/test.01.dmp               |    41 -
 ncdap_test/expectremote4/test.02.1.dmp             |     9 -
 ncdap_test/expectremote4/test.02.dmp               |    93 -
 ncdap_test/expectremote4/test.03.1.dmp             |    15 -
 ncdap_test/expectremote4/test.03.2.dmp             |  1011 -
 ncdap_test/expectremote4/test.03.dmp               |  1694 --
 ncdap_test/expectremote4/test.04.1.dmp             |    11 -
 ncdap_test/expectremote4/test.04.dmp               |    20 -
 ncdap_test/expectremote4/test.05.1.dmp             |    14 -
 ncdap_test/expectremote4/test.05.dmp               |    29 -
 ncdap_test/expectremote4/test.06.1.dmp             |    15 -
 ncdap_test/expectremote4/test.06a.dmp              |    13 -
 ncdap_test/expectremote4/test.07.1.dmp             |    19 -
 ncdap_test/expectremote4/test.07.3.dmp             |    14 -
 ncdap_test/expectremote4/test.07.4.dmp             |     9 -
 ncdap_test/expectremote4/test.07.dmp               |    36 -
 ncdap_test/expectremote4/test.07a.dmp              |    19 -
 ncdap_test/expectremote4/test.21.dmp               |    15 -
 ncdap_test/expectremote4/test.22.dmp               |    25 -
 ncdap_test/expectremote4/test.23.dmp               |    36 -
 ncdap_test/expectremote4/test.31.dmp               |    24 -
 ncdap_test/expectremote4/test.50.dmp               |    31 -
 ncdap_test/expectremote4/test.53.dmp               |    34 -
 ncdap_test/expectremote4/test.55.dmp               |    23 -
 ncdap_test/expectremote4/test.56.dmp               |    14 -
 ncdap_test/expectremote4/test.57.dmp               |    14 -
 ncdap_test/expectremote4/test.66.dmp               |    42 -
 ncdap_test/expectremote4/test.67.dmp               |    78 -
 ncdap_test/expectremote4/test.68.dmp               |     2 -
 ncdap_test/expectremote4/test.69.dmp               |   401 -
 ncdap_test/expectremote4/test.an1.dmp              |     2 -
 ncdap_test/expectremote4/test.dfp1.dmp             |     2 -
 ncdap_test/expectremote4/test.gr1.dmp              |   177 -
 ncdap_test/expectremote4/test.gr2.dmp              |   355 -
 ncdap_test/expectremote4/test.gr3.dmp              |    68 -
 ncdap_test/expectremote4/test.gr4.dmp              |    26 -
 ncdap_test/expectremote4/test.gr5.dmp              |   177 -
 ncdap_test/expectremote4/test.nc.dmp               |   929 -
 ncdap_test/expectremote4/test.sds1.dmp             |    47 -
 ncdap_test/expectremote4/test.sds2.dmp             |    47 -
 ncdap_test/expectremote4/test.sds3.dmp             |   223 -
 ncdap_test/expectremote4/test.sds4.dmp             |    14 -
 ncdap_test/expectremote4/test.sds5.dmp             |    77 -
 ncdap_test/expectremote4/test.vs1.dmp              |   109 -
 ncdap_test/expectremote4/test.vs2.dmp              |   145 -
 ncdap_test/expectremote4/test.vs3.dmp              |    52 -
 ncdap_test/expectremote4/test.vs4.dmp              |   109 -
 ncdap_test/expectremote4/test.vs5.dmp              |    38 -
 ncdap_test/expectremote4/whoi.dmp                  |    20 -
 ncdap_test/findtestserver.c                        |    78 +
 ncdap_test/nctestserver.c                          |    43 -
 ncdap_test/nocacheremote4/Makefile.am              |    44 -
 ncdap_test/nocacheremote4/test.01.1.dmp            |     7 -
 ncdap_test/nocacheremote4/test.01.dmp              |    35 -
 ncdap_test/nocacheremote4/test.02.1.dmp            |     9 -
 ncdap_test/nocacheremote4/test.02.dmp              |    93 -
 ncdap_test/nocacheremote4/test.03.1.dmp            |    15 -
 ncdap_test/nocacheremote4/test.03.2.dmp            |  1011 -
 ncdap_test/nocacheremote4/test.03.dmp              |  1694 --
 ncdap_test/nocacheremote4/test.04.1.dmp            |    11 -
 ncdap_test/nocacheremote4/test.04.dmp              |    20 -
 ncdap_test/nocacheremote4/test.05.1.dmp            |    14 -
 ncdap_test/nocacheremote4/test.05.dmp              |    29 -
 ncdap_test/nocacheremote4/test.06.1.dmp            |    15 -
 ncdap_test/nocacheremote4/test.06.dmp              |    43 -
 ncdap_test/nocacheremote4/test.06a.dmp             |    13 -
 ncdap_test/nocacheremote4/test.07.1.dmp            |     9 -
 ncdap_test/nocacheremote4/test.07.2.dmp            |    29 -
 ncdap_test/nocacheremote4/test.07.3.dmp            |    14 -
 ncdap_test/nocacheremote4/test.07.4.dmp            |     9 -
 ncdap_test/nocacheremote4/test.07.dmp              |    30 -
 ncdap_test/nocacheremote4/test.07a.dmp             |    19 -
 ncdap_test/nocacheremote4/test.21.dmp              |    15 -
 ncdap_test/nocacheremote4/test.22.dmp              |    25 -
 ncdap_test/nocacheremote4/test.23.dmp              |    36 -
 ncdap_test/nocacheremote4/test.31.dmp              |    24 -
 ncdap_test/nocacheremote4/test.32.dmp              |    27 -
 ncdap_test/nocacheremote4/test.50.dmp              |    31 -
 ncdap_test/nocacheremote4/test.53.dmp              |    34 -
 ncdap_test/nocacheremote4/test.55.dmp              |    23 -
 ncdap_test/nocacheremote4/test.56.dmp              |    14 -
 ncdap_test/nocacheremote4/test.57.dmp              |    14 -
 ncdap_test/nocacheremote4/test.66.dmp              |    42 -
 ncdap_test/nocacheremote4/test.67.dmp              |    78 -
 ncdap_test/nocacheremote4/test.68.dmp              |     2 -
 ncdap_test/nocacheremote4/test.69.dmp              |   401 -
 ncdap_test/nocacheremote4/test.nc.dmp              |   929 -
 ncdap_test/run_ncdap_tests.sh                      |    21 +-
 ncdap_test/t_auth.c                                |     8 +-
 ncdap_test/t_dap.c                                 |    11 +-
 ncdap_test/t_dap3a.c                               |    12 +-
 ncdap_test/t_dap3c.c                               |    14 +-
 ncdap_test/t_dap4.c                                |    12 +-
 ncdap_test/t_dap4a.c                               |    11 +-
 ncdap_test/t_dap4c.c                               |    13 +-
 ncdap_test/t_srcdir.h                              |    15 +
 ncdap_test/test_cvt.c                              |    11 +-
 ncdap_test/test_environment.c                      |    47 +
 ncdap_test/test_nstride_cached.c                   |    10 +-
 ncdap_test/test_partvar.c                          |    14 +-
 ncdap_test/test_partvar2.c                         |    14 +-
 ncdap_test/test_vara.c                             |    13 +-
 ncdap_test/test_varm3.c                            |    10 +-
 ncdap_test/testauth.old                            |     0
 ncdap_test/testauth.sh                             |    64 +-
 ncdap_test/testauth.sh.old                         |     0
 ncdap_test/testdata3/Makefile.am                   |     0
 ncdap_test/testdata3/Makefile.in                   |     4 +
 ncdap_test/testurl.sh                              |    22 +-
 ncdap_test/tst_formatx.sh                          |     6 +-
 ncdap_test/tst_longremote3.sh                      |    14 +-
 ncdap_test/tst_longremote4.sh                      |    20 -
 ncdap_test/tst_ncdap.sh                            |     2 -
 ncdap_test/tst_ncdap3.sh                           |    31 +-
 ncdap_test/tst_ncdap4.sh                           |    26 -
 ncdap_test/tst_nocache3.sh                         |     8 +-
 ncdap_test/tst_nocache4.sh                         |    23 -
 ncdap_test/tst_remote.sh                           |    16 +-
 ncdap_test/tst_remote3.sh                          |    20 +-
 ncdap_test/tst_remote4.sh                          |    23 -
 ncdap_test/tst_special.sh                          |    24 +-
 ncdap_test/tst_tds.sh                              |    11 +-
 ncdump/CMakeLists.txt                              |    84 +-
 ncdump/Make0                                       |    24 +-
 ncdump/Makefile.am                                 |    37 +-
 ncdump/Makefile.in                                 |   179 +-
 ncdump/bom.c                                       |     2 +-
 ncdump/cdl/Makefile.in                             |     4 +
 ncdump/cdl/bigf1.cdl                               |     0
 ncdump/cdl/bigf2.cdl                               |     0
 ncdump/cdl/bigf3.cdl                               |     0
 ncdump/cdl/bigr1.cdl                               |     0
 ncdump/cdl/bigr2.cdl                               |     0
 ncdump/cdl/bigr3.cdl                               |     0
 ncdump/cdl/c0.cdl                                  |     0
 ncdump/cdl/c0.jdl                                  |     0
 ncdump/cdl/example_good.cdl                        |     0
 ncdump/cdl/fills.cdl                               |     0
 ncdump/cdl/nc_enddef.cdl                           |     0
 ncdump/cdl/nc_sync.cdl                             |     0
 ncdump/cdl/pres_temp_4D.cdl                        |     0
 ncdump/cdl/ref_ctest1_nc4.cdl                      |     0
 ncdump/cdl/ref_ctest1_nc4.jdl                      |     0
 ncdump/cdl/ref_ctest1_nc4c.cdl                     |     0
 ncdump/cdl/ref_nctst.cdl                           |     0
 ncdump/cdl/ref_nctst_64bit_offset.cdl              |     0
 ncdump/cdl/ref_nctst_netcdf4.cdl                   |     0
 ncdump/cdl/ref_nctst_netcdf4_classic.cdl           |     0
 ncdump/cdl/ref_solar.cdl                           |     0
 ncdump/cdl/ref_tst_comp.cdl                        |     0
 ncdump/cdl/ref_tst_comp2.cdl                       |     0
 ncdump/cdl/ref_tst_econst.cdl                      |     0
 ncdump/cdl/ref_tst_enum_data.cdl                   |     0
 ncdump/cdl/ref_tst_group_data.cdl                  |     0
 ncdump/cdl/ref_tst_nans.cdl                        |     0
 ncdump/cdl/ref_tst_opaque_data.cdl                 |     0
 ncdump/cdl/ref_tst_small.cdl                       |     0
 ncdump/cdl/ref_tst_solar_1.cdl                     |     0
 ncdump/cdl/ref_tst_solar_2.cdl                     |     0
 ncdump/cdl/ref_tst_special_atts.cdl                |     0
 ncdump/cdl/ref_tst_string_data.cdl                 |     0
 ncdump/cdl/ref_tst_unicode.cdl                     |     0
 ncdump/cdl/ref_tst_utf8.cdl                        |     0
 ncdump/cdl/ref_tst_vlen_data.cdl                   |     0
 ncdump/cdl/sfc_pres_temp.cdl                       |     0
 ncdump/cdl/simple_xy.cdl                           |     0
 ncdump/cdl/small.cdl                               |     0
 ncdump/cdl/small2.cdl                              |     0
 ncdump/cdl/test0.cdl                               |     0
 ncdump/cdl/tst_ncml.cdl                            |     0
 ncdump/ctest.c                                     |    16 +
 ncdump/ctest64.c                                   |    16 +
 ncdump/ctests.sh                                   |    42 +-
 ncdump/dumplib.c                                   |     2 +-
 ncdump/expected/Makefile.in                        |     4 +
 ncdump/inttags4.cdl                                |     2 +-
 ncdump/isnan.h                                     |     2 +-
 ncdump/nc4print.c                                  |    53 +
 ncdump/ncdump.c                                    |    35 +-
 ncdump/nctrunc.c                                   |    57 +
 ncdump/ocprint.c                                   |  1183 +
 ncdump/ref_ctest.c                                 |     2 +-
 ncdump/rewrite-scalar.c                            |     2 +-
 ncdump/run_back_comp_tests.sh                      |    16 +-
 ncdump/run_ncgen_nc4_tests.sh                      |    64 +
 ncdump/run_ncgen_tests.sh                          |    48 +
 ncdump/run_tests.sh                                |    22 +-
 ncdump/run_utf8_nc4_tests.sh                       |    15 +-
 ncdump/run_utf8_tests.sh                           |    16 +-
 ncdump/tst_64bit.sh                                |    23 +-
 ncdump/tst_bom.sh                                  |    18 +-
 ncdump/tst_calendars.sh                            |    10 +-
 ncdump/tst_charfill.sh                             |     9 +-
 ncdump/tst_compress.c                              |     2 +-
 ncdump/tst_dimsizes.c                              |     9 +-
 ncdump/tst_dimsizes.sh                             |    23 +-
 ncdump/tst_fileinfo.sh                             |    30 +-
 ncdump/tst_fillbug.sh                              |    14 +-
 ncdump/tst_formatx3.sh                             |    21 +-
 ncdump/tst_formatx4.sh                             |    18 +-
 ncdump/tst_grp_spec.sh                             |    10 +-
 ncdump/tst_h_scalar.sh                             |     7 +-
 ncdump/tst_inmemory_nc3.sh                         |    22 +-
 ncdump/tst_inmemory_nc4.sh                         |    26 +-
 ncdump/tst_inttags.sh                              |    11 +-
 ncdump/tst_inttags4.sh                             |    12 +-
 ncdump/tst_iter.sh                                 |     9 +-
 ncdump/tst_lengths.sh                              |    64 +-
 ncdump/tst_mud.sh                                  |    26 +-
 ncdump/tst_nccopy3.sh                              |    23 +-
 ncdump/tst_nccopy4.sh                              |    55 +-
 ncdump/tst_ncgen4.sh                               |    18 +-
 ncdump/tst_ncgen4_classic.sh                       |    18 +-
 ncdump/tst_ncgen4_cycle.sh                         |    12 +-
 ncdump/tst_ncgen4_diff.sh                          |    13 +-
 ncdump/tst_ncgen_shared.sh                         |     4 +-
 ncdump/tst_netcdf4.sh                              |    45 +-
 ncdump/tst_netcdf4_4.sh                            |    32 +-
 ncdump/tst_opaque_data.c                           |     2 +-
 ncdump/tst_output.sh                               |    48 +-
 ncdump/tst_utf8.c                                  |     2 +-
 ncdump/utils.h                                     |     2 +
 ncdump/vardata.c                                   |     2 +-
 ncgen/CMakeLists.txt                               |    27 +-
 ncgen/Makefile.am                                  |    24 +-
 ncgen/Makefile.in                                  |   399 +-
 ncgen/cdfdata.c                                    |     2 +-
 ncgen/ctests.sh                                    |     3 +-
 ncgen/cvt.c                                        |    11 +-
 ncgen/data.c                                       |     2 +-
 ncgen/ftests.sh                                    |     3 +-
 ncgen/generate.c                                   |     2 +-
 ncgen/genlib.c                                     |     4 +-
 ncgen/internals.html                               |     0
 ncgen/jdatajni.c                                   |     2 +-
 ncgen/jdatastd.c                                   |     2 +-
 ncgen/lfs-tests                                    |     0
 ncgen/main.c                                       |     6 +-
 ncgen/ncgen.h                                      |     1 +
 ncgen/ncgen.l                                      |     6 +-
 ncgen/ncgen.y                                      |     8 +-
 ncgen/ncgenl.c                                     |    14 +-
 ncgen/ncgeny.c                                     |   300 +-
 ncgen/ncgeny.h                                     |     8 +-
 ncgen/offsets.c                                    |   336 -
 ncgen/offsets.h                                    |    61 -
 ncgen/run_nc4_tests.sh                             |    58 -
 ncgen/run_tests.sh                                 |    43 -
 ncgen/run_tests2.sh                                |     7 +-
 ncgen/semantics.c                                  |    44 +-
 ncgen/tst_gattenum.cdl                             |     8 +
 ncgen/tst_usuffix.cdl                              |     9 +
 ncgen3/Makefile.am                                 |     2 +
 ncgen3/Makefile.in                                 |     7 +
 ncgen3/genlib.h                                    |     2 +-
 ncgen3/lfs-tests                                   |     0
 ncgen3/main.c                                      |     5 +-
 ncgen3/ncgen.y                                     |     2 +
 ncgen3/run_nc4_tests.sh                            |    10 +-
 ncgen3/run_tests.sh                                |     9 +-
 ncgen3/run_tests2.sh                               |     2 +-
 nctest/CMakeLists.txt                              |     2 +-
 nctest/Makefile.in                                 |     5 +
 nctest/atttests.c                                  |     3 -
 nctest/compare_test_files.sh                       |     8 +-
 nctest/run_valgrind_tests.sh                       |     3 +
 netCDFConfig.cmake.in                              |     4 +-
 oc2/CMakeLists.txt                                 |     7 +-
 oc2/Make0                                          |     0
 oc2/Makefile.am                                    |     4 -
 oc2/Makefile.in                                    |    64 +-
 oc2/daplex.c                                       |    35 +-
 oc2/dapparse.c                                     |    94 +-
 oc2/dapparselex.h                                  |     6 +-
 oc2/oc.c                                           |    55 +-
 oc2/oc.h                                           |     3 -
 oc2/ocbytes.c                                      |   201 -
 oc2/ocbytes.h                                      |    58 -
 oc2/occlientparams.c                               |   110 +-
 oc2/occlientparams.h                               |     2 +-
 oc2/occompile.c                                    |    36 +-
 oc2/occonstraints.h                                |     8 +-
 oc2/occurlfunctions.c                              |     8 +-
 oc2/occurlfunctions.h                              |     2 +-
 oc2/ocdata.c                                       |    22 +-
 oc2/ocdebug.c                                      |     4 +-
 oc2/ocdebug.h                                      |     3 +-
 oc2/ocdump.c                                       |   137 +-
 oc2/ocdump.h                                       |     6 +-
 oc2/ochttp.c                                       |    56 +-
 oc2/ochttp.h                                       |     2 +-
 oc2/ocinternal.c                                   |    98 +-
 oc2/ocinternal.h                                   |    29 +-
 oc2/oclist.c                                       |   224 -
 oc2/oclist.h                                       |    62 -
 oc2/oclog.c                                        |   229 -
 oc2/oclog.h                                        |    31 -
 oc2/ocnode.c                                       |   265 +-
 oc2/ocnode.h                                       |    17 +-
 oc2/ocrc.c                                         |    87 +-
 oc2/ocread.c                                       |    73 +-
 oc2/ocuri.c                                        |   848 -
 oc2/ocuri.h                                        |    59 -
 oc2/ocutil.c                                       |    62 +-
 oc2/ocutil.h                                       |     4 +-
 postinstall.sh.in                                  |     0
 test-driver-verbose                                |   167 +
 test_common.in                                     |   132 +
 1082 files changed, 147393 insertions(+), 78504 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e87f3de..2cc0f4d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@
 ##################################
 
 #Minimum required CMake Version
-cmake_minimum_required(VERSION 2.8.11)
+cmake_minimum_required(VERSION 3.6.1)
 
 #Project Name
 project(netCDF C)
@@ -25,14 +25,14 @@ set(PACKAGE "netCDF" CACHE STRING "")
 #####
 
 SET(NC_VERSION_MAJOR 4)
-SET(NC_VERSION_MINOR 4)
-SET(NC_VERSION_PATCH 1)
-SET(NC_VERSION_NOTE ".1")
+SET(NC_VERSION_MINOR 5)
+SET(NC_VERSION_PATCH 0)
+SET(NC_VERSION_NOTE "-rc1")
 SET(netCDF_VERSION ${NC_VERSION_MAJOR}.${NC_VERSION_MINOR}.${NC_VERSION_PATCH}${NC_VERSION_NOTE})
 SET(VERSION ${netCDF_VERSION})
 SET(NC_VERSION ${netCDF_VERSION})
-SET(netCDF_LIB_VERSION 11.4.0)
-SET(netCDF_SO_VERSION 11)
+SET(netCDF_LIB_VERSION 13)
+SET(netCDF_SO_VERSION 13)
 SET(PACKAGE_VERSION ${VERSION})
 
 # Get system configuration, Use it to determine osname, os release, cpu. These
@@ -88,6 +88,7 @@ SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/"
 # auto-configure style checks, other CMake modules.
 INCLUDE(${CMAKE_ROOT}/Modules/CheckLibraryExists.cmake)
 INCLUDE(${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
+INCLUDE(${CMAKE_ROOT}/Modules/CheckIncludeFiles.cmake)
 INCLUDE(${CMAKE_ROOT}/Modules/CheckTypeSize.cmake)
 INCLUDE(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
 INCLUDE(${CMAKE_ROOT}/Modules/CheckCXXSourceCompiles.cmake)
@@ -100,6 +101,12 @@ INCLUDE(${CMAKE_ROOT}/Modules/GetPrerequisites.cmake)
 INCLUDE(CheckCCompilerFlag)
 FIND_PACKAGE(PkgConfig QUIET)
 
+# A check to see if the system is big endian
+TEST_BIG_ENDIAN(BIGENDIAN)
+IF(${BIGENDIAN})
+  SET(WORDS_BIGENDIAN "1")
+ENDIF(${BIGENDIAN})
+
 # A macro to check if a C linker supports a particular flag.
 MACRO(CHECK_C_LINKER_FLAG M_FLAG M_RESULT)
   SET(T_REQ_FLAG "${CMAKE_REQUIRED_FLAGS}")
@@ -333,24 +340,15 @@ OPTION (ENABLE_V2_API "Build netCDF Version 2." ON)
 SET(BUILD_V2 ${ENABLE_V2_API})
 IF(NOT ENABLE_V2_API)
   SET(NO_NETCDF_2 ON)
-ENDIF()
+ELSE(NOT ENABLE_V2_API)
+  SET(USE_NETCDF_2 TRUE)
+ENDIF(NOT ENABLE_V2_API)
 
 # Option to build utilities
 OPTION(BUILD_UTILITIES "Build ncgen, ncgen3, ncdump." ON)
 
 # Option to use MMAP
-OPTION(ENABLE_MMAP "Use MMAP." OFF)
-IF(ENABLE_MMAP)
-  CHECK_FUNCTION_EXISTS(mremap  HAVE_MREMAP)
-  IF(NOT HAVE_MREMAP)
-    MESSAGE(WARNING "mremap not found: disabling MMAP support.")
-    SET(ENABLE_MMAP OFF)
-  ELSE()
-    SET(HAVE_MMAP ON)
-    SET(BUILD_MMAP ON)
-    SET(USE_MMAP ON)
-  ENDIF()
-ENDIF()
+OPTION(ENABLE_MMAP "Use MMAP." ON)
 
 # Option to use examples.
 OPTION(ENABLE_EXAMPLES "Build Examples" ON)
@@ -444,6 +442,8 @@ IF(ENABLE_HDF4)
     MESSAGE(FATAL_ERROR "Can't find or link to the hdf4 mfhdf library.")
   ENDIF()
 
+  SET(HAVE_LIBMFHDF TRUE)
+
   SET(HDF4_LIBRARIES ${HDF4_DF_LIB} ${HDF4_MFHDF_LIB})
   # End include files, libraries.
   MESSAGE(STATUS "HDF4 libraries: ${HDF4_DF_LIB}, ${HDF4_MFHDF_LIB}")
@@ -456,6 +456,7 @@ IF(ENABLE_HDF4)
     MESSAGE(FATAL_ERROR "HDF4 Support enabled but cannot find jpeglib.h")
   ELSE()
     SET(HAVE_JPEGLIB_H ON CACHE BOOL "")
+    SET(HAVE_LIBJPEG TRUE)
     INCLUDE_DIRECTORIES(${JPEGLIB_H_INCLUDE_DIR})
   ENDIF()
 
@@ -486,6 +487,7 @@ IF(WIN32)
     SET(BUILD_DLL ON CACHE BOOL "")
     ADD_DEFINITIONS(-DDLL_NETCDF)
     ADD_DEFINITIONS(-DDLL_EXPORT)
+    ADD_DEFINITIONS(-DUTF8PROC_DLLEXPORT)
   ENDIF()
 ENDIF()
 # Did the user specify a default minimum blocksize for posixio?
@@ -535,6 +537,7 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
   IF(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR)
     SET(HDF5_LIBRARIES ${HDF5_C_LIBRARY} ${HDF5_HL_LIBRARY})
     SET(HDF5_C_LIBRARIES ${HDF5_C_LIBRARY})
+    SET(HDF5_C_LIBRARY_hdf5 ${HDF5_C_LIBRARY})
     SET(HDF5_HL_LIBRARIES ${HDF5_HL_LIBRARY})
     INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIR})
     MESSAGE(STATUS "Using HDF5 C Library: ${HDF5_C_LIBRARY}")
@@ -616,12 +619,15 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
       ##
       IF(${HDF5_VERSION} VERSION_LESS "1.8.16")
         SET(HDF5_C_LIBRARY hdf5)
+        SET(HDF5_C_LIBRARY_hdf5 hdf5)
       ENDIF(${HDF5_VERSION} VERSION_LESS "1.8.16")
 
       IF(${HDF5_VERSION} VERSION_GREATER "1.8.15")
         IF(NOT HDF5_LIBRARIES AND HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY AND HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY)
           SET(HDF5_C_LIBRARY ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
+          SET(HDF5_C_LIBRARY_hdf5 ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
           SET(HDF5_HL_LIBRARY ${HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
+
       	  SET(HDF5_LIBRARIES ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY} ${HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
         ENDIF()
       ENDIF(${HDF5_VERSION} VERSION_GREATER "1.8.15")
@@ -635,17 +641,26 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
       ENDIF()
 
     ENDIF(MSVC)
+    IF(NOT HDF5_C_LIBRARY)
+      SET(HDF5_C_LIBRARY hdf5)
+    ENDIF()
   ENDIF(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR)
 
+  # There is a missing case in the above code so default it
+  IF("${HDF5_C_LIBRARY_hdf5}" STREQUAL "" )
+    SET(HDF5_C_LIBRARY_hdf5 "${HDF5_C_LIBRARY}")
+  ENDIF()
+
   ###
-  # The following options are not used in Windows.
+  # The following options are not used in Windows currently.
   ###
   IF(NOT MSVC)
     # Find out if HDF5 was built with parallel support.
     # Do that by checking for the targets H5Pget_fapl_mpiposx and
     # H5Pget_fapl_mpio in ${HDF5_LIB}.
-    CHECK_LIBRARY_EXISTS(hdf5 H5Pget_fapl_mpiposix "" HDF5_IS_PARALLEL_MPIPOSIX)
-    CHECK_LIBRARY_EXISTS(hdf5 H5Pget_fapl_mpio "" HDF5_IS_PARALLEL_MPIO)
+
+    CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pget_fapl_mpiposix "" HDF5_IS_PARALLEL_MPIPOSIX)
+    CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pget_fapl_mpio "" HDF5_IS_PARALLEL_MPIO)
     IF(HDF5_IS_PARALLEL_MPIPOSIX OR HDF5_IS_PARALLEL_MPIO)
       SET(HDF5_PARALLEL ON)
     ELSE()
@@ -653,6 +668,7 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
     ENDIF()
 
     IF(HDF5_IS_PARALLEL_MPIO)
+      SET(HAVE_H5PGET_FAPL_MPIO TRUE)
       SET(USE_PARALLEL_MPIO ON)
     ENDIF()
 
@@ -660,15 +676,20 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
       SET(USE_PARALLEL_POSIX ON)
     ENDIF()
 
+    #Check to see if HDF5 library has collective metadata APIs, (HDF5 >= 1.10.0)
+    CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_all_coll_metadata_ops "" HDF5_HAS_COLL_METADATA_OPS)
+
     OPTION(ENABLE_DYNAMIC_LOADING "Enable Dynamic Loading" ON)
     IF(ENABLE_DYNAMIC_LOADING)
       SET(USE_LIBDL ON CACHE BOOL "")
     ENDIF()
-    SET(HDF5_C_LIBRARY hdf5)
   ENDIF(NOT MSVC)
 
+  # Make sure the user has built the library with zlib support.
+  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_deflate "" HAVE_H5PSET_DEFLATE)
+
   #Check to see if H5Z_SZIP exists in HDF5_Libraries. If so, we must use szip.
-  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY} H5P_SZIP "" USE_SZIP)
+  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5P_SZIP "" USE_SZIP)
   IF(USE_SZIP)
     FIND_LIBRARY(SZIP NAMES szip sz)
     IF(SZIP)
@@ -679,8 +700,15 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
     ENDIF()
   ENDIF()
 
-  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY} H5free_memory "" HDF5_HAS_H5FREE)
-  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY} H5Pset_libver_bounds "" HDF5_HAS_LIBVER_BOUNDS)
+  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5free_memory "" HDF5_HAS_H5FREE)
+  IF(HDF5_HAS_H5FREE)
+    SET(HAVE_H5FREE_MEMORY TRUE)
+  ENDIF(HDF5_HAS_H5FREE)
+  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_libver_bounds "" HDF5_HAS_LIBVER_BOUNDS)
+
+  IF(HDF5_HAS_LIBVER_BOUNDS)
+    SET(HAVE_H5PSET_LIBVER_BOUNDS TRUE)
+  ENDIF(HDF5_HAS_LIBVER_BOUNDS)
 
   IF(HDF5_PARALLEL)
 	SET(HDF5_CC h5pcc)
@@ -719,13 +747,26 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
   SET(USE_ZLIB ON)
   INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS})
 
+  FIND_PATH(HAVE_HDF5_H hdf5.h)
+  IF(NOT HAVE_HDF5_H)
+    MESSAGE(FATAL_ERROR "Compiling a test with hdf5 failed. Either hdf5.h cannot be found, or the log messages should be checked for another reason.")
+  ELSE(NOT HAVE_HDF5_H)
+    INCLUDE_DIRECTORIES(${HAVE_HDF5_H})
+  ENDIF(NOT HAVE_HDF5_H)
+
+
 ENDIF(USE_HDF5 OR ENABLE_NETCDF_4)
 
 
-# Option to Build DAP Client
-OPTION(ENABLE_DAP "Enable DAP Client." ON)
+# Option to Build DAP2+DAP4 Clients
+OPTION(ENABLE_DAP "Enable DAP2 and DAP4 Client." ON)
 IF(ENABLE_DAP)
   SET(USE_DAP ON)
+  SET(ENABLE_DAP2 ON)
+  SET(ENABLE_DAP4 ON)
+  IF(NOT ENABLE_NETCDF_4)
+    SET(ENABLE_DAP4 OFF)
+  ENDIF()
   FIND_PACKAGE(CURL)
   IF(NOT CURL_LIBRARY)
     MESSAGE(FATAL_ERROR "DAP Support specified, CURL libraries are not found.")
@@ -764,8 +805,9 @@ IF(ENABLE_DAP)
   #include <curl/curl.h>
   int main() {int x = CURLOPT_CHUNK_BGN_FUNCTION;}" HAVE_CURLOPT_CHUNK_BGN_FUNCTION)
 
-
-
+ELSE()
+  SET(ENABLE_DAP2 OFF)
+  SET(ENABLE_DAP4 OFF)
 ENDIF()
 
 # Check to see if libtool supports
@@ -782,14 +824,10 @@ ENDIF()
 # Option to Enable DAP long tests, remote tests.
 OPTION(ENABLE_DAP_LONG_TESTS "Enable DAP long tests." OFF)
 OPTION(ENABLE_DAP_REMOTE_TESTS "Enable DAP remote tests." ON)
-
-IF(ENABLE_DAP_REMOTE_TESTS)
-  OPTION(ENABLE_DAP_AUTH_TESTS "Enable DAP remote authorization tests." OFF)
-ENDIF()
-
+SET(REMOTETESTSERVERS "remotetest.unidata.ucar.edu,jetstream.unidata.ucar.edu" CACHE STRING "test servers to use for remote test")
 
 # If netCDF4 and DAP, Option for DAP groups.
-IF(ENABLE_NETCDF_4 AND USE_DAP)
+IF(ENABLE_NETCDF_4 AND ENABLE_DAP2)
   OPTION(ENABLE_DAP_GROUPS "Whether netcdf4 group names should be enabled." ON)
 ELSE()
   SET(ENABLE_DAP_GROUPS OFF CACHE BOOL "Whether netcdf4 group names should be enabled.")
@@ -835,7 +873,8 @@ IF(ENABLE_TESTS)
 
   # Options for CTest-based tests, dashboards.
   SET(NC_CTEST_PROJECT_NAME "netcdf-c" CACHE STRING "Project Name for CTest-based testing purposes.")
-  SET(NC_CTEST_DROP_SITE "my.cdash.org" CACHE STRING "Dashboard location for CTest-based testing purposes.")
+  SET(NC_CTEST_DROP_SITE "129.114.104.111" CACHE STRING "Dashboard location for CTest-based testing purposes.")
+  #SET(NC_CTEST_DROP_SITE "my.cdash.org" CACHE STRING "Dashboard location for CTest-based testing purposes.")
   SET(NC_CTEST_DROP_LOC_PREFIX "" CACHE STRING "Prefix for Dashboard location on remote server when using CTest-based testing.")
 
   FIND_PROGRAM(HOSTNAME_CMD NAMES hostname)
@@ -954,14 +993,14 @@ IF(ENABLE_PNETCDF)
   FIND_LIBRARY(PNETCDF NAMES pnetcdf)
   FIND_PATH(PNETCDF_INCLUDE_DIR pnetcdf.h)
   IF(NOT PNETCDF)
-    MESSAGE(STATUS "Cannot find PNetCDF library. Disabling PNetCDF support.")
+    MESSAGE(STATUS "Cannot find PnetCDF library. Disabling PnetCDF support.")
     SET(USE_PNETCDF OFF CACHE BOOL "")
   ELSE(NOT PNETCDF)
     SET(USE_PARALLEL ON CACHE BOOL "")
 
-    # Check PNetCDF version. Must be >= 1.6.0
+    # Check PnetCDF version. Must be >= 1.6.0
     set(pnetcdf_h "${PNETCDF_INCLUDE_DIR}/pnetcdf.h" )
-    message(STATUS "PNetCDF include file ${pnetcdf_h} will be searched for version")
+    message(STATUS "PnetCDF include file ${pnetcdf_h} will be searched for version")
     file(STRINGS "${pnetcdf_h}" pnetcdf_major_string REGEX "^#define PNETCDF_VERSION_MAJOR")
     string(REGEX REPLACE "[^0-9]" "" pnetcdf_major "${pnetcdf_major_string}")
     file(STRINGS "${pnetcdf_h}" pnetcdf_minor_string REGEX "^#define PNETCDF_VERSION_MINOR")
@@ -969,7 +1008,7 @@ IF(ENABLE_PNETCDF)
     file(STRINGS "${pnetcdf_h}" pnetcdf_sub_string REGEX "^#define PNETCDF_VERSION_SUB")
     string(REGEX REPLACE "[^0-9]" "" pnetcdf_sub "${pnetcdf_sub_string}")
     set(pnetcdf_version "${pnetcdf_major}.${pnetcdf_minor}.${pnetcdf_sub}")
-    message(STATUS "Found PNetCDF version ${pnetcdf_version}")
+    message(STATUS "Found PnetCDF version ${pnetcdf_version}")
 
     if(${pnetcdf_version} VERSION_GREATER "1.6.0")
       SET(STATUS_PNETCDF "ON")
@@ -978,13 +1017,66 @@ IF(ENABLE_PNETCDF)
       # pnetcdf => parallel
       SET(STATUS_PARALLEL ON)
       SET(USE_PARALLEL ON)
-      MESSAGE(STATUS "Using PNetCDF Library: ${PNETCDF}")
+      MESSAGE(STATUS "Using PnetCDF Library: ${PNETCDF}")
     ELSE()
-      MESSAGE(WARNING "ENABLE_PNETCDF requires version 1.6.1 or later; found version ${pnetcdf_version}. PNetCDF is disabled")
+      MESSAGE(WARNING "ENABLE_PNETCDF requires version 1.6.1 or later; found version ${pnetcdf_version}. PnetCDF is disabled")
     ENDIF()
   ENDIF(NOT PNETCDF)
 ENDIF()
 
+# Options to enable use of fill values for elements casuing NC_ERANGE
+SET(STATUS_ERANGE_FILL "OFF")
+OPTION(ENABLE_ERANGE_FILL "Enable use of fill value when out-of-range type conversion causes NC_ERANGE error." OF)
+IF(ENABLE_ERANGE_FILL)
+  SET(STATUS_ERANGE_FILL "ON")
+ENDIF()
+
+# Options to use a more relaxed coordinate argument boundary check
+SET(STATUS_RELAX_COORD_BOUND "OFF")
+OPTION(ENABLE_ZERO_LENGTH_COORD_BOUND "Enable a more relaxed boundary error check NC_EINVALCOORDS to allow coordinate start argument equal to dimension size when argument count is zero." OFF)
+IF(ENABLE_ZERO_LENGTH_COORD_BOUND)
+  SET(STATUS_RELAX_COORD_BOUND "ON")
+ENDIF()
+
+# check and conform with PnetCDF settings on ERANGE_FILL and RELAX_COORD_BOUND
+IF(STATUS_PNETCDF)
+  file(STRINGS "${pnetcdf_h}" enable_erange_fill_pnetcdf REGEX "^#define PNETCDF_ERANGE_FILL")
+  string(REGEX REPLACE "[^0-9]" "" erange_fill_pnetcdf "${enable_erange_fill_pnetcdf}")
+  IF("x${erange_fill_pnetcdf}" STREQUAL "x1")
+     IF(NOT STATUS_ERANGE_FILL)
+       MESSAGE(WARNING "Enable erange-fill to conform with PnetCDF setting")
+       SET(STATUS_ERANGE_FILL "ON")
+     ENDIF()
+  ELSE()
+     IF(STATUS_ERANGE_FILL)
+       MESSAGE(WARNING "Disable erange-fill to conform with PnetCDF setting")
+       SET(STATUS_ERANGE_FILL "OFF")
+     ENDIF()
+  ENDIF()
+  file(STRINGS "${pnetcdf_h}" relax_coord_bound_pnetcdf REGEX "^#define PNETCDF_RELAX_COORD_BOUND")
+  string(REGEX REPLACE "[^0-9]" "" relax_coord_bound "${relax_coord_bound_pnetcdf}")
+  IF("x${relax_coord_bound}" STREQUAL "x1")
+     IF(NOT STATUS_RELAX_COORD_BOUND)
+       MESSAGE(WARNING "Enable relax-coord-bound to conform with PnetCDF setting")
+       SET(STATUS_RELAX_COORD_BOUND "ON")
+     ENDIF()
+  ELSE()
+     IF(STATUS_RELAX_COORD_BOUND)
+       MESSAGE(WARNING "Disable relax-coord-bound to conform with PnetCDF setting")
+       SET(STATUS_RELAX_COORD_BOUND "OFF")
+     ENDIF()
+  ENDIF()
+ENDIF()
+
+IF(STATUS_ERANGE_FILL)
+  SET(M4FLAGS "-DERANGE_FILL" CACHE STRING "")
+ENDIF()
+
+IF(STATUS_RELAX_COORD_BOUND)
+  MESSAGE(STATUS "Enabling a more relatexed check for NC_EINVALCOORDS")
+  ADD_DEFINITIONS(-DRELAX_COORD_BOUND)
+ENDIF()
+
 # Enable Parallel Tests.
 OPTION(ENABLE_PARALLEL_TESTS "Enable Parallel IO Tests. Ignored if netCDF4 is not enabled, or if there is no parallel I/O Support." ${USE_PARALLEL})
 IF(ENABLE_PARALLEL_TESTS AND USE_PARALLEL)
@@ -1115,9 +1207,12 @@ CHECK_INCLUDE_FILE("errno.h"   HAVE_ERRNO_H)
 CHECK_INCLUDE_FILE("fcntl.h"   HAVE_FCNTL_H)
 CHECK_INCLUDE_FILE("getopt.h"  HAVE_GETOPT_H)
 CHECK_INCLUDE_FILE("stdbool.h"   HAVE_STDBOOL_H)
-CHECK_INCLUDE_FILE("locale.h"  HAVE_LOCAL_H)
+CHECK_INCLUDE_FILE("locale.h"  HAVE_LOCALE_H)
 CHECK_INCLUDE_FILE("stdint.h"  HAVE_STDINT_H)
 CHECK_INCLUDE_FILE("stdio.h"   HAVE_STDIO_H)
+IF(MSVC)
+CHECK_INCLUDE_FILE("io.h"      HAVE_IO_H)
+ENDIF(MSVC)
 CHECK_INCLUDE_FILE("stdlib.h"  HAVE_STDLIB_H)
 CHECK_INCLUDE_FILE("stdarg.h"    HAVE_STDARG_H)
 CHECK_INCLUDE_FILE("strings.h"   HAVE_STRINGS_H)
@@ -1129,6 +1224,7 @@ CHECK_INCLUDE_FILE("sys/stat.h"  HAVE_SYS_STAT_H)
 CHECK_INCLUDE_FILE("sys/time.h"  HAVE_SYS_TIME_H)
 CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
 CHECK_INCLUDE_FILE("sys/wait.h"  HAVE_SYS_WAIT_H)
+CHECK_INCLUDE_FILE("sys/mman.h"  HAVE_SYS_MMAN_H)
 CHECK_INCLUDE_FILE("sys/resource.h" HAVE_SYS_RESOURCE_H)
 CHECK_INCLUDE_FILE("fcntl.h"  HAVE_FCNTL_H)
 CHECK_INCLUDE_FILE("inttypes.h"  HAVE_INTTYPES_H)
@@ -1136,25 +1232,90 @@ CHECK_INCLUDE_FILE("pstdint.h"  HAVE_PSTDINT_H)
 CHECK_INCLUDE_FILE("endian.h" HAVE_ENDIAN_H)
 CHECK_INCLUDE_FILE("BaseTsd.h"  HAVE_BASETSD_H)
 CHECK_INCLUDE_FILE("stddef.h"   HAVE_STDDEF_H)
+CHECK_INCLUDE_FILE("memory.h"  HAVE_MEMORY_H)
+CHECK_INCLUDE_FILE("string.h"  HAVE_STRING_H)
+
+CHECK_INCLUDE_FILES("time.h;sys/time.h" TIME_WITH_SYS_TIME)
+
+IF(NOT HAVE_STDLIB_H)
+  SET(NO_STDLIB_H TRUE)
+ENDIF(NOT HAVE_STDLIB_H)
+
+IF(NOT HAVE_SYS_TYPES_H)
+  SET(NO_SYS_TYPES_H TRUE)
+ENDIF(NOT HAVE_SYS_TYPES_H)
+
+
+# Symbol Exists
+CHECK_SYMBOL_EXISTS(isfinite "math.h" HAVE_DECL_ISFINITE)
+CHECK_SYMBOL_EXISTS(isnan "math.h" HAVE_DECL_ISNAN)
+CHECK_SYMBOL_EXISTS(isinf "math.h" HAVE_DECL_ISINF)
+CHECK_SYMBOL_EXISTS(signbit "math.h" HAVE_DECL_SIGNBIT)
+CHECK_SYMBOL_EXISTS(st_blksize "sys/stat.h" HAVE_STRUCT_STAT_ST_BLKSIZE)
+CHECK_SYMBOL_EXISTS(alloca "alloca.h" HAVE_ALLOCA)
+CHECK_SYMBOL_EXISTS(snprintf "stdio.h" HAVE_SNPRINTF)
+CHECK_SYMBOL_EXISTS(vprintf "stdio.h" HAVE_VPRINTF)
+
+# For historic purposes...
+SET(HAVE_ST_BLKSIZE ${HAVE_STRUCT_STAT_ST_BLKSIZE})
 
 # Type checks
-CHECK_TYPE_SIZE("void*"     SIZEOF_VOIDSTAR)
+# Aliases for automake consistency
+SET(SIZEOF_VOIDSTAR ${CMAKE_SIZEOF_VOID_P})
+SET(SIZEOF_VOIDP ${SIZEOF_VOIDSTAR})
 CHECK_TYPE_SIZE("char"      SIZEOF_CHAR)
 CHECK_TYPE_SIZE("double"    SIZEOF_DOUBLE)
 CHECK_TYPE_SIZE("float"     SIZEOF_FLOAT)
 CHECK_TYPE_SIZE("int"       SIZEOF_INT)
+CHECK_TYPE_SIZE("uint"      SIZEOF_UINT)
+IF(SIZEOF_UINT)
+  SET(HAVE_UINT TRUE)
+ENDIF(SIZEOF_UINT)
+
 CHECK_TYPE_SIZE("long"      SIZEOF_LONG)
 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
+IF(SIZEOF_LONG_LONG)
+  SET(HAVE_LONG_LONG_INT TRUE)
+ENDIF(SIZEOF_LONG_LONG)
+
+CHECK_TYPE_SIZE("unsigned long long" SIZEOF_UNSIGNED_LONG_LONG)
+IF(SIZEOF_UNSIGNED_LONG_LONG)
+  SET(HAVE_UNSIGNED_LONG_LONG_INT TRUE)
+ENDIF(SIZEOF_UNSIGNED_LONG_LONG)
+
 CHECK_TYPE_SIZE("off_t"     SIZEOF_OFF_T)
 CHECK_TYPE_SIZE("off64_t"   SIZEOF_OFF64_T)
 CHECK_TYPE_SIZE("short"     SIZEOF_SHORT)
+CHECK_TYPE_SIZE("ushort"    SIZEOF_USHORT)
+IF(SIZEOF_USHORT)
+  SET(HAVE_USHORT TRUE)
+ENDIF(SIZEOF_USHORT)
+
+CHECK_TYPE_SIZE("_Bool"     SIZEOF__BOOL)
+IF(SIZEOF__BOOL)
+  SET(HAVE__BOOL TRUE)
+ENDIF(SIZEOF__BOOL)
+
 CHECK_TYPE_SIZE("size_t"    SIZEOF_SIZE_T)
+IF(SIZEOF_SIZE_T)
+  SET(HAVE_SIZE_T TRUE)
+ENDIF(SIZEOF_SIZE_T)
+
 CHECK_TYPE_SIZE("ssize_t"   SIZEOF_SSIZE_T)
+CHECK_TYPE_SIZE("ptrdiff_t" SIZEOF_PTRDIFF_T)
+IF(SIZEOF_PTRDIFF_T)
+  SET(HAVE_PTRDIFF_T TRUE)
+ENDIF(SIZEOF_PTRDIFF_T)
+
 # __int64 is used on Windows for large file support.
 CHECK_TYPE_SIZE("__int64"   SIZEOF___INT_64)
-CHECK_TYPE_SIZE("uchar"     SIZEOF_UCHAR)
 CHECK_TYPE_SIZE("int64_t"   SIZEOF_INT64_T)
 CHECK_TYPE_SIZE("uint64_t"  SIZEOF_UINT64_T)
+CHECK_TYPE_SIZE("unsigned char"      SIZEOF_UCHAR)
+CHECK_TYPE_SIZE("unsigned short int" SIZEOF_UNSIGNED_SHORT_INT)
+CHECK_TYPE_SIZE("unsigned int"       SIZEOF_UNSIGNED_INT)
+CHECK_TYPE_SIZE("long long"          SIZEOF_LONGLONG)
+CHECK_TYPE_SIZE("unsigned long long" SIZEOF_ULONGLONG)
 
 # On windows systems, we redefine off_t as __int64
 # to enable LFS. This is true on 32 and 64 bit system.s
@@ -1176,7 +1337,6 @@ ENDIF()
 CHECK_FUNCTION_EXISTS(fsync HAVE_FSYNC)
 CHECK_FUNCTION_EXISTS(strlcat   HAVE_STRLCAT)
 CHECK_FUNCTION_EXISTS(strerror  HAVE_STRERROR)
-CHECK_FUNCTION_EXISTS(snprintf  HAVE_SNPRINTF)
 CHECK_FUNCTION_EXISTS(strchr  HAVE_STRCHR)
 CHECK_FUNCTION_EXISTS(strrchr HAVE_STRRCHR)
 CHECK_FUNCTION_EXISTS(strcat  HAVE_STRCAT)
@@ -1186,20 +1346,35 @@ CHECK_FUNCTION_EXISTS(strndup HAVE_STRNDUP)
 CHECK_FUNCTION_EXISTS(strcasecmp  HAVE_STRCASECMP)
 CHECK_FUNCTION_EXISTS(strtod  HAVE_STRTOD)
 CHECK_FUNCTION_EXISTS(strtoll HAVE_STRTOLL)
-CHECK_FUNCTION_EXISTS(strtoull  HAVE_STROULL)
+CHECK_FUNCTION_EXISTS(strtoull  HAVE_STRTOULL)
 CHECK_FUNCTION_EXISTS(strstr  HAVE_STRSTR)
 CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
 CHECK_FUNCTION_EXISTS(rand  HAVE_RAND)
 CHECK_FUNCTION_EXISTS(random HAVE_RANDOM)
 CHECK_FUNCTION_EXISTS(gettimeofday  HAVE_GETTIMEOFDAY)
 CHECK_FUNCTION_EXISTS(fsync HAVE_FSYNC)
-CHECK_FUNCTION_EXISTS(MPI_Comm_f2C  HAVE_MPI_COMM_F2C)
+CHECK_FUNCTION_EXISTS(MPI_Comm_f2c  HAVE_MPI_COMM_F2C)
 CHECK_FUNCTION_EXISTS(memmove HAVE_MEMMOVE)
+CHECK_FUNCTION_EXISTS(memcmp HAVE_MEMCMP)
 CHECK_FUNCTION_EXISTS(getpagesize HAVE_GETPAGESIZE)
 CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF)
 CHECK_FUNCTION_EXISTS(getrlimit HAVE_GETRLIMIT)
 CHECK_FUNCTION_EXISTS(_filelengthi64 HAVE_FILE_LENGTH_I64)
+CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
+CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP)
+
+IF(ENABLE_MMAP)
+  IF(NOT HAVE_MREMAP)
+    MESSAGE(WARNING "mremap not found: disabling MMAP support.")
+    SET(ENABLE_MMAP OFF)
+  ELSE(NOT HAVE_MREMAP)
+    SET(HAVE_MMAP ON)
+    SET(BUILD_MMAP ON)
+    SET(USE_MMAP ON)
+  ENDIF(NOT HAVE_MREMAP)
+ENDIF(ENABLE_MMAP)
 
+#CHECK_FUNCTION_EXISTS(alloca HAVE_ALLOCA)
 #####
 # End system inspection checks.
 #####
@@ -1209,6 +1384,7 @@ CHECK_FUNCTION_EXISTS(_filelengthi64 HAVE_FILE_LENGTH_I64)
 ################################
 
 # Macro to append files to the EXTRA_DIST files.
+# Note: can only be used in subdirectories because of the use of PARENT_SCOPE
 SET(EXTRA_DIST "")
 MACRO(ADD_EXTRA_DIST files)
   FOREACH(F ${files})
@@ -1234,7 +1410,7 @@ IF(HAVE_M4)
   ADD_CUSTOM_COMMAND(
     OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c
     COMMAND ${NC_M4}
-    ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.m4 > ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c
+    ARGS ${M4FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.m4 > ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c
     VERBATIM
     )
 ENDIF(HAVE_M4)
@@ -1338,7 +1514,9 @@ MACRO(add_bin_test prefix F)
       PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
       )
   ENDIF()
-  ADD_TEST(${prefix}_${F} ${EXECUTABLE_OUTPUT_PATH}/${prefix}_${F})
+  ADD_TEST(${prefix}_${F}
+           ${EXECUTABLE_OUTPUT_PATH}/${prefix}_${F}
+           )
   IF(MSVC)
     SET_PROPERTY(TEST ${prefix}_${F} PROPERTY FOLDER "tests/")
     SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
@@ -1358,7 +1536,8 @@ MACRO(print_conf_summary)
   MESSAGE("")
   MESSAGE(STATUS "Building Shared Libraries:     ${BUILD_SHARED_LIBS}")
   MESSAGE(STATUS "Building netCDF-4:             ${ENABLE_NETCDF_4}")
-  MESSAGE(STATUS "Building DAP Support:          ${ENABLE_DAP}")
+  MESSAGE(STATUS "Building DAP2 Support:         ${ENABLE_DAP2}")
+  MESSAGE(STATUS "Building DAP4 Support:         ${ENABLE_DAP4}")
   MESSAGE(STATUS "Building Utilities:            ${BUILD_UTILITIES}")
   IF(CMAKE_PREFIX_PATH)
     MESSAGE(STATUS "CMake Prefix Path:             ${CMAKE_PREFIX_PATH}")
@@ -1375,7 +1554,6 @@ MACRO(print_conf_summary)
   MESSAGE("Tests Enabled:              ${ENABLE_TESTS}")
   IF(ENABLE_TESTS)
     MESSAGE(STATUS "DAP Remote Tests:  ${ENABLE_DAP_REMOTE_TESTS}")
-    MESSAGE(STATUS "DAP AUTH Tests:    ${ENABLE_DAP_AUTH_TESTS}")
     MESSAGE(STATUS "Extra Tests:       ${ENABLE_EXTRA_TESTS}")
     MESSAGE(STATUS "Coverage Tests:    ${ENABLE_COVERAGE_TESTS}")
     MESSAGE(STATUS "Parallel Tests:    ${ENABLE_PARALLEL_TESTS}")
@@ -1511,11 +1689,15 @@ IF(USE_HDF5)
   add_subdirectory(libsrc4)
 ENDIF(USE_HDF5)
 
-IF(USE_DAP)
+IF(ENABLE_DAP2)
   ADD_SUBDIRECTORY(oc2)
   ADD_SUBDIRECTORY(libdap2)
 ENDIF()
 
+IF(ENABLE_DAP4)
+  ADD_SUBDIRECTORY(libdap4)
+ENDIF()
+
 add_subdirectory(liblib)
 
 # For tests and utilities, we are no longer
@@ -1543,10 +1725,12 @@ IF(ENABLE_TESTS)
     ADD_SUBDIRECTORY(nc_test4)
     ADD_SUBDIRECTORY(h5_test)
   ENDIF()
-  IF(USE_DAP AND ENABLE_DAP_REMOTE_TESTS)
+  IF(ENABLE_DAP2)
     ADD_SUBDIRECTORY(ncdap_test)
   ENDIF()
-
+  IF(ENABLE_DAP4)
+    ADD_SUBDIRECTORY(dap4_test)
+  ENDIF()
   IF(ENABLE_EXAMPLES)
     ADD_SUBDIRECTORY(examples)
   ENDIF()
@@ -1638,7 +1822,8 @@ configure_file(
 
 FILE(MAKE_DIRECTORY ${netCDF_BINARY_DIR}/tmp)
 configure_file("${netCDF_SOURCE_DIR}/nc-config.cmake.in"
-  "${netCDF_BINARY_DIR}/tmp/nc-config" @ONLY)
+  "${netCDF_BINARY_DIR}/tmp/nc-config" @ONLY
+  NEWLINE_STYLE LF)
 FILE(COPY "${netCDF_BINARY_DIR}/tmp/nc-config"
   DESTINATION ${netCDF_BINARY_DIR}/
   FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
@@ -1698,10 +1883,12 @@ is_enabled(USE_SZIP HAS_SZIP)
 is_enabled(STATUS_PNETCDF HAS_PNETCDF)
 is_enabled(STATUS_PARALLEL HAS_PARALLEL)
 is_enabled(ENABLE_PARALLEL4 HAS_PARALLEL4)
-is_enabled(USE_DAP HAS_DAP)
+is_enabled(ENABLE_DAP HAS_DAP)
+is_enabled(ENABLE_DAP4 HAS_DAP4)
 is_enabled(USE_DISKLESS HAS_DISKLESS)
 is_enabled(USE_MMAP HAS_MMAP)
 is_enabled(JNA HAS_JNA)
+is_enabled(STATUS_RELAX_COORD_BOUND RELAX_COORD_BOUND)
 
 # Generate file from template.
 CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/libnetcdf.settings.in"
@@ -1735,6 +1922,14 @@ configure_file(
 FILE(COPY ${netCDF_SOURCE_DIR}/include/netcdf_meta.h
   DESTINATION ${netCDF_BINARY_DIR}/include/)
 
+#####
+# Build test_common.sh
+#####
+SET(EXTRA_DIST ${EXTRA_DIST} ${CMAKE_SOURCE_DIR}/test_common.in)
+SET(TOPSRCDIR "${CMAKE_SOURCE_DIR}")
+SET(TOPBUILDDIR "${CMAKE_BINARY_DIR}")
+configure_file(${CMAKE_SOURCE_DIR}/test_common.in ${CMAKE_BINARY_DIR}/test_common.sh @ONLY NEWLINE_STYLE LF)
+
 ####
 # Export files
 ####
diff --git a/COPYRIGHT b/COPYRIGHT
index a7df829..0994357 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -2,6 +2,7 @@ The NetCDF Copyright.
 
 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
+2015, 2016
 University Corporation for Atmospheric Research/Unidata.
 
 Portions of this software were developed by the Unidata Program at the 
diff --git a/Make0 b/Make0
index 49da4ff..1abe631 100644
--- a/Make0
+++ b/Make0
@@ -1,6 +1,7 @@
-T=t
+T=t_dap3a
 
 NCLIB=./liblib/.libs/libnetcdf.a
+D4LIB=./libdap4/.libs/libdap4.a
 
 LFLAG=-L/usr/local/lib
 
@@ -10,7 +11,7 @@ LFLAG=-L/usr/local/lib
 
 OTHERLIBS=-lm
 
-LIBS=${NCLIB} ${LFLAG} ${CURLLIB} ${HDF5LIB} ${ZLIB} ${OTHERLIBS}
+LIBS=${D4LIB} ${NCLIB} ${LFLAG} ${CURLLIB} ${HDF5LIB} ${ZLIB} ${OTHERLIBS}
 INCL=-I. -I./include
 RPATH=-Wl,-rpath,${LFLAG}
 
@@ -29,3 +30,11 @@ all::
 
 clean:
 	rm -f ${T}.o ${T}.exe
+
+
+EZXML=ezxml-0.8.6.tar.gz
+ezxml::
+	rm -fr ./ezxml ./ezxml.[ch]
+	tar -zxf ./${EZXML}
+	sed -e 's|//\(.*\)|/*\1*/|' <ezxml/ezxml.c >./ezxml.c
+	sed -e 's|//\(.*\)|/*\1*/|' <ezxml/ezxml.h >./ezxml.h
diff --git a/Makefile.am b/Makefile.am
index c1e9613..136a0bb 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -15,7 +15,7 @@ EXTRA_DIST = README.md COPYRIGHT INSTALL.md test_prog.c \
 	FixBundle.cmake.in \
 	nc-config.cmake.in RELEASE_NOTES.md CTestCustom.cmake \
 	CTestConfig.cmake.in libnetcdf.settings.in netCDFConfig.cmake.in \
-	CMakeInstallation.cmake
+	CMakeInstallation.cmake test-driver-verbose test_common.in
 
 # Doxygen doesn't build nicely in vpath builds.
 # Don't do this; it wipes out any exported values
@@ -53,15 +53,18 @@ LIBSRC4_DIR = libsrc4
 NC_TEST4 = nc_test4
 endif
 
-# Build the opendap client?
-if BUILD_DAP
+# Build the dap2 client
+if ENABLE_DAP
 OCLIB = oc2
 DAP2 = libdap2
-#if BUILD_UTILITIES
-NCDAPTESTDIR = ncdap_test
-#endif # BUILD_UTILITIES
+NCDAP2TESTDIR = ncdap_test
 endif
 
+if ENABLE_DAP4
+DAP4 = libdap4
+NCDAP4TESTDIR = dap4_test
+endif #DAP4
+
 # Build pnetcdf
 if USE_PNETCDF
 LIBSRCP = libsrcp
@@ -79,21 +82,21 @@ endif
 
 # Define Test directories
 if BUILD_TESTSETS
-TESTDIRS = $(V2_TEST) nc_test $(NC_TEST4) $(NCDAPTESTDIR)
+TESTDIRS = $(V2_TEST) nc_test $(NC_TEST4) $(NCDAP2TESTDIR) $(NCDAP4TESTDIR)
 endif
 
 # This is the list of subdirs for which Makefiles will be constructed
 # and run. ncgen must come before ncdump, because their tests
 # depend on it.
-SUBDIRS = include $(OCLIB) $(H5_TEST_DIR) libdispatch libsrc		\
-$(LIBSRC4_DIR) $(DAP2) $(LIBCDMR) $(LIBSRCP) liblib  \
+SUBDIRS = include $(H5_TEST_DIR) libdispatch libsrc		\
+$(LIBSRC4_DIR) $(LIBSRCP) $(OCLIB) $(DAP2) ${DAP4} liblib  \
 $(NCGEN3) $(NCGEN) $(NCDUMP) \
 $(TESTDIRS) \
 docs $(EXAMPLES) \
 $(UDUNITS) $(LIBCF)
 
 # Remove these generated files, for a distclean.
-DISTCLEANFILES = VERSION comps.txt test_prog libnetcdf.settings
+DISTCLEANFILES = VERSION comps.txt test_prog libnetcdf.settings test_common.sh
 
 # The nc-config script helps the user build programs with netCDF.
 bin_SCRIPTS = nc-config
@@ -128,6 +131,7 @@ settings_DATA=libnetcdf.settings
 ####
 
 MM4= ./nc_test/test_put ./nc_test/test_get \
+     ./nc_test/test_write ./nc_test/test_read \
      ./libsrc/netcdf ./libsrc/putget ./libsrc/ncx \
      ./libsrc/t_ncxx ./libsrc/attr
 
@@ -182,6 +186,14 @@ check_nc_config:
 	$(CC) `./nc-config --cflags` test_prog.c -o test_prog `./nc-config --libs`
 	./test_prog
 
+# Build nc_test/test_common.sh
+# Complicated by need to create during distcheck
+# which uses a read-only source tree
+#all-local:
+#	rm -f ${top_builddir}/nc_test/test_common.sh
+#	cat /dev/null > ${top_builddir}/nc_test/test_common.sh
+#	chmod a+x ${top_builddir}/nc_test/test_common.sh
+#	sed -e "s|@TOPSRCDIR@|${abs_top_srcdir}|" -e "s|@TOPBUILDDIR@|${abs_top_builddir}|" <${top_srcdir}/test_common.in >>${top_builddir}/test_common.sh
 
 install-data-hook:
 
diff --git a/Makefile.in b/Makefile.in
index a86a4fc..23a2687 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -212,9 +212,9 @@ am__define_uniq_tagged_files = \
 ETAGS = etags
 CTAGS = ctags
 CSCOPE = cscope
-DIST_SUBDIRS = include oc2 h5_test libdispatch libsrc libsrc4 libdap2 \
-	libsrcp liblib ncgen3 ncgen ncdump nctest nc_test nc_test4 \
-	ncdap_test docs examples
+DIST_SUBDIRS = include h5_test libdispatch libsrc libsrc4 libsrcp oc2 \
+	libdap2 libdap4 liblib ncgen3 ncgen ncdump nctest nc_test \
+	nc_test4 ncdap_test dap4_test docs examples
 am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
 	$(srcdir)/libnetcdf.settings.in $(srcdir)/nc-config.in \
 	$(srcdir)/netcdf.pc.in $(srcdir)/postinstall.sh.in compile \
@@ -302,6 +302,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -329,12 +330,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -369,6 +372,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -444,7 +448,7 @@ EXTRA_DIST = README.md COPYRIGHT INSTALL.md test_prog.c \
 	FixBundle.cmake.in \
 	nc-config.cmake.in RELEASE_NOTES.md CTestCustom.cmake \
 	CTestConfig.cmake.in libnetcdf.settings.in netCDFConfig.cmake.in \
-	CMakeInstallation.cmake
+	CMakeInstallation.cmake test-driver-verbose test_common.in
 
 
 # Doxygen doesn't build nicely in vpath builds.
@@ -474,12 +478,12 @@ pkgconfig_DATA = netcdf.pc
 @USE_NETCDF4_TRUE at LIBSRC4_DIR = libsrc4
 @USE_NETCDF4_TRUE at NC_TEST4 = nc_test4
 
-# Build the opendap client?
- at BUILD_DAP_TRUE@OCLIB = oc2
- at BUILD_DAP_TRUE@DAP2 = libdap2
-#if BUILD_UTILITIES
- at BUILD_DAP_TRUE@NCDAPTESTDIR = ncdap_test
-#endif # BUILD_UTILITIES
+# Build the dap2 client
+ at ENABLE_DAP_TRUE@OCLIB = oc2
+ at ENABLE_DAP_TRUE@DAP2 = libdap2
+ at ENABLE_DAP_TRUE@NCDAP2TESTDIR = ncdap_test
+ at ENABLE_DAP4_TRUE@DAP4 = libdap4
+ at ENABLE_DAP4_TRUE@NCDAP4TESTDIR = dap4_test
 
 # Build pnetcdf
 @USE_PNETCDF_TRUE at LIBSRCP = libsrcp
@@ -495,13 +499,13 @@ pkgconfig_DATA = netcdf.pc
 #endif
 
 # Define Test directories
- at BUILD_TESTSETS_TRUE@TESTDIRS = $(V2_TEST) nc_test $(NC_TEST4) $(NCDAPTESTDIR)
+ at BUILD_TESTSETS_TRUE@TESTDIRS = $(V2_TEST) nc_test $(NC_TEST4) $(NCDAP2TESTDIR) $(NCDAP4TESTDIR)
 
 # This is the list of subdirs for which Makefiles will be constructed
 # and run. ncgen must come before ncdump, because their tests
 # depend on it.
-SUBDIRS = include $(OCLIB) $(H5_TEST_DIR) libdispatch libsrc		\
-$(LIBSRC4_DIR) $(DAP2) $(LIBCDMR) $(LIBSRCP) liblib  \
+SUBDIRS = include $(H5_TEST_DIR) libdispatch libsrc		\
+$(LIBSRC4_DIR) $(LIBSRCP) $(OCLIB) $(DAP2) ${DAP4} liblib  \
 $(NCGEN3) $(NCGEN) $(NCDUMP) \
 $(TESTDIRS) \
 docs $(EXAMPLES) \
@@ -509,7 +513,7 @@ $(UDUNITS) $(LIBCF)
 
 
 # Remove these generated files, for a distclean.
-DISTCLEANFILES = VERSION comps.txt test_prog libnetcdf.settings
+DISTCLEANFILES = VERSION comps.txt test_prog libnetcdf.settings test_common.sh
 
 # The nc-config script helps the user build programs with netCDF.
 bin_SCRIPTS = nc-config
@@ -531,6 +535,7 @@ settings_DATA = libnetcdf.settings
 # List of files to create: WARNING leave off the extension
 ####
 MM4 = ./nc_test/test_put ./nc_test/test_get \
+     ./nc_test/test_write ./nc_test/test_read \
      ./libsrc/netcdf ./libsrc/putget ./libsrc/ncx \
      ./libsrc/t_ncxx ./libsrc/attr
 
@@ -1156,6 +1161,15 @@ check_nc_config:
 	$(CC) `./nc-config --cflags` test_prog.c -o test_prog `./nc-config --libs`
 	./test_prog
 
+# Build nc_test/test_common.sh
+# Complicated by need to create during distcheck
+# which uses a read-only source tree
+#all-local:
+#	rm -f ${top_builddir}/nc_test/test_common.sh
+#	cat /dev/null > ${top_builddir}/nc_test/test_common.sh
+#	chmod a+x ${top_builddir}/nc_test/test_common.sh
+#	sed -e "s|@TOPSRCDIR@|${abs_top_srcdir}|" -e "s|@TOPBUILDDIR@|${abs_top_builddir}|" <${top_srcdir}/test_common.in >>${top_builddir}/test_common.sh
+
 install-data-hook:
 
 # if BUILD_FORTRAN
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
old mode 100755
new mode 100644
index 745e847..64e6875
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -5,7 +5,35 @@ Release Notes       {#RELEASE_NOTES}
 
 This file contains a high-level description of this package's evolution. Releases are in reverse chronological order (most recent first). Note that, as of netcdf 4.2, the `netcdf-c++` and `netcdf-fortran` libraries have been separated into their own libraries.
 
-> Note: The combination of netCDF-C library versions earlier than 4.4.1 and libhdf5 1.10.0+ should be avoided, as they will result in binary files not readable by systems using earlier libhdf5 versions.
+## 4.5.0 - TBD
+
+### 4.5.0-rc1 - June 5, 2017
+
+* [Enhancement] DAP4 is now included. Since dap2 is the default for urls, dap4 must be specified by
+(1) using "dap4:" as the url protocol, or
+(2) appending "#protocol=dap4" to the end of the url, or
+(3) appending "#dap4" to the end of the url
+Note that dap4 is enabled by default but remote-testing is
+disbled until the testserver situation is resolved.
+* [Enhancement] The remote testing server can now be specified with the `--with-testserver` option to ./configure.
+* [Enhancement] Modified netCDF4 to use ASCII for NC_CHAR.  See [Github Pull request #316](https://github.com/Unidata/netcdf-c/pull/316) for more information.
+* [Bug Fix] Corrected an error with how dimsizes might be read. See [Github #410](https://github.com/unidata/netcdf-c/issues/410) for more information.
+* [Bug Fix] Corrected an issue where 'make check' would fail if 'make' or 'make all' had not run first.  See [Github #339](https://github.com/Unidata/netcdf-c/issues/339) for more information.
+* [Bug Fix] Corrected an issue on Windows with Large file tests. See [Github #385](https://github.com/Unidata/netcdf-c/issues/385]) for more information.
+* [Bug Fix] Corrected an issue with diskless file access, see [Pull Request #400](https://github.com/Unidata/netcdf-c/issues/400) and [Pull Request #403](https://github.com/Unidata/netcdf-c/issues/403) for more information.
+* [Upgrade] The bash based test scripts have been upgraded to use a common test_common.sh include file that isolates build specific information.
+* [Upgrade] The bash based test scripts have been upgraded to use a common test_common.sh include file that isolates build specific information.
+* [Refactor] the oc2 library is no longer independent of the main netcdf-c library. For example, it now uses ncuri, nclist, and ncbytes instead of its homegrown equivalents.
+* [Bug Fix] `NC_EGLOBAL` is now properly returned when attempting to set a global `_FillValue` attribute. See [GitHub #388](https://github.com/Unidata/netcdf-c/issues/388) and [GitHub #389](https://github.com/Unidata/netcdf-c/issues/389) for more information.
+* [Bug Fix] Corrected an issue where data loss would occur when `_FillValue` was mistakenly allowed to be redefined.  See [Github #390](https://github.com/Unidata/netcdf-c/issues/390), [GitHub #387](https://github.com/Unidata/netcdf-c/pull/387) for more information.
+* [Upgrade][Bug] Corrected an issue regarding how "orphaned" DAS attributes were handled. See [GitHub #376](https://github.com/Unidata/netcdf-c/pull/376) for more information.
+* [Upgrade] Update utf8proc.[ch] to use the version now maintained by the Julia Language project (https://github.com/JuliaLang/utf8proc/blob/master/LICENSE.md).
+* [Bug] Addressed conversion problem with Windows sscanf.  This primarily affected some OPeNDAP URLs on Windows.  See [GitHub #365](https://github.com/Unidata/netcdf-c/issues/365) and [GitHub #366](https://github.com/Unidata/netcdf-c/issues/366) for more information.
+* [Enhancement] Added support for HDF5 collective metadata operations when available. Patch submitted by Greg Sjaardema, see [Pull request #335](https://github.com/Unidata/netcdf-c/pull/335) for more information.
+* [Bug] Addressed a potential type punning issue. See [GitHub #351](https://github.com/Unidata/netcdf-c/issues/351) for more information.
+* [Bug] Addressed an issue where netCDF wouldn't build on Windows systems using MSVC 2012. See [GitHub #304](https://github.com/Unidata/netcdf-c/issues/304) for more information.
+* [Bug] Fixed an issue related to potential type punning, see [GitHub #344](https://github.com/Unidata/netcdf-c/issues/344) for more information.
+* [Enhancement] Incorporated an enhancement provided by Greg Sjaardema, which may improve read/write times for some complex files.  Basically, linked lists were replaced in some locations where it was safe to use an array/table.  See [Pull request #328](https://github.com/Unidata/netcdf-c/pull/328) for more information.
 
 ## 4.4.1.1 - November 21, 2016
 
diff --git a/acinclude.m4 b/acinclude.m4
index b88246a..2040f45 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -749,3 +749,25 @@ esac
 
 ])# AX_C_FLOAT_WORDS_BIGENDIAN
 
+dnl Find the full path of a header file
+dnl
+dnl UD_CHECK_HEADER_PATH(file, [action-if-found], [action-if-not-found])
+dnl Example:
+dnl UD_CHECK_HEADER_PATH([math.h])
+dnl AC_MSG_NOTICE([ac_cv_header_path_math_h=$ac_cv_header_path_math_h])
+dnl
+dnl
+AC_DEFUN([UD_CHECK_HEADER_PATH],
+[
+    AS_VAR_PUSHDEF([ac_Path], [ac_cv_header_path_$1])dnl
+    AC_CACHE_CHECK(
+       [for full path of header file $1], [ac_Path],
+       [AC_PREPROC_IFELSE(
+           [AC_LANG_PROGRAM([[#include <$1>]])],
+           [AS_VAR_SET([ac_Path], [`sed -n '/\.h"/s/.*"\(.*\)".*/\1/p' conftest.i | grep -m 1 $1`])],
+           [AC_MSG_RESULT([not found])]
+       )])
+    AS_VAR_SET_IF([ac_Path], [$2], [$3])
+    AS_VAR_POPDEF([ac_Path])dnl
+])
+
diff --git a/cf b/cf
index eb22c78..967868b 100644
--- a/cf
+++ b/cf
@@ -2,7 +2,7 @@
 #NB=1
 DB=1
 #X=-x
-#FAST=1
+FAST=1
 
 HDF5=1
 DAP=1
@@ -54,24 +54,8 @@ MALLOC_CHECK=""
 CPPFLAGS=""
 LDFLAGS=""
 
-CFLAGS="-g -O0 $CFLAGS"
-
-case "$HOST" in
-  mort)
-	CFLAGS="-std=c99 $CFLAGS"
-	;;
-  yakov)
-	CFLAGS="-std=c99 $CFLAGS"
-	;;
-  spock)
-  	  CFLAGS="-Wdeclaration-after-statement -Wall $CFLAGS"
-	;;
-  spike)
-	CFLAGS="-Wall $CFLAGS"
-	;;
-  *)
-	;;
-esac
+#CFLAGS="-g -O0 $CFLAGS"
+CFLAGS="-g $CFLAGS"
 
 MAKE=make
 IGNORE="test 0 = 1"
@@ -86,7 +70,8 @@ if test "x$HDF4" = "x1" ; then
 LDFLAGS="$LDFLAGS -ljpeg"
 fi
 
-if test "x$DAP" = "x1" -o "x$CDMR" = "x1" -o "x$RPC" = "x1" ; then
+export PKG_CONFIG_PATH=/usr/lib/pkgconfig
+if test "x$DAP" = "x1" ; then
 if curl-config --version >/dev/null ; then
 TMP=`curl-config --cflags`
 CPPFLAGS="$TMP $CPPFLAGS"
@@ -95,8 +80,7 @@ LDFLAGS="$TMP $LDFLAGS"
 TMP=`curl-config --prefix`
 LD_LIBRARY_PATH="$TMP/lib:$LD_LIBRARY_PATH"
 else
-  echo "Cannot find curl-config"
-  exit 1
+  LDFLAGS="${LDFLAGS} -lcurl"  
 fi
 fi
 
@@ -111,13 +95,14 @@ FLAGS="$FLAGS --disable-examples"
 #FLAGS="$FLAGS --enable-dap-long-tests"
 #FLAGS="$FLAGS --enable-ffio"
 #FLAGS="$FLAGS --enable-benchmarks"
-#FLAGS="$FLAGS --enable-extra-tests"
+FLAGS="$FLAGS --enable-extreme-numbers"
+FLAGS="$FLAGS --enable-extra-tests"
 #FLAGS="$FLAGS --enable-large-file-tests"
 #FLAGS="$FLAGS --disable-testsets"
 #FLAGS="$FLAGS --disable-dap-remote-tests"
-FLAGS="$FLAGS --enable-dap-auth-tests"
+#FLAGS="$FLAGS --enable-dap-auth-tests" -- requires a new remotetest server
 #FLAGS="$FLAGS --enable-doxygen"
-#FLAGS="$FLAGS --enable-logging"
+FLAGS="$FLAGS --enable-logging"
 #FLAGS="$FLAGS --disable-diskless"
 #FLAGS="$FLAGS --enable-mmap"
 #FLAGS="$FLAGS --with-udunits"
@@ -127,6 +112,8 @@ FLAGS="$FLAGS --enable-dap-auth-tests"
 #FLAGS="$FLAGS --enable-jna"
 #FLAGS="$FLAGS --disable-properties-attribute"
 #FLAGS="$FLAGS --disable-silent-rules"
+#FLAGS="$FLAGS --enable-dap4"
+#FLAGS="$FLAGS --with-testservers=remotestserver.localhost:8083"
 
 if test "x$PAR4" != x1 ; then
 FLAGS="$FLAGS --disable-parallel4"
diff --git a/cf.cmake b/cf.cmake
index b74021a..dcb842b 100644
--- a/cf.cmake
+++ b/cf.cmake
@@ -1,75 +1,51 @@
-# Is netcdf-4 and/or DAP enabled?
-#NC4=1
-#DAP=1
-
-# Is visual studio being used?
-#VS=yes
-CYGWIN=yes
-
-if test "x$VS" = x ; then
-#CC=mpicc
-CC=gcc
-fi
-
-export CC
-
-if test "x$VS" != x -a "x$CYGWIN" != x ; then
-  ZLIB=cygz.dll; H5LIB=cyghdf5.dll; H5LIB_HL=cyghdf5_hl.dll; CURLLIB=cygcurl.dll
-elif test "x$VS" = x -a "x$CYGWIN" != x ; then
-  ZLIB=libz.dll.a; H5LIB=libhdf5.dll.a; H5LIB_HL=libhdf5_hl.dll.a; CURLLIB=libcurl.dll.a
-elif test "x$VS" = x -a "x$CYGWIN" == x ; then
-  ZLIB=libz.so; H5LIB=libhdf5.so; H5LIB_HL=libhdf5_hl.so; CURLLIB=libcurl.so
-else
-  echo "cannot determine library names"
-  exit 1
-fi
-
-for p in /usr/bin /usr/local/bin /usr/local/lib /usr/lib ; do
-if test -f $p/$ZLIB ; then ZP=$p; fi
-if test -f $p/$H5LIB ; then HP=$p; fi
-if test -f $p/$CURLLIB ; then CP=$p; fi
-done
-
-if test "x$ZP" = x ; then echo "Cannot find z lib" ; exit 1; fi
-if test "x$HP" = x ; then echo "Cannot find hdf5 lib" ; exit 1; fi
-if test "x$CP" = x ; then echo "Cannot find curl lib" ; exit 1; fi
+# Visual Studio
+#VS=1
 
-if test "x$CYGWIN" != x -a "x$VS" != x; then
-ZP=`cygpath -w "$ZP"`
-HP=`cygpath -w "$HP"`
-CP=`cygpath -w "$CP"`
-fi
-
-#if test "x$VS" != x ; then USR=c:/cygwin/usr; else USR=/usr; fi
+# Is netcdf-4 and/or DAP enabled?
+NC4=1
+DAP=1
 
-ZLIB="-DZLIB_LIBRARY=${ZP}/$ZLIB -DZLIB_INCLUDE_DIR=${ZP}/include -DZLIB_INCLUDE_DIRS=${ZP}/include"
-if test "x$NC4" = x1 ; then
-HDF5="-DHDF5_LIB=${HP}/$H5LIB -DHDF5_HL_LIB=${HP}/$H5LIB_HL -DHDF5_INCLUDE_DIR=${HP}/include"
+if test "x$VS" != x ; then
+FLAGS="-DCMAKE_PREFIX_PATH=c:/tools/nccmake"
 fi
-if test "x$DAP" = x1 ; then
-CURL="-DCURL_LIBRARY=${CP}/$CURLLIB -DCURL_INCLUDE_DIR=${CP}/include -DCURL_INCLUDE_DIRS=${CP}/include"
-fi
-
-#FLAGS="$FLAGS -DCMAKE_C_FLAGS='-Wall -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unused-parameter'"x2
+FLAGS="$FLAGS -DCMAKE_INSTALL_PREFIX=d:/ignore"
 
 if test "x$DAP" = x ; then
 FLAGS="$FLAGS -DENABLE_DAP=false"
+else
+FLAGS="$FLAGS -DENABLE_DAP=true"
 fi
 if test "x$NC4" = x ; then
 FLAGS="$FLAGS -DENABLE_NETCDF_4=false"
 fi
 FLAGS="$FLAGS -DENABLE_CONVERSION_WARNINGS=false"
-
-FLAGS="$FLAGS -DCMAKE_INSTALL_PREFIX=$USR/local"
-#FLAGS="-DCMAKE_PREFIX_PATH=$PPATH"
-#FLAGS="$FLAGS -DCMAKE_PREFIX_PATH=$PPATH"
 FLAGS="$FLAGS -DENABLE_DAP_REMOTE_TESTS=true"
-#FLAGS="$FLAGS -DENABLE_DAP_AUTH_TESTS=true"
+FLAGS="$FLAGS -DENABLE_TESTS=true"
+FLAGS="$FLAGS -DENABLE_EXAMPLES=false"
+#FLAGS="$FLAGS -DENABLE_HDF4=true"
+FLAGS="$FLAGS -DENABLE_DYNAMIC_LOADING=false"
 
 rm -fr build
 mkdir build
 cd build
 
-cmake $FLAGS ${ZLIB} ${HDF5} ${CURL} ..
-cmake --build .
-CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target test
+NCLIB=`pwd`
+
+if test "x$VS" != x ; then
+# Visual Studio
+#CFG="RelWithDebInfo"
+CFG="Release"
+NCLIB="${NCLIB}/build/liblib/$CFG"
+export PATH="${NCLIB}:${PATH}"
+cmake $FLAGS ..
+cmake --build . --config ${CFG}
+cmake --build . --config ${CFG} --target RUN_TESTS
+else
+# GCC
+NCLIB="${NCLIB}/build/liblib"
+G="-GUnix Makefiles"
+cmake "${G}" $FLAGS ..
+make all
+make test
+fi
+exit
diff --git a/config.h.cmake.in b/config.h.cmake.in
index 0fb66a3..0db40cc 100644
--- a/config.h.cmake.in
+++ b/config.h.cmake.in
@@ -1,63 +1,65 @@
 #ifndef CONFIG_H
 #define CONFIG_H
 
-/* Eliminate a number of warnings which come up based on deprecated
-   POSIX naming conventions. */
 #ifdef _MSC_VER
 
-#if _MSC_VER>=1900
-  #define STDC99
-#endif
-/* Define O_BINARY so that the appropriate flags
-are set when opening a binary file on Windows. */
-
-/* Disable a few warnings under Visual Studio, for the
-   time being. */
-  #include <io.h>
-  #pragma warning( disable: 4018 4996 4244 4305 )
-  #define unlink _unlink
-  #define open _open
-  #define close _close
-  #define read _read
-  #define lseek _lseeki64
+/* Prevent an issue where there is a circular inclusion
+   of winsock.h/windows.h.  This weird state occurs with
+   libdap4 and hdf4 support. The solution comes from the
+   following URL, found after a bit of research.
 
-  #define fstat _fstat64
+   Added in support of the 4.5.0-rc1.  Hello, future generations.
 
-  #define off_t __int64
-  #define _off_t __int64
+   * https://stackoverflow.com/questions/1372480/c-redefinition-header-files-winsock2-h
 
-  #ifndef _OFF_T_DEFINED
-  #define _OFF_T_DEFINED
-  #endif
+   */
+   #define _WINSOCKAPI_
 
-#ifdef _WIN32
-  #ifndef strcasecmp
-    #define strcasecmp _stricmp
-  #endif
+   #if _MSC_VER>=1900
+     #define STDC99
+   #endif
+/* Define O_BINARY so that the appropriate flags
+are set when opening a binary file on Windows. */
 
-  #ifndef snprintf
-    #if _MSC_VER<1900
-      #define snprintf _snprintf
+/* Disable a few warnings under Visual Studio, for the
+   time being. */
+   #include <io.h>
+   #pragma warning( disable: 4018 4996 4244 4305 )
+   #define unlink _unlink
+   #define open _open
+   #define close _close
+   #define read _read
+   #define lseek _lseeki64
+
+   #define fstat _fstat64
+
+   #define off_t __int64
+   #define _off_t __int64
+
+   #ifndef _OFF_T_DEFINED
+   #define _OFF_T_DEFINED
+   #endif
+
+   #ifdef _WIN32
+    #ifndef strcasecmp
+      #define strcasecmp _stricmp
     #endif
-  #endif
-#endif
 
+    #ifndef snprintf
+     #if _MSC_VER<1900
+       #define snprintf _snprintf
+     #endif
+    #endif
+   #endif
 
-  #define strdup _strdup
-  #define fdopen _fdopen
-  #define write _write
-  #define strtoll _strtoi64
-#endif
 
+   #define strdup _strdup
+   #define fdopen _fdopen
+   #define write _write
+   #define strtoll _strtoi64
+#endif /*_MSC_VER */
 
-/* Cache Size, other variables for HDF5 */
-#define DEFAULT_CHUNK_SIZE	${DEFAULT_CHUNK_SIZE}
-#define DEFAULT_CHUNKS_IN_CACHE	${DEFAULT_CHUNKS_IN_CACHE}
-#define CHUNK_CACHE_SIZE 	${CHUNK_CACHE_SIZE}
-#define CHUNK_CACHE_NELEMS 	${CHUNK_CACHE_NELEMS}
-#define CHUNK_CACHE_PREEMPTION 	${CHUNK_CACHE_PREEMPTION}
-#define MAX_DEFAULT_CACHE_SIZE	${MAX_DEFAULT_CACHE_SIZE}
-#define NCIO_MINBLOCKSIZE	${NCIO_MINBLOCKSIZE}
+#cmakedefine const
 
 #ifndef _FILE_OFFSET_BITS
 #cmakedefine _FILE_OFFSET_BITS ${_FILE_OFFSET_BITS}
@@ -65,243 +67,637 @@ are set when opening a binary file on Windows. */
 #cmakedefine _LARGEFILE_SOURCE
 #endif
 
-#define PACKAGE_VERSION "${VERSION}"
-#cmakedefine VERSION "${VERSION}"
-#cmakedefine NC_VERSION "${VERSION}"
-/* For HDF5 use. */
-#cmakedefine H5_USE_16_API 1
+/* Define if building universal (internal helper macro) */
+#cmakedefine AC_APPLE_UNIVERSAL_BUILD 1
 
-/* Enable Logging, only valid for netcdf 4. */
-#cmakedefine LOGGING 1
+/* If true, will attempt to download and build netcdf-fortran. */
+#cmakedefine BUILD_FORTRAN 1
 
-/* Various other options. */
-#cmakedefine BUILD_V2 1
-#cmakedefine NO_NETCDF_2 1
-#cmakedefine USE_FSYNC 1
-#cmakedefine JNA 1
-#cmakedefine ENABLE_DOXYGEN 1
-#cmakedefine ENABLE_INTERNAL_DOCS 1
-#cmakedefine VALGRIND_TESTS 1
-#cmakedefine ENABLE_CDMREMOTE 1
-#cmakedefine USE_DAP 1
+/* default file chunk cache nelems. */
+#cmakedefine CHUNK_CACHE_NELEMS ${CHUNK_CACHE_NELEMS}
+
+/* default file chunk cache preemption policy. */
+#cmakedefine CHUNK_CACHE_PREEMPTION ${CHUNK_CACHE_PREEMPTION}
+
+/* default file chunk cache size in bytes. */
+#cmakedefine CHUNK_CACHE_SIZE ${CHUNK_CACHE_SIZE}
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#cmakedefine CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#cmakedefine C_ALLOCA 1
+
+/* num chunks in default per-var chunk cache. */
+#cmakedefine DEFAULT_CHUNKS_IN_CACHE ${DEFAULT_CHUNKS_IN_CACHE}
+
+/* default chunk size in bytes */
+#cmakedefine DEFAULT_CHUNK_SIZE ${DEFAULT_CHUNK_SIZE}
+
+/* set this only when building a DLL under MinGW */
+#cmakedefine DLL_EXPORT 1
+
+/* set this only when building a DLL under MinGW */
+#cmakedefine DLL_NETCDF 1
+
+/* if true, build DAP2 and DAP4 Client */
 #cmakedefine ENABLE_DAP 1
+
+/* if true, build DAP4 Client */
+#cmakedefine ENABLE_DAP4 1
+
+/* if true, build DAP4 Client */
+#cmakedefine ENABLE_DAP4 1
+
+/* if true, enable DAP group names */
 #cmakedefine ENABLE_DAP_GROUPS 1
+
+/* if true, do remote tests */
 #cmakedefine ENABLE_DAP_REMOTE_TESTS 1
-#cmakedefine EXTRA_TESTS
-#cmakedefine USE_NETCDF4 1
-#cmakedefine USE_LIBDL 1
-#cmakedefine USE_HDF4 1
-#cmakedefine USE_HDF5 1
-#cmakedefine USE_FFIO 1
-#cmakedefine USE_PARALLEL_POSIX 1
-#cmakedefine USE_PARALLEL_MPIO 1
-#cmakedefine HDF5_HAS_H5FREE 1
-#cmakedefine HDF5_HAS_LIBVER_BOUNDS 1
-#cmakedefine HDF5_PARALLEL 1
-#cmakedefine USE_PARALLEL 1
-#cmakedefine USE_PARALLEL4 1
-#cmakedefine USE_PNETCDF 1
-#cmakedefine USE_MMAP 1
-#cmakedefine ENABLE_FILEINFO 1
-#cmakedefine TEST_PARALLEL ${TEST_PARALLEL}
-#cmakedefine BUILD_RPC 1
-#cmakedefine USE_DISKLESS 1
-#cmakedefine USE_SZIP 1
-#cmakedefine USE_ZLIB 1
-#cmakedefine USE_X_GETOPT 1
-#cmakedefine ENABLE_EXTREME_NUMBERS
-#cmakedefine LARGE_FILE_TESTS 1
-#cmakedefine HAVE_DECL_ISFINITE 1
-#cmakedefine HAVE_DECL_ISNAN 1
-#cmakedefine HAVE_CURLOPT_USERNAME 1
-#cmakedefine HAVE_CURLOPT_PASSWORD 1
-#cmakedefine HAVE_CURLOPT_KEYPASSWD 1
+
+/* define the possible sources for remote test servers */
+#cmakedefine REMOTETESTSERVERS	"${REMOTETESTSERVERS}"
+
+/* if true, run extra tests which may not work yet */
+#cmakedefine EXTRA_TESTS 1
+
+/* use HDF5 1.6 API */
+#cmakedefine H5_USE_16_API 1
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#cmakedefine HAVE_ALLOCA 1
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#cmakedefine HAVE_ALLOCA_H 1
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#cmakedefine HAVE_CTYPE_H 1
+
+/* Define to 1 if you have hdf5_coll_metadata_ops */
+#cmakedefine HDF5_HAS_COLL_METADATA_OPS 1
+
+/* Is CURLINFO_RESPONSE_CODE defined */
 #cmakedefine HAVE_CURLINFO_RESPONSE_CODE 1
+
+/* Is CURLOPT_CHUNK_BGN_FUNCTION defined */
 #cmakedefine HAVE_CURLOPT_CHUNK_BGN_FUNCTION 1
-#cmakedefine HAVE_DECL_SIGNBIT 1
-#cmakedefine HAVE_DOPRNT
-#cmakedefine HAVE_ALLOCA
-#cmakedefine HAVE_SSIZE_T 1
-#cmakedefine HAVE_LIBPNETCDF 1
-#cmakedefine HAVE_LIBDL 1
 
-/* Define to 1 if you have the <alloca.h> header file. */
-#cmakedefine HAVE_ALLOCA_H @HAVE_ALLOCA_H@
+/* Is CURLOPT_KEYPASSWD defined */
+#cmakedefine HAVE_CURLOPT_KEYPASSWD 1
 
-/* Define to 1 if you have the <ctype.h> header file. */
-#cmakedefine HAVE_CTYPE_H @HAVE_CTYPE_H@
+/* Is CURLOPT_PASSWORD defined */
+#cmakedefine HAVE_CURLOPT_PASSWORD 1
 
-/* Define to 1 if you have the <dirent> header file. */
-#cmakedefine HAVE_DIRENT_H @HAVE_DIRENT_H@
+/* Is CURLOPT_USERNAME defined */
+#cmakedefine HAVE_CURLOPT_USERNAME 1
 
-/* Define to 1 if you have the <unistd.h> header file. */
-#cmakedefine HAVE_UNISTD_H @HAVE_UNISTD_H@
-#cmakedefine YY_NO_UNISTD_H @YY_NO_UNISTD_H@
+/* Define to 1 if you have the declaration of `isfinite', and to 0 if you
+   don't. */
+#cmakedefine HAVE_DECL_ISFINITE 1
+
+/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
+   */
+#cmakedefine HAVE_DECL_ISINF 1
+
+/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
+   */
+#cmakedefine HAVE_DECL_ISNAN 1
+
+/* Define to 1 if you have the declaration of `signbit', and to 0 if you
+   don't. */
+#cmakedefine HAVE_DECL_SIGNBIT 1
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_DIRENT_H 1
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
-#cmakedefine HAVE_DLFCN_H @HAVE_DLFCN_H@
+#cmakedefine HAVE_DLFCN_H 1
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#cmakedefine HAVE_DOPRNT 1
 
 /* Define to 1 if you have the <errno.h> header file. */
-#cmakedefine HAVE_ERRNO_H @HAVE_ERRNO_H@
+#cmakedefine HAVE_ERRNO_H 1
 
 /* Define to 1 if you have the <fcntl.h> header file. */
-#cmakedefine HAVE_FCNTL_H @HAVE_FCNTL_H@
+#cmakedefine HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the BaseTsd.h header file. */
+#cmakedefine HAVE_BASETSD_H @HAVE_BASETSD_H@
+
+/* Define if we have filelengthi64. */
+#cmakedefine HAVE_FILE_LENGTH_I64 @HAVE_FILE_LENGTH_I64@
+
+
+/* Define to 1 if you have the `fsync' function. */
+#cmakedefine HAVE_FSYNC 1
 
 /* Define to 1 if you have the <getopt.h> header file. */
-#cmakedefine HAVE_GETOPT_H @HAVE_GETOPT_H@
+#cmakedefine HAVE_GETOPT_H 1
 
-/* Define to 1 if you have the <stdarg.h> header file. */
-#cmakedefine HAVE_STDARG_H @HAVE_STDARG_H@
+/* Define to 1 if you have the `getpagesize' function. */
+#cmakedefine HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the `getrlimit' function. */
+#cmakedefine HAVE_GETRLIMIT 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#cmakedefine HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the `H5free_memory' function. */
+#cmakedefine HAVE_H5FREE_MEMORY 1
+
+/* Define to 1 if you have the `H5Pget_fapl_mpio' function. */
+#cmakedefine HAVE_H5PGET_FAPL_MPIO 1
+
+/* Define to 1 if you have the `H5Pget_fapl_mpiposix' function. */
+#cmakedefine HAVE_H5PGET_FAPL_MPIPOSIX 1
+
+/* Define to 1 if you have the `H5Pset_deflate' function. */
+#cmakedefine HAVE_H5PSET_DEFLATE 1
+
+/* if true, netcdf4 file properties will be set using H5Pset_libver_bounds */
+#cmakedefine HDF5_HAS_LIBVER_BOUNDS 1
+
+/* Define to 1 if you have the `H5Z_SZIP' function. */
+#cmakedefine HAVE_H5Z_SZIP 1
 
 /* Define to 1 if you have the <hdf5.h> header file. */
-#cmakedefine HAVE_HDF5_H @HAVE_HDF5_H@
+#cmakedefine HAVE_HDF5_H 1
 
-/* Define to 1 if you have the <hdf5_hl.h> header file. */
-#cmakedefine HAVE_HDF5_HL_H @HAVE_HDF5_HL_H@
+/* Define to 1 if you have the <hdf5.h> header file. */
+#cmakedefine HAVE_HDF5_HL_H 1
+
+/* Define to 1 if the system has the type `int64'. */
+#cmakedefine HAVE_INT64 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#cmakedefine HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `df' library (-ldf). */
+#cmakedefine HAVE_LIBDF 1
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+#cmakedefine HAVE_LIBDL 1
+
+/* Define to 1 if you have the `jpeg' library (-ljpeg). */
+#cmakedefine HAVE_LIBJPEG 1
+
+/* Define to 1 if you have the `m' library (-lm). */
+#cmakedefine HAVE_LIBM 1
 
-/* Define to 1 if you have the <stdbool.h> header file. */
-#cmakedefine HAVE_STDBOOL_H @HAVE_STDBOOL_H@
+/* Define to 1 if you have the `mfhdf' library (-lmfhdf). */
+#cmakedefine HAVE_LIBMFHDF 1
+
+/* Define to 1 if you have the `pnetcdf' library (-lpnetcdf). */
+#cmakedefine HAVE_LIBPNETCDF 1
 
 /* Define to 1 if you have the <locale.h> header file. */
-#cmakedefine HAVE_LOCAL_H @HAVE_LOCAL_H@
+#cmakedefine HAVE_LOCALE_H 1
+
+/* Define to 1 if the system has the type `longlong'. */
+#cmakedefine HAVE_LONGLONG 1
+
+/* Define to 1 if the system has the type 'long long int'. */
+#cmakedefine HAVE_LONG_LONG_INT 1
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#cmakedefine HAVE_MALLOC_H 1
+
+/* Define to 1 if you have the `memcmp' function. */
+#cmakedefine HAVE_MEMCMP 1
+
+/* Define to 1 if you have the `memmove' function. */
+#cmakedefine HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#cmakedefine HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <mfhdf.h> header file. */
+#cmakedefine HAVE_MFHDF_H 1
+
+/* Define to 1 if you have the `mkstemp' function. */
+#cmakedefine HAVE_MKSTEMP 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+#cmakedefine HAVE_MMAP 1
+
+/* Define to 1 if you have the `MPI_Comm_f2c' function. */
+#cmakedefine HAVE_MPI_COMM_F2C 1
+
+/* Define to 1 if you have the `mremap' function. */
+#cmakedefine HAVE_MREMAP 1
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#cmakedefine HAVE_NDIR_H 1
+
+/* Define to 1 if the system has the type `ptrdiff_t'. */
+#cmakedefine HAVE_PTRDIFF_T 1
+
+/* Define to 1 if you have the `rand' function. */
+#cmakedefine HAVE_RAND 1
+
+/* Define to 1 if you have the `random' function. */
+#cmakedefine HAVE_RANDOM 1
+
+/* Define to 1 if the system has the type `size_t'. */
+#cmakedefine HAVE_SIZE_T 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#cmakedefine HAVE_SNPRINTF 1
+
+/* Define to 1 if the system has the type `ssize_t'. */
+#cmakedefine HAVE_SSIZE_T 1
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#cmakedefine HAVE_STDARG_H 1
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#cmakedefine HAVE_STDBOOL_H 1
 
 /* Define to 1 if you have the <stdint.h> header file. */
-#cmakedefine HAVE_STDINT_H @HAVE_STDINT_H@
+#cmakedefine HAVE_STDINT_H 1
 
 /* Define to 1 if you have the <stdio.h> header file. */
-#cmakedefine HAVE_STDIO_H @HAVE_STDIO_H@
+#cmakedefine HAVE_STDIO_H 1
 
 /* Define to 1 if you have the <stdlib.h> header file. */
-#cmakedefine HAVE_STDLIB_H @HAVE_STDLIB_H@
+#cmakedefine HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#cmakedefine HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the `strcat' function. */
+#cmakedefine HAVE_STRCAT 1
+
+/* Define to 1 if you have the `strchr' function. */
+#cmakedefine HAVE_STRCHR 1
+
+/* Define to 1 if you have the `strcpy' function. */
+#cmakedefine HAVE_STRCPY 1
+
+/* Define to 1 if you have the `strdup' function. */
+#cmakedefine HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strndup` function. */
+#cmakedefine HAVE_STRNDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#cmakedefine HAVE_STRERROR 1
 
 /* Define to 1 if you have the <strings.h> header file. */
-#cmakedefine HAVE_STRINGS_H @HAVE_STRINGS_H@
+#cmakedefine HAVE_STRINGS_H 1
 
 /* Define to 1 if you have the <signal.h> header file. */
-#cmakedefine HAVE_SIGNAL_H @HAVE_SIGNAL_H@
+#cmakedefine HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#cmakedefine HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strlcat' function. */
+#cmakedefine HAVE_STRLCAT 1
+
+/* Define to 1 if you have the `strrchr' function. */
+#cmakedefine HAVE_STRRCHR 1
+
+/* Define to 1 if you have the `strstr' function. */
+#cmakedefine HAVE_STRSTR 1
 
-/* Define to 1 if you have the <sys/dir.h> header file. */
-#cmakedefine HAVE_SYS_DIR_H @HAVE_SYS_DIR_H@
+/* Define to 1 if you have the `strtod' function. */
+#cmakedefine HAVE_STRTOD 1
 
-/* Define to 1 if you have the <sys/ndir.h> header file. */
-#cmakedefine HAVE_SYS_NDIR_H @HAVE_SYS_NDIR_H@
+/* Define to 1 if you have the `strtoll' function. */
+#cmakedefine HAVE_STRTOLL 1
+
+/* Define to 1 if you have the `strtoull' function. */
+#cmakedefine HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `stroull' function. */
+#cmakedefine HAVE_STROULL 1
+
+/* Define to 1 if `st_blksize' is a member of `struct stat'. */
+#cmakedefine HAVE_STRUCT_STAT_ST_BLKSIZE 1
+
+/* Define to 1 if your `struct stat' has `st_blksize'. Deprecated, use
+   `HAVE_STRUCT_STAT_ST_BLKSIZE' instead. */
+#cmakedefine HAVE_ST_BLKSIZE 1
+
+/* Define to 1 if you have the `sysconf' function. */
+#cmakedefine HAVE_SYSCONF 1
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_DIR_H 1
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_NDIR_H 1
 
 /* Define to 1 if you have the <sys/param.h> header file. */
-#cmakedefine HAVE_SYS_PARAM_H @HAVE_SYS_PARAM_H@
+#cmakedefine HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#cmakedefine HAVE_SYS_RESOURCE_H 1
 
 /* Define to 1 if you have the <sys/stat.h> header file. */
-#cmakedefine HAVE_SYS_STAT_H @HAVE_SYS_STAT_H@
+#cmakedefine HAVE_SYS_STAT_H 1
 
 /* Define to 1 if you have the <sys/time.h> header file. */
-#cmakedefine HAVE_SYS_TIME_H @HAVE_SYS_TIME_H@
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#cmakedefine HAVE_SYS_RESOURCE_H @HAVE_SYS_RESOURCE_H@
+#cmakedefine HAVE_SYS_TIME_H 1
 
 /* Define to 1 if you have the <sys/types.h> header file. */
-#cmakedefine HAVE_SYS_TYPES_H @HAVE_SYS_TYPES_H@
+#cmakedefine HAVE_SYS_TYPES_H 1
 
-/* Define to 1 if you have the <sys/wait.h> header file. */
-#cmakedefine HAVE_SYS_WAIT_H @HAVE_SYS_WAIT_H@
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#cmakedefine HAVE_SYS_WAIT_H 1
 
-/* Define to 1 if you have the <inttypes.h> header file. */
-#cmakedefine HAVE_INTTYPES_H @HAVE_INTTYPES_H@
+/* Define to 1 if the system has the type `uchar'. */
+#cmakedefine HAVE_UCHAR 1
 
-/* Define to 1 if you have the <fcntl.h> header file. */
-#cmakedefine HAVE_FCNTL_H @HAVE_FCNTL_H@
+/* Define to 1 if the system has the type `uint'. */
+#cmakedefine HAVE_UINT 1
 
-/* Define to 1 if you have the <malloc.h> header file. */
-#cmakedefine HAVE_MALLOC_H @HAVE_MALLOC_H@
+/* Define to 1 if the system has the type `uint64'. */
+#cmakedefine HAVE_UINT64 1
 
-/* Define to 1 if you have the BaseTsd.h header file. */
-#cmakedefine HAVE_BASETSD_H @HAVE_BASETSD_H@
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H 1
+#cmakedefine YY_NO_UNISTD_H 1
 
-/* Define if we have filelengthi64. */
-#cmakedefine HAVE_FILE_LENGTH_I64 @HAVE_FILE_LENGTH_I64@
+/* Define to 1 if the system has the type 'unsigned long long int'. */
+#cmakedefine HAVE_UNSIGNED_LONG_LONG_INT 1
 
-/* Define whether char is signed by default. */
-#ifndef __CHAR_UNSIGNED__
-#cmakedefine __CHAR_UNSIGNED__
-#endif
+/* Define to 1 if the system has the type `ushort'. */
+#cmakedefine HAVE_USHORT 1
+
+/* Define to 1 if you have the `vprintf' function. */
+#cmakedefine HAVE_VPRINTF 1
+
+/* Define to 1 if the system has the type `_Bool'. */
+#cmakedefine HAVE__BOOL 1
+
+/* if true, H5free_memory() will be used to free hdf5-allocated memory in
+   nc4file. */
+#cmakedefine HDF5_HAS_H5FREE 1
+
+/* if true, hdf5 has parallelism enabled */
+#cmakedefine HDF5_PARALLEL 1
+
+/* if true, include JNA bug fix */
+#cmakedefine JNA 1
+
+/* do large file tests */
+#cmakedefine LARGE_FILE_TESTS 1
+
+/* If true, turn on logging. */
+#cmakedefine LOGGING 1
+
+/* max size of the default per-var chunk cache. */
+#cmakedefine MAX_DEFAULT_CACHE_SIZE ${MAX_DEFAULT_CACHE_SIZE}
+
+/* min blocksize for posixio. */
+#cmakedefine NCIO_MINBLOCKSIZE ${NCIO_MINBLOCKSIZE}
+
+/* no IEEE float on this platform */
+#cmakedefine NO_IEEE_FLOAT 1
+
+#cmakedefine BUILD_V2 1
+#cmakedefine ENABLE_DOXYGEN 1
+#cmakedefine ENABLE_INTERNAL_DOCS 1
+#cmakedefine VALGRIND_TESTS 1
+#cmakedefine ENABLE_CDMREMOTE 1
+#cmakedefine USE_HDF5 1
+#cmakedefine ENABLE_FILEINFO 1
+#cmakedefine TEST_PARALLEL ${TEST_PARALLEL}
+#cmakedefine BUILD_RPC 1
+#cmakedefine USE_X_GETOPT 1
+#cmakedefine ENABLE_EXTREME_NUMBERS 1
+
+/* do not build the netCDF version 2 API */
+#cmakedefine NO_NETCDF_2 1
+
+/* no stdlib.h */
+#cmakedefine NO_STDLIB_H 1
+
+/* no sys_types.h */
+#cmakedefine NO_SYS_TYPES_H 1
+
+/* Name of package */
+#define PACKAGE "netcdf"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "support-netcdf at unidata.ucar.edu"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "netCDF"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "netCDF ${netCDF_VERSION}"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "netcdf"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#cmakedefine PACKAGE_VERSION "${netCDF_VERSION}"
+
+/* The size of `ulonglong` as computed by sizeof. */
+#cmakedefine SIZEOF_ULONGLONG @SIZEOF_ULONGLONG@
+
+/* The size of `longlong` as computed by sizeof. */
+#cmakedefine SIZEOF_LONGLONG @SIZEOF_LONGLONG@
 
-/* The size of `void*` as computed by sizeof. */
-#cmakedefine SIZEOF_VOIDSTAR @SIZEOF_VOIDSTAR@
 /* The size of `char` as computed by sizeof. */
 #cmakedefine SIZEOF_CHAR @SIZEOF_CHAR@
-/* The size of `double` as computed by sizeof. */
-#cmakedefine SIZEOF_DOUBLE @SIZEOF_DOUBLE@
-/* The size of `float` as computed by sizeof. */
-#cmakedefine SIZEOF_FLOAT @SIZEOF_FLOAT@
-/* The size of `int` as computed by sizeof. */
-#cmakedefine SIZEOF_INT @SIZEOF_INT@
-/* The size of `long` as computed by sizeof. */
-#cmakedefine SIZEOF_LONG @SIZEOF_LONG@
-/* The size of `long long` as computed by sizeof. */
-#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@
-/* The size of `off_t` as computed by sizeof. */
-#cmakedefine SIZEOF_OFF_T @SIZEOF_OFF_T@
-/* The size of `short` as computed by sizeof. */
-#cmakedefine SIZEOF_OFF64_T @SIZEOF_OFF64_T@
-#cmakedefine SIZEOF_SHORT @SIZEOF_SHORT@
-/* The size of `size_t` as computed by sizeof. */
-#cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@
-/* The size of `ssize_t` as computed by sizeof. */
-#cmakedefine SIZEOF_SSIZE_T @SIZEOF_SSIZE_T@
+
 /* The size of `uchar` as computed by sizeof. */
 #cmakedefine SIZEOF_UCHAR @SIZEOF_UCHAR@
+
+/* The size of `ssize_t` as computed by sizeof. */
+#cmakedefine SIZEOF_SSIZE_T @SIZEOF_SSIZE_T@
+
 /* The size of `__int64` found on Windows systems. */
-#cmakedefine SIZEOF___INT64 @SIZEOF___INT64@
+#cmakedefine SIZEOF___INT64 ${SIZEOF___INT64}
 
+/* The size of `void*` as computed by sizeof. */
+#cmakedefine SIZEOF_VOIDSTAR ${SIZEOF_VOIDSTAR}
 
+/* The size of `short` as computed by sizeof. */
+#cmakedefine SIZEOF_OFF64_T ${SIZEOF_OFF64_T}
 
-#cmakedefine TEMP_LARGE "@TEMP_LARGE@"
+/* The size of `double', as computed by sizeof. */
+#cmakedefine SIZEOF_DOUBLE ${SIZEOF_DOUBLE}
 
-/* Set if we have strdup */
-#cmakedefine HAVE_STRDUP
-#cmakedefine HAVE_STRNDUP
-#cmakedefine HAVE_STRLCAT
-#cmakedefine HAVE_STRERROR
-#cmakedefine HAVE_SNPRINTF
-#cmakedefine HAVE_STRCHR
-#cmakedefine HAVE_STRRCHR
-#cmakedefine HAVE_STRCAT
-#cmakedefine HAVE_STRCPY
-#cmakedefine HAVE_STRDUP
-#cmakedefine HAVE_STRCASECMP
-#cmakedefine HAVE_STRTOD
-#cmakedefine HAVE_STRTOLL
-#cmakedefine HAVE_STROULL
-#cmakedefine HAVE_STRSTR
-#cmakedefine HAVE_MKSTEMP
-#cmakedefine HAVE_RAND
-#cmakedefine HAVE_RANDOM
-#cmakedefine HAVE_GETTIMEOFDAY
-#cmakedefine HAVE_MPI_COMM_F2C
-#cmakedefine HAVE_MEMMOVE
-#cmakedefine HAVE_MMAP
-#cmakedefine HAVE_GETPAGESIZE
-#cmakedefine HAVE_SYSCONF
-#cmakedefine HAVE_MREMAP
-#cmakedefine HAVE_DECL_ISINF
-
-#cmakedefine HAVE_GETRLIMIT
-#cmakedefine HAVE_FSYNC
+/* The size of `float', as computed by sizeof. */
+#cmakedefine SIZEOF_FLOAT ${SIZEOF_FLOAT}
 
-#cmakedefine HAVE_H5PGET_FAPL_MPIPOSIX 1
-#cmakedefine HAVE_H5PSET_DEFLATE
-#cmakedefine HAVE_H5Z_SZIP
+/* The size of `int', as computed by sizeof. */
+#cmakedefine SIZEOF_INT ${SIZEOF_INT}
 
+/* The size of `long', as computed by sizeof. */
+#cmakedefine SIZEOF_LONG ${SIZEOF_LONG}
 
-/* Specifies if various libraries are present. */
-#cmakedefine HAVE_LIBM 1
+/* The size of `long long', as computed by sizeof. */
+#cmakedefine SIZEOF_LONG_LONG ${SIZEOF_LONG_LONG}
 
-/* Define to 1 if the system has the type `uchar'.*/
-#cmakedefine HAVE_UCHAR
+/* The size of `off_t', as computed by sizeof. */
+#cmakedefine SIZEOF_OFF_T ${SIZEOF_OFF_T}
 
-/* Misc defines copied from autotools config.h.in */
-#cmakedefine CRAY_STACKSEG_END
-#cmakedefine DLL_EXPORT
-#cmakedefine DLL_NETCDF
+/* The size of `ptrdiff_t', as computed by sizeof. */
+#cmakedefine SIZEOF_PTRDIFF_T ${SIZEOF_PTRDIFF_T}
+
+/* The size of `short', as computed by sizeof. */
+#cmakedefine SIZEOF_SHORT ${SIZEOF_SHORT}
+
+/* The size of `size_t', as computed by sizeof. */
+#cmakedefine SIZEOF_SIZE_T ${SIZEOF_SIZE_T}
+
+/* The size of `uint', as computed by sizeof. */
+#cmakedefine SIZEOF_UINT ${SIZEOF_UINT}
+
+/* The size of `unsigned int', as computed by sizeof. */
+#cmakedefine SIZEOF_UNSIGNED_INT ${SIZEOF_UNSIGNED_INT}
+
+/* The size of `unsigned long long', as computed by sizeof. */
+#cmakedefine SIZEOF_UNSIGNED_LONG_LONG ${SIZEOF_UNSIGNED_LONG_LONG}
+
+/* The size of `unsigned short int', as computed by sizeof. */
+#cmakedefine SIZEOF_UNSIGNED_SHORT_INT ${SIZEOF_UNSIGNED_SHORT_INT}
+
+/* The size of `ushort', as computed by sizeof. */
+#cmakedefine SIZEOF_USHORT ${SIZEOF_USHORT}
+
+/* The size of `void*', as computed by sizeof. */
+#cmakedefine SIZEOF_VOIDP ${SIZEOF_VOIDP}
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+	STACK_DIRECTION > 0 => grows toward higher addresses
+	STACK_DIRECTION < 0 => grows toward lower addresses
+	STACK_DIRECTION = 0 => direction of growth unknown */
+#cmakedefine STACK_DIRECTION ${STACK_DIRECTION}
+
+/* Define to 1 if you have the ANSI C header files. */
+#cmakedefine STDC_HEADERS 1
+
+/* Place to put very large netCDF test files. */
+#cmakedefine TEMP_LARGE "${TEMP_LARGE}"
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#cmakedefine TIME_WITH_SYS_TIME 1
+
+/* if true, build DAP Client */
+#cmakedefine USE_DAP 1
+
+/* if true, include NC_DISKLESS code */
+#cmakedefine USE_DISKLESS 1
+
+/* set this to use extreme numbers in tests */
+#cmakedefine USE_EXTREME_NUMBERS 1
+
+/* if true, use ffio instead of posixio */
+#cmakedefine USE_FFIO 1
+
+/* if true, include experimental fsync code */
+#cmakedefine USE_FSYNC 1
+
+/* if true, use HDF4 too */
+#cmakedefine USE_HDF4 1
+
+/* If true, use use wget to fetch some sample HDF4 data, and then test against
+   it. */
+//#cmakedefine USE_HDF4_FILE_TESTS 1
+
+/* if true, enable dynamic loading support */
+#cmakedefine USE_LIBDL 1
+
+/* if true, use mmap for in-memory files */
+#cmakedefine USE_MMAP 1
+
+/* if true, build netCDF-4 */
+#cmakedefine USE_NETCDF4 1
+
+/* build the netCDF version 2 API */
+#cmakedefine USE_NETCDF_2 1
+
+/* if true, pnetcdf or parallel netcdf-4 is in use */
+#cmakedefine USE_PARALLEL 1
+
+/* if true, parallel netcdf-4 is in use */
+#cmakedefine USE_PARALLEL4 1
+
+/* if true, compile in parallel netCDF-4 based on MPI/IO */
+#cmakedefine USE_PARALLEL_MPIO 1
+
+/* if true, compile in parallel netCDF-4 based on MPI/POSIX */
+#cmakedefine USE_PARALLEL_POSIX 1
+
+/* if true, parallel netCDF is used */
+#cmakedefine USE_PNETCDF 1
+
+/* if true, use stdio instead of posixio */
+#cmakedefine USE_STDIO 1
+
+/* if true, compile in szip compression in netCDF-4 variables */
+#cmakedefine USE_SZIP 1
+
+/* if true, compile in zlib compression in netCDF-4 variables */
+#cmakedefine USE_ZLIB 1
+
+/* Version number of package */
+#cmakedefine VERSION "${netCDF_VERSION}"
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#cmakedefine WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Define for large files, on AIX-style hosts. */
+#cmakedefine _LARGE_FILES ${_LARGE_FILES}
+
+/* Define to 1 if type `char' is unsigned and you are not using gcc.  */
+#ifndef __CHAR_UNSIGNED__
+#cmakedefine  __CHAR_UNSIGNED__
+#endif
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#cmakedefine off_t long int
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#cmakedefine size_t unsigned int
+
+/* Define strcasecmp, snprintf on Win32 systems. */
+#ifdef _WIN32
+    #ifndef HAVE_STRCASECMP
+	 #define strcasecmp _stricmp
+    #endif
+
+    #ifndef HAVE_SNPRINTF
+	 #define snprintf _snprintf
+    #endif
+#endif
+
+#cmakedefine WORDS_BIGENDIAN
+
+#include "ncconfigure.h"
 
-#include <ncconfigure.h>
 #endif
diff --git a/config.h.cmake.in.old-works b/config.h.cmake.in.old-works
new file mode 100644
index 0000000..2af9778
--- /dev/null
+++ b/config.h.cmake.in.old-works
@@ -0,0 +1,316 @@
+#ifndef CONFIG_H
+#define CONFIG_H
+
+/* Eliminate a number of warnings which come up based on deprecated
+   POSIX naming conventions. */
+#ifdef _MSC_VER
+
+#if _MSC_VER>=1900
+  #define STDC99
+#endif
+/* Define O_BINARY so that the appropriate flags
+are set when opening a binary file on Windows. */
+
+/* Disable a few warnings under Visual Studio, for the
+   time being. */
+  #include <io.h>
+  #pragma warning( disable: 4018 4996 4244 4305 )
+  #define unlink _unlink
+  #define open _open
+  #define close _close
+  #define read _read
+  #define lseek _lseeki64
+
+  #define fstat _fstat64
+
+  #define off_t __int64
+  #define _off_t __int64
+
+  #ifndef _OFF_T_DEFINED
+  #define _OFF_T_DEFINED
+  #endif
+
+#ifdef _WIN32
+  #ifndef strcasecmp
+    #define strcasecmp _stricmp
+  #endif
+
+  #ifndef snprintf
+    #if _MSC_VER<1900
+      #define snprintf _snprintf
+    #endif
+  #endif
+#endif
+
+
+  #define strdup _strdup
+  #define fdopen _fdopen
+  #define write _write
+  #define strtoll _strtoi64
+#endif
+
+
+/* Cache Size, other variables for HDF5 */
+#define DEFAULT_CHUNK_SIZE	${DEFAULT_CHUNK_SIZE}
+#define DEFAULT_CHUNKS_IN_CACHE	${DEFAULT_CHUNKS_IN_CACHE}
+#define CHUNK_CACHE_SIZE 	${CHUNK_CACHE_SIZE}
+#define CHUNK_CACHE_NELEMS 	${CHUNK_CACHE_NELEMS}
+#define CHUNK_CACHE_PREEMPTION 	${CHUNK_CACHE_PREEMPTION}
+#define MAX_DEFAULT_CACHE_SIZE	${MAX_DEFAULT_CACHE_SIZE}
+#define NCIO_MINBLOCKSIZE	${NCIO_MINBLOCKSIZE}
+
+#ifndef _FILE_OFFSET_BITS
+#cmakedefine _FILE_OFFSET_BITS ${_FILE_OFFSET_BITS}
+#cmakedefine _LARGEFILE64_SOURCE
+#cmakedefine _LARGEFILE_SOURCE
+#endif
+
+#define PACKAGE_VERSION "${VERSION}"
+#cmakedefine VERSION "${VERSION}"
+#cmakedefine NC_VERSION "${VERSION}"
+/* For HDF5 use. */
+#cmakedefine H5_USE_16_API 1
+
+#cmakedefine HAVE_USHORT 1
+#cmakedefine SIZEOF_USHORT @SIZEOF_USHORT@
+#cmakedefine SIZEOF_UNSIGNED_SHORT_INT @SIZEOF_UNSIGNED_SHORT_INT@
+/* Enable Logging, only valid for netcdf 4. */
+#cmakedefine LOGGING 1
+
+/* Various other options. */
+#cmakedefine BUILD_V2 1
+#cmakedefine NO_NETCDF_2 1
+#cmakedefine USE_FSYNC 1
+#cmakedefine JNA 1
+#cmakedefine ENABLE_DOXYGEN 1
+#cmakedefine ENABLE_INTERNAL_DOCS 1
+#cmakedefine VALGRIND_TESTS 1
+#cmakedefine ENABLE_CDMREMOTE 1
+#cmakedefine USE_DAP 1
+#cmakedefine ENABLE_DAP 1
+#cmakedefine ENABLE_DAP_GROUPS 1
+#cmakedefine ENABLE_DAP_REMOTE_TESTS 1
+#cmakedefine EXTRA_TESTS
+#cmakedefine USE_NETCDF4 1
+#cmakedefine USE_LIBDL 1
+#cmakedefine USE_HDF4 1
+#cmakedefine USE_HDF5 1
+#cmakedefine USE_FFIO 1
+#cmakedefine USE_PARALLEL_POSIX 1
+#cmakedefine USE_PARALLEL_MPIO 1
+#cmakedefine HDF5_HAS_H5FREE 1
+#cmakedefine HDF5_HAS_LIBVER_BOUNDS 1
+#cmakedefine HDF5_PARALLEL 1
+#cmakedefine USE_PARALLEL 1
+#cmakedefine USE_PARALLEL4 1
+#cmakedefine USE_PNETCDF 1
+#cmakedefine USE_MMAP 1
+#cmakedefine ENABLE_FILEINFO 1
+#cmakedefine TEST_PARALLEL ${TEST_PARALLEL}
+#cmakedefine BUILD_RPC 1
+#cmakedefine USE_DISKLESS 1
+#cmakedefine USE_SZIP 1
+#cmakedefine USE_ZLIB 1
+#cmakedefine USE_X_GETOPT 1
+#cmakedefine ENABLE_EXTREME_NUMBERS
+#cmakedefine LARGE_FILE_TESTS 1
+#cmakedefine HAVE_DECL_ISFINITE 1
+#cmakedefine HAVE_DECL_ISNAN 1
+#cmakedefine HAVE_CURLOPT_USERNAME 1
+#cmakedefine HAVE_CURLOPT_PASSWORD 1
+#cmakedefine HAVE_CURLOPT_KEYPASSWD 1
+#cmakedefine HAVE_CURLINFO_RESPONSE_CODE 1
+#cmakedefine HAVE_CURLOPT_CHUNK_BGN_FUNCTION 1
+#cmakedefine HAVE_DECL_SIGNBIT 1
+#cmakedefine HAVE_DOPRNT
+#cmakedefine HAVE_ALLOCA
+#cmakedefine HAVE_SSIZE_T 1
+#cmakedefine HAVE_LIBPNETCDF 1
+#cmakedefine HAVE_LIBDL 1
+
+/* Define to 1 if you have the <alloca.h> header file. */
+#cmakedefine HAVE_ALLOCA_H @HAVE_ALLOCA_H@
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#cmakedefine HAVE_CTYPE_H @HAVE_CTYPE_H@
+
+/* Define to 1 if you have the <dirent> header file. */
+#cmakedefine HAVE_DIRENT_H @HAVE_DIRENT_H@
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H @HAVE_UNISTD_H@
+#cmakedefine YY_NO_UNISTD_H @YY_NO_UNISTD_H@
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#cmakedefine HAVE_DLFCN_H @HAVE_DLFCN_H@
+
+/* Define to 1 if you have the <errno.h> header file. */
+#cmakedefine HAVE_ERRNO_H @HAVE_ERRNO_H@
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#cmakedefine HAVE_FCNTL_H @HAVE_FCNTL_H@
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#cmakedefine HAVE_GETOPT_H @HAVE_GETOPT_H@
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#cmakedefine HAVE_STDARG_H @HAVE_STDARG_H@
+
+/* Define to 1 if you have the <hdf5.h> header file. */
+#cmakedefine HAVE_HDF5_H @HAVE_HDF5_H@
+
+/* Define to 1 if you have the <hdf5_hl.h> header file. */
+#cmakedefine HAVE_HDF5_HL_H @HAVE_HDF5_HL_H@
+
+/* Define to 1 if you have the <stdbool.h> header file. */
+#cmakedefine HAVE_STDBOOL_H @HAVE_STDBOOL_H@
+
+/* Define to 1 if you have the <locale.h> header file. */
+#cmakedefine HAVE_LOCAL_H @HAVE_LOCAL_H@
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#cmakedefine HAVE_STDINT_H @HAVE_STDINT_H@
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#cmakedefine HAVE_STDIO_H @HAVE_STDIO_H@
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#cmakedefine HAVE_STDLIB_H @HAVE_STDLIB_H@
+
+/* Define to 1 if you have the <strings.h> header file. */
+#cmakedefine HAVE_STRINGS_H @HAVE_STRINGS_H@
+
+/* Define to 1 if you have the <signal.h> header file. */
+#cmakedefine HAVE_SIGNAL_H @HAVE_SIGNAL_H@
+
+/* Define to 1 if you have the <sys/dir.h> header file. */
+#cmakedefine HAVE_SYS_DIR_H @HAVE_SYS_DIR_H@
+
+/* Define to 1 if you have the <sys/ndir.h> header file. */
+#cmakedefine HAVE_SYS_NDIR_H @HAVE_SYS_NDIR_H@
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#cmakedefine HAVE_SYS_PARAM_H @HAVE_SYS_PARAM_H@
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#cmakedefine HAVE_SYS_STAT_H @HAVE_SYS_STAT_H@
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#cmakedefine HAVE_SYS_TIME_H @HAVE_SYS_TIME_H@
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#cmakedefine HAVE_SYS_RESOURCE_H @HAVE_SYS_RESOURCE_H@
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine HAVE_SYS_TYPES_H @HAVE_SYS_TYPES_H@
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#cmakedefine HAVE_SYS_WAIT_H @HAVE_SYS_WAIT_H@
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#cmakedefine HAVE_INTTYPES_H @HAVE_INTTYPES_H@
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#cmakedefine HAVE_FCNTL_H @HAVE_FCNTL_H@
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#cmakedefine HAVE_MALLOC_H @HAVE_MALLOC_H@
+
+/* Define to 1 if you have the BaseTsd.h header file. */
+#cmakedefine HAVE_BASETSD_H @HAVE_BASETSD_H@
+
+/* Define if we have filelengthi64. */
+#cmakedefine HAVE_FILE_LENGTH_I64 @HAVE_FILE_LENGTH_I64@
+
+#cmakedefine SIZEOF_UINT @SIZEOF_UINT@
+#cmakedefine SIZEOF_UNSIGNED_INT @SIZEOF_UNSIGNED_INT@
+
+#cmakedefine SIZEOF_ULONGLONG @SIZEOF_ULONGLONG@
+#cmakedefine SIZEOF_UNSIGNED_LONG_LONG @SIZEOF_UNSIGNED_LONG_LONG@
+
+/* Define whether char is signed by default. */
+#ifndef __CHAR_UNSIGNED__
+#cmakedefine __CHAR_UNSIGNED__
+#endif
+
+/* The size of `void*` as computed by sizeof. */
+#cmakedefine SIZEOF_VOIDSTAR @SIZEOF_VOIDSTAR@
+/* The size of `char` as computed by sizeof. */
+#cmakedefine SIZEOF_CHAR @SIZEOF_CHAR@
+/* The size of `double` as computed by sizeof. */
+#cmakedefine SIZEOF_DOUBLE @SIZEOF_DOUBLE@
+/* The size of `float` as computed by sizeof. */
+#cmakedefine SIZEOF_FLOAT @SIZEOF_FLOAT@
+/* The size of `int` as computed by sizeof. */
+#cmakedefine SIZEOF_INT @SIZEOF_INT@
+/* The size of `long` as computed by sizeof. */
+#cmakedefine SIZEOF_LONG @SIZEOF_LONG@
+/* The size of `long long` as computed by sizeof. */
+#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@
+/* The size of `off_t` as computed by sizeof. */
+#cmakedefine SIZEOF_OFF_T @SIZEOF_OFF_T@
+/* The size of `short` as computed by sizeof. */
+#cmakedefine SIZEOF_OFF64_T @SIZEOF_OFF64_T@
+#cmakedefine SIZEOF_SHORT @SIZEOF_SHORT@
+/* The size of `size_t` as computed by sizeof. */
+#cmakedefine SIZEOF_SIZE_T @SIZEOF_SIZE_T@
+/* The size of `ssize_t` as computed by sizeof. */
+#cmakedefine SIZEOF_SSIZE_T @SIZEOF_SSIZE_T@
+/* The size of `uchar` as computed by sizeof. */
+#cmakedefine SIZEOF_UCHAR @SIZEOF_UCHAR@
+/* The size of `__int64` found on Windows systems. */
+#cmakedefine SIZEOF___INT64 @SIZEOF___INT64@
+
+
+
+#cmakedefine TEMP_LARGE "@TEMP_LARGE@"
+
+/* Set if we have strdup */
+#cmakedefine HAVE_STRDUP
+#cmakedefine HAVE_STRNDUP
+#cmakedefine HAVE_STRLCAT
+#cmakedefine HAVE_STRERROR
+#cmakedefine HAVE_SNPRINTF
+#cmakedefine HAVE_STRCHR
+#cmakedefine HAVE_STRRCHR
+#cmakedefine HAVE_STRCAT
+#cmakedefine HAVE_STRCPY
+#cmakedefine HAVE_STRDUP
+#cmakedefine HAVE_STRCASECMP
+#cmakedefine HAVE_STRTOD
+#cmakedefine HAVE_STRTOLL
+#cmakedefine HAVE_STROULL
+#cmakedefine HAVE_STRSTR
+#cmakedefine HAVE_MKSTEMP
+#cmakedefine HAVE_RAND
+#cmakedefine HAVE_RANDOM
+#cmakedefine HAVE_GETTIMEOFDAY
+#cmakedefine HAVE_MPI_COMM_F2C
+#cmakedefine HAVE_MEMMOVE
+#cmakedefine HAVE_MMAP
+#cmakedefine HAVE_GETPAGESIZE
+#cmakedefine HAVE_SYSCONF
+#cmakedefine HAVE_MREMAP
+#cmakedefine HAVE_DECL_ISINF 1
+
+#cmakedefine HAVE_GETRLIMIT
+#cmakedefine HAVE_FSYNC
+
+#cmakedefine HAVE_H5PGET_FAPL_MPIPOSIX 1
+#cmakedefine HAVE_H5PSET_DEFLATE
+#cmakedefine HAVE_H5Z_SZIP
+
+
+/* Specifies if various libraries are present. */
+#cmakedefine HAVE_LIBM 1
+
+/* Define to 1 if the system has the type `uchar'.*/
+#cmakedefine HAVE_UCHAR
+
+/* Misc defines copied from autotools config.h.in */
+#cmakedefine CRAY_STACKSEG_END
+#cmakedefine DLL_EXPORT
+#cmakedefine DLL_NETCDF
+
+#include <ncconfigure.h>
+#endif
diff --git a/config.h.in b/config.h.in
index 5b88c28..cf4299c 100644
--- a/config.h.in
+++ b/config.h.in
@@ -38,6 +38,9 @@
 /* if true, build DAP Client */
 #undef ENABLE_DAP
 
+/* if true, build DAP4 Client */
+#undef ENABLE_DAP4
+
 /* if true, enable DAP group names */
 #undef ENABLE_DAP_GROUPS
 
@@ -131,9 +134,15 @@
 /* Define to 1 if you have the `H5Pget_fapl_mpiposix' function. */
 #undef HAVE_H5PGET_FAPL_MPIPOSIX
 
+/* Define to 1 if you have the `H5Pset_all_coll_metadata_ops' function. */
+#undef HAVE_H5PSET_ALL_COLL_METADATA_OPS
+
 /* Define to 1 if you have the `H5Pset_deflate' function. */
 #undef HAVE_H5PSET_DEFLATE
 
+/* Define to 1 if you have the `H5Pset_libver_bounds' function. */
+#undef HAVE_H5PSET_LIBVER_BOUNDS
+
 /* Define to 1 if you have the `H5Z_SZIP' function. */
 #undef HAVE_H5Z_SZIP
 
@@ -320,8 +329,8 @@
 /* Define to 1 if the system has the type `uint'. */
 #undef HAVE_UINT
 
-/* Define to 1 if the system has the type `uint64'. */
-#undef HAVE_UINT64
+/* Define to 1 if the system has the type `uint64 off_t'. */
+#undef HAVE_UINT64_OFF_T
 
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
@@ -338,6 +347,9 @@
 /* Define to 1 if the system has the type `_Bool'. */
 #undef HAVE__BOOL
 
+/* if true, use collective metadata ops in parallel netCDF-4 */
+#undef HDF5_HAS_COLL_METADATA_OPS
+
 /* if true, H5free_memory() will be used to free hdf5-allocated memory in
    nc4file. */
 #undef HDF5_HAS_H5FREE
@@ -399,6 +411,12 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* if true, NC_EINVALCOORDS check is more relaxed */
+#undef RELAX_COORD_BOUND
+
+/* the testservers for remote tests. */
+#undef REMOTETESTSERVERS
+
 /* The size of `double', as computed by sizeof. */
 #undef SIZEOF_DOUBLE
 
@@ -426,9 +444,18 @@
 /* The size of `size_t', as computed by sizeof. */
 #undef SIZEOF_SIZE_T
 
+/* The size of `ssize_t', as computed by sizeof. */
+#undef SIZEOF_SSIZE_T
+
+/* The size of `uchar', as computed by sizeof. */
+#undef SIZEOF_UCHAR
+
 /* The size of `uint', as computed by sizeof. */
 #undef SIZEOF_UINT
 
+/* The size of `unsigned char', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_CHAR
+
 /* The size of `unsigned int', as computed by sizeof. */
 #undef SIZEOF_UNSIGNED_INT
 
@@ -441,6 +468,9 @@
 /* The size of `ushort', as computed by sizeof. */
 #undef SIZEOF_USHORT
 
+/* The size of `void*', as computed by sizeof. */
+#undef SIZEOF_VOIDP
+
 /* If using the C implementation of alloca, define if you know the
    direction of stack growth for your system; otherwise it will be
    automatically deduced at runtime.
diff --git a/configure b/configure
index eeed273..e718b1f 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
 # From configure.ac Id: configure.ac,v 1.450 2010/05/28 19:42:47 dmh Exp .
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for netCDF 4.4.1.1.
+# Generated by GNU Autoconf 2.69 for netCDF 4.5.0-rc1.
 #
 # Report bugs to <support-netcdf at unidata.ucar.edu>.
 #
@@ -591,8 +591,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='netCDF'
 PACKAGE_TARNAME='netcdf'
-PACKAGE_VERSION='4.4.1.1'
-PACKAGE_STRING='netCDF 4.4.1.1'
+PACKAGE_VERSION='4.5.0-rc1'
+PACKAGE_STRING='netCDF 4.5.0-rc1'
 PACKAGE_BUGREPORT='support-netcdf at unidata.ucar.edu'
 PACKAGE_URL=''
 
@@ -644,6 +644,7 @@ NC_HAS_PNETCDF
 NC_HAS_JNA
 NC_HAS_MMAP
 NC_HAS_DISKLESS
+NC_HAS_DAP4
 NC_HAS_DAP
 NC_HAS_SZIP
 NC_HAS_HDF5
@@ -657,6 +658,7 @@ AM_CPPFLAGS
 AM_CFLAGS
 enable_static
 enable_shared
+RELAX_COORD_BOUND
 HAS_JNA
 HAS_MMAP
 HAS_DISKLESS
@@ -669,6 +671,7 @@ HAS_PNETCDF
 HAS_HDF4
 HAS_NC4
 HAS_NC2
+HAS_DAP4
 HAS_DAP
 NC_LIBS
 BINFILE_NAME
@@ -708,6 +711,10 @@ ENABLE_DAP_AUTH_TESTS_FALSE
 ENABLE_DAP_AUTH_TESTS_TRUE
 ENABLE_DAP_REMOTE_TESTS_FALSE
 ENABLE_DAP_REMOTE_TESTS_TRUE
+ENABLE_DAP4_FALSE
+ENABLE_DAP4_TRUE
+ENABLE_DAP_FALSE
+ENABLE_DAP_TRUE
 USE_DAP_FALSE
 USE_DAP_TRUE
 BUILD_DAP_FALSE
@@ -716,6 +723,9 @@ TEST_PARALLEL4_FALSE
 TEST_PARALLEL4_TRUE
 BUILD_PARALLEL_FALSE
 BUILD_PARALLEL_TRUE
+M4FLAGS
+ISCYGWIN_FALSE
+ISCYGWIN_TRUE
 ALLOCA
 HAVE_DOT
 DOT
@@ -920,6 +930,7 @@ enable_dependency_tracking
 enable_dap_remote_tests
 enable_dap_auth_tests
 enable_dap_groups
+with_testservers
 enable_dap_long_tests
 enable_extra_tests
 enable_ffio
@@ -945,6 +956,8 @@ enable_diskless
 enable_mmap
 enable_parallel4
 enable_pnetcdf
+enable_erange_fill
+enable_zero_length_coord_bound
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1496,7 +1509,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures netCDF 4.4.1.1 to adapt to many kinds of systems.
+\`configure' configures netCDF 4.5.0-rc1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1567,7 +1580,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of netCDF 4.4.1.1:";;
+     short | recursive ) echo "Configuration of netCDF 4.5.0-rc1:";;
    esac
   cat <<\_ACEOF
 
@@ -1630,7 +1643,7 @@ Optional Features:
   --disable-dap-remote-tests
                           disable dap remote tests
   --enable-dap-auth-tests enable dap remote authorization tests
-  --disable-dap-groups    disable [netcdf4] dap group names
+  --disable-dap-groups    disable [netcdf4] DAP2 group names
   --enable-dap-long-tests enable dap long tests
   --enable-extra-tests    enable some extra tests that may not pass because of
                           known issues
@@ -1666,6 +1679,14 @@ Optional Features:
   --disable-parallel4     disable parallel I/O for netcdf-4, even if it's
                           enabled in libhdf5
   --enable-pnetcdf        build with parallel I/O for classic files
+  --enable-erange-fill    Enable use of fill value when out-of-range type
+                          conversion causes NC_ERANGE error. [default:
+                          disabled]
+  --enable-zero-length-coord-bound
+                          Enable a more relaxed boundary error check
+                          NC_EINVALCOORDS to allow coordinate start argument
+                          equal to dimension size when argument count is zero.
+                          [default: disabled]
   --enable-jna            enable jna bug fix
 
 Optional Packages:
@@ -1693,6 +1714,8 @@ Optional Packages:
                           Specify default file chunk cache preemption policy
                           for HDF5 files (a number between 0 and 1,
                           inclusive).
+  --with-testservers=<host+port>,<host+port>...
+                          Specify the testserver(s) to try for remote tests.
   --with-temp-large=<directory>
                           specify directory where large files (i.e. >2 GB)
                           will be written, if large files tests are run with
@@ -1784,7 +1807,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-netCDF configure 4.4.1.1
+netCDF configure 4.5.0-rc1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2493,7 +2516,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by netCDF $as_me 4.4.1.1, which was
+It was created by netCDF $as_me 4.5.0-rc1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2853,9 +2876,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 : ${CFLAGS=""}
 
  NC_VERSION_MAJOR=4
- NC_VERSION_MINOR=4
- NC_VERSION_PATCH=1
- NC_VERSION_NOTE=".1"
+ NC_VERSION_MINOR=5
+ NC_VERSION_PATCH=0
+ NC_VERSION_NOTE="-rc1"
 
 #####
 # Set some variables used to generate a libnetcdf.settings file,
@@ -2864,11 +2887,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 # Create the VERSION file, which contains the package version from
 # AC_INIT.
-echo 4.4.1.1>VERSION
+echo 4.5.0-rc1>VERSION
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: netCDF 4.4.1.1" >&5
-$as_echo "$as_me: netCDF 4.4.1.1" >&6;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: netCDF 4.5.0-rc1" >&5
+$as_echo "$as_me: netCDF 4.5.0-rc1" >&6;}
 
 # Keep libtool macros in an m4 directory.
 
@@ -3041,6 +3064,11 @@ ac_config_links="$ac_config_links nc_test4/ref_hdf5_compat2.nc:nc_test4/ref_hdf5
 ac_config_links="$ac_config_links nc_test4/ref_hdf5_compat3.nc:nc_test4/ref_hdf5_compat3.nc"
 
 
+ac_config_links="$ac_config_links nc_test4/ref_chunked.hdf4:nc_test4/ref_chunked.hdf4"
+
+ac_config_links="$ac_config_links nc_test4/ref_contiguous.hdf4:nc_test4/ref_contiguous.hdf4"
+
+
 # This call is required by automake.
 am__api_version='1.15'
 
@@ -3528,7 +3556,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='netcdf'
- VERSION='4.4.1.1'
+ VERSION='4.5.0-rc1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -4077,9 +4105,9 @@ test "x$enable_logging" = xyes || enable_logging=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_logging" >&5
 $as_echo "$enable_logging" >&6; }
 
-## Capture the state of the --enable-dap flag
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether DAP client is to be built" >&5
-$as_echo_n "checking whether DAP client is to be built... " >&6; }
+## Capture the state of the --enable-dap flag => enable dap2+dap4
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether DAP client(s) are to be built" >&5
+$as_echo_n "checking whether DAP client(s) are to be built... " >&6; }
 # Check whether --enable-dap was given.
 if test "${enable_dap+set}" = set; then :
   enableval=$enable_dap;
@@ -4089,6 +4117,9 @@ test "x$enable_dap" = xno || enable_dap=yes
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_dap" >&5
 $as_echo "$enable_dap" >&6; }
 
+# --enable-dap => enable-dap4
+enable_dap4=$enable_dap
+
 # Curl support is required if and only if any of these flags are set:
 # 1. --enable-dap
 
@@ -5291,27 +5322,51 @@ fi
 $as_echo "$enable_dap_auth_tests" >&6; }
 
 # Control if groups are supported in [netcdf4]dap2 code
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether netcdf4 group names should be enabled (default on)" >&5
-$as_echo_n "checking whether netcdf4 group names should be enabled (default on)... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether netcdf4 group names for DAP2 hould be enabled (default on)" >&5
+$as_echo_n "checking whether netcdf4 group names for DAP2 hould be enabled (default on)... " >&6; }
 # Check whether --enable-dap-groups was given.
 if test "${enable_dap_groups+set}" = set; then :
   enableval=$enable_dap_groups;
 fi
 
-test "x$enable_groups" = xno || enable_dap_groups=yes
-if test "x$enable_dap" = "xno" -o "x$enable_enable_netcdf_4" = "xno" ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: dap groups disabled because dap disabled or netcdf-4 disabled" >&5
-$as_echo "$as_me: dap groups disabled because dap disabled or netcdf-4 disabled" >&6;}
-  enable_dap_groups=no
-fi
+test "x$enable_dap_groups" = xno || enable_dap_groups=yes
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_dap_groups" >&5
 $as_echo "$enable_dap_groups" >&6; }
+if test "x$enable_dap" = "xno" ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: DAP2 groups is being disabled because DAP2 support is  disabled or netcdf-4 disabled" >&5
+$as_echo "$as_me: DAP2 groups is being disabled because DAP2 support is  disabled or netcdf-4 disabled" >&6;}
+  enable_dap_groups=no
+fi
 if test "x$enable_dap_groups" = xyes; then
 
 $as_echo "#define ENABLE_DAP_GROUPS 1" >>confdefs.h
 
 fi
 
+# Did the user specify a list of test servers to try for remote tests?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which remote test server(s) to use" >&5
+$as_echo_n "checking which remote test server(s) to use... " >&6; }
+
+# Check whether --with-testservers was given.
+if test "${with_testservers+set}" = set; then :
+  withval=$with_testservers; REMOTETESTSERVERS=$with_testservers
+else
+  REMOTETESTSERVERS=no
+fi
+
+msg="$REMOTETESTSERVERS"
+if test "x$REMOTETESTSERVERS" = xno ; then
+  msg="remotetest.unidata.ucar.edu,jetstream.unidata.ucar.edu (defaults)"
+  REMOTETESTSERVERS=remotetest.unidata.ucar.edu,jetstream.unidata.ucar.edu
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $msg" >&5
+$as_echo "$msg" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define REMOTETESTSERVERS "$REMOTETESTSERVERS"
+_ACEOF
+
+
 # Set the config.h flags
 if test "x$enable_dap" = xyes; then
 
@@ -15421,6 +15476,18 @@ $as_echo "#define NO_SYS_TYPES_H /**/" >>confdefs.h
 fi
 
 
+for ac_header in sys/dir.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/dir.h" "ac_cv_header_sys_dir_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dir_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_DIR_H 1
+_ACEOF
+
+fi
+
+done
+
 for ac_header in sys/param.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
@@ -15960,6 +16027,20 @@ if test "x$enable_dap" = "xyes" -a "xenable_diskless" = xno  ; then
 $as_echo "$as_me: --enable-dap requires --enable-diskless" >&6;}
 { $as_echo "$as_me:${as_lineno-$LINENO}: dap support disabled" >&5
 $as_echo "$as_me: dap support disabled" >&6;}
+enable_dap=no
+fi
+
+# disable dap4 if netcdf-4 is disabled
+if test "x$enable_netcdf_4" = "xno" ; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: netcdf-4 not enabled; disabling DAP4" >&5
+$as_echo "$as_me: WARNING: netcdf-4 not enabled; disabling DAP4" >&2;}
+    enable_dap4=no
+fi
+
+if test "x$enable_dap4" = xyes; then
+
+$as_echo "#define ENABLE_DAP4 1" >>confdefs.h
+
 fi
 
 # check for useful, but not essential, memio support
@@ -16533,28 +16614,6 @@ fi
 ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
 if test "x$ac_cv_type_size_t" = xyes; then :
 
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
-
-ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
-if test "x$ac_cv_type_off_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define off_t long int
-_ACEOF
-
-fi
-
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
-
 cat >>confdefs.h <<_ACEOF
 #define HAVE_SIZE_T 1
 _ACEOF
@@ -16624,13 +16683,35 @@ _ACEOF
 
 
 fi
-ac_fn_c_check_type "$LINENO" "uint64" "ac_cv_type_uint64" "$ac_includes_default"
-if test "x$ac_cv_type_uint64" = xyes; then :
+ac_fn_c_check_type "$LINENO" "uint64 off_t" "ac_cv_type_uint64_off_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint64_off_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT64_OFF_T 1
+_ACEOF
+
+
+fi
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_UINT64 1
+#define size_t unsigned int
 _ACEOF
 
+fi
+
+ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
+if test "x$ac_cv_type_off_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
 
 fi
 
@@ -16899,10 +16980,19 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
 SLEEPCMD=""
 PLTFORMOUT="$(uname | cut -d '_' -f 1)"
 if test "$PLTFORMOUT" = "CYGWIN"; then
+   ISCYGWIN=yes
    SLEEPCMD="sleep 5"
    { $as_echo "$as_me:${as_lineno-$LINENO}: Pausing between sizeof() checks to mitigate a Cygwin issue." >&5
 $as_echo "$as_me: Pausing between sizeof() checks to mitigate a Cygwin issue." >&6;}
 fi
+ if test "x$ISCYGWIN" = xyes; then
+  ISCYGWIN_TRUE=
+  ISCYGWIN_FALSE='#'
+else
+  ISCYGWIN_TRUE='#'
+  ISCYGWIN_FALSE=
+fi
+
 
 $SLEEPCMD
 # The cast to long int works around a bug in the HP C Compiler
@@ -17210,6 +17300,111 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+$SLEEPCMD
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5
+$as_echo_n "checking size of unsigned long long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_unsigned_long_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_unsigned_long_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long
+_ACEOF
+
+
+
+$SLEEPCMD
+if test "$ac_cv_type_uchar" = yes ; then
+   # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of uchar" >&5
+$as_echo_n "checking size of uchar... " >&6; }
+if ${ac_cv_sizeof_uchar+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (uchar))" "ac_cv_sizeof_uchar"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_uchar" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (uchar)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_uchar=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_uchar" >&5
+$as_echo "$ac_cv_sizeof_uchar" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UCHAR $ac_cv_sizeof_uchar
+_ACEOF
+
+
+else
+   # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned char" >&5
+$as_echo_n "checking size of unsigned char... " >&6; }
+if ${ac_cv_sizeof_unsigned_char+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned char))" "ac_cv_sizeof_unsigned_char"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_unsigned_char" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned char)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_unsigned_char=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_char" >&5
+$as_echo "$ac_cv_sizeof_unsigned_char" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_CHAR $ac_cv_sizeof_unsigned_char
+_ACEOF
+
+
+fi
 
 $SLEEPCMD
 if test "$ac_cv_type_ushort" = yes ; then
@@ -17352,42 +17547,6 @@ _ACEOF
 
 
 fi
-
-$SLEEPCMD
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5
-$as_echo_n "checking size of unsigned long long... " >&6; }
-if ${ac_cv_sizeof_unsigned_long_long+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_unsigned_long_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (unsigned long long)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_unsigned_long_long=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5
-$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long
-_ACEOF
-
-
-
 $SLEEPCMD
 if test "$ac_cv_type_ushort" = yes ; then
    # The cast to long int works around a bug in the HP C Compiler
@@ -17562,6 +17721,73 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+$SLEEPCDM
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of ssize_t" >&5
+$as_echo_n "checking size of ssize_t... " >&6; }
+if ${ac_cv_sizeof_ssize_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (ssize_t))" "ac_cv_sizeof_ssize_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_ssize_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (ssize_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_ssize_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_ssize_t" >&5
+$as_echo "$ac_cv_sizeof_ssize_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SSIZE_T $ac_cv_sizeof_ssize_t
+_ACEOF
+
+
+$SLEEPCMD
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5
+$as_echo_n "checking size of void*... " >&6; }
+if ${ac_cv_sizeof_voidp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_voidp" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (void*)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_voidp=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5
+$as_echo "$ac_cv_sizeof_voidp" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOIDP $ac_cv_sizeof_voidp
+_ACEOF
+
 
 
 if test "x$enable_netcdf_4" = xyes || test "x$enable_dap" = xyes; then
@@ -17622,7 +17848,7 @@ if test "$ac_res" != no; then :
 else
 
      as_fn_error $? "Can't find or link to the z library. Turn off netCDF-4 and \
-     opendap with --disable-netcdf-4 --disable-dap, or see config.log for errors." "$LINENO" 5
+     DAP clients with --disable-netcdf-4 --disable-dap, or see config.log for errors." "$LINENO" 5
 fi
 
 fi
@@ -17748,7 +17974,7 @@ _ACEOF
   LIBS="-ldl $LIBS"
 
 else
-  as_fn_error $? "Can't find or link against libdf. See config.log for errors." "$LINENO" 5
+  as_fn_error $? "Can't find or link against libdl. See config.log for errors." "$LINENO" 5
 fi
 
 
@@ -17889,7 +18115,7 @@ fi
 
 done
 
-   for ac_func in H5Pget_fapl_mpiposix H5Pget_fapl_mpio H5Pset_deflate H5Z_SZIP H5free_memory
+   for ac_func in H5Pget_fapl_mpiposix H5Pget_fapl_mpio H5Pset_deflate H5Z_SZIP H5free_memory H5Pset_libver_bounds H5Pset_all_coll_metadata_ops
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -17916,6 +18142,13 @@ $as_echo "#define USE_PARALLEL_MPIO 1" >>confdefs.h
 
    fi
 
+   # Check to see if HDF5 library has collective metadata APIs, (HDF5 >= 1.10.0)
+   if test "x$ac_cv_func_H5Pset_all_coll_metadata_ops" = xyes; then
+
+$as_echo "#define HDF5_HAS_COLL_METADATA_OPS 1" >>confdefs.h
+
+   fi
+
    # If parallel is available in hdf5, enable it in the C code. Also add some stuff to netcdf.h.
    hdf5_parallel=no
    if test "x$ac_cv_func_H5Pget_fapl_mpio" = xyes -o "x$ac_cv_func_H5Pget_fapl_mpiposix" = xyes; then
@@ -18363,6 +18596,127 @@ $as_echo "#define USE_PARALLEL 1" >>confdefs.h
 
 fi
 
+# Check whether --enable-erange_fill was given.
+if test "${enable_erange_fill+set}" = set; then :
+  enableval=$enable_erange_fill; enable_erange_fill=${enableval}
+else
+  enable_erange_fill=no
+
+fi
+
+
+# Check whether --enable-zero-length-coord-bound was given.
+if test "${enable_zero_length_coord_bound+set}" = set; then :
+  enableval=$enable_zero_length_coord_bound; enable_zero_length_coord_bound=${enableval}
+else
+  enable_zero_length_coord_bound=no
+
+fi
+
+
+# check PnetCDF's settings on enable_erange_fill and relax_coord_bound
+if test "x$enable_pnetcdf" = xyes; then
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for full path of header file pnetcdf.h" >&5
+$as_echo_n "checking for full path of header file pnetcdf.h... " >&6; }
+if ${ac_cv_header_path_pnetcdf_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pnetcdf.h>
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_cv_header_path_pnetcdf_h=`sed -n '/\.h"/s/.*"\(.*\)".*/\1/p' conftest.i | grep -m 1 pnetcdf.h`
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_path_pnetcdf_h" >&5
+$as_echo "$ac_cv_header_path_pnetcdf_h" >&6; }
+    if ${ac_cv_header_path_pnetcdf_h+:} false; then :
+
+fi
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if erange-fill is enabled in PnetCDF" >&5
+$as_echo_n "checking if erange-fill is enabled in PnetCDF... " >&6; }
+   erange_fill_pnetcdf=`grep PNETCDF_ERANGE_FILL ${ac_cv_header_path_pnetcdf_h}`
+   if test "x$erange_fill_pnetcdf" = x; then
+      erange_fill_pnetcdf=no
+   else
+      erange_fill_pnetcdf=`echo ${erange_fill_pnetcdf} | cut -d' ' -f3`
+      if test "x$coord_bound_pnetcdf" = x0; then
+          enable_erange_fill_pnetcdf=no
+      else
+          enable_erange_fill_pnetcdf=yes
+      fi
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: $enable_erange_fill_pnetcdf" >&5
+$as_echo "$as_me: $enable_erange_fill_pnetcdf" >&6;}
+   if test "$enable_erange_fill" != "$enable_erange_fill_pnetcdf"; then
+      if test "$enable_erange_fill_pnetcdf" = yes; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Enable erange-fill to conform with PnetCDF setting" >&5
+$as_echo "$as_me: WARNING: Enable erange-fill to conform with PnetCDF setting" >&2;}
+      else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disable erange-fill to conform with PnetCDF setting" >&5
+$as_echo "$as_me: WARNING: Disable erange-fill to conform with PnetCDF setting" >&2;}
+      fi
+      enable_erange_fill=$enable_erange_fill_pnetcdf
+   fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if relax-coord-bound is enabled in PnetCDF" >&5
+$as_echo_n "checking if relax-coord-bound is enabled in PnetCDF... " >&6; }
+   relax_coord_bound_pnetcdf=`grep PNETCDF_RELAX_COORD_BOUND ${ac_cv_header_path_pnetcdf_h}`
+   if test "x$relax_coord_bound_pnetcdf" = x; then
+      elax_coord_bound_pnetcdf=no
+   else
+      coord_bound_pnetcdf=`echo ${relax_coord_bound_pnetcdf} | cut -d' ' -f3`
+      if test "x$coord_bound_pnetcdf" = x0; then
+          relax_coord_bound_pnetcdf=no
+      else
+          relax_coord_bound_pnetcdf=yes
+      fi
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: $relax_coord_bound_pnetcdf" >&5
+$as_echo "$as_me: $relax_coord_bound_pnetcdf" >&6;}
+   if test "$enable_zero_length_coord_bound" != "$relax_coord_bound_pnetcdf"; then
+      if test "$relax_coord_bound_pnetcdf" = yes; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Enable relax-coord-bound to conform with PnetCDF setting" >&5
+$as_echo "$as_me: WARNING: Enable relax-coord-bound to conform with PnetCDF setting" >&2;}
+      else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disable relax-coord-bound to conform with PnetCDF setting" >&5
+$as_echo "$as_me: WARNING: Disable relax-coord-bound to conform with PnetCDF setting" >&2;}
+      fi
+      enable_zero_length_coord_bound=$relax_coord_bound_pnetcdf
+   fi
+fi
+
+if test "x$enable_erange_fill" = xyes ; then
+   if test "x$M4FLAGS" = x ; then
+      M4FLAGS="-DERANGE_FILL"
+   else
+      M4FLAGS="$M4FLAGS -DERANGE_FILL"
+   fi
+fi
+
+
+if test "x$enable_zero_length_coord_bound" = xyes; then
+
+$as_echo "#define RELAX_COORD_BOUND 1" >>confdefs.h
+
+fi
+
 # Check for downloading/building fortran via postinstall script.
 if test "x$enable_remote_fortran_bootstrap" = xyes; then
 
@@ -18441,6 +18795,24 @@ else
   USE_DAP_FALSE=
 fi
  # Alias
+# Provide protocol specific flags
+ if test "x$enable_dap" = xyes; then
+  ENABLE_DAP_TRUE=
+  ENABLE_DAP_FALSE='#'
+else
+  ENABLE_DAP_TRUE='#'
+  ENABLE_DAP_FALSE=
+fi
+
+ if test "x$enable_dap4" = xyes; then
+  ENABLE_DAP4_TRUE=
+  ENABLE_DAP4_FALSE='#'
+else
+  ENABLE_DAP4_TRUE='#'
+  ENABLE_DAP4_FALSE=
+fi
+
+
  if test "x$enable_dap_remote_tests" = xyes; then
   ENABLE_DAP_REMOTE_TESTS_TRUE=
   ENABLE_DAP_REMOTE_TESTS_FALSE='#'
@@ -18874,6 +19246,8 @@ NC_LIBS=$NC_LIBS
 
 HAS_DAP=$enable_dap
 
+HAS_DAP4=$enable_dap4
+
 HAS_NC2=$nc_build_v2
 
 HAS_NC4=$enable_netcdf_4
@@ -18898,6 +19272,8 @@ HAS_MMAP=$enable_mmap
 
 HAS_JNA=$enable_jna
 
+RELAX_COORD_BOUND=$enable_relax_coord_bound
+
 
 # Include some specifics for netcdf on windows.
 #AH_VERBATIM([_WIN32_STRICMP],
@@ -18982,6 +19358,13 @@ HAS_JNA=$enable_jna
   fi
 
 
+  if  test "x$enable_dap4" = xyes ; then
+      NC_HAS_DAP4=1
+  else
+      NC_HAS_DAP4=0
+  fi
+
+
   if  test "x$enable_diskless" = xyes ; then
       NC_HAS_DISKLESS=1
   else
@@ -19024,13 +19407,23 @@ HAS_JNA=$enable_jna
   fi
 
 
+# Automake says that this is always run in top_builddir
+# and that srcdir is defined (== top_srcdir)
+abs_top_builddir=`pwd`
+cd $srcdir
+abs_top_srcdir=`pwd`
+cd $abs_top_builddir
+#AC_CONFIG_FILES(test_common.sh.in)
+rm -f ${abs_top_builddir}/test_common.sh
+sed -e "s|@TOPSRCDIR@|${abs_top_srcdir}|" -e "s|@TOPBUILDDIR@|${abs_top_builddir}|" <${abs_top_srcdir}/test_common.in >${abs_top_builddir}/test_common.sh
+
 #####
 # End netcdf_meta.h definitions.
 #####
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: generating header files and makefiles" >&5
 $as_echo "$as_me: generating header files and makefiles" >&6;}
-ac_config_files="$ac_config_files Makefile nc-config netcdf.pc libnetcdf.settings postinstall.sh include/netcdf_meta.h include/Makefile h5_test/Makefile docs/Makefile docs/images/Makefile libsrc/Makefile libsrc4/Makefile libsrcp/Makefile nctest/Makefile nc_test4/Makefile nc_test/Makefile ncdump/Makefile ncgen3/Makefile ncgen/Makefile examples/Makefile examples/C/Makefile examples/CDL/Makefile oc2/Makefile libdap2/Makefile libdispatch/Makefile liblib/Makefile ncdump/cdl/Makefile ncdump/ex [...]
+ac_config_files="$ac_config_files Makefile nc-config netcdf.pc libnetcdf.settings postinstall.sh include/netcdf_meta.h include/Makefile h5_test/Makefile libsrc/Makefile libsrc4/Makefile libsrcp/Makefile ncdump/Makefile ncgen3/Makefile ncgen/Makefile examples/Makefile examples/C/Makefile examples/CDL/Makefile oc2/Makefile libdap2/Makefile libdap4/Makefile libdispatch/Makefile liblib/Makefile ncdump/cdl/Makefile ncdump/expected/Makefile docs/Makefile docs/images/Makefile nctest/Makefile nc [...]
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -19234,6 +19627,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 
+if test -z "${ISCYGWIN_TRUE}" && test -z "${ISCYGWIN_FALSE}"; then
+  as_fn_error $? "conditional \"ISCYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${BUILD_PARALLEL_TRUE}" && test -z "${BUILD_PARALLEL_FALSE}"; then
   as_fn_error $? "conditional \"BUILD_PARALLEL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -19250,6 +19647,14 @@ if test -z "${USE_DAP_TRUE}" && test -z "${USE_DAP_FALSE}"; then
   as_fn_error $? "conditional \"USE_DAP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${ENABLE_DAP_TRUE}" && test -z "${ENABLE_DAP_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_DAP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_DAP4_TRUE}" && test -z "${ENABLE_DAP4_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_DAP4\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${ENABLE_DAP_REMOTE_TESTS_TRUE}" && test -z "${ENABLE_DAP_REMOTE_TESTS_FALSE}"; then
   as_fn_error $? "conditional \"ENABLE_DAP_REMOTE_TESTS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -19727,7 +20132,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by netCDF $as_me 4.4.1.1, which was
+This file was extended by netCDF $as_me 4.5.0-rc1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -19797,7 +20202,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-netCDF config.status 4.4.1.1
+netCDF config.status 4.5.0-rc1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -20215,6 +20620,8 @@ do
     "nc_test4/ref_hdf5_compat1.nc") CONFIG_LINKS="$CONFIG_LINKS nc_test4/ref_hdf5_compat1.nc:nc_test4/ref_hdf5_compat1.nc" ;;
     "nc_test4/ref_hdf5_compat2.nc") CONFIG_LINKS="$CONFIG_LINKS nc_test4/ref_hdf5_compat2.nc:nc_test4/ref_hdf5_compat2.nc" ;;
     "nc_test4/ref_hdf5_compat3.nc") CONFIG_LINKS="$CONFIG_LINKS nc_test4/ref_hdf5_compat3.nc:nc_test4/ref_hdf5_compat3.nc" ;;
+    "nc_test4/ref_chunked.hdf4") CONFIG_LINKS="$CONFIG_LINKS nc_test4/ref_chunked.hdf4:nc_test4/ref_chunked.hdf4" ;;
+    "nc_test4/ref_contiguous.hdf4") CONFIG_LINKS="$CONFIG_LINKS nc_test4/ref_contiguous.hdf4:nc_test4/ref_contiguous.hdf4" ;;
     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
     "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
     "docs/Doxyfile") CONFIG_FILES="$CONFIG_FILES docs/Doxyfile" ;;
@@ -20226,14 +20633,9 @@ do
     "include/netcdf_meta.h") CONFIG_FILES="$CONFIG_FILES include/netcdf_meta.h" ;;
     "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
     "h5_test/Makefile") CONFIG_FILES="$CONFIG_FILES h5_test/Makefile" ;;
-    "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
-    "docs/images/Makefile") CONFIG_FILES="$CONFIG_FILES docs/images/Makefile" ;;
     "libsrc/Makefile") CONFIG_FILES="$CONFIG_FILES libsrc/Makefile" ;;
     "libsrc4/Makefile") CONFIG_FILES="$CONFIG_FILES libsrc4/Makefile" ;;
     "libsrcp/Makefile") CONFIG_FILES="$CONFIG_FILES libsrcp/Makefile" ;;
-    "nctest/Makefile") CONFIG_FILES="$CONFIG_FILES nctest/Makefile" ;;
-    "nc_test4/Makefile") CONFIG_FILES="$CONFIG_FILES nc_test4/Makefile" ;;
-    "nc_test/Makefile") CONFIG_FILES="$CONFIG_FILES nc_test/Makefile" ;;
     "ncdump/Makefile") CONFIG_FILES="$CONFIG_FILES ncdump/Makefile" ;;
     "ncgen3/Makefile") CONFIG_FILES="$CONFIG_FILES ncgen3/Makefile" ;;
     "ncgen/Makefile") CONFIG_FILES="$CONFIG_FILES ncgen/Makefile" ;;
@@ -20242,16 +20644,21 @@ do
     "examples/CDL/Makefile") CONFIG_FILES="$CONFIG_FILES examples/CDL/Makefile" ;;
     "oc2/Makefile") CONFIG_FILES="$CONFIG_FILES oc2/Makefile" ;;
     "libdap2/Makefile") CONFIG_FILES="$CONFIG_FILES libdap2/Makefile" ;;
+    "libdap4/Makefile") CONFIG_FILES="$CONFIG_FILES libdap4/Makefile" ;;
     "libdispatch/Makefile") CONFIG_FILES="$CONFIG_FILES libdispatch/Makefile" ;;
     "liblib/Makefile") CONFIG_FILES="$CONFIG_FILES liblib/Makefile" ;;
     "ncdump/cdl/Makefile") CONFIG_FILES="$CONFIG_FILES ncdump/cdl/Makefile" ;;
     "ncdump/expected/Makefile") CONFIG_FILES="$CONFIG_FILES ncdump/expected/Makefile" ;;
+    "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
+    "docs/images/Makefile") CONFIG_FILES="$CONFIG_FILES docs/images/Makefile" ;;
+    "nctest/Makefile") CONFIG_FILES="$CONFIG_FILES nctest/Makefile" ;;
+    "nc_test4/Makefile") CONFIG_FILES="$CONFIG_FILES nc_test4/Makefile" ;;
+    "nc_test/Makefile") CONFIG_FILES="$CONFIG_FILES nc_test/Makefile" ;;
     "ncdap_test/Makefile") CONFIG_FILES="$CONFIG_FILES ncdap_test/Makefile" ;;
     "ncdap_test/testdata3/Makefile") CONFIG_FILES="$CONFIG_FILES ncdap_test/testdata3/Makefile" ;;
     "ncdap_test/expected3/Makefile") CONFIG_FILES="$CONFIG_FILES ncdap_test/expected3/Makefile" ;;
-    "ncdap_test/expected4/Makefile") CONFIG_FILES="$CONFIG_FILES ncdap_test/expected4/Makefile" ;;
     "ncdap_test/expectremote3/Makefile") CONFIG_FILES="$CONFIG_FILES ncdap_test/expectremote3/Makefile" ;;
-    "ncdap_test/expectremote4/Makefile") CONFIG_FILES="$CONFIG_FILES ncdap_test/expectremote4/Makefile" ;;
+    "dap4_test/Makefile") CONFIG_FILES="$CONFIG_FILES dap4_test/Makefile" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
@@ -21526,14 +21933,9 @@ ltmain=$ac_aux_dir/ltmain.sh
     "include/netcdf_meta.h":F) test -f  nc-config && chmod 755 nc-config ;;
     "include/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "h5_test/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
-    "docs/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
-    "docs/images/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "libsrc/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "libsrc4/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "libsrcp/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
-    "nctest/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
-    "nc_test4/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
-    "nc_test/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncdump/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncgen3/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncgen/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
@@ -21542,16 +21944,21 @@ ltmain=$ac_aux_dir/ltmain.sh
     "examples/CDL/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "oc2/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "libdap2/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
+    "libdap4/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "libdispatch/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "liblib/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncdump/cdl/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncdump/expected/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
+    "docs/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
+    "docs/images/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
+    "nctest/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
+    "nc_test4/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
+    "nc_test/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncdap_test/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncdap_test/testdata3/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncdap_test/expected3/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
-    "ncdap_test/expected4/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
     "ncdap_test/expectremote3/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
-    "ncdap_test/expectremote4/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
+    "dap4_test/Makefile":F) test -f  nc-config && chmod 755 nc-config ;;
 
   esac
 done # for ac_tag
@@ -21591,4 +21998,6 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
 
+    mv -f ${abs_top_srcdir}/test_common.sh ${abs_top_builddir}/test_common.sh
+
 cat libnetcdf.settings
diff --git a/configure.ac b/configure.ac
index 264108c..2c09e67 100644
--- a/configure.ac
+++ b/configure.ac
@@ -15,7 +15,7 @@ AC_REVISION([$Id: configure.ac,v 1.450 2010/05/28 19:42:47 dmh Exp $])
 AC_PREREQ([2.59])
 
 # Initialize with name, version, and support email address.
-AC_INIT([netCDF], [4.4.1.1], [support-netcdf at unidata.ucar.edu])
+AC_INIT([netCDF], [4.5.0-rc1], [support-netcdf at unidata.ucar.edu])
 
 ##
 # Prefer an empty CFLAGS variable instead of the default -g -O2.
@@ -25,9 +25,9 @@ AC_INIT([netCDF], [4.4.1.1], [support-netcdf at unidata.ucar.edu])
 : ${CFLAGS=""}
 
 AC_SUBST([NC_VERSION_MAJOR]) NC_VERSION_MAJOR=4
-AC_SUBST([NC_VERSION_MINOR]) NC_VERSION_MINOR=4
-AC_SUBST([NC_VERSION_PATCH]) NC_VERSION_PATCH=1
-AC_SUBST([NC_VERSION_NOTE]) NC_VERSION_NOTE=".1"
+AC_SUBST([NC_VERSION_MINOR]) NC_VERSION_MINOR=5
+AC_SUBST([NC_VERSION_PATCH]) NC_VERSION_PATCH=0
+AC_SUBST([NC_VERSION_NOTE]) NC_VERSION_NOTE="-rc1"
 
 #####
 # Set some variables used to generate a libnetcdf.settings file,
@@ -71,6 +71,9 @@ AC_CONFIG_LINKS([nc_test4/ref_hdf5_compat1.nc:nc_test4/ref_hdf5_compat1.nc])
 AC_CONFIG_LINKS([nc_test4/ref_hdf5_compat2.nc:nc_test4/ref_hdf5_compat2.nc])
 AC_CONFIG_LINKS([nc_test4/ref_hdf5_compat3.nc:nc_test4/ref_hdf5_compat3.nc])
 
+AC_CONFIG_LINKS([nc_test4/ref_chunked.hdf4:nc_test4/ref_chunked.hdf4])
+AC_CONFIG_LINKS([nc_test4/ref_contiguous.hdf4:nc_test4/ref_contiguous.hdf4])
+
 # This call is required by automake.
 AM_INIT_AUTOMAKE([foreign dist-zip subdir-objects])
 AM_MAINTAINER_MODE()
@@ -321,14 +324,17 @@ AC_ARG_ENABLE([logging],
 test "x$enable_logging" = xyes || enable_logging=no
 AC_MSG_RESULT([$enable_logging])
 
-## Capture the state of the --enable-dap flag
-AC_MSG_CHECKING([whether DAP client is to be built])
+## Capture the state of the --enable-dap flag => enable dap2+dap4
+AC_MSG_CHECKING([whether DAP client(s) are to be built])
 AC_ARG_ENABLE([dap],
                  [AS_HELP_STRING([--disable-dap],
                                  [build without DAP client support.])])
 test "x$enable_dap" = xno || enable_dap=yes
 AC_MSG_RESULT($enable_dap)
 
+# --enable-dap => enable-dap4
+enable_dap4=$enable_dap
+
 # Curl support is required if and only if any of these flags are set:
 # 1. --enable-dap
 
@@ -386,20 +392,34 @@ fi
 AC_MSG_RESULT($enable_dap_auth_tests)
 
 # Control if groups are supported in [netcdf4]dap2 code
-AC_MSG_CHECKING([whether [netcdf4] group names should be enabled (default on)])
+AC_MSG_CHECKING([whether [netcdf4] group names for DAP2 hould be enabled (default on)])
 AC_ARG_ENABLE([dap-groups],
               [AS_HELP_STRING([--disable-dap-groups],
-                                 [disable [netcdf4] dap group names])])
-test "x$enable_groups" = xno || enable_dap_groups=yes
-if test "x$enable_dap" = "xno" -o "x$enable_enable_netcdf_4" = "xno" ; then
-  AC_MSG_NOTICE([dap groups disabled because dap disabled or netcdf-4 disabled])
+                                 [disable [netcdf4] DAP2 group names])])
+test "x$enable_dap_groups" = xno || enable_dap_groups=yes
+AC_MSG_RESULT($enable_dap_groups)
+if test "x$enable_dap" = "xno" ; then
+  AC_MSG_NOTICE([DAP2 groups is being disabled because DAP2 support is  disabled or netcdf-4 disabled])
   enable_dap_groups=no
 fi
-AC_MSG_RESULT($enable_dap_groups)
 if test "x$enable_dap_groups" = xyes; then
 AC_DEFINE([ENABLE_DAP_GROUPS], [1], [if true, enable DAP group names])
 fi
 
+# Did the user specify a list of test servers to try for remote tests?
+AC_MSG_CHECKING([which remote test server(s) to use])
+AC_ARG_WITH([testservers],
+              [AS_HELP_STRING([--with-testservers=<host+port>,<host+port>...],
+                              [Specify the testserver(s) to try for remote tests.])],
+            [REMOTETESTSERVERS=$with_testservers], [REMOTETESTSERVERS=no])
+msg="$REMOTETESTSERVERS"
+if test "x$REMOTETESTSERVERS" = xno ; then
+  msg="remotetest.unidata.ucar.edu,jetstream.unidata.ucar.edu (defaults)"
+  REMOTETESTSERVERS=remotetest.unidata.ucar.edu,jetstream.unidata.ucar.edu
+fi
+AC_MSG_RESULT([$msg])
+AC_DEFINE_UNQUOTED([REMOTETESTSERVERS], ["$REMOTETESTSERVERS"], [the testservers for remote tests.])
+
 # Set the config.h flags
 if test "x$enable_dap" = xyes; then
    AC_DEFINE([USE_DAP], [1], [if true, build DAP Client])
@@ -752,6 +772,7 @@ AC_MSG_NOTICE([checking types, headers, and functions])
 
 AC_CHECK_HEADER(stdlib.h, ,AC_DEFINE([NO_STDLIB_H], [], [no stdlib.h]))
 AC_CHECK_HEADER(sys/types.h, ,AC_DEFINE([NO_SYS_TYPES_H], [], [no sys_types.h]))
+AC_CHECK_HEADERS([sys/dir.h])
 AC_CHECK_HEADERS([sys/param.h])
 #AC_CHECK_HEADERS([locale.h])
 AC_HEADER_DIRENT
@@ -788,6 +809,17 @@ AC_MSG_RESULT($enable_diskless)
 if test "x$enable_dap" = "xyes" -a "xenable_diskless" = xno  ; then
 AC_MSG_NOTICE([--enable-dap requires --enable-diskless])
 AC_MSG_NOTICE([dap support disabled])
+enable_dap=no
+fi
+
+# disable dap4 if netcdf-4 is disabled
+if test "x$enable_netcdf_4" = "xno" ; then
+    AC_MSG_WARN([netcdf-4 not enabled; disabling DAP4])
+    enable_dap4=no
+fi
+
+if test "x$enable_dap4" = xyes; then
+   AC_DEFINE([ENABLE_DAP4], [1], [if true, build DAP4 Client])
 fi
 
 # check for useful, but not essential, memio support
@@ -822,9 +854,9 @@ AC_FUNC_ALLOCA
 AC_CHECK_DECLS([isnan, isinf, isfinite, signbit],,,[#include <math.h>])
 AC_STRUCT_ST_BLKSIZE
 UD_CHECK_IEEE
+AC_CHECK_TYPES([size_t, ssize_t, ptrdiff_t, uchar, longlong, ushort, uint, int64, uint64 off_t])
 AC_TYPE_SIZE_T
 AC_TYPE_OFF_T
-AC_CHECK_TYPES([size_t, ssize_t, ptrdiff_t, uchar, longlong, ushort, uint, int64, uint64])
 AC_C_CHAR_UNSIGNED
 AC_C_BIGENDIAN
 
@@ -835,9 +867,11 @@ AC_C_BIGENDIAN
 SLEEPCMD=""
 PLTFORMOUT="$(uname | cut -d '_' -f 1)"
 if test "$PLTFORMOUT" = "CYGWIN"; then
+   ISCYGWIN=yes
    SLEEPCMD="sleep 5"
    AC_MSG_NOTICE([Pausing between sizeof() checks to mitigate a Cygwin issue.])
 fi
+AM_CONDITIONAL(ISCYGWIN, [test "x$ISCYGWIN" = xyes])
 
 $SLEEPCMD
 AC_CHECK_SIZEOF(short)
@@ -857,6 +891,15 @@ $SLEEPCMD
 AC_CHECK_SIZEOF(size_t)
 $SLEEPCMD
 AC_CHECK_SIZEOF(unsigned long long)
+$SLEEPCMD
+AC_CHECK_SIZEOF(unsigned long long)
+
+$SLEEPCMD
+if test "$ac_cv_type_uchar" = yes ; then
+   AC_CHECK_SIZEOF(uchar)
+else
+   AC_CHECK_SIZEOF(unsigned char)
+fi
 
 $SLEEPCMD
 if test "$ac_cv_type_ushort" = yes ; then
@@ -871,10 +914,6 @@ if test "$ac_cv_type_uint" = yes ; then
 else
    AC_CHECK_SIZEOF(unsigned int)
 fi
-
-$SLEEPCMD
-AC_CHECK_SIZEOF(unsigned long long)
-
 $SLEEPCMD
 if test "$ac_cv_type_ushort" = yes ; then
    AC_CHECK_SIZEOF(ushort)
@@ -889,12 +928,15 @@ else
 fi
 $SLEEPCMD
 AC_CHECK_SIZEOF(ptrdiff_t)
-
+$SLEEPCDM
+AC_CHECK_SIZEOF(ssize_t)
+$SLEEPCMD
+AC_CHECK_SIZEOF([void*])
 
 if test "x$enable_netcdf_4" = xyes || test "x$enable_dap" = xyes; then
    AC_SEARCH_LIBS([deflate], [zlibwapi zlibstat zlib zlib1 z], [], [
      AC_MSG_ERROR([Can't find or link to the z library. Turn off netCDF-4 and \
-     opendap with --disable-netcdf-4 --disable-dap, or see config.log for errors.])])
+     DAP clients with --disable-netcdf-4 --disable-dap, or see config.log for errors.])])
 fi
 
 # We need the math library
@@ -912,7 +954,7 @@ if test "x$enable_netcdf_4" = xyes; then
       if test "x$nc_dlfcn_h_missing" = xyes; then
       	      AC_MSG_ERROR([Cannot find dlfcn.h, yet --enable-dynamic-loading was used.])
       fi
-      AC_CHECK_LIB([dl],[dlopen], [], [AC_MSG_ERROR([Can't find or link against libdf. See config.log for errors.])])
+      AC_CHECK_LIB([dl],[dlopen], [], [AC_MSG_ERROR([Can't find or link against libdl. See config.log for errors.])])
       AC_DEFINE([USE_LIBDL],[1], [if true, enable dynamic loading support])
    fi
 
@@ -924,7 +966,7 @@ if test "x$enable_netcdf_4" = xyes; then
    [AC_MSG_ERROR([Can't find or link to the hdf5 high-level. Use --disable-netcdf-4, or see config.log for errors.])])
 
    AC_CHECK_HEADERS([hdf5.h], [], [AC_MSG_ERROR([Compiling a test with HDF5 failed.  Either hdf5.h cannot be found, or config.log should be checked for other reason.])])
-   AC_CHECK_FUNCS([H5Pget_fapl_mpiposix H5Pget_fapl_mpio H5Pset_deflate H5Z_SZIP H5free_memory])
+   AC_CHECK_FUNCS([H5Pget_fapl_mpiposix H5Pget_fapl_mpio H5Pset_deflate H5Z_SZIP H5free_memory H5Pset_libver_bounds H5Pset_all_coll_metadata_ops])
 
    # The user may have parallel HDF5 based on MPI POSIX.
    if test "x$ac_cv_func_H5Pget_fapl_mpiposix" = xyes; then
@@ -936,6 +978,11 @@ if test "x$enable_netcdf_4" = xyes; then
       AC_DEFINE([USE_PARALLEL_MPIO], [1], [if true, compile in parallel netCDF-4 based on MPI/IO])
    fi
 
+   # Check to see if HDF5 library has collective metadata APIs, (HDF5 >= 1.10.0)
+   if test "x$ac_cv_func_H5Pset_all_coll_metadata_ops" = xyes; then
+      AC_DEFINE([HDF5_HAS_COLL_METADATA_OPS], [1], [if true, use collective metadata ops in parallel netCDF-4])
+   fi
+
    # If parallel is available in hdf5, enable it in the C code. Also add some stuff to netcdf.h.
    hdf5_parallel=no
    if test "x$ac_cv_func_H5Pget_fapl_mpio" = xyes -o "x$ac_cv_func_H5Pget_fapl_mpiposix" = xyes; then
@@ -1074,6 +1121,83 @@ if test "x$enable_parallel" = xyes; then
   AC_DEFINE([USE_PARALLEL], [1], [if true, pnetcdf or parallel netcdf-4 is in use])
 fi
 
+AC_ARG_ENABLE([erange_fill],
+   [AS_HELP_STRING([--enable-erange-fill],
+                   [Enable use of fill value when out-of-range type
+                    conversion causes NC_ERANGE error. @<:@default: disabled@:>@])],
+   [enable_erange_fill=${enableval}], [enable_erange_fill=no]
+)
+
+AC_ARG_ENABLE([zero-length-coord-bound],
+   [AS_HELP_STRING([--enable-zero-length-coord-bound],
+                   [Enable a more relaxed boundary error check NC_EINVALCOORDS
+                    to allow coordinate start argument equal to dimension size
+                    when argument count is zero. @<:@default: disabled@:>@])],
+   [enable_zero_length_coord_bound=${enableval}], [enable_zero_length_coord_bound=no]
+)
+
+# check PnetCDF's settings on enable_erange_fill and relax_coord_bound
+if test "x$enable_pnetcdf" = xyes; then
+   UD_CHECK_HEADER_PATH([pnetcdf.h])
+
+   AC_MSG_CHECKING([if erange-fill is enabled in PnetCDF])
+   erange_fill_pnetcdf=`grep PNETCDF_ERANGE_FILL ${ac_cv_header_path_pnetcdf_h}`
+   if test "x$erange_fill_pnetcdf" = x; then
+      erange_fill_pnetcdf=no
+   else
+      erange_fill_pnetcdf=`echo ${erange_fill_pnetcdf} | cut -d' ' -f3`
+      if test "x$coord_bound_pnetcdf" = x0; then
+          enable_erange_fill_pnetcdf=no
+      else
+          enable_erange_fill_pnetcdf=yes
+      fi
+   fi
+   AC_MSG_NOTICE([$enable_erange_fill_pnetcdf])
+   if test "$enable_erange_fill" != "$enable_erange_fill_pnetcdf"; then
+      if test "$enable_erange_fill_pnetcdf" = yes; then
+         AC_MSG_WARN([Enable erange-fill to conform with PnetCDF setting])
+      else
+         AC_MSG_WARN([Disable erange-fill to conform with PnetCDF setting])
+      fi
+      enable_erange_fill=$enable_erange_fill_pnetcdf
+   fi
+
+   AC_MSG_CHECKING([if relax-coord-bound is enabled in PnetCDF])
+   relax_coord_bound_pnetcdf=`grep PNETCDF_RELAX_COORD_BOUND ${ac_cv_header_path_pnetcdf_h}`
+   if test "x$relax_coord_bound_pnetcdf" = x; then
+      elax_coord_bound_pnetcdf=no
+   else
+      coord_bound_pnetcdf=`echo ${relax_coord_bound_pnetcdf} | cut -d' ' -f3`
+      if test "x$coord_bound_pnetcdf" = x0; then
+          relax_coord_bound_pnetcdf=no
+      else
+          relax_coord_bound_pnetcdf=yes
+      fi
+   fi
+   AC_MSG_NOTICE([$relax_coord_bound_pnetcdf])
+   if test "$enable_zero_length_coord_bound" != "$relax_coord_bound_pnetcdf"; then
+      if test "$relax_coord_bound_pnetcdf" = yes; then
+         AC_MSG_WARN([Enable relax-coord-bound to conform with PnetCDF setting])
+      else
+         AC_MSG_WARN([Disable relax-coord-bound to conform with PnetCDF setting])
+      fi
+      enable_zero_length_coord_bound=$relax_coord_bound_pnetcdf
+   fi
+fi
+
+if test "x$enable_erange_fill" = xyes ; then
+   if test "x$M4FLAGS" = x ; then
+      M4FLAGS="-DERANGE_FILL"
+   else
+      M4FLAGS="$M4FLAGS -DERANGE_FILL"
+   fi
+fi
+AC_SUBST(M4FLAGS)
+
+if test "x$enable_zero_length_coord_bound" = xyes; then
+   AC_DEFINE([RELAX_COORD_BOUND], [1], [if true, NC_EINVALCOORDS check is more relaxed])
+fi
+
 # Check for downloading/building fortran via postinstall script.
 if test "x$enable_remote_fortran_bootstrap" = xyes; then
    AC_DEFINE([BUILD_FORTRAN], 1, [If true, will attempt to download and build netcdf-fortran.])
@@ -1120,6 +1244,10 @@ AM_CONDITIONAL(BUILD_PARALLEL, [test x$enable_parallel = xyes])
 AM_CONDITIONAL(TEST_PARALLEL4, [test "x$enable_parallel4" = xyes -a "x$enable_parallel_tests" = xyes])
 AM_CONDITIONAL(BUILD_DAP, [test "x$enable_dap" = xyes])
 AM_CONDITIONAL(USE_DAP, [test "x$enable_dap" = xyes]) # Alias
+# Provide protocol specific flags
+AM_CONDITIONAL(ENABLE_DAP, [test "x$enable_dap" = xyes])
+AM_CONDITIONAL(ENABLE_DAP4, [test "x$enable_dap4" = xyes])
+
 AM_CONDITIONAL(ENABLE_DAP_REMOTE_TESTS, [test "x$enable_dap_remote_tests" = xyes])
 AM_CONDITIONAL(ENABLE_DAP_AUTH_TESTS, [test "x$enable_dap_auth_tests" = xyes])
 AM_CONDITIONAL(ENABLE_DAP_LONG_TESTS, [test "x$enable_dap_long_tests" = xyes])
@@ -1229,6 +1357,7 @@ fi
 
 AC_SUBST(NC_LIBS,[$NC_LIBS])
 AC_SUBST(HAS_DAP,[$enable_dap])
+AC_SUBST(HAS_DAP4,[$enable_dap4])
 AC_SUBST(HAS_NC2,[$nc_build_v2])
 AC_SUBST(HAS_NC4,[$enable_netcdf_4])
 AC_SUBST(HAS_HDF4,[$enable_hdf4])
@@ -1241,6 +1370,7 @@ AC_SUBST(HAS_PARALLEL4,[$enable_parallel4])
 AC_SUBST(HAS_DISKLESS,[$enable_diskless])
 AC_SUBST(HAS_MMAP,[$enable_mmap])
 AC_SUBST(HAS_JNA,[$enable_jna])
+AC_SUBST(RELAX_COORD_BOUND,[$enable_relax_coord_bound])
 
 # Include some specifics for netcdf on windows.
 #AH_VERBATIM([_WIN32_STRICMP],
@@ -1299,6 +1429,7 @@ AX_SET_META([NC_HAS_HDF4],[$enable_hdf4],[yes])
 AX_SET_META([NC_HAS_HDF5],[$enable_netcdf_4],[yes])
 AX_SET_META([NC_HAS_SZIP],[$ac_cv_func_H5Z_SZIP],[yes])
 AX_SET_META([NC_HAS_DAP],[$enable_dap],[yes])
+AX_SET_META([NC_HAS_DAP4],[$enable_dap4],[yes])
 AX_SET_META([NC_HAS_DISKLESS],[$enable_diskless],[yes])
 AX_SET_META([NC_HAS_MMAP],[$enable_mmap],[yes])
 AX_SET_META([NC_HAS_JNA],[$enable_jna],[yes])
@@ -1306,6 +1437,16 @@ AX_SET_META([NC_HAS_PNETCDF],[$enable_pnetcdf],[yes])
 AX_SET_META([NC_HAS_PARALLEL],[$enable_parallel],[yes])
 AX_SET_META([NC_HAS_PARALLEL4],[$enable_parallel4],[yes])
 
+# Automake says that this is always run in top_builddir
+# and that srcdir is defined (== top_srcdir)
+abs_top_builddir=`pwd`
+cd $srcdir
+abs_top_srcdir=`pwd`
+cd $abs_top_builddir
+#AC_CONFIG_FILES(test_common.sh.in)
+rm -f ${abs_top_builddir}/test_common.sh
+sed -e "s|@TOPSRCDIR@|${abs_top_srcdir}|" -e "s|@TOPBUILDDIR@|${abs_top_builddir}|" <${abs_top_srcdir}/test_common.in >${abs_top_builddir}/test_common.sh
+
 #####
 # End netcdf_meta.h definitions.
 #####
@@ -1319,14 +1460,9 @@ AC_CONFIG_FILES([Makefile
 		         include/netcdf_meta.h
                  include/Makefile
                  h5_test/Makefile
-                 docs/Makefile
-                 docs/images/Makefile
                  libsrc/Makefile
                  libsrc4/Makefile
                  libsrcp/Makefile
-                 nctest/Makefile
-                 nc_test4/Makefile
-                 nc_test/Makefile
                  ncdump/Makefile
                  ncgen3/Makefile
                  ncgen/Makefile
@@ -1335,18 +1471,25 @@ AC_CONFIG_FILES([Makefile
                  examples/CDL/Makefile
                  oc2/Makefile
                  libdap2/Makefile
+                 libdap4/Makefile
                  libdispatch/Makefile
                  liblib/Makefile
                  ncdump/cdl/Makefile
                  ncdump/expected/Makefile
+                 docs/Makefile
+                 docs/images/Makefile
+                 nctest/Makefile
+                 nc_test4/Makefile
+                 nc_test/Makefile
                  ncdap_test/Makefile
                  ncdap_test/testdata3/Makefile
                  ncdap_test/expected3/Makefile
-                 ncdap_test/expected4/Makefile
                  ncdap_test/expectremote3/Makefile
-                 ncdap_test/expectremote4/Makefile
+                 dap4_test/Makefile
 		 ],
                  [test -f  nc-config && chmod 755 nc-config])
 AC_OUTPUT()
 
+    mv -f ${abs_top_srcdir}/test_common.sh ${abs_top_builddir}/test_common.sh
+
 cat libnetcdf.settings
diff --git a/dap4_test/CMakeLists.txt b/dap4_test/CMakeLists.txt
new file mode 100644
index 0000000..d748677
--- /dev/null
+++ b/dap4_test/CMakeLists.txt
@@ -0,0 +1,56 @@
+SET(abs_top_srcdir ${CMAKE_CURRENT_SOURCE_DIR})
+
+remove_definitions(-DDLL_EXPORT)
+
+
+ADD_SUBDIRECTORY(baseline)
+ADD_SUBDIRECTORY(baselineraw)
+ADD_SUBDIRECTORY(baselineremote)
+ADD_SUBDIRECTORY(cdltestfiles)
+ADD_SUBDIRECTORY(daptestfiles)
+ADD_SUBDIRECTORY(dmrtestfiles)
+ADD_SUBDIRECTORY(nctestfiles)
+
+FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
+
+FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/ FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE)
+
+IF(ENABLE_TESTS)
+
+  # Base tests
+  # The tests are set up as a combination of shell scripts and executables that
+  # must be run in a particular order. It is painful but will use macros to help
+  # keep it from being too bad.
+
+  IF(BUILD_UTILITIES)
+    add_sh_test(dap4_test test_raw)
+  ENDIF(BUILD_UTILITIES)
+
+  IF(ENABLE_DAP_REMOTE_TESTS)
+
+    # Change name (add '4') to avoid cmake
+    # complaint about duplicate targets.
+    BUILD_BIN_TEST(findtestserver4)
+
+    IF(BUILD_UTILITIES)
+# disable for now       add_sh_test(dap4_test test_remote)
+    ENDIF(BUILD_UTILITIES)
+  ENDIF(ENABLE_DAP_REMOTE_TESTS)
+ENDIF(ENABLE_TESTS)
+
+FILE(COPY ./baselineraw DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
+#FILE(COPY ./baseline DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
+#FILE(COPY ./cdltestfiles DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
+#FILE(COPY ./daptestfiles DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
+#FILE(COPY ./dmrtestfiles DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
+
+## Specify files to be distributed by 'make dist'
+FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.sh
+#${CMAKE_CURRENT_SOURCE_DIR}/daptestfiles
+#${CMAKE_CURRENT_SOURCE_DIR}/dmrtestfiles
+#${CMAKE_CURRENT_SOURCE_DIR}/cdltestfiles
+#${CMAKE_CURRENT_SOURCE_DIR}/baseline
+${CMAKE_CURRENT_SOURCE_DIR}/baselineraw
+)
+SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am)
+ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
diff --git a/dap4_test/Make0 b/dap4_test/Make0
new file mode 100644
index 0000000..649cc40
--- /dev/null
+++ b/dap4_test/Make0
@@ -0,0 +1,70 @@
+# Test c output
+T=test_parse
+#ARGS=../dap4_test/testfiles/test_atomic_types.nc.dmr
+#ARGS=./tat.nc.dmr
+ARGS=./tat.dmr
+
+#G=gdb --args
+#c:/path/to/my/app args to my app
+V=drmemory.exe --
+
+#V=valgrind --leak-check=full
+
+CFLAGS=-Wall -g -O0 -I.. -I../include -I../libdap4
+
+SHELL=/bin/bash
+
+CC=gcc
+LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz  -ldl -lm -lcurl
+
+LLP=/usr/local/lib:${LD_LIBRARY_PATH}
+
+all:: t.exe
+	sh ./test_parse.sh
+
+g::
+	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS; \
+	${G} ./t ${ARGS}
+
+v::
+	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS; \
+	${V} ./t ${ARGS}
+
+diff:: t.exe
+	rm -fr ./j
+	./t ${ARGS} >& ./j
+
+t.exe: ${T}.c ../liblib/.libs/libnetcdf.a
+	${CC} -o t ${CFLAGS} ${T}.c ${SRC} ${LDFLAGS}
+
+#	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS;
+
+clean::
+	rm -fr t.exe ${T}.o
+
+cpp::
+	${CC} -E ${CFLAGS} ${T}.c > ${T}.txt
+
+tmp.sh::
+	rm -f tmp.sh
+	echo 'P=d:/git/thredds/dap4/d4tests/src/test/data/resources/TestCDMClient/testinput' >>tmp.sh
+	echo 'F="test_atomic_array.nc test_atomic_array.nc test_atomic_types.nc test_enum.nc test_enum_2.nc test_enum_array.nc test_fill.nc test_groups1.nc test_one_var.nc test_one_vararray.nc test_opaque.nc test_opaque_array.nc test_struct_type.nc test_utf8.nc"' >>tmp.sh
+	echo 'for f in $$F ; do' >>tmp.sh
+	echo 'R="$${P}/$$f" ; L="./testfiles/$$f"' >>tmp.sh
+	echo 'rm $${L}.dap ; cp $${R}.raw $${L}.dap' >>tmp.sh
+	echo 'done' >>tmp.sh
+	echo 'cp $${P}/test_sequence_1.syn.raw ./testfiles/test_sequence_1.nc.dap' >>tmp.sh
+	echo 'cp $${P}/test_sequence_2.syn.raw ./testfiles/test_sequence_2.nc.dap' >>tmp.sh
+
+testfiles:: tmp.sh
+	sh -x ./tmp.sh
+
+#U=test_ncuri.c ${LDFLAGS}
+U=test_ncuri.c ../libdispatch/ncuri.c ../libdispatch/nclist.c ../libdispatch/ncbytes.c
+
+x:
+	pushd .. ; ${MAKE} ; popd
+
+uri::
+	${CC} -o test_ncuri ${CFLAGS} ${U}
+	gdb --args ./test_ncuri
diff --git a/dap4_test/Makefile.am b/dap4_test/Makefile.am
new file mode 100644
index 0000000..d00e857
--- /dev/null
+++ b/dap4_test/Makefile.am
@@ -0,0 +1,78 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2011, see the COPYRIGHT file for more information.
+
+# This file builds and runs DAP4 tests.
+
+# Put together AM_CPPFLAGS and AM_LDFLAGS.
+include $(top_srcdir)/lib_flags.am
+
+#LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-verbose
+#TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-verbose
+
+LDADD = ${top_builddir}/liblib/libnetcdf.la
+AM_CPPFLAGS += -I$(top_srcdir)/libdap4
+
+# Set up the tests; do the .sh first, then .c
+check_PROGRAMS =
+TESTS =
+
+if ENABLE_DAP4
+
+# WARNING: these are unit tests, so they will not
+# appear in CMakeLists.txt
+check_PROGRAMS += test_parse test_meta test_data
+test_parse_SOURCES = test_parse.c test_common.h
+test_meta_SOURCES = test_meta.c test_common.h
+test_data_SOURCES = test_data.c test_common.h
+TESTS += test_parse.sh
+TESTS += test_meta.sh
+TESTS += test_data.sh
+
+if BUILD_UTILITIES
+# These rely on ncdump
+TESTS += test_raw.sh
+endif
+
+if ENABLE_DAP_REMOTE_TESTS
+# Note: This program name was changed to findtestserver4
+# to avoid cmake complaint about duplicate targets.
+check_PROGRAMS += findtestserver4
+findtestserver4_SOURCES = findtestserver4.c
+if BUILD_UTILITIES
+  # relies on ncdump
+  # Disabled until the testserver is stable
+#TESTS += test_remote.sh
+endif
+endif
+
+endif #ENABLE_DAP4
+
+EXTRA_DIST = test_parse.sh test_meta.sh test_data.sh \
+             test_raw.sh test_remote.sh test_hyrax.sh \
+             d4test_common.sh \
+	     daptestfiles dmrtestfiles cdltestfiles nctestfiles \
+	     baseline baselineraw baselineremote
+
+CLEANFILES = *.exe
+
+# One last thing
+BUILT_SOURCES = .daprc
+
+.daprc:
+	echo "#DAPRC" >.daprc
+
+clean-local: clean-local-check
+
+.PHONY: clean-local-check
+
+clean-local-check:
+	-rm -rf results
+	-rm -f .dodsrc .daprc
+
+# The shell file maketests.sh is used to build the testdata
+# for dap4 testing. It creates and fills the directories
+# daptestfiles, dmrtestfiles, and cdltestfiles
+# As a rule, this will only be invoked if there was a change
+# in the GenerateRaw.java program in the thredds tree.
+maketests::
+	bash ./maketests.sh
diff --git a/dap4_test/Makefile.in b/dap4_test/Makefile.in
new file mode 100644
index 0000000..7da09ef
--- /dev/null
+++ b/dap4_test/Makefile.in
@@ -0,0 +1,1155 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2011, see the COPYRIGHT file for more information.
+
+# This file builds and runs DAP4 tests.
+
+# This is part of the netCDF package.
+# Copyright 2005 University Corporation for Atmospheric Research/Unidata
+# See COPYRIGHT file for conditions of use.
+# 
+# Assemble the CPPFLAGS and LDFLAGS that point to all the needed
+# libraries for netCDF-4.
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+ at USE_DAP_TRUE@am__append_1 = -I${top_srcdir}/oc2
+
+# This turns on declspec magic in netcdf.h for windows DLLs.
+ at BUILD_DLL_TRUE@am__append_2 = -DDLL_NETCDF
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+
+# WARNING: these are unit tests, so they will not
+# appear in CMakeLists.txt
+ at ENABLE_DAP4_TRUE@am__append_3 = test_parse test_meta test_data
+ at ENABLE_DAP4_TRUE@am__append_4 = test_parse.sh test_meta.sh \
+ at ENABLE_DAP4_TRUE@	test_data.sh
+
+# These rely on ncdump
+ at BUILD_UTILITIES_TRUE@@ENABLE_DAP4_TRUE at am__append_5 = test_raw.sh
+
+# Note: This program name was changed to findtestserver4
+# to avoid cmake complaint about duplicate targets.
+ at ENABLE_DAP4_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE at am__append_6 = findtestserver4
+subdir = dap4_test
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ at ENABLE_DAP4_TRUE@am__EXEEXT_1 = test_parse$(EXEEXT) \
+ at ENABLE_DAP4_TRUE@	test_meta$(EXEEXT) test_data$(EXEEXT)
+ at ENABLE_DAP4_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE at am__EXEEXT_2 = findtestserver4$(EXEEXT)
+am__findtestserver4_SOURCES_DIST = findtestserver4.c
+ at ENABLE_DAP4_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE at am_findtestserver4_OBJECTS = findtestserver4.$(OBJEXT)
+findtestserver4_OBJECTS = $(am_findtestserver4_OBJECTS)
+findtestserver4_LDADD = $(LDADD)
+findtestserver4_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am__test_data_SOURCES_DIST = test_data.c test_common.h
+ at ENABLE_DAP4_TRUE@am_test_data_OBJECTS = test_data.$(OBJEXT)
+test_data_OBJECTS = $(am_test_data_OBJECTS)
+test_data_LDADD = $(LDADD)
+test_data_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+am__test_meta_SOURCES_DIST = test_meta.c test_common.h
+ at ENABLE_DAP4_TRUE@am_test_meta_OBJECTS = test_meta.$(OBJEXT)
+test_meta_OBJECTS = $(am_test_meta_OBJECTS)
+test_meta_LDADD = $(LDADD)
+test_meta_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+am__test_parse_SOURCES_DIST = test_parse.c test_common.h
+ at ENABLE_DAP4_TRUE@am_test_parse_OBJECTS = test_parse.$(OBJEXT)
+test_parse_OBJECTS = $(am_test_parse_OBJECTS)
+test_parse_LDADD = $(LDADD)
+test_parse_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(findtestserver4_SOURCES) $(test_data_SOURCES) \
+	$(test_meta_SOURCES) $(test_parse_SOURCES)
+DIST_SOURCES = $(am__findtestserver4_SOURCES_DIST) \
+	$(am__test_data_SOURCES_DIST) $(am__test_meta_SOURCES_DIST) \
+	$(am__test_parse_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+	$(top_srcdir)/lib_flags.am $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_CFLAGS = @AM_CFLAGS@
+AM_CPPFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) \
+	-I$(top_srcdir)/libdap4
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_LDFLAGS = 
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BINFILE_NAME = @BINFILE_NAME@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CONFIG_DATE = @CONFIG_DATE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_CSS_FILE = @DOXYGEN_CSS_FILE@
+DOXYGEN_HEADER_FILE = @DOXYGEN_HEADER_FILE@
+DOXYGEN_SEARCHENGINE = @DOXYGEN_SEARCHENGINE@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
+HAS_DISKLESS = @HAS_DISKLESS@
+HAS_HDF4 = @HAS_HDF4@
+HAS_HDF5 = @HAS_HDF5@
+HAS_JNA = @HAS_JNA@
+HAS_LOGGING = @HAS_LOGGING@
+HAS_MMAP = @HAS_MMAP@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAS_PARALLEL = @HAS_PARALLEL@
+HAS_PARALLEL4 = @HAS_PARALLEL4@
+HAS_PNETCDF = @HAS_PNETCDF@
+HAS_SZLIB = @HAS_SZLIB@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
+NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
+NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
+NC_HAS_HDF4 = @NC_HAS_HDF4@
+NC_HAS_HDF5 = @NC_HAS_HDF5@
+NC_HAS_JNA = @NC_HAS_JNA@
+NC_HAS_MMAP = @NC_HAS_MMAP@
+NC_HAS_NC2 = @NC_HAS_NC2@
+NC_HAS_NC4 = @NC_HAS_NC4@
+NC_HAS_PARALLEL = @NC_HAS_PARALLEL@
+NC_HAS_PARALLEL4 = @NC_HAS_PARALLEL4@
+NC_HAS_PNETCDF = @NC_HAS_PNETCDF@
+NC_HAS_SZIP = @NC_HAS_SZIP@
+NC_LIBS = @NC_LIBS@
+NC_M4 = @NC_M4@
+NC_VERSION = @NC_VERSION@
+NC_VERSION_MAJOR = @NC_VERSION_MAJOR@
+NC_VERSION_MINOR = @NC_VERSION_MINOR@
+NC_VERSION_NOTE = @NC_VERSION_NOTE@
+NC_VERSION_PATCH = @NC_VERSION_PATCH@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NOUNDEFINED = @NOUNDEFINED@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHOW_DOXYGEN_TAG_LIST = @SHOW_DOXYGEN_TAG_LIST@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+enable_shared = @enable_shared@
+enable_static = @enable_static@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
+
+# Put together AM_CPPFLAGS and AM_LDFLAGS.
+
+#LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-verbose
+#TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-verbose
+LDADD = ${top_builddir}/liblib/libnetcdf.la
+TESTS = $(am__append_4) $(am__append_5)
+ at ENABLE_DAP4_TRUE@test_parse_SOURCES = test_parse.c test_common.h
+ at ENABLE_DAP4_TRUE@test_meta_SOURCES = test_meta.c test_common.h
+ at ENABLE_DAP4_TRUE@test_data_SOURCES = test_data.c test_common.h
+ at ENABLE_DAP4_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE at findtestserver4_SOURCES = findtestserver4.c
+#TESTS += test_remote.sh
+EXTRA_DIST = test_parse.sh test_meta.sh test_data.sh \
+             test_raw.sh test_remote.sh test_hyrax.sh \
+             d4test_common.sh \
+	     daptestfiles dmrtestfiles cdltestfiles nctestfiles \
+	     baseline baselineraw baselineremote
+
+CLEANFILES = *.exe
+
+# One last thing
+BUILT_SOURCES = .daprc
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/lib_flags.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign dap4_test/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign dap4_test/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(top_srcdir)/lib_flags.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+findtestserver4$(EXEEXT): $(findtestserver4_OBJECTS) $(findtestserver4_DEPENDENCIES) $(EXTRA_findtestserver4_DEPENDENCIES) 
+	@rm -f findtestserver4$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(findtestserver4_OBJECTS) $(findtestserver4_LDADD) $(LIBS)
+
+test_data$(EXEEXT): $(test_data_OBJECTS) $(test_data_DEPENDENCIES) $(EXTRA_test_data_DEPENDENCIES) 
+	@rm -f test_data$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_data_OBJECTS) $(test_data_LDADD) $(LIBS)
+
+test_meta$(EXEEXT): $(test_meta_OBJECTS) $(test_meta_DEPENDENCIES) $(EXTRA_test_meta_DEPENDENCIES) 
+	@rm -f test_meta$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_meta_OBJECTS) $(test_meta_LDADD) $(LIBS)
+
+test_parse$(EXEEXT): $(test_parse_OBJECTS) $(test_parse_DEPENDENCIES) $(EXTRA_test_parse_DEPENDENCIES) 
+	@rm -f test_parse$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_parse_OBJECTS) $(test_parse_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/findtestserver4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_data.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_meta.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_parse.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+test_parse.sh.log: test_parse.sh
+	@p='test_parse.sh'; \
+	b='test_parse.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test_meta.sh.log: test_meta.sh
+	@p='test_meta.sh'; \
+	b='test_meta.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test_data.sh.log: test_data.sh
+	@p='test_data.sh'; \
+	b='test_data.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test_raw.sh.log: test_raw.sh
+	@p='test_raw.sh'; \
+	b='test_raw.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile
+installdirs:
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: all check check-am install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+ at BUILD_UTILITIES_TRUE@@ENABLE_DAP4_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE@  # relies on ncdump
+ at BUILD_UTILITIES_TRUE@@ENABLE_DAP4_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE@  # Disabled until the testserver is stable
+
+.daprc:
+	echo "#DAPRC" >.daprc
+
+clean-local: clean-local-check
+
+.PHONY: clean-local-check
+
+clean-local-check:
+	-rm -rf results
+	-rm -f .dodsrc .daprc
+
+# The shell file maketests.sh is used to build the testdata
+# for dap4 testing. It creates and fills the directories
+# daptestfiles, dmrtestfiles, and cdltestfiles
+# As a rule, this will only be invoked if there was a change
+# in the GenerateRaw.java program in the thredds tree.
+maketests::
+	bash ./maketests.sh
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/ncdap_test/expected4/CMakeLists.txt b/dap4_test/baseline/CMakeLists.txt
similarity index 100%
copy from ncdap_test/expected4/CMakeLists.txt
copy to dap4_test/baseline/CMakeLists.txt
diff --git a/dap4_test/baseline/test_anon_dim.2.syn.d4d b/dap4_test/baseline/test_anon_dim.2.syn.d4d
new file mode 100644
index 0000000..16bf1f3
--- /dev/null
+++ b/dap4_test/baseline/test_anon_dim.2.syn.d4d
@@ -0,0 +1,13 @@
+netcdf test_anon_dim.2.syn {
+dimensions:
+	_Anonymous4 = 4 ;
+variables:
+	int vu32(_Anonymous4) ;
+
+// global attributes:
+		string :_dap4.ce = "/vu32[0:3]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu32 = -1169720286, -920699049, -2088732436, 1060190036 ;
+}
diff --git a/dap4_test/baseline/test_anon_dim.2.syn.d4m b/dap4_test/baseline/test_anon_dim.2.syn.d4m
new file mode 100644
index 0000000..866dcc2
--- /dev/null
+++ b/dap4_test/baseline/test_anon_dim.2.syn.d4m
@@ -0,0 +1,10 @@
+netcdf test_anon_dim.2 {
+dimensions:
+	_Anonymous4 = 4 ;
+variables:
+	int vu32(_Anonymous4) ;
+
+// global attributes:
+		string :_dap4.ce = "/vu32[0:3]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_anon_dim.2.syn.d4p b/dap4_test/baseline/test_anon_dim.2.syn.d4p
new file mode 100644
index 0000000..a28df7f
--- /dev/null
+++ b/dap4_test/baseline/test_anon_dim.2.syn.d4p
@@ -0,0 +1,21 @@
+<Dataset
+   name="test_anon_dim.syn"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous4" size="4"/>
+  </Dimensions>
+  <Variables>
+    <Int32 name="vu32">
+      <Dim name="/_Anonymous4"/>
+    </Int32>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/vu32[0:3]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_anon_dim.syn.d4d b/dap4_test/baseline/test_anon_dim.syn.d4d
new file mode 100644
index 0000000..783f71e
--- /dev/null
+++ b/dap4_test/baseline/test_anon_dim.syn.d4d
@@ -0,0 +1,13 @@
+netcdf test_anon_dim.syn {
+dimensions:
+	_Anonymous6 = 6 ;
+variables:
+	int vu32(_Anonymous6) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu32 = -1169720286, -920699049, -2088732436, 1060190036, -1123468835, 
+    922940053 ;
+}
diff --git a/dap4_test/baseline/test_anon_dim.syn.d4m b/dap4_test/baseline/test_anon_dim.syn.d4m
new file mode 100644
index 0000000..a5cd0ef
--- /dev/null
+++ b/dap4_test/baseline/test_anon_dim.syn.d4m
@@ -0,0 +1,9 @@
+netcdf test_anon_dim {
+dimensions:
+	_Anonymous6 = 6 ;
+variables:
+	int vu32(_Anonymous6) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_anon_dim.syn.d4p b/dap4_test/baseline/test_anon_dim.syn.d4p
new file mode 100644
index 0000000..324103e
--- /dev/null
+++ b/dap4_test/baseline/test_anon_dim.syn.d4p
@@ -0,0 +1,18 @@
+<Dataset
+   name="test_anon_dim.syn"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous6" size="6"/>
+  </Dimensions>
+  <Variables>
+    <Int32 name="vu32">
+      <Dim name="/_Anonymous6"/>
+    </Int32>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_atomic_array.5.nc.d4d b/dap4_test/baseline/test_atomic_array.5.nc.d4d
new file mode 100644
index 0000000..f45f1c8
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.5.nc.d4d
@@ -0,0 +1,28 @@
+netcdf test_atomic_array.5.nc {
+types:
+  ubyte(*) _bytestring ;
+dimensions:
+	_Anonymous1 = 1 ;
+	_Anonymous2 = 2 ;
+variables:
+	ubyte vu8(_Anonymous1, _Anonymous2) ;
+	double vd(_Anonymous1) ;
+	string vs(_Anonymous1, _Anonymous1) ;
+	_bytestring vo(_Anonymous1, _Anonymous1) ;
+
+// global attributes:
+		string :_dap4.ce = "/vu8[1][0:2:2];/vd[1];/vs[1][0];/vo[0][1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  3, 5 ;
+
+ vd = 1024.8 ;
+
+ vs =
+  "Καλημέα" ;
+
+ vo =
+  {171, 205, 239, 0, 0, 0, 0, 0} ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.5.nc.d4m b/dap4_test/baseline/test_atomic_array.5.nc.d4m
new file mode 100644
index 0000000..860e8f4
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.5.nc.d4m
@@ -0,0 +1,16 @@
+netcdf test_atomic_array.5 {
+types:
+  opaque(8) opaque8_t ;
+dimensions:
+	_Anonymous1 = 1 ;
+	_Anonymous2 = 2 ;
+variables:
+	ubyte vu8(_Anonymous1, _Anonymous2) ;
+	double vd(_Anonymous1) ;
+	string vs(_Anonymous1, _Anonymous1) ;
+	opaque8_t vo(_Anonymous1, _Anonymous1) ;
+
+// global attributes:
+		string :_dap4.ce = "/vu8[1][0:2:2];/vd[1];/vs[1][0];/vo[0][1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.5.nc.d4p b/dap4_test/baseline/test_atomic_array.5.nc.d4p
new file mode 100644
index 0000000..2342777
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.5.nc.d4p
@@ -0,0 +1,34 @@
+<Dataset
+   name="test_atomic_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous1" size="1"/>
+    <Dimension name="_Anonymous2" size="2"/>
+  </Dimensions>
+  <Variables>
+    <UInt8 name="vu8">
+      <Dim name="/_Anonymous1"/>
+      <Dim name="/_Anonymous2"/>
+    </UInt8>
+    <Float64 name="vd">
+      <Dim name="/_Anonymous1"/>
+    </Float64>
+    <String name="vs">
+      <Dim name="/_Anonymous1"/>
+      <Dim name="/_Anonymous1"/>
+    </String>
+    <Opaque name="vo" type="/opaque8_t">
+      <Dim name="/_Anonymous1"/>
+      <Dim name="/_Anonymous1"/>
+    </Opaque>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/vu8[1][0:2:2];/vd[1];/vs[1][0];/vo[0][1]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_atomic_array.8.nc.d4d b/dap4_test/baseline/test_atomic_array.8.nc.d4d
new file mode 100644
index 0000000..d4634ae
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.8.nc.d4d
@@ -0,0 +1,13 @@
+netcdf test_atomic_array.8.nc {
+dimensions:
+	_Anonymous3 = 3 ;
+variables:
+	short v16(_Anonymous3) ;
+
+// global attributes:
+		string :_dap4.ce = "/v16[0:1,3]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v16 = 1, 2, 4 ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.8.nc.d4m b/dap4_test/baseline/test_atomic_array.8.nc.d4m
new file mode 100644
index 0000000..80a8d54
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.8.nc.d4m
@@ -0,0 +1,10 @@
+netcdf test_atomic_array.8 {
+dimensions:
+	_Anonymous3 = 3 ;
+variables:
+	short v16(_Anonymous3) ;
+
+// global attributes:
+		string :_dap4.ce = "/v16[0:1,3]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.8.nc.d4p b/dap4_test/baseline/test_atomic_array.8.nc.d4p
new file mode 100644
index 0000000..2fbd38d
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.8.nc.d4p
@@ -0,0 +1,21 @@
+<Dataset
+   name="test_atomic_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous3" size="3"/>
+  </Dimensions>
+  <Variables>
+    <Int16 name="v16">
+      <Dim name="/_Anonymous3"/>
+    </Int16>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/v16[0:1,3]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_atomic_array.9.nc.d4d b/dap4_test/baseline/test_atomic_array.9.nc.d4d
new file mode 100644
index 0000000..62bf258
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.9.nc.d4d
@@ -0,0 +1,13 @@
+netcdf test_atomic_array.9.nc {
+dimensions:
+	_Anonymous3 = 3 ;
+variables:
+	short v16(_Anonymous3) ;
+
+// global attributes:
+		string :_dap4.ce = "/v16[3,0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v16 = 4, 1, 2 ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.9.nc.d4m b/dap4_test/baseline/test_atomic_array.9.nc.d4m
new file mode 100644
index 0000000..cf517dc
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.9.nc.d4m
@@ -0,0 +1,10 @@
+netcdf test_atomic_array.9 {
+dimensions:
+	_Anonymous3 = 3 ;
+variables:
+	short v16(_Anonymous3) ;
+
+// global attributes:
+		string :_dap4.ce = "/v16[3,0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.9.nc.d4p b/dap4_test/baseline/test_atomic_array.9.nc.d4p
new file mode 100644
index 0000000..989bb62
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.9.nc.d4p
@@ -0,0 +1,21 @@
+<Dataset
+   name="test_atomic_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous3" size="3"/>
+  </Dimensions>
+  <Variables>
+    <Int16 name="v16">
+      <Dim name="/_Anonymous3"/>
+    </Int16>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/v16[3,0:1]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_atomic_array.nc.d4d b/dap4_test/baseline/test_atomic_array.nc.d4d
new file mode 100644
index 0000000..12c2d4a
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.nc.d4d
@@ -0,0 +1,51 @@
+netcdf test_atomic_array.nc {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	_bytestring vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  255, 1, 2,
+  3, 4, 5 ;
+
+ v16 = 1, 2, 3, 4 ;
+
+ vu32 =
+  5, 4, 3,
+  2, 1, 0 ;
+
+ vd = 17.9, 1024.8 ;
+
+ vc = "@&" ;
+
+ vs =
+  "hello\tworld", "\r\n",
+  "Καλημέα", "abc" ;
+
+ vo =
+  {1, 35, 69, 103, 137, 171, 205, 239}, {171, 205, 239, 0, 0, 0, 0, 0} ;
+
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.nc.d4m b/dap4_test/baseline/test_atomic_array.nc.d4m
new file mode 100644
index 0000000..0f26f77
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.nc.d4m
@@ -0,0 +1,27 @@
+netcdf test_atomic_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  opaque(8) opaque8_t ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	opaque8_t vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.nc.d4p b/dap4_test/baseline/test_atomic_array.nc.d4p
new file mode 100644
index 0000000..1367230
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.nc.d4p
@@ -0,0 +1,66 @@
+<Dataset
+   name="test_atomic_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d1" size="1"/>
+    <Dimension name="d2" size="2"/>
+    <Dimension name="d3" size="3"/>
+    <Dimension name="d4" size="4"/>
+    <Dimension name="d5" size="5"/>
+  </Dimensions>
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+  </Types>
+  <Variables>
+    <UInt8 name="vu8">
+      <Dim name="/d2"/>
+      <Dim name="/d3"/>
+    </UInt8>
+    <Int16 name="v16">
+      <Dim name="/d4"/>
+    </Int16>
+    <UInt32 name="vu32">
+      <Dim name="/d2"/>
+      <Dim name="/d3"/>
+    </UInt32>
+    <Float64 name="vd">
+      <Dim name="/d2"/>
+    </Float64>
+    <Char name="vc">
+      <Dim name="/d2"/>
+    </Char>
+    <String name="vs">
+      <Dim name="/d2"/>
+      <Dim name="/d2"/>
+    </String>
+    <Opaque name="vo" type="/opaque8_t">
+      <Dim name="/d1"/>
+      <Dim name="/d2"/>
+    </Opaque>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+      <Dim name="/d5"/>
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_atomic_array.syn.d4d b/dap4_test/baseline/test_atomic_array.syn.d4d
new file mode 100644
index 0000000..8fa0c6e
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.syn.d4d
@@ -0,0 +1,54 @@
+netcdf test_atomic_array.syn {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	_bytestring vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  186, 201, 131,
+  63, 189, 55 ;
+
+ v16 = -341, -21899, -13413, -22144 ;
+
+ vu32 =
+  2367803413, 3586730583, 511843988,
+  3754752863, 2950934681, 2366232135 ;
+
+ vd = 0.217870081192792, 0.602450791996768 ;
+
+ vc = "CO" ;
+
+ vs =
+  "{S", "gb8^OE$",
+  "4a/q%n9;5Y", "{fIl?T\"\\A[" ;
+
+ vo =
+  
+    {162, 23, 122, 167, 40, 124, 4, 250, 139, 181, 123, 205, 247, 110, 200, 15}, 
+    {52, 250, 71, 42, 169, 64, 77, 213, 67, 20, 60, 173, 237, 48, 58, 117} ;
+
+ primary_cloud = Stratus, Cirrocumulus, Nimbostratus, Cirrostratus, 
+    Stratocumulus ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.syn.d4m b/dap4_test/baseline/test_atomic_array.syn.d4m
new file mode 100644
index 0000000..c4c15f5
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.syn.d4m
@@ -0,0 +1,27 @@
+netcdf test_atomic_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	_bytestring vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_atomic_array.syn.d4p b/dap4_test/baseline/test_atomic_array.syn.d4p
new file mode 100644
index 0000000..772cb8f
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_array.syn.d4p
@@ -0,0 +1,67 @@
+<Dataset
+   name="test_atomic_array.syn"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d1" size="1"/>
+    <Dimension name="d2" size="2"/>
+    <Dimension name="d3" size="3"/>
+    <Dimension name="d4" size="4"/>
+    <Dimension name="d5" size="5"/>
+  </Dimensions>
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Opaque name="_bytestring"/>
+  </Types>
+  <Variables>
+    <UInt8 name="vu8">
+      <Dim name="/d2"/>
+      <Dim name="/d3"/>
+    </UInt8>
+    <Int16 name="v16">
+      <Dim name="/d4"/>
+    </Int16>
+    <UInt32 name="vu32">
+      <Dim name="/d2"/>
+      <Dim name="/d3"/>
+    </UInt32>
+    <Float64 name="vd">
+      <Dim name="/d2"/>
+    </Float64>
+    <Char name="vc">
+      <Dim name="/d2"/>
+    </Char>
+    <String name="vs">
+      <Dim name="/d2"/>
+      <Dim name="/d2"/>
+    </String>
+    <Opaque name="vo" type="/_bytestring">
+      <Dim name="/d1"/>
+      <Dim name="/d2"/>
+    </Opaque>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+      <Dim name="/d5"/>
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_atomic_types.nc.d4d b/dap4_test/baseline/test_atomic_types.nc.d4d
new file mode 100644
index 0000000..07ad920
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_types.nc.d4d
@@ -0,0 +1,60 @@
+netcdf test_atomic_types.nc {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	_bytestring vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v8 = -128 ;
+
+ vu8 = 255 ;
+
+ v16 = -32768 ;
+
+ vu16 = _ ;
+
+ v32 = 2147483647 ;
+
+ vu32 = _ ;
+
+ v64 = 9223372036854775807 ;
+
+ vu64 = 18446744073709551615 ;
+
+ vf = 3.141593 ;
+
+ vd = 3.14159265358979 ;
+
+ vc = "@" ;
+
+ vs = "hello\tworld" ;
+
+ vo = {1, 35, 69, 103, 137, 171, 205, 239} ;
+
+ primary_cloud = Stratus ;
+
+ secondary_cloud = _ ;
+}
diff --git a/dap4_test/baseline/test_atomic_types.nc.d4m b/dap4_test/baseline/test_atomic_types.nc.d4m
new file mode 100644
index 0000000..cee4c10
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_types.nc.d4m
@@ -0,0 +1,29 @@
+netcdf test_atomic_types {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  opaque(8) opaque8_t ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	opaque8_t vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_atomic_types.nc.d4p b/dap4_test/baseline/test_atomic_types.nc.d4p
new file mode 100644
index 0000000..b0cce1d
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_types.nc.d4p
@@ -0,0 +1,51 @@
+<Dataset
+   name="test_atomic_types.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+  </Types>
+  <Variables>
+    <Int8 name="v8"/>
+    <UInt8 name="vu8"/>
+    <Int16 name="v16"/>
+    <UInt16 name="vu16"/>
+    <Int32 name="v32"/>
+    <UInt32 name="vu32"/>
+    <Int64 name="v64"/>
+    <UInt64 name="vu64"/>
+    <Float32 name="vf"/>
+    <Float64 name="vd"/>
+    <Char name="vc"/>
+    <String name="vs"/>
+    <Opaque name="vo" type="/opaque8_t"/>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+    <Enum name="secondary_cloud" enum="/cloud_class_t">
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_atomic_types.syn.d4d b/dap4_test/baseline/test_atomic_types.syn.d4d
new file mode 100644
index 0000000..5a244cf
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_types.syn.d4d
@@ -0,0 +1,61 @@
+netcdf test_atomic_types.syn {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	_bytestring vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v8 = 58 ;
+
+ vu8 = 201 ;
+
+ v16 = 896 ;
+
+ vu16 = 16177 ;
+
+ v32 = -1123468835 ;
+
+ vu32 = 2125143125 ;
+
+ v64 = 3059391736915381031 ;
+
+ vu64 = 11577488182652895291 ;
+
+ vf = 0.5512972 ;
+
+ vd = 0.790267301128816 ;
+
+ vc = "*" ;
+
+ vs = "O,L?c8A%V" ;
+
+ vo = 
+    {70, 241, 105, 239, 35, 203, 175, 155, 31, 235, 217, 158, 78, 22, 206, 201} ;
+
+ primary_cloud = Altocumulus ;
+
+ secondary_cloud = Stratocumulus ;
+}
diff --git a/dap4_test/baseline/test_atomic_types.syn.d4m b/dap4_test/baseline/test_atomic_types.syn.d4m
new file mode 100644
index 0000000..51f534f
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_types.syn.d4m
@@ -0,0 +1,29 @@
+netcdf test_atomic_types {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	_bytestring vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_atomic_types.syn.d4p b/dap4_test/baseline/test_atomic_types.syn.d4p
new file mode 100644
index 0000000..59490a8
--- /dev/null
+++ b/dap4_test/baseline/test_atomic_types.syn.d4p
@@ -0,0 +1,52 @@
+<Dataset
+   name="test_atomic_types.syn"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Opaque name="_bytestring"/>
+  </Types>
+  <Variables>
+    <Int8 name="v8"/>
+    <UInt8 name="vu8"/>
+    <Int16 name="v16"/>
+    <UInt16 name="vu16"/>
+    <Int32 name="v32"/>
+    <UInt32 name="vu32"/>
+    <Int64 name="v64"/>
+    <UInt64 name="vu64"/>
+    <Float32 name="vf"/>
+    <Float64 name="vd"/>
+    <Char name="vc"/>
+    <String name="vs"/>
+    <Opaque name="vo" type="/_bytestring"/>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+    <Enum name="secondary_cloud" enum="/cloud_class_t">
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_enum.nc.d4d b/dap4_test/baseline/test_enum.nc.d4d
new file mode 100644
index 0000000..ca1c5da
--- /dev/null
+++ b/dap4_test/baseline/test_enum.nc.d4d
@@ -0,0 +1,16 @@
+netcdf test_enum.nc {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+variables:
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Stratus ;
+}
diff --git a/dap4_test/baseline/test_enum.nc.d4m b/dap4_test/baseline/test_enum.nc.d4m
new file mode 100644
index 0000000..040a808
--- /dev/null
+++ b/dap4_test/baseline/test_enum.nc.d4m
@@ -0,0 +1,13 @@
+netcdf test_enum {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+variables:
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_enum.nc.d4p b/dap4_test/baseline/test_enum.nc.d4p
new file mode 100644
index 0000000..c096660
--- /dev/null
+++ b/dap4_test/baseline/test_enum.nc.d4p
@@ -0,0 +1,33 @@
+<Dataset
+   name="test_enum.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+  </Types>
+  <Variables>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_enum_2.nc.d4d b/dap4_test/baseline/test_enum_2.nc.d4d
new file mode 100644
index 0000000..0c8de41
--- /dev/null
+++ b/dap4_test/baseline/test_enum_2.nc.d4d
@@ -0,0 +1,19 @@
+netcdf test_enum_2.nc {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: h {
+  variables:
+  	cloud_class_t primary_cloud ;
+  		cloud_class_t primary_cloud:_FillValue = Missing ;
+  data:
+
+   primary_cloud = Stratus ;
+  } // group h
+}
diff --git a/dap4_test/baseline/test_enum_2.nc.d4m b/dap4_test/baseline/test_enum_2.nc.d4m
new file mode 100644
index 0000000..2d5753c
--- /dev/null
+++ b/dap4_test/baseline/test_enum_2.nc.d4m
@@ -0,0 +1,16 @@
+netcdf test_enum_2 {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: h {
+  variables:
+  	cloud_class_t primary_cloud ;
+  		cloud_class_t primary_cloud:_FillValue = Missing ;
+  } // group h
+}
diff --git a/dap4_test/baseline/test_enum_2.nc.d4p b/dap4_test/baseline/test_enum_2.nc.d4p
new file mode 100644
index 0000000..294fcd6
--- /dev/null
+++ b/dap4_test/baseline/test_enum_2.nc.d4p
@@ -0,0 +1,37 @@
+<Dataset
+   name="test_enum_2.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+  </Types>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+  <Groups>
+    <Group name="h">
+      <Variables>
+        <Enum name="primary_cloud" enum="/cloud_class_t">
+          <Attribute name="_FillValue" type="/cloud_class_t">
+            <Value value="Missing"/>
+          </Attribute>
+        </Enum>
+      </Variables>
+    </Group>
+  </Groups>
+</Dataset>
diff --git a/dap4_test/baseline/test_enum_array.4.nc.d4d b/dap4_test/baseline/test_enum_array.4.nc.d4d
new file mode 100644
index 0000000..253e668
--- /dev/null
+++ b/dap4_test/baseline/test_enum_array.4.nc.d4d
@@ -0,0 +1,19 @@
+netcdf test_enum_array.4.nc {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	cloud_class_t primary_cloud(_Anonymous2) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		string :_dap4.ce = "/primary_cloud[1:2:4]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Stratus, Cumulonimbus ;
+}
diff --git a/dap4_test/baseline/test_enum_array.4.nc.d4m b/dap4_test/baseline/test_enum_array.4.nc.d4m
new file mode 100644
index 0000000..dd9a73a
--- /dev/null
+++ b/dap4_test/baseline/test_enum_array.4.nc.d4m
@@ -0,0 +1,16 @@
+netcdf test_enum_array.4 {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	cloud_class_t primary_cloud(_Anonymous2) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		string :_dap4.ce = "/primary_cloud[1:2:4]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_enum_array.4.nc.d4p b/dap4_test/baseline/test_enum_array.4.nc.d4p
new file mode 100644
index 0000000..80486b7
--- /dev/null
+++ b/dap4_test/baseline/test_enum_array.4.nc.d4p
@@ -0,0 +1,40 @@
+<Dataset
+   name="test_enum_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous2" size="2"/>
+  </Dimensions>
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+  </Types>
+  <Variables>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+      <Dim name="/_Anonymous2"/>
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/primary_cloud[1:2:4]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_enum_array.nc.d4d b/dap4_test/baseline/test_enum_array.nc.d4d
new file mode 100644
index 0000000..0de49ca
--- /dev/null
+++ b/dap4_test/baseline/test_enum_array.nc.d4d
@@ -0,0 +1,18 @@
+netcdf test_enum_array.nc {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+	d5 = 5 ;
+variables:
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/baseline/test_enum_array.nc.d4m b/dap4_test/baseline/test_enum_array.nc.d4m
new file mode 100644
index 0000000..c4c35a0
--- /dev/null
+++ b/dap4_test/baseline/test_enum_array.nc.d4m
@@ -0,0 +1,15 @@
+netcdf test_enum_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+	d5 = 5 ;
+variables:
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_enum_array.nc.d4p b/dap4_test/baseline/test_enum_array.nc.d4p
new file mode 100644
index 0000000..5580855
--- /dev/null
+++ b/dap4_test/baseline/test_enum_array.nc.d4p
@@ -0,0 +1,37 @@
+<Dataset
+   name="test_enum_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d5" size="5"/>
+  </Dimensions>
+  <Types>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+      <EnumConst name="Clear" value="0"/>
+      <EnumConst name="Cumulonimbus" value="1"/>
+      <EnumConst name="Stratus" value="2"/>
+      <EnumConst name="Stratocumulus" value="3"/>
+      <EnumConst name="Cumulus" value="4"/>
+      <EnumConst name="Altostratus" value="5"/>
+      <EnumConst name="Nimbostratus" value="6"/>
+      <EnumConst name="Altocumulus" value="7"/>
+      <EnumConst name="Cirrostratus" value="8"/>
+      <EnumConst name="Cirrocumulus" value="9"/>
+      <EnumConst name="Cirrus" value="10"/>
+      <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+  </Types>
+  <Variables>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+      <Dim name="/d5"/>
+      <Attribute name="_FillValue" type="/cloud_class_t">
+        <Value value="Missing"/>
+      </Attribute>
+    </Enum>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_fill.nc.d4d b/dap4_test/baseline/test_fill.nc.d4d
new file mode 100644
index 0000000..44b0342
--- /dev/null
+++ b/dap4_test/baseline/test_fill.nc.d4d
@@ -0,0 +1,17 @@
+netcdf test_fill.nc {
+variables:
+	ubyte uv8 ;
+	short v16 ;
+	uint uv32 ;
+		uv32:_FillValue = 17U ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ uv8 = 240 ;
+
+ v16 = 32700 ;
+
+ uv32 = 111000 ;
+}
diff --git a/dap4_test/baseline/test_fill.nc.d4m b/dap4_test/baseline/test_fill.nc.d4m
new file mode 100644
index 0000000..6de6e86
--- /dev/null
+++ b/dap4_test/baseline/test_fill.nc.d4m
@@ -0,0 +1,10 @@
+netcdf test_fill {
+variables:
+	ubyte uv8 ;
+	short v16 ;
+	uint uv32 ;
+		uv32:_FillValue = 17U ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_fill.nc.d4p b/dap4_test/baseline/test_fill.nc.d4p
new file mode 100644
index 0000000..69888ee
--- /dev/null
+++ b/dap4_test/baseline/test_fill.nc.d4p
@@ -0,0 +1,19 @@
+<Dataset
+   name="test_fill.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Variables>
+    <UInt8 name="uv8"/>
+    <Int16 name="v16"/>
+    <UInt32 name="uv32">
+      <Attribute name="_FillValue" type="UInt32">
+        <Value value="17"/>
+      </Attribute>
+    </UInt32>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_groups1.nc.d4d b/dap4_test/baseline/test_groups1.nc.d4d
new file mode 100644
index 0000000..7cf38d7
--- /dev/null
+++ b/dap4_test/baseline/test_groups1.nc.d4d
@@ -0,0 +1,38 @@
+netcdf test_groups1.nc {
+dimensions:
+	dim1 = 5 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: g {
+  dimensions:
+  	dim2 = 3 ;
+
+  group: h {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v2(dim2) ;
+    data:
+
+     v1 = -876354855, -1761252264, 1723477387, -46827465, 1475147969 ;
+
+     v2 = 12, -100, _ ;
+    } // group h
+
+  group: i {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v3(dim3) ;
+    data:
+
+     v1 = 2, 3, 5, 7, 11 ;
+
+     v3 = 23, 29, 19, 31, 17, 37, 13 ;
+    } // group i
+  } // group g
+}
diff --git a/dap4_test/baseline/test_groups1.nc.d4m b/dap4_test/baseline/test_groups1.nc.d4m
new file mode 100644
index 0000000..f7b09cf
--- /dev/null
+++ b/dap4_test/baseline/test_groups1.nc.d4m
@@ -0,0 +1,28 @@
+netcdf test_groups1 {
+dimensions:
+	dim1 = 5 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: g {
+  dimensions:
+  	dim2 = 3 ;
+
+  group: h {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v2(dim2) ;
+    } // group h
+
+  group: i {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v3(dim3) ;
+    } // group i
+  } // group g
+}
diff --git a/dap4_test/baseline/test_groups1.nc.d4p b/dap4_test/baseline/test_groups1.nc.d4p
new file mode 100644
index 0000000..62f773b
--- /dev/null
+++ b/dap4_test/baseline/test_groups1.nc.d4p
@@ -0,0 +1,48 @@
+<Dataset
+   name="test_groups1.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="dim1" size="5"/>
+  </Dimensions>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+  <Groups>
+    <Group name="g">
+      <Dimensions>
+        <Dimension name="dim2" size="3"/>
+      </Dimensions>
+      <Groups>
+        <Group name="h">
+          <Dimensions>
+            <Dimension name="dim3" size="7"/>
+          </Dimensions>
+          <Variables>
+            <Int32 name="v1">
+              <Dim name="/dim1"/>
+            </Int32>
+            <Float32 name="v2">
+              <Dim name="/g/dim2"/>
+            </Float32>
+          </Variables>
+        </Group>
+        <Group name="i">
+          <Dimensions>
+            <Dimension name="dim3" size="7"/>
+          </Dimensions>
+          <Variables>
+            <Int32 name="v1">
+              <Dim name="/dim1"/>
+            </Int32>
+            <Float32 name="v3">
+              <Dim name="/g/i/dim3"/>
+            </Float32>
+          </Variables>
+        </Group>
+      </Groups>
+    </Group>
+  </Groups>
+</Dataset>
diff --git a/dap4_test/baseline/test_one_var.nc.d4d b/dap4_test/baseline/test_one_var.nc.d4d
new file mode 100644
index 0000000..9795d0c
--- /dev/null
+++ b/dap4_test/baseline/test_one_var.nc.d4d
@@ -0,0 +1,10 @@
+netcdf test_one_var.nc {
+variables:
+	int t ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17 ;
+}
diff --git a/dap4_test/baseline/test_one_var.nc.d4m b/dap4_test/baseline/test_one_var.nc.d4m
new file mode 100644
index 0000000..0346f7f
--- /dev/null
+++ b/dap4_test/baseline/test_one_var.nc.d4m
@@ -0,0 +1,7 @@
+netcdf test_one_var {
+variables:
+	int t ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_one_var.nc.d4p b/dap4_test/baseline/test_one_var.nc.d4p
new file mode 100644
index 0000000..64fb251
--- /dev/null
+++ b/dap4_test/baseline/test_one_var.nc.d4p
@@ -0,0 +1,13 @@
+<Dataset
+   name="test_one_var.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Variables>
+    <Int32 name="t"/>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_one_vararray.1.nc.d4d b/dap4_test/baseline/test_one_vararray.1.nc.d4d
new file mode 100644
index 0000000..e042b26
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.1.nc.d4d
@@ -0,0 +1,13 @@
+netcdf test_one_vararray.1.nc {
+dimensions:
+	_Anonymous1 = 1 ;
+variables:
+	int t(_Anonymous1) ;
+
+// global attributes:
+		string :_dap4.ce = "/t[1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 37 ;
+}
diff --git a/dap4_test/baseline/test_one_vararray.1.nc.d4m b/dap4_test/baseline/test_one_vararray.1.nc.d4m
new file mode 100644
index 0000000..88290bc
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.1.nc.d4m
@@ -0,0 +1,10 @@
+netcdf test_one_vararray.1 {
+dimensions:
+	_Anonymous1 = 1 ;
+variables:
+	int t(_Anonymous1) ;
+
+// global attributes:
+		string :_dap4.ce = "/t[1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_one_vararray.1.nc.d4p b/dap4_test/baseline/test_one_vararray.1.nc.d4p
new file mode 100644
index 0000000..dad2145
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.1.nc.d4p
@@ -0,0 +1,21 @@
+<Dataset
+   name="test_one_vararray.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous1" size="1"/>
+  </Dimensions>
+  <Variables>
+    <Int32 name="t">
+      <Dim name="/_Anonymous1"/>
+    </Int32>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/t[1]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_one_vararray.3.nc.d4d b/dap4_test/baseline/test_one_vararray.3.nc.d4d
new file mode 100644
index 0000000..45f229c
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.3.nc.d4d
@@ -0,0 +1,13 @@
+netcdf test_one_vararray.3.nc {
+dimensions:
+	d2 = 2 ;
+variables:
+	int t(d2) ;
+
+// global attributes:
+		string :_dap4.ce = "/t[0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17, 37 ;
+}
diff --git a/dap4_test/baseline/test_one_vararray.3.nc.d4m b/dap4_test/baseline/test_one_vararray.3.nc.d4m
new file mode 100644
index 0000000..c4a0e23
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.3.nc.d4m
@@ -0,0 +1,10 @@
+netcdf test_one_vararray.3 {
+dimensions:
+	d2 = 2 ;
+variables:
+	int t(d2) ;
+
+// global attributes:
+		string :_dap4.ce = "/t[0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_one_vararray.3.nc.d4p b/dap4_test/baseline/test_one_vararray.3.nc.d4p
new file mode 100644
index 0000000..1cc5864
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.3.nc.d4p
@@ -0,0 +1,21 @@
+<Dataset
+   name="test_one_vararray.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d2" size="2"/>
+  </Dimensions>
+  <Variables>
+    <Int32 name="t">
+      <Dim name="/d2"/>
+    </Int32>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/t[0:1]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_one_vararray.nc.d4d b/dap4_test/baseline/test_one_vararray.nc.d4d
new file mode 100644
index 0000000..adb28b4
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.nc.d4d
@@ -0,0 +1,12 @@
+netcdf test_one_vararray.nc {
+dimensions:
+	d2 = 2 ;
+variables:
+	int t(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17, 37 ;
+}
diff --git a/dap4_test/baseline/test_one_vararray.nc.d4m b/dap4_test/baseline/test_one_vararray.nc.d4m
new file mode 100644
index 0000000..b2ea8b4
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.nc.d4m
@@ -0,0 +1,9 @@
+netcdf test_one_vararray {
+dimensions:
+	d2 = 2 ;
+variables:
+	int t(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_one_vararray.nc.d4p b/dap4_test/baseline/test_one_vararray.nc.d4p
new file mode 100644
index 0000000..5c111c3
--- /dev/null
+++ b/dap4_test/baseline/test_one_vararray.nc.d4p
@@ -0,0 +1,18 @@
+<Dataset
+   name="test_one_vararray.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d2" size="2"/>
+  </Dimensions>
+  <Variables>
+    <Int32 name="t">
+      <Dim name="/d2"/>
+    </Int32>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_opaque.nc.d4d b/dap4_test/baseline/test_opaque.nc.d4d
new file mode 100644
index 0000000..ca99e61
--- /dev/null
+++ b/dap4_test/baseline/test_opaque.nc.d4d
@@ -0,0 +1,12 @@
+netcdf test_opaque.nc {
+types:
+  ubyte(*) _bytestring ;
+variables:
+	_bytestring vo1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo1 = {1, 35, 69, 103, 137, 171, 205, 239} ;
+}
diff --git a/dap4_test/baseline/test_opaque.nc.d4m b/dap4_test/baseline/test_opaque.nc.d4m
new file mode 100644
index 0000000..2e33c70
--- /dev/null
+++ b/dap4_test/baseline/test_opaque.nc.d4m
@@ -0,0 +1,9 @@
+netcdf test_opaque {
+types:
+  opaque(8) opaque8_t ;
+variables:
+	opaque8_t vo1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_opaque.nc.d4p b/dap4_test/baseline/test_opaque.nc.d4p
new file mode 100644
index 0000000..43a4016
--- /dev/null
+++ b/dap4_test/baseline/test_opaque.nc.d4p
@@ -0,0 +1,13 @@
+<Dataset
+   name="test_opaque.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Variables>
+    <Opaque name="vo1" type="/opaque8_t"/>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_opaque_array.7.nc.d4d b/dap4_test/baseline/test_opaque_array.7.nc.d4d
new file mode 100644
index 0000000..e4b99b8
--- /dev/null
+++ b/dap4_test/baseline/test_opaque_array.7.nc.d4d
@@ -0,0 +1,18 @@
+netcdf test_opaque_array.7.nc {
+types:
+  ubyte(*) _bytestring ;
+dimensions:
+	_Anonymous1 = 1 ;
+	_Anonymous2 = 2 ;
+variables:
+	_bytestring vo2(_Anonymous1, _Anonymous2) ;
+
+// global attributes:
+		string :_dap4.ce = "/vo2[1][0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo2 =
+  {254, 220, 186, 152, 118, 84, 50, 16}, 
+    {254, 220, 186, 153, 153, 153, 153, 153} ;
+}
diff --git a/dap4_test/baseline/test_opaque_array.7.nc.d4m b/dap4_test/baseline/test_opaque_array.7.nc.d4m
new file mode 100644
index 0000000..f01183f
--- /dev/null
+++ b/dap4_test/baseline/test_opaque_array.7.nc.d4m
@@ -0,0 +1,13 @@
+netcdf test_opaque_array.7 {
+types:
+  opaque(8) opaque8_t ;
+dimensions:
+	_Anonymous1 = 1 ;
+	_Anonymous2 = 2 ;
+variables:
+	opaque8_t vo2(_Anonymous1, _Anonymous2) ;
+
+// global attributes:
+		string :_dap4.ce = "/vo2[1][0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_opaque_array.7.nc.d4p b/dap4_test/baseline/test_opaque_array.7.nc.d4p
new file mode 100644
index 0000000..0a886bf
--- /dev/null
+++ b/dap4_test/baseline/test_opaque_array.7.nc.d4p
@@ -0,0 +1,23 @@
+<Dataset
+   name="test_opaque_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous1" size="1"/>
+    <Dimension name="_Anonymous2" size="2"/>
+  </Dimensions>
+  <Variables>
+    <Opaque name="vo2" type="/opaque8_t">
+      <Dim name="/_Anonymous1"/>
+      <Dim name="/_Anonymous2"/>
+    </Opaque>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/vo2[1][0:1]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_opaque_array.nc.d4d b/dap4_test/baseline/test_opaque_array.nc.d4d
new file mode 100644
index 0000000..fd154a7
--- /dev/null
+++ b/dap4_test/baseline/test_opaque_array.nc.d4d
@@ -0,0 +1,17 @@
+netcdf test_opaque_array.nc {
+types:
+  ubyte(*) _bytestring ;
+dimensions:
+	d2 = 2 ;
+variables:
+	_bytestring vo2(d2, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo2 =
+  {1, 35, 69, 103, 137, 171, 205, 239}, {171, 205, 239, 0, 0, 0, 0, 0},
+  {254, 220, 186, 152, 118, 84, 50, 16}, 
+    {254, 220, 186, 153, 153, 153, 153, 153} ;
+}
diff --git a/dap4_test/baseline/test_opaque_array.nc.d4m b/dap4_test/baseline/test_opaque_array.nc.d4m
new file mode 100644
index 0000000..f1cd2eb
--- /dev/null
+++ b/dap4_test/baseline/test_opaque_array.nc.d4m
@@ -0,0 +1,11 @@
+netcdf test_opaque_array {
+types:
+  opaque(8) opaque8_t ;
+dimensions:
+	d2 = 2 ;
+variables:
+	opaque8_t vo2(d2, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_opaque_array.nc.d4p b/dap4_test/baseline/test_opaque_array.nc.d4p
new file mode 100644
index 0000000..7f177db
--- /dev/null
+++ b/dap4_test/baseline/test_opaque_array.nc.d4p
@@ -0,0 +1,19 @@
+<Dataset
+   name="test_opaque_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d2" size="2"/>
+  </Dimensions>
+  <Variables>
+    <Opaque name="vo2" type="/opaque8_t">
+      <Dim name="/d2"/>
+      <Dim name="/d2"/>
+    </Opaque>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_sequence_1.syn.d4d b/dap4_test/baseline/test_sequence_1.syn.d4d
new file mode 100644
index 0000000..9ddfc09
--- /dev/null
+++ b/dap4_test/baseline/test_sequence_1.syn.d4d
@@ -0,0 +1,16 @@
+netcdf test_sequence_1.syn {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+variables:
+	s_t s ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {{-920699049, 896}} ;
+}
diff --git a/dap4_test/baseline/test_sequence_1.syn.d4m b/dap4_test/baseline/test_sequence_1.syn.d4m
new file mode 100644
index 0000000..66c5b9d
--- /dev/null
+++ b/dap4_test/baseline/test_sequence_1.syn.d4m
@@ -0,0 +1,13 @@
+netcdf test_sequence_1 {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+variables:
+	s_t s ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_sequence_1.syn.d4p b/dap4_test/baseline/test_sequence_1.syn.d4p
new file mode 100644
index 0000000..21204db
--- /dev/null
+++ b/dap4_test/baseline/test_sequence_1.syn.d4p
@@ -0,0 +1,20 @@
+<Dataset
+   name="test_sequence_1.syn"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Structure name="s_base">
+      <Int32 name="i1"/>
+      <Int16 name="sh1"/>
+    </Structure>
+    <Vlen name="s_t" type="/s_base"/>
+  </Types>
+  <Variables>
+    <Seq name="s" type="/s_t"/>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_sequence_2.syn.d4d b/dap4_test/baseline/test_sequence_2.syn.d4d
new file mode 100644
index 0000000..fc45319
--- /dev/null
+++ b/dap4_test/baseline/test_sequence_2.syn.d4d
@@ -0,0 +1,19 @@
+netcdf test_sequence_2.syn {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	s_t s(_Anonymous2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {{-920699049, 896}}, 
+    {{-1123468835, -18686}, {2125143125, -21899}, {1268468519, -22144}, {989876086, 3361}} ;
+}
diff --git a/dap4_test/baseline/test_sequence_2.syn.d4m b/dap4_test/baseline/test_sequence_2.syn.d4m
new file mode 100644
index 0000000..531aff2
--- /dev/null
+++ b/dap4_test/baseline/test_sequence_2.syn.d4m
@@ -0,0 +1,15 @@
+netcdf test_sequence_2 {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	s_t s(_Anonymous2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_sequence_2.syn.d4p b/dap4_test/baseline/test_sequence_2.syn.d4p
new file mode 100644
index 0000000..12168b2
--- /dev/null
+++ b/dap4_test/baseline/test_sequence_2.syn.d4p
@@ -0,0 +1,25 @@
+<Dataset
+   name="test_sequence_2.syn"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous2" size="2"/>
+  </Dimensions>
+  <Types>
+    <Structure name="s_base">
+      <Int32 name="i1"/>
+      <Int16 name="sh1"/>
+    </Structure>
+    <Vlen name="s_t" type="/s_base"/>
+  </Types>
+  <Variables>
+    <Seq name="s" type="/s_t">
+      <Dim name="/_Anonymous2"/>
+    </Sequence>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_struct1.nc.d4d b/dap4_test/baseline/test_struct1.nc.d4d
new file mode 100644
index 0000000..04629a0
--- /dev/null
+++ b/dap4_test/baseline/test_struct1.nc.d4d
@@ -0,0 +1,16 @@
+netcdf test_struct1.nc {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {1, -2} ;
+}
diff --git a/dap4_test/baseline/test_struct1.nc.d4m b/dap4_test/baseline/test_struct1.nc.d4m
new file mode 100644
index 0000000..bbc5834
--- /dev/null
+++ b/dap4_test/baseline/test_struct1.nc.d4m
@@ -0,0 +1,13 @@
+netcdf test_struct1 {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_struct1.nc.d4p b/dap4_test/baseline/test_struct1.nc.d4p
new file mode 100644
index 0000000..6d366ba
--- /dev/null
+++ b/dap4_test/baseline/test_struct1.nc.d4p
@@ -0,0 +1,22 @@
+<Dataset
+   name="test_struct1.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Structure name="s">
+      <Int32 name="x"/>
+      <Int32 name="y"/>
+    </Structure>
+  </Types>
+  <Variables>
+    <Struct name="s" type="/s">
+      <Map name="/s.x"/>
+      <Map name="/s.y"/>
+    </Struct>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_struct_array.6.nc.d4d b/dap4_test/baseline/test_struct_array.6.nc.d4d
new file mode 100644
index 0000000..3eb90c3
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.6.nc.d4d
@@ -0,0 +1,21 @@
+netcdf test_struct_array.6.nc {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	s_t s(_Anonymous2, _Anonymous2) ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		string :_dap4.ce = "/s[0:2:3][0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s =
+  {1, -1}, {17, 37},
+  {-4, 12}, {-8, 8} ;
+}
diff --git a/dap4_test/baseline/test_struct_array.6.nc.d4m b/dap4_test/baseline/test_struct_array.6.nc.d4m
new file mode 100644
index 0000000..a8e60a0
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.6.nc.d4m
@@ -0,0 +1,16 @@
+netcdf test_struct_array.6 {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	s_t s(_Anonymous2, _Anonymous2) ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		string :_dap4.ce = "/s[0:2:3][0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_struct_array.6.nc.d4p b/dap4_test/baseline/test_struct_array.6.nc.d4p
new file mode 100644
index 0000000..e73b6e0
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.6.nc.d4p
@@ -0,0 +1,30 @@
+<Dataset
+   name="test_struct_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous2" size="2"/>
+  </Dimensions>
+  <Types>
+    <Structure name="s">
+      <Int32 name="x"/>
+      <Int32 name="y"/>
+    </Structure>
+  </Types>
+  <Variables>
+    <Struct name="s" type="/s">
+      <Dim name="/_Anonymous2"/>
+      <Dim name="/_Anonymous2"/>
+      <Map name="/s.x"/>
+      <Map name="/s.y"/>
+    </Struct>
+  </Variables>
+  <Attribute name="_dap4.ce" type="String">
+    <Value value="/s[0:2:3][0:1]"/>
+  </Attribute>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_struct_array.nc.d4d b/dap4_test/baseline/test_struct_array.nc.d4d
new file mode 100644
index 0000000..dd8c2f2
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.nc.d4d
@@ -0,0 +1,23 @@
+netcdf test_struct_array.nc {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	s_t s(dx, dy) ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s =
+  {1, -1}, {17, 37}, {-32767, 32767},
+  {-1, 3}, {-2, 2}, {-3, 1},
+  {-4, 12}, {-8, 8}, {-12, 4},
+  {-5, 15}, {-10, 10}, {-15, 5} ;
+}
diff --git a/dap4_test/baseline/test_struct_array.nc.d4m b/dap4_test/baseline/test_struct_array.nc.d4m
new file mode 100644
index 0000000..cef0d70
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.nc.d4m
@@ -0,0 +1,16 @@
+netcdf test_struct_array {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	s_t s(dx, dy) ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_struct_array.nc.d4p b/dap4_test/baseline/test_struct_array.nc.d4p
new file mode 100644
index 0000000..e8c31f3
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.nc.d4p
@@ -0,0 +1,28 @@
+<Dataset
+   name="test_struct_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="dx" size="4"/>
+    <Dimension name="dy" size="3"/>
+  </Dimensions>
+  <Types>
+    <Structure name="s">
+      <Int32 name="x"/>
+      <Int32 name="y"/>
+    </Structure>
+  </Types>
+  <Variables>
+    <Struct name="s" type="/s">
+      <Dim name="/dx"/>
+      <Dim name="/dy"/>
+      <Map name="/s.x"/>
+      <Map name="/s.y"/>
+    </Struct>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_struct_array.syn.d4d b/dap4_test/baseline/test_struct_array.syn.d4d
new file mode 100644
index 0000000..75958ba
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.syn.d4d
@@ -0,0 +1,31 @@
+netcdf test_struct_array.syn {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	float z(dx) ;
+	float t(dy) ;
+	s_t s(dx, dy) ;
+		string s:_edu.ucar.maps = "/z", "/t" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ z = 0.7276533, 0.785633, 0.513679, 0.2468447 ;
+
+ t = 0.738422, 0.2148887, 0.4947984 ;
+
+ s =
+  {712320147, 1268468519}, {696298400, 989876086}, {-1927163883, -900795134},
+  {-708236713, 1377500019}, {511843988, 1699265896}, {-540214433, -914532520},
+  {-1344032615, -871416961}, {-1928735161, 935744880}, 
+    {-1509955773, -1707460853},
+  {1145911788, -415231529}, {-278269626, -1682978013}, 
+    {-1629885665, -909240754} ;
+}
diff --git a/dap4_test/baseline/test_struct_array.syn.d4m b/dap4_test/baseline/test_struct_array.syn.d4m
new file mode 100644
index 0000000..39c68c2
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.syn.d4m
@@ -0,0 +1,18 @@
+netcdf test_struct_array {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	float z(dx) ;
+	float t(dy) ;
+	s_t s(dx, dy) ;
+		string s:_edu.ucar.maps = "/z", "/t" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_struct_array.syn.d4p b/dap4_test/baseline/test_struct_array.syn.d4p
new file mode 100644
index 0000000..9edc326
--- /dev/null
+++ b/dap4_test/baseline/test_struct_array.syn.d4p
@@ -0,0 +1,34 @@
+<Dataset
+   name="test_struct_array.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="dx" size="4"/>
+    <Dimension name="dy" size="3"/>
+  </Dimensions>
+  <Types>
+    <Structure name="s">
+      <Int32 name="x"/>
+      <Int32 name="y"/>
+    </Structure>
+  </Types>
+  <Variables>
+    <Float32 name="z">
+      <Dim name="/dx"/>
+    </Float32>
+    <Float32 name="t">
+      <Dim name="/dy"/>
+    </Float32>
+    <Struct name="s" type="/s">
+      <Dim name="/dx"/>
+      <Dim name="/dy"/>
+      <Map name="/z"/>
+      <Map name="/t"/>
+    </Struct>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_struct_nested.nc.d4d b/dap4_test/baseline/test_struct_nested.nc.d4d
new file mode 100644
index 0000000..d14fb5f
--- /dev/null
+++ b/dap4_test/baseline/test_struct_nested.nc.d4d
@@ -0,0 +1,24 @@
+netcdf test_struct_nested.nc {
+types:
+  compound x_field1_t {
+    int x ;
+    int y ;
+  }; // x_field1_t
+  compound x_field2_t {
+    int x ;
+    int y ;
+  }; // x_field2_t
+  compound x_t {
+    x_field1_t field1 ;
+    x_field1_t field2 ;
+  }; // x_t
+variables:
+	x_t x ;
+		string x:_edu.ucar.maps = "/x_field1.x", "/x_field1.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{1, -2}, {255, 90}} ;
+}
diff --git a/dap4_test/baseline/test_struct_nested.nc.d4m b/dap4_test/baseline/test_struct_nested.nc.d4m
new file mode 100644
index 0000000..0a8fb60
--- /dev/null
+++ b/dap4_test/baseline/test_struct_nested.nc.d4m
@@ -0,0 +1,21 @@
+netcdf test_struct_nested {
+types:
+  compound x_field1_t {
+    int x ;
+    int y ;
+  }; // x_field1_t
+  compound x_field2_t {
+    int x ;
+    int y ;
+  }; // x_field2_t
+  compound x_t {
+    x_field1_t field1 ;
+    x_field1_t field2 ;
+  }; // x_t
+variables:
+	x_t x ;
+		string x:_edu.ucar.maps = "/x_field1.x", "/x_field1.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_struct_nested.nc.d4p b/dap4_test/baseline/test_struct_nested.nc.d4p
new file mode 100644
index 0000000..91c3d5d
--- /dev/null
+++ b/dap4_test/baseline/test_struct_nested.nc.d4p
@@ -0,0 +1,30 @@
+<Dataset
+   name="test_struct_nested.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Structure name="x">
+      <Struct name="field1" type="/x_field1"/>
+      <Struct name="field2" type="/x_field2"/>
+    </Structure>
+    <Structure name="x_field1">
+      <Int32 name="x"/>
+      <Int32 name="y"/>
+    </Structure>
+    <Structure name="x_field2">
+      <Int32 name="x"/>
+      <Int32 name="y"/>
+    </Structure>
+  </Types>
+  <Variables>
+    <Struct name="x" type="/x">
+      <Map name="/x_field1.x"/>
+      <Map name="/x_field1.y"/>
+    </Struct>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_struct_nested3.nc.d4d b/dap4_test/baseline/test_struct_nested3.nc.d4d
new file mode 100644
index 0000000..5a523ee
--- /dev/null
+++ b/dap4_test/baseline/test_struct_nested3.nc.d4d
@@ -0,0 +1,20 @@
+netcdf test_struct_nested3.nc {
+types:
+  compound x_field3_field2_t {
+    int field1 ;
+  }; // x_field3_field2_t
+  compound x_field3_t {
+    x_field3_field2_t field2 ;
+  }; // x_field3_t
+  compound x_t {
+    x_field3_t field3 ;
+  }; // x_t
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{{17}}} ;
+}
diff --git a/dap4_test/baseline/test_struct_nested3.nc.d4m b/dap4_test/baseline/test_struct_nested3.nc.d4m
new file mode 100644
index 0000000..8b711ab
--- /dev/null
+++ b/dap4_test/baseline/test_struct_nested3.nc.d4m
@@ -0,0 +1,17 @@
+netcdf test_struct_nested3 {
+types:
+  compound x_field3_field2_t {
+    int field1 ;
+  }; // x_field3_field2_t
+  compound x_field3_t {
+    x_field3_field2_t field2 ;
+  }; // x_field3_t
+  compound x_t {
+    x_field3_t field3 ;
+  }; // x_t
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_struct_nested3.nc.d4p b/dap4_test/baseline/test_struct_nested3.nc.d4p
new file mode 100644
index 0000000..a4e797b
--- /dev/null
+++ b/dap4_test/baseline/test_struct_nested3.nc.d4p
@@ -0,0 +1,24 @@
+<Dataset
+   name="test_struct_nested3.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Structure name="x">
+      <Struct name="field3" type="/x_field3"/>
+    </Structure>
+    <Structure name="x_field3">
+      <Struct name="field2" type="/x_field3_field2"/>
+    </Structure>
+    <Structure name="x_field3_field2">
+      <Int32 name="field1"/>
+    </Structure>
+  </Types>
+  <Variables>
+    <Struct name="x" type="/x"/>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_struct_type.nc.d4d b/dap4_test/baseline/test_struct_type.nc.d4d
new file mode 100644
index 0000000..1f8395f
--- /dev/null
+++ b/dap4_test/baseline/test_struct_type.nc.d4d
@@ -0,0 +1,16 @@
+netcdf test_struct_type.nc {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {1, -2} ;
+}
diff --git a/dap4_test/baseline/test_struct_type.nc.d4m b/dap4_test/baseline/test_struct_type.nc.d4m
new file mode 100644
index 0000000..941d72e
--- /dev/null
+++ b/dap4_test/baseline/test_struct_type.nc.d4m
@@ -0,0 +1,13 @@
+netcdf test_struct_type {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_struct_type.nc.d4p b/dap4_test/baseline/test_struct_type.nc.d4p
new file mode 100644
index 0000000..ddb2fda
--- /dev/null
+++ b/dap4_test/baseline/test_struct_type.nc.d4p
@@ -0,0 +1,22 @@
+<Dataset
+   name="test_struct_type.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Structure name="s">
+      <Int32 name="x"/>
+      <Int32 name="y"/>
+    </Structure>
+  </Types>
+  <Variables>
+    <Struct name="s" type="/s">
+      <Map name="/s.x"/>
+      <Map name="/s.y"/>
+    </Struct>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_unlim1.nc.d4d b/dap4_test/baseline/test_unlim1.nc.d4d
new file mode 100644
index 0000000..9c64842
--- /dev/null
+++ b/dap4_test/baseline/test_unlim1.nc.d4d
@@ -0,0 +1,36 @@
+netcdf test_unlim1.nc {
+dimensions:
+	lat = 3 ;
+	lon = 2 ;
+	time = UNLIMITED ; // (2 currently)
+variables:
+	float lat(lat) ;
+		string lat:units = "degrees_north" ;
+	float lon(lon) ;
+		string lon:units = "degrees_east" ;
+	double time(time) ;
+		string time:units = "seconds since 2009-01-01" ;
+	float pr(time, lat, lon) ;
+		string pr:standard_name = "air_pressure_at_sea_level" ;
+		string pr:units = "hPa" ;
+		string pr:_edu.ucar.maps = "/time", "/lat", "/lon" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+		string :title = "example for workshop" ;
+data:
+
+ lat = _, _, _ ;
+
+ lon = _, _ ;
+
+ time = _, _ ;
+
+ pr =
+  0, 1,
+  2, 3,
+  4, 5,
+  10, 11,
+  12, 13,
+  14, 15 ;
+}
diff --git a/dap4_test/baseline/test_unlim1.nc.d4m b/dap4_test/baseline/test_unlim1.nc.d4m
new file mode 100644
index 0000000..75f56fd
--- /dev/null
+++ b/dap4_test/baseline/test_unlim1.nc.d4m
@@ -0,0 +1,21 @@
+netcdf test_unlim1 {
+dimensions:
+	lat = 3 ;
+	lon = 2 ;
+	time = UNLIMITED ; // (0 currently)	
+variables:
+	float lat(lat) ;
+		string lat:units = "degrees_north" ;
+	float lon(lon) ;
+		string lon:units = "degrees_east" ;
+	double time(time) ;
+		string time:units = "seconds since 2009-01-01" ;
+	float pr(time, lat, lon) ;
+		string pr:standard_name = "air_pressure_at_sea_level" ;
+		string pr:units = "hPa" ;
+		string pr:_edu.ucar.maps = "/time", "/lat", "/lon" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+		string :title = "example for workshop" ;
+}
diff --git a/dap4_test/baseline/test_unlim1.nc.d4p b/dap4_test/baseline/test_unlim1.nc.d4p
new file mode 100644
index 0000000..7e66bef
--- /dev/null
+++ b/dap4_test/baseline/test_unlim1.nc.d4p
@@ -0,0 +1,52 @@
+<Dataset
+   name="test_unlim1.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="lat" size="3"/>
+    <Dimension name="lon" size="2"/>
+    <Dimension name="time" size="2" _edu.ucar.isunlimited="1"/>
+  </Dimensions>
+  <Variables>
+    <Float32 name="lat">
+      <Dim name="/lat"/>
+      <Attribute name="units" type="String">
+        <Value value="degrees_north"/>
+      </Attribute>
+    </Float32>
+    <Float32 name="lon">
+      <Dim name="/lon"/>
+      <Attribute name="units" type="String">
+        <Value value="degrees_east"/>
+      </Attribute>
+    </Float32>
+    <Float64 name="time">
+      <Dim name="/time"/>
+      <Attribute name="units" type="String">
+        <Value value="seconds since 2009-01-01"/>
+      </Attribute>
+    </Float64>
+    <Float32 name="pr">
+      <Dim name="/time"/>
+      <Dim name="/lat"/>
+      <Dim name="/lon"/>
+      <Map name="/time"/>
+      <Map name="/lat"/>
+      <Map name="/lon"/>
+      <Attribute name="standard_name" type="String">
+        <Value value="air_pressure_at_sea_level"/>
+      </Attribute>
+      <Attribute name="units" type="String">
+        <Value value="hPa"/>
+      </Attribute>
+    </Float32>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+  <Attribute name="title" type="String">
+    <Value value="example for workshop"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_utf8.nc.d4d b/dap4_test/baseline/test_utf8.nc.d4d
new file mode 100644
index 0000000..0ca491f
--- /dev/null
+++ b/dap4_test/baseline/test_utf8.nc.d4d
@@ -0,0 +1,12 @@
+netcdf test_utf8.nc {
+dimensions:
+	d2 = 2 ;
+variables:
+	string vs(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vs = "Καλημέα", "abc" ;
+}
diff --git a/dap4_test/baseline/test_utf8.nc.d4m b/dap4_test/baseline/test_utf8.nc.d4m
new file mode 100644
index 0000000..74d749d
--- /dev/null
+++ b/dap4_test/baseline/test_utf8.nc.d4m
@@ -0,0 +1,9 @@
+netcdf test_utf8 {
+dimensions:
+	d2 = 2 ;
+variables:
+	string vs(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_utf8.nc.d4p b/dap4_test/baseline/test_utf8.nc.d4p
new file mode 100644
index 0000000..1f4cf84
--- /dev/null
+++ b/dap4_test/baseline/test_utf8.nc.d4p
@@ -0,0 +1,18 @@
+<Dataset
+   name="test_utf8.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d2" size="2"/>
+  </Dimensions>
+  <Variables>
+    <String name="vs">
+      <Dim name="/d2"/>
+    </String>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen1.nc.d4d b/dap4_test/baseline/test_vlen1.nc.d4d
new file mode 100644
index 0000000..cd81284
--- /dev/null
+++ b/dap4_test/baseline/test_vlen1.nc.d4d
@@ -0,0 +1,15 @@
+netcdf test_vlen1.nc {
+types:
+  compound x_base_t {
+    int x ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{1}, {3}, {5}, {7}} ;
+}
diff --git a/dap4_test/baseline/test_vlen1.nc.d4m b/dap4_test/baseline/test_vlen1.nc.d4m
new file mode 100644
index 0000000..bb7df1f
--- /dev/null
+++ b/dap4_test/baseline/test_vlen1.nc.d4m
@@ -0,0 +1,12 @@
+netcdf test_vlen1 {
+types:
+  compound x_base_t {
+    int x ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen1.nc.d4p b/dap4_test/baseline/test_vlen1.nc.d4p
new file mode 100644
index 0000000..163e146
--- /dev/null
+++ b/dap4_test/baseline/test_vlen1.nc.d4p
@@ -0,0 +1,19 @@
+<Dataset
+   name="test_vlen1.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Structure name="x_base">
+      <Int32 name="x"/>
+    </Structure>
+    <Vlen name="x_t" type="/x_base"/>
+  </Types>
+  <Variables>
+    <Seq name="x" type="/x_t"/>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen2.nc.d4d b/dap4_test/baseline/test_vlen2.nc.d4d
new file mode 100644
index 0000000..d534c51
--- /dev/null
+++ b/dap4_test/baseline/test_vlen2.nc.d4d
@@ -0,0 +1,21 @@
+netcdf test_vlen2.nc {
+types:
+  compound x_base_t {
+    int x ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+dimensions:
+	d3 = 3 ;
+	d2 = 2 ;
+variables:
+	x_t x(d3, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x =
+  {{1}, {3}, {5}, {7}}, {{100}, {200}},
+  {{-1}, {-2}}, {{1}, {3}, {5}, {7}},
+  {{100}, {200}}, {{-1}, {-2}} ;
+}
diff --git a/dap4_test/baseline/test_vlen2.nc.d4m b/dap4_test/baseline/test_vlen2.nc.d4m
new file mode 100644
index 0000000..b1c8393
--- /dev/null
+++ b/dap4_test/baseline/test_vlen2.nc.d4m
@@ -0,0 +1,15 @@
+netcdf test_vlen2 {
+types:
+  compound x_base_t {
+    int x ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+dimensions:
+	d3 = 3 ;
+	d2 = 2 ;
+variables:
+	x_t x(d3, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen2.nc.d4p b/dap4_test/baseline/test_vlen2.nc.d4p
new file mode 100644
index 0000000..c7078e3
--- /dev/null
+++ b/dap4_test/baseline/test_vlen2.nc.d4p
@@ -0,0 +1,26 @@
+<Dataset
+   name="test_vlen2.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d3" size="3"/>
+    <Dimension name="d2" size="2"/>
+  </Dimensions>
+  <Types>
+    <Structure name="x_base">
+      <Int32 name="x"/>
+    </Structure>
+    <Vlen name="x_t" type="/x_base"/>
+  </Types>
+  <Variables>
+    <Seq name="x" type="/x_t">
+      <Dim name="/d3"/>
+      <Dim name="/d2"/>
+    </Sequence>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen3.nc.d4d b/dap4_test/baseline/test_vlen3.nc.d4d
new file mode 100644
index 0000000..8e66d90
--- /dev/null
+++ b/dap4_test/baseline/test_vlen3.nc.d4d
@@ -0,0 +1,18 @@
+netcdf test_vlen3.nc {
+types:
+  compound v1_f1_base_t {
+    int f1 ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1 ;
+  }; // v1_t
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}} ;
+}
diff --git a/dap4_test/baseline/test_vlen3.nc.d4m b/dap4_test/baseline/test_vlen3.nc.d4m
new file mode 100644
index 0000000..216b9db
--- /dev/null
+++ b/dap4_test/baseline/test_vlen3.nc.d4m
@@ -0,0 +1,15 @@
+netcdf test_vlen3 {
+types:
+  compound v1_f1_base_t {
+    int f1 ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1 ;
+  }; // v1_t
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen3.nc.d4p b/dap4_test/baseline/test_vlen3.nc.d4p
new file mode 100644
index 0000000..c487633
--- /dev/null
+++ b/dap4_test/baseline/test_vlen3.nc.d4p
@@ -0,0 +1,22 @@
+<Dataset
+   name="test_vlen3.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Types>
+    <Structure name="v1">
+      <Seq name="f1" type="/v1_f1_t"/>
+    </Structure>
+    <Structure name="v1_f1_base">
+      <Int32 name="f1"/>
+    </Structure>
+    <Vlen name="v1_f1_t" type="/v1_f1_base"/>
+  </Types>
+  <Variables>
+    <Struct name="v1" type="/v1"/>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen4.nc.d4d b/dap4_test/baseline/test_vlen4.nc.d4d
new file mode 100644
index 0000000..9745c33
--- /dev/null
+++ b/dap4_test/baseline/test_vlen4.nc.d4d
@@ -0,0 +1,20 @@
+netcdf test_vlen4.nc {
+types:
+  compound v1_f1_base_t {
+    int f1 ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1(2) ;
+  }; // v1_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{{1}, {3}, {5}, {7}}, {}}} ;
+}
diff --git a/dap4_test/baseline/test_vlen4.nc.d4m b/dap4_test/baseline/test_vlen4.nc.d4m
new file mode 100644
index 0000000..223ceca
--- /dev/null
+++ b/dap4_test/baseline/test_vlen4.nc.d4m
@@ -0,0 +1,17 @@
+netcdf test_vlen4 {
+types:
+  compound v1_f1_base_t {
+    int f1 ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1(2) ;
+  }; // v1_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen4.nc.d4p b/dap4_test/baseline/test_vlen4.nc.d4p
new file mode 100644
index 0000000..ae36a83
--- /dev/null
+++ b/dap4_test/baseline/test_vlen4.nc.d4p
@@ -0,0 +1,27 @@
+<Dataset
+   name="test_vlen4.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="_Anonymous2" size="2"/>
+  </Dimensions>
+  <Types>
+    <Structure name="v1">
+      <Seq name="f1" type="/v1_f1_t">
+        <Dim name="/_Anonymous2"/>
+      </Sequence>
+    </Structure>
+    <Structure name="v1_f1_base">
+      <Int32 name="f1"/>
+    </Structure>
+    <Vlen name="v1_f1_t" type="/v1_f1_base"/>
+  </Types>
+  <Variables>
+    <Struct name="v1" type="/v1"/>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen5.nc.d4d b/dap4_test/baseline/test_vlen5.nc.d4d
new file mode 100644
index 0000000..28907b8
--- /dev/null
+++ b/dap4_test/baseline/test_vlen5.nc.d4d
@@ -0,0 +1,20 @@
+netcdf test_vlen5.nc {
+types:
+  compound v1_v_base_t {
+    int v ;
+  }; // v1_v_base_t
+  v1_v_base_t(*) v1_v_t ;
+  compound v1_t {
+    v1_v_t v ;
+  }; // v1_t
+dimensions:
+	d2 = 2 ;
+variables:
+	v1_t v1(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}}, {{{100}, {200}}} ;
+}
diff --git a/dap4_test/baseline/test_vlen5.nc.d4m b/dap4_test/baseline/test_vlen5.nc.d4m
new file mode 100644
index 0000000..86bc126
--- /dev/null
+++ b/dap4_test/baseline/test_vlen5.nc.d4m
@@ -0,0 +1,17 @@
+netcdf test_vlen5 {
+types:
+  compound v1_v_base_t {
+    int v ;
+  }; // v1_v_base_t
+  v1_v_base_t(*) v1_v_t ;
+  compound v1_t {
+    v1_v_t v ;
+  }; // v1_t
+dimensions:
+	d2 = 2 ;
+variables:
+	v1_t v1(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen5.nc.d4p b/dap4_test/baseline/test_vlen5.nc.d4p
new file mode 100644
index 0000000..b357c78
--- /dev/null
+++ b/dap4_test/baseline/test_vlen5.nc.d4p
@@ -0,0 +1,27 @@
+<Dataset
+   name="test_vlen5.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d2" size="2"/>
+  </Dimensions>
+  <Types>
+    <Structure name="v1">
+      <Seq name="v" type="/v1_v_t"/>
+    </Structure>
+    <Structure name="v1_v_base">
+      <Int32 name="v"/>
+    </Structure>
+    <Vlen name="v1_v_t" type="/v1_v_base"/>
+  </Types>
+  <Variables>
+    <Struct name="v1" type="/v1">
+      <Dim name="/d2"/>
+    </Struct>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen6.nc.d4d b/dap4_test/baseline/test_vlen6.nc.d4d
new file mode 100644
index 0000000..b6512a5
--- /dev/null
+++ b/dap4_test/baseline/test_vlen6.nc.d4d
@@ -0,0 +1,17 @@
+netcdf test_vlen6.nc {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 2 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{1}, {3}, {5}, {7}}, {{17}, {19}} ;
+}
diff --git a/dap4_test/baseline/test_vlen6.nc.d4m b/dap4_test/baseline/test_vlen6.nc.d4m
new file mode 100644
index 0000000..30f62cc
--- /dev/null
+++ b/dap4_test/baseline/test_vlen6.nc.d4m
@@ -0,0 +1,14 @@
+netcdf test_vlen6 {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 2 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen6.nc.d4p b/dap4_test/baseline/test_vlen6.nc.d4p
new file mode 100644
index 0000000..30adfef
--- /dev/null
+++ b/dap4_test/baseline/test_vlen6.nc.d4p
@@ -0,0 +1,24 @@
+<Dataset
+   name="test_vlen6.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d" size="2"/>
+  </Dimensions>
+  <Types>
+    <Structure name="v1_base">
+      <Int32 name="v1"/>
+    </Structure>
+    <Vlen name="v1_t" type="/v1_base"/>
+  </Types>
+  <Variables>
+    <Seq name="v1" type="/v1_t">
+      <Dim name="/d"/>
+    </Sequence>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen7.nc.d4d b/dap4_test/baseline/test_vlen7.nc.d4d
new file mode 100644
index 0000000..9c90401
--- /dev/null
+++ b/dap4_test/baseline/test_vlen7.nc.d4d
@@ -0,0 +1,17 @@
+netcdf test_vlen7.nc {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 1 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{17}, {19}, {21}} ;
+}
diff --git a/dap4_test/baseline/test_vlen7.nc.d4m b/dap4_test/baseline/test_vlen7.nc.d4m
new file mode 100644
index 0000000..b2c712f
--- /dev/null
+++ b/dap4_test/baseline/test_vlen7.nc.d4m
@@ -0,0 +1,14 @@
+netcdf test_vlen7 {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 1 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen7.nc.d4p b/dap4_test/baseline/test_vlen7.nc.d4p
new file mode 100644
index 0000000..edbb420
--- /dev/null
+++ b/dap4_test/baseline/test_vlen7.nc.d4p
@@ -0,0 +1,24 @@
+<Dataset
+   name="test_vlen7.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d" size="1"/>
+  </Dimensions>
+  <Types>
+    <Structure name="v1_base">
+      <Int32 name="v1"/>
+    </Structure>
+    <Vlen name="v1_t" type="/v1_base"/>
+  </Types>
+  <Variables>
+    <Seq name="v1" type="/v1_t">
+      <Dim name="/d"/>
+    </Sequence>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/dap4_test/baseline/test_vlen8.nc.d4d b/dap4_test/baseline/test_vlen8.nc.d4d
new file mode 100644
index 0000000..54320e5
--- /dev/null
+++ b/dap4_test/baseline/test_vlen8.nc.d4d
@@ -0,0 +1,20 @@
+netcdf test_vlen8.nc {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d1 = 2 ;
+	d2 = 2 ;
+variables:
+	v1_t v1(d1, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 =
+  {{1}, {3}, {5}, {7}}, {{17}, {19}},
+  {{11}, {33}, {55}, {77}}, {{717}, {919}} ;
+}
diff --git a/dap4_test/baseline/test_vlen8.nc.d4m b/dap4_test/baseline/test_vlen8.nc.d4m
new file mode 100644
index 0000000..240b646
--- /dev/null
+++ b/dap4_test/baseline/test_vlen8.nc.d4m
@@ -0,0 +1,15 @@
+netcdf test_vlen8 {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d1 = 2 ;
+	d2 = 2 ;
+variables:
+	v1_t v1(d1, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+}
diff --git a/dap4_test/baseline/test_vlen8.nc.d4p b/dap4_test/baseline/test_vlen8.nc.d4p
new file mode 100644
index 0000000..58ae8a6
--- /dev/null
+++ b/dap4_test/baseline/test_vlen8.nc.d4p
@@ -0,0 +1,26 @@
+<Dataset
+   name="test_vlen8.nc"
+   dapVersion="4.0"
+   dmrVersion="1.0"
+   xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+   xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+  <Dimensions>
+    <Dimension name="d1" size="2"/>
+    <Dimension name="d2" size="2"/>
+  </Dimensions>
+  <Types>
+    <Structure name="v1_base">
+      <Int32 name="v1"/>
+    </Structure>
+    <Vlen name="v1_t" type="/v1_base"/>
+  </Types>
+  <Variables>
+    <Seq name="v1" type="/v1_t">
+      <Dim name="/d1"/>
+      <Dim name="/d2"/>
+    </Sequence>
+  </Variables>
+  <Attribute name="_DAP4_Little_Endian" type="UInt8">
+    <Value value="1"/>
+  </Attribute>
+</Dataset>
diff --git a/ncdap_test/expectremote4/CMakeLists.txt b/dap4_test/baselineraw/CMakeLists.txt
similarity index 100%
rename from ncdap_test/expectremote4/CMakeLists.txt
rename to dap4_test/baselineraw/CMakeLists.txt
diff --git a/dap4_test/baselineraw/test_anon_dim.2.syn.dmp b/dap4_test/baselineraw/test_anon_dim.2.syn.dmp
new file mode 100644
index 0000000..d9c1056
--- /dev/null
+++ b/dap4_test/baselineraw/test_anon_dim.2.syn.dmp
@@ -0,0 +1,13 @@
+netcdf test_anon_dim.2 {
+dimensions:
+	_Anonymous4 = 4 ;
+variables:
+	int vu32(_Anonymous4) ;
+
+// global attributes:
+		string :_dap4.ce = "/vu32[0:3]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu32 = -1169720286, -920699049, -2088732436, 1060190036 ;
+}
diff --git a/dap4_test/baselineraw/test_anon_dim.syn.dmp b/dap4_test/baselineraw/test_anon_dim.syn.dmp
new file mode 100644
index 0000000..f441649
--- /dev/null
+++ b/dap4_test/baselineraw/test_anon_dim.syn.dmp
@@ -0,0 +1,13 @@
+netcdf test_anon_dim {
+dimensions:
+	_Anonymous6 = 6 ;
+variables:
+	int vu32(_Anonymous6) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu32 = -1169720286, -920699049, -2088732436, 1060190036, -1123468835, 
+    922940053 ;
+}
diff --git a/dap4_test/baselineraw/test_atomic_array.5.nc.dmp b/dap4_test/baselineraw/test_atomic_array.5.nc.dmp
new file mode 100644
index 0000000..7083d0f
--- /dev/null
+++ b/dap4_test/baselineraw/test_atomic_array.5.nc.dmp
@@ -0,0 +1,28 @@
+netcdf test_atomic_array.5 {
+types:
+  ubyte(*) _bytestring ;
+dimensions:
+	_Anonymous1 = 1 ;
+	_Anonymous2 = 2 ;
+variables:
+	ubyte vu8(_Anonymous1, _Anonymous2) ;
+	double vd(_Anonymous1) ;
+	string vs(_Anonymous1, _Anonymous1) ;
+	_bytestring vo(_Anonymous1, _Anonymous1) ;
+
+// global attributes:
+		string :_dap4.ce = "/vu8[1][0:2:2];/vd[1];/vs[1][0];/vo[0][1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  3, 5 ;
+
+ vd = 1024.8 ;
+
+ vs =
+  "Καλημέα" ;
+
+ vo =
+  {171, 205, 239, 0, 0, 0, 0, 0} ;
+}
diff --git a/dap4_test/baselineraw/test_atomic_array.8.nc.dmp b/dap4_test/baselineraw/test_atomic_array.8.nc.dmp
new file mode 100644
index 0000000..cef5bb9
--- /dev/null
+++ b/dap4_test/baselineraw/test_atomic_array.8.nc.dmp
@@ -0,0 +1,13 @@
+netcdf test_atomic_array.8 {
+dimensions:
+	_Anonymous3 = 3 ;
+variables:
+	short v16(_Anonymous3) ;
+
+// global attributes:
+		string :_dap4.ce = "/v16[0:1,3]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v16 = 1, 2, 4 ;
+}
diff --git a/dap4_test/baselineraw/test_atomic_array.9.nc.dmp b/dap4_test/baselineraw/test_atomic_array.9.nc.dmp
new file mode 100644
index 0000000..e54e10d
--- /dev/null
+++ b/dap4_test/baselineraw/test_atomic_array.9.nc.dmp
@@ -0,0 +1,13 @@
+netcdf test_atomic_array.9 {
+dimensions:
+	_Anonymous3 = 3 ;
+variables:
+	short v16(_Anonymous3) ;
+
+// global attributes:
+		string :_dap4.ce = "/v16[3,0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v16 = 4, 1, 2 ;
+}
diff --git a/dap4_test/baselineraw/test_atomic_array.nc.dmp b/dap4_test/baselineraw/test_atomic_array.nc.dmp
new file mode 100644
index 0000000..0f77610
--- /dev/null
+++ b/dap4_test/baselineraw/test_atomic_array.nc.dmp
@@ -0,0 +1,51 @@
+netcdf test_atomic_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	_bytestring vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  255, 1, 2,
+  3, 4, 5 ;
+
+ v16 = 1, 2, 3, 4 ;
+
+ vu32 =
+  5, 4, 3,
+  2, 1, 0 ;
+
+ vd = 17.9, 1024.8 ;
+
+ vc = "@&" ;
+
+ vs =
+  "hello\tworld", "\r\n",
+  "Καλημέα", "abc" ;
+
+ vo =
+  {1, 35, 69, 103, 137, 171, 205, 239}, {171, 205, 239, 0, 0, 0, 0, 0} ;
+
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/baselineraw/test_atomic_array.syn.dmp b/dap4_test/baselineraw/test_atomic_array.syn.dmp
new file mode 100644
index 0000000..e3ec0a3
--- /dev/null
+++ b/dap4_test/baselineraw/test_atomic_array.syn.dmp
@@ -0,0 +1,54 @@
+netcdf test_atomic_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	_bytestring vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  186, 201, 131,
+  63, 189, 55 ;
+
+ v16 = -341, -21899, -13413, -22144 ;
+
+ vu32 =
+  2367803413, 3586730583, 511843988,
+  3754752863, 2950934681, 2366232135 ;
+
+ vd = 0.217870081192792, 0.602450791996768 ;
+
+ vc = "CO" ;
+
+ vs =
+  "{S", "gb8^OE$",
+  "4a/q%n9;5Y", "{fIl?T\"\\A[" ;
+
+ vo =
+  
+    {162, 23, 122, 167, 40, 124, 4, 250, 139, 181, 123, 205, 247, 110, 200, 15}, 
+    {52, 250, 71, 42, 169, 64, 77, 213, 67, 20, 60, 173, 237, 48, 58, 117} ;
+
+ primary_cloud = Stratus, Cirrocumulus, Nimbostratus, Cirrostratus, 
+    Stratocumulus ;
+}
diff --git a/dap4_test/baselineraw/test_atomic_types.nc.dmp b/dap4_test/baselineraw/test_atomic_types.nc.dmp
new file mode 100644
index 0000000..a15308e
--- /dev/null
+++ b/dap4_test/baselineraw/test_atomic_types.nc.dmp
@@ -0,0 +1,60 @@
+netcdf test_atomic_types {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	_bytestring vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v8 = -128 ;
+
+ vu8 = 255 ;
+
+ v16 = -32768 ;
+
+ vu16 = _ ;
+
+ v32 = 2147483647 ;
+
+ vu32 = _ ;
+
+ v64 = 9223372036854775807 ;
+
+ vu64 = 18446744073709551615 ;
+
+ vf = 3.141593 ;
+
+ vd = 3.14159265358979 ;
+
+ vc = "@" ;
+
+ vs = "hello\tworld" ;
+
+ vo = {1, 35, 69, 103, 137, 171, 205, 239} ;
+
+ primary_cloud = Stratus ;
+
+ secondary_cloud = _ ;
+}
diff --git a/dap4_test/baselineraw/test_atomic_types.syn.dmp b/dap4_test/baselineraw/test_atomic_types.syn.dmp
new file mode 100644
index 0000000..1968c82
--- /dev/null
+++ b/dap4_test/baselineraw/test_atomic_types.syn.dmp
@@ -0,0 +1,61 @@
+netcdf test_atomic_types {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	_bytestring vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v8 = 58 ;
+
+ vu8 = 201 ;
+
+ v16 = 896 ;
+
+ vu16 = 16177 ;
+
+ v32 = -1123468835 ;
+
+ vu32 = 2125143125 ;
+
+ v64 = 3059391736915381031 ;
+
+ vu64 = 11577488182652895291 ;
+
+ vf = 0.5512972 ;
+
+ vd = 0.790267301128816 ;
+
+ vc = "*" ;
+
+ vs = "O,L?c8A%V" ;
+
+ vo = 
+    {70, 241, 105, 239, 35, 203, 175, 155, 31, 235, 217, 158, 78, 22, 206, 201} ;
+
+ primary_cloud = Altocumulus ;
+
+ secondary_cloud = Stratocumulus ;
+}
diff --git a/dap4_test/baselineraw/test_enum.nc.dmp b/dap4_test/baselineraw/test_enum.nc.dmp
new file mode 100644
index 0000000..03d15f8
--- /dev/null
+++ b/dap4_test/baselineraw/test_enum.nc.dmp
@@ -0,0 +1,16 @@
+netcdf test_enum {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+variables:
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Stratus ;
+}
diff --git a/dap4_test/baselineraw/test_enum_2.nc.dmp b/dap4_test/baselineraw/test_enum_2.nc.dmp
new file mode 100644
index 0000000..f1e0e47
--- /dev/null
+++ b/dap4_test/baselineraw/test_enum_2.nc.dmp
@@ -0,0 +1,19 @@
+netcdf test_enum_2 {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: h {
+  variables:
+  	cloud_class_t primary_cloud ;
+  		cloud_class_t primary_cloud:_FillValue = Missing ;
+  data:
+
+   primary_cloud = Stratus ;
+  } // group h
+}
diff --git a/dap4_test/baselineraw/test_enum_array.4.nc.dmp b/dap4_test/baselineraw/test_enum_array.4.nc.dmp
new file mode 100644
index 0000000..3143d79
--- /dev/null
+++ b/dap4_test/baselineraw/test_enum_array.4.nc.dmp
@@ -0,0 +1,19 @@
+netcdf test_enum_array.4 {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	cloud_class_t primary_cloud(_Anonymous2) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		string :_dap4.ce = "/primary_cloud[1:2:4]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Stratus, Cumulonimbus ;
+}
diff --git a/dap4_test/baselineraw/test_enum_array.nc.dmp b/dap4_test/baselineraw/test_enum_array.nc.dmp
new file mode 100644
index 0000000..e84c50d
--- /dev/null
+++ b/dap4_test/baselineraw/test_enum_array.nc.dmp
@@ -0,0 +1,18 @@
+netcdf test_enum_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+	d5 = 5 ;
+variables:
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/baselineraw/test_fill.nc.dmp b/dap4_test/baselineraw/test_fill.nc.dmp
new file mode 100644
index 0000000..36a1974
--- /dev/null
+++ b/dap4_test/baselineraw/test_fill.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_fill {
+variables:
+	ubyte uv8 ;
+	short v16 ;
+	uint uv32 ;
+		uv32:_FillValue = 17U ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ uv8 = 240 ;
+
+ v16 = 32700 ;
+
+ uv32 = 111000 ;
+}
diff --git a/dap4_test/baselineraw/test_groups1.nc.dmp b/dap4_test/baselineraw/test_groups1.nc.dmp
new file mode 100644
index 0000000..99c7aca
--- /dev/null
+++ b/dap4_test/baselineraw/test_groups1.nc.dmp
@@ -0,0 +1,38 @@
+netcdf test_groups1 {
+dimensions:
+	dim1 = 5 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: g {
+  dimensions:
+  	dim2 = 3 ;
+
+  group: h {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v2(dim2) ;
+    data:
+
+     v1 = -876354855, -1761252264, 1723477387, -46827465, 1475147969 ;
+
+     v2 = 12, -100, _ ;
+    } // group h
+
+  group: i {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v3(dim3) ;
+    data:
+
+     v1 = 2, 3, 5, 7, 11 ;
+
+     v3 = 23, 29, 19, 31, 17, 37, 13 ;
+    } // group i
+  } // group g
+}
diff --git a/dap4_test/baselineraw/test_one_var.nc.dmp b/dap4_test/baselineraw/test_one_var.nc.dmp
new file mode 100644
index 0000000..cd2315d
--- /dev/null
+++ b/dap4_test/baselineraw/test_one_var.nc.dmp
@@ -0,0 +1,10 @@
+netcdf test_one_var {
+variables:
+	int t ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17 ;
+}
diff --git a/dap4_test/baselineraw/test_one_vararray.1.nc.dmp b/dap4_test/baselineraw/test_one_vararray.1.nc.dmp
new file mode 100644
index 0000000..7cc7a83
--- /dev/null
+++ b/dap4_test/baselineraw/test_one_vararray.1.nc.dmp
@@ -0,0 +1,13 @@
+netcdf test_one_vararray.1 {
+dimensions:
+	_Anonymous1 = 1 ;
+variables:
+	int t(_Anonymous1) ;
+
+// global attributes:
+		string :_dap4.ce = "/t[1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 37 ;
+}
diff --git a/dap4_test/baselineraw/test_one_vararray.3.nc.dmp b/dap4_test/baselineraw/test_one_vararray.3.nc.dmp
new file mode 100644
index 0000000..00386a3
--- /dev/null
+++ b/dap4_test/baselineraw/test_one_vararray.3.nc.dmp
@@ -0,0 +1,13 @@
+netcdf test_one_vararray.3 {
+dimensions:
+	d2 = 2 ;
+variables:
+	int t(d2) ;
+
+// global attributes:
+		string :_dap4.ce = "/t[0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17, 37 ;
+}
diff --git a/dap4_test/baselineraw/test_one_vararray.nc.dmp b/dap4_test/baselineraw/test_one_vararray.nc.dmp
new file mode 100644
index 0000000..4417d9a
--- /dev/null
+++ b/dap4_test/baselineraw/test_one_vararray.nc.dmp
@@ -0,0 +1,12 @@
+netcdf test_one_vararray {
+dimensions:
+	d2 = 2 ;
+variables:
+	int t(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17, 37 ;
+}
diff --git a/dap4_test/baselineraw/test_opaque.nc.dmp b/dap4_test/baselineraw/test_opaque.nc.dmp
new file mode 100644
index 0000000..033779e
--- /dev/null
+++ b/dap4_test/baselineraw/test_opaque.nc.dmp
@@ -0,0 +1,12 @@
+netcdf test_opaque {
+types:
+  ubyte(*) _bytestring ;
+variables:
+	_bytestring vo1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo1 = {1, 35, 69, 103, 137, 171, 205, 239} ;
+}
diff --git a/dap4_test/baselineraw/test_opaque_array.7.nc.dmp b/dap4_test/baselineraw/test_opaque_array.7.nc.dmp
new file mode 100644
index 0000000..4b6ac39
--- /dev/null
+++ b/dap4_test/baselineraw/test_opaque_array.7.nc.dmp
@@ -0,0 +1,18 @@
+netcdf test_opaque_array.7 {
+types:
+  ubyte(*) _bytestring ;
+dimensions:
+	_Anonymous1 = 1 ;
+	_Anonymous2 = 2 ;
+variables:
+	_bytestring vo2(_Anonymous1, _Anonymous2) ;
+
+// global attributes:
+		string :_dap4.ce = "/vo2[1][0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo2 =
+  {254, 220, 186, 152, 118, 84, 50, 16}, 
+    {254, 220, 186, 153, 153, 153, 153, 153} ;
+}
diff --git a/dap4_test/baselineraw/test_opaque_array.nc.dmp b/dap4_test/baselineraw/test_opaque_array.nc.dmp
new file mode 100644
index 0000000..e913077
--- /dev/null
+++ b/dap4_test/baselineraw/test_opaque_array.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_opaque_array {
+types:
+  ubyte(*) _bytestring ;
+dimensions:
+	d2 = 2 ;
+variables:
+	_bytestring vo2(d2, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo2 =
+  {1, 35, 69, 103, 137, 171, 205, 239}, {171, 205, 239, 0, 0, 0, 0, 0},
+  {254, 220, 186, 152, 118, 84, 50, 16}, 
+    {254, 220, 186, 153, 153, 153, 153, 153} ;
+}
diff --git a/dap4_test/baselineraw/test_sequence_1.syn.dmp b/dap4_test/baselineraw/test_sequence_1.syn.dmp
new file mode 100644
index 0000000..01bdce6
--- /dev/null
+++ b/dap4_test/baselineraw/test_sequence_1.syn.dmp
@@ -0,0 +1,16 @@
+netcdf test_sequence_1 {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+variables:
+	s_t s ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {{-920699049, 896}} ;
+}
diff --git a/dap4_test/baselineraw/test_sequence_2.syn.dmp b/dap4_test/baselineraw/test_sequence_2.syn.dmp
new file mode 100644
index 0000000..4919d95
--- /dev/null
+++ b/dap4_test/baselineraw/test_sequence_2.syn.dmp
@@ -0,0 +1,19 @@
+netcdf test_sequence_2 {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	s_t s(_Anonymous2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {{-920699049, 896}}, 
+    {{-1123468835, -18686}, {2125143125, -21899}, {1268468519, -22144}, {989876086, 3361}} ;
+}
diff --git a/dap4_test/baselineraw/test_struct1.nc.dmp b/dap4_test/baselineraw/test_struct1.nc.dmp
new file mode 100644
index 0000000..e946f81
--- /dev/null
+++ b/dap4_test/baselineraw/test_struct1.nc.dmp
@@ -0,0 +1,16 @@
+netcdf test_struct1 {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {1, -2} ;
+}
diff --git a/dap4_test/baselineraw/test_struct_array.6.nc.dmp b/dap4_test/baselineraw/test_struct_array.6.nc.dmp
new file mode 100644
index 0000000..f5d79b2
--- /dev/null
+++ b/dap4_test/baselineraw/test_struct_array.6.nc.dmp
@@ -0,0 +1,21 @@
+netcdf test_struct_array.6 {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	s_t s(_Anonymous2, _Anonymous2) ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		string :_dap4.ce = "/s[0:2:3][0:1]" ;
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s =
+  {1, -1}, {17, 37},
+  {-4, 12}, {-8, 8} ;
+}
diff --git a/dap4_test/baselineraw/test_struct_array.nc.dmp b/dap4_test/baselineraw/test_struct_array.nc.dmp
new file mode 100644
index 0000000..0199c48
--- /dev/null
+++ b/dap4_test/baselineraw/test_struct_array.nc.dmp
@@ -0,0 +1,23 @@
+netcdf test_struct_array {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	s_t s(dx, dy) ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s =
+  {1, -1}, {17, 37}, {-32767, 32767},
+  {-1, 3}, {-2, 2}, {-3, 1},
+  {-4, 12}, {-8, 8}, {-12, 4},
+  {-5, 15}, {-10, 10}, {-15, 5} ;
+}
diff --git a/dap4_test/baselineraw/test_struct_array.syn.dmp b/dap4_test/baselineraw/test_struct_array.syn.dmp
new file mode 100644
index 0000000..8fcf876
--- /dev/null
+++ b/dap4_test/baselineraw/test_struct_array.syn.dmp
@@ -0,0 +1,31 @@
+netcdf test_struct_array {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	float z(dx) ;
+	float t(dy) ;
+	s_t s(dx, dy) ;
+		string s:_edu.ucar.maps = "/z", "/t" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ z = 0.7276533, 0.785633, 0.513679, 0.2468447 ;
+
+ t = 0.738422, 0.2148887, 0.4947984 ;
+
+ s =
+  {712320147, 1268468519}, {696298400, 989876086}, {-1927163883, -900795134},
+  {-708236713, 1377500019}, {511843988, 1699265896}, {-540214433, -914532520},
+  {-1344032615, -871416961}, {-1928735161, 935744880}, 
+    {-1509955773, -1707460853},
+  {1145911788, -415231529}, {-278269626, -1682978013}, 
+    {-1629885665, -909240754} ;
+}
diff --git a/dap4_test/baselineraw/test_struct_nested.nc.dmp b/dap4_test/baselineraw/test_struct_nested.nc.dmp
new file mode 100644
index 0000000..9f3eda9
--- /dev/null
+++ b/dap4_test/baselineraw/test_struct_nested.nc.dmp
@@ -0,0 +1,24 @@
+netcdf test_struct_nested {
+types:
+  compound x_field1_t {
+    int x ;
+    int y ;
+  }; // x_field1_t
+  compound x_field2_t {
+    int x ;
+    int y ;
+  }; // x_field2_t
+  compound x_t {
+    x_field1_t field1 ;
+    x_field2_t field2 ;
+  }; // x_t
+variables:
+	x_t x ;
+		string x:_edu.ucar.maps = "/x_field1.x", "/x_field1.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{1, -2}, {255, 90}} ;
+}
diff --git a/dap4_test/baselineraw/test_struct_nested3.nc.dmp b/dap4_test/baselineraw/test_struct_nested3.nc.dmp
new file mode 100644
index 0000000..6d45724
--- /dev/null
+++ b/dap4_test/baselineraw/test_struct_nested3.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_struct_nested3 {
+types:
+  compound x_field3_field2_t {
+    int field1 ;
+  }; // x_field3_field2_t
+  compound x_field3_t {
+    x_field3_field2_t field2 ;
+  }; // x_field3_t
+  compound x_t {
+    x_field3_t field3 ;
+  }; // x_t
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{{17}}} ;
+}
diff --git a/dap4_test/baselineraw/test_struct_type.nc.dmp b/dap4_test/baselineraw/test_struct_type.nc.dmp
new file mode 100644
index 0000000..e37f3e2
--- /dev/null
+++ b/dap4_test/baselineraw/test_struct_type.nc.dmp
@@ -0,0 +1,16 @@
+netcdf test_struct_type {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+		string s:_edu.ucar.maps = "/s.x", "/s.y" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {1, -2} ;
+}
diff --git a/dap4_test/baselineraw/test_unlim1.nc.dmp b/dap4_test/baselineraw/test_unlim1.nc.dmp
new file mode 100644
index 0000000..9f28f20
--- /dev/null
+++ b/dap4_test/baselineraw/test_unlim1.nc.dmp
@@ -0,0 +1,36 @@
+netcdf test_unlim1 {
+dimensions:
+	lat = 3 ;
+	lon = 2 ;
+	time = UNLIMITED ; // (2 currently)
+variables:
+	float lat(lat) ;
+		string lat:units = "degrees_north" ;
+	float lon(lon) ;
+		string lon:units = "degrees_east" ;
+	double time(time) ;
+		string time:units = "seconds since 2009-01-01" ;
+	float pr(time, lat, lon) ;
+		string pr:standard_name = "air_pressure_at_sea_level" ;
+		string pr:units = "hPa" ;
+		string pr:_edu.ucar.maps = "/time", "/lat", "/lon" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+		string :title = "example for workshop" ;
+data:
+
+ lat = _, _, _ ;
+
+ lon = _, _ ;
+
+ time = _, _ ;
+
+ pr =
+  0, 1,
+  2, 3,
+  4, 5,
+  10, 11,
+  12, 13,
+  14, 15 ;
+}
diff --git a/dap4_test/baselineraw/test_utf8.nc.dmp b/dap4_test/baselineraw/test_utf8.nc.dmp
new file mode 100644
index 0000000..385a629
--- /dev/null
+++ b/dap4_test/baselineraw/test_utf8.nc.dmp
@@ -0,0 +1,12 @@
+netcdf test_utf8 {
+dimensions:
+	d2 = 2 ;
+variables:
+	string vs(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vs = "Καλημέα", "abc" ;
+}
diff --git a/dap4_test/baselineraw/test_vlen1.nc.dmp b/dap4_test/baselineraw/test_vlen1.nc.dmp
new file mode 100644
index 0000000..c96dcce
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen1.nc.dmp
@@ -0,0 +1,15 @@
+netcdf test_vlen1 {
+types:
+  compound x_base_t {
+    int x ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{1}, {3}, {5}, {7}} ;
+}
diff --git a/dap4_test/baselineraw/test_vlen2.nc.dmp b/dap4_test/baselineraw/test_vlen2.nc.dmp
new file mode 100644
index 0000000..5d79fb5
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen2.nc.dmp
@@ -0,0 +1,21 @@
+netcdf test_vlen2 {
+types:
+  compound x_base_t {
+    int x ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+dimensions:
+	d3 = 3 ;
+	d2 = 2 ;
+variables:
+	x_t x(d3, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x =
+  {{1}, {3}, {5}, {7}}, {{100}, {200}},
+  {{-1}, {-2}}, {{1}, {3}, {5}, {7}},
+  {{100}, {200}}, {{-1}, {-2}} ;
+}
diff --git a/dap4_test/baselineraw/test_vlen3.nc.dmp b/dap4_test/baselineraw/test_vlen3.nc.dmp
new file mode 100644
index 0000000..44e98e2
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen3.nc.dmp
@@ -0,0 +1,18 @@
+netcdf test_vlen3 {
+types:
+  compound v1_f1_base_t {
+    int f1 ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1 ;
+  }; // v1_t
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}} ;
+}
diff --git a/dap4_test/baselineraw/test_vlen4.nc.dmp b/dap4_test/baselineraw/test_vlen4.nc.dmp
new file mode 100644
index 0000000..0f79b71
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen4.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen4 {
+types:
+  compound v1_f1_base_t {
+    int f1 ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1(2) ;
+  }; // v1_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{{1}, {3}, {5}, {7}}, {}}} ;
+}
diff --git a/dap4_test/baselineraw/test_vlen5.nc.dmp b/dap4_test/baselineraw/test_vlen5.nc.dmp
new file mode 100644
index 0000000..923f707
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen5.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen5 {
+types:
+  compound v1_v_base_t {
+    int v ;
+  }; // v1_v_base_t
+  v1_v_base_t(*) v1_v_t ;
+  compound v1_t {
+    v1_v_t v ;
+  }; // v1_t
+dimensions:
+	d2 = 2 ;
+variables:
+	v1_t v1(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}}, {{{100}, {200}}} ;
+}
diff --git a/dap4_test/baselineraw/test_vlen6.nc.dmp b/dap4_test/baselineraw/test_vlen6.nc.dmp
new file mode 100644
index 0000000..4e33886
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen6.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_vlen6 {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 2 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{1}, {3}, {5}, {7}}, {{17}, {19}} ;
+}
diff --git a/dap4_test/baselineraw/test_vlen7.nc.dmp b/dap4_test/baselineraw/test_vlen7.nc.dmp
new file mode 100644
index 0000000..85b3554
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen7.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_vlen7 {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 1 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{17}, {19}, {21}} ;
+}
diff --git a/dap4_test/baselineraw/test_vlen8.nc.dmp b/dap4_test/baselineraw/test_vlen8.nc.dmp
new file mode 100644
index 0000000..9d1f4c1
--- /dev/null
+++ b/dap4_test/baselineraw/test_vlen8.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen8 {
+types:
+  compound v1_base_t {
+    int v1 ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d1 = 2 ;
+	d2 = 2 ;
+variables:
+	v1_t v1(d1, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 =
+  {{1}, {3}, {5}, {7}}, {{17}, {19}},
+  {{11}, {33}, {55}, {77}}, {{717}, {919}} ;
+}
diff --git a/ncdap_test/nocacheremote4/CMakeLists.txt b/dap4_test/baselineremote/CMakeLists.txt
similarity index 100%
rename from ncdap_test/nocacheremote4/CMakeLists.txt
rename to dap4_test/baselineremote/CMakeLists.txt
diff --git a/dap4_test/baselineremote/nc4_unsigned_types.nc.hyrax b/dap4_test/baselineremote/nc4_unsigned_types.nc.hyrax
new file mode 100644
index 0000000..5121b97
--- /dev/null
+++ b/dap4_test/baselineremote/nc4_unsigned_types.nc.hyrax
@@ -0,0 +1,53 @@
+netcdf nc4_unsigned_types {
+dimensions:
+	lat = 6 ;
+	lon = 5 ;
+	time = 2 ;
+variables:
+	int lat(lat) ;
+		string lat:units = "degrees_north" ;
+	int lon(lon) ;
+		string lon:units = "degrees_east" ;
+	int time(time) ;
+		string time:units = "seconds" ;
+	uint temp(time, lat, lon) ;
+		string temp:_edu.ucar.maps = "/time", "/lat", "/lon" ;
+	ushort rh(time, lat, lon) ;
+		rh:_FillValue = 9999US ;
+		string rh:_edu.ucar.maps = "/time", "/lat", "/lon" ;
+data:
+
+ lat = 0, 10, 20, 30, 40, 50 ;
+
+ lon = -140, -118, -96, -84, -52 ;
+
+ time = 1, 2 ;
+
+ temp =
+  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 ;
+
+ rh =
+  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 ;
+}
diff --git a/dap4_test/baselineremote/test_anon_dim.syn.dmp b/dap4_test/baselineremote/test_anon_dim.syn.dmp
new file mode 100644
index 0000000..f441649
--- /dev/null
+++ b/dap4_test/baselineremote/test_anon_dim.syn.dmp
@@ -0,0 +1,13 @@
+netcdf test_anon_dim {
+dimensions:
+	_Anonymous6 = 6 ;
+variables:
+	int vu32(_Anonymous6) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu32 = -1169720286, -920699049, -2088732436, 1060190036, -1123468835, 
+    922940053 ;
+}
diff --git a/dap4_test/baselineremote/test_atomic_array.nc.dmp b/dap4_test/baselineremote/test_atomic_array.nc.dmp
new file mode 100644
index 0000000..0f77610
--- /dev/null
+++ b/dap4_test/baselineremote/test_atomic_array.nc.dmp
@@ -0,0 +1,51 @@
+netcdf test_atomic_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	_bytestring vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  255, 1, 2,
+  3, 4, 5 ;
+
+ v16 = 1, 2, 3, 4 ;
+
+ vu32 =
+  5, 4, 3,
+  2, 1, 0 ;
+
+ vd = 17.9, 1024.8 ;
+
+ vc = "@&" ;
+
+ vs =
+  "hello\tworld", "\r\n",
+  "Καλημέα", "abc" ;
+
+ vo =
+  {1, 35, 69, 103, 137, 171, 205, 239}, {171, 205, 239, 0, 0, 0, 0, 0} ;
+
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/baselineremote/test_atomic_array.syn.dmp b/dap4_test/baselineremote/test_atomic_array.syn.dmp
new file mode 100644
index 0000000..e3ec0a3
--- /dev/null
+++ b/dap4_test/baselineremote/test_atomic_array.syn.dmp
@@ -0,0 +1,54 @@
+netcdf test_atomic_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+dimensions:
+	d1 = 1 ;
+	d2 = 2 ;
+	d3 = 3 ;
+	d4 = 4 ;
+	d5 = 5 ;
+variables:
+	ubyte vu8(d2, d3) ;
+	short v16(d4) ;
+	uint vu32(d2, d3) ;
+	double vd(d2) ;
+	char vc(d2) ;
+	string vs(d2, d2) ;
+	_bytestring vo(d1, d2) ;
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vu8 =
+  186, 201, 131,
+  63, 189, 55 ;
+
+ v16 = -341, -21899, -13413, -22144 ;
+
+ vu32 =
+  2367803413, 3586730583, 511843988,
+  3754752863, 2950934681, 2366232135 ;
+
+ vd = 0.217870081192792, 0.602450791996768 ;
+
+ vc = "CO" ;
+
+ vs =
+  "{S", "gb8^OE$",
+  "4a/q%n9;5Y", "{fIl?T\"\\A[" ;
+
+ vo =
+  
+    {162, 23, 122, 167, 40, 124, 4, 250, 139, 181, 123, 205, 247, 110, 200, 15}, 
+    {52, 250, 71, 42, 169, 64, 77, 213, 67, 20, 60, 173, 237, 48, 58, 117} ;
+
+ primary_cloud = Stratus, Cirrocumulus, Nimbostratus, Cirrostratus, 
+    Stratocumulus ;
+}
diff --git a/dap4_test/baselineremote/test_atomic_types.nc.dmp b/dap4_test/baselineremote/test_atomic_types.nc.dmp
new file mode 100644
index 0000000..a15308e
--- /dev/null
+++ b/dap4_test/baselineremote/test_atomic_types.nc.dmp
@@ -0,0 +1,60 @@
+netcdf test_atomic_types {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	_bytestring vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v8 = -128 ;
+
+ vu8 = 255 ;
+
+ v16 = -32768 ;
+
+ vu16 = _ ;
+
+ v32 = 2147483647 ;
+
+ vu32 = _ ;
+
+ v64 = 9223372036854775807 ;
+
+ vu64 = 18446744073709551615 ;
+
+ vf = 3.141593 ;
+
+ vd = 3.14159265358979 ;
+
+ vc = "@" ;
+
+ vs = "hello\tworld" ;
+
+ vo = {1, 35, 69, 103, 137, 171, 205, 239} ;
+
+ primary_cloud = Stratus ;
+
+ secondary_cloud = _ ;
+}
diff --git a/dap4_test/baselineremote/test_atomic_types.syn.dmp b/dap4_test/baselineremote/test_atomic_types.syn.dmp
new file mode 100644
index 0000000..1968c82
--- /dev/null
+++ b/dap4_test/baselineremote/test_atomic_types.syn.dmp
@@ -0,0 +1,61 @@
+netcdf test_atomic_types {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  ubyte(*) _bytestring ;
+variables:
+	byte v8 ;
+	ubyte vu8 ;
+	short v16 ;
+	ushort vu16 ;
+	int v32 ;
+	uint vu32 ;
+	int64 v64 ;
+	uint64 vu64 ;
+	float vf ;
+	double vd ;
+	char vc ;
+	string vs ;
+	_bytestring vo ;
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+	cloud_class_t secondary_cloud ;
+		cloud_class_t secondary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v8 = 58 ;
+
+ vu8 = 201 ;
+
+ v16 = 896 ;
+
+ vu16 = 16177 ;
+
+ v32 = -1123468835 ;
+
+ vu32 = 2125143125 ;
+
+ v64 = 3059391736915381031 ;
+
+ vu64 = 11577488182652895291 ;
+
+ vf = 0.5512972 ;
+
+ vd = 0.790267301128816 ;
+
+ vc = "*" ;
+
+ vs = "O,L?c8A%V" ;
+
+ vo = 
+    {70, 241, 105, 239, 35, 203, 175, 155, 31, 235, 217, 158, 78, 22, 206, 201} ;
+
+ primary_cloud = Altocumulus ;
+
+ secondary_cloud = Stratocumulus ;
+}
diff --git a/dap4_test/baselineremote/test_enum.nc.dmp b/dap4_test/baselineremote/test_enum.nc.dmp
new file mode 100644
index 0000000..03d15f8
--- /dev/null
+++ b/dap4_test/baselineremote/test_enum.nc.dmp
@@ -0,0 +1,16 @@
+netcdf test_enum {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+variables:
+	cloud_class_t primary_cloud ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Stratus ;
+}
diff --git a/dap4_test/baselineremote/test_enum_2.nc.dmp b/dap4_test/baselineremote/test_enum_2.nc.dmp
new file mode 100644
index 0000000..f1e0e47
--- /dev/null
+++ b/dap4_test/baselineremote/test_enum_2.nc.dmp
@@ -0,0 +1,19 @@
+netcdf test_enum_2 {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: h {
+  variables:
+  	cloud_class_t primary_cloud ;
+  		cloud_class_t primary_cloud:_FillValue = Missing ;
+  data:
+
+   primary_cloud = Stratus ;
+  } // group h
+}
diff --git a/dap4_test/baselineremote/test_enum_array.nc.dmp b/dap4_test/baselineremote/test_enum_array.nc.dmp
new file mode 100644
index 0000000..e84c50d
--- /dev/null
+++ b/dap4_test/baselineremote/test_enum_array.nc.dmp
@@ -0,0 +1,18 @@
+netcdf test_enum_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+	d5 = 5 ;
+variables:
+	cloud_class_t primary_cloud(d5) ;
+		cloud_class_t primary_cloud:_FillValue = Missing ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/baselineremote/test_fill.nc.dmp b/dap4_test/baselineremote/test_fill.nc.dmp
new file mode 100644
index 0000000..36a1974
--- /dev/null
+++ b/dap4_test/baselineremote/test_fill.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_fill {
+variables:
+	ubyte uv8 ;
+	short v16 ;
+	uint uv32 ;
+		uv32:_FillValue = 17U ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ uv8 = 240 ;
+
+ v16 = 32700 ;
+
+ uv32 = 111000 ;
+}
diff --git a/dap4_test/baselineremote/test_groups1.nc.dmp b/dap4_test/baselineremote/test_groups1.nc.dmp
new file mode 100644
index 0000000..99c7aca
--- /dev/null
+++ b/dap4_test/baselineremote/test_groups1.nc.dmp
@@ -0,0 +1,38 @@
+netcdf test_groups1 {
+dimensions:
+	dim1 = 5 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+
+group: g {
+  dimensions:
+  	dim2 = 3 ;
+
+  group: h {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v2(dim2) ;
+    data:
+
+     v1 = -876354855, -1761252264, 1723477387, -46827465, 1475147969 ;
+
+     v2 = 12, -100, _ ;
+    } // group h
+
+  group: i {
+    dimensions:
+    	dim3 = 7 ;
+    variables:
+    	int v1(dim1) ;
+    	float v3(dim3) ;
+    data:
+
+     v1 = 2, 3, 5, 7, 11 ;
+
+     v3 = 23, 29, 19, 31, 17, 37, 13 ;
+    } // group i
+  } // group g
+}
diff --git a/dap4_test/baselineremote/test_misc1.nc.dmp b/dap4_test/baselineremote/test_misc1.nc.dmp
new file mode 100644
index 0000000..58d6d4c
--- /dev/null
+++ b/dap4_test/baselineremote/test_misc1.nc.dmp
@@ -0,0 +1,29 @@
+netcdf test_misc1 {
+dimensions:
+	lat = 6 ;
+	lon = 4 ;
+	time = UNLIMITED ; // (0 currently)
+	unlim = UNLIMITED ; // (3 currently)
+variables:
+	float lat(lat) ;
+		lat:units = "d" ;
+	float lon(lon) ;
+		lon:units = "d" ;
+	double time(time) ;
+		time:units = "s" ;
+	float pr(time, lat, lon) ;
+		pr:standard_name = "a" ;
+		pr:units = "h" ;
+	float var(unlim) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+		:title = "e" ;
+data:
+
+ lat = _, _, _, _, _, _ ;
+
+ lon = _, _, _, _ ;
+
+ var = 0, 1, 3 ;
+}
diff --git a/dap4_test/baselineremote/test_one_var.nc.dmp b/dap4_test/baselineremote/test_one_var.nc.dmp
new file mode 100644
index 0000000..cd2315d
--- /dev/null
+++ b/dap4_test/baselineremote/test_one_var.nc.dmp
@@ -0,0 +1,10 @@
+netcdf test_one_var {
+variables:
+	int t ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17 ;
+}
diff --git a/dap4_test/baselineremote/test_one_vararray.nc.dmp b/dap4_test/baselineremote/test_one_vararray.nc.dmp
new file mode 100644
index 0000000..4417d9a
--- /dev/null
+++ b/dap4_test/baselineremote/test_one_vararray.nc.dmp
@@ -0,0 +1,12 @@
+netcdf test_one_vararray {
+dimensions:
+	d2 = 2 ;
+variables:
+	int t(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ t = 17, 37 ;
+}
diff --git a/dap4_test/baselineremote/test_opaque.nc.dmp b/dap4_test/baselineremote/test_opaque.nc.dmp
new file mode 100644
index 0000000..033779e
--- /dev/null
+++ b/dap4_test/baselineremote/test_opaque.nc.dmp
@@ -0,0 +1,12 @@
+netcdf test_opaque {
+types:
+  ubyte(*) _bytestring ;
+variables:
+	_bytestring vo1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo1 = {1, 35, 69, 103, 137, 171, 205, 239} ;
+}
diff --git a/dap4_test/baselineremote/test_opaque_array.nc.dmp b/dap4_test/baselineremote/test_opaque_array.nc.dmp
new file mode 100644
index 0000000..e913077
--- /dev/null
+++ b/dap4_test/baselineremote/test_opaque_array.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_opaque_array {
+types:
+  ubyte(*) _bytestring ;
+dimensions:
+	d2 = 2 ;
+variables:
+	_bytestring vo2(d2, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vo2 =
+  {1, 35, 69, 103, 137, 171, 205, 239}, {171, 205, 239, 0, 0, 0, 0, 0},
+  {254, 220, 186, 152, 118, 84, 50, 16}, 
+    {254, 220, 186, 153, 153, 153, 153, 153} ;
+}
diff --git a/dap4_test/baselineremote/test_sequence_1.syn.dmp b/dap4_test/baselineremote/test_sequence_1.syn.dmp
new file mode 100644
index 0000000..01bdce6
--- /dev/null
+++ b/dap4_test/baselineremote/test_sequence_1.syn.dmp
@@ -0,0 +1,16 @@
+netcdf test_sequence_1 {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+variables:
+	s_t s ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {{-920699049, 896}} ;
+}
diff --git a/dap4_test/baselineremote/test_sequence_2.syn.dmp b/dap4_test/baselineremote/test_sequence_2.syn.dmp
new file mode 100644
index 0000000..4919d95
--- /dev/null
+++ b/dap4_test/baselineremote/test_sequence_2.syn.dmp
@@ -0,0 +1,19 @@
+netcdf test_sequence_2 {
+types:
+  compound s_base_t {
+    int i1 ;
+    short sh1 ;
+  }; // s_base_t
+  s_base_t(*) s_t ;
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	s_t s(_Anonymous2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {{-920699049, 896}}, 
+    {{-1123468835, -18686}, {2125143125, -21899}, {1268468519, -22144}, {989876086, 3361}} ;
+}
diff --git a/dap4_test/baselineremote/test_struct1.nc.dmp b/dap4_test/baselineremote/test_struct1.nc.dmp
new file mode 100644
index 0000000..23d3a2e
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct1.nc.dmp
@@ -0,0 +1,15 @@
+netcdf test_struct1 {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {1, -2} ;
+}
diff --git a/dap4_test/baselineremote/test_struct_array.nc.dmp b/dap4_test/baselineremote/test_struct_array.nc.dmp
new file mode 100644
index 0000000..c1d4a5b
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct_array.nc.dmp
@@ -0,0 +1,22 @@
+netcdf test_struct_array {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	s_t s(dx, dy) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s =
+  {1, -1}, {17, 37}, {-32767, 32767},
+  {-1, 3}, {-2, 2}, {-3, 1},
+  {-4, 12}, {-8, 8}, {-12, 4},
+  {-5, 15}, {-10, 10}, {-15, 5} ;
+}
diff --git a/dap4_test/baselineremote/test_struct_array.syn.dmp b/dap4_test/baselineremote/test_struct_array.syn.dmp
new file mode 100644
index 0000000..8fcf876
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct_array.syn.dmp
@@ -0,0 +1,31 @@
+netcdf test_struct_array {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+dimensions:
+	dx = 4 ;
+	dy = 3 ;
+variables:
+	float z(dx) ;
+	float t(dy) ;
+	s_t s(dx, dy) ;
+		string s:_edu.ucar.maps = "/z", "/t" ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ z = 0.7276533, 0.785633, 0.513679, 0.2468447 ;
+
+ t = 0.738422, 0.2148887, 0.4947984 ;
+
+ s =
+  {712320147, 1268468519}, {696298400, 989876086}, {-1927163883, -900795134},
+  {-708236713, 1377500019}, {511843988, 1699265896}, {-540214433, -914532520},
+  {-1344032615, -871416961}, {-1928735161, 935744880}, 
+    {-1509955773, -1707460853},
+  {1145911788, -415231529}, {-278269626, -1682978013}, 
+    {-1629885665, -909240754} ;
+}
diff --git a/dap4_test/baselineremote/test_struct_nested.hdf5.dmp b/dap4_test/baselineremote/test_struct_nested.hdf5.dmp
new file mode 100644
index 0000000..fb83ca2
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct_nested.hdf5.dmp
@@ -0,0 +1,23 @@
+netcdf test_struct_nested {
+types:
+  compound x_field1_t {
+    int x ;
+    int y ;
+  }; // x_field1_t
+  compound x_field2_t {
+    int x ;
+    int y ;
+  }; // x_field2_t
+  compound x_t {
+    x_field1_t field1 ;
+    x_field2_t field2 ;
+  }; // x_t
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{1, -2}, {255, 90}} ;
+}
diff --git a/dap4_test/baselineremote/test_struct_nested.nc.dmp b/dap4_test/baselineremote/test_struct_nested.nc.dmp
new file mode 100644
index 0000000..fb83ca2
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct_nested.nc.dmp
@@ -0,0 +1,23 @@
+netcdf test_struct_nested {
+types:
+  compound x_field1_t {
+    int x ;
+    int y ;
+  }; // x_field1_t
+  compound x_field2_t {
+    int x ;
+    int y ;
+  }; // x_field2_t
+  compound x_t {
+    x_field1_t field1 ;
+    x_field2_t field2 ;
+  }; // x_t
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{1, -2}, {255, 90}} ;
+}
diff --git a/dap4_test/baselineremote/test_struct_nested3.hdf5.dmp b/dap4_test/baselineremote/test_struct_nested3.hdf5.dmp
new file mode 100644
index 0000000..6d45724
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct_nested3.hdf5.dmp
@@ -0,0 +1,20 @@
+netcdf test_struct_nested3 {
+types:
+  compound x_field3_field2_t {
+    int field1 ;
+  }; // x_field3_field2_t
+  compound x_field3_t {
+    x_field3_field2_t field2 ;
+  }; // x_field3_t
+  compound x_t {
+    x_field3_t field3 ;
+  }; // x_t
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{{17}}} ;
+}
diff --git a/dap4_test/baselineremote/test_struct_nested3.nc.dmp b/dap4_test/baselineremote/test_struct_nested3.nc.dmp
new file mode 100644
index 0000000..6d45724
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct_nested3.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_struct_nested3 {
+types:
+  compound x_field3_field2_t {
+    int field1 ;
+  }; // x_field3_field2_t
+  compound x_field3_t {
+    x_field3_field2_t field2 ;
+  }; // x_field3_t
+  compound x_t {
+    x_field3_t field3 ;
+  }; // x_t
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{{17}}} ;
+}
diff --git a/dap4_test/baselineremote/test_struct_type.nc.dmp b/dap4_test/baselineremote/test_struct_type.nc.dmp
new file mode 100644
index 0000000..1675cbd
--- /dev/null
+++ b/dap4_test/baselineremote/test_struct_type.nc.dmp
@@ -0,0 +1,15 @@
+netcdf test_struct_type {
+types:
+  compound s_t {
+    int x ;
+    int y ;
+  }; // s_t
+variables:
+	s_t s ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ s = {1, -2} ;
+}
diff --git a/dap4_test/baselineremote/test_utf8.nc.dmp b/dap4_test/baselineremote/test_utf8.nc.dmp
new file mode 100644
index 0000000..385a629
--- /dev/null
+++ b/dap4_test/baselineremote/test_utf8.nc.dmp
@@ -0,0 +1,12 @@
+netcdf test_utf8 {
+dimensions:
+	d2 = 2 ;
+variables:
+	string vs(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ vs = "Καλημέα", "abc" ;
+}
diff --git a/dap4_test/baselineremote/test_vlen1.nc.dmp b/dap4_test/baselineremote/test_vlen1.nc.dmp
new file mode 100644
index 0000000..6cf5121
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen1.nc.dmp
@@ -0,0 +1,15 @@
+netcdf test_vlen1 {
+types:
+  compound x_base_t {
+    int vlen_t ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+variables:
+	x_t x ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x = {{1}, {3}, {5}, {7}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen10.nc.dmp b/dap4_test/baselineremote/test_vlen10.nc.dmp
new file mode 100644
index 0000000..3d1413e
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen10.nc.dmp
@@ -0,0 +1,19 @@
+netcdf test_vlen10 {
+types:
+  compound v_base_v_t_t {
+    int x ;
+    float y ;
+  }; // v_base_v_t_t
+  compound v_base_t {
+    v_base_v_t_t v_t ;
+  }; // v_base_t
+  v_base_t(*) v_t ;
+variables:
+	v_t v ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v = {{{17, 30.7}}, {{19, 101.1}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen11.nc.dmp b/dap4_test/baselineremote/test_vlen11.nc.dmp
new file mode 100644
index 0000000..d7a7d9d
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen11.nc.dmp
@@ -0,0 +1,19 @@
+netcdf test_vlen11 {
+types:
+  compound v_base_v2_t_base_t {
+    int v1_t ;
+  }; // v_base_v2_t_base_t
+  v_base_v2_t_base_t(*) v_base_v2_t_t ;
+  compound v_base_t {
+    v_base_v2_t_t v2_t ;
+  }; // v_base_t
+  v_base_t(*) v_t ;
+variables:
+	v_t v ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v = {{{{1}, {3}, {5}, {7}}}, {{{100}, {200}}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen2.nc.dmp b/dap4_test/baselineremote/test_vlen2.nc.dmp
new file mode 100644
index 0000000..4a94e83
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen2.nc.dmp
@@ -0,0 +1,21 @@
+netcdf test_vlen2 {
+types:
+  compound x_base_t {
+    int vlen_t ;
+  }; // x_base_t
+  x_base_t(*) x_t ;
+dimensions:
+	d3 = 3 ;
+	d2 = 2 ;
+variables:
+	x_t x(d3, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ x =
+  {{1}, {3}, {5}, {7}}, {{100}, {200}},
+  {{-1}, {-2}}, {{1}, {3}, {5}, {7}},
+  {{100}, {200}}, {{-1}, {-2}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen3.hdf5.dmp b/dap4_test/baselineremote/test_vlen3.hdf5.dmp
new file mode 100644
index 0000000..e341da4
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen3.hdf5.dmp
@@ -0,0 +1,18 @@
+netcdf test_vlen3 {
+types:
+  compound v1_f1_base_t {
+    int v_t ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1 ;
+  }; // v1_t
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen3.nc.dmp b/dap4_test/baselineremote/test_vlen3.nc.dmp
new file mode 100644
index 0000000..e341da4
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen3.nc.dmp
@@ -0,0 +1,18 @@
+netcdf test_vlen3 {
+types:
+  compound v1_f1_base_t {
+    int v_t ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1 ;
+  }; // v1_t
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen4.hdf5.dmp b/dap4_test/baselineremote/test_vlen4.hdf5.dmp
new file mode 100644
index 0000000..bccab75
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen4.hdf5.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen4 {
+types:
+  compound v1_f1_base_t {
+    int v_t ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1(2) ;
+  }; // v1_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{{1}, {3}, {5}, {7}}, {}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen4.nc.dmp b/dap4_test/baselineremote/test_vlen4.nc.dmp
new file mode 100644
index 0000000..bccab75
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen4.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen4 {
+types:
+  compound v1_f1_base_t {
+    int v_t ;
+  }; // v1_f1_base_t
+  v1_f1_base_t(*) v1_f1_t ;
+  compound v1_t {
+    v1_f1_t f1(2) ;
+  }; // v1_t
+dimensions:
+	_Anonymous2 = 2 ;
+variables:
+	v1_t v1 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{{1}, {3}, {5}, {7}}, {}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen5.hdf5.dmp b/dap4_test/baselineremote/test_vlen5.hdf5.dmp
new file mode 100644
index 0000000..2dde2d8
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen5.hdf5.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen5 {
+types:
+  compound v1_v_base_t {
+    int v_t ;
+  }; // v1_v_base_t
+  v1_v_base_t(*) v1_v_t ;
+  compound v1_t {
+    v1_v_t v ;
+  }; // v1_t
+dimensions:
+	d2 = 2 ;
+variables:
+	v1_t v1(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}}, {{{100}, {200}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen5.nc.dmp b/dap4_test/baselineremote/test_vlen5.nc.dmp
new file mode 100644
index 0000000..2dde2d8
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen5.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen5 {
+types:
+  compound v1_v_base_t {
+    int v_t ;
+  }; // v1_v_base_t
+  v1_v_base_t(*) v1_v_t ;
+  compound v1_t {
+    v1_v_t v ;
+  }; // v1_t
+dimensions:
+	d2 = 2 ;
+variables:
+	v1_t v1(d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{{1}, {3}, {5}, {7}}}, {{{100}, {200}}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen6.nc.dmp b/dap4_test/baselineremote/test_vlen6.nc.dmp
new file mode 100644
index 0000000..ad5a5a8
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen6.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_vlen6 {
+types:
+  compound v1_base_t {
+    int v_t ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 2 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{1}, {3}, {5}, {7}}, {{17}, {19}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen7.nc.dmp b/dap4_test/baselineremote/test_vlen7.nc.dmp
new file mode 100644
index 0000000..363df8c
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen7.nc.dmp
@@ -0,0 +1,17 @@
+netcdf test_vlen7 {
+types:
+  compound v1_base_t {
+    int v_t ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d = 1 ;
+variables:
+	v1_t v1(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 = {{17}, {19}, {21}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen8.nc.dmp b/dap4_test/baselineremote/test_vlen8.nc.dmp
new file mode 100644
index 0000000..976bd44
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen8.nc.dmp
@@ -0,0 +1,20 @@
+netcdf test_vlen8 {
+types:
+  compound v1_base_t {
+    int v_t ;
+  }; // v1_base_t
+  v1_base_t(*) v1_t ;
+dimensions:
+	d1 = 2 ;
+	d2 = 2 ;
+variables:
+	v1_t v1(d1, d2) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v1 =
+  {{1}, {3}, {5}, {7}}, {{17}, {19}},
+  {{11}, {33}, {55}, {77}}, {{717}, {919}} ;
+}
diff --git a/dap4_test/baselineremote/test_vlen9.nc.dmp b/dap4_test/baselineremote/test_vlen9.nc.dmp
new file mode 100644
index 0000000..42cd1b5
--- /dev/null
+++ b/dap4_test/baselineremote/test_vlen9.nc.dmp
@@ -0,0 +1,21 @@
+netcdf test_vlen9 {
+types:
+  compound v_base_v_t_t {
+    int x ;
+    float y ;
+  }; // v_base_v_t_t
+  compound v_base_t {
+    v_base_v_t_t v_t ;
+  }; // v_base_t
+  v_base_t(*) v_t ;
+dimensions:
+	d = 2 ;
+variables:
+	v_t v(d) ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ v = {{{17, 30.7}}}, {{{19, 101.1}}, {{2, 1}}} ;
+}
diff --git a/dap4_test/baselineremote/tst_fills.nc.dmp b/dap4_test/baselineremote/tst_fills.nc.dmp
new file mode 100644
index 0000000..2070bc7
--- /dev/null
+++ b/dap4_test/baselineremote/tst_fills.nc.dmp
@@ -0,0 +1,17 @@
+netcdf tst_fills {
+variables:
+	ubyte uv8 ;
+	short v16 ;
+	int uv32 ;
+		uv32:_FillValue = 17 ;
+
+// global attributes:
+		:_DAP4_Little_Endian = 1UB ;
+data:
+
+ uv8 = 240 ;
+
+ v16 = 32700 ;
+
+ uv32 = 111000 ;
+}
diff --git a/ncdap_test/expected4/CMakeLists.txt b/dap4_test/cdltestfiles/CMakeLists.txt
similarity index 100%
copy from ncdap_test/expected4/CMakeLists.txt
copy to dap4_test/cdltestfiles/CMakeLists.txt
diff --git a/dap4_test/cdltestfiles/test_atomic_array.cdl b/dap4_test/cdltestfiles/test_atomic_array.cdl
new file mode 100644
index 0000000..ea901a8
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_atomic_array.cdl
@@ -0,0 +1,39 @@
+netcdf test_atomic_array {
+types:
+  opaque(8) o_t;  
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+  d1 = 1;
+  d2 = 2;
+  d3 = 3;
+  d4 = 4;
+  d5 = 5;
+variables:
+  ubyte vu8(d2,d3);
+  short v16(d4);
+  uint vu32(d2,d3);
+  double vd(d2);
+  char vc(d2);
+  string vs(d2,d2);
+  o_t vo(d1,d2);
+  cloud_class_t primary_cloud(d5) ;
+      cloud_class_t primary_cloud:_FillValue = Missing ;
+
+data:
+ vu8 =
+  255, 1, 2,
+  3, 4, 5 ;
+ v16 = 1, 2, 3, 4 ;
+ vu32 =
+  5, 4, 3,
+  2, 1, 0 ;
+ vd = 17.9, 1024.8 ;
+ vc = '@', '&' ;
+ vs = "hello\tworld", "\r\n", "Καλημέα", "abc" ;
+ vo =
+  0X0123456789ABCDEF, 0XABCDEF0000000000 ;
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/cdltestfiles/test_atomic_types.cdl b/dap4_test/cdltestfiles/test_atomic_types.cdl
new file mode 100644
index 0000000..d43301a
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_atomic_types.cdl
@@ -0,0 +1,42 @@
+netcdf test_atomic_types {
+types:
+  opaque(8) o_t;  
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+variables:
+  byte v8;
+  ubyte vu8;
+  short v16;
+  ushort vu16;
+  int v32;
+  uint vu32;
+  int64 v64;
+  uint64 vu64;
+  float vf; 
+  double vd; 
+  char vc;
+  string vs;
+  o_t vo;
+  cloud_class_t primary_cloud;
+    cloud_class_t primary_cloud:_FillValue = Missing ;
+  cloud_class_t secondary_cloud;
+    cloud_class_t secondary_cloud:_FillValue = Missing ;
+data:
+  v8 = -128;
+  vu8 = 255;
+  v16 = -32768;
+  vu16 = 65535;
+  v32 = 2147483647;
+  vu32 = 4294967295;
+  v64 = 9223372036854775807;
+  vu64 = 18446744073709551615;
+  vf = 3.1415926535897932384626433832795;
+  vd = 3.141592653589793238462643383279502884197169399375105820974944592;
+  vc = '@';
+  vs = "hello\tworld";
+  vo = 0x0123456789abcdef;
+  primary_cloud = Stratus;
+  secondary_cloud = _;
+}
diff --git a/dap4_test/cdltestfiles/test_enum.cdl b/dap4_test/cdltestfiles/test_enum.cdl
new file mode 100644
index 0000000..6cd1ceb
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_enum.cdl
@@ -0,0 +1,12 @@
+netcdf test_enum {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+variables:
+  cloud_class_t primary_cloud;
+    cloud_class_t primary_cloud:_FillValue = Missing ;
+data:
+  primary_cloud = Stratus;
+}
diff --git a/dap4_test/cdltestfiles/test_enum_2.cdl b/dap4_test/cdltestfiles/test_enum_2.cdl
new file mode 100644
index 0000000..ef6ab50
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_enum_2.cdl
@@ -0,0 +1,15 @@
+// Test cross group enum references
+netcdf test_enum_2 {
+  types:
+    byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+  group: h {
+  variables:
+    /cloud_class_t primary_cloud;
+      /cloud_class_t primary_cloud:_FillValue = Missing ;
+  data:
+    primary_cloud = Stratus;
+  }
+}
diff --git a/dap4_test/cdltestfiles/test_enum_array.cdl b/dap4_test/cdltestfiles/test_enum_array.cdl
new file mode 100644
index 0000000..d395990
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_enum_array.cdl
@@ -0,0 +1,14 @@
+netcdf test_enum_array {
+types:
+  byte enum cloud_class_t {Clear = 0, Cumulonimbus = 1, Stratus = 2, 
+      Stratocumulus = 3, Cumulus = 4, Altostratus = 5, Nimbostratus = 6, 
+      Altocumulus = 7, Cirrostratus = 8, Cirrocumulus = 9, Cirrus = 10, 
+      Missing = 127} ;
+dimensions:
+  d5 = 5;
+variables:
+  cloud_class_t primary_cloud(d5);
+    cloud_class_t primary_cloud:_FillValue = Missing ;
+data:
+ primary_cloud = Clear, Stratus, Clear, Cumulonimbus, _ ;
+}
diff --git a/dap4_test/cdltestfiles/test_fill.cdl b/dap4_test/cdltestfiles/test_fill.cdl
new file mode 100644
index 0000000..7d2af99
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_fill.cdl
@@ -0,0 +1,11 @@
+netcdf test_fill {
+variables:
+  ubyte uv8;
+  short v16;
+  uint uv32;
+	uv32:_FillValue=17;
+data:
+  uv8 = 240;
+  v16 = 32700;
+  uv32 = 111000;
+}
diff --git a/dap4_test/cdltestfiles/test_groups1.cdl b/dap4_test/cdltestfiles/test_groups1.cdl
new file mode 100644
index 0000000..bde2677
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_groups1.cdl
@@ -0,0 +1,35 @@
+netcdf test_groups1 {
+dimensions:
+  dim1 = 5 ;
+
+group: g {
+  dimensions:
+    dim2 = 3 ;
+
+  group: h {
+    dimensions:
+      dim3 = 7 ;
+    variables:
+      int v1(dim1);
+      float v2(dim2);
+    data:
+
+     v1 = -876354855, -1761252264, 1723477387, -46827465, 1475147969;
+
+     v2 = 12, -100, _ ;
+  } // group h
+
+  group: i {
+    dimensions:
+      dim3 = 7 ;
+    variables:
+      int v1(dim1);
+      float v3(dim3);
+    data:
+
+     v1 = 2, 3, 5, 7, 11 ;
+
+     v3 = 23, 29, 19, 31, 17, 37, 13 ;
+  } // group i
+} // group g
+}
diff --git a/dap4_test/cdltestfiles/test_one_var.cdl b/dap4_test/cdltestfiles/test_one_var.cdl
new file mode 100644
index 0000000..f5edd12
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_one_var.cdl
@@ -0,0 +1,6 @@
+netcdf test_one_var {
+variables:
+  int t;
+data:
+  t = 17;
+}
diff --git a/dap4_test/cdltestfiles/test_one_vararray.cdl b/dap4_test/cdltestfiles/test_one_vararray.cdl
new file mode 100644
index 0000000..78d1ef1
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_one_vararray.cdl
@@ -0,0 +1,8 @@
+netcdf test_one_vararray {
+dimensions:
+ d2 = 2;
+variables:
+  int t(d2);
+data:
+  t = 17, 37;
+}
diff --git a/dap4_test/cdltestfiles/test_opaque.cdl b/dap4_test/cdltestfiles/test_opaque.cdl
new file mode 100644
index 0000000..5cc4e7a
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_opaque.cdl
@@ -0,0 +1,8 @@
+netcdf test_opaque {
+types:
+  opaque(8) o_t;  
+variables:
+  o_t vo1;
+data:
+ vo1 = 0X0123456789ABCDEF ;
+}
diff --git a/dap4_test/cdltestfiles/test_opaque_array.cdl b/dap4_test/cdltestfiles/test_opaque_array.cdl
new file mode 100644
index 0000000..bd33119
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_opaque_array.cdl
@@ -0,0 +1,12 @@
+netcdf test_opaque_array {
+types:
+  opaque(8) o_t;  
+dimensions:
+  d2 = 2;
+variables:
+  o_t vo2(d2,d2);
+data:
+ vo2 =
+   0X0123456789ABCDEF, 0XABCDEF0000000000,
+   0XFEDCBA9876543210, 0XFEDCBA9999999999;
+}
diff --git a/dap4_test/cdltestfiles/test_struct1.cdl b/dap4_test/cdltestfiles/test_struct1.cdl
new file mode 100644
index 0000000..005f897
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_struct1.cdl
@@ -0,0 +1,11 @@
+netcdf test_struct_type {
+  types:
+    compound c_t {
+      int x ;
+      int y ;
+    }; // c_t
+variables:
+  c_t s;
+data:
+  s = {1,-2};
+}
diff --git a/dap4_test/cdltestfiles/test_struct_array.cdl b/dap4_test/cdltestfiles/test_struct_array.cdl
new file mode 100644
index 0000000..bc5f723
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_struct_array.cdl
@@ -0,0 +1,18 @@
+netcdf test_struct_array {
+types:
+    compound c_t {
+      int x ;
+      int y ;
+    }; // c_t
+dimensions:
+ dx = 4;
+ dy = 3;
+variables:
+  c_t s(dx,dy);
+data:
+ s =
+/*[0][0..2]*/  {1, -1}, {17, 37}, {-32767, 32767},
+/*[1][0..2]*/  {-1, 3}, {-2, 2}, {-3, 1},
+/*[2][0..2]*/  {-4, 12}, {-8, 8}, {-12, 4},
+/*[3][0..2]*/  {-5, 15}, {-10, 10}, {-15, 5} ;
+}
diff --git a/dap4_test/cdltestfiles/test_struct_nested.cdl b/dap4_test/cdltestfiles/test_struct_nested.cdl
new file mode 100644
index 0000000..399d895
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_struct_nested.cdl
@@ -0,0 +1,15 @@
+netcdf test_struct_nested {
+  types:
+    compound s1_t {
+      int x ;
+      int y ;
+    }; // s1_t
+    compound s2_t {
+      s1_t field1 ;
+      s1_t field2 ;
+    }; // s2_t
+variables:
+  s2_t x;
+data:
+  x = {{1,-2}, {255, 90}};
+}
diff --git a/dap4_test/cdltestfiles/test_struct_nested3.cdl b/dap4_test/cdltestfiles/test_struct_nested3.cdl
new file mode 100644
index 0000000..e52eba8
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_struct_nested3.cdl
@@ -0,0 +1,16 @@
+netcdf test_struct_nested3 {
+  types:
+    compound s1_t {
+      int field1 ;
+    }; // s1_t
+    compound s2_t {
+      s1_t field2 ;
+    }; // s2_t
+    compound s3_t {
+      s2_t field3 ;
+    }; // s2_t
+variables:
+  s3_t x;
+data:
+ x = {{{17}}} ;
+}
diff --git a/dap4_test/cdltestfiles/test_struct_type.cdl b/dap4_test/cdltestfiles/test_struct_type.cdl
new file mode 100644
index 0000000..005f897
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_struct_type.cdl
@@ -0,0 +1,11 @@
+netcdf test_struct_type {
+  types:
+    compound c_t {
+      int x ;
+      int y ;
+    }; // c_t
+variables:
+  c_t s;
+data:
+  s = {1,-2};
+}
diff --git a/dap4_test/cdltestfiles/test_unlim1.cdl b/dap4_test/cdltestfiles/test_unlim1.cdl
new file mode 100644
index 0000000..e300442
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_unlim1.cdl
@@ -0,0 +1,27 @@
+netcdf test_unlim1 {
+dimensions:
+	lat = 3 ;
+	lon = 2 ;
+	time = UNLIMITED ; // (2 currently)
+variables:
+	float lat(lat) ;
+		lat:units = "degrees_north" ;
+	float lon(lon) ;
+		lon:units = "degrees_east" ;
+	double time(time) ;
+		time:units = "seconds since 2009-01-01" ;
+	float pr(time, lat, lon) ;
+		pr:standard_name = "air_pressure_at_sea_level" ;
+		pr:units = "hPa" ;
+
+// global attributes:
+		:title = "example for workshop" ;
+data:
+ pr =
+  0, 1,
+  2, 3,
+  4, 5,
+  10, 11,
+  12, 13,
+  14, 15 ;
+}
diff --git a/dap4_test/cdltestfiles/test_utf8.cdl b/dap4_test/cdltestfiles/test_utf8.cdl
new file mode 100644
index 0000000..14025f5
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_utf8.cdl
@@ -0,0 +1,8 @@
+netcdf test_utf8 {
+dimensions:
+  d2 = 2;
+variables:
+  string vs(d2);
+data:
+  vs = "Καλημέα" , "abc";
+}
diff --git a/dap4_test/cdltestfiles/test_vlen1.cdl b/dap4_test/cdltestfiles/test_vlen1.cdl
new file mode 100644
index 0000000..3ec2f06
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen1.cdl
@@ -0,0 +1,11 @@
+netcdf test_vlen1 {
+
+types:
+  int(*) vlen_t;
+
+variables:
+  vlen_t x;  
+
+data:
+  x = {1, 3, 5, 7};
+}
diff --git a/dap4_test/cdltestfiles/test_vlen2.cdl b/dap4_test/cdltestfiles/test_vlen2.cdl
new file mode 100644
index 0000000..8e3a578
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen2.cdl
@@ -0,0 +1,15 @@
+netcdf test_vlen2 {
+
+types:
+  int(*) vlen_t;
+
+dimensions:
+  d3=3;
+  d2=2;
+	
+variables:
+  vlen_t x(d3,d2);  
+
+data:
+  x = {1, 3, 5, 7}, {100,200}, {-1,-2},{1, 3, 5, 7}, {100,200}, {-1,-2};
+}
diff --git a/dap4_test/cdltestfiles/test_vlen3.cdl b/dap4_test/cdltestfiles/test_vlen3.cdl
new file mode 100644
index 0000000..a4365fe
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen3.cdl
@@ -0,0 +1,13 @@
+netcdf test_vlen3 {
+
+types:
+  int(*) v_t;
+  compound c_t {v_t f1;};
+
+variables:
+  c_t v1;  
+
+data:
+  v1 = {{1, 3, 5, 7}} ;
+}
+
diff --git a/dap4_test/cdltestfiles/test_vlen4.cdl b/dap4_test/cdltestfiles/test_vlen4.cdl
new file mode 100644
index 0000000..b6db7ff
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen4.cdl
@@ -0,0 +1,13 @@
+netcdf test_vlen4 {
+
+types:
+  int(*) v_t;
+  compound c_t {v_t f1(2);};
+
+variables:
+  c_t v1;  
+
+data:
+  v1 = {{{1, 3, 5, 7},{100,200}}} ;
+}
+
diff --git a/dap4_test/cdltestfiles/test_vlen5.cdl b/dap4_test/cdltestfiles/test_vlen5.cdl
new file mode 100644
index 0000000..11d8efa
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen5.cdl
@@ -0,0 +1,16 @@
+netcdf test_vlen5 {
+
+types:
+  int(*) v_t;
+  compound c_t {v_t v;};
+
+dimensions:
+  d2=2;
+
+variables:
+  c_t v1(d2);  
+
+data:
+  v1 = {{1, 3, 5, 7}},{{100,200}} ;
+}
+
diff --git a/dap4_test/cdltestfiles/test_vlen6.cdl b/dap4_test/cdltestfiles/test_vlen6.cdl
new file mode 100644
index 0000000..b116583
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen6.cdl
@@ -0,0 +1,16 @@
+netcdf test_vlen6 {
+
+types:
+  int(*) v_t;
+
+dimensions:
+  d=2;
+
+variables:
+  v_t v1(d);  
+
+data:
+
+ v1 = {1,3,5,7}, {17,19} ;
+}
+
diff --git a/dap4_test/cdltestfiles/test_vlen7.cdl b/dap4_test/cdltestfiles/test_vlen7.cdl
new file mode 100644
index 0000000..3711750
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen7.cdl
@@ -0,0 +1,16 @@
+netcdf test_vlen7 {
+
+types:
+  int(*) v_t;
+
+dimensions:
+  d=1;
+
+variables:
+  v_t v1(d);  
+
+data:
+
+ v1 = {17,19,21} ;
+}
+
diff --git a/dap4_test/cdltestfiles/test_vlen8.cdl b/dap4_test/cdltestfiles/test_vlen8.cdl
new file mode 100644
index 0000000..f7522a9
--- /dev/null
+++ b/dap4_test/cdltestfiles/test_vlen8.cdl
@@ -0,0 +1,19 @@
+netcdf test_vlen8 {
+
+types:
+  int(*) v_t;
+
+dimensions:
+  d1=2;
+  d2=2;
+
+variables:
+  v_t v1(d1,d2);  
+
+data:
+
+  v1 =
+   {1,3,5,7}, {17,19},
+   {11,33,55,77}, {717,919};
+}
+
diff --git a/dap4_test/d4test_common.sh b/dap4_test/d4test_common.sh
new file mode 100755
index 0000000..547c590
--- /dev/null
+++ b/dap4_test/d4test_common.sh
@@ -0,0 +1,85 @@
+if test $# = 0 ; then
+TEST=1
+else
+for arg in "$@"; do
+  case "${arg}" in
+  test) TEST=1 ;;
+  reset) RESET=1 ;;
+  diff) DIFF=1 ;;
+  cdl) CDLDIFF=1 ;;
+  log) ;;
+  *) echo unknown argument $arg ;;
+  esac
+done
+fi
+
+# Define input paths
+WD=`pwd`
+cd ${srcdir}/daptestfiles; DAPTESTFILES=`pwd` ; cd ${WD}
+cd ${srcdir}/dmrtestfiles; DMRTESTFILES=`pwd` ; cd ${WD}
+cd ${srcdir}/cdltestfiles; CDLTESTFILES=`pwd` ; cd ${WD}
+cd ${srcdir}/baseline; BASELINE=`pwd` ; cd ${WD}
+cd ${srcdir}/baselineraw; BASELINERAW=`pwd` ; cd ${WD}
+cd ${srcdir}/baselineremote; BASELINEREM=`pwd` ; cd ${WD}
+BASELINEH=${BASELINEREM}
+
+rm -fr ./results
+mkdir -p ./results
+
+FAILURES=
+failure() {
+  echo "*** Fail: $1"
+  FAILURES=1
+  if test "x$2" != x ; then
+    exit 1
+  fi
+}
+
+PUSHD() {
+pushd $1 >>/dev/null
+}
+POPD() {
+popd >>/dev/null
+}
+
+filesexist() {
+    for x in "$@" ; do
+	if ! test -e $x ; then
+	  failure "missing file: $x"
+	fi
+    done
+}
+
+finish() {
+if test "x$FAILURES" = x1 ; then
+echo "*** Fail"
+exit 1
+else
+echo "*** Pass"
+exit 0
+fi
+}
+
+suppress() {
+  F0="$1"
+  if test "x${SUPPRESS}" = x; then
+    RESULT="$F0"
+  else
+    RESULT=""
+    for f in ${F0} ; do
+      ignore=0
+      for s in ${SUPPRESS} ; do
+        if test "x$s" = "x$f" ; then
+  	  ignore=1;
+	  echo "Suppressing: $f"
+	  break;
+        fi       
+      done
+      if test "x$ignore" = x0 ; then RESULT="$f ${RESULT}" ; fi
+    done
+  fi
+}
+
+VG="valgrind --leak-check=full --error-exitcode=1 --num-callers=100"
+if test "x$USEVG" = x ; then VG=; fi
+
diff --git a/ncdap_test/expected4/CMakeLists.txt b/dap4_test/daptestfiles/CMakeLists.txt
similarity index 100%
copy from ncdap_test/expected4/CMakeLists.txt
copy to dap4_test/daptestfiles/CMakeLists.txt
diff --git a/dap4_test/daptestfiles/test_anon_dim.2.syn.dap b/dap4_test/daptestfiles/test_anon_dim.2.syn.dap
new file mode 100644
index 0000000..02521f8
Binary files /dev/null and b/dap4_test/daptestfiles/test_anon_dim.2.syn.dap differ
diff --git a/dap4_test/daptestfiles/test_anon_dim.syn.dap b/dap4_test/daptestfiles/test_anon_dim.syn.dap
new file mode 100644
index 0000000..90cf834
Binary files /dev/null and b/dap4_test/daptestfiles/test_anon_dim.syn.dap differ
diff --git a/dap4_test/daptestfiles/test_atomic_array.5.nc.dap b/dap4_test/daptestfiles/test_atomic_array.5.nc.dap
new file mode 100644
index 0000000..d9c9669
Binary files /dev/null and b/dap4_test/daptestfiles/test_atomic_array.5.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_atomic_array.8.nc.dap b/dap4_test/daptestfiles/test_atomic_array.8.nc.dap
new file mode 100644
index 0000000..9c55a80
Binary files /dev/null and b/dap4_test/daptestfiles/test_atomic_array.8.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_atomic_array.9.nc.dap b/dap4_test/daptestfiles/test_atomic_array.9.nc.dap
new file mode 100644
index 0000000..6f17241
Binary files /dev/null and b/dap4_test/daptestfiles/test_atomic_array.9.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_atomic_array.nc.dap b/dap4_test/daptestfiles/test_atomic_array.nc.dap
new file mode 100644
index 0000000..511cfa3
Binary files /dev/null and b/dap4_test/daptestfiles/test_atomic_array.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_atomic_array.syn.dap b/dap4_test/daptestfiles/test_atomic_array.syn.dap
new file mode 100644
index 0000000..8032a75
Binary files /dev/null and b/dap4_test/daptestfiles/test_atomic_array.syn.dap differ
diff --git a/dap4_test/daptestfiles/test_atomic_types.nc.dap b/dap4_test/daptestfiles/test_atomic_types.nc.dap
new file mode 100644
index 0000000..19ca742
Binary files /dev/null and b/dap4_test/daptestfiles/test_atomic_types.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_atomic_types.syn.dap b/dap4_test/daptestfiles/test_atomic_types.syn.dap
new file mode 100644
index 0000000..13e9bd6
Binary files /dev/null and b/dap4_test/daptestfiles/test_atomic_types.syn.dap differ
diff --git a/dap4_test/daptestfiles/test_enum.nc.dap b/dap4_test/daptestfiles/test_enum.nc.dap
new file mode 100644
index 0000000..e87e53b
Binary files /dev/null and b/dap4_test/daptestfiles/test_enum.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_enum_2.nc.dap b/dap4_test/daptestfiles/test_enum_2.nc.dap
new file mode 100644
index 0000000..5cd58c4
Binary files /dev/null and b/dap4_test/daptestfiles/test_enum_2.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_enum_array.4.nc.dap b/dap4_test/daptestfiles/test_enum_array.4.nc.dap
new file mode 100644
index 0000000..1ad1eed
Binary files /dev/null and b/dap4_test/daptestfiles/test_enum_array.4.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_enum_array.nc.dap b/dap4_test/daptestfiles/test_enum_array.nc.dap
new file mode 100644
index 0000000..7a2a20b
Binary files /dev/null and b/dap4_test/daptestfiles/test_enum_array.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_fill.nc.dap b/dap4_test/daptestfiles/test_fill.nc.dap
new file mode 100644
index 0000000..151559c
Binary files /dev/null and b/dap4_test/daptestfiles/test_fill.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_groups1.nc.dap b/dap4_test/daptestfiles/test_groups1.nc.dap
new file mode 100644
index 0000000..fc6a4a6
Binary files /dev/null and b/dap4_test/daptestfiles/test_groups1.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_one_var.nc.dap b/dap4_test/daptestfiles/test_one_var.nc.dap
new file mode 100644
index 0000000..8b29a0b
Binary files /dev/null and b/dap4_test/daptestfiles/test_one_var.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_one_vararray.1.nc.dap b/dap4_test/daptestfiles/test_one_vararray.1.nc.dap
new file mode 100644
index 0000000..814c0ed
Binary files /dev/null and b/dap4_test/daptestfiles/test_one_vararray.1.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_one_vararray.3.nc.dap b/dap4_test/daptestfiles/test_one_vararray.3.nc.dap
new file mode 100644
index 0000000..42ed5d7
Binary files /dev/null and b/dap4_test/daptestfiles/test_one_vararray.3.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_one_vararray.nc.dap b/dap4_test/daptestfiles/test_one_vararray.nc.dap
new file mode 100644
index 0000000..15ca928
Binary files /dev/null and b/dap4_test/daptestfiles/test_one_vararray.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_opaque.nc.dap b/dap4_test/daptestfiles/test_opaque.nc.dap
new file mode 100644
index 0000000..0e2a611
Binary files /dev/null and b/dap4_test/daptestfiles/test_opaque.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_opaque_array.7.nc.dap b/dap4_test/daptestfiles/test_opaque_array.7.nc.dap
new file mode 100644
index 0000000..eae87b4
Binary files /dev/null and b/dap4_test/daptestfiles/test_opaque_array.7.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_opaque_array.nc.dap b/dap4_test/daptestfiles/test_opaque_array.nc.dap
new file mode 100644
index 0000000..5276ab4
Binary files /dev/null and b/dap4_test/daptestfiles/test_opaque_array.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_sequence_1.syn.dap b/dap4_test/daptestfiles/test_sequence_1.syn.dap
new file mode 100644
index 0000000..6b83150
Binary files /dev/null and b/dap4_test/daptestfiles/test_sequence_1.syn.dap differ
diff --git a/dap4_test/daptestfiles/test_sequence_2.syn.dap b/dap4_test/daptestfiles/test_sequence_2.syn.dap
new file mode 100644
index 0000000..2b7c507
Binary files /dev/null and b/dap4_test/daptestfiles/test_sequence_2.syn.dap differ
diff --git a/dap4_test/daptestfiles/test_struct1.nc.dap b/dap4_test/daptestfiles/test_struct1.nc.dap
new file mode 100644
index 0000000..dca9188
Binary files /dev/null and b/dap4_test/daptestfiles/test_struct1.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_struct_array.6.nc.dap b/dap4_test/daptestfiles/test_struct_array.6.nc.dap
new file mode 100644
index 0000000..cc2b49b
Binary files /dev/null and b/dap4_test/daptestfiles/test_struct_array.6.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_struct_array.nc.dap b/dap4_test/daptestfiles/test_struct_array.nc.dap
new file mode 100644
index 0000000..8180834
Binary files /dev/null and b/dap4_test/daptestfiles/test_struct_array.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_struct_array.syn.dap b/dap4_test/daptestfiles/test_struct_array.syn.dap
new file mode 100644
index 0000000..06ce492
Binary files /dev/null and b/dap4_test/daptestfiles/test_struct_array.syn.dap differ
diff --git a/dap4_test/daptestfiles/test_struct_nested.nc.dap b/dap4_test/daptestfiles/test_struct_nested.nc.dap
new file mode 100644
index 0000000..ce520c2
Binary files /dev/null and b/dap4_test/daptestfiles/test_struct_nested.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_struct_nested3.nc.dap b/dap4_test/daptestfiles/test_struct_nested3.nc.dap
new file mode 100644
index 0000000..ecc6d61
Binary files /dev/null and b/dap4_test/daptestfiles/test_struct_nested3.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_struct_type.nc.dap b/dap4_test/daptestfiles/test_struct_type.nc.dap
new file mode 100644
index 0000000..aeae2ba
Binary files /dev/null and b/dap4_test/daptestfiles/test_struct_type.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_unlim1.nc.dap b/dap4_test/daptestfiles/test_unlim1.nc.dap
new file mode 100644
index 0000000..7026f9e
Binary files /dev/null and b/dap4_test/daptestfiles/test_unlim1.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_utf8.nc.dap b/dap4_test/daptestfiles/test_utf8.nc.dap
new file mode 100644
index 0000000..b1518cf
Binary files /dev/null and b/dap4_test/daptestfiles/test_utf8.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen1.nc.dap b/dap4_test/daptestfiles/test_vlen1.nc.dap
new file mode 100644
index 0000000..e8df27b
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen1.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen2.nc.dap b/dap4_test/daptestfiles/test_vlen2.nc.dap
new file mode 100644
index 0000000..c9a158f
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen2.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen3.nc.dap b/dap4_test/daptestfiles/test_vlen3.nc.dap
new file mode 100644
index 0000000..5c49762
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen3.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen4.nc.dap b/dap4_test/daptestfiles/test_vlen4.nc.dap
new file mode 100644
index 0000000..62701fd
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen4.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen5.nc.dap b/dap4_test/daptestfiles/test_vlen5.nc.dap
new file mode 100644
index 0000000..037977c
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen5.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen6.nc.dap b/dap4_test/daptestfiles/test_vlen6.nc.dap
new file mode 100644
index 0000000..8ef29f7
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen6.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen7.nc.dap b/dap4_test/daptestfiles/test_vlen7.nc.dap
new file mode 100644
index 0000000..39e8922
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen7.nc.dap differ
diff --git a/dap4_test/daptestfiles/test_vlen8.nc.dap b/dap4_test/daptestfiles/test_vlen8.nc.dap
new file mode 100644
index 0000000..f96699f
Binary files /dev/null and b/dap4_test/daptestfiles/test_vlen8.nc.dap differ
diff --git a/ncdap_test/expected4/CMakeLists.txt b/dap4_test/dmrtestfiles/CMakeLists.txt
similarity index 100%
copy from ncdap_test/expected4/CMakeLists.txt
copy to dap4_test/dmrtestfiles/CMakeLists.txt
diff --git a/dap4_test/dmrtestfiles/test_anon_dim.2.syn.dmr b/dap4_test/dmrtestfiles/test_anon_dim.2.syn.dmr
new file mode 100644
index 0000000..8015db0
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_anon_dim.2.syn.dmr
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_anon_dim.syn"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Int32 name="vu32">
+        <Dim size="4"/>
+    </Int32>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/vu32[0:3]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_anon_dim.syn.dmr b/dap4_test/dmrtestfiles/test_anon_dim.syn.dmr
new file mode 100644
index 0000000..4256a40
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_anon_dim.syn.dmr
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_anon_dim.syn"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+
+    <Int32 name="vu32">
+        <Dim size="6"/>
+    </Int32>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_atomic_array.5.nc.dmr b/dap4_test/dmrtestfiles/test_atomic_array.5.nc.dmr
new file mode 100644
index 0000000..4f682a1
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_atomic_array.5.nc.dmr
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_atomic_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <UInt8 name="vu8">
+        <Dim size="1"/>
+        <Dim size="2"/>
+    </UInt8>
+    <Float64 name="vd">
+        <Dim size="1"/>
+    </Float64>
+    <String name="vs">
+        <Dim size="1"/>
+        <Dim size="1"/>
+    </String>
+    <Opaque name="vo" _edu.ucar.opaque.size="8">
+        <Dim size="1"/>
+        <Dim size="1"/>
+    </Opaque>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/vu8[1][0:2:2];/vd[1];/vs[1][0];/vo[0][1]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_atomic_array.8.nc.dmr b/dap4_test/dmrtestfiles/test_atomic_array.8.nc.dmr
new file mode 100644
index 0000000..56fd281
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_atomic_array.8.nc.dmr
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_atomic_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Int16 name="v16">
+        <Dim size="3"/>
+    </Int16>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/v16[0:1,3]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_atomic_array.9.nc.dmr b/dap4_test/dmrtestfiles/test_atomic_array.9.nc.dmr
new file mode 100644
index 0000000..24a858e
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_atomic_array.9.nc.dmr
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_atomic_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Int16 name="v16">
+        <Dim size="3"/>
+    </Int16>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/v16[3,0:1]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_atomic_array.nc.dmr b/dap4_test/dmrtestfiles/test_atomic_array.nc.dmr
new file mode 100644
index 0000000..29a27e1
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_atomic_array.nc.dmr
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_atomic_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d1" size="1"/>
+    <Dimension name="d2" size="2"/>
+    <Dimension name="d3" size="3"/>
+    <Dimension name="d4" size="4"/>
+    <Dimension name="d5" size="5"/>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <UInt8 name="vu8">
+        <Dim name="/d2"/>
+        <Dim name="/d3"/>
+    </UInt8>
+    <Int16 name="v16">
+        <Dim name="/d4"/>
+    </Int16>
+    <UInt32 name="vu32">
+        <Dim name="/d2"/>
+        <Dim name="/d3"/>
+    </UInt32>
+    <Float64 name="vd">
+        <Dim name="/d2"/>
+    </Float64>
+    <Char name="vc">
+        <Dim name="/d2"/>
+    </Char>
+    <String name="vs">
+        <Dim name="/d2"/>
+        <Dim name="/d2"/>
+    </String>
+    <Opaque name="vo" _edu.ucar.opaque.size="8">
+        <Dim name="/d1"/>
+        <Dim name="/d2"/>
+    </Opaque>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+        <Dim name="/d5"/>
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_atomic_array.syn.dmr b/dap4_test/dmrtestfiles/test_atomic_array.syn.dmr
new file mode 100644
index 0000000..5d7e2a4
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_atomic_array.syn.dmr
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_atomic_array.syn"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d1" size="1"/>
+    <Dimension name="d2" size="2"/>
+    <Dimension name="d3" size="3"/>
+    <Dimension name="d4" size="4"/>
+    <Dimension name="d5" size="5"/>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <UInt8 name="vu8">
+        <Dim name="/d2"/>
+        <Dim name="/d3"/>
+    </UInt8>
+    <Int16 name="v16">
+        <Dim name="/d4"/>
+    </Int16>
+    <UInt32 name="vu32">
+        <Dim name="/d2"/>
+        <Dim name="/d3"/>
+    </UInt32>
+    <Float64 name="vd">
+        <Dim name="/d2"/>
+    </Float64>
+    <Char name="vc">
+        <Dim name="/d2"/>
+    </Char>
+    <String name="vs">
+        <Dim name="/d2"/>
+        <Dim name="/d2"/>
+    </String>
+    <Opaque name="vo">
+        <Dim name="/d1"/>
+        <Dim name="/d2"/>
+    </Opaque>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+        <Dim name="/d5"/>
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_atomic_types.nc.dmr b/dap4_test/dmrtestfiles/test_atomic_types.nc.dmr
new file mode 100644
index 0000000..249b4bb
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_atomic_types.nc.dmr
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_atomic_types.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Int8 name="v8"/>
+    <UInt8 name="vu8"/>
+    <Int16 name="v16"/>
+    <UInt16 name="vu16"/>
+    <Int32 name="v32"/>
+    <UInt32 name="vu32"/>
+    <Int64 name="v64"/>
+    <UInt64 name="vu64"/>
+    <Float32 name="vf"/>
+    <Float64 name="vd"/>
+    <Char name="vc"/>
+    <String name="vs"/>
+    <Opaque name="vo" _edu.ucar.opaque.size="8"/>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Enum name="secondary_cloud" enum="/cloud_class_t">
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_atomic_types.syn.dmr b/dap4_test/dmrtestfiles/test_atomic_types.syn.dmr
new file mode 100644
index 0000000..36cc7d1
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_atomic_types.syn.dmr
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_atomic_types.syn"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Int8 name="v8"/>
+    <UInt8 name="vu8"/>
+    <Int16 name="v16"/>
+    <UInt16 name="vu16"/>
+    <Int32 name="v32"/>
+    <UInt32 name="vu32"/>
+    <Int64 name="v64"/>
+    <UInt64 name="vu64"/>
+    <Float32 name="vf"/>
+    <Float64 name="vd"/>
+    <Char name="vc"/>
+    <String name="vs"/>
+    <Opaque name="vo"/>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Enum name="secondary_cloud" enum="/cloud_class_t">
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_enum.nc.dmr b/dap4_test/dmrtestfiles/test_enum.nc.dmr
new file mode 100644
index 0000000..ef25fa7
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_enum.nc.dmr
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_enum.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_enum_2.nc.dmr b/dap4_test/dmrtestfiles/test_enum_2.nc.dmr
new file mode 100644
index 0000000..a5c0d1d
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_enum_2.nc.dmr
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_enum_2.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+    <Group name="h">
+        <Enum name="primary_cloud" enum="/cloud_class_t">
+            <Attribute name="_FillValue" type="String">
+                <Value value="Missing"/>
+            </Attribute>
+        </Enum>
+    </Group>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_enum_array.4.nc.dmr b/dap4_test/dmrtestfiles/test_enum_array.4.nc.dmr
new file mode 100644
index 0000000..3c0d9f9
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_enum_array.4.nc.dmr
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_enum_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+        <Dim size="2"/>
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/primary_cloud[1:2:4]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_enum_array.nc.dmr b/dap4_test/dmrtestfiles/test_enum_array.nc.dmr
new file mode 100644
index 0000000..fcfa9ac
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_enum_array.nc.dmr
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_enum_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d5" size="5"/>
+    <Enumeration name="cloud_class_t" basetype="Int8">
+        <EnumConst name="Clear" value="0"/>
+        <EnumConst name="Cumulonimbus" value="1"/>
+        <EnumConst name="Stratus" value="2"/>
+        <EnumConst name="Stratocumulus" value="3"/>
+        <EnumConst name="Cumulus" value="4"/>
+        <EnumConst name="Altostratus" value="5"/>
+        <EnumConst name="Nimbostratus" value="6"/>
+        <EnumConst name="Altocumulus" value="7"/>
+        <EnumConst name="Cirrostratus" value="8"/>
+        <EnumConst name="Cirrocumulus" value="9"/>
+        <EnumConst name="Cirrus" value="10"/>
+        <EnumConst name="Missing" value="127"/>
+    </Enumeration>
+    <Enum name="primary_cloud" enum="/cloud_class_t">
+        <Dim name="/d5"/>
+        <Attribute name="_FillValue" type="String">
+            <Value value="Missing"/>
+        </Attribute>
+    </Enum>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_fill.nc.dmr b/dap4_test/dmrtestfiles/test_fill.nc.dmr
new file mode 100644
index 0000000..fb0392c
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_fill.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_fill.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <UInt8 name="uv8"/>
+    <Int16 name="v16"/>
+    <UInt32 name="uv32">
+        <Attribute name="_FillValue" type="UInt32">
+            <Value value="17"/>
+        </Attribute>
+    </UInt32>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_groups1.nc.dmr b/dap4_test/dmrtestfiles/test_groups1.nc.dmr
new file mode 100644
index 0000000..f3abeff
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_groups1.nc.dmr
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_groups1.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="dim1" size="5"/>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+    <Group name="g">
+        <Dimension name="dim2" size="3"/>
+        <Group name="h">
+            <Dimension name="dim3" size="7"/>
+            <Int32 name="v1">
+                <Dim name="/dim1"/>
+            </Int32>
+            <Float32 name="v2">
+                <Dim name="/g/dim2"/>
+            </Float32>
+        </Group>
+        <Group name="i">
+            <Dimension name="dim3" size="7"/>
+            <Int32 name="v1">
+                <Dim name="/dim1"/>
+            </Int32>
+            <Float32 name="v3">
+                <Dim name="/g/i/dim3"/>
+            </Float32>
+        </Group>
+    </Group>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_one_var.nc.dmr b/dap4_test/dmrtestfiles/test_one_var.nc.dmr
new file mode 100644
index 0000000..cc90b61
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_one_var.nc.dmr
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_one_var.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Int32 name="t"/>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_one_vararray.1.nc.dmr b/dap4_test/dmrtestfiles/test_one_vararray.1.nc.dmr
new file mode 100644
index 0000000..993f297
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_one_vararray.1.nc.dmr
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_one_vararray.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Int32 name="t">
+        <Dim size="1"/>
+    </Int32>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/t[1]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_one_vararray.3.nc.dmr b/dap4_test/dmrtestfiles/test_one_vararray.3.nc.dmr
new file mode 100644
index 0000000..570ee27
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_one_vararray.3.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_one_vararray.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d2" size="2"/>
+    <Int32 name="t">
+        <Dim name="/d2"/>
+    </Int32>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/t[0:1]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_one_vararray.nc.dmr b/dap4_test/dmrtestfiles/test_one_vararray.nc.dmr
new file mode 100644
index 0000000..e611a15
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_one_vararray.nc.dmr
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_one_vararray.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d2" size="2"/>
+    <Int32 name="t">
+        <Dim name="/d2"/>
+    </Int32>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_opaque.nc.dmr b/dap4_test/dmrtestfiles/test_opaque.nc.dmr
new file mode 100644
index 0000000..a710b3c
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_opaque.nc.dmr
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_opaque.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Opaque name="vo1" _edu.ucar.opaque.size="8"/>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_opaque_array.7.nc.dmr b/dap4_test/dmrtestfiles/test_opaque_array.7.nc.dmr
new file mode 100644
index 0000000..505b49b
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_opaque_array.7.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_opaque_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Opaque name="vo2" _edu.ucar.opaque.size="8">
+        <Dim size="1"/>
+        <Dim size="2"/>
+    </Opaque>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/vo2[1][0:1]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_opaque_array.nc.dmr b/dap4_test/dmrtestfiles/test_opaque_array.nc.dmr
new file mode 100644
index 0000000..9bd6280
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_opaque_array.nc.dmr
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_opaque_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d2" size="2"/>
+    <Opaque name="vo2" _edu.ucar.opaque.size="8">
+        <Dim name="/d2"/>
+        <Dim name="/d2"/>
+    </Opaque>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_sequence_1.syn.dmr b/dap4_test/dmrtestfiles/test_sequence_1.syn.dmr
new file mode 100644
index 0000000..afa917c
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_sequence_1.syn.dmr
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_sequence_1.syn"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Sequence name="s">
+        <Int32 name="i1"/>
+        <Int16 name="sh1"/>
+    </Sequence>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_sequence_2.syn.dmr b/dap4_test/dmrtestfiles/test_sequence_2.syn.dmr
new file mode 100644
index 0000000..c4811e3
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_sequence_2.syn.dmr
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_sequence_2.syn"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+
+    <Sequence name="s">
+        <Int32 name="i1"/>
+        <Int16 name="sh1"/>
+        <Dim size="2"/>
+    </Sequence>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_struct1.nc.dmr b/dap4_test/dmrtestfiles/test_struct1.nc.dmr
new file mode 100644
index 0000000..4dd5100
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_struct1.nc.dmr
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_struct1.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Structure name="s">
+        <Int32 name="x"/>
+        <Int32 name="y"/>
+        <Map name="/s.x"/>
+        <Map name="/s.y"/>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_struct_array.6.nc.dmr b/dap4_test/dmrtestfiles/test_struct_array.6.nc.dmr
new file mode 100644
index 0000000..978d4e6
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_struct_array.6.nc.dmr
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_struct_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Structure name="s">
+        <Int32 name="x"/>
+        <Int32 name="y"/>
+        <Dim size="2"/>
+        <Dim size="2"/>
+        <Map name="/s.x"/>
+        <Map name="/s.y"/>
+    </Structure>
+    <Attribute name="_dap4.ce" type="String">
+        <Value value="/s[0:2:3][0:1]"/>
+    </Attribute>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_struct_array.nc.dmr b/dap4_test/dmrtestfiles/test_struct_array.nc.dmr
new file mode 100644
index 0000000..3984fce
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_struct_array.nc.dmr
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_struct_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="dx" size="4"/>
+    <Dimension name="dy" size="3"/>
+    <Structure name="s">
+        <Int32 name="x"/>
+        <Int32 name="y"/>
+        <Dim name="/dx"/>
+        <Dim name="/dy"/>
+        <Map name="/s.x"/>
+        <Map name="/s.y"/>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_struct_array.syn.dmr b/dap4_test/dmrtestfiles/test_struct_array.syn.dmr
new file mode 100644
index 0000000..991203e
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_struct_array.syn.dmr
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_struct_array.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="dx" size="4"/>
+    <Dimension name="dy" size="3"/>
+    <Float32 name="z">
+        <Dim name="/dx"/>
+    </Float32>
+    <Float32 name="t">
+        <Dim name="/dy"/>
+    </Float32>
+    <Structure name="s">
+        <Int32 name="x"/>
+        <Int32 name="y"/>
+        <Dim name="/dx"/>
+        <Dim name="/dy"/>
+        <Map name="/z"/>
+        <Map name="/t"/>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_struct_nested.nc.dmr b/dap4_test/dmrtestfiles/test_struct_nested.nc.dmr
new file mode 100644
index 0000000..b15e6f4
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_struct_nested.nc.dmr
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_struct_nested.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Structure name="x">
+        <Structure name="field1">
+            <Int32 name="x"/>
+            <Int32 name="y"/>
+        </Structure>
+        <Structure name="field2">
+            <Int32 name="x"/>
+            <Int32 name="y"/>
+        </Structure>
+        <Map name="/x.field1.x"/>
+        <Map name="/x.field1.y"/>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_struct_nested3.nc.dmr b/dap4_test/dmrtestfiles/test_struct_nested3.nc.dmr
new file mode 100644
index 0000000..67dea17
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_struct_nested3.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_struct_nested3.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Structure name="x">
+        <Structure name="field3">
+            <Structure name="field2">
+                <Int32 name="field1"/>
+            </Structure>
+        </Structure>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_struct_type.nc.dmr b/dap4_test/dmrtestfiles/test_struct_type.nc.dmr
new file mode 100644
index 0000000..1d45e0a
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_struct_type.nc.dmr
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_struct_type.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Structure name="s">
+        <Int32 name="x"/>
+        <Int32 name="y"/>
+        <Map name="/s.x"/>
+        <Map name="/s.y"/>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_unlim1.nc.dmr b/dap4_test/dmrtestfiles/test_unlim1.nc.dmr
new file mode 100644
index 0000000..dbe3757
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_unlim1.nc.dmr
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_unlim1.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="lat" size="3"/>
+    <Dimension name="lon" size="2"/>
+    <Dimension name="time" size="2" _edu.ucar.isunlimited="1"/>
+    <Float32 name="lat">
+        <Dim name="/lat"/>
+        <Attribute name="units" type="String">
+            <Value value="degrees_north"/>
+        </Attribute>
+    </Float32>
+    <Float32 name="lon">
+        <Dim name="/lon"/>
+        <Attribute name="units" type="String">
+            <Value value="degrees_east"/>
+        </Attribute>
+    </Float32>
+    <Float64 name="time">
+        <Dim name="/time"/>
+        <Attribute name="units" type="String">
+            <Value value="seconds since 2009-01-01"/>
+        </Attribute>
+    </Float64>
+    <Float32 name="pr">
+        <Dim name="/time"/>
+        <Dim name="/lat"/>
+        <Dim name="/lon"/>
+        <Attribute name="standard_name" type="String">
+            <Value value="air_pressure_at_sea_level"/>
+        </Attribute>
+        <Attribute name="units" type="String">
+            <Value value="hPa"/>
+        </Attribute>
+        <Map name="/time"/>
+        <Map name="/lat"/>
+        <Map name="/lon"/>
+    </Float32>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+    <Attribute name="title" type="String">
+        <Value value="example for workshop"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_utf8.nc.dmr b/dap4_test/dmrtestfiles/test_utf8.nc.dmr
new file mode 100644
index 0000000..48fd7a6
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_utf8.nc.dmr
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_utf8.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d2" size="2"/>
+    <String name="vs">
+        <Dim name="/d2"/>
+    </String>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen1.nc.dmr b/dap4_test/dmrtestfiles/test_vlen1.nc.dmr
new file mode 100644
index 0000000..bfbda52
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen1.nc.dmr
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen1.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Sequence name="x">
+        <Int32 name="x"/>
+    </Sequence>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen2.nc.dmr b/dap4_test/dmrtestfiles/test_vlen2.nc.dmr
new file mode 100644
index 0000000..4a2f2b4
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen2.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen2.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d3" size="3"/>
+    <Dimension name="d2" size="2"/>
+    <Sequence name="x">
+        <Int32 name="x"/>
+        <Dim name="/d3"/>
+        <Dim name="/d2"/>
+    </Sequence>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen3.nc.dmr b/dap4_test/dmrtestfiles/test_vlen3.nc.dmr
new file mode 100644
index 0000000..bdad56e
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen3.nc.dmr
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen3.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Structure name="v1">
+        <Sequence name="f1">
+            <Int32 name="f1"/>
+        </Sequence>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen4.nc.dmr b/dap4_test/dmrtestfiles/test_vlen4.nc.dmr
new file mode 100644
index 0000000..cf61708
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen4.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen4.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+
+    <Structure name="v1">
+        <Sequence name="f1">
+            <Int32 name="f1"/>
+            <Dim size="2"/>
+        </Sequence>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen5.nc.dmr b/dap4_test/dmrtestfiles/test_vlen5.nc.dmr
new file mode 100644
index 0000000..4d398ca
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen5.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen5.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d2" size="2"/>
+    <Structure name="v1">
+        <Sequence name="v">
+            <Int32 name="v"/>
+        </Sequence>
+        <Dim name="/d2"/>
+    </Structure>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen6.nc.dmr b/dap4_test/dmrtestfiles/test_vlen6.nc.dmr
new file mode 100644
index 0000000..be72265
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen6.nc.dmr
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen6.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d" size="2"/>
+    <Sequence name="v1">
+        <Int32 name="v1"/>
+        <Dim name="/d"/>
+    </Sequence>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen7.nc.dmr b/dap4_test/dmrtestfiles/test_vlen7.nc.dmr
new file mode 100644
index 0000000..09a512d
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen7.nc.dmr
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen7.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d" size="1"/>
+    <Sequence name="v1">
+        <Int32 name="v1"/>
+        <Dim name="/d"/>
+    </Sequence>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/dmrtestfiles/test_vlen8.nc.dmr b/dap4_test/dmrtestfiles/test_vlen8.nc.dmr
new file mode 100644
index 0000000..b349bc6
--- /dev/null
+++ b/dap4_test/dmrtestfiles/test_vlen8.nc.dmr
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Dataset
+         name="test_vlen8.nc"
+         dapVersion="4.0"
+         dmrVersion="1.0"
+         xmlns="http://xml.opendap.org/ns/DAP/4.0#"
+         xmlns:dap="http://xml.opendap.org/ns/DAP/4.0#">
+    <Dimension name="d1" size="2"/>
+    <Dimension name="d2" size="2"/>
+    <Sequence name="v1">
+        <Int32 name="v1"/>
+        <Dim name="/d1"/>
+        <Dim name="/d2"/>
+    </Sequence>
+    <Attribute name="_DAP4_Little_Endian" type="UInt8">
+        <Value value="1"/>
+    </Attribute>
+</Dataset>
diff --git a/dap4_test/findtestserver4.c b/dap4_test/findtestserver4.c
new file mode 100644
index 0000000..9ad5e69
--- /dev/null
+++ b/dap4_test/findtestserver4.c
@@ -0,0 +1,79 @@
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "nctestserver.h"
+
+/* Support stringification of -D macros */
+#define XSTRINGIFY(s) #s
+#define STRINGIFY(s) XSTRINGIFY(s)
+
+
+/**
+usage: findtestserver dap2|dap4 suffix [serverlist]
+
+Given a partial suffix path, try to find a
+server for which a request to server + suffix
+returns some kind of result using the
+specified protocol.  This indicates that the
+server is up and running.  Return the complete
+url for the server plus the path.
+If serverlist is present, then is should be a comma
+separated list of servers (host+port) to try.
+It defaults to REMOTETESTSERVERS.
+*/
+
+static void
+usage()
+{
+    fprintf(stderr,"usage: findtestserver dap2|dap4 suffix [serverlist]\n");
+    exit(1);
+}
+
+
+int
+main(int argc, char** argv)
+{
+    const char* url = NULL;
+    const char* servlet = NULL;
+    const char* proto = NULL;
+    const char* serverlist = NULL;
+    int isdap4 = 0; /* 1 => dap4 */
+
+    argc--; argv++;
+    if(argc < 2)
+	usage();	
+    proto = strdup(argv[0]);
+    servlet = strdup(argv[1]);
+    if(argc >= 3)
+	serverlist = strdup(argv[2]);
+
+#ifdef ENABLE_DAP
+    if(strcasecmp(proto,"dap2")==0)
+	isdap4 = 0;
+    else
+#endif
+#ifdef ENABLE_DAP4
+    if(strcasecmp(proto,"dap4")==0)
+	isdap4 = 1;
+    else
+#endif
+	usage();
+
+    if(serverlist == NULL) {
+#ifdef REMOTETESTSERVERS
+	serverlist = strdup(REMOTETESTSERVERS);
+#endif
+    }
+    if(serverlist == NULL || strlen(serverlist) == 0)
+	fprintf(stderr,"Cannot determine a server list");
+
+    url = nc_findtestserver(servlet,isdap4,serverlist);
+    if(url == NULL) {
+       url = "";
+	fprintf(stderr,"not found: %s\n",servlet);
+    }
+    printf("%s",url);
+    fflush(stdout);
+    exit(0);
+}
diff --git a/dap4_test/maketests.sh b/dap4_test/maketests.sh
new file mode 100755
index 0000000..29cf30c
--- /dev/null
+++ b/dap4_test/maketests.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+# The purpose of this program is to fill in the
+# testdata files: dmrtestfiles, daptestfiles, and
+# cdltestfiles.
+# 
+# It obtains that data from the output of a thredds
+# test called GenerateRaw.java. See the description
+# in that program of its actions.
+# 
+# It is assumed that the SRC environment variable
+# (below) points to the directory in the thredds
+# tree containing the directories named
+# rawtestfiles and testfiles.
+# 
+# This program copies the files
+# ${SRC}/dmrtestfiles/*.dmr to the dmrtestfiles
+# directory in this (dap4_test) directory.
+# Similarly it copies ${SRC}/daptestfiles/*.dap to
+# the local daptestfiles directory. Additionally,
+# it looks at ${SRC}/testfiles/*.cdl to see if
+# there are any .cdl files corresponding (by name)
+# to the files in daptestfiles.
+
+if test $# != 0 ; then
+for arg in "$@"; do
+  case "${arg}" in
+  debug) DEBUG=1 ;;
+  git) GITADD=1 ;;
+  *) echo unknown argument $arg ;;
+  esac
+done
+fi
+
+SRC="d:/git/thredds/dap4/d4tests/src/test/data/resources"
+
+# Compare files instead of recreating
+if test "x$DEBUG" = x1 ; then
+  pushd ./daptestfiles
+  F=`ls -1 *.dap | sed -e 's/[.]dap//' |tr '\r\n' '  '`
+  popd
+  for f in ${F} ; do
+    if ! diff -wBb ${SRC}/dmrtestfiles/${f}.dmr ./dmrtestfiles/${f}.dmr >& /dev/null ; then
+      echo diff -wBb ${SRC}/dmrtestfiles/${f}.dmr ./dmrtestfiles/${f}.dmr
+      diff -wBb ${SRC}/dmrtestfiles/${f}.dmr ./dmrtestfiles/${f}.dmr
+    fi
+  done
+  for f in ${F} ; do
+    diff -wBb ${SRC}/daptestfiles/${f}.dapr ./dmrtestfiles/${f}.dap
+  done
+  exit
+fi
+
+# Recreate the <testfiles> directories
+rm -fr ./daptestfiles ./cdltestfiles ./dmrtestfiles
+mkdir ./daptestfiles
+mkdir ./dmrtestfiles
+mkdir ./cdltestfiles
+
+# Copy the .dap and .dmr files
+cp ${SRC}/daptestfiles/*.dap ./daptestfiles
+cp ${SRC}/dmrtestfiles/*.dmr ./dmrtestfiles
+
+# Get the list of daptestfiles with the extensions removed
+pushd ./daptestfiles
+F=`ls -1 *.nc.dap | sed -e 's/[.]nc[.]dap//' |tr '\r\n' '  '`
+popd
+
+
+# For each .dap file, see if a corresponding .cdl file
+# exists in ${SRC}/testfiles; if so, copy it over.
+for f in ${F} ; do
+if test -e ${SRC}/testfiles/${f}.cdl ; then
+  cp ${SRC}/testfiles/${f}.cdl ./cdltestfiles
+else
+  echo "Not found: ${SRC}/testfiles/${f}.cdl"
+fi
+done
+
+# Compile the cdl files
+pushd ./cdltestfiles
+F=`ls -1 *.cdl | sed -e 's/[.]cdl//' |tr '\r\n' '  '`
+popd
+if ! test -e nctestfiles ; then mkdir nctestfiles; fi
+for f in $F ; do
+    ../ncgen/ncgen -4 -o nctestfiles/${f}.nc cdltestfiles/${f}.cdl 
+done
+
+# Fix the permissions; this is cosmetic
+pushd daptestfiles ; chmod a-x * ; popd
+pushd dmrtestfiles ; chmod a-x * ; popd
+pushd cdltestfiles ; chmod a-x * ; popd
+pushd nctestfiles ; chmod a-x * ; popd
+
+# If invoked with the argument "git", this
+# program will add the files to the git repo.
+if test "x${GITADD}" = x1 ; then
+git add daptestfiles/*.dap
+git add daptestfiles/*.dmr
+git add cdltestfiles/*.cdl
+git add nctestfiles/*.nc
+fi
+
+exit
diff --git a/ncdap_test/expected4/CMakeLists.txt b/dap4_test/nctestfiles/CMakeLists.txt
similarity index 100%
rename from ncdap_test/expected4/CMakeLists.txt
rename to dap4_test/nctestfiles/CMakeLists.txt
diff --git a/dap4_test/nctestfiles/test_atomic_array.nc b/dap4_test/nctestfiles/test_atomic_array.nc
new file mode 100644
index 0000000..b8b9272
Binary files /dev/null and b/dap4_test/nctestfiles/test_atomic_array.nc differ
diff --git a/dap4_test/nctestfiles/test_atomic_types.nc b/dap4_test/nctestfiles/test_atomic_types.nc
new file mode 100644
index 0000000..dc66596
Binary files /dev/null and b/dap4_test/nctestfiles/test_atomic_types.nc differ
diff --git a/dap4_test/nctestfiles/test_enum.nc b/dap4_test/nctestfiles/test_enum.nc
new file mode 100644
index 0000000..d50b505
Binary files /dev/null and b/dap4_test/nctestfiles/test_enum.nc differ
diff --git a/dap4_test/nctestfiles/test_enum_2.nc b/dap4_test/nctestfiles/test_enum_2.nc
new file mode 100644
index 0000000..4e0e0a3
Binary files /dev/null and b/dap4_test/nctestfiles/test_enum_2.nc differ
diff --git a/dap4_test/nctestfiles/test_enum_array.nc b/dap4_test/nctestfiles/test_enum_array.nc
new file mode 100644
index 0000000..d139a97
Binary files /dev/null and b/dap4_test/nctestfiles/test_enum_array.nc differ
diff --git a/dap4_test/nctestfiles/test_fill.nc b/dap4_test/nctestfiles/test_fill.nc
new file mode 100644
index 0000000..f40d8ab
Binary files /dev/null and b/dap4_test/nctestfiles/test_fill.nc differ
diff --git a/dap4_test/nctestfiles/test_groups1.nc b/dap4_test/nctestfiles/test_groups1.nc
new file mode 100644
index 0000000..41b6100
Binary files /dev/null and b/dap4_test/nctestfiles/test_groups1.nc differ
diff --git a/dap4_test/nctestfiles/test_one_var.nc b/dap4_test/nctestfiles/test_one_var.nc
new file mode 100644
index 0000000..4e0f435
Binary files /dev/null and b/dap4_test/nctestfiles/test_one_var.nc differ
diff --git a/dap4_test/nctestfiles/test_one_vararray.nc b/dap4_test/nctestfiles/test_one_vararray.nc
new file mode 100644
index 0000000..4d46d2e
Binary files /dev/null and b/dap4_test/nctestfiles/test_one_vararray.nc differ
diff --git a/dap4_test/nctestfiles/test_opaque.nc b/dap4_test/nctestfiles/test_opaque.nc
new file mode 100644
index 0000000..428125b
Binary files /dev/null and b/dap4_test/nctestfiles/test_opaque.nc differ
diff --git a/dap4_test/nctestfiles/test_opaque_array.nc b/dap4_test/nctestfiles/test_opaque_array.nc
new file mode 100644
index 0000000..104e839
Binary files /dev/null and b/dap4_test/nctestfiles/test_opaque_array.nc differ
diff --git a/dap4_test/nctestfiles/test_struct1.nc b/dap4_test/nctestfiles/test_struct1.nc
new file mode 100644
index 0000000..2a6b404
Binary files /dev/null and b/dap4_test/nctestfiles/test_struct1.nc differ
diff --git a/dap4_test/nctestfiles/test_struct_array.nc b/dap4_test/nctestfiles/test_struct_array.nc
new file mode 100644
index 0000000..5ca7c63
Binary files /dev/null and b/dap4_test/nctestfiles/test_struct_array.nc differ
diff --git a/dap4_test/nctestfiles/test_struct_nested.nc b/dap4_test/nctestfiles/test_struct_nested.nc
new file mode 100644
index 0000000..74e0935
Binary files /dev/null and b/dap4_test/nctestfiles/test_struct_nested.nc differ
diff --git a/dap4_test/nctestfiles/test_struct_nested3.nc b/dap4_test/nctestfiles/test_struct_nested3.nc
new file mode 100644
index 0000000..4c41a64
Binary files /dev/null and b/dap4_test/nctestfiles/test_struct_nested3.nc differ
diff --git a/dap4_test/nctestfiles/test_struct_type.nc b/dap4_test/nctestfiles/test_struct_type.nc
new file mode 100644
index 0000000..2a6b404
Binary files /dev/null and b/dap4_test/nctestfiles/test_struct_type.nc differ
diff --git a/dap4_test/nctestfiles/test_unlim1.nc b/dap4_test/nctestfiles/test_unlim1.nc
new file mode 100644
index 0000000..45b8ea8
Binary files /dev/null and b/dap4_test/nctestfiles/test_unlim1.nc differ
diff --git a/dap4_test/nctestfiles/test_utf8.nc b/dap4_test/nctestfiles/test_utf8.nc
new file mode 100644
index 0000000..4f7e842
Binary files /dev/null and b/dap4_test/nctestfiles/test_utf8.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen1.nc b/dap4_test/nctestfiles/test_vlen1.nc
new file mode 100644
index 0000000..d17c68a
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen1.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen2.nc b/dap4_test/nctestfiles/test_vlen2.nc
new file mode 100644
index 0000000..a434a12
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen2.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen3.nc b/dap4_test/nctestfiles/test_vlen3.nc
new file mode 100644
index 0000000..2b38989
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen3.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen4.nc b/dap4_test/nctestfiles/test_vlen4.nc
new file mode 100644
index 0000000..c2c09b5
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen4.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen5.nc b/dap4_test/nctestfiles/test_vlen5.nc
new file mode 100644
index 0000000..7722663
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen5.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen6.nc b/dap4_test/nctestfiles/test_vlen6.nc
new file mode 100644
index 0000000..162cef9
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen6.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen7.nc b/dap4_test/nctestfiles/test_vlen7.nc
new file mode 100644
index 0000000..cb362cb
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen7.nc differ
diff --git a/dap4_test/nctestfiles/test_vlen8.nc b/dap4_test/nctestfiles/test_vlen8.nc
new file mode 100644
index 0000000..6b19ea8
Binary files /dev/null and b/dap4_test/nctestfiles/test_vlen8.nc differ
diff --git a/dap4_test/test_common.h b/dap4_test/test_common.h
new file mode 100644
index 0000000..c9e38f2
--- /dev/null
+++ b/dap4_test/test_common.h
@@ -0,0 +1,186 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/* Define various things common to all the t_dmr*.c testers */
+#undef DEBUG
+#undef DUMP
+
+#include "d4includes.h"
+
+#ifdef DEBUG
+#include "ezxml.h"
+#endif
+
+typedef int TDMR;
+#define TDMR_PARSE 1
+#define TDMR_META  2
+#define TDMR_DATA  4
+
+static NCbytes* input = NULL;
+static NCbytes* output = NULL;
+static NCD4meta* metadata = NULL;
+static char* infile = NULL;
+static char* outfile = NULL;
+static int ncid = 0;
+static int translatenc4 = 0;
+
+static int
+readfile(const char* filename, NCbytes* content)
+{
+    FILE* stream;
+    char part[1024];
+
+    stream = fopen(filename,"r");
+    if(stream == NULL) return errno;
+    for(;;) {
+	size_t count = fread(part, 1, sizeof(part), stream);
+	if(count <= 0) break;
+	ncbytesappendn(content,part,count);
+	if(ferror(stream)) {fclose(stream); return NC_EIO;}
+	if(feof(stream)) break;
+    }
+    ncbytesnull(content);
+    fclose(stream);
+    return NC_NOERR;
+}
+
+static void
+fail(int code)
+{
+    if(code != NC_NOERR)
+	fprintf(stderr,"***Fail: %s\n",nc_strerror(code));
+    exit((code==NC_NOERR?EXIT_SUCCESS:EXIT_FAILURE));
+}
+
+static void
+setup(int tdmr, int argc, char** argv)
+{
+    int ret = NC_NOERR;
+    argc--; argv++;
+    int expected = 0;
+    NCD4mode mode = 0;
+
+    switch(tdmr) {
+    case TDMR_PARSE:
+	expected = 1;
+	mode = NCD4_DMR;
+	break;
+    case TDMR_META:
+	expected = 2;
+	mode = NCD4_DMR;
+	break;
+    case TDMR_DATA:
+	fprintf(stderr,"setup is not used for t_dmrdata\n");
+	mode = NCD4_DAP;
+	exit(1);
+    }    
+
+    if(argc < expected) {
+	fprintf(stderr, "too few arguments\n");
+	exit(1);
+    }
+    infile = argv[0];    
+    outfile = NULL;
+    input = ncbytesnew();
+    output = ncbytesnew();
+    if((ret = readfile(infile,input))) fail(ret);
+    {
+	const char* trans = getenv("translatenc4");
+	if(trans != NULL)
+	    translatenc4 = 1;
+    }
+
+#ifdef DUMP
+    NCD4_dumpbytes(ncbyteslength(input),ncbytescontents(input),0);
+#endif
+
+    if((metadata=NCD4_newmeta(ncbyteslength(input),ncbytescontents(input)))==NULL)
+	fail(NC_ENOMEM);
+    metadata->mode = mode;
+
+    /* Create a fake NCD4INFO */
+    {
+	NCD4INFO* controller = (NCD4INFO*)calloc(1,sizeof(NCD4INFO));
+	if(controller == NULL)
+	    fail(NC_ENOMEM);
+        metadata->controller = controller;
+	controller->controls.translation = NCD4_TRANSNC4;
+        if(translatenc4)
+	    controller->controls.translation = NCD4_TRANSNC4;
+    }
+    if((ret=NCD4_dechunk(metadata))) /* ok for mode == DMR or mode == DAP */
+	fail(ret);
+#ifdef DEBUG
+    {
+	int swap = (metadata->serial.hostbigendian != metadata->serial.remotebigendian);
+	void* d = metadata->serial.dap;
+	size_t sz = metadata->serial.dapsize;
+	fprintf(stderr,"====================\n");
+	fprintf(stderr,"%s\n",metadata->serial.dmr);
+	fprintf(stderr,"----------\n");
+	NCD4_dumpbytes(sz,d,swap);
+	fprintf(stderr,"====================\n");
+	fflush(stderr);
+    }
+#endif
+    if(expected > 1) {
+        outfile = argv[1];
+        if((ret = nc_create(outfile,NC_CLOBBER|NC_NETCDF4,&ncid))) fail(ret);
+    }
+
+#ifdef DEBUG
+    {
+	char* tree;
+	ezxml_t dom = ezxml_parse_str(ncbytescontents(input),ncbyteslength(input));
+	if(dom == NULL) exit(1);
+	tree = ezxml_toxml(dom);
+	fprintf(stderr,"////////////////////\n");
+	fprintf(stderr,"%s\n",tree);
+	fprintf(stderr,"////////////////////\n");
+    }
+#endif
+    {
+	const char* slevel = getenv("d4loglevel");
+	int level;
+	if(slevel != NULL && sscanf(slevel,"%d",&level) == 1) {
+            nc_set_log_level(level);
+	}
+    }
+}
+
+int
+cleanup(int ret)
+{
+    if(outfile != NULL) {
+        if(ret != NC_NOERR)
+            ret = nc_abort(ncid);
+        else
+            ret = nc_close(ncid);
+    }	
+    if(metadata->controller != NULL)
+	free(metadata->controller);
+    NCD4_reclaimMeta(metadata);
+    ncbytesfree(input);
+    ncbytesfree(output);
+    if(ret)
+	fail(ret);
+    else
+        exit(EXIT_SUCCESS);
+    return 0;
+}
+
+#if 0
+static void
+printxml(const char* input)
+{
+    char* tree;
+    ezxml_t dom = ezxml_parse_str(input,strlen(input));
+    if(dom == NULL) exit(1);
+    tree = ezxml_toxml(dom);
+    fprintf(stderr,"////////////////////\n");
+    fprintf(stderr,"%s\n",tree);
+    fprintf(stderr,"////////////////////\n");
+}
+#endif
diff --git a/dap4_test/test_data.c b/dap4_test/test_data.c
new file mode 100644
index 0000000..10df5fa
--- /dev/null
+++ b/dap4_test/test_data.c
@@ -0,0 +1,52 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/**
+Test the netcdf-4 data building process.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+
+static void
+fail(int code)
+{
+    if(code != NC_NOERR)
+	fprintf(stderr,"***Fail: %s\n",nc_strerror(code));
+    exit((code==NC_NOERR?EXIT_SUCCESS:EXIT_FAILURE));
+}
+
+int
+main(int argc, char** argv)
+{
+    int ret = NC_NOERR;
+    char url[4096];
+    int ncid;
+
+    /* Skip cmd name */
+    argc++;
+    argv++;
+
+    if(argc < 2) {
+	fprintf(stderr, "too few arguments: t_dmrdata.c <infile> <outfile>\n");
+	fail(NC_NOERR);
+    }
+
+    /* build the url */
+    snprintf(url,sizeof(url),"file://%s#dap4&debug=copy&substratename=%s",argv[0],argv[1]);
+
+#ifdef DEBUG
+    fprintf(stderr,"t_dmrbuild %s -> %s\n",url,outfile);
+#endif
+  
+    /* Use the open/close mechanism */
+    if((ret=nc_open(url,NC_NETCDF4,&ncid))) goto done;
+    if((ret=nc_close(ncid))) goto done;
+
+done:
+    fprintf(stderr,"code=%d %s\n",ret,nc_strerror(ret));
+    return (ret ? 1 : 0);
+}
diff --git a/dap4_test/test_data.sh b/dap4_test/test_data.sh
new file mode 100755
index 0000000..277c1df
--- /dev/null
+++ b/dap4_test/test_data.sh
@@ -0,0 +1,90 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+cd ${DAPTESTFILES}
+F=`ls -1 *.dap | sed -e 's/[.]dap//g' | tr '\r\n' '  '`
+cd $WD
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINE}/*.d4d ; fi
+for f in $F ; do
+    echo "testing: ${f}"
+    if ! ${VG} ${execdir}/test_data ${DAPTESTFILES}/${f} ./results/${f}.nc ; then
+        failure "${execdir}/test_data ${DAPTESTFILES}/${f} ./results/${f}.nc"
+    fi
+    ${NCDUMP} ./results/${f}.nc > ./results/${f}.d4d
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINE}/${f}.d4d ./results/${f}.d4d ; then
+	    failure "diff -wBb ${BASELINE}/${f}.d4d ./results/${f}.d4d"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.d4d ${BASELINE}/${f}.d4d
+    fi
+done
+
+# Remove empty lines and trim lines in a cdl file
+trim() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | sed -e 's/^[\t ]*\([^\t ]*\)[\t ]*$/\\1/'`
+      if test "x$oline" = x ; then continue ; fi
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+# Do cleanup on the baseline file
+baseclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | tr "'" '"'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+# Do cleanup on the result file
+resultclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | sed -e 's|^\(netcdf.*\)[.]nc\(.*\)$|\\1\\2|'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+if test "x${CDLDIFF}" = x1 ; then
+  for f in $F ; do
+    STEM=`echo $f | cut -d. -f 1`
+    if ! test -e ${CDLTESTFILES}/${STEM}.cdl ; then
+      echo "Not found: ${CDLTESTFILES}/${STEM}.cdl"
+      continue
+    fi
+    echo "diff -wBb ${CDLTESTFILES}/${STEM}.cdl ./results/${f}.d4d"
+    rm -f ./b1 ./b2 ./r1 ./r2
+    trim ${CDLTESTFILES}/${STEM}.cdl ./b1
+    trim ./results/${f}.d4d ./r1
+    baseclean b1 b2
+    resultclean r1 r2  
+    if ! diff -wBb ./b2 ./r2 ; then
+	failure "${f}" 
+    fi
+  done
+fi
+
+finish
+
+
diff --git a/dap4_test/test_environment4.c b/dap4_test/test_environment4.c
new file mode 100644
index 0000000..f688056
--- /dev/null
+++ b/dap4_test/test_environment4.c
@@ -0,0 +1,46 @@
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define XSTRINGIFY(s) #s
+#define STRINGIFY(s) XSTRINGIFY(s)
+
+#ifdef _MSC_VER
+static const char* SEP = "\\";
+#else
+static const char* SEP = "/";
+#endif
+
+int
+main(int argc, char** argv)
+{
+    char arg[8192];
+    char* p;
+    const char* result = "";
+
+    if(argc < 2) goto done; /* return nothing */
+    strncpy(arg,argv[1],sizeof(arg));
+    for(p=arg;*p;p++) { /* convert to lower case */
+	int c = *p;
+        if(c >= 'A' && c <= 'Z') c = ((c - 'A') + 'a');
+	*p = (char)c;
+    }    
+    do {
+#ifdef TOPSRCDIR
+    if(strcmp(arg,"topsrcdir") == 0) {
+        result = STRINGIFY(TOPSRCDIR);
+	break;
+    }
+#endif
+#ifdef TOPBINDIR
+    if(strcmp(arg,"topbindir") == 0) {
+        result = STRINGIFY(TOPBINDIR);
+	break;
+    }
+#endif
+    } while(0);
+done:
+    printf("%s",result);
+    return 0;
+}
diff --git a/dap4_test/test_hyrax.sh b/dap4_test/test_hyrax.sh
new file mode 100755
index 0000000..a2252f0
--- /dev/null
+++ b/dap4_test/test_hyrax.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
+export srcdir;
+
+. ${srcdir}/../test_common.sh
+
+FRAG="#checksummode=ignore"
+
+F="\
+nc4_nc_classic_comp.nc \
+nc4_nc_classic_no_comp.nc \
+nc4_strings.nc \
+nc4_strings_comp.nc \
+nc4_unsigned_types.nc \
+nc4_unsigned_types_comp.nc \
+ref_tst_compounds.nc \
+"
+
+failure() {
+      echo "*** Fail: $1"
+      exit 1
+}
+
+rm -fr ./results
+mkdir -p ./results
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINEH}/*.dmp ; fi
+for f in $F ; do
+    URL="dap4://test.opendap.org:8080/opendap/nc4_test_files/${f}${FRAG}"
+    echo "testing: $URL"
+    if ! ${NCDUMP} "${URL}" > ./results/${f}.hyrax; then
+        failure "${URL}"
+    fi
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINEREM}/${f}.hyrax ./results/${f}.hyrax ; then
+	    failure "diff ${f}.hyrax"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.hyrax ${BASELINEH}/${f}.hyrax
+    fi
+done
+
+echo "*** Pass"
+exit 0
+
diff --git a/dap4_test/test_meta.c b/dap4_test/test_meta.c
new file mode 100644
index 0000000..f0bf227
--- /dev/null
+++ b/dap4_test/test_meta.c
@@ -0,0 +1,29 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/**
+Test the netcdf-4 metadata building process.
+*/
+
+#include "test_common.h"
+
+int
+main(int argc, char** argv)
+{
+    int ret = NC_NOERR;
+
+    setup(TDMR_META,argc,argv);
+
+#ifdef DEBUG
+    fprintf(stderr,"t_dmrmeta %s -> %s\n",infile,outfile);
+#endif
+
+    if((ret = NCD4_parse(metadata))) goto done;
+    if((ret = NCD4_metabuild(metadata,ncid))) goto done;
+
+done:
+    return cleanup(ret);
+}
+
diff --git a/dap4_test/test_meta.sh b/dap4_test/test_meta.sh
new file mode 100755
index 0000000..d659fdc
--- /dev/null
+++ b/dap4_test/test_meta.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+cd ${DMRTESTFILES}
+F=`ls -1 *.dmr | sed -e 's/[.]dmr//g' | tr '\r\n' '  '`
+cd $WD
+
+CDL=
+for f in ${F} ; do
+STEM=`echo $f | cut -d. -f 1`
+if test -e ${CDLTESTFILES}/${STEM}.cdl ; then
+  CDL="${CDL} ${STEM}"
+else
+  echo "Not found: ${CDLTESTFILES}/${STEM}.cdl"
+fi
+done
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINE}/*.d4m ; fi
+
+for f in ${F} ; do
+    echo "checking: $f"
+    if ! ${VG} ${execdir}/test_meta ${DMRTESTFILES}/${f}.dmr ./results/${f} ; then
+        failure "${execdir}/test_meta ${DMRTESTFILES}/${f}.dmr ./results/${f}"
+    fi
+    ${NCDUMP} -h ./results/${f} > ./results/${f}.d4m
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINE}/${f}.d4m ./results/${f}.d4m ; then
+	    failure "diff -wBb ${BASELINE}/${f}.ncdump ./results/${f}.d4m"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.d4m ${BASELINE}/${f}.d4m
+    fi
+done
+
+if test "x${CDLDIFF}" = x1 ; then
+  for f in $CDL ; do
+    echo "diff -wBb ${CDLTESTFILES}/${f}.cdl ./results/${f}.d4m"
+    rm -f ./tmp
+    cat ${CDLTESTFILES}/${f}.cdl \
+    cat >./tmp
+    echo diff -wBbu ./tmp ./results/${f}.d4m
+    if ! diff -wBbu ./tmp ./results/${f}.d4m ; then
+	failure "${f}" 
+    fi
+  done
+fi
+
+finish
+
+
diff --git a/dap4_test/test_parse.c b/dap4_test/test_parse.c
new file mode 100644
index 0000000..44075ff
--- /dev/null
+++ b/dap4_test/test_parse.c
@@ -0,0 +1,29 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/**
+This provides a simple dap4  metadata -> xml printer.
+Used to test the parser
+*/
+
+#include "test_common.h"
+
+int
+main(int argc, char** argv)
+{
+    int ret = NC_NOERR;
+
+    setup(TDMR_PARSE,argc,argv);
+
+    if((ret = NCD4_parse(metadata))) goto done;
+    ret = NCD4_print(metadata,output);
+    ncbytesnull(output);
+    if(ret == NC_NOERR) {
+        fprintf(stdout,"%s\n",ncbytescontents(output));
+	fflush(stdout);
+    }
+done:
+    return cleanup(ret);
+}
diff --git a/dap4_test/test_parse.sh b/dap4_test/test_parse.sh
new file mode 100755
index 0000000..a21aea5
--- /dev/null
+++ b/dap4_test/test_parse.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+cd ${DMRTESTFILES}
+F=`ls -1 *.dmr | sed -e 's/[.]dmr//' |tr '\r\n' '  '`
+cd $WD
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINE}/*.d4p ; fi
+for f in $F ; do
+    echo "testing: $f"
+    if ! ${VG} ${execdir}/test_parse ${DMRTESTFILES}/${f}.dmr > ./results/${f}.d4p ; then
+	failure "${f}"
+    fi
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINE}/${f}.d4p ./results/${f}.d4p ; then
+	    failure "${f}"
+	fi
+    elif test "x${DIFF}" = x1 ; then
+	echo "diff -wBb ${DMRTESTFILES}/${f}.dmr ./results/${f}.d4p"
+	rm -f ./tmp
+	cat ./results/${f}.d4p \
+	| sed -e '/<Dimensions>/d' -e '/<Types>'/d -e '/<Variables>'/d -e '/<Groups>'/d \
+	| sed -e '/<\/Dimensions>/d' -e '/<\/Types>'/d -e '/<\/Variables>'/d -e '/<\/Groups>'/d  \
+	| sed -e '/_edu.ucar.opaque.size/,+2d' \
+	| cat > ./tmp
+	if ! diff -wBb ${DMRTESTFILES}/${f}.dmr ./tmp ; then
+	    failure "${f}" 
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.d4p ${BASELINE}/${f}.d4p	
+    fi
+done
+
+finish
+
+exit 0
+
+
diff --git a/dap4_test/test_raw.sh b/dap4_test/test_raw.sh
new file mode 100755
index 0000000..5d0c270
--- /dev/null
+++ b/dap4_test/test_raw.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+# Compute the set of testfiles
+PUSHD ${srcdir}/daptestfiles
+F=`ls -1d *.dap`
+POPD
+F=`echo $F | tr '\r\n' '  '`
+F=`echo $F | sed -e s/.dap//g`
+
+# Do cleanup on the baseline file
+baseclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | tr "'" '"'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+# Do cleanup on the result file
+resultclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | sed -e 's|^\(netcdf.*\)[.]nc\(.*\)$|\\1\\2|'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINERAW}/*.dmp ; fi
+for f in $F ; do
+    echo "testing: $f"
+    URL="[dap4]file://${DAPTESTFILES}/${f}"
+    if ! ${VG} ${NCDUMP} "${URL}" > ./results/${f}.dmp; then
+        failure "${URL}"
+    fi
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINERAW}/${f}.dmp ./results/${f}.dmp ; then
+	    failure "diff ${f}.dmp"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.dmp ${BASELINERAW}/${f}.dmp
+    elif test "x${DIFF}" = x1 ; then
+	echo "hdrtest: ${f}"
+	rm -f ./tr1 ./tr2 ./tb1 ./tb2
+	baseclean 
+        if ! diff -wBb ./${BASELINERAW}/${f}.dmp ./${BASELINE}/${f}.ncdump ; then
+          failure diff -wBb ./${BASELINERAW}/${f}.dmp ./${BASELINE}/${f}.ncdump
+	fi
+    fi
+done
+
+finish
+
diff --git a/dap4_test/test_remote.sh b/dap4_test/test_remote.sh
new file mode 100755
index 0000000..e37ea00
--- /dev/null
+++ b/dap4_test/test_remote.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+#BIG=1
+#NOCSUM=1
+
+F="\
+test_atomic_array.nc
+test_atomic_types.nc
+test_enum.nc
+test_enum_2.nc
+test_enum_array.nc
+test_fill.nc
+test_groups1.nc
+test_misc1.nc
+test_one_var.nc
+test_one_vararray.nc
+test_opaque.nc
+test_opaque_array.nc
+test_struct1.nc
+test_struct_array.nc
+test_struct_nested.nc
+test_struct_nested3.nc
+test_struct_type.nc
+test_utf8.nc
+test_vlen1.nc
+test_vlen2.nc
+test_vlen3.nc
+test_vlen4.nc
+test_vlen5.nc
+test_vlen6.nc
+test_vlen7.nc
+test_vlen8.nc
+test_vlen9.nc
+test_vlen10.nc
+test_vlen11.nc
+tst_fills.nc
+test_struct_nested.hdf5
+test_struct_nested3.hdf5
+test_vlen3.hdf5
+test_vlen4.hdf5
+test_vlen5.hdf5
+test_anon_dim.syn
+test_atomic_array.syn
+test_atomic_types.syn
+test_sequence_1.syn
+test_sequence_2.syn
+test_struct_array.syn
+"
+
+TESTSERVER=`${execdir}/findtestserver4 dap4 d4ts`
+if test "x$TESTSERVER" = x ; then
+echo "***XFAIL: Cannot find d4ts testserver"
+exit 0
+fi
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINER}/*.dmp ; fi
+for f in $F ; do
+    URL="[log][dap4]${TESTSERVER}/d4ts/testfiles/${f}"
+    if test "x$BIG" = x1; then
+	URL="[ucar.littleendian=0]${URL}"
+    fi
+    if test "x$NOCSUM" = x1; then
+	URL="[ucar.checksummode=none]${URL}"
+    fi
+    if ! ${VG} ${NCDUMP} "${URL}" > ./results/${f}.dmp; then
+        failure "${URL}"
+    fi
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINEREM}/${f}.dmp ./results/${f}.dmp ; then
+	    failure "diff ${f}.dmp"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.dmp ${BASELINEREM}/${f}.dmp
+    fi
+done
+
+finish
+
diff --git a/dap4_test/test_test.sh b/dap4_test/test_test.sh
new file mode 100755
index 0000000..536b239
--- /dev/null
+++ b/dap4_test/test_test.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+if test "x$srcdir" = "x" ; then srcdir=`dirname $0`; fi; export srcdir
+
+rm -f log.log
+sh -x ${srcdir}/test_parse.sh >& ./parse.log >& log.log
+cat log.log /dev/tty
+
+exit 0
diff --git a/dap4_test/tst_data.sh b/dap4_test/tst_data.sh
new file mode 100755
index 0000000..043b593
--- /dev/null
+++ b/dap4_test/tst_data.sh
@@ -0,0 +1,89 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+cd ${DAPTESTFILES}
+F=`ls -1 *.dap | sed -e 's/[.]dap//g' | tr '\r\n' '  '`
+cd $WD
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINE}/*.d4d ; fi
+for f in $F ; do
+    echo "testing: ${f}"
+    if ! ${VG} ${execdir}/test_data ${DAPTESTFILES}/${f} ./results/${f}.nc ; then
+        failure "${execdir}/test_data ${DAPTESTFILES}/${f} ./results/${f}.nc"
+    fi
+    ${NCDUMP} ./results/${f}.nc > ./results/${f}.d4d
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINE}/${f}.d4d ./results/${f}.d4d ; then
+	    failure "diff -wBb ${BASELINE}/${f}.d4d ./results/${f}.d4d"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.d4d ${BASELINE}/${f}.d4d
+    fi
+done
+
+# Remove empty lines and trim lines in a cdl file
+trim() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | sed -e 's/^[\t ]*\([^\t ]*\)[\t ]*$/\\1/'`
+      if test "x$oline" = x ; then continue ; fi
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+# Do cleanup on the baseline file
+baseclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | tr "'" '"'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+# Do cleanup on the result file
+resultclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | sed -e 's|^\(netcdf.*\)[.]nc\(.*\)$|\\1\\2|'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+if test "x${CDLDIFF}" = x1 ; then
+  for f in $F ; do
+    STEM=`echo $f | cut -d. -f 1`
+    if ! test -e ${CDLTESTFILES}/${STEM}.cdl ; then
+      echo "Not found: ${CDLTESTFILES}/${STEM}.cdl"
+      continue
+    fi
+    echo "diff -wBb ${CDLTESTFILES}/${STEM}.cdl ./results/${f}.d4d"
+    rm -f ./b1 ./b2 ./r1 ./r2
+    trim ${CDLTESTFILES}/${STEM}.cdl ./b1
+    trim ./results/${f}.d4d ./r1
+    baseclean b1 b2
+    resultclean r1 r2  
+    if ! diff -wBb ./b2 ./r2 ; then
+	failure "${f}" 
+    fi
+  done
+fi
+
+finish
+
diff --git a/dap4_test/tst_meta.sh b/dap4_test/tst_meta.sh
new file mode 100755
index 0000000..7414bee
--- /dev/null
+++ b/dap4_test/tst_meta.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+cd ${DMRTESTFILES}
+F=`ls -1 *.dmr | sed -e 's/[.]dmr//g' | tr '\r\n' '  '`
+cd $WD
+
+CDL=
+for f in ${F} ; do
+STEM=`echo $f | cut -d. -f 1`
+if test -e ${CDLTESTFILES}/${STEM}.cdl ; then
+  CDL="${CDL} ${STEM}"
+else
+  echo "Not found: ${CDLTESTFILES}/${STEM}.cdl"
+fi
+done
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINE}/*.d4m ; fi
+
+for f in ${F} ; do
+    echo "checking: $f"
+    if ! ${VG} ${execdir}/test_meta ${DMRTESTFILES}/${f}.dmr ./results/${f} ; then
+        failure "${execdir}/test_meta ${DMRTESTFILES}/${f}.dmr ./results/${f}"
+    fi
+    ${NCDUMP} -h ./results/${f} > ./results/${f}.d4m
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINE}/${f}.d4m ./results/${f}.d4m ; then
+	    failure "diff -wBb ${BASELINE}/${f}.ncdump ./results/${f}.d4m"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.d4m ${BASELINE}/${f}.d4m
+    fi
+done
+
+if test "x${CDLDIFF}" = x1 ; then
+  for f in $CDL ; do
+    echo "diff -wBb ${CDLTESTFILES}/${f}.cdl ./results/${f}.d4m"
+    rm -f ./tmp
+    cat ${CDLTESTFILES}/${f}.cdl \
+    cat >./tmp
+    echo diff -wBbu ./tmp ./results/${f}.d4m
+    if ! diff -wBbu ./tmp ./results/${f}.d4m ; then
+	failure "${f}" 
+    fi
+  done
+fi
+
+finish
+
diff --git a/dap4_test/tst_parse.sh b/dap4_test/tst_parse.sh
new file mode 100755
index 0000000..99d30dd
--- /dev/null
+++ b/dap4_test/tst_parse.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+cd ${DMRTESTFILES}
+F=`ls -1 *.dmr | sed -e 's/[.]dmr//' |tr '\r\n' '  '`
+cd $WD
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINE}/*.d4p ; fi
+for f in $F ; do
+    echo "testing: $f"
+    if ! ${VG} ${execdir}/test_parse ${DMRTESTFILES}/${f}.dmr > ./results/${f}.d4p ; then
+	failure "${f}"
+    fi
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINE}/${f}.d4p ./results/${f}.d4p ; then
+	    failure "${f}"
+	fi
+    elif test "x${DIFF}" = x1 ; then
+	echo "diff -wBb ${DMRTESTFILES}/${f}.dmr ./results/${f}.d4p"
+	rm -f ./tmp
+	cat ./results/${f}.d4p \
+	| sed -e '/<Dimensions>/d' -e '/<Types>'/d -e '/<Variables>'/d -e '/<Groups>'/d \
+	| sed -e '/<\/Dimensions>/d' -e '/<\/Types>'/d -e '/<\/Variables>'/d -e '/<\/Groups>'/d  \
+	| sed -e '/_edu.ucar.opaque.size/,+2d' \
+	| cat > ./tmp
+	if ! diff -wBb ${DMRTESTFILES}/${f}.dmr ./tmp ; then
+	    failure "${f}" 
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.d4p ${BASELINE}/${f}.d4p	
+    fi
+done
+
+finish
+
+exit 0
+
diff --git a/dap4_test/tst_raw.sh b/dap4_test/tst_raw.sh
new file mode 100755
index 0000000..c2e2a94
--- /dev/null
+++ b/dap4_test/tst_raw.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+. ${srcdir}/d4test_common.sh
+
+set -x
+
+# Compute the set of testfiles
+PUSHD ${srcdir}/daptestfiles
+F=`ls -1d *.dap`
+POPD
+F=`echo $F | tr '\r\n' '  '`
+F=`echo $F | sed -e s/.dap//g`
+
+# Do cleanup on the baseline file
+baseclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | tr "'" '"'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+# Do cleanup on the result file
+resultclean() {
+  if test $# != 2 ; then
+    echo "simplify: too few args"
+  else
+    rm -f $2
+    while read -r iline; do
+      oline=`echo $iline | sed -e 's|^\(netcdf.*\)[.]nc\(.*\)$|\\1\\2|'`
+      echo "$oline" >> $2
+    done < $1
+  fi
+}
+
+if test "x${RESET}" = x1 ; then rm -fr ${BASELINERAW}/*.dmp ; fi
+for f in $F ; do
+    echo "testing: $f"
+    URL="[dap4]file:${DAPTESTFILES}/${f}"
+    if ! ${VG} ${NCDUMP} "${URL}" > ./results/${f}.dmp; then
+        failure "${URL}"
+    fi
+    if test "x${TEST}" = x1 ; then
+	if ! diff -wBb ${BASELINERAW}/${f}.dmp ./results/${f}.dmp ; then
+	    failure "diff ${f}.dmp"
+	fi
+    elif test "x${RESET}" = x1 ; then
+	echo "${f}:" 
+	cp ./results/${f}.dmp ${BASELINERAW}/${f}.dmp
+    elif test "x${DIFF}" = x1 ; then
+	echo "hdrtest: ${f}"
+	rm -f ./tr1 ./tr2 ./tb1 ./tb2
+	baseclean 
+        if ! diff -wBb ./${BASELINERAW}/${f}.dmp ./${BASELINE}/${f}.ncdump ; then
+          failure diff -wBb ./${BASELINERAW}/${f}.dmp ./${BASELINE}/${f}.ncdump
+	fi
+    fi
+done
+
+finish
diff --git a/docs/DAP4.dox b/docs/DAP4.dox
new file mode 100644
index 0000000..727659a
--- /dev/null
+++ b/docs/DAP4.dox
@@ -0,0 +1,105 @@
+/*! \page dap4 DAP4 Support
+
+\section dap4_accessing The DAP4 Prototocol
+
+\tableofcontents
+
+\subsection dap4_introduction DAP4 Introduction
+
+Beginning with netCDF version 4.2.2, optional support is provided for
+accessing data through DAP4 servers using the DAP4 protocol.
+
+DAP4 support is automatically enabled if a usable curl library can be
+set using the LDFLAGS environment variable (similar to the way
+that the HDF5 libraries are referenced).
+DAP2 plus DAP4 support can forcibly be enabled or disabled using the --enable-dap
+flag or the --disable-dap flag, respectively.  If enabled,
+then DAP4 support requires access to the curl library.
+Refer to the installation manual for details
+
+DAP4 uses a data model that is similar to, but not identical with,
+the netCDF-Enhanced (aka netcdf-4) model.
+Generically, the DAP4 data model is encoded in XML document
+called a DMR.
+For detailed information about the DAP4 DMR, refer to
+the DAP4 specification Volume 1:
+http://docs.opendap.org/index.php/DAP4:_Specification_Volume_1
+
+\subsection dap4_access Accessing Data Using the DAP4 Prototocol
+
+In order to access a DAP4 data source through the netCDF API, the
+file name normally used is replaced with a URL with a specific
+format. The URL is composed of three parts.
+ -  URL - this is a standard form URL with specific markers to indicate that
+    it refers to a DAP4 encoded dataset. The markers can be one of the following
+    examples.
+    +  [dap4]http://remotetest.unidata.ucar.edu/d4ts/test.01
+    +  [protocol=dap4]http://remotetest.unidata.ucar.edu/d4ts/test.01
+    +  http://remotetest.unidata.ucar.edu/d4ts/test.01#dap4
+    +  http://remotetest.unidata.ucar.edu/d4ts/test.01#protocol=dap4
+    +  dap4://remotetest.unidata.ucar.edu/d4ts/test.01
+
+    Note that the last case is converted internally to one of the other forms.
+
+ -  Constraints - these are suffixed to the URL and take the form
+    “?dap4.ce=\<expression\>”. The form of the constraint expression
+    is somewhat complicated, and the specification should be consulted.
+
+
+ - Client parameters - these may be specified in either of
+   two ways.  The older, deprecated form prefixes text to the
+   front of the url and is of the the general form [\<name>]
+   or [\<name>=value].  Examples include [show=fetch].
+   The newer, preferred form prefixes the
+   parameters to the end of the url using the semi-standard '#'
+   format: e.g. http://....#show=fetch&noprefetch.
+
+It is possible to see what the translation does to a particular DAP4
+data source in two steps. First, one can examine the DMR
+source through a web browser and then second, one can examine
+the translation using the "ncdump -h" command to see the
+corresponding netCDF-4 representation.
+
+For example, if a web browser is given the following (fictional) URL,
+it will return the DMR for the specified dataset
+\code
+     http://remotetest.unidata.ucar.edu/d4ts/test.01.dmr#dap4
+\endcode
+
+By using the following ncdump command, it is possible to see the
+equivalent netCDF-4 translation.
+
+\code
+     ncdump -h http://remotetest.unidata.ucar.edu/d4ts/test.01#dap4
+\endcode
+
+\subsection dap4_defined_params Defined Client Parameters
+
+Currently, a limited set of client parameters is
+recognized. Parameters not listed here are
+ignored, but no error is signalled.
+
+Parameter Name Legal Values Semantics
+- "log" | "log=<file>" - Turn on logging and send the log output to
+  the specified file. If no file is specified, then output is sent to standard
+  error.
+- "show=fetch" - This parameter causes the netCDF code to log a copy
+  of the complete url for every HTTP get request. If logging is
+  enabled, then this can be helpful in checking to see the access
+  behavior of the netCDF code.
+
+\subsection dap4_debug Notes on Debugging DAP4 Access
+
+The DAP4 support has a logging facility.
+Note that this is currently separate from the
+existing netCDF logging facility. Turning on this logging can
+sometimes give important information. Logging can be enabled by
+using the client parameter "log" or "log=filename",
+where the first case will send log output to standard error and the
+second will send log output to the specified file.
+
+Users should also be aware that if one is
+accessing data over an NFS mount, one may see some .nfsxxxxx files;
+those can be ignored.
+
+*/
diff --git a/docs/Doxyfile.developer b/docs/Doxyfile.developer
old mode 100755
new mode 100644
index 412275a..df79acb
--- a/docs/Doxyfile.developer
+++ b/docs/Doxyfile.developer
@@ -38,7 +38,7 @@ PROJECT_NAME           = netCDF-C
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 4.4.1.1
+PROJECT_NUMBER         = 4.5.0-rc1
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
index 40daf82..3a0b762 100644
--- a/docs/Doxyfile.in
+++ b/docs/Doxyfile.in
@@ -754,6 +754,7 @@ INPUT = \
     @abs_top_srcdir@/docs/windows-binaries.md \
     @abs_top_srcdir@/docs/guide.dox \
     @abs_top_srcdir@/docs/OPeNDAP.dox \
+    @abs_top_srcdir@/docs/DAP4.dox \
     @abs_top_srcdir@/docs/attribute_conventions.md \
     @abs_top_srcdir@/docs/file_format_specifications.md \
     @abs_top_srcdir@/docs/tutorial.dox \
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 01a5209..ea06621 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -227,6 +227,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -254,12 +255,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -294,6 +297,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/docs/OPeNDAP.dox b/docs/OPeNDAP.dox
index 576f879..f4de888 100644
--- a/docs/OPeNDAP.dox
+++ b/docs/OPeNDAP.dox
@@ -1,8 +1,8 @@
-/*! \page dap_support DAP Support
+/*! \page dap2 DAP2 Support
 
 \tableofcontents
 
-\section dap_introduction OPeNDAP Introduction
+\section dap_introduction DAP2 (OPeNDAP) Introduction
 
 Beginning with netCDF version 4.1, optional support is provided for
 accessing data through OPeNDAP servers using the DAP protocol.
@@ -30,7 +30,6 @@ See the following pages for more information.
 
 - \subpage dap_accessing_data
 - <a href="auth.html">netCDF Authorization Support</a>
-- \subpage esg
 - \subpage dap_to_netcdf
 - \subpage dap2_reserved_keywords
 - \subpage var_dim_trans
@@ -38,8 +37,6 @@ See the following pages for more information.
 
 \page dap_accessing_data Accessing OPeNDAP Data
 
-\tableofcontents
-
 In order to access an OPeNDAP data source through the netCDF API, the
 file name normally used is replaced with a URL with a specific
 format. The URL is composed of three parts.
@@ -182,8 +179,6 @@ variables:
 
 \page dap_to_netcdf DAP to NetCDF Translation Rules
 
-\tableofcontents
-
 Currently only one translation available: DAP 2 Protocol to netCDF-3.
 There used to be a DAP 2 Protocol to netCDF-4 translation
 but that has been removed until the DAP4 protocol is available.
@@ -251,8 +246,6 @@ within grids are left out in order to mimic the behavior of libnc-dap.
 
 \page dap2_reserved_keywords DAP2 Reserved Keywords
 
-\tableofcontents
-
 In the OPeNDAP DAP2 protocol, there are a number of reserved keywords.  These keywords are case insensitive and if you use one as a netCDF variable name, you may encounter odd behavior such as case changes (depending on the client DDS/DAS parser).  The list of reserved keywords as used by the netCDF-C library parser are as follows:
 
 - alias
@@ -281,8 +274,6 @@ In the OPeNDAP DAP2 protocol, there are a number of reserved keywords.  These ke
 
 \page var_dim_trans Variable Dimension Translation
 
-\tableofcontents
-
 A variable's rank is determined from three sources.
 - The variable has the dimensions associated with the field it
 represents (e.g. S1.FS2.f1[3] in the above example).
@@ -377,8 +368,6 @@ dimensions:
 
 \page var_name_trans Variable Name Translation
 
-\tableofcontents
-
 The steps for variable name translation are as follows.
 
 Take the set of variables captured above. Thus for the above DDS, the
diff --git a/docs/file_format_specifications.md b/docs/file_format_specifications.md
index ebbf338..1d40e53 100644
--- a/docs/file_format_specifications.md
+++ b/docs/file_format_specifications.md
@@ -625,7 +625,7 @@ data are written). In that case the specified endian type will be used
 in HDF5 (for example, a H5T_STD_I16LE will be used for NC_SHORT, if
 little-endian has been specified for that variable.)
 - NC_BYTE = H5T_NATIVE_SCHAR
-- NC_UBYTE = H5T_NATIVE_SCHAR
+- NC_UBYTE = H5T_NATIVE_UCHAR
 - NC_CHAR = H5T_C_S1
 - NC_STRING = variable length array of H5T_C_S1
 - NC_SHORT = H5T_NATIVE_SHORT
diff --git a/docs/footer.html b/docs/footer.html
old mode 100755
new mode 100644
diff --git a/docs/guide.dox b/docs/guide.dox
index a26f791..0a8dcf6 100644
--- a/docs/guide.dox
+++ b/docs/guide.dox
@@ -8,7 +8,8 @@
 - \subpage netcdf_data_set_components
 - \subpage netcdf_perf_chunking
 - \subpage netcdf_utilities_guide
-- \subpage dap_support
+- \subpage dap2
+- \subpage dap4
 - \subpage BestPractices
 - \subpage users_guide_appendices
 
diff --git a/docs/images/Makefile.in b/docs/images/Makefile.in
index 66a519a..d39305b 100644
--- a/docs/images/Makefile.in
+++ b/docs/images/Makefile.in
@@ -164,6 +164,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -191,12 +192,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -231,6 +234,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/docs/install.md b/docs/install.md
old mode 100755
new mode 100644
diff --git a/docs/old/netcdf-cxx.texi b/docs/old/netcdf-cxx.texi
old mode 100755
new mode 100644
diff --git a/docs/old/netcdf-cxx4.texi b/docs/old/netcdf-cxx4.texi
old mode 100755
new mode 100644
diff --git a/docs/old/netcdf-f90.texi b/docs/old/netcdf-f90.texi
old mode 100755
new mode 100644
diff --git a/docs/old/netcdf-install.texi b/docs/old/netcdf-install.texi
old mode 100755
new mode 100644
diff --git a/docs/old/netcdf-internal.texi b/docs/old/netcdf-internal.texi
old mode 100755
new mode 100644
diff --git a/m4/empty b/docs/static-pages/deploy_static_pages.sh
old mode 100644
new mode 100755
similarity index 100%
copy from m4/empty
copy to docs/static-pages/deploy_static_pages.sh
diff --git a/docs/static-pages/software.html b/docs/static-pages/software.html
old mode 100755
new mode 100644
index fb07418..7198892
--- a/docs/static-pages/software.html
+++ b/docs/static-pages/software.html
@@ -1,2844 +1,3685 @@
-<html><!-- InstanceBegin template="/Templates/MyUnidata.dwt" codeOutsideHTMLIsLocked="true" -->
-
-<head>
-<!-- InstanceBeginEditable name="Title" -->
-<TITLE>Software for Manipulating or Displaying NetCDF Data</TITLE>
-<!-- InstanceEndEditable -->
-<!-- InstanceBeginEditable name="META Information" -->
-<META NAME="UIINDEX" CONTENT="0">
-<META NAME="BOOKMARK" CONTENT="NetCDF Utilities">
-<META NAME="AUTHOR" CONTENT="russ">
-<META NAME="KEYWORDS" CONTENT="netcdf, utilities, software, use">
-<META NAME="DESCRIPTION" CONTENT="This document provides references to software packages that may be used for manipulating or displaying netCDF data. We include information about both freely-available and licensed (commercial) software that can be used with netCDF data. ">
-<!-- InstanceEndEditable -->
-</head>
-
-<body>
-<!-- InstanceBeginEditable name="Content Goes Here" --><a id="netcdf" name="netcdf"></a>
-<hr />
-<h1>Software for Manipulating or Displaying NetCDF Data</h1>
-<p>
-This document provides references to software packages that may be used for manipulating
-or displaying <a
-href="/software/netcdf/">netCDF</a> data. We include information about
-both freely-available and licensed (commercial) software that can be used with
-netCDF data. We rely on developers to help keep this list up-to-date. If you know
-of corrections or additions, please <a href="mailto:support at unidata.ucar.edu">send
-them to us</a>. Where practical, we would like to include WWW links to information
-about these packages in the HTML version of this document.
-</p>
-
-<p>
-Other useful guides to utilities that can handle netCDF data include ARM's list of
-<a href="http://science.arm.gov/%7ecflynn/ARM_Tested_Tools/"
->ARM-tested netCDF data tools</a>, which includes some downloadable
-binaries and the NOAA Geophysical
-Fluid Dynamics Laboratory
-<a href=
-"http://nomads.gfdl.noaa.gov/sandbox/products/vis/data/netcdf/GFDL_VG_NetCDF_Utils.html">
-guide to netCDF utilities</a>.
-</p>
-
-<hr />
-<h2><a href="#freely">Freely Available Software</a></h2>
-<ul>
-  <li><a href="#ANDX">ANDX (ARM NetCDF Data eXtract) and ANAX (ARM NetCDF ASCII eXtract)</a></li>
-  <li><a href="#ANTS" >ANTS (ARM NetCDF Tool Suite)</a></li>
-  <li><a href="#ARGOS">ARGOS (interActive thRee-dimensional Graphics ObServatory)</a></li>
-  <li><a href="#CDAT">CDAT (Climate Data Analysis Tool)</a></li>
-  <li><a href="#CDFconvert" >CDFconvert (Convert netCDF to RPN and GEMPAK Grids)</a></li>
-  <li><a href="#cdfsync">cdfsync (network synchronization of netCDF files)</a></li>
-  <li><a href="#CDO" >CDO (Climate Data Operators)</a></li>
-  <li><a href="#CIDS Tools">CIDS Tools</a></li>
-  <li><a href="#CSIRO-MATLAB">CSIRO MATLAB/netCDF interface</a></li>
-  <li><a href="#EPIC">EPIC</a></li>
-  <li><a href="#ExcelUse" >Excel Use</a></li>
-  <li><a href="#EzGet">EzGet</a></li>
-  <li><a href="#FAN">FAN (File Array Notation)</a></li>
-  <li><a href="#FERRET">FERRET</a></li>
-  <li><a href="#fimex" >FIMEX (File Interpolation, Manipulation, and EXtraction)</a></li>
-  <li><a href="#fwtools" >FWTools (GIS Binary Kit for Windows and Linux)</a></li>
-  <li><a href="#GDAL" >GDAL (Geospatial Data Abstraction Library)</a></li>
-  <li><a href="#GDL" >GDL (GNU Data Language)</a></li>
-  <li><a href="#Gfdnavi" >Gfdnavi (Geophysical fluid data navigator)</a></li>
-  <li><a href="#GMT">GMT (Generic Mapping Tools)</a></li>
-  <li><a href="#Grace">Grace</a></li>
-  <li><a href="#GrADS">GrADS (Grid Analysis and Display System)</a></li>
-  <li><a href="#Gri">Gri</a></li>
-  <li><a href="#GXSM">GXSM - Gnome X Scanning Microscopy project</a></li>
-  <li><a href="#HDF interface">HDF (Hierarchical Data Format) interface</a></li>
-  <li><a href="#HDF-EOS" >HDF-EOS to netCDF converter</a></li>
-  <li><a href="#HIPHOP">HIPHOP (Handy IDL-Program for HDF-Output Plotting)</a></li>
-  <li><a href="#Hyperslab OPerator Suite (HOPS)">HOPS (Hyperslab OPerator Suite)</a></li>
-  <li><a href="#iCDF" >iCDF (imports chromatographic netCDF data into MATLAB)</a></li>
-  <li><a href="#IDV" >IDV (Integrated Data Viewer)</a></li>
-  <li><a href="#Ingrid">Ingrid</a></li>
-  <li><a href="#IntelArrayVisualizer" >Intel Array Visualizer</a></li>
-  <li><a href="#IVE">IVE (Interactive Visualization Environment)</a></li>
-  <li><a href="#JSON" >JSON format with the ncdump-json utility</a></li>
-  <li><a href="#Java interface">Java interface</a></li>
-  <li><a href="#KST">Kst (2D plotting tool)</a></li>
-  <li><a href="#Labview-API" >Labview interface</a></li>
-  <li><a href="#MBDyn">MBDyn (MultiBody Dynamics)</a></li>
-  <li><a href="#Max_diff_nc">Max_diff_nc</a></li>
-  <li><a href="#MeteoExplorer" >MeteoExplorer</a></li>
-  <li><a href="#MeteoInfo" >MeteoInfo</a></li>
-  <li><a href="#MexEPS">MexEPS (MATLAB interface)</a></li>
-  <li><a href="#MEXNC">MEXNC and SNCTOOLS (a MATLAB interface)</a></li>
-  <li><a href="#Mirone">Mirone (Windows MATLAB-based display)</a></li>
-  <li><a href="#ncBrowse">ncBrowse (netCDF File Browser)</a></li>
-  <li><a href="#nccmp" >nccmp (netCDF compare)</a></li>
-  <li><a href="#ncdx" >ncdx (netCDF for OpenDX)</a></li>
-  <li><a href="#ncensemble" >ncensemble (command line utility to do ensemble statistics)</a></li>
-  <li><a href="#NCL">NCL (NCAR Command Language)</a></li>
-  <li><a href="#NCO">NCO (NetCDF Operators)</a></li>
-  <li><a href="#ncregrid" >ncregrid</a></li>
-  <li><a href="#nctoolbox" >nctoolbox (a MATLAB common data model interface)</a></li>
-  <li><a href="#ncview">ncview</a></li>
-  <li><a href="#ncvtk" >ncvtk</a></li>
-  <li><a href="#netcdf_tools" >netcdf tools</a></li>
-  <li><a href="#netcdf4excel" >netcdf4excel (add-in for MS Excel)</a></li>
-  <li><a href="#netcdf95" >NetCDF95 alternative Fortran API</a></li>
-  <li><a href="#WCT">NOAA Weather and Climate Toolkit (WCT)</a></li>
-  <li><a href="#Objective-C" >Objective-C interface</a></li>
-  <li><a href="#NCMEX" >Octave interface</a></li>
-  <li><a href="#Octave" >Octave interface (Barth)</a></li>
-  <li><a href="#OPeNDAP">OPeNDAP (formerly DODS)</a></li>
-  <li><a href="#OpenDX">OpenDX (formerly IBM Data Explorer)</a></li>
-  <li><a href="#Panoply" >Panoply</a></li>
-  <li><a href="#Parallel-NetCDF" >Parallel-NetCDF</a></li>
-  <li><a href="#Paraview" >Paraview and vtkCSCSNetCDF</a></li>
-  <li><a href="#Perl" >Perl interfaces</a></li>
-  <li><a href="#PolyPaint+">PolyPaint+</a></li>
-  <li><a href="#pomegranate" >Pomegranate</a></li>
-  <li><a href="#pupynere" >Pupynere (PUre PYthon NEtcdf REader)</a></li>
-  <li><a href="#PyNGL" >PyNGL and PyNIO</a></li>
-  <li><a href="#Python">Python interfaces</a></li>
-  <li><a href="#QGIS" >QGIS (Quantum GIS)</a></li>
-  <li><a href="#R">R interface</a></li>
-  <li><a href="#Ruby" >Ruby interface</a></li>
-  <li><a href="#SDS" >Scientific DataSet (SDS) Library</a></li>
-  <li><a href="#SIS">Apache Spatial Information System (SIS)</a></li>
-  <li><a href="#Tcl/Tk">Tcl/Tk interfaces</a></li>
-  <li><a href="#Tcl-nap" >Tcl-nap (N-dimensional array processor)</a></li>
-  <li><a href="#VB" >Visual Basic and VB.net</a></li>
-  <li><a href="#VisAD">VisAD</a></li>
-  <li><a href="#WebWinds">WebWinds</a></li>
-  <li><a href="#xray" >xray (Python N-D labelled arrays)</a></li>
-  <li><a href="#Zebra">Zebra</a></li>
-  <li><a href="#user">User-contributed software</a></li>
-</ul>
-<hr />
-<h2><a href="#commercial">Commercial or Licensed Packages</a></h2>
-<ul>
-  <li><a href="#ViewNcDap" >ASA ViewNcDap</a></li>
-  <li><a href="#Avizo" >Avizo</a></li>
-  <li><a href="#AVS">AVS</a></li>
-  <li><a href="#BCS-UFI" >Barrodale UFI</a></li>
-  <li><a href="#DioVISTA/Storm" >DioVISTA/Storm</a></li>
-  <li><a href="#EnSight" >EnSight</a></li>
-  <li><a href="#Environmental WorkBench">Environmental WorkBench</a></li>
-  <li><a href="#ESRI" >ESRI</a></li>
-  <li><a href="#FME" >FME</a></li>
-  <li><a href="#HDF-Explorer" >HDF Explorer</a></li>
-  <li><a href="#IDL">IDL Interface</a></li>
-  <li><a href="#InterFormat">InterFormat</a></li>
-  <li><a href="#IRIS Explorer Module">IRIS Explorer Module</a></li>
-  <li><a href="#LeoNetCDF" >LeoNetCDF</a></li>
-  <li><a href="#Mathematica" >Mathematica</a></li>
-  <li><a href="#MATLAB">MATLAB</a></li>
-  <li><a href="#Noesys">Noesys</a></li>
-  <li><a href="#Origin" >Origin</a></li>
-  <li><a href="#PPLUS">PPLUS</a></li>
-  <li><a href="#PV-Wave">PV-Wave</a></li>
-  <li><a href="#SlicerDicer">Slicer Dicer</a></li>
-  <li><a href="#Surfer">Surfer</a></li>
-  <li><a href="#vGeo" >vGeo</a></li>
-  <li><a href="#VISAGE and Decimate">VISAGE and Decimate</a></li>
-  <li><a href="#Voyager">Voyager</a></li>
-</ul>
-<hr />
-<p></p>
-<h1 id="freely">Freely Available Software</h1>
-
-<h2><a id="ANDX" name="ANDX">ANDX and ANAX</a></h2>
-
-<p>
-The ARM Program has developed
-<a href="http://engineering.arm.gov/~sbeus/andx-web/html/" >ANDX (ARM
-NetCDF Data eXtract)</a>,
-a command-line utility designed for routine examination and
-extraction of data from netcdf files. Data can be displayed
-graphically (line-plot, scatter-plot, overlay, color-intensity, etc.)
-or extracted as ASCII data. Whether displayed graphically or extracted
-as ASCII, results can be saved to disk or viewed on screen.
-</p>
-
-<p>
-<a href="http://science.arm.gov/~cflynn/ARM_Tested_Tools/" >ANAX (ARM
-NetCDF ASCII eXtract)</a> is a scaled-down version of ANDX -- it is
-designed to only extract ASCII data. All features of ANDX pertaining
-to non-graphic data extraction are included in ANAX.
-</p>
-
-<h2><a id="ANTS" name="ANTS">ANTS</a></h2>
-<p>
-The ARM Program has developed <a
-href="http://science.arm.gov/~cflynn/ANTS/" >ANTS (ARM NetCDF Tool
-Suite)</a>, a collection of netCDF tools and utilities providing
-various means of creating and modifying netcdf files. ANTS is based on
-nctools written by Chuck Denham. The utilities within nctools were
-modified to compile with version 3.5 of the netCDF library, the
-command syntax was modified for consistency with other tools, and
-changes were made to accommodate ARM standard netCDF.
-</p>
-
-<p> The original functions from nctools were intended mainly for the
-creation, definition, and copying of fundamental netCDF elements. ARM
-added others which focus on manipulation of data within existing
-netCDF files. Additional functions have special support for
-multi-dimensional data such as "slicing" cross sections from
-multi-dimensional variable data or joining lesser-dimensional fields
-to form multi-dimensional structures. Functions have been added to
-support execution of arithmetic and logical operations, bundling or
-splitting netCDF files, comparing the structure or content of files,
-and so on.
-</p>
-
-<p> Essentially every type of netCDF library function call is
-exercised in ANTS. In this way then, this open-source collection of
-tools also represents a library of coding examples for fundamental
-netCDF tasks.  See the <a href="http://science.arm.gov/~cflynn/ANTS/"
->website</a> for more information.
-</p>
-
-<h2><a id="ARGOS" name="ARGOS">ARGOS</a></h2>
-<p>
-<a href="http://www.lapeth.ethz.ch/argos/index.html">ARGOS</a> (interActive thRee-dimensional
-Graphics ObServatory) is a new IDL-based interactive 3D visualization
-tool, developed by <a
-href="http://www.lapeth.ethz.ch/~david/index.html">David N. Bresch</a> and <a href="http://www.lapeth.ethz.ch/~mark/index.html">Mark
-A. Liniger</a> at the Institute for Atmospheric Science at the Swiss Federal Institute
-of Technology, ETH, Zürich.
-</p>
-
-<p>A highly optimized graphical user interface allows quick and elegant creation
-  of even complex 3D graphics (volume rendering, isosurfaces,...), including Z-buffered
-  overlays (with hidden lines), light and data shading, Xray images, 3D trajectories,
-  animations and virtual flights around your data, all documented in a full on-line
-  <a
-href="http://www.lapeth.ethz.ch/argos/argos_general.html">html-help</a>. The netCDF
-  data format is preferred, but any other format can be read by providing an IDL
-  (or FORTRAN or C or C++) interface. Some toolboxes (for atmospheric model output,
-  trajectory display, radar data) have already been written, others might easily
-  be added (in IDL, FORTRAN or C code). All interactive activities are tracked
-  in a script, allowing quick reconstruction of anything done as well as running
-  ARGOS in batch script mode.</p>
-<p>Information about <a
-href="http://www.lapeth.ethz.ch/argos/argos_copyright.html">copyright and licensing
-  conditions</a> are available. For further information and installation, please
-  E-mail to: bresch at atmos.umnw.ethz.ch</p>
-<p></p>
-<h2><a id="CDAT" name="CDAT">CDAT</a></h2>
-The <a href="http://cdat.sf.net">Climate Data Analysis Tool
-(CDAT)</a>, developed by the <a
-href="http://www-pcmdi.llnl.gov/">Program for Climate Model Diagnosis
-and Intercomparison (PCMDI)</a> at Lawrence Livermore National Laboratory, provides
-the capabilities needed to analyze model data, perform complex mathematical calculations,
-and graphically display the results. It provides the necessary tools to diagnose,
-validate, and intercompare large observational and global climate model data sets.
-<p>
-It includes the ability to ingest
-large climate datasets in netCDF, HDF, DRS, and GrADS/GRIB format;
-the Visualization and Computation System (VCS) module, visually displays and
-animates ingested or created data; and the Library of AMIP Data Transmission
-Standards (LATS) module outputs data in the machine-independent netCDF or GrADS/GRIB
-file formats.
-</p>
-<p>
-In addition, the Command Line Interface (CLI) module allows
-CDAT to receive argument and function input via the command line, and the Graphical
-User Interface (GUI) allows CDAT to receive argument and function input via
-a point-and-click environment.
-</p>
-<p>
-The software, which runs as a standalone process or within PCMDI's
-Visualization and Computation System (VCS), provides climate scientists with
-an easy and fast method to read different file formats, and to analyze and
-graphically display climate data in an integrated fashion. CDAT includes a
-set of pre-defined functions to allow the user to manipulate the data and
-send the output to a file which can be viewed as an image, or as a collection
-of images in an animation. The software has a gradual learning curve, allowing
-the novice user to quickly obtain useful results.</p>
-<p></p>
-<h2><a id="CDFconvert" name="CDFconvert">CDFconvert</a></h2>
-<p>
-The <a href="http://www.atmos.albany.edu/facstaff/rmctc/cdf_cvt/" >MRG
-CDFconvert package</a> provided by the Mesoscale Research Group,
-McGill University/SUNY Albany, is designed to address data conversion
-issues for gridded datasets stored under the <a
-href="http://ferret.wrc.noaa.gov/noaa_coop/coop_cdf_profile.html">COARDS</a>
-convention. CDFconvert converts regular Cylindrical Equidistant
-(Lat/Long) and Gaussian (Spherical) netCDF grids into either the
-Canadian <a
-href="http://www.cmc.ec.gc.ca/rpn/modcom/si/libraries/rmnlib/fstd/index.html"
->RPN Standard File</a> or <a href="/software/gempak/index.html"
->GEMPAK</a> file formats. MRG CDFconvert has the flexibility to handle
-netCDF files generated by a number of sources, including NCEP and
-ECMWF. User-definable conversion tables make the extension of the
-package to different datasets possible.
-</p>
-
-<p></p>
-<h2><a id="cdfsync" name="cdfsync">cdfsync</a></h2>
-<p>
-Joe Sirott of NOAA's Pacific Marine Environmental Laboratory has
-developed cdfsync, a program that allows users to rapidly synchronize a
-set of netCDF files over a network. Fast synchronization times are
-achieved by only transmitting the differences between files. It is
-built on the Open Source <a href="http://samba.anu.edu.au/rsync/" >rsync</a>
-program, but contains a number of optimizations including:
-<ul>
-  <li>Special handling of netCDF files for faster synchronization
-calculations</li>
-  <li>Much faster updates of large numbers of small netCDF files</li>
-  <li>In-place updates of large netCDF files</li>
-</ul>
-<p>The latest version should run on Linux variants and Solaris.</p>
-More information is available at the <a
- href="http://www.epic.noaa.gov/epic/software/cdfsync/">cdfsync website</a>.
-</p>
-<p></p>
-<h2><a id="CDO" name="CDO">CDO (Climate Data Operators)</a></h2>
-<p>
-Uwe Schulzweida at the Max Planck Institute for Meteorology has developed
-<a href="http://code.zmaw.de/projects/cdo" >CDO</a>, a collection of
-Operators to manipulate and analyze
-Climate Data files. Supported file formats include netCDF and GRIB.
-There are more than 350 operators available. The following
-table provides a brief overview of the main categories.
-</p>
-<ul>
-  <li>File information (info, sinfo, diff, ...)</li>
-  <li>File operations (copy, cat, merge, split*, ...)</li>
-  <li>Selection (selcode, selvar, sellevel, seltimestep, ...)</li>
-  <li>Missing values (setctomiss, setmisstoc, setrtomiss)</li>
-  <li>Arithmetic (add, sub, mul, div, ...)</li>
-  <li>Mathematical functions (sqrt, exp, log, sin, cos, ...)</li>
-  <li>Comparision (eq, ne, le, lt, ge, gt, ...)</li>
-  <li>Conditions (ifthen, ifnotthen, ifthenc, ifnotthenc)</li>
-  <li>Field statistics (fldsum, fldavg, fldstd, fldmin, fldmax, ...)</li>
-  <li>Vertical statistics (vertsum, vertavg, vertstd, vertmin, ...)</li>
-  <li>Time range statistics (timavg, yearavg, monavg, dayavg, ...)</li>
-  <li>Field interpolation (remapbil, remapcon, remapdis, ...)</li>
-  <li>Vertical interpolation (ml2pl, ml2hl)</li>
-  <li>Time interpolation (inttime, intyear)</li>
-</ul>
-<p>
-As an example of use of CDO, converting
-from GRIB to netCDF can be as simple as
-<pre>
+<html>
+
+  <head>
+
+    <title>Software for Manipulating or Displaying NetCDF Data</title>
+    <meta name="UIINDEX" content="0">
+    <meta name="BOOKMARK" content="NetCDF Utilities">
+    <meta name="AUTHOR" content="russ">
+    <meta name="KEYWORDS" content="netcdf, utilities, software, use">
+    <meta name="DESCRIPTION" content="This document provides references to software packages that may be used for manipulating or displaying netCDF data. We include information about both freely-available and licensed (commercial) software that can be used with netCDF data. ">
+
+  </head>
+
+  <body>
+
+    <h1>Software for Manipulating or Displaying NetCDF Data</h1>
+    <p>
+      This document provides references to software packages that may be used for manipulating
+      or displaying <a
+      href="/software/netcdf/">netCDF</a> data. We include information about
+      both freely-available and licensed (commercial) software that can be used with
+      netCDF data. We rely on developers to help keep this list up-to-date. If you know
+      of corrections or additions, please <a href="mailto:support at unidata.ucar.edu">send
+      them to us</a>. Where practical, we would like to include WWW links to information
+      about these packages in the HTML version of this document.
+    </p>
+
+    <p>
+      Other useful guides to utilities that can handle netCDF data include ARM's list of
+      <a href="http://science.arm.gov/%7ecflynn/ARM_Tested_Tools/"
+      >ARM-tested netCDF data tools</a>, which includes some downloadable
+      binaries and the NOAA Geophysical
+      Fluid Dynamics Laboratory
+      <a href=
+      "http://nomads.gfdl.noaa.gov/sandbox/products/vis/data/netcdf/GFDL_VG_NetCDF_Utils.html"> guide to netCDF utilities</a>.
+    </p>
+
+    <hr />
+    <h2><a href="#freely">Freely Available Software</a></h2>
+    <ul>
+      <li>
+        <a href="#ANDX">ANDX (ARM NetCDF Data eXtract) and ANAX (ARM NetCDF ASCII eXtract)</a>
+      </li>
+      <li>
+        <a href="#ANTS" >ANTS (ARM NetCDF Tool Suite)</a>
+      </li>
+      <li>
+        <a href="#ARGOS">ARGOS (interActive thRee-dimensional Graphics ObServatory)</a>
+      </li>
+      <li>
+        <a href="#CDAT">CDAT (Climate Data Analysis Tool)</a>
+      </li>
+      <li>
+        <a href="#CDFconvert" >CDFconvert (Convert netCDF to RPN and GEMPAK Grids)</a>
+      </li>
+      <li>
+        <a href="#cdfsync">cdfsync (network synchronization of netCDF files)</a>
+      </li>
+      <li>
+        <a href="#CDO" >CDO (Climate Data Operators)</a>
+      </li>
+      <li>
+        <a href="#CIDS Tools">CIDS Tools</a>
+      </li>
+      <li>
+        <a href="#CSIRO-MATLAB">CSIRO MATLAB/netCDF interface</a>
+      </li>
+      <li>
+        <a href="#EPIC">EPIC</a>
+      </li>
+      <li>
+        <a href="#ExcelUse" >Excel Use</a>
+      </li>
+      <li>
+        <a href="#EzGet">EzGet</a>
+      </li>
+      <li>
+        <a href="#FAN">FAN (File Array Notation)</a>
+      </li>
+      <li>
+        <a href="#FERRET">FERRET</a>
+      </li>
+      <li>
+        <a href="#fimex" >FIMEX (File Interpolation, Manipulation, and EXtraction)</a>
+      </li>
+      <li>
+        <a href="#fwtools" >FWTools (GIS Binary Kit for Windows and Linux)</a>
+      </li>
+      <li>
+        <a href="#GDAL" >GDAL (Geospatial Data Abstraction Library)</a>
+      </li>
+      <li>
+        <a href="#GDL" >GDL (GNU Data Language)</a>
+      </li>
+      <li>
+        <a href="#Gfdnavi" >Gfdnavi (Geophysical fluid data navigator)</a>
+      </li>
+      <li>
+        <a href="#GMT">GMT (Generic Mapping Tools)</a>
+      </li>
+      <li>
+        <a href="#Grace">Grace</a>
+      </li>
+      <li>
+        <a href="#GrADS">GrADS (Grid Analysis and Display System)</a>
+      </li>
+      <li>
+        <a href="#Gri">Gri</a>
+      </li>
+      <li>
+        <a href="#GXSM">GXSM - Gnome X Scanning Microscopy project</a>
+      </li>
+      <li>
+        <a href="#HDF interface">HDF (Hierarchical Data Format) interface</a>
+      </li>
+      <li>
+        <a href="#HDF-EOS" >HDF-EOS to netCDF converter</a>
+      </li>
+      <li>
+        <a href="#HIPHOP">HIPHOP (Handy IDL-Program for HDF-Output Plotting)</a>
+      </li>
+      <li>
+        <a href="#Hyperslab OPerator Suite (HOPS)">HOPS (Hyperslab OPerator Suite)</a>
+      </li>
+      <li>
+        <a href="#iCDF" >iCDF (imports chromatographic netCDF data into MATLAB)</a>
+      </li>
+      <li>
+        <a href="#IDV" >IDV (Integrated Data Viewer)</a>
+      </li>
+      <li>
+        <a href="#Ingrid">Ingrid</a>
+      </li>
+      <li>
+        <a href="#IntelArrayVisualizer" >Intel Array Visualizer</a>
+      </li>
+      <li>
+        <a href="#IVE">IVE (Interactive Visualization Environment)</a>
+      </li>
+      <li>
+        <a href="#JSON" >JSON format with the ncdump-json utility</a>
+      </li>
+      <li>
+        <a href="#Java interface">Java interface</a>
+      </li>
+      <li>
+        <a href="#KST">Kst (2D plotting tool)</a>
+      </li>
+      <li>
+        <a href="#Labview-API" >Labview interface</a>
+      </li>
+      <li>
+        <a href="#MBDyn">MBDyn (MultiBody Dynamics)</a>
+      </li>
+      <li>
+        <a href="#Max_diff_nc">Max_diff_nc</a>
+      </li>
+      <li>
+        <a href="#MeteoExplorer" >MeteoExplorer</a>
+      </li>
+      <li>
+        <a href="#MeteoInfo" >MeteoInfo</a>
+      </li>
+      <li>
+        <a href="#MexEPS">MexEPS (MATLAB interface)</a>
+      </li>
+      <li>
+        <a href="#MEXNC">MEXNC and SNCTOOLS (a MATLAB interface)</a>
+      </li>
+      <li>
+        <a href="#Mirone">Mirone (Windows MATLAB-based display)</a>
+      </li>
+      <li>
+        <a href="#ncBrowse">ncBrowse (netCDF File Browser)</a>
+      </li>
+      <li>
+        <a href="#nccmp" >nccmp (netCDF compare)</a>
+      </li>
+      <li>
+        <a href="#ncdx" >ncdx (netCDF for OpenDX)</a>
+      </li>
+      <li>
+        <a href="#ncensemble" >ncensemble (command line utility to do ensemble statistics)</a>
+      </li>
+      <li>
+        <a href="#NCL">NCL (NCAR Command Language)</a>
+      </li>
+      <li>
+        <a href="#NCO">NCO (NetCDF Operators)</a>
+      </li>
+      <li>
+        <a href="#ncregrid" >ncregrid</a>
+      </li>
+      <li>
+        <a href="#nctoolbox" >nctoolbox (a MATLAB common data model interface)</a>
+      </li>
+      <li>
+        <a href="#ncview">ncview</a>
+      </li>
+      <li>
+        <a href="#ncvtk" >ncvtk</a>
+      </li>
+      <li>
+        <a href="#netcdf_tools" >netcdf tools</a>
+      </li>
+      <li>
+        <a href="#netcdf4excel" >netcdf4excel (add-in for MS Excel)</a>
+      </li>
+      <li>
+        <a href="#netcdf95" >NetCDF95 alternative Fortran API</a>
+      </li>
+      <li>
+        <a href="#Objective-C" >Objective-C interface</a>
+      </li>
+      <li>
+        <a href="#NCMEX" >Octave interface</a>
+      </li>
+      <li>
+        <a href="#Octave" >Octave interface (Barth)</a>
+      </li>
+      <li>
+        <a href="#OPeNDAP">OPeNDAP (formerly DODS)</a>
+      </li>
+      <li>
+        <a href="#OpenDX">OpenDX (formerly IBM Data Explorer)</a>
+      </li>
+      <li>
+        <a href="#Panoply" >Panoply</a>
+      </li>
+      <li>
+        <a href="#Parallel-NetCDF" >Parallel-NetCDF</a>
+      </li>
+      <li>
+        <a href="#Paraview" >Paraview and vtkCSCSNetCDF</a>
+      </li>
+      <li>
+        <a href="#Perl" >Perl interfaces</a>
+      </li>
+      <li>
+        <a href="#PolyPaint+">PolyPaint+</a>
+      </li>
+      <li>
+        <a href="#pomegranate" >Pomegranate</a>
+      </li>
+      <li>
+        <a href="#pupynere" >Pupynere (PUre PYthon NEtcdf REader)</a>
+      </li>
+      <li>
+        <a href="#PyNGL" >PyNGL and PyNIO</a>
+      </li>
+      <li>
+        <a href="#Python">Python interfaces</a>
+      </li>
+      <li>
+        <a href="#QGIS" >QGIS (Quantum GIS)</a>
+      </li>
+      <li>
+        <a href="#R">R interface</a>
+      </li>
+      <li>
+        <a href="#Ruby" >Ruby interface</a>
+      </li>
+      <li>
+        <a href="#SDS" >Scientific DataSet (SDS) Library</a>
+      </li>
+      <li>
+        <a href="#SIS">Apache Spatial Information System (SIS)</a>
+      </li>
+      <li>
+        <a href="#Tcl/Tk">Tcl/Tk interfaces</a>
+      </li>
+      <li>
+        <a href="#Tcl-nap" >Tcl-nap (N-dimensional array processor)</a>
+      </li>
+      <li>
+        <a href="#VB" >Visual Basic and VB.net</a>
+      </li>
+      <li>
+        <a href="#VisAD">VisAD</a>
+      </li>
+      <li>
+        <a href="#WCT">Weather and Climate Toolkit (WCT)</a>
+      </li>
+      <li>
+        <a href="#WebWinds">WebWinds</a>
+      </li>
+      <li>
+        <a href="#xray" >xray (Python N-D labelled arrays)</a>
+      </li>
+      <li>
+        <a href="#Zebra">Zebra</a>
+      </li>
+      <li>
+        <a href="#user">User-contributed software</a>
+      </li>
+    </ul>
+    <hr />
+    <h2><a href="#commercial">Commercial or Licensed Packages</a></h2>
+    <ul>
+      <li>
+        <a href="#ArcGIS">ArcGIS Pro - Space Time Pattern Mining Toolbox
+      </li>
+      <li>
+        <a href="#ViewNcDap" >ASA ViewNcDap</a>
+      </li>
+      <li>
+        <a href="#Avizo" >Avizo</a>
+      </li>
+      <li>
+        <a href="#AVS">AVS</a>
+      </li>
+      <li>
+        <a href="#BCS-UFI" >Barrodale UFI</a>
+      </li>
+      <li>
+        <a href="#DioVISTA/Storm" >DioVISTA/Storm</a>
+      </li>
+      <li>
+        <a href="#EnSight" >EnSight</a>
+      </li>
+      <li>
+        <a href="#Environmental WorkBench">Environmental WorkBench</a>
+      </li>
+      <li>
+        <a href="#ESRI" >ESRI</a>
+      </li>
+      <li>
+        <a href="#FME" >FME</a>
+      </li>
+      <li>
+        <a href="#HDF-Explorer" >HDF Explorer</a>
+      </li>
+      <li>
+        <a href="#IDL">IDL Interface</a>
+      </li>
+      <li>
+        <a href="#InterFormat">InterFormat</a>
+      </li>
+      <li>
+        <a href="#IRIS Explorer Module">IRIS Explorer Module</a>
+      </li>
+      <li>
+        <a href="#LeoNetCDF" >LeoNetCDF</a>
+      </li>
+      <li>
+        <a href="#Mathematica" >Mathematica</a>
+      </li>
+      <li>
+        <a href="#MATLAB">MATLAB</a>
+      </li>
+      <li>
+        <a href="#Noesys">Noesys</a>
+      </li>
+      <li>
+        <a href="#Origin" >Origin</a>
+      </li>
+      <li>
+        <a href="#PPLUS">PPLUS</a>
+      </li>
+      <li>
+        <a href="#PV-Wave">PV-Wave</a>
+      </li>
+      <li>
+        <a href="#SlicerDicer">Slicer Dicer</a>
+      </li>
+      <li>
+        <a href="#Surfer">Surfer</a>
+      </li>
+      <li>
+        <a href="#vGeo" >vGeo</a>
+      </li>
+      <li>
+        <a href="#VISAGE and Decimate">VISAGE and Decimate</a>
+      </li>
+      <li>
+        <a href="#Voyager">Voyager</a>
+      </li>
+    </ul>
+    <hr />
+    <p></p>
+    <h1 id="freely">Freely Available Software</h1>
+
+    <h2><a id="ANDX" name="ANDX">ANDX and ANAX</a></h2>
+
+    <p>
+      The ARM Program has developed
+      <a href="http://engineering.arm.gov/~sbeus/andx-web/html/" >ANDX (ARM
+      NetCDF Data eXtract)</a>,
+      a command-line utility designed for routine examination and
+      extraction of data from netcdf files. Data can be displayed
+      graphically (line-plot, scatter-plot, overlay, color-intensity, etc.)
+      or extracted as ASCII data. Whether displayed graphically or extracted
+      as ASCII, results can be saved to disk or viewed on screen.
+    </p>
+
+    <p>
+      <a href="http://science.arm.gov/~cflynn/ARM_Tested_Tools/" >ANAX (ARM
+      NetCDF ASCII eXtract)</a> is a scaled-down version of ANDX -- it is
+      designed to only extract ASCII data. All features of ANDX pertaining
+      to non-graphic data extraction are included in ANAX.
+    </p>
+
+    <h2><a id="ANTS" name="ANTS">ANTS</a></h2>
+    <p>
+      The ARM Program has developed <a
+      href="http://science.arm.gov/~cflynn/ANTS/" >ANTS (ARM NetCDF Tool
+      Suite)</a>, a collection of netCDF tools and utilities providing
+      various means of creating and modifying netcdf files. ANTS is based on
+      nctools written by Chuck Denham. The utilities within nctools were
+      modified to compile with version 3.5 of the netCDF library, the
+      command syntax was modified for consistency with other tools, and
+      changes were made to accommodate ARM standard netCDF.
+    </p>
+
+    <p>
+      The original functions from nctools were intended mainly for the
+      creation, definition, and copying of fundamental netCDF elements. ARM
+      added others which focus on manipulation of data within existing
+      netCDF files. Additional functions have special support for
+      multi-dimensional data such as "slicing" cross sections from
+      multi-dimensional variable data or joining lesser-dimensional fields
+      to form multi-dimensional structures. Functions have been added to
+      support execution of arithmetic and logical operations, bundling or
+      splitting netCDF files, comparing the structure or content of files,
+      and so on.
+    </p>
+
+    <p>
+      Essentially every type of netCDF library function call is
+      exercised in ANTS. In this way then, this open-source collection of
+      tools also represents a library of coding examples for fundamental
+      netCDF tasks.  See the <a href="http://science.arm.gov/~cflynn/ANTS/"
+      >website</a> for more information.
+    </p>
+
+    <h2><a id="ARGOS" name="ARGOS">ARGOS</a></h2>
+    <p>
+      <a href="http://www.lapeth.ethz.ch/argos/index.html">ARGOS</a> (interActive thRee-dimensional
+      Graphics ObServatory) is a new IDL-based interactive 3D visualization
+      tool, developed by <a
+      href="http://www.lapeth.ethz.ch/~david/index.html">David N. Bresch</a> and <a href="http://www.lapeth.ethz.ch/~mark/index.html">Mark
+      A. Liniger</a> at the Institute for Atmospheric Science at the Swiss Federal Institute
+      of Technology, ETH, Zürich.
+    </p>
+
+    <p>
+      A highly optimized graphical user interface allows quick and elegant creation
+      of even complex 3D graphics (volume rendering, isosurfaces,...), including Z-buffered
+      overlays (with hidden lines), light and data shading, Xray images, 3D trajectories,
+      animations and virtual flights around your data, all documented in a full on-line
+      <a
+      href="http://www.lapeth.ethz.ch/argos/argos_general.html">html-help</a>. The netCDF
+      data format is preferred, but any other format can be read by providing an IDL
+      (or FORTRAN or C or C++) interface. Some toolboxes (for atmospheric model output,
+      trajectory display, radar data) have already been written, others might easily
+      be added (in IDL, FORTRAN or C code). All interactive activities are tracked
+      in a script, allowing quick reconstruction of anything done as well as running
+      ARGOS in batch script mode.
+    </p>
+    <p>
+      Information about <a
+      href="http://www.lapeth.ethz.ch/argos/argos_copyright.html">copyright and licensing
+      conditions</a> are available. For further information and installation, please
+      E-mail to: bresch at atmos.umnw.ethz.ch
+    </p>
+    <p></p>
+    <h2><a id="CDAT" name="CDAT">CDAT</a></h2>
+    The <a href="http://cdat.sf.net">Climate Data Analysis Tool
+    (CDAT)</a>, developed by the <a
+    href="http://www-pcmdi.llnl.gov/">Program for Climate Model Diagnosis
+    and Intercomparison (PCMDI)</a> at Lawrence Livermore National Laboratory, provides
+    the capabilities needed to analyze model data, perform complex mathematical calculations,
+    and graphically display the results. It provides the necessary tools to diagnose,
+    validate, and intercompare large observational and global climate model data sets.
+    <p>
+      It includes the ability to ingest
+      large climate datasets in netCDF, HDF, DRS, and GrADS/GRIB format;
+      the Visualization and Computation System (VCS) module, visually displays and
+      animates ingested or created data; and the Library of AMIP Data Transmission
+      Standards (LATS) module outputs data in the machine-independent netCDF or GrADS/GRIB
+      file formats.
+    </p>
+    <p>
+      In addition, the Command Line Interface (CLI) module allows
+      CDAT to receive argument and function input via the command line, and the Graphical
+      User Interface (GUI) allows CDAT to receive argument and function input via
+      a point-and-click environment.
+    </p>
+    <p>
+      The software, which runs as a standalone process or within PCMDI's
+      Visualization and Computation System (VCS), provides climate scientists with
+      an easy and fast method to read different file formats, and to analyze and
+      graphically display climate data in an integrated fashion. CDAT includes a
+      set of pre-defined functions to allow the user to manipulate the data and
+      send the output to a file which can be viewed as an image, or as a collection
+      of images in an animation. The software has a gradual learning curve, allowing
+      the novice user to quickly obtain useful results.
+    </p>
+    <p></p>
+    <h2><a id="CDFconvert" name="CDFconvert">CDFconvert</a></h2>
+    <p>
+      The <a href="http://www.atmos.albany.edu/facstaff/rmctc/cdf_cvt/" >MRG
+      CDFconvert package</a> provided by the Mesoscale Research Group,
+      McGill University/SUNY Albany, is designed to address data conversion
+      issues for gridded datasets stored under the <a
+      href="http://ferret.wrc.noaa.gov/noaa_coop/coop_cdf_profile.html">COARDS</a>
+      convention. CDFconvert converts regular Cylindrical Equidistant
+      (Lat/Long) and Gaussian (Spherical) netCDF grids into either the
+      Canadian <a
+      href="http://www.cmc.ec.gc.ca/rpn/modcom/si/libraries/rmnlib/fstd/index.html"
+      >RPN Standard File</a> or <a href="/software/gempak/index.html"
+      >GEMPAK</a> file formats. MRG CDFconvert has the flexibility to handle
+      netCDF files generated by a number of sources, including NCEP and
+      ECMWF. User-definable conversion tables make the extension of the
+      package to different datasets possible.
+    </p>
+
+    <p></p>
+    <h2><a id="cdfsync" name="cdfsync">cdfsync</a></h2>
+    <p>
+      Joe Sirott of NOAA's Pacific Marine Environmental Laboratory has
+      developed cdfsync, a program that allows users to rapidly synchronize a
+      set of netCDF files over a network. Fast synchronization times are
+      achieved by only transmitting the differences between files. It is
+      built on the Open Source <a href="http://samba.anu.edu.au/rsync/" >rsync</a>
+      program, but contains a number of optimizations including:
+      <ul>
+        <li>
+          Special handling of netCDF files for faster synchronization
+          calculations
+        </li>
+        <li>
+          Much faster updates of large numbers of small netCDF files
+        </li>
+        <li>
+          In-place updates of large netCDF files
+        </li>
+      </ul>
+    <p>
+      The latest version should run on Linux variants and Solaris.
+    </p>
+    More information is available at the <a
+    href="http://www.epic.noaa.gov/epic/software/cdfsync/">cdfsync website</a>.
+    </p>
+    <p></p>
+    <h2><a id="CDO" name="CDO">CDO (Climate Data Operators)</a></h2>
+    <p>
+      Uwe Schulzweida at the Max Planck Institute for Meteorology has developed
+      <a href="http://code.zmaw.de/projects/cdo" >CDO</a>, a collection of
+      Operators to manipulate and analyze
+      Climate Data files. Supported file formats include netCDF and GRIB.
+      There are more than 350 operators available. The following
+      table provides a brief overview of the main categories.
+    </p>
+    <ul>
+      <li>
+        File information (info, sinfo, diff, ...)
+      </li>
+      <li>
+        File operations (copy, cat, merge, split*, ...)
+      </li>
+      <li>
+        Selection (selcode, selvar, sellevel, seltimestep, ...)
+      </li>
+      <li>
+        Missing values (setctomiss, setmisstoc, setrtomiss)
+      </li>
+      <li>
+        Arithmetic (add, sub, mul, div, ...)
+      </li>
+      <li>
+        Mathematical functions (sqrt, exp, log, sin, cos, ...)
+      </li>
+      <li>
+        Comparision (eq, ne, le, lt, ge, gt, ...)
+      </li>
+      <li>
+        Conditions (ifthen, ifnotthen, ifthenc, ifnotthenc)
+      </li>
+      <li>
+        Field statistics (fldsum, fldavg, fldstd, fldmin, fldmax, ...)
+      </li>
+      <li>
+        Vertical statistics (vertsum, vertavg, vertstd, vertmin, ...)
+      </li>
+      <li>
+        Time range statistics (timavg, yearavg, monavg, dayavg, ...)
+      </li>
+      <li>
+        Field interpolation (remapbil, remapcon, remapdis, ...)
+      </li>
+      <li>
+        Vertical interpolation (ml2pl, ml2hl)
+      </li>
+      <li>
+        Time interpolation (inttime, intyear)
+      </li>
+    </ul>
+    <p>
+      As an example of use of CDO, converting
+      from GRIB to netCDF can be as simple as
+      <pre>
     cdo -f nc copy file.grb file.nc
 </pre>
 or with relative time axis (for usage with GrADS)
-<pre>
+       <pre>
     cdo -r -f nc copy file.grb file.nc
 </pre>
 or using ECMWF reanalysis on a reduced grid
-<pre>
+       <pre>
     cdo -R -f nc copy file.grb file.nc
 </pre>
-</p>
-<p>
-More information is available on the <a
-href="http://code.zmaw.de/projects/cdo" >CDO homepage</a>.
-</p>
-<p></p>
-<h2><a id="CIDS Tools" name="CIDS Tools">CIDS Tools</a></h2>
-The Center for Clouds Chemistry and Climate (<a
-href="http://www-c4.ucsd.edu/">C4</a>) Integrated Data Systems (<a
-href="http://www-c4.ucsd.edu/~cids/">CIDS</a>) group has developed several useful
-netCDF utilities:
-<ul>
-  <li>cdf2idl: Writes an IDL script to read a NetCDF file.</li>
-  <li>cdf2c: Writes C code to read a NetCDF file.</li>
-  <li>cdf2fortran: Writes FORTRAN source code to read a NetCDF file.</li>
-  <li>cdf2asc: Dumps NetCDF data to an ASCII file.</li>
-</ul>
-The source for these utilities can be downloaded from <a
-href="http://www-c4.ucsd.edu/~cids/software/visual.html">CIDS NetCDF Visualization
-Tools site</a>.
-<p></p>
-<h2><a id="CSIRO-MATLAB" name="CSIRO-MATLAB">CSIRO MATLAB/netCDF interface</a></h2>
-The <a
-href="http://www.marine.csiro.au/sw/matlab-netcdf.html">CSIRO MATLAB/netCDF interface</a>
-is now available from the <a
-href="http://www.marine.csiro.au">CSIRO Marine Laboratories</a>.
-<p>The CSIRO MATLAB/netCDF interface is run from within MATLAB and has a simple
-  syntax. It has options for automatically handling missing values, scale factors,
-  and permutation of hyperslabs. It is, however, limited to retrieving data from,
-  and information about, existing netCDF files.</p>
-<p>The basis of the interface is a machine-dependent mex-file called
-  mexcdf53. Rather than call the mex-file
-  directly users are advised to employ both <a href="#NC4ML5">Chuck Denham's
-  netCDF toolbox</a> and the CSIRO MATLAB/netCDF interface described here. For
-  read-only access to existing netCDF data, the CSIRO interface has a simpler
-  syntax than the netCDF Toolbox, but the latter may also be used to create and
-  manipulate netCDF variables and datasets.</p>
-<p></p>
-<h2><a id="EPIC" name="EPIC">EPIC</a></h2>
-NOAA's Pacific Marine Environmental Laboratory (<a
-href="http://www.pmel.noaa.gov/">PMEL</a>) has developed the <a
-href="http://www.pmel.noaa.gov/epic/">EPIC</a> software package for oceanographic
-data. EPIC provides graphical display and data field manipulation for multi-dimensional
-netCDF files (up to 4 dimensions). PMEL has been using this software on Unix and
-VMS several years. At present, they have:
-<p></p>
-<ul>
-  <li>a data file I/O library ( <a
-href="http://www.pmel.noaa.gov/epic/eps-manual/epslib_toc.html">epslib</a>, which
-    is layered on top of the netCDF library).</li>
-  <li>epslib allows transparent access to multiple data file formats</li>
-  <li>a <a href="http://www.epic.noaa.gov/epic/software/mexeps.htm">MATLAB MexEPS
-    interface</a> for using any supported EPIC file with MATLAB</li>
-  <li><a
-href="http://www.epic.noaa.gov/epic/software/ep_programs.htm">suite of EPIC programs</a>
-    for graphics and analysis of hydrographic profile data and time series data.</li>
-</ul>
-This software was developed on Sun/Unix and is also supported for DEC/Ultrix and
-VAX/VMS as a system for data management, display and analysis system for observational
-oceanographic time series and hydrographic data. The EPIC software includes over
-50 programs for oceanographic display and analysis, as well as utilities for putting
-in-situ or observational data on-line (with on-the-fly graphics and data download)
-on the WWW.
-<p>The developers are interested in coordinating with others who may be developing
-  oceanographic software for use with netCDF files. The EPIC software is available
-  via anonymous FTP from ftp.noaapmel.gov in the epic/ and /eps directories. To
-  obtain the EPIC software, please see Web pages at <a
-href="http://www.pmel.noaa.gov/epic/download/index.html">http://www.pmel.noaa.gov/epic/download/index.html</a>.
-  For information about EPIC, please see the Web pages at <a
-href="http://www.pmel.noaa.gov/epic/index.html">http://www.pmel.noaa.gov/epic/index.html</a>.
-  Contact epic at pmel.noaa.gov, or Nancy Soreide, nns at noaapmel.gov, for more information.</p>
-<p></p>
-
-<h2><a id="ExcelUse" name="ExcelUse">Excel Use</a></h2>
-
-<p>
-Several packages are available for accessing netCDF data from
-Microsoft Excel,
-including the <a href="#netcdf4excel" >netcdf4excel</a> add-in for Excel, and a <a
-href="#SDS" >Scientific Dataset (SDS) Library</a> that supports a
-DataSetEditor add-in for Excel to view and modify various
-forms of data, including netCDF.
-</p>
-<p></p>
-<h2><a id="EzGet" name="EzGet">EzGet</a></h2>
-A FORTRAN library called <a
-href="http://www-pcmdi.llnl.gov/ktaylor/ezget/ezget.html">EzGet</a> has been developed
-at <a
-href="http://www-pcmdi.llnl.gov/PCMDI.html">PCMDI</a> to facilitate retrieval
-of modeled and observed climate data stored in popular formats including <a
-href="http://www-pcmdi.llnl.gov/drach/DRS.html">DRS</a>, <a
-href="/software/netcdf/">netCDF</a>, <a
-href="http://grads.iges.org/grads">GrADS</a>, and, if a control file is supplied,
-<a
-href="ftp://nic.fb4.noaa.gov/pub/nws/nmc/docs/gribed1/">GRIB</a>. You can specify
-how the data should be structured and whether it should undergo a grid transformation
-before you receive it, even when you know little about the original structure
-of the stored data (e.g., its original dimension order, grid, and domain).
-<p>The EzGet library comprises a set of subroutines that can be linked to any
-  FORTRAN program. EzGet reads files through the <a
-href="http://www-pcmdi.llnl.gov/drach/cdunif.html">cdunif</a> interface, but use
-  of EzGet does not require familiarity with cdunif. The main advantages of using
-  EzGet instead of the lower level cdunif library include:</p>
-<ul>
-  <li>Substantial error trapping capabilities and detailed error messages</li>
-  <li>Versatile capability of conveniently selecting data from specified regions
-    (e.g., oceans, North America, all land areas north of 45 degrees latitude,
-    etc.)</li>
-  <li>Ability to map data to a new grid at the time it is retrieved by EzGet</li>
-  <li>Automatic creation of ``weights'' for use in subsequent averaging
-    or masking of data</li>
-  <li>Increased control in specifying the domain of the data to be retrieved.</li>
-</ul>
-<p>For more information about EzGet, including instructions for downloading the
-  documentation or software, see the EzGet home page at <a
-href="http://www-pcmdi.llnl.gov/ktaylor/ezget/ezget.html">http://www-pcmdi.llnl.gov/ktaylor/ezget/ezget.html</a>.
-  For questions or comments on EzGet, contact Karl Taylor (taylor13 at llnl.gov).</p>
-<h2><a id="FAN" name="FAN">FAN</a></h2>
-<a href="/software/netcdf/fan_utils.html">FAN (File Array Notation)</a>
-is Harvey Davies' package for extracting and manipulating array data from
-netCDF files. The package includes the three utilities nc2text, text2nc, and ncrob
-for printing selected data from netCDF arrays, copying ASCII data into netCDF
-arrays, and performing various operations (sum, mean, max, min, product, ...)
-on netCDF arrays. A library (fanlib) is also included that supports the use of
-FAN from C programs. The package is available via anonymous FTP from <a
-href="ftp://ftp.unidata.ucar.edu/pub/netcdf/contrib/fan.tar.Z">ftp://ftp.unidata.ucar.edu/pub/netcdf/contrib/fan.tar.Z</a>.
-Questions and comments may be sent to Harvey Davies, harvey.davies at csiro.au.
-<p></p>
-<h2><a id="FERRET" name="FERRET">FERRET</a></h2>
-<a href="http://ferret.wrc.noaa.gov/Ferret/">FERRET</a> is an interactive computer
-visualization and analysis environment designed to meet the needs of oceanographers
-and meteorologists analyzing large and complex gridded data sets. It is available
-by anonymous ftp from abyss.pmel.noaa.gov for a number of computer systems: SUN
-(Solaris and SUNOS), DECstation (Ultrix and OSF/1), SGI, VAX/VMS and Macintosh
-(limited support), and IBM RS-6000 (soon to be released).
-<p>FERRET offers a Mathematica-like approach to analysis; new variables may be
-  defined interactively as mathematical expressions involving data set variables.
-  Calculations may be applied over arbitrarily shaped regions. Fully documented
-  graphics are produced with a single command. Graphics styles included line plots,
-  scatter plots, contour plots, color-filled contour plots, vector plots, wire
-  frame plots, etc. Detailed controls over plot characteristics, page layout and
-  overlays are provided. NetCDF is supported both as an input and an output format.</p>
-<p>Many excellent software packages have been developed recently for scientific
-  visualization. The features that make FERRET distinctive among these packages
-  are Mathematica-like flexibility, geophysical formatting (latitude/longitude/date),
-  "intelligent" connection to its data base, special memory management
-  for very large calculations, and symmetrical processing in 4 dimensions. Contact
-  Steve Hankin, hankin at noaapmel.gov, for more information.</p>
-<p></p>
-
-<h2><a id="fimex" name="fimex" >Fimex</a></h2>
-<p>Heiko Klein (Norwegian Meteorological Institute) has developed
-the <a href="https://wiki.met.no/fimex/start" >fimex</a> (File
-Interpolation, Manipulation, and EXtraction) C++ library
-for gridded geospatial data.  It converts between several
-data formats (currently netCDF, NcML, GRIB1 or GRIB2, and felt). Fimex
-also enables you
-to change the projection and interpolation of scalar and vector grids,
-to subset the gridded data, and to extract only parts
-of the files.  Fimex supports a growing list of other <a
-href="https://wiki.met.no/fimex/features" >features</a>, including
-support for most NcML features and for netCDF-4 compression.
-</p>
-<p>
-For simple usage, Fimex also comes with the command line program fimex.</p>
-<p>Documentation and downloads are available
-from the <a href="http://wiki.met.no/fimex/" >fimex web site</a>.</p>
-<p></p>
-
-
-<h2><a id="fwtools" name="fwtools">FWTools (GIS Binary Kit for Windows and Linux)</a></h2>
-
-<p>
-<a href="http://fwtools.maptools.org/" >FWTools</a> is Frank Warmerdam's set of Open Source GIS
-binaries for Windows (win32) and Linux (x86 32bit) systems.
-The kits are intended to be easy for end users to install and get going with, and include OpenEV,
-GDAL, MapServer, PROJ.4 and OGDI as well as some supporting components.
-FWTools aims to track the latest development versions of the packages included as opposed to
-official releases, "to give folks a chance to use the <em>latest and greatest</em>".
-</p>
-
-<h2><a id="GDAL" name="GDAL">GDAL</a></h2>
-
-<p>Frank Warmerdam's <a
-href="http://www.remotesensing.org/gdal/index.html" >GDAL</a> is a
-translator library for raster geospatial data formats that is released
-under an X/MIT style Open Source license.  As a library, it presents a
-<a href="http://www.remotesensing.org/gdal/gdal_datamodel.html">
-single abstract data model</a> to the calling application for all
-supported formats. The related <a
-href="http://www.remotesensing.org/gdal/ogr">OGR</a> library (which
-lives within the GDAL source tree) provides a similar capability for
-simple features vector data.</p>
-
-<p> GDAL is in active use in several projects, and includes roughly 40
-format drivers, including a translator for netCDF (read/write).  Other
-translators include GeoTIFF (read/write), Erdas Imagine (read/write),
-ESRI .BIL (read), .aux labeled raw (read/write), DTED (read), SDTS
-DEM (read), CEOS (read), JPEG (read/write), PNG (read/write), Geosoft
-GXF (read) and Arc/Info Binary Grid (read). A full list is available
-in <a
-href="http://www.remotesensing.org/gdal/formats_list.html">Supported
-Formats</a>.
-</p>
-
-<p>GDAL has recently included support for the netCDF-4 enhanced data
-model and netCDF-4 format, as well as improved support for recent
-additions to the CF conventions.</p>
-
-<p> As an example of the use of GDAL, converting an ArcInfo ASCII grid
-to netCDF (GMT conventions) as easy as:
-<pre>
+    </p>
+    <p>
+      More information is available on the <a
+      href="http://code.zmaw.de/projects/cdo" >CDO homepage</a>.
+    </p>
+    <p></p>
+    <h2><a id="CIDS Tools" name="CIDS Tools">CIDS Tools</a></h2>
+    The Center for Clouds Chemistry and Climate (<a
+    href="http://www-c4.ucsd.edu/">C4</a>) Integrated Data Systems (<a
+    href="http://www-c4.ucsd.edu/~cids/">CIDS</a>) group has developed several useful
+    netCDF utilities:
+    <ul>
+      <li>
+        cdf2idl: Writes an IDL script to read a NetCDF file.
+      </li>
+      <li>
+        cdf2c: Writes C code to read a NetCDF file.
+      </li>
+      <li>
+        cdf2fortran: Writes FORTRAN source code to read a NetCDF file.
+      </li>
+      <li>
+        cdf2asc: Dumps NetCDF data to an ASCII file.
+      </li>
+    </ul>
+    The source for these utilities can be downloaded from <a
+    href="http://www-c4.ucsd.edu/~cids/software/visual.html">CIDS NetCDF Visualization
+    Tools site</a>. <p></p>
+    <h2><a id="CSIRO-MATLAB" name="CSIRO-MATLAB">CSIRO MATLAB/netCDF interface</a></h2>
+    The <a
+    href="http://www.marine.csiro.au/sw/matlab-netcdf.html">CSIRO MATLAB/netCDF interface</a>
+    is now available from the <a
+    href="http://www.marine.csiro.au">CSIRO Marine Laboratories</a>.
+    <p>
+      The CSIRO MATLAB/netCDF interface is run from within MATLAB and has a simple
+      syntax. It has options for automatically handling missing values, scale factors,
+      and permutation of hyperslabs. It is, however, limited to retrieving data from,
+      and information about, existing netCDF files.
+    </p>
+    <p>
+      The basis of the interface is a machine-dependent mex-file called
+      mexcdf53. Rather than call the mex-file
+      directly users are advised to employ both <a href="#NC4ML5">Chuck Denham's
+      netCDF toolbox</a> and the CSIRO MATLAB/netCDF interface described here. For
+      read-only access to existing netCDF data, the CSIRO interface has a simpler
+      syntax than the netCDF Toolbox, but the latter may also be used to create and
+      manipulate netCDF variables and datasets.
+    </p>
+    <p></p>
+    <h2><a id="EPIC" name="EPIC">EPIC</a></h2>
+    NOAA's Pacific Marine Environmental Laboratory (<a
+    href="http://www.pmel.noaa.gov/">PMEL</a>) has developed the <a
+    href="http://www.pmel.noaa.gov/epic/">EPIC</a> software package for oceanographic
+    data. EPIC provides graphical display and data field manipulation for multi-dimensional
+    netCDF files (up to 4 dimensions). PMEL has been using this software on Unix and
+    VMS several years. At present, they have:
+    <p></p>
+    <ul>
+      <li>
+        a data file I/O library ( <a
+        href="http://www.pmel.noaa.gov/epic/eps-manual/epslib_toc.html">epslib</a>, which
+        is layered on top of the netCDF library).
+      </li>
+      <li>
+        epslib allows transparent access to multiple data file formats
+      </li>
+      <li>
+        a <a href="http://www.epic.noaa.gov/epic/software/mexeps.htm">MATLAB MexEPS
+        interface</a> for using any supported EPIC file with MATLAB
+      </li>
+      <li>
+        <a
+        href="http://www.epic.noaa.gov/epic/software/ep_programs.htm">suite of EPIC programs</a>
+        for graphics and analysis of hydrographic profile data and time series data.
+      </li>
+    </ul>
+    This software was developed on Sun/Unix and is also supported for DEC/Ultrix and
+    VAX/VMS as a system for data management, display and analysis system for observational
+    oceanographic time series and hydrographic data. The EPIC software includes over
+    50 programs for oceanographic display and analysis, as well as utilities for putting
+    in-situ or observational data on-line (with on-the-fly graphics and data download)
+    on the WWW.
+    <p>
+      The developers are interested in coordinating with others who may be developing
+      oceanographic software for use with netCDF files. The EPIC software is available
+      via anonymous FTP from ftp.noaapmel.gov in the epic/ and /eps directories. To
+      obtain the EPIC software, please see Web pages at <a
+      href="http://www.pmel.noaa.gov/epic/download/index.html">http://www.pmel.noaa.gov/epic/download/index.html</a>.
+      For information about EPIC, please see the Web pages at <a
+      href="http://www.pmel.noaa.gov/epic/index.html">http://www.pmel.noaa.gov/epic/index.html</a>.
+      Contact epic at pmel.noaa.gov, or Nancy Soreide, nns at noaapmel.gov, for more information.
+    </p>
+    <p></p>
+
+    <h2><a id="ExcelUse" name="ExcelUse">Excel Use</a></h2>
+
+    <p>
+      Several packages are available for accessing netCDF data from
+      Microsoft Excel,
+      including the <a href="#netcdf4excel" >netcdf4excel</a> add-in for Excel, and a <a
+      href="#SDS" >Scientific Dataset (SDS) Library</a> that supports a
+      DataSetEditor add-in for Excel to view and modify various
+      forms of data, including netCDF.
+    </p>
+    <p></p>
+    <h2><a id="EzGet" name="EzGet">EzGet</a></h2>
+    A FORTRAN library called <a
+    href="http://www-pcmdi.llnl.gov/ktaylor/ezget/ezget.html">EzGet</a> has been developed
+    at <a
+    href="http://www-pcmdi.llnl.gov/PCMDI.html">PCMDI</a> to facilitate retrieval
+    of modeled and observed climate data stored in popular formats including <a
+    href="http://www-pcmdi.llnl.gov/drach/DRS.html">DRS</a>, <a
+    href="/software/netcdf/">netCDF</a>, <a
+    href="http://grads.iges.org/grads">GrADS</a>, and, if a control file is supplied, <a
+    href="ftp://nic.fb4.noaa.gov/pub/nws/nmc/docs/gribed1/">GRIB</a>. You can specify
+    how the data should be structured and whether it should undergo a grid transformation
+    before you receive it, even when you know little about the original structure
+    of the stored data (e.g., its original dimension order, grid, and domain).
+    <p>
+      The EzGet library comprises a set of subroutines that can be linked to any
+      FORTRAN program. EzGet reads files through the <a
+      href="http://www-pcmdi.llnl.gov/drach/cdunif.html">cdunif</a> interface, but use
+      of EzGet does not require familiarity with cdunif. The main advantages of using
+      EzGet instead of the lower level cdunif library include:
+    </p>
+    <ul>
+      <li>
+        Substantial error trapping capabilities and detailed error messages
+      </li>
+      <li>
+        Versatile capability of conveniently selecting data from specified regions
+        (e.g., oceans, North America, all land areas north of 45 degrees latitude,
+        etc.)
+      </li>
+      <li>
+        Ability to map data to a new grid at the time it is retrieved by EzGet
+      </li>
+      <li>
+        Automatic creation of ``weights'' for use in subsequent averaging
+        or masking of data
+      </li>
+      <li>
+        Increased control in specifying the domain of the data to be retrieved.
+      </li>
+    </ul>
+    <p>
+      For more information about EzGet, including instructions for downloading the
+      documentation or software, see the EzGet home page at <a
+      href="http://www-pcmdi.llnl.gov/ktaylor/ezget/ezget.html">http://www-pcmdi.llnl.gov/ktaylor/ezget/ezget.html</a>.
+      For questions or comments on EzGet, contact Karl Taylor (taylor13 at llnl.gov).
+    </p>
+    <h2><a id="FAN" name="FAN">FAN</a></h2>
+    <a href="/software/netcdf/fan_utils.html">FAN (File Array Notation)</a>
+    is Harvey Davies' package for extracting and manipulating array data from
+    netCDF files. The package includes the three utilities nc2text, text2nc, and ncrob
+    for printing selected data from netCDF arrays, copying ASCII data into netCDF
+    arrays, and performing various operations (sum, mean, max, min, product, ...)
+    on netCDF arrays. A library (fanlib) is also included that supports the use of
+    FAN from C programs. The package is available via anonymous FTP from <a
+    href="ftp://ftp.unidata.ucar.edu/pub/netcdf/contrib/fan.tar.Z">ftp://ftp.unidata.ucar.edu/pub/netcdf/contrib/fan.tar.Z</a>.
+    Questions and comments may be sent to Harvey Davies, harvey.davies at csiro.au.
+    <p></p>
+    <h2><a id="FERRET" name="FERRET">FERRET</a></h2>
+    <a href="http://ferret.wrc.noaa.gov/Ferret/">FERRET</a> is an interactive computer
+    visualization and analysis environment designed to meet the needs of oceanographers
+    and meteorologists analyzing large and complex gridded data sets. It is available
+    by anonymous ftp from abyss.pmel.noaa.gov for a number of computer systems: SUN
+    (Solaris and SUNOS), DECstation (Ultrix and OSF/1), SGI, VAX/VMS and Macintosh
+    (limited support), and IBM RS-6000 (soon to be released).
+    <p>
+      FERRET offers a Mathematica-like approach to analysis; new variables may be
+      defined interactively as mathematical expressions involving data set variables.
+      Calculations may be applied over arbitrarily shaped regions. Fully documented
+      graphics are produced with a single command. Graphics styles included line plots,
+      scatter plots, contour plots, color-filled contour plots, vector plots, wire
+      frame plots, etc. Detailed controls over plot characteristics, page layout and
+      overlays are provided. NetCDF is supported both as an input and an output format.
+    </p>
+    <p>
+      Many excellent software packages have been developed recently for scientific
+      visualization. The features that make FERRET distinctive among these packages
+      are Mathematica-like flexibility, geophysical formatting (latitude/longitude/date),
+      "intelligent" connection to its data base, special memory management
+      for very large calculations, and symmetrical processing in 4 dimensions. Contact
+      Steve Hankin, hankin at noaapmel.gov, for more information.
+    </p>
+    <p></p>
+
+    <h2><a id="fimex" name="fimex" >Fimex</a></h2>
+    <p>
+      Heiko Klein (Norwegian Meteorological Institute) has developed
+      the <a href="https://wiki.met.no/fimex/start" >fimex</a> (File
+      Interpolation, Manipulation, and EXtraction) C++ library
+      for gridded geospatial data.  It converts between several
+      data formats (currently netCDF, NcML, GRIB1 or GRIB2, and felt). Fimex
+      also enables you
+      to change the projection and interpolation of scalar and vector grids,
+      to subset the gridded data, and to extract only parts
+      of the files.  Fimex supports a growing list of other <a
+      href="https://wiki.met.no/fimex/features" >features</a>, including
+      support for most NcML features and for netCDF-4 compression.
+    </p>
+    <p>
+      For simple usage, Fimex also comes with the command line program fimex.
+    </p>
+    <p>
+      Documentation and downloads are available
+      from the <a href="http://wiki.met.no/fimex/" >fimex web site</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="fwtools" name="fwtools">FWTools (GIS Binary Kit for Windows and Linux)</a></h2>
+
+    <p>
+      <a href="http://fwtools.maptools.org/" >FWTools</a> is Frank Warmerdam's set of Open Source GIS
+      binaries for Windows (win32) and Linux (x86 32bit) systems.
+      The kits are intended to be easy for end users to install and get going with, and include OpenEV,
+      GDAL, MapServer, PROJ.4 and OGDI as well as some supporting components.
+      FWTools aims to track the latest development versions of the packages included as opposed to
+      official releases, "to give folks a chance to use the <em>latest and greatest</em>".
+    </p>
+
+    <h2><a id="GDAL" name="GDAL">GDAL</a></h2>
+
+    <p>
+      Frank Warmerdam's <a
+      href="http://www.remotesensing.org/gdal/index.html" >GDAL</a> is a
+      translator library for raster geospatial data formats that is released
+      under an X/MIT style Open Source license.  As a library, it presents a
+      <a href="http://www.remotesensing.org/gdal/gdal_datamodel.html"> single abstract data model</a> to the calling application for all
+      supported formats. The related <a
+      href="http://www.remotesensing.org/gdal/ogr">OGR</a> library (which
+      lives within the GDAL source tree) provides a similar capability for
+      simple features vector data.
+    </p>
+
+    <p>
+      GDAL is in active use in several projects, and includes roughly 40
+      format drivers, including a translator for netCDF (read/write).  Other
+      translators include GeoTIFF (read/write), Erdas Imagine (read/write),
+      ESRI .BIL (read), .aux labeled raw (read/write), DTED (read), SDTS
+      DEM (read), CEOS (read), JPEG (read/write), PNG (read/write), Geosoft
+      GXF (read) and Arc/Info Binary Grid (read). A full list is available
+      in <a
+      href="http://www.remotesensing.org/gdal/formats_list.html">Supported
+      Formats</a>.
+    </p>
+
+    <p>
+      GDAL has recently included support for the netCDF-4 enhanced data
+      model and netCDF-4 format, as well as improved support for recent
+      additions to the CF conventions.
+    </p>
+
+    <p>
+      As an example of the use of GDAL, converting an ArcInfo ASCII grid
+      to netCDF (GMT conventions) as easy as:
+      <pre>
    gdal_translate arc_ascii.grd -of GMT gmt_grid.nc
 </pre>
-</p>
-
-<p></p>
-<h2><a id="GDL" name="GDL">GDL (GNU Data Language)</a></h2>
-<p>
-<a href="http://gnudatalanguage.sourceforge.net/" >GDL</a> is a free
-implementation of most of the programming language supported by <a href="#IDL" >IDL</a>
-(Interactive Data Language).  GDL supports the netCDF-3 API.
-</p>
-
-<p></p>
-
-<h2><a id="Gfdnavi" name="Gfdnavi">Gfdnavi (Geophysical fluid data navigator)</a></h2>
-
-<p> <a
-href="http://www.gfd-dennou.org/arch/davis/gfdnavi/index.en.htm"
->Gfdnavi</a> is a web-based tool to archive, share, distribute, analyze, and
-visualize geophysical fluid data and knowledge.
-The software is under development by members of the GFD Dennou Club,
-including T. Horinouchi (RISH, Kyoto U.), S. Nishizawa (RIMS, Kyoto
-U.), and colleagues.  Gfdnavi uses a metadata
-database for managing and analyzing data and visualizations.  It also
-permits publishing data for web access and will soon support access to
-data on other Gfdnavi servers.  Web service APIs are now under
-development.  A presentation <a
-href="http://www.gfd-dennou.org/arch/davis/gfdnavi/presen/2007-03-05_GfdnaviIntro.En/pub/"
->Introducing Gfdnavi</a> describes the architecture and shows examples
-of use.
-</p>
-<p>
-Gfdnavi is dependent on two technologies:
-<ul>
-  <li><a href="http://www.rubyonrails.com/" >Ruby on Rails</a>, a
-  framework for web applications, and</li>
-  <li><a href="http://ruby.gfd-dennou.org/" >the Dennou Ruby
-  Project</a>,
-  a collection of tools for geophysical
-  data.   These tools include <a
-  href="http://ruby.gfd-dennou.org/products/gphys/" >GPhys</a>
-  software to handle GRIB, GrADS, and netCDF data uniformly.</li>
-</ul>
-</p>
-  <p>As an example of this technology, Takuji Kubota has established <a
-href="http://www.gsmap.aero.osakafu-u.ac.jp/gfdnavi/" >a Gfdnavi server</a> for the
-Global Satellite Mapping of Precipitation (<a href="http://www.radar.aero.osakafu-u.ac.jp/~gsmap/index_english.html" >GSMaP</a>) project.</p>
-<p></p>
-
-<h2><a id="GMT" name="GMT">GMT</a></h2>
-<p>
-<a href="http://gmt.soest.hawaii.edu/">GMT</a> (Generic Mapping Tools) is
-an open source collection of about 60 tools for manipulating
-geographic and Cartesian data sets (including filtering, trend
-fitting, gridding, projecting, etc.) and producing Encapsulated
-PostScript File (EPS) illustrations ranging from simple x-y plots via
-contour maps to artificially illuminated surfaces and 3-D perspective
-views. GMT supports 30 map projections and transformations and comes
-with support data such as coastlines, rivers, and political
-boundaries. GMT is developed and maintained by Paul Wessel and Walter
-H. F. Smith with help from a global set of volunteers, and is
-supported by the National Science Foundation. It is released under
-the GNU General Public License.
-</p>
-<p>
-The package can access COARDS-compliant netCDF grids as well as ASCII,
-native binary, or user-defined formats.  The GMT package is available
-via anonymous ftp from several servers; see <a
-href="http://gmt.soest.hawaii.edu" >gmt.soest.hawaii.edu</a>
-for installation information.
-</p>
-<p></p>
-<h2><a id="Grace" name="Grace">Grace</a></h2>
-<a href="http://plasma-gate.weizmann.ac.il/Grace/">Grace</a> is a tool to make
-two-dimensional plots of scientific data, including 1D netCDF
-variables.
-It runs under the X Window System and
-OSF Motif (recent versions of LessTif are, by and large, fine, too). Grace runs
-on practically any version of Unix. As well, it has been successfully ported to
-VMS, OS/2 and Win9*/NT (some functionality may be missing, though). Grace is a
-descendant of ACE/gr.
-<p>A few features of Grace are:</p>
-<ul>
-  <li>User defined scaling, tick marks, labels, symbols, line styles, colors.</li>
-  <li>Batch mode for unattended plotting.</li>
-  <li>Read and write parameters used during a session.</li>
-  <li>Regressions, splines, running averages, DFT/FFT, cross/auto-correlation,
-    ...</li>
-  <li>Support for dynamic module loading.</li>
-  <li>Hardcopy support for PostScript, PDF, GIF, and PNM formats.</li>
-  <li>Device-independent Type1 font rastering.</li>
-  <li>Ability to read or write netCDF data.</li>
-</ul>
-<p></p>
-<h2><a id="GrADS" name="GrADS">GrADS</a></h2>
-<a href="http://grads.iges.org/grads/grads.html">GrADS</a> (Grid
-Analysis and Display System)
-is an interactive desktop tool from <a
-href="http://grads.iges.org/cola.html">COLA/IGES</a> that is currently in use
-worldwide for the analysis and display of earth science data. GrADS is implemented
-on all commonly available UNIX workstations, Apple Macintosh, and DOS or Linux
-based PCs, and is freely available via anonymous ftp. GrADS provides an integrated
-environment for access, manipulation, and display of earth science
-data in several forms, including GRIB and netCDF.
-For more information, see the <a
-href="http://grads.iges.org/grads/gadoc/users.html" >GrADS User's
-Guide</a>.
-<p></p>
-<h2><a id="Gri" name="Gri">Gri</a></h2>
-Gri is an extensible plotting language for producing scientific graphs, such as
-x-y plots, contour plots, and image plots. Dan Kelley of Dalhousie University
-is the author of Gri, which can read data from netCDF files as well as ASCII and
-native binary data. For more information on Gri, see the URL <a
-href="http://gri.sourceforge.net/">http://gri.sourceforge.net/</a>.
-<p></p>
-<h2><a id="GXSM" name="GXSM">GXSM</a></h2> The GXSM is the Gnome X
-Scanning Microscopy project, it is a bit more than just a piece of
-software (the GXSM itself), there is full hardware support for DSP
-cards including open source DSP software and a growing set of SPM
-related electronics. For more information, see <a
-href="http://gxsm.sourceforge.net/">http://gxsm.sourceforge.net/</a>.
-<p></p>
-<h2><a id="HDF interface" name="HDF interface">HDF interface</a></h2>
-The National Center for Supercomputing Applications (NCSA) has added the netCDF
-interface to their <a
-href="http://hdf.ncsa.uiuc.edu/">Hierarchical Data Format (HDF)</a> software.
-HDF is an extensible data format for self-describing files. A substantial set
-of applications and utilities based on HDF is available; these support raster-image
-manipulation and display and browsing through multidimensional scientific data.
-An implementation is now available that provides the netCDF interface to HDF.
-With this software, it is possible to use the netCDF calling interface to place
-data into an HDF file. The netCDF calling interface has not changed and netCDF
-files stored in XDR format are readable, so existing programs and data will still
-be usable (although programs will need to be relinked to the new library). There
-is currently no support for the mixing of HDF and netCDF structures. For example,
-a raster image can exist in the same file as a netCDF object, but you have to
-use the Raster Image interface to read the image and the netCDF interface to read
-the netCDF object. The other HDF interfaces are currently being modified to allow
-multi-file access, closer integration with the netCDF interface will probably
-be delayed until the end of that project.
-<p>Eventually, it will be possible to integrate netCDF objects with the rest of
-  the HDF tool suite. Such an integration will then allow tools written for netCDF
-  and tools written for HDF to both interact intelligently with the new data files.</p>
-<p></p>
-<h2><a id="HDF-EOS" name="HDF-EOS">HDF-EOS to netCDF converter</a></h2>
-<p>
-The
-Goddard Earth Sciences Data and Information Services Center (<a
-href="http://disc.gsfc.nasa.gov" >GES DISC</a>)
-has developed an on-the-fly HDF-EOS to netCDF/CF converter
-for the following products, making them easier to use in the <a
-href="#IDV" >Unidata IDV</a> and <a
-href="http://www.ssec.wisc.edu/mcidas/software/v/" >McIDAS-V</a>:
-<ul>
-  <li>AIRS Level 2 (scene) profiles of moisture, air temperature and
-  trace gases</li>
-  <li>AIRS Level 3 (global grid) profiles of moisture, air temperature and trace gases</li>
-  <li>OMI UV-B at the surface</li>
-  <li>TOMS ozone and aerosols</li>
-</ul>
-<p>
-<a href="http://disc.gsfc.nasa.gov/services/NetCDFConversionforIDVandMcIDAS-V.shtml" >Instructions</a> are available for searching and converting these data.
-More information on AIRS products is available at
-<a href="http://disc.gsfc.nasa.gov/AIRS/index.html"
->http://disc.gsfc.nasa.gov/AIRS/index.html</a>.
-</p>
-<p></p>
-
-<h2><a id="HIPHOP" name="HIPHOP">HIPHOP</a></h2>
-<a
-href="http://www.knmi.nl/onderzk/atmosam/English/Service/hiphop/hiphop.html">HIPHOP</a>,
-developed
-by Dominik Brunner, is a widget based IDL application that largely facilitates
-the visualization and analysis of 2D, 3D, and 4D atmospheric science data, in
-particular atmospheric tracer distributions and meteorological fields.
-<p>Graphical output of (atmospheric model) data can be quickly generated in a
-  large number of different ways, including horizontal maps at selected model
-  or pressure levels, vertical north-south, east-west, or slant cross-sections
-  (including zonal averages), time slices, animations, etc. It also allows mathematical
-  operations on the existing fields to generate new fields for further analysis,
-  and it can be run as a batch application.</p>
-<p>The program handles data in netCDF, HDF and GRIB format. Interfaces to other
-  data formats (e.g. ASCII and binary data) can be added easily.</p>
-<p>Beginning with Version 4.0, it also supports the ability to overlay meteorological
-  fields on a number of different satellite images, and to draw air parcel trajectories.</p>
-<p></p>
-<h2><a id="Hyperslab OPerator Suite (HOPS)"
-name="Hyperslab OPerator Suite (HOPS)">Hyperslab OPerator Suite (HOPS)</a></h2>
-Hyperslab OPerator Suite (<a
-href="http://www.cgd.ucar.edu/gds/svn/hyperslab.html">HOPS</a>), developed by
-R. Saravanan at NCAR, is a bilingual, multi-platform software package for processing
-data in netCDF files conforming to the NCAR-CCM format or the NCAR Ocean Model
-format. HOPS is implemented in <a href="#IDL">IDL</a>, the widely-used commercial
-interpreted language, and also in <a
-href="ftp://ftp-icf.llnl.gov/pub/Yorick/">Yorick</a>, a public-domain interpreted
-language that is freely available from the Lawrence Livermore National Laboratory.
-The IDL version of HOPS should run on any platform supported by IDL. The Yorick
-version too runs on most common UNIX platforms, such as Sun, SGI, Cray, and LINUX
-computers.
-<p>HOPS is not a monolithic program, but a suite of operators that act on data
-  units called "hyperslabs". The design of HOPS is object-oriented,
-  rather than procedure-oriented; the operators treat the numeric data and the
-  associated meta-data (like coordinate information) as a single object.</p>
-<p>Note that HOPS is not a general purpose netCDF utility and works only for the
-  NCAR CSM netCDF formats. For more information, check the <a href="http://www.cgd.ucar.edu/gds/svn/hyperslab.html">HOPS
-  home page</a>.</p>
-<p></p>
-
-<h2><a id="iCDF" name="iCDF">iCDF (imports chromatographic netCDF data into MATLAB)</a></h2>
-<p>
-Klavs M. Sørensen, Thomas Skov and Rasmus Bro (Faculty of Life
-Sciences, University of Copenhagen) have developed <a
-href="http://www.models.life.ku.dk/source/iCDF/index.asp" >iCDF</a>, a
-free and documented toolbox for importing chromatographic data in the
-netCDF-based format that most manufacturers of chromatographic
-software support.
-</p>
-<p>
-The iCDF software is currently for XC-MS data (X: GC, LC, HPLC), but
-soon it will be able to import data using other detectors as well.  It
-can be used to open netCDF files from many different instruments
-(e.g. Agilent, Bruker) and many chromatographic software packages
-(e.g. ChemStation).
-</p>
-<p>
-For more information, see the paper
-<blockquote>
-Skov T and Bro R. (2008) Solving fundamental problems in chromatographic analysis
-Analytical and Bioanalytical Chemistry, 390 (1): 281-285.
-</blockquote>
-</p>
-<p></p>
-
-<h2><a id="IDV" name="IDV">IDV (Integrated Data Viewer)</a></h2>
-<p>
-Unidata's <a href="/software/idv/"
->Integrated Data Viewer (IDV)</a> is a Java application (for Java 1.4
-or later)
-that can be used to display a variety of netCDF files, particularly
-well formatted, geolocated datasets.   Features include:
-<ul>
-  <li>Access to local and remote netCDF files and a variety of <a
-  href="/software/idv/docs/userguide/data/DataSources.html" >other
-  data formats</a></li>
-  <li>Slicing and probing of multidimensional data</li>
-  <li>Support for netCDF conventions (CF, COARDS, NUWG, AWIPS)</li>
-  <li>InstallAnywhere installers for easy download and installation</li>
-  <li>Save display state to a bundle for easy recreation of views</li>
-  <li>Support for non-gridded data through the <a
-  href="/software/netcdf-java/CDM/" >Common Data Model (CDM)</a></li>
-</ul>
-The IDV uses the <a href="http://www.ssec.wisc.edu/~billh/visad.html"
->VisAD Java library</a> for interactive and collaborative
-visualization and analysis
-and the <a href="/software/netcdf-java/" >netCDF Java library</a> for reading and manipulating
-netCDF files.
-</p>
-<p></p>
-
-<h2><a id="Ingrid" name="Ingrid">Ingrid</a></h2>
-<p>
-<a href="http://ingrid.ldgo.columbia.edu/">Ingrid</a>, by M. Benno Blumenthal
-<benno at ldeo.columbia.edu>, is designed to manipulate large datasets and
-model input/output. It can read
-data from its data catalog, a netCDF file, or a directly attached model, and output
-the data, either by feeding it to a model, creating a netCDF file, or creating
-plots and other representations of the data.
-</p>
-<p>Ingrid has a number of filters which allow simple data manipulations, such
-  as adding two datasets together, smoothing, averaging, and regridding to a new
-  coordinate.  In addition to netCDF, it also reads HDF, CDF, VOGL,
-  and SGI GL.</p>
-<p>Ingrid is currently running as a WWW daemon that can be accessed through <a
-href="http://rainbow.ldgo.columbia.edu/datacatalog.html">http://rainbow.ldgo.columbia.edu/datacatalog.html</a>
-  to see some of its capabilities on a climate data catalog maintained by the
-  <a
-href="http://rainbow.ldeo.columbia.edu/">Climate Group</a> of the <a href="http://www.ldeo.columbia.edu/">Lamont-Doherty
-  Earth Observatory</a> of Columbia University. To quote the introduction:</p>
-<blockquote>The Data Catalog is both a catalog and a library of datasets, i.e.
-  it both helps you figure out which data you want, and helps you work with the
-  data. The interface allows you to make plots, tables, and files from any dataset,
-  its subsets, or processed versions thereof.
-  <p>This data server is designed to make data accessible to people using WWW
-    clients (viewers) and to serve as a data resource for WWW documents. Since
-    most documents cannot use raw data, the server is able to deliver the data
-    in a variety of ways: as data files (netCDF and HDF), as tables (html), and
-    in a variety of plots (line, contour, color, vector) and plot formats (PostScript
-    and gif). Processing of the data, particularly averaging, can be requested
-    as well.</p>
-  <p>The Data Viewer in particular demonstrates the power of the Ingrid daemon.</p>
-</blockquote>
-<p>Ingrid currently runs on Linux, for which binaries are available.
-CVS access to the current source can be arranged. </p>
-<p></p>
-
-<h2><a id="IntelArrayVisualizer" name="IntelArrayVisualizer">
-Intel Array Visualizer</a></h2>
-
-<p> The <a
-href="http://www.intel.com/cd/software/products/asmo-na/eng/compilers/226277.htm"
->Intel® Array Visualizer</a> and Intel® Array Viewer are available as
-<a
-href="http://www.intel.com/cd/software/products/asmo-na/eng/compilers/226277.htm"
->free downloads</a> for
-Windows platforms.  They offer an application and a set
-of software tools and components, which include C, Fortran, and .Net libraries, for
-developing scientific visualization applications and for creating interactive graphs of
-array data in various formats, including HDF and netCDF.
-</p>
-
-<p></p>
-<h2><a id="IVE" name="IVE">IVE</a></h2>
-<p>
-<a href="http://www.atmos.washington.edu/ive/">IVE (Interactive Visualization
-Environment)</a> is a software package designed to interactively display and analyze
-gridded data. IVE assumes the data to be displayed are contained in one- two-,
-three- or four-dimensional arrays. By default, the numbers within these arrays
-are assumed to represent grid point values of some field variable (such as pressure)
-on a rectangular evenly spaced grid. IVE is, nevertheless, capable of displaying
-data on arbitrary curvilinear grids.
-</p>
-<p>If the data points are not evenly spaced on a rectangular grid, IVE must be
-  informed of the grid structure, either by specifying "attributes"
-  in the data input or by specifying the coordinate transform in a user supplied
-  subroutine. Stretched rectangular grids (which occur when the stretching along
-  a given coordinate is a function only of the value of that coordinate) can be
-  accommodated by specifying one-dimensional arrays containing the grid-point
-  locations along the stretched coordinate as part of the IVE input data. Staggered
-  meshes can also be accommodated by setting "attributes" in the input
-  data. The structure of more complicated curvilinear grids must be communicated
-  to IVE via user supplied "transforms," which define the mapping between
-  physical space and the array indices.</p>
-<p>Since four-dimensional data cannot be directly displayed on a flat computer
-  screen, it is necessary to reduced the dimensionality of the data before it
-  is displayed. One of IVE's primary capabilities involves dimension reduction
-  or "data slicing." IVE allows the user to display lower-dimensional
-  subsets of the data by fixing a coordinate or by averaging over the coordinate.</p>
-<p>IVE currently has the capability to display</p>
-<ul>
-  <li>scalar fields as
+    </p>
+
+    <p></p>
+    <h2><a id="GDL" name="GDL">GDL (GNU Data Language)</a></h2>
+    <p>
+      <a href="http://gnudatalanguage.sourceforge.net/" >GDL</a> is a free
+      implementation of most of the programming language supported by <a href="#IDL" >IDL</a>
+      (Interactive Data Language).  GDL supports the netCDF-3 API.
+    </p>
+
+    <p></p>
+
+    <h2><a id="Gfdnavi" name="Gfdnavi">Gfdnavi (Geophysical fluid data navigator)</a></h2>
+
+    <p>
+      <a
+      href="http://www.gfd-dennou.org/arch/davis/gfdnavi/index.en.htm"
+      >Gfdnavi</a> is a web-based tool to archive, share, distribute, analyze, and
+      visualize geophysical fluid data and knowledge.
+      The software is under development by members of the GFD Dennou Club,
+      including T. Horinouchi (RISH, Kyoto U.), S. Nishizawa (RIMS, Kyoto
+      U.), and colleagues.  Gfdnavi uses a metadata
+      database for managing and analyzing data and visualizations.  It also
+      permits publishing data for web access and will soon support access to
+      data on other Gfdnavi servers.  Web service APIs are now under
+      development.  A presentation <a
+      href="http://www.gfd-dennou.org/arch/davis/gfdnavi/presen/2007-03-05_GfdnaviIntro.En/pub/"
+      >Introducing Gfdnavi</a> describes the architecture and shows examples
+      of use.
+    </p>
+    <p>
+      Gfdnavi is dependent on two technologies:
+      <ul>
+        <li>
+          <a href="http://www.rubyonrails.com/" >Ruby on Rails</a>, a
+          framework for web applications, and
+        </li>
+        <li>
+          <a href="http://ruby.gfd-dennou.org/" >the Dennou Ruby
+          Project</a>,
+          a collection of tools for geophysical
+          data.   These tools include <a
+          href="http://ruby.gfd-dennou.org/products/gphys/" >GPhys</a>
+          software to handle GRIB, GrADS, and netCDF data uniformly.
+        </li>
+      </ul>
+    </p>
+    <p>
+      As an example of this technology, Takuji Kubota has established <a
+      href="http://www.gsmap.aero.osakafu-u.ac.jp/gfdnavi/" >a Gfdnavi server</a> for the
+      Global Satellite Mapping of Precipitation (<a href="http://www.radar.aero.osakafu-u.ac.jp/~gsmap/index_english.html" >GSMaP</a>) project.
+    </p>
+    <p></p>
+
+    <h2><a id="GMT" name="GMT">GMT</a></h2>
+    <p>
+      <a href="http://gmt.soest.hawaii.edu/">GMT</a> (Generic Mapping Tools) is
+      an open source collection of about 60 tools for manipulating
+      geographic and Cartesian data sets (including filtering, trend
+      fitting, gridding, projecting, etc.) and producing Encapsulated
+      PostScript File (EPS) illustrations ranging from simple x-y plots via
+      contour maps to artificially illuminated surfaces and 3-D perspective
+      views. GMT supports 30 map projections and transformations and comes
+      with support data such as coastlines, rivers, and political
+      boundaries. GMT is developed and maintained by Paul Wessel and Walter
+      H. F. Smith with help from a global set of volunteers, and is
+      supported by the National Science Foundation. It is released under
+      the GNU General Public License.
+    </p>
+    <p>
+      The package can access COARDS-compliant netCDF grids as well as ASCII,
+      native binary, or user-defined formats.  The GMT package is available
+      via anonymous ftp from several servers; see <a
+      href="http://gmt.soest.hawaii.edu" >gmt.soest.hawaii.edu</a>
+      for installation information.
+    </p>
+    <p></p>
+    <h2><a id="Grace" name="Grace">Grace</a></h2>
+    <a href="http://plasma-gate.weizmann.ac.il/Grace/">Grace</a> is a tool to make
+    two-dimensional plots of scientific data, including 1D netCDF
+    variables.
+    It runs under the X Window System and
+    OSF Motif (recent versions of LessTif are, by and large, fine, too). Grace runs
+    on practically any version of Unix. As well, it has been successfully ported to
+    VMS, OS/2 and Win9*/NT (some functionality may be missing, though). Grace is a
+    descendant of ACE/gr.
+    <p>
+      A few features of Grace are:
+    </p>
+    <ul>
+      <li>
+        User defined scaling, tick marks, labels, symbols, line styles, colors.
+      </li>
+      <li>
+        Batch mode for unattended plotting.
+      </li>
+      <li>
+        Read and write parameters used during a session.
+      </li>
+      <li>
+        Regressions, splines, running averages, DFT/FFT, cross/auto-correlation,
+        ...
+      </li>
+      <li>
+        Support for dynamic module loading.
+      </li>
+      <li>
+        Hardcopy support for PostScript, PDF, GIF, and PNM formats.
+      </li>
+      <li>
+        Device-independent Type1 font rastering.
+      </li>
+      <li>
+        Ability to read or write netCDF data.
+      </li>
+    </ul>
+    <p></p>
+    <h2><a id="GrADS" name="GrADS">GrADS</a></h2>
+    <a href="http://grads.iges.org/grads/grads.html">GrADS</a> (Grid
+    Analysis and Display System)
+    is an interactive desktop tool from <a
+    href="http://grads.iges.org/cola.html">COLA/IGES</a> that is currently in use
+    worldwide for the analysis and display of earth science data. GrADS is implemented
+    on all commonly available UNIX workstations, Apple Macintosh, and DOS or Linux
+    based PCs, and is freely available via anonymous ftp. GrADS provides an integrated
+    environment for access, manipulation, and display of earth science
+    data in several forms, including GRIB and netCDF.
+    For more information, see the <a
+    href="http://grads.iges.org/grads/gadoc/users.html" >GrADS User's
+    Guide</a>. <p></p>
+    <h2><a id="Gri" name="Gri">Gri</a></h2>
+    Gri is an extensible plotting language for producing scientific graphs, such as
+    x-y plots, contour plots, and image plots. Dan Kelley of Dalhousie University
+    is the author of Gri, which can read data from netCDF files as well as ASCII and
+    native binary data. For more information on Gri, see the URL <a
+    href="http://gri.sourceforge.net/">http://gri.sourceforge.net/</a>. <p></p>
+    <h2><a id="GXSM" name="GXSM">GXSM</a></h2> The GXSM is the Gnome X
+    Scanning Microscopy project, it is a bit more than just a piece of
+    software (the GXSM itself), there is full hardware support for DSP
+    cards including open source DSP software and a growing set of SPM
+    related electronics. For more information, see <a
+    href="http://gxsm.sourceforge.net/">http://gxsm.sourceforge.net/</a>. <p></p>
+    <h2><a id="HDF interface" name="HDF interface">HDF interface</a></h2>
+    The National Center for Supercomputing Applications (NCSA) has added the netCDF
+    interface to their <a
+    href="http://hdf.ncsa.uiuc.edu/">Hierarchical Data Format (HDF)</a> software.
+    HDF is an extensible data format for self-describing files. A substantial set
+    of applications and utilities based on HDF is available; these support raster-image
+    manipulation and display and browsing through multidimensional scientific data.
+    An implementation is now available that provides the netCDF interface to HDF.
+    With this software, it is possible to use the netCDF calling interface to place
+    data into an HDF file. The netCDF calling interface has not changed and netCDF
+    files stored in XDR format are readable, so existing programs and data will still
+    be usable (although programs will need to be relinked to the new library). There
+    is currently no support for the mixing of HDF and netCDF structures. For example,
+    a raster image can exist in the same file as a netCDF object, but you have to
+    use the Raster Image interface to read the image and the netCDF interface to read
+    the netCDF object. The other HDF interfaces are currently being modified to allow
+    multi-file access, closer integration with the netCDF interface will probably
+    be delayed until the end of that project.
+    <p>
+      Eventually, it will be possible to integrate netCDF objects with the rest of
+      the HDF tool suite. Such an integration will then allow tools written for netCDF
+      and tools written for HDF to both interact intelligently with the new data files.
+    </p>
+    <p></p>
+    <h2><a id="HDF-EOS" name="HDF-EOS">HDF-EOS to netCDF converter</a></h2>
+    <p>
+      The
+      Goddard Earth Sciences Data and Information Services Center (<a
+      href="http://disc.gsfc.nasa.gov" >GES DISC</a>)
+      has developed an on-the-fly HDF-EOS to netCDF/CF converter
+      for the following products, making them easier to use in the <a
+      href="#IDV" >Unidata IDV</a> and <a
+      href="http://www.ssec.wisc.edu/mcidas/software/v/" >McIDAS-V</a>:
+      <ul>
+        <li>
+          AIRS Level 2 (scene) profiles of moisture, air temperature and
+          trace gases
+        </li>
+        <li>
+          AIRS Level 3 (global grid) profiles of moisture, air temperature and trace gases
+        </li>
+        <li>
+          OMI UV-B at the surface
+        </li>
+        <li>
+          TOMS ozone and aerosols
+        </li>
+      </ul>
+    <p>
+      <a href="http://disc.gsfc.nasa.gov/services/NetCDFConversionforIDVandMcIDAS-V.shtml" >Instructions</a> are available for searching and converting these data.
+      More information on AIRS products is available at
+      <a href="http://disc.gsfc.nasa.gov/AIRS/index.html"
+      >http://disc.gsfc.nasa.gov/AIRS/index.html</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="HIPHOP" name="HIPHOP">HIPHOP</a></h2>
+    <a
+    href="http://www.knmi.nl/onderzk/atmosam/English/Service/hiphop/hiphop.html">HIPHOP</a>,
+    developed
+    by Dominik Brunner, is a widget based IDL application that largely facilitates
+    the visualization and analysis of 2D, 3D, and 4D atmospheric science data, in
+    particular atmospheric tracer distributions and meteorological fields.
+    <p>
+      Graphical output of (atmospheric model) data can be quickly generated in a
+      large number of different ways, including horizontal maps at selected model
+      or pressure levels, vertical north-south, east-west, or slant cross-sections
+      (including zonal averages), time slices, animations, etc. It also allows mathematical
+      operations on the existing fields to generate new fields for further analysis,
+      and it can be run as a batch application.
+    </p>
+    <p>
+      The program handles data in netCDF, HDF and GRIB format. Interfaces to other
+      data formats (e.g. ASCII and binary data) can be added easily.
+    </p>
+    <p>
+      Beginning with Version 4.0, it also supports the ability to overlay meteorological
+      fields on a number of different satellite images, and to draw air parcel trajectories.
+    </p>
+    <p></p>
+    <h2><a id="Hyperslab OPerator Suite (HOPS)"
+    name="Hyperslab OPerator Suite (HOPS)">Hyperslab OPerator Suite (HOPS)</a></h2>
+    Hyperslab OPerator Suite (<a
+    href="http://www.cgd.ucar.edu/gds/svn/hyperslab.html">HOPS</a>), developed by
+    R. Saravanan at NCAR, is a bilingual, multi-platform software package for processing
+    data in netCDF files conforming to the NCAR-CCM format or the NCAR Ocean Model
+    format. HOPS is implemented in <a href="#IDL">IDL</a>, the widely-used commercial
+    interpreted language, and also in <a
+    href="ftp://ftp-icf.llnl.gov/pub/Yorick/">Yorick</a>, a public-domain interpreted
+    language that is freely available from the Lawrence Livermore National Laboratory.
+    The IDL version of HOPS should run on any platform supported by IDL. The Yorick
+    version too runs on most common UNIX platforms, such as Sun, SGI, Cray, and LINUX
+    computers.
+    <p>
+      HOPS is not a monolithic program, but a suite of operators that act on data
+      units called "hyperslabs". The design of HOPS is object-oriented,
+      rather than procedure-oriented; the operators treat the numeric data and the
+      associated meta-data (like coordinate information) as a single object.
+    </p>
+    <p>
+      Note that HOPS is not a general purpose netCDF utility and works only for the
+      NCAR CSM netCDF formats. For more information, check the <a href="http://www.cgd.ucar.edu/gds/svn/hyperslab.html">HOPS
+      home page</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="iCDF" name="iCDF">iCDF (imports chromatographic netCDF data into MATLAB)</a></h2>
+    <p>
+      Klavs M. Sørensen, Thomas Skov and Rasmus Bro (Faculty of Life
+      Sciences, University of Copenhagen) have developed <a
+      href="http://www.models.life.ku.dk/source/iCDF/index.asp" >iCDF</a>, a
+      free and documented toolbox for importing chromatographic data in the
+      netCDF-based format that most manufacturers of chromatographic
+      software support.
+    </p>
+    <p>
+      The iCDF software is currently for XC-MS data (X: GC, LC, HPLC), but
+      soon it will be able to import data using other detectors as well.  It
+      can be used to open netCDF files from many different instruments
+      (e.g. Agilent, Bruker) and many chromatographic software packages
+      (e.g. ChemStation).
+    </p>
+    <p>
+      For more information, see the paper
+      <blockquote>
+        Skov T and Bro R. (2008) Solving fundamental problems in chromatographic analysis
+        Analytical and Bioanalytical Chemistry, 390 (1): 281-285.
+      </blockquote>
+    </p>
+    <p></p>
+
+    <h2><a id="IDV" name="IDV">IDV (Integrated Data Viewer)</a></h2>
+    <p>
+      Unidata's <a href="/software/idv/"
+      >Integrated Data Viewer (IDV)</a> is a Java application (for Java 1.4
+      or later)
+      that can be used to display a variety of netCDF files, particularly
+      well formatted, geolocated datasets.   Features include:
+      <ul>
+        <li>
+          Access to local and remote netCDF files and a variety of <a
+          href="/software/idv/docs/userguide/data/DataSources.html" >other
+          data formats</a>
+        </li>
+        <li>
+          Slicing and probing of multidimensional data
+        </li>
+        <li>
+          Support for netCDF conventions (CF, COARDS, NUWG, AWIPS)
+        </li>
+        <li>
+          InstallAnywhere installers for easy download and installation
+        </li>
+        <li>
+          Save display state to a bundle for easy recreation of views
+        </li>
+        <li>
+          Support for non-gridded data through the <a
+          href="/software/netcdf-java/CDM/" >Common Data Model (CDM)</a>
+        </li>
+      </ul>
+      The IDV uses the <a href="http://www.ssec.wisc.edu/~billh/visad.html"
+      >VisAD Java library</a> for interactive and collaborative
+      visualization and analysis
+      and the <a href="/software/netcdf-java/" >netCDF Java library</a> for reading and manipulating
+      netCDF files.
+    </p>
+    <p></p>
+
+    <h2><a id="Ingrid" name="Ingrid">Ingrid</a></h2>
+    <p>
+      <a href="http://ingrid.ldgo.columbia.edu/">Ingrid</a>, by M. Benno Blumenthal
+      <benno at ldeo.columbia.edu>, is designed to manipulate large datasets and
+      model input/output. It can read
+      data from its data catalog, a netCDF file, or a directly attached model, and output
+      the data, either by feeding it to a model, creating a netCDF file, or creating
+      plots and other representations of the data.
+    </p>
+    <p>
+      Ingrid has a number of filters which allow simple data manipulations, such
+      as adding two datasets together, smoothing, averaging, and regridding to a new
+      coordinate.  In addition to netCDF, it also reads HDF, CDF, VOGL,
+      and SGI GL.
+    </p>
+    <p>
+      Ingrid is currently running as a WWW daemon that can be accessed through <a
+      href="http://rainbow.ldgo.columbia.edu/datacatalog.html">http://rainbow.ldgo.columbia.edu/datacatalog.html</a>
+      to see some of its capabilities on a climate data catalog maintained by the
+      <a
+      href="http://rainbow.ldeo.columbia.edu/">Climate Group</a> of the <a href="http://www.ldeo.columbia.edu/">Lamont-Doherty
+      Earth Observatory</a> of Columbia University. To quote the introduction:
+    </p>
+    <blockquote>
+      The Data Catalog is both a catalog and a library of datasets, i.e.
+      it both helps you figure out which data you want, and helps you work with the
+      data. The interface allows you to make plots, tables, and files from any dataset,
+      its subsets, or processed versions thereof.
+      <p>
+        This data server is designed to make data accessible to people using WWW
+        clients (viewers) and to serve as a data resource for WWW documents. Since
+        most documents cannot use raw data, the server is able to deliver the data
+        in a variety of ways: as data files (netCDF and HDF), as tables (html), and
+        in a variety of plots (line, contour, color, vector) and plot formats (PostScript
+        and gif). Processing of the data, particularly averaging, can be requested
+        as well.
+      </p>
+      <p>
+        The Data Viewer in particular demonstrates the power of the Ingrid daemon.
+      </p>
+    </blockquote>
+    <p>
+      Ingrid currently runs on Linux, for which binaries are available.
+      CVS access to the current source can be arranged.
+    </p>
+    <p></p>
+
+    <h2><a id="IntelArrayVisualizer" name="IntelArrayVisualizer"> Intel Array Visualizer</a></h2>
+
+    <p>
+      The <a
+      href="http://www.intel.com/cd/software/products/asmo-na/eng/compilers/226277.htm"
+      >Intel® Array Visualizer</a> and Intel® Array Viewer are available as <a
+      href="http://www.intel.com/cd/software/products/asmo-na/eng/compilers/226277.htm"
+      >free downloads</a> for
+      Windows platforms.  They offer an application and a set
+      of software tools and components, which include C, Fortran, and .Net libraries, for
+      developing scientific visualization applications and for creating interactive graphs of
+      array data in various formats, including HDF and netCDF.
+    </p>
+
+    <p></p>
+    <h2><a id="IVE" name="IVE">IVE</a></h2>
+    <p>
+      <a href="http://www.atmos.washington.edu/ive/">IVE (Interactive Visualization
+      Environment)</a> is a software package designed to interactively display and analyze
+      gridded data. IVE assumes the data to be displayed are contained in one- two-,
+      three- or four-dimensional arrays. By default, the numbers within these arrays
+      are assumed to represent grid point values of some field variable (such as pressure)
+      on a rectangular evenly spaced grid. IVE is, nevertheless, capable of displaying
+      data on arbitrary curvilinear grids.
+    </p>
+    <p>
+      If the data points are not evenly spaced on a rectangular grid, IVE must be
+      informed of the grid structure, either by specifying "attributes"
+      in the data input or by specifying the coordinate transform in a user supplied
+      subroutine. Stretched rectangular grids (which occur when the stretching along
+      a given coordinate is a function only of the value of that coordinate) can be
+      accommodated by specifying one-dimensional arrays containing the grid-point
+      locations along the stretched coordinate as part of the IVE input data. Staggered
+      meshes can also be accommodated by setting "attributes" in the input
+      data. The structure of more complicated curvilinear grids must be communicated
+      to IVE via user supplied "transforms," which define the mapping between
+      physical space and the array indices.
+    </p>
+    <p>
+      Since four-dimensional data cannot be directly displayed on a flat computer
+      screen, it is necessary to reduced the dimensionality of the data before it
+      is displayed. One of IVE's primary capabilities involves dimension reduction
+      or "data slicing." IVE allows the user to display lower-dimensional
+      subsets of the data by fixing a coordinate or by averaging over the coordinate.
+    </p>
+    <p>
+      IVE currently has the capability to display
+    </p>
+    <ul>
+      <li>
+        scalar fields as
+        <ul>
+          <li>
+            2D scalar plots
+          </li>
+          <li>
+            1D scalar plots
+          </li>
+          <li>
+            vertical soundings
+          </li>
+          <li>
+            a single point value
+          </li>
+        </ul>
+      </li>
+      <li>
+        vector fields as 2D vector plots
+      </li>
+    </ul>
+    <p>
+      IVE lets you overlay plots, loop plots, and control a wide variety of display
+      parameters.
+    </p>
+    <p>
+      IVE also can perform algebraic computations on the gridded data and can calculate
+      derivatives. More complicated computations can be performed in user supplied
+      subroutines.
+    </p>
+    <p>
+      IVE uses NetCDF for the data input format, and uses the <a
+      href="http://ngwww.ucar.edu/ng/">NCAR Graphics Library</a> to produce graphical
+      output. IVE is <a
+      href="http://www.atmos.washington.edu/ive/getting.html">available</a> as source
+      via anonymous ftp; and as binary on request for licensees of NCAR graphics.
+    </p>
+    <p></p>
+    <h2><a id="JSON" name="JSON">JSON format with the ncdump-json utility</a></h2>
+    <p>
+      Josep Llodrà has developed a program to output the contents
+      of a netCDF-3 or netCDF-4 file in
+      JSON (JavaScript Object Notation).
+      It is based on Unidata's NCDUMP utility,
+      and it keeps the original ncdump functionality, unless the "-j" option
+      is used to specify JSON output.
+    </p>
+    <p>
+      The program and source are available from <a
+      href="https://github.com/jllodra/ncdump-json"
+      >https://github.com/jllodra/ncdump-json</a>
+      .
+    </p>
+    <p></p>
+
+    <h2><a id="Java interface" name="Java interface">Java interface</a></h2>
+    <p>
+      The <a href="/software/netcdf-java/"
+      >NetCDF-Java 4.2 Library</a> is a Java interface to netCDF files,
+      as well as to many other types of scientific data formats. It
+      is freely available and the source code is released under the
+      (MIT-style) netCDF C library license. Previous versions use the GNU
+      Lesser General Public License (LGPL).
+    </p>
+    <p>
+      The library implements a Common Data Model (<a
+      href="/software/netcdf-java/CDM/" >CDM</a>), a generalization
+      of the netCDF, OpenDAP and HDF5 data models. The library is a
+      prototype for the netCDF-4 project, which provides a C language API
+      for the "data access layer" of the CDM, on top of the HDF5 file
+      format. The NetCDF-Java library is a 100% Java framework for <em>reading</em> netCDF
+      and other file formats into the CDM, as well as <em>writing</em> to the
+      netCDF-3 file format.
+      The library also implements <a
+      href="http://www.unidata.ucar.edu/software/netcdf/ncml/">NcML</a>,
+      which allows you to add metadata to CDM datasets, as well as to create
+      virtual datasets through aggregation.
+    </p>
+
+    <h2><a id="KST" >Kst (2D plotting tool)</a></h2>
+
+    <p>
+      <a href="http://kst-plot.kde.org" >Kst</a> is an open-source, cross-platform 2D plotting tool focused on
+      performance and ease of use. Packages for Windows, various Linux
+      distributions and Mac OS X are <a
+      href="http://sourceforge.net/projects/kst/files/"
+      >available</a>,
+      as well as the complete
+      source code and CMake-based build files.  A more detailed presentation
+      of Kst can be found on the web page at <a href="http://kst-plot.kde.org" >http://kst-plot.kde.org</a>,
+      including numerous screenshots and all the useful download links.
+    </p>
+    <p>
+      Kst is characterized by the following features:
+    </p>
+    <ul>
+      <li>
+        Outstanding performance: curves with millions of points are no problem
+      </li>
+      <li>
+        Plotting of live streams
+      </li>
+      <li>
+        Out-of-the box support for a variety of formats (currently ASCII, netCDF, dirfile, Qimage-supported types, fits images)
+      </li>
+      <li>
+        User-friendly with a modern and consistent user interface
+      </li>
+      <li>
+        A set of unique tools to boost efficiency, including a data import wizard, capacity to edit multiple objects at once or the "Change Data File" tool to compare multiple experiments easily
+      </li>
+      <li>
+        An active community
+      </li>
+      <li>
+        Easily expandable for new data formats or data analysis algorithms thanks to a plugin-based architecture
+      </li>
+      <li>
+        Available on Windows, Linux, and Mac OSX
+      </li>
+    </ul>
+
+    <h2><a id="Labview-API" >Labview interface</a></h2>
+
+    <p>
+      A netCDF Labview interface, implemented in the Labview programming
+      language is available.  The software includes A graphical user
+      interface for editing netCDF data and
+      conversion to other data formats.  The package was developed and is
+      maintained by L. F. Hwang of Sun Yat-sen University in China.
+      For more information
+      and to download the source code, see the <a
+      href="https://sourceforge.net/projects/netcdflabview/" >NetCDFLabview
+      web site</a>.
+    </p>
+
+    <h2><a id="MBDyn" name="MBDyn">MBDyn (MultiBody Dynamics)</a></h2>
+    <p>
+      <a href="http://www.aero.polimi.it/~mbdyn/" >MBDyn</a> is an open-source
+      MultiBody Dynamics analysis system
+      developed at the Dipartimento di Ingegneria Aerospaziale of the
+      University "Politecnico di Milano", Italy.  It uses netCDF as its
+      primary output format.
+    </p>
+    <p>
+      MBDyn features the
+      integrated multidisciplinary analysis of multibody, multiphysics
+      systems, including nonlinear mechanics of rigid and flexible
+      constrained bodies, smart materials, electric networks, active
+      control, hydraulic networks, essential fixed-wing and rotorcraft
+      aerodynamics.  It allows users to simulate the behavior of heterogeneous
+      mechanical, aero-servo-elastic systems based on first principles
+      equations.  It is being actively developed and used in the aerospace
+      and automotive fields for dynamics analysis and simulation of complex
+      systems.  Dynamic linking of
+      user-defined modules is heavily exploited to let users extend the
+      feature library.
+    </p>
+    <p></p>
+
+    <h2><a id="Max_diff_nc" name="Max_diff_nc">Max_diff_nc</a></h2>
+
+    <p>
+      This is a program which compares two NetCDF files. Variables with the
+      same ID in the two files are assumed to be of the same type and have
+      the same shape.  For each such couple of variables, the program
+      computes the maximum of the absolute value of the difference, and the
+      maximum of the absolute value of the relative difference. The program
+      also tells you at what location (the subscript list of the array) the
+      maximum difference is reached.
+
+    <p>
+      The web page for this program is: <a href="http://web.lmd.jussieu.fr/~lglmd/Max_diff_nc">http://web.lmd.jussieu.fr/~lglmd/Max_diff_nc</a>
+
+    <p>
+      This is a freely available tool.
+    </p>
+    <p></p>
+
+    <h2><a id="MeteoExplorer" name="MeteoExplorer"></a>MeteoExplorer</h2>
+
+    <p>
+      <a href="http://www.eastmodelsoft.com/index_en.htm"
+      >MeteoExplorer</a>, developed by Lianqing Yu at China Meteorological
+      Administration, is a cross-platform software application for analyzing
+      and rendering atmospheric science and geoscience data. It supports
+      popular data formats including WMO GRIB1/GRIB2, NetCDF, and MICAPS,
+      and provides basic GIS functionalities. Developed with C++, Meteo
+      Explorer targets multiple computing platforms including Microsoft
+      Windows, GNU Linux, and SGI IRIX operating systems.
+    </p>
+
+    <p>
+      The primary features include:
+    </p>
+    <ul>
+      <li>
+        Graphics layer management (navigation and animation)
+      </li>
+      <li>
+        Objective analysis of physical elements in surface or upperair soundings data
+      </li>
+      <li>
+        Isoline analysis and shading of grid field
+      </li>
+      <li>
+        Streamline analysis of wind field
+      </li>
+      <li>
+        Computation of physics elements
+      </li>
+      <li>
+        NetCDF data process and display
+      </li>
+      <li>
+        GRIB1/GRIB2 data process and display
+      </li>
+      <li>
+        MICAPS data process and display
+      </li>
+      <li>
+        Satellite nephogram data display and animation, support AWX, GPF and HDF format
+      </li>
+      <li>
+        Interactive composition of synoptic chart (command undo/redo, automatic save)
+      </li>
+      <li>
+        Map zoom, pan, projection and clipping
+      </li>
+      <li>
+        Full screen display and zoom to area
+      </li>
+      <li>
+        Quick navigation via thumbnail view of graphics layers
+      </li>
+      <li>
+        Save screen shot as image file (support formats: BMP, JPG, PNG)
+      </li>
+      <li>
+        Vector graphics exported to clipboard or saved as EMF file (Windows version only)
+      </li>
+      <li>
+        Remote desktop connection support
+      </li>
+      <li>
+        System configuration (dynamic menu)
+      </li>
+      <li>
+        Fast switch of user interface language on the fly
+      </li>
+    </ul>
+    <p>
+      For more information, please visit <a
+      href="http://www.eastmodelsoft.com/software/mexplorer.htm"
+      >MeteoExplorer's home page</a> or contact the support staff via
+      meteoexplorer at hotmail.com .
+    </p>
+
+    <p></p>
+    <h2><a id="MeteoInfo" name="MeteoInfo"></a>MeteoInfo</h2>
+
+    <p>
+      For better cross-platform support, <a
+      href="http://www.meteothinker.com" >MeteoInfo</a> has recently been re-developed
+      using Unidata's NetCDF Java library.  MeteoInfo is GIS software for
+      visualization and analysis of spatial and meteorological data.
+      The Java edition can be run in Windows, Mac OS, Linux, and
+      Unix systems.  The Groovy script engine was coupled
+      in the software, so users can write Groovy script to run the software
+      automatically for analysis with complex steps.
+    </p>
+
+    <p>
+      Download: <a href="http://www.meteothinker.com/" >http://www.meteothinker.com/</a>
+    </p>
+
+    <p>
+      Java 6 is needed to run the software.
+    </p>
+
+    <p></p>
+    <h2><a id="MexEPS" name="MexEPS">MexEPS</a></h2>
+    <a href="http://www.pmel.noaa.gov/">PMEL</a> has developed a MATLAB interface, <a
+    href="http://www.epic.noaa.gov/epic/software/mexeps.htm">MexEPS</a>, which supports
+    several netCDF file conventions, including <a
+    href="ftp://ftp.unidata.ucar.edu/pub/netcdf/Conventions/PMEL-EPIC/"> those adopted
+    by PMEL</a>. Many styles of time axes are supported and time manipulation routines
+    ease the use of the time axis in MATLAB. The MexEPS package supports the following
+    data formats:
+    <ul>
+      <li>
+        reading, writing and editing netCDF files;
+      </li>
+      <li>
+        reading and writing Classic EPIC files
+      </li>
+      <li>
+        reading formatted ASCII files
+      </li>
+    </ul>
+    It includes:
+    <ul>
+      <li>
+        VARIABLE, AXIS, ATTRIBUTE manipulation routines
+      </li>
+      <li>
+        TIME manipulation
+        <ul>
+          <li>
+            TIME enters MATLAB as YYMMDDhhmmss.fff
+          </li>
+          <li>
+            Can be converted to netCDF udunits time convention (e.g. days <i>since</i>
+            1990-01-01 00:00:00)
+          </li>
+        </ul>
+      </li>
+      <li>
+        <a href="ftp://ftp.pmel.noaa.gov/eps/mexeps/help-m/">MATLAB help</a> and <a
+        href="ftp://ftp.pmel.noaa.gov/eps/mexeps/examples/">example scripts</a> using
+        MexEPS
+      </li>
+      <li>
+        <b>ASCII2MAT</b> mexFunction, which reads a formatted file into MATLAB as
+        a matrix
+      </li>
+    </ul>
+    <p>
+      The MexEPS package is freely available in PMEL's anonymous ftp directory <a
+      href="ftp://ftp.pmel.noaa.gov/eps/mexeps/">ftp://ftp.pmel.noaa.gov/eps/mexeps/</a>
+    </p>
+    <p>
+      If you have any questions or comments, please contact the author, Willa Zhu <a
+      href="mailto:willa at pmel.noaa.gov">(willa at pmel.noaa.gov)</a> or Nancy Soreide (nns at pmel.noaa.gov).
+    </p>
+    <p></p>
+    <h2><a id="MEXNC" name="MEXNC">MEXNC and SNCTOOLS</a></h2>
+    <p>
+      John Evans of Rutgers University maintains MEXNC and developed SNCTOOLS.
+      <a href="http://mexcdf.sourceforge.net/" >MEXNC</a> is a mexfile
+      interface to NetCDF files for MATLAB that has roughly a one-to-one
+      equivalence with the C API for netCDF. <a
+      href="http://mexcdf.sourceforge.net/tutorial/index.html"
+      >SNCTOOLS</a> is a set of
+      higher-level m-files that sit atop MEXNC, shielding the user from
+      such low level netCDF details as file IDs, variable IDs, and dimension
+      IDs.  The general philosophy behind SNCTOOLS is providing the ability
+      to read and write data without trying to invent a new syntax.
+    </p>
+
+    <p></p>
+    <h2><a id="Mirone" name="Mirone">Mirone (Windows MATLAB-based display)</a></h2>
+
+    <p>
+      Joaquim Luis of Universidade do Algarve has developed <a href="http://w3.ualg.pt/~jluis/mirone/">Mirone</a>,
+      a Windows MATLAB-based framework tool that
+      allows the display and manipulation of a large number of grid/images
+      formats through its interface with the <a
+      href="http://remotesensing.org/gdal/" >GDAL</a> library. Its main
+      purpose is to provide users with an easy-to-use graphical interface to
+      manipulate <a href="http://gmt.soest.hawaii.edu/" >GMT</a> grids. In
+      addition it offers a wide range of tools
+      dedicated to topics in the earth sciences, including tools for
+      multibeam mission planning, elastic deformation studies, tsunami
+      propagation modeling, earth magnetic field computations and magnetic
+      Parker inversions, Euler rotations and poles computations, plate
+      tectonic reconstructions, and seismicity and focal mechanism
+      plotting. The high quality mapping and cartographic capabilities for
+      which GMT is renowned is guaranteed through Mirone's ability to
+      automatically generate GMT cshell scripts and dos batch files.
+    </p>
+    <p>
+      Although Mirone is written in MATLAB, a stand-alone version to run
+      under Windows is also provided. Regrettably this version is not as
+      efficient as the native MATLAB code but provides a solution for users
+      that don't have MATLAB.
+    </p>
+    <p>
+      Also see
+      <br>
+      J. F. Luis. Mirone: A multi-purpose tool for exploring grid
+      data. Computers & Geosciences, 33, 31-41, 2007.
+    </p>
+    <p></p>
+    <h2><a id="ncBrowse" name="ncBrowse">ncBrowse</a></h2>
+    <p>
+      Donald Denbo of NOAA's Pacific Marine Environmental Laboratory has developed
+      and made available <a
+      href="http://www.epic.noaa.gov/java/ncBrowse">ncBrowse</a>, a Java application
+      (JDK1.2) that provides flexible, interactive graphical displays of data and attributes
+      from a wide range of netCDF data file conventions. Features include:
+    </p>
+    <ul>
+      <li>
+        Designed to work with arbitrary netCDF files.
+      </li>
+      <li>
+        Browses file using the EPIC and COARDS conventions.
+      </li>
+      <li>
+        Provides a "tree" view of the netCDF file.
+      </li>
+      <li>
+        Handles character variables.
+      </li>
+      <li>
+        Handles dimensions without an associated variable.
+      </li>
+      <li>
+        Uses sgt graphics to perform 1 and 2 dimensional cuts through data.
+      </li>
+      <li>
+        Save to file single variable as a "cdl" text file.
+      </li>
+      <li>
+        InstallAnywhere scripts for UNIX, Win32, and MacOS.
+      </li>
+      <li>
+        Currently uses Java 2 and Swing.
+      </li>
+    </ul>
+    <p>
+      ncBrowse will run on any UNIX or Windows machine with a Java 2 (JDK1.2) virtual
+      machine installed. Automated installation scripts are available for Windows and
+      UNIX. Additional information on ncBrowse and download instructions are available
+      at <a
+      href="http://www.epic.noaa.gov/java/ncBrowse">http://www.epic.noaa.gov/java/ncBrowse</a>.
+    </p>
+    <p>
+      Questions and suggestions should be directed to <<a
+      href="mailto:dwd at pmel.noaa.gov">dwd at pmel.noaa.gov></a>. If you have problems
+      reading a netCDF file with ncBrowse, please send him a copy of the file and
+      he'll get ncBrowse to read it!
+    </p>
+    <p></p>
+    <h2><a id="nccmp" name="nccmp">nccmp</a></h2>
+    <p>
+      Remik Ziemlinski of the NOAA Geophysical Fluid Dynamics Laboratory has
+      developed <a href="http://nccmp.sourceforge.net/" >nccmp</a>,
+      a tool to compare two netCDF files.
+      It can use MPI, include/exclude specific
+      variables or metadata and operates quickly.
+      Highly recommended for regression testing with large datasets.
+      See the Web site
+      <a href="http://nccmp.sourceforge.net/"
+      >http://nccmp.sourceforge.net/</a> for more information.
+    <p></p>
+    <h2><a id="NCL" name="NCL">NCL</a></h2>
+    <p>
+      The <a href="http://www.ncl.ucar.edu/" >NCAR Command Language
+      (NCL)</a> is an intepreted programming
+      language for scientific data analysis and visualization developed and
+      maintained in
+      NCAR's <a href="http://www.cisl.ucar.edu/">Computational and Information Systems
+      Laboratory</a>.
+    </p>
+    <p>
+      NCL has many features common to modern programming languages,
+      including types, variables, operators, expressions, conditional
+      statements, loops, and functions and procedures.  NCL also has
+      features that are not found in other programming languages, including
+      those that handle the manipulation of metadata, the configuration of
+      visualizations, the import of data from a variety of data formats, and
+      an algebra that supports array operations.
+    </p>
+    <p>
+      NCL has robust file input and output capabilities. It allows different
+      datasets of different formats (netCDF, netCDF-4 classic, HDF4, HDF4-EOS,
+      GRIB-1, and GRIB-2) to
+      be imported into one uniform and consistent data manipulation
+      environment, which internally is the netCDF data format.  NCL doesn't
+      place any restrictions or conventions on the organization of input
+      netCDF files.
+    </p>
+    <p>
+      NCL comes with many useful built-in functions and procedures for
+      processing and manipulating data. There are over 600 functions and
+      procedures that include routines for use specifically with climate and
+      model data, empirical orthogonal functions, Fourier
+      coefficients, wavelets, singular value decomposition, 1-, 2-, and
+      3-dimensional interpolation, approximation, and regridding, and
+      computer analysis of scalar and vector global geophysical quantities.
+    </p>
+    <p>
+      The visualizations are publication-quality and highly customizable,
+      with hundreds of options available for tweaking the looks of your
+      graphics. NCL can generate contours, XY plots, vectors, streamlines,
+      and can overlay these plots on many different map projections.  There
+      are also specialized functions for generating histograms, wind roses,
+      meteograms, skew-T plots, weather maps.
+    </p>
+    <p>
+      Included with the software are two command line tools:
+      "ncl_convert2nc" for converting GRIB-1/2 or HDF files to netCDF
+      files, and "ncl_filedump" which will dump the contents of a file
+      format that NCL recognizes (netCDF, GRIB-1/2, HDF, etc).
+    </p>
+    <p>
+      NCL is available under an open source license or in binary form for
+      several popular UNIX platforms, including (but not limited to) Linux,
+      MacOSX, and Windows/Cygwin.
+    </p>
+    <p>
+      Documentation and additional information on NCL are available from the
+      <a href="http://www.ncl.ucar.edu/">NCL website</a>, which contains
+      hundreds of <a
+      href="http://www.ncl.ucar.edu/Applications/">application examples</a>
+      for one to download. You can also contact Mary Haley, at <a
+      href="mailto:haley at ucar.edu">haley at ucar.edu</a> for more information.
+
+    <p></p>
+    <h2><a id="NCO" name="NCO">NCO</a></h2>
+    <a href="http://nco.sourceforge.net">NCO</a> (netCDF operators) is a package of
+    command line operators that work on generic netCDF or HDF4 files:
     <ul>
-      <li>2D scalar plots</li>
-      <li>1D scalar plots</li>
-      <li>vertical soundings</li>
-      <li>a single point value</li>
+      <li>
+        ncap2 - arithmetic processor
+      </li>
+      <li>
+        ncatted - attribute editor
+      </li>
+      <li>
+        ncbo - binary operator
+      </li>
+      <li>
+        ncdiff - differencer
+      </li>
+      <li>
+        ncea - ensemble averager
+      </li>
+      <li>
+        ncecat - ensemble concatenator
+      </li>
+      <li>
+        ncflint - file interpolator
+      </li>
+      <li>
+        ncks - kitchen sink (extract, cut, paste, print data)
+      </li>
+      <li>
+        ncpdq - permute dimensions quickly
+      </li>
+      <li>
+        ncra - running averager
+      </li>
+      <li>
+        ncrcat - record concatenator
+      </li>
+      <li>
+        ncrename - renamer
+      </li>
+      <li>
+        ncwa - weighted averager
+      </li>
     </ul>
-  </li>
-  <li>vector fields as 2D vector plots</li>
-</ul>
-<p>IVE lets you overlay plots, loop plots, and control a wide variety of display
-  parameters.</p>
-<p>IVE also can perform algebraic computations on the gridded data and can calculate
-  derivatives. More complicated computations can be performed in user supplied
-  subroutines.</p>
-<p>IVE uses NetCDF for the data input format, and uses the <a
-href="http://ngwww.ucar.edu/ng/">NCAR Graphics Library</a> to produce graphical
-  output. IVE is <a
-href="http://www.atmos.washington.edu/ive/getting.html">available</a> as source
-  via anonymous ftp; and as binary on request for licensees of NCAR graphics.</p>
-<p></p>
-<h2><a id="JSON" name="JSON">JSON format with the ncdump-json utility</a></h2>
-<p>
-Josep Llodrà has developed a program to output the contents
-of a netCDF-3 or netCDF-4 file in
-JSON (JavaScript Object Notation).
-It is based on Unidata's NCDUMP utility,
-and it keeps the original ncdump functionality, unless the "-j" option
-is used to specify JSON output.
-</p>
-<p>
-The program and source are available from <a
-href="https://github.com/jllodra/ncdump-json"
->https://github.com/jllodra/ncdump-json</a>
-.
-</p>
-<p></p>
-
-<h2><a id="Java interface" name="Java interface">Java interface</a></h2>
-<p> The <a href="/software/netcdf-java/"
->NetCDF-Java 4.2 Library</a> is a Java interface to netCDF files,
-as well as to many other types of scientific data formats. It
-is freely available and the source code is released under the
-(MIT-style) netCDF C library license. Previous versions use the GNU
-Lesser General Public License (LGPL).
-</p>
-<p>
-The library implements a Common Data Model (<a
-href="/software/netcdf-java/CDM/" >CDM</a>), a generalization
-of the netCDF, OpenDAP and HDF5 data models. The library is a
-prototype for the netCDF-4 project, which provides a C language API
-for the "data access layer" of the CDM, on top of the HDF5 file
-format. The NetCDF-Java library is a 100% Java framework for <em>reading</em> netCDF
-and other file formats into the CDM, as well as <em>writing</em> to the
-netCDF-3 file format.
-The library also implements <a
-href="http://www.unidata.ucar.edu/software/netcdf/ncml/">NcML</a>,
-which allows you to add metadata to CDM datasets, as well as to create
-virtual datasets through aggregation.  </p>
-
-<h2><a id="KST" >Kst (2D plotting tool)</a></h2>
-
-<p>
-<a href="http://kst-plot.kde.org" >Kst</a> is an open-source, cross-platform 2D plotting tool focused on
-performance and ease of use. Packages for Windows, various Linux
-distributions and Mac OS X are <a
-href="http://sourceforge.net/projects/kst/files/"
->available</a>,
-as well as the complete
-source code and CMake-based build files.  A more detailed presentation
-of Kst can be found on the web page at <a href="http://kst-plot.kde.org" >http://kst-plot.kde.org</a>,
-including numerous screenshots and all the useful download links.
-</p>
-<p>
-Kst is characterized by the following features:
-</p>
-<ul>
-  <li>Outstanding performance: curves with millions of points are no problem</li>
-  <li>Plotting of live streams</li>
-  <li>Out-of-the box support for a variety of formats (currently ASCII, netCDF, dirfile, Qimage-supported types, fits images)</li>
-  <li>User-friendly with a modern and consistent user interface</li>
-  <li>A set of unique tools to boost efficiency, including a data import wizard, capacity to edit multiple objects at once or the "Change Data File" tool to compare multiple experiments easily</li>
-  <li>An active community</li>
-  <li>Easily expandable for new data formats or data analysis algorithms thanks to a plugin-based architecture</li>
-  <li>Available on Windows, Linux, and Mac OSX</li>
-</ul>
-
-<h2><a id="Labview-API" >Labview interface</a></h2>
-
-<p>
-A netCDF Labview interface, implemented in the Labview programming
-language is available.  The software includes A graphical user
-interface for editing netCDF data and
-conversion to other data formats.  The package was developed and is
-maintained by L. F. Hwang of Sun Yat-sen University in China.
-For more information
-and to download the source code, see the <a
-href="https://sourceforge.net/projects/netcdflabview/" >NetCDFLabview
-web site</a>.
-</p>
-
-
-
-
-<h2><a id="MBDyn" name="MBDyn">MBDyn (MultiBody Dynamics)</a></h2>
-<p>
-<a href="http://www.aero.polimi.it/~mbdyn/" >MBDyn</a> is an open-source
-MultiBody Dynamics analysis system
-developed at the Dipartimento di Ingegneria Aerospaziale of the
-University "Politecnico di Milano", Italy.  It uses netCDF as its
-primary output format.
-</p>
-<p>
- MBDyn features the
-integrated multidisciplinary analysis of multibody, multiphysics
-systems, including nonlinear mechanics of rigid and flexible
-constrained bodies, smart materials, electric networks, active
-control, hydraulic networks, essential fixed-wing and rotorcraft
-aerodynamics.  It allows users to simulate the behavior of heterogeneous
-mechanical, aero-servo-elastic systems based on first principles
-equations.  It is being actively developed and used in the aerospace
-and automotive fields for dynamics analysis and simulation of complex
-systems.  Dynamic linking of
-user-defined modules is heavily exploited to let users extend the
-feature library.
-</p>
-<p></p>
-
-<h2><a id="Max_diff_nc" name="MBDyn">Max_diff_nc</a></h2>
-
-<p>
-This is a program which compares two NetCDF files. Variables with the
-same ID in the two files are assumed to be of the same type and have
-the same shape.  For each such couple of variables, the program
-computes the maximum of the absolute value of the difference, and the
-maximum of the absolute value of the relative difference. The program
-also tells you at what location (the subscript list of the array) the
-maximum difference is reached.
-
-<p>The web page for this program is:
-<a href="http://web.lmd.jussieu.fr/~lglmd/Max_diff_nc">http://web.lmd.jussieu.fr/~lglmd/Max_diff_nc</a>
-
-<p>This is a freely available tool.
-</p>
-<p></p>
-
-<h2><a id="MeteoExplorer" name="MeteoExplorer"></a>MeteoExplorer</h2>
-
-<p> <a href="http://www.eastmodelsoft.com/index_en.htm"
->MeteoExplorer</a>, developed by Lianqing Yu at China Meteorological
-Administration, is a cross-platform software application for analyzing
-and rendering atmospheric science and geoscience data. It supports
-popular data formats including WMO GRIB1/GRIB2, NetCDF, and MICAPS,
-and provides basic GIS functionalities. Developed with C++, Meteo
-Explorer targets multiple computing platforms including Microsoft
-Windows, GNU Linux, and SGI IRIX operating systems.  </p>
-
-<p>
-The primary features include:
-</p>
-<ul>
-  <li>Graphics layer management (navigation and animation)</li>
-  <li>Objective analysis of physical elements in surface or upperair soundings data</li>
-  <li>Isoline analysis and shading of grid field</li>
-  <li>Streamline analysis of wind field</li>
-  <li>Computation of physics elements</li>
-  <li>NetCDF data process and display</li>
-  <li>GRIB1/GRIB2 data process and display</li>
-  <li>MICAPS data process and display</li>
-  <li>Satellite nephogram data display and animation, support AWX, GPF and HDF format</li>
-  <li>Interactive composition of synoptic chart (command undo/redo, automatic save)</li>
-  <li>Map zoom, pan, projection and clipping</li>
-  <li>Full screen display and zoom to area</li>
-  <li>Quick navigation via thumbnail view of graphics layers</li>
-  <li>Save screen shot as image file (support formats: BMP, JPG, PNG)</li>
-  <li>Vector graphics exported to clipboard or saved as EMF file (Windows version only)</li>
-  <li>Remote desktop connection support</li>
-  <li>System configuration (dynamic menu)</li>
-  <li>Fast switch of user interface language on the fly</li>
-</ul>
-<p>
-For more information, please visit <a
-href="http://www.eastmodelsoft.com/software/mexplorer.htm"
->MeteoExplorer's home page</a> or contact the support staff via
-meteoexplorer at hotmail.com .
-</p>
-
-<p></p>
-<h2><a id="MeteoInfo" name="MeteoInfo"></a>MeteoInfo</h2>
-
-<p>
-For better cross-platform support, <a
-href="http://www.meteothinker.com" >MeteoInfo</a> has recently been re-developed
-using Unidata's NetCDF Java library.  MeteoInfo is GIS software for
-visualization and analysis of spatial and meteorological data.
-The Java edition can be run in Windows, Mac OS, Linux, and
-Unix systems.  The Groovy script engine was coupled
-in the software, so users can write Groovy script to run the software
-automatically for analysis with complex steps.
-</p>
-
-<p>
-Download: <a href="http://www.meteothinker.com/" >http://www.meteothinker.com/</a>
-</p>
-
-<p>
-Java 6 is needed to run the software.
-</p>
-
-<p></p>
-<h2><a id="MexEPS" name="MexEPS">MexEPS</a></h2>
-<a href="http://www.pmel.noaa.gov/">PMEL</a> has developed a MATLAB interface,
-<a
-href="http://www.epic.noaa.gov/epic/software/mexeps.htm">MexEPS</a>, which supports
-several netCDF file conventions, including <a
-href="ftp://ftp.unidata.ucar.edu/pub/netcdf/Conventions/PMEL-EPIC/"> those adopted
-by PMEL</a>. Many styles of time axes are supported and time manipulation routines
-ease the use of the time axis in MATLAB. The MexEPS package supports the following
-data formats:
-<ul>
-  <li>reading, writing and editing netCDF files;</li>
-  <li>reading and writing Classic EPIC files</li>
-  <li>reading formatted ASCII files</li>
-</ul>
-It includes:
-<ul>
-  <li>VARIABLE, AXIS, ATTRIBUTE manipulation routines</li>
-  <li>TIME manipulation
+
+    <p>
+      All operators may now be <a href="http://www.opendap.org">OPeNDAP</a> clients. OPeNDAP enables
+      network transparent data access to any OPeNDAP server. Thus OPeNDAP-enabled NCO can
+      operate on remote files accessible through any OPeNDAP server without transferring
+      the files. Only the required data (e.g., the variable or hyperslab specified)
+      are transferred.
+    </p>
+    <p>
+      The source code is freely available from the <a
+      href="http://nco.sourceforge.net/">NCO home page</a>, as is the NCO User's
+      Guide.
+    </p>
+    <p>
+      For more information, contact the author, Charlie Zender.
+    </p>
+    <p></p>
+    <h2><a id="ncregrid" name="ncregrid">ncregrid</a></h2>
+    <p>
+      Patrick Jöckel of the Max Planck Institute for Chemistry has developed <strong>ncregrid</strong>,
+      a tool (written in FORTRAN-90) for data transfer of gridded 2- and 3-dimensional
+      (spatial) geophysical/geochemical scalar fields between grids of different resolutions.
+      The algorithm handles data on rectangular latitude/longitude grids (not necessarily
+      evenly spaced) and vertical pressure hybrid grids of arbitrary resolution. The
+      input/output data format is netCDF. ncregrid is freely available without any
+      warranty under the GNU public license (GPL). ncregrid can be used as a "stand-alone"
+      program, and/or linked as an interface to a model, in order to re-grid automatically
+      the input from an arbitrary grid space onto the required grid resolution.
+    </p>
+    <p>
+      More information is available on the web-page: <a href="http://www.mpch-mainz.mpg.de/~joeckel/ncregrid/index.html" > http://www.mpch-mainz.mpg.de/~joeckel/ncregrid/index.html</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="nctoolbox" name="nctoolbox">nctoolbox (a MATLAB common data model interface)</a></h2>
+
+    <p>
+      <a
+      href="http://nctoolbox.github.io/nctoolbox/" >nctoolbox</a> is a MATLAB
+      interface that provides read-only access to <a
+      href="/software/netcdf-java/CDM/index.html" >Common Data Model</a>
+      datasets.
+      Under the hood, nctoolbox uses Unidata's NetCDF-Java as the data access layer.
+      This allows nctoolbox to access to netCDF, OPeNDAP, HDF5, GRIB, GRIB2, HDF4,
+      and many (15+) other file formats and services using the same API.
+      It works with MATLAB 2008a and later.  The nctoolbox software was
+      developed by Brian Schlining (MBARI), Rich Signell
+      (USGS), Sachin Kumar Bhate (freelance), and Alex Crosby (RPS/ASA).
+    </p>
+
+    <p></p>
+
+    <h2><a id="ncdx" name="ncdx">ncdx</a></h2>
+    <p>
+      Patrick Jöckel of the Max Planck Institute for Chemistry has developed <strong>ncdx</strong>,
+      a tool (written in FORTRAN-90) that scans a netCDF file and makes it <a href="#OpenDX" >OpenDX</a>
+      compliant. ncdx is freely available without any warranty under the GNU public
+      license (GPL). More information is available on the web-page: <a href="http://www.mpch-mainz.mpg.de/~joeckel/ncdx/index.html" > http://www.mpch-mainz.mpg.de/~joeckel/ncdx/index.html</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="ncensemble" name="ncensemble">ncensemble</a></h2>
+    <p>
+      Alan Iwi, of Rutherford Appleton Laboratory, offers this command
+      line ensemble statistics utility. More information is available on
+      the web-page: <a href="http://home.badc.rl.ac.uk/iwi/ncensemble/" > http://home.badc.rl.ac.uk/iwi/ncensemble/</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="ncview" name="ncview">ncview</a></h2>
+    <a
+    href="http://meteora.ucsd.edu/~pierce/ncview_home_page.html">Ncview</a> is a visual
+    browser for netCDF files. Typically you would use ncview to get a quick and easy,
+    push-button look at your netCDF files. You can view simple movies of the data,
+    view along various dimensions, take a look at the actual data values, change color
+    maps, invert the data, etc. It runs on UNIX platforms under X11, R4 or higher.
+    For more information, check out the <a
+    href="http://meteora.ucsd.edu/~pierce/docs/ncview.README">README</a> file; you
+    can also see a representative <a
+    href="http://meteora.ucsd.edu/~pierce/docs/ncview.gif">screen image</a> (GIF,
+    66K) of ncview in action.
+    <p>
+      The source may be downloaded from <a
+      href="ftp://cirrus.ucsd.edu/pub/ncview/">ftp://cirrus.ucsd.edu/pub/ncview/</a>.
+      For more information, please contact the author, David W. Pierce at <a href="mailto:dpierce at ucsd.edu">dpierce at ucsd.edu</a>.
+    </p>
+
+    <h2><a id="NC4ML5" name="NC4ML5">NetCDF Toolbox for MATLAB-5</a></h2>
+    The <a
+    href="http://mexcdf.sourceforge.net/">NetCDF Toolbox for
+    MATLAB-5</a>, originally developed by Charles R. Denham, combined netCDF-3 with <a
+    href="http://www.mathworks.com/products/matlab/">MATLAB</a> to form an interface that
+    used MATLAB operator-syntax for arithmetic, logical, and subscripting operations
+    on netCDF entities.  The NetCDF Toolbox is in bug-fix-only mode, and is
+    maintained by John.G.Evans.NE at gmail.com,
+    on the <a href="http://mexcdf.sf.net" > MEXNC, SNCTOOLS, and the
+    NetCDF Toolbox</a> web page.
+    </p>
+    <p></p>
+
+    <h2><a id="ncvtk" name="ncvtk">ncvtk</a></h2>
+
+    <p>
+      <a href="http://ncvtk.sourceforge.net/" >Ncvtk</a> is a program for
+      exploring planetary data stored in a NetCDF file.
+      The NetCDF file  should loosely follow the <a
+      href="http://www.cgd.ucar.edu/cms/eaton/cf-metadata/" >CF metadata
+      conventions</a>.
+    </p>
+    <p>
+      Ncvtk was designed from the ground up with the aim of offering a high
+      degree of interactivity to scientists who have a need to explore
+      structured, three-dimensional, time-dependent climate data on the
+      sphere. A graphical user interface allows users to interact with their
+      data via color/transparency/contour/vector plots, apply vertical slices,
+      probe data, apply an external sun light, overlay hydrographic and
+      geopolitical data, rotate, zoom, etc. with minimal fuss.
+    </p>
+    <p>
+      Ncvtk is written in python and is based on the <a
+      href="http://public.kitware.com/VTK/" >Visualization Toolkit
+      (VTK)</a>. Like python and VTK, Ncvtk is
+      highly portable and known to run on Windows and Linux (i386, ia64,
+      EMT64) platforms. More information about Ncvtk is available at <a
+      href="http://ncvtk.sourceforge.net"
+      >http://ncvtk.sourceforge.net</a>.
+    </p>
+
+    <p></p>
+
+    <h2><a id="netcdf_tools" name="netcdf_tools">Ivan Shmakov's netcdf tools</a></h2>
+
+    <p>
+      The NetCDF tools is a free software package consisting of a few
+      tools operating on NetCDF and, by utilizing the compatibility API,
+      HDF4 files, which are intended to be usable from Shell scripts.
+    </p>
+    <p>
+      The currently packaged tools are:
+    </p>
     <ul>
-      <li>TIME enters MATLAB as YYMMDDhhmmss.fff</li>
-      <li>Can be converted to netCDF udunits time convention (e.g. days <i>since</i>
-        1990-01-01 00:00:00)</li>
+      <li>
+        a couple of simple shell wrappers over the respective NetCDF
+        functions (ncattget and ncattput);
+      </li>
+      <li>
+        a more sophisticated ncget tool.
+      </li>
     </ul>
-  </li>
-  <li><a href="ftp://ftp.pmel.noaa.gov/eps/mexeps/help-m/">MATLAB help</a> and
+    <p>
+      The ncget tool implements functionalilty that is similar to hdp
+      dumpsds (for NetCDF, which lacks such a tool), or complements it in
+      the case of HDF4. It can be seen as a complement to the ncdump tool
+      (included in both the NetCDF and HDF4 distributions) as well.
+    </p>
+    <p>
+      This tool allows a selected part of a NetCDF variable or an HDF4
+      scientific data set (SDS) to be extracted in either an ASCII or
+      binary form, applying the transformation specified by the usual
+      scale_factor and add_offset attributes. It allows one to feed the
+      data contained in NetCDF variables (or HDF4 SDS) to the tools
+      designed to operate on either ASCII (text) or raw (binary) data.
+    </p>
+    <p>
+      This version of the package is the first one to be announced to the
+      public. It has some known bugs and limitations, but it's proved to
+      be quite usable.  A <a
+      href="http://freshmeat.net/projects/netcdf-tools" >project page</a> on
+      freshmeat.net.  The <a
+      href="http://waterlily.siamics.net/~ivan/src/netcdf-tools-0.1-rc1.tar.gz"
+      >source</a> is also available.
+    </p>
+
+    <h2><a id="netcdf4excel" name="netcdf4excel">netcdf4excel (add-in for MS Excel)</a></h2>
+    <p>
+      Alexander Bruhns
+      <bruhns at free.fr>
+        has developed <a
+        href="http://code.google.com/p/netcdf4excel/" >a netCDF add-in written in
+        Visual Basic for MS Excel</a>.  This add-in simplifies the use of
+        NetCDF data in Excel, providing a ready to use solution for
+        manipulating this type of data.
+    </p>
+    <p>
+      For developers, the open-source (GPL V3 license) can be downloaded
+      directly or checked out with Mercurial.
+    </p>
+    <p>
+      The add-in is written in VBA 6.0 (so it won't work with Office 2010 64 bits) and is designed for Excel 2007 running with the Microsoft Windows operating system.
+      It supports opening netCDF classic format data with Excel for read or
+      write access.
+    </p>
+    <p>
+      More details are available on the <a
+      href="http://code.google.com/p/netcdf4excel/" >netcdf4excel web
+      site</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="netcdf95" name="netcdf95">NetCDF95 alternative Fortran API</a></h2>
+
+    <p>
+      Lionel Guez has developed and made feely available <a
+      href="http://web.lmd.jussieu.fr/~lglmd/NetCDF95" >NetCDF95</a>, a new
+      alternative Fortran interface to the NetCDF library.  Compared to the
+      Unidata-provided Fortran 90 netCDF interface, the NetCDF95 interface
+      is meant to be easier to use and more secure.
+    </p>
+
+    <h2><a id="Objective-C" name="Objective-C">Objective-C API</a></h2>
+
+    <p>
+      Tom Moore has an Objective-C API, available here: <a href="http://www.paleoterra.com/software" >www.paleoterra.com/software</a>.
+
+      The netCDF Framework is an open source (Argonne Open Source License)
+      MacOSX application framework that provides an Objective-C interface
+      to the NCAR netCDF library version 3.  The framework is available
+      both as source code and universal compiles (works on both PPC and
+      Intel macs).  The source code has also been compiled by users for the
+      GNUStep environment.   Version 2 of the framework will provide
+      classes for accessing multiple netCDF files, working with in-memory
+      data slabs using standard notation, and some support for
+      multithreading.
+
+      <h3>Mark Tracy's Objective-C API</h3>
+
+    <p>
+      Mark Tracy has written <a href="http://www.mt-se.com/nc_1.html"
+      >NetcdfStep</a>, an Objective-C
+      API for netCDF that uses Objective-C Foundation Classes.
+
+    <p>
+      NetcdfStep is framework for using the netCDF library in
+      object-oriented programming with Objective-C. It now
+      supports the full functionality of netCDF 3.6.2.
+    </p>
+    <p>
+      A <a
+      href="http://www.mt-se.com/pub/NetcdfStep-1.0.2.zip" > complete Mac OS X distribution</a> including pre-built static library and <a
+      href="http://www.mt-se.com/netcdfstep_doc/" >online documentation</a>
+      are available.  Applications linked to this framework have no external
+      dependencies (other than Mac OS X itself).
+      A <a href="http://www.mt-se.com/pub/NetcdfStep-GNUstep-0.6.1.tar.gz" > source-code only distribution</a> synced up to version 0.6.1 is
+      available for GNUstep for use on
+      Linux and other Unix platforms.
+    </p>
+
+    <p></p>
+    <h2><a id="NCMEX" name="NCMEX">Octave interface</a></h2>
+
+    <p>
+      The ARM Program has contributed NCMEX for Octave, a port of Chuck
+      Denham's MATLAB NCMEX to <a href="http://www.octave.org" >Octave</a>.  The
+      calling syntax
+      is identical, so scripts using NCMEX in MATLAB should in theory be
+      portable to Octave.  In order to build NCMEX, a compiled C NetCDF
+      library must already be installed.
+    </p>
+    <p>
+      In addition to the base NetCDF library interface, this package includes a
+      simple toolbox to automate the reading and writing of NetCDf files
+      within Octave using NCMEX.  These tools as well as the source for
+      NCMEX are available from <a
+      href="http://engineering.arm.gov/~sbeus/octavex/octavex.tar" > http://engineering.arm.gov/~sbeus/octavex/octavex.tar</a>
+      (NOTE: this .tar file contains other
+      Octave extension functions besides NCMEX.)
+    </p>
+    <p>
+      Also see <a href="http://ocgmod1.marine.usf.edu/octcdf/" >Octcdf</a>,
+      a netCDF toolbox for Octave.
+    </p>
+    <p>
+      For installation instructions, see the README file inside the .tar file.
+    </p>
+
+    <p></p>
+
+    <h2><a id="Octave" name="Octave">Octave interface (Barth)</a></h2>
+
+    <p>
+      Alexander Barth has contributed the following:
+    </p>
+    <p>
+      Octcdf is a netCDF toolbox for <a
+      href="http://www.octave.org/">Octave</a> which uses the same operator
+      syntax as the <a
+      href="http://mexcdf.sourceforge.net/netcdf_toolbox.html">matlab netCDF
+      toolbox</a> of Charles R. Denham. NetCDF dimensions, attributes and
+      variables are Octave objects and can be accessed, sliced and changed
+      just as regular variables. Unlike most netCDF toolboxes for matlab, it
+      does not depend on the NCMEX wrapper around the netCDF interface. This
+      octave toolbox is written in C++ calling directly the netCDF library.
+      The octcdf toolbox can also be used to download data from an OpenDAP
+      server. The octcdf source code is available at <a
+      href="http://modb.oce.ulg.ac.be/mediawiki/index.php/NetCDF_toolbox_for_Octave"> http://modb.oce.ulg.ac.be/mediawiki/index.php/NetCDF_toolbox_for_Octave</a>.
+      It was also included in the Octave Repository <a
+      href="http://octave.sourceforge.net/">octave-forge</a>.
+    </p>
+
+    <p></p>
+
+    <h2><a id="OPeNDAP" name="OPeNDAP">OPeNDAP (formerly DODS)</a></h2>
+
+    <p>
+      The <a href="http://opendap.org/">OPeNDAP</a> (formerly known as
+      DODS) is an Open-source Project for a Network Data Access Protocol
+      that makes local data and subsets of local data accessible to remote
+      locations independent of the local storage format. OPeNDAP also
+      provides tools for transforming existing applications into OPeNDAP
+      clients, enabling them to remotely access OPeNDAP served data.
+      OPeNDAP is based on existing data access tools; rather than developing
+      a self contained system, it makes extensive use of existing data
+      access APIs.
+    </p>
+
+    <p>
+      OPeNDAP can be used to make netCDF data files available over the
+      Internet and it can also be used to adapt existing software which use
+      the netCDF API (by re-linking) to read data served by an OPeNDAP data
+      server. In principle, any program written using netCDF can be adapted
+      to read data from an OPeNDAP server - in other words any program
+      which uses netCDF can become a client in the OPeNDAP client-server
+      system. Included in the source and binary distributions are two freely
+      available programs that have already been modified (re-linked).
+    </p>
+
+    <p>
+      With a client program accessing data from a netCDF server, it is
+      possible to access a small subset of a large dataset over the Internet
+      without copying the entire dataset (as you would have to do with FTP
+      or AFS). The client can see changes to the netCDF dataset, e.g. when
+      new records are added (which would not be possible with FTP). Finally,
+      the client can also access cross-sections of variable data without
+      paging large amounts of data across the network (as you would have to
+      do with NFS, for example).
+    </p>
+
+    <p>
+      OPeNDAP software is freely available in both
+      source form or binary form for selected platforms.
+    </p>
+
+    <p></p>
+
+    <h2><a id="OpenDX" name="OpenDX">OpenDX</a></h2>
+    <a href="http://www.opendx.org/about.html">OpenDX</a> (formerly IBM Data Explorer,
+    also known as simply DX) is a general-purpose software package for data visualization
+    and analysis. It employs a data-flow driven client-server execution model and
+    provides a graphical program editor that allows the user to create a visualization
+    using a point and click interface.
+    <p>
+      DX runs on 7 major UNIX platforms as well as Windows 95/NT and is designed
+      to take full advantage of multi-processor systems from IBM, SGI and Sun.
+    </p>
+    <p>
+      DX is built upon an internal data model, which describes and provides uniform
+      access services for any data brought into, generated by, or exported from the
+      software. This data model supports a number of different classes of scientific
+      data, which can be described by their shape (size and number of dimensions),
+      rank (e.g., scalar, vector, tensor), type (float, integer, byte, etc. or real,
+      complex, quaternion), where the data are located in space (positions), how the
+      locations are related to each other (connections), aggregates or groups (e.g.,
+      hierarchies, series, composites, multizone grids, etc.). It also supports those
+      entities required for graphics and imaging operations within the context of
+      Data Explorer. Regular and irregular, deformed or curvilinear, structured and
+      unstructured data as well as "missing" or invalid data are supported.
+    </p>
+    <p>
+      The details of the data model are hidden at the user level. As a result DX
+      operations or modules are polymorphic and appear typeless. The DX Import module,
+      which reads data for use within Data Explorer directly utilizes data in netCDF
+      as well as other formats (e.g., HDF, CDF). One or more variables may be selected
+      as well as step(s) of a time series. Data in conventional netCDFs are directly
+      imported. Since the DX data model is more comprehensive than the netCDF data
+      model, a methodology to extend netCDF via attribute conventions (e.g., for unstructured
+      meshes, non-scalar data and hierarchies) for use with Data Explorer is available.
+    </p>
+    <p>
+      DX supports a number of realization techniques for generating renderable geometry
+      from data. These include color and opacity mapping (e.g., for surface and volume
+      rendering), contours and isosurfaces, histograms, two-dimensional and three-dimensional
+      plotting, surface deformation, etc. for scalar data. For vector data, arrow
+      plots, streamlines, streaklines, etc. are provided. Realizations may be annotated
+      with ribbons, tubes, axes, glyphs, text and display of data locations, meshes
+      and boundaries. Data probing, picking, arbitrary surface and volume sampling,
+      and arbitrary cutting/mapping planes are supported.
+    </p>
+    <p>
+      DX supports a number of non-graphical functions such as point-wise mathematical
+      expressions (e.g., arithmetic, transcendental, boolean, type conversion, etc.),
+      univariate statistics and image processing (e.g., transformation, filter, warp,
+      edge detection, convolution, equalization, blending, morphological operations,
+      etc.). Field/vector operations such as divergence, gradient and curl, dot and
+      cross products, etc. are provided. Non-gridded or scattered data may be interpolated
+      to an arbitrary grid or triangulated, depending on the analysis requirements.
+      The length, area or volume of various geometries may also be computed. Tools
+      for data manipulation such as removal of data points, subsetting by position,
+      sub/supersampling, grid construction, mapping, interpolation, regridding, transposition,
+      etc. are available.
+    </p>
+    <p>
+      Tools for doing cartographic projections and registration as well as earth,
+      space and environmental sciences examples are available at Cornell University
+      via info.tc.cornell.edu. Also see the <a href="#ncdx" >ncdx</a> tool for making
+      netCDF files OpenDX compliant.
+    </p>
+    <p></p>
+    <h2><a id="Panoply" name="Panoply">Panoply</a></h2>
+    <p>
+      <a href="http://www.giss.nasa.gov/tools/panoply/" >Panoply</a>
+      is an application that plots geo-gridded and other arrays from netCDF,
+      HDF, GRIB, and other datasets. Features include:
+    </p>
+    <ul>
+      <li>
+        Slice and plot geo-gridded latitude-longitude,
+        latitude-vertical, longitude-vertical, or
+        time-latitude arrays from larger multidimensional variables.
+      </li>
+      <li>
+        Two arrays may be combined in one plot by differencing, summing, or averaging.
+      </li>
+      <li>
+        Lon-lat data may be plotted as global maps (using any of over 75
+        map projections) or as zonal average plots.
+      </li>
+      <li>
+        Overlay continent outlines or masks on lon-lat plots.
+      </li>
+      <li>
+        Use your favorite CPT, GGR, PAL, or ACT color table for scale colorbar.
+      </li>
+      <li>
+        Save plots to disk in GIF, JPEG, PNG or TIFF bitmap images or as
+        PDF or PostScript graphics files.
+      </li>
+      <li>
+        Export lon-lat map plots in KMZ format.
+      </li>
+      <li>
+        Export animations as AVI or MOV video or as a collection of
+        invididual frame images.
+      </li>
+      <li>
+        Explore remote THREDDS and OpenDAP catalogs and open datasets served from them.
+      </li>
+    </ul>
+    <p>
+      Panoply requires that your computer have a Java SE 6 runtime
+      environment, or better, installed.
+    </p>
+    <p>
+      Panoply is developed at the NASA Goddard Institute for Space Studies. Questions
+      and suggestions should be directed to <a
+      href="http://www.giss.nasa.gov/staff/rschmunk.html" >Dr. Robert
+      B. Schmunk</a>.
+    </p>
+    <p></p>
+    <h2><a id="Parallel-NetCDF" name="Parallel-NetCDF">Parallel-NetCDF</a></h2>
+    <p>
+      A group of researchers at Northwestern University and Argonne National
+      Laboratory (Jianwei Li, Wei-keng Liao, Alok Choudhary, Robert Ross, Rajeev
+      Thakur, William Gropp, and Rob Latham) have designed and implemented a new
+      <a href="http://www.mcs.anl.gov/parallel-netcdf/" > parallel interface for writing and reading netCDF data</a>, tailored for use on
+      high performance platforms with parallel I/O.  The implementation builds on
+      the MPI-IO interface, providing portability to most platforms in use and
+      allowing users to leverage the many optimizations built into MPI-IO
+      implementations.  Testing so far has been on Linux platforms with ROMIO and
+      IBM SP machines using IBM's MPI.
+    </p>
+    <p>
+      Documentation and code for Parallel-NetCDF is now available for
+      testing.
+      Although a few interfaces are not implemented yet, the current implementation
+      is complete enough to provide significant I/O performance improvements on
+      parallel platforms, as described in a <a
+      href="ftp://info.mcs.anl.gov/pub/tech_reports/reports/P1048.pdf"
+      >technical report</a>.   Users are invited to test Parallel-NetCDF
+      in their applications.
+    </p>
+    <p></p>
+
+    <h2><a id="Paraview" name="Paraview">Paraview and vtkCSCSNetCDF</a></h2>
+
+    <p>
+      <a href="http://www.paraview.org/">http://www.paraview.org/</a>
+
+    <p>
+      ParaView is an application designed with the need to visualize large
+      data sets in mind. The goals of the ParaView project include the
+      following:
+
+      <ul>
+        <li>
+          Develop an open-source, multi-platform visualization application.
+        <li>
+          Support distributed computation models to process large data sets.
+        <li>
+          Create an open, flexible, and intuitive user interface.
+        <li>
+          Develop an extensible architecture based on open standards.
+      </ul>
+
+    <p>
+      ParaView runs on distributed and shared memory parallel as well as
+      single processor systems and has been successfully tested on
+      Windows, Linux and various Unix workstations and clusters. Under the
+      hood, ParaView uses the Visualization Toolkit as the data processing
+      and rendering engine and has a user interface written using a unique
+      blend of Tcl/Tk and C++.
+
+    <p>
+      A vtk/ParaView reader for netCDF files can be found
+      <a href="http://www.paraview.org/Wiki/ParaView/Users_Guide/List_of_readers#NetCDF_Reader">here</a>.
+
+      <h2><a id="Perl" name="Perl">Perl interfaces</a></h2>
+      There are two netCDF interfaces for Perl:
+      <ul>
+        <li>
+          <a
+          href="http://search.cpan.org/~dhunt/PDL-NetCDF-4.05/netcdf.pd" > PDL::NetCDF</a>,
+          Doug Hunt's perl interface which uses the PDL (perl data language) extension.
+        </li>
+        <li>
+          <a href="/software/netcdf-perl/" >NetCDFPerl</a>, Steve Emmerson's
+          extension module, based on version 2 of the netCDF package. Uses perl lists
+          for representing netCDF variables.
+        </li>
+      </ul>
+    <p></p>
+    <h2><a id="PolyPaint+" name="PolyPaint+">PolyPaint+</a></h2>
     <a
-href="ftp://ftp.pmel.noaa.gov/eps/mexeps/examples/">example scripts</a> using
-    MexEPS</li>
-  <li><b>ASCII2MAT</b> mexFunction, which reads a formatted file into MATLAB as
-    a matrix</li>
-</ul>
-<p>The MexEPS package is freely available in PMEL's anonymous ftp directory
-  <a
-href="ftp://ftp.pmel.noaa.gov/eps/mexeps/">ftp://ftp.pmel.noaa.gov/eps/mexeps/</a></p>
-<p>If you have any questions or comments, please contact the author, Willa Zhu
-  <a
-href="mailto:willa at pmel.noaa.gov">(willa at pmel.noaa.gov)</a> or Nancy Soreide (nns at pmel.noaa.gov).</p>
-<p></p>
-<h2><a id="MEXNC" name="MEXNC">MEXNC and SNCTOOLS</a></h2>
-<p>
-John Evans of Rutgers University maintains MEXNC and developed SNCTOOLS.
- <a href="http://mexcdf.sourceforge.net/" >MEXNC</a> is a mexfile
-interface to NetCDF files for MATLAB that has roughly a one-to-one
-equivalence with the C API for netCDF.  <a
-href="http://mexcdf.sourceforge.net/tutorial/index.html"
->SNCTOOLS</a> is a set of
-higher-level m-files that sit atop MEXNC, shielding the user from
-such low level netCDF details as file IDs, variable IDs, and dimension
-IDs.  The general philosophy behind SNCTOOLS is providing the ability
-to read and write data without trying to invent a new syntax.
-</p>
-
-<p></p>
-<h2><a id="Mirone" name="Mirone">Mirone (Windows MATLAB-based display)</a></h2>
-
-<p>Joaquim Luis of Universidade do Algarve has developed
-<a href="http://w3.ualg.pt/~jluis/mirone/">Mirone</a>,
-a Windows MATLAB-based framework tool that
-allows the display and manipulation of a large number of grid/images
-formats through its interface with the <a
-href="http://remotesensing.org/gdal/" >GDAL</a> library. Its main
-purpose is to provide users with an easy-to-use graphical interface to
-manipulate   <a href="http://gmt.soest.hawaii.edu/" >GMT</a> grids. In
-addition it offers a wide range of tools
-dedicated to topics in the earth sciences, including tools for
-multibeam mission planning, elastic deformation studies, tsunami
-propagation modeling, earth magnetic field computations and magnetic
-Parker inversions, Euler rotations and poles computations, plate
-tectonic reconstructions, and seismicity and focal mechanism
-plotting. The high quality mapping and cartographic capabilities for
-which GMT is renowned is guaranteed through Mirone's ability to
-automatically generate GMT cshell scripts and dos batch files.
-</p>
-<p>
-Although Mirone is written in MATLAB, a stand-alone version to run
-under Windows is also provided. Regrettably this version is not as
-efficient as the native MATLAB code but provides a solution for users
-that don't have MATLAB.
-</p>
-<p>
-Also see <br>
-J. F. Luis. Mirone: A multi-purpose tool for exploring grid
-data. Computers & Geosciences, 33, 31-41, 2007.
-</p>
-<p></p>
-<h2><a id="ncBrowse" name="ncBrowse">ncBrowse</a></h2>
-<p>Donald Denbo of NOAA's Pacific Marine Environmental Laboratory has developed
-and made available <a
-href="http://www.epic.noaa.gov/java/ncBrowse">ncBrowse</a>, a Java application
-(JDK1.2) that provides flexible, interactive graphical displays of data and attributes
-from a wide range of netCDF data file conventions. Features include:
-</p>
-<ul>
-  <li>Designed to work with arbitrary netCDF files.</li>
-  <li>Browses file using the EPIC and COARDS conventions.</li>
-  <li>Provides a "tree" view of the netCDF file.</li>
-  <li>Handles character variables.</li>
-  <li>Handles dimensions without an associated variable.</li>
-  <li>Uses sgt graphics to perform 1 and 2 dimensional cuts through data.</li>
-  <li>Save to file single variable as a "cdl" text file.</li>
-  <li>InstallAnywhere scripts for UNIX, Win32, and MacOS.</li>
-  <li>Currently uses Java 2 and Swing.</li>
-</ul>
-<p>
-ncBrowse will run on any UNIX or Windows machine with a Java 2 (JDK1.2) virtual
-machine installed. Automated installation scripts are available for Windows and
-UNIX. Additional information on ncBrowse and download instructions are available
-at <a
-href="http://www.epic.noaa.gov/java/ncBrowse">http://www.epic.noaa.gov/java/ncBrowse</a>.
-</p>
-<p>Questions and suggestions should be directed to <<a
-href="mailto:dwd at pmel.noaa.gov">dwd at pmel.noaa.gov></a>. If you have problems
-  reading a netCDF file with ncBrowse, please send him a copy of the file and
-  he'll get ncBrowse to read it!</p>
-<p></p>
-<h2><a id="nccmp" name="nccmp">nccmp</a></h2>
-<p>
-Remik Ziemlinski of the NOAA Geophysical Fluid Dynamics Laboratory has
-developed <a href="http://nccmp.sourceforge.net/" >nccmp</a>,
-a tool to compare two netCDF files.
-It can use MPI, include/exclude specific
-variables or metadata and operates quickly.
-Highly recommended for regression testing with large datasets.
-See the Web site
-<a href="http://nccmp.sourceforge.net/"
->http://nccmp.sourceforge.net/</a> for more information.
-<p></p>
-<h2><a id="NCL" name="NCL">NCL</a></h2>
-<p>
-The <a href="http://www.ncl.ucar.edu/" >NCAR Command Language
-(NCL)</a> is an intepreted programming
-language for scientific data analysis and visualization developed and
-maintained in
-NCAR's <a href="http://www.cisl.ucar.edu/">Computational and Information Systems
-Laboratory</a>.
-</p>
-<p>
-NCL has many features common to modern programming languages,
-including types, variables, operators, expressions, conditional
-statements, loops, and functions and procedures.  NCL also has
-features that are not found in other programming languages, including
-those that handle the manipulation of metadata, the configuration of
-visualizations, the import of data from a variety of data formats, and
-an algebra that supports array operations.
-</p>
-<p>
-NCL has robust file input and output capabilities. It allows different
-datasets of different formats (netCDF, netCDF-4 classic, HDF4, HDF4-EOS,
-GRIB-1, and GRIB-2) to
-be imported into one uniform and consistent data manipulation
-environment, which internally is the netCDF data format.  NCL doesn't
-place any restrictions or conventions on the organization of input
-netCDF files.
-</p>
-<p>
-NCL comes with many useful built-in functions and procedures for
-processing and manipulating data. There are over 600 functions and
-procedures that include routines for use specifically with climate and
-model data, empirical orthogonal functions, Fourier
-coefficients, wavelets, singular value decomposition, 1-, 2-, and
-3-dimensional interpolation, approximation, and regridding, and
-computer analysis of scalar and vector global geophysical quantities.
-</p>
-<p>
-The visualizations are publication-quality and highly customizable,
-with hundreds of options available for tweaking the looks of your
-graphics. NCL can generate contours, XY plots, vectors, streamlines,
-and can overlay these plots on many different map projections.  There
-are also specialized functions for generating histograms, wind roses,
-meteograms, skew-T plots, weather maps.
-</p>
-<p>Included with the software are two command line tools:
-"ncl_convert2nc" for converting GRIB-1/2 or HDF files to netCDF
-files, and "ncl_filedump" which will dump the contents of a file
-format that NCL recognizes (netCDF, GRIB-1/2, HDF, etc).</p>
-<p>
-NCL is available under an open source license or in binary form for
-several popular UNIX platforms, including (but not limited to) Linux,
-MacOSX, and Windows/Cygwin.
-</p>
-<p>
-Documentation and additional information on NCL are available from the
-<a href="http://www.ncl.ucar.edu/">NCL website</a>, which contains
-hundreds of <a
-href="http://www.ncl.ucar.edu/Applications/">application examples</a>
-for one to download. You can also contact Mary Haley, at <a
-href="mailto:haley at ucar.edu">haley at ucar.edu</a> for more information.
-
-<p></p>
-<h2><a id="NCO" name="NCO">NCO</a></h2>
-<a href="http://nco.sourceforge.net">NCO</a> (netCDF operators) is a package of
-command line operators that work on generic netCDF or HDF4 files:
-<ul>
-  <li>ncap2 - arithmetic processor</li>
-  <li>ncatted - attribute editor</li>
-  <li>ncbo - binary operator</li>
-  <li>ncdiff - differencer</li>
-  <li>ncea - ensemble averager</li>
-  <li>ncecat - ensemble concatenator</li>
-  <li>ncflint - file interpolator</li>
-  <li>ncks - kitchen sink (extract, cut, paste, print data)</li>
-  <li>ncpdq - permute dimensions quickly</li>
-  <li>ncra - running averager</li>
-  <li>ncrcat - record concatenator</li>
-  <li>ncrename - renamer</li>
-  <li>ncwa - weighted averager</li>
-</ul>
-
-<p>All operators may now be <a href="http://www.opendap.org">OPeNDAP</a> clients. OPeNDAP enables
-  network transparent data access to any OPeNDAP server. Thus OPeNDAP-enabled NCO can
-  operate on remote files accessible through any OPeNDAP server without transferring
-  the files. Only the required data (e.g., the variable or hyperslab specified)
-  are transferred.</p>
-<p>The source code is freely available from the <a
-href="http://nco.sourceforge.net/">NCO home page</a>, as is the NCO User's
-  Guide.</p>
-<p>For more information, contact the author, Charlie Zender.</p>
-<p></p>
-<h2><a id="ncregrid" name="ncregrid">ncregrid</a></h2>
-<p> Patrick Jöckel of the Max Planck Institute for Chemistry has developed <strong>ncregrid</strong>,
-  a tool (written in FORTRAN-90) for data transfer of gridded 2- and 3-dimensional
-  (spatial) geophysical/geochemical scalar fields between grids of different resolutions.
-  The algorithm handles data on rectangular latitude/longitude grids (not necessarily
-  evenly spaced) and vertical pressure hybrid grids of arbitrary resolution. The
-  input/output data format is netCDF. ncregrid is freely available without any
-  warranty under the GNU public license (GPL). ncregrid can be used as a "stand-alone"
-  program, and/or linked as an interface to a model, in order to re-grid automatically
-  the input from an arbitrary grid space onto the required grid resolution. </p>
-<p> More information is available on the web-page: <a href="http://www.mpch-mainz.mpg.de/~joeckel/ncregrid/index.html" >
-  http://www.mpch-mainz.mpg.de/~joeckel/ncregrid/index.html</a>. </p>
-<p></p>
-
-<h2><a id="nctoolbox" name="nctoolbox">nctoolbox (a MATLAB common data model interface)</a></h2>
-
-<p><a
-href="http://nctoolbox.github.io/nctoolbox/" >nctoolbox</a> is a MATLAB
-interface that provides read-only access to <a
-href="/software/netcdf-java/CDM/index.html" >Common Data Model</a>
-datasets.
-Under the hood, nctoolbox uses Unidata's NetCDF-Java as the data access layer.
-This allows nctoolbox to access to netCDF, OPeNDAP, HDF5, GRIB, GRIB2, HDF4,
-and many (15+) other file formats and services using the same API.
-It works with MATLAB 2008a and later.  The nctoolbox software was
-developed by Brian Schlining (MBARI), Rich Signell
-(USGS), Sachin Kumar Bhate (freelance), and Alex Crosby (RPS/ASA).</p>
-
-<p></p>
-
-<h2><a id="ncdx" name="ncdx">ncdx</a></h2>
-<p> Patrick Jöckel of the Max Planck Institute for Chemistry has developed <strong>ncdx</strong>,
-  a tool (written in FORTRAN-90) that scans a netCDF file and makes it <a href="#OpenDX" >OpenDX</a>
-  compliant. ncdx is freely available without any warranty under the GNU public
-  license (GPL). More information is available on the web-page: <a href="http://www.mpch-mainz.mpg.de/~joeckel/ncdx/index.html" >
-  http://www.mpch-mainz.mpg.de/~joeckel/ncdx/index.html</a>. </p>
-<p></p>
-
-<h2><a id="ncensemble" name="ncensemble">ncensemble</a></h2>
-<p> Alan Iwi, of Rutherford Appleton Laboratory, offers this command
-  line ensemble statistics utility. More information is available on
-  the web-page: <a href="http://home.badc.rl.ac.uk/iwi/ncensemble/" >
-  http://home.badc.rl.ac.uk/iwi/ncensemble/</a>. </p>
-<p></p>
-
-<h2><a id="ncview" name="ncview">ncview</a></h2>
-<a
-href="http://meteora.ucsd.edu/~pierce/ncview_home_page.html">Ncview</a> is a visual
-browser for netCDF files. Typically you would use ncview to get a quick and easy,
-push-button look at your netCDF files. You can view simple movies of the data,
-view along various dimensions, take a look at the actual data values, change color
-maps, invert the data, etc. It runs on UNIX platforms under X11, R4 or higher.
-For more information, check out the <a
-href="http://meteora.ucsd.edu/~pierce/docs/ncview.README">README</a> file; you
-can also see a representative <a
-href="http://meteora.ucsd.edu/~pierce/docs/ncview.gif">screen image</a> (GIF,
-66K) of ncview in action.
-<p>The source may be downloaded from <a
-href="ftp://cirrus.ucsd.edu/pub/ncview/">ftp://cirrus.ucsd.edu/pub/ncview/</a>.
-  For more information, please contact the author, David W. Pierce at <a href="mailto:dpierce at ucsd.edu">dpierce at ucsd.edu</a>.</p>
-
-<h2><a id="NC4ML5" name="NC4ML5">NetCDF Toolbox for MATLAB-5</a></h2>
-The <a
-href="http://mexcdf.sourceforge.net/">NetCDF Toolbox for
-MATLAB-5</a>, originally developed by Charles R. Denham, combined netCDF-3 with <a
-href="http://www.mathworks.com/products/matlab/">MATLAB</a> to form an interface that
-used MATLAB operator-syntax for arithmetic, logical, and subscripting operations
-on netCDF entities.  The NetCDF Toolbox is in bug-fix-only mode, and is
-  maintained by John.G.Evans.NE at gmail.com,
-  on the <a href="http://mexcdf.sf.net" > MEXNC, SNCTOOLS, and the
-  NetCDF Toolbox</a> web page.
-</p>
-<p></p>
-
-<h2><a id="ncvtk" name="ncvtk">ncvtk</a></h2>
-
-<p>
-<a href="http://ncvtk.sourceforge.net/" >Ncvtk</a> is a program for
-exploring planetary data stored in a NetCDF file.
-The NetCDF file  should loosely follow the <a
-href="http://www.cgd.ucar.edu/cms/eaton/cf-metadata/" >CF metadata
-conventions</a>.
-</p>
-<p>
-Ncvtk was designed from the ground up with the aim of offering a high
-degree of interactivity to scientists who have a need to explore
-structured, three-dimensional, time-dependent climate data on the
-sphere. A graphical user interface allows users to interact with their
-data via color/transparency/contour/vector plots, apply vertical slices,
-probe data, apply an external sun light, overlay hydrographic and
-geopolitical data, rotate, zoom, etc. with minimal fuss.
-</p>
-<p>
-Ncvtk is written in python and is based on the <a
-href="http://public.kitware.com/VTK/" >Visualization Toolkit
-(VTK)</a>. Like python and VTK, Ncvtk is
-highly portable and known to run on Windows and Linux (i386, ia64,
-EMT64) platforms. More information about Ncvtk is available at <a
-href="http://ncvtk.sourceforge.net"
->http://ncvtk.sourceforge.net</a>.
-</p>
-
-<p></p>
-
-<h2><a id="netcdf_tools" name="netcdf_tools">Ivan Shmakov's netcdf tools</a></h2>
-
-<p>
-The NetCDF tools is a free software package consisting of a few
-tools operating on NetCDF and, by utilizing the compatibility API,
-HDF4 files, which are intended to be usable from Shell scripts.
-</p>
-<p>
-The currently packaged tools are:
-</p>
-<ul>
-  <li>a couple of simple shell wrappers over the respective NetCDF
-  functions (ncattget and ncattput);
-  </li>
-  <li>a more sophisticated ncget tool.</li>
-</ul>
-<p>
-The ncget tool implements functionalilty that is similar to hdp
-dumpsds (for NetCDF, which lacks such a tool), or complements it in
-the case of HDF4. It can be seen as a complement to the ncdump tool
-(included in both the NetCDF and HDF4 distributions) as well.
-</p>
-<p>
-This tool allows a selected part of a NetCDF variable or an HDF4
-scientific data set (SDS) to be extracted in either an ASCII or
-binary form, applying the transformation specified by the usual
-scale_factor and add_offset attributes. It allows one to feed the
-data contained in NetCDF variables (or HDF4 SDS) to the tools
-designed to operate on either ASCII (text) or raw (binary) data.
-</p>
-<p>
-This version of the package is the first one to be announced to the
-public. It has some known bugs and limitations, but it's proved to
-be quite usable.  A <a
-href="http://freshmeat.net/projects/netcdf-tools" >project page</a> on
-freshmeat.net.  The <a
-href="http://waterlily.siamics.net/~ivan/src/netcdf-tools-0.1-rc1.tar.gz"
->source</a> is also available.
-</p>
-
-<h2><a id="netcdf4excel" name="netcdf4excel">netcdf4excel (add-in for MS Excel)</a></h2>
-<p>
-Alexander Bruhns <bruhns at free.fr> has developed <a
-href="http://code.google.com/p/netcdf4excel/" >a netCDF add-in written in
-Visual Basic for MS Excel</a>.  This add-in simplifies the use of
-NetCDF data in Excel, providing a ready to use solution for
-manipulating this type of data.
-</p>
-<p>
-For developers, the open-source (GPL V3 license) can be downloaded
-directly or checked out with Mercurial.
-</p>
-<p>
-The add-in is written in VBA 6.0 (so it won't work with Office 2010 64 bits) and is designed for Excel 2007 running with the Microsoft Windows operating system.
-It supports opening netCDF classic format data with Excel for read or
-write access.
-</p>
-<p>More details are available on the <a
-href="http://code.google.com/p/netcdf4excel/" >netcdf4excel web
-site</a>.</p>
-<p>
-</p>
-
-<h2><a id="netcdf95" name="netcdf95">NetCDF95 alternative Fortran API</a></h2>
-
-<p> Lionel Guez has developed and made feely available <a
-href="http://web.lmd.jussieu.fr/~lglmd/NetCDF95" >NetCDF95</a>, a new
-alternative Fortran interface to the NetCDF library.  Compared to the
-Unidata-provided Fortran 90 netCDF interface, the NetCDF95 interface
-is meant to be easier to use and more secure.
-</p>
-
-<h2><a id="WCT" name="WCT">NOAA Weather and Climate Toolkit (WCT)</a></h2>
-<p>The NOAA Weather and Climate Toolkit (WCT) is built on the netCDF-for-Java API,
-  and can read NetCDF-3 and 4.  It is available from <a href="http://www.ncdc.noaa.gov/wct/">http://www.ncdc.noaa.gov/wct/</a>.
-
-<h2><a id="Objective-C" name="Objective-C">Objective-C API</a></h2>
-
-<p>Tom Moore has an Objective-C API, available here:
-<a href="http://www.paleoterra.com/software" >www.paleoterra.com/software</a>.
-
-The netCDF Framework is an open source (Argonne Open Source License)
-MacOSX application framework that provides an Objective-C interface
-to the NCAR netCDF library version 3.  The framework is available
-both as source code and universal compiles (works on both PPC and
-Intel macs).  The source code has also been compiled by users for the
-GNUStep environment.   Version 2 of the framework will provide
-classes for accessing multiple netCDF files, working with in-memory
-data slabs using standard notation, and some support for
-multithreading.
-
-
-<h3>Mark Tracy's Objective-C API</h3>
-
-<p>Mark Tracy has written <a href="http://www.mt-se.com/nc_1.html"
->NetcdfStep</a>, an Objective-C
-API for netCDF that uses Objective-C Foundation Classes.
-
-<p>
-NetcdfStep is framework for using the netCDF library in
-object-oriented programming with Objective-C. It now
-supports the full functionality of netCDF 3.6.2.
-</p>
-<p>
-A <a
-href="http://www.mt-se.com/pub/NetcdfStep-1.0.2.zip" >
-complete Mac OS X distribution</a> including pre-built static library and <a
-href="http://www.mt-se.com/netcdfstep_doc/" >online documentation</a>
-are available.  Applications linked to this framework have no external
-dependencies (other than Mac OS X itself).
-A <a href="http://www.mt-se.com/pub/NetcdfStep-GNUstep-0.6.1.tar.gz" >
-source-code only distribution</a> synced up to version 0.6.1 is
-available for GNUstep for use on
-Linux and other Unix platforms.
-</p>
-
-<p></p>
-<h2><a id="NCMEX" name="NCMEX">Octave interface</a></h2>
-
-<p>
-The ARM Program has contributed NCMEX for Octave, a port of Chuck
-Denham's MATLAB NCMEX to <a href="http://www.octave.org" >Octave</a>.  The
-calling syntax
-is identical, so scripts using NCMEX in MATLAB should in theory be
-portable to Octave.  In order to build NCMEX, a compiled C NetCDF
-library must already be installed.
-</p>
-<p>
-In addition to the base NetCDF library interface, this package includes a
-simple toolbox to automate the reading and writing of NetCDf files
-within Octave using NCMEX.  These tools as well as the source for
-NCMEX are available from <a
-href="http://engineering.arm.gov/~sbeus/octavex/octavex.tar" >
-http://engineering.arm.gov/~sbeus/octavex/octavex.tar</a>
-(NOTE: this .tar file contains other
-Octave extension functions besides NCMEX.)
-</p>
-<p>
-Also see <a href="http://ocgmod1.marine.usf.edu/octcdf/" >Octcdf</a>,
-a netCDF toolbox for Octave.
-</p>
-<p>
-For installation instructions, see the README file inside the .tar file.
-</p>
-
-<p></p>
-
-<h2><a id="Octave" name="Octave">Octave interface (Barth)</a></h2>
-
-<p>Alexander Barth has contributed the following:</p>
-<p>
-Octcdf is a netCDF toolbox for <a
-href="http://www.octave.org/">Octave</a> which uses the same operator
-syntax as the <a
-href="http://mexcdf.sourceforge.net/netcdf_toolbox.html">matlab netCDF
-toolbox</a> of Charles R. Denham. NetCDF dimensions, attributes and
-variables are Octave objects and can be accessed, sliced and changed
-just as regular variables. Unlike most netCDF toolboxes for matlab, it
-does not depend on the NCMEX wrapper around the netCDF interface. This
-octave toolbox is written in C++ calling directly the netCDF library.
-The octcdf toolbox can also be used to download data from an OpenDAP
-server. The octcdf source code is available at <a
-href="http://modb.oce.ulg.ac.be/mediawiki/index.php/NetCDF_toolbox_for_Octave">
-http://modb.oce.ulg.ac.be/mediawiki/index.php/NetCDF_toolbox_for_Octave</a>.
-It was also included in the Octave Repository <a
-href="http://octave.sourceforge.net/">octave-forge</a>.
-</p>
-
-<p></p>
-
-<h2><a id="OPeNDAP" name="OPeNDAP">OPeNDAP (formerly DODS)</a></h2>
-
-<p>The <a href="http://opendap.org/">OPeNDAP</a> (formerly known as
-DODS) is an Open-source Project for a Network Data Access Protocol
-that makes local data and subsets of local data accessible to remote
-locations independent of the local storage format. OPeNDAP also
-provides tools for transforming existing applications into OPeNDAP
-clients, enabling them to remotely access OPeNDAP served data.
-OPeNDAP is based on existing data access tools; rather than developing
-a self contained system, it makes extensive use of existing data
-access APIs. </p>
-
-<p>OPeNDAP can be used to make netCDF data files available over the
-Internet and it can also be used to adapt existing software which use
-the netCDF API (by re-linking) to read data served by an OPeNDAP data
-server. In principle, any program written using netCDF can be adapted
-to read data from an OPeNDAP server - in other words any program
-which uses netCDF can become a client in the OPeNDAP client-server
-system. Included in the source and binary distributions are two freely
-available programs that have already been modified (re-linked).</p>
-
-<p>With a client program accessing data from a netCDF server, it is
-possible to access a small subset of a large dataset over the Internet
-without copying the entire dataset (as you would have to do with FTP
-or AFS). The client can see changes to the netCDF dataset, e.g. when
-new records are added (which would not be possible with FTP). Finally,
-the client can also access cross-sections of variable data without
-paging large amounts of data across the network (as you would have to
-do with NFS, for example).</p>
-
-<p>OPeNDAP software is freely available in both
-source form or binary form for selected platforms.</p>
-
-<p></p>
-
-<h2><a id="OpenDX" name="OpenDX">OpenDX</a></h2>
-<a href="http://www.opendx.org/about.html">OpenDX</a> (formerly IBM Data Explorer,
-also known as simply DX) is a general-purpose software package for data visualization
-and analysis. It employs a data-flow driven client-server execution model and
-provides a graphical program editor that allows the user to create a visualization
-using a point and click interface.
-<p>DX runs on 7 major UNIX platforms as well as Windows 95/NT and is designed
-  to take full advantage of multi-processor systems from IBM, SGI and Sun.</p>
-<p>DX is built upon an internal data model, which describes and provides uniform
-  access services for any data brought into, generated by, or exported from the
-  software. This data model supports a number of different classes of scientific
-  data, which can be described by their shape (size and number of dimensions),
-  rank (e.g., scalar, vector, tensor), type (float, integer, byte, etc. or real,
-  complex, quaternion), where the data are located in space (positions), how the
-  locations are related to each other (connections), aggregates or groups (e.g.,
-  hierarchies, series, composites, multizone grids, etc.). It also supports those
-  entities required for graphics and imaging operations within the context of
-  Data Explorer. Regular and irregular, deformed or curvilinear, structured and
-  unstructured data as well as "missing" or invalid data are supported.</p>
-<p>The details of the data model are hidden at the user level. As a result DX
-  operations or modules are polymorphic and appear typeless. The DX Import module,
-  which reads data for use within Data Explorer directly utilizes data in netCDF
-  as well as other formats (e.g., HDF, CDF). One or more variables may be selected
-  as well as step(s) of a time series. Data in conventional netCDFs are directly
-  imported. Since the DX data model is more comprehensive than the netCDF data
-  model, a methodology to extend netCDF via attribute conventions (e.g., for unstructured
-  meshes, non-scalar data and hierarchies) for use with Data Explorer is available.</p>
-<p>DX supports a number of realization techniques for generating renderable geometry
-  from data. These include color and opacity mapping (e.g., for surface and volume
-  rendering), contours and isosurfaces, histograms, two-dimensional and three-dimensional
-  plotting, surface deformation, etc. for scalar data. For vector data, arrow
-  plots, streamlines, streaklines, etc. are provided. Realizations may be annotated
-  with ribbons, tubes, axes, glyphs, text and display of data locations, meshes
-  and boundaries. Data probing, picking, arbitrary surface and volume sampling,
-  and arbitrary cutting/mapping planes are supported.</p>
-<p>DX supports a number of non-graphical functions such as point-wise mathematical
-  expressions (e.g., arithmetic, transcendental, boolean, type conversion, etc.),
-  univariate statistics and image processing (e.g., transformation, filter, warp,
-  edge detection, convolution, equalization, blending, morphological operations,
-  etc.). Field/vector operations such as divergence, gradient and curl, dot and
-  cross products, etc. are provided. Non-gridded or scattered data may be interpolated
-  to an arbitrary grid or triangulated, depending on the analysis requirements.
-  The length, area or volume of various geometries may also be computed. Tools
-  for data manipulation such as removal of data points, subsetting by position,
-  sub/supersampling, grid construction, mapping, interpolation, regridding, transposition,
-  etc. are available.</p>
-<p>Tools for doing cartographic projections and registration as well as earth,
-  space and environmental sciences examples are available at Cornell University
-  via info.tc.cornell.edu. Also see the <a href="#ncdx" >ncdx</a> tool for making
-  netCDF files OpenDX compliant. </p>
-<p></p>
-<h2><a id="Panoply" name="Panoply">Panoply</a></h2>
-<p> <a href="http://www.giss.nasa.gov/tools/panoply/" >Panoply</a>
-is an application that plots geo-gridded and other arrays from netCDF,
-HDF, GRIB, and other datasets. Features include:
-</p>
-<ul>
-  <li>Slice and plot geo-gridded latitude-longitude,
-  latitude-vertical, longitude-vertical, or
-  time-latitude arrays from larger multidimensional variables.</li>
-  <li>Two arrays may be combined in one plot by differencing, summing, or averaging.</li>
-  <li>Lon-lat data may be plotted as global maps (using any of over 75
-  map projections) or as zonal average plots.</li>
-  <li>Overlay continent outlines or masks on lon-lat plots.</li>
-  <li>Use your favorite CPT, GGR, PAL, or ACT color table for scale colorbar.</li>
-  <li>Save plots to disk in GIF, JPEG, PNG or TIFF bitmap images or as
-  PDF or PostScript graphics files.</li>
-  <li>Export lon-lat map plots in KMZ format.</li>
-  <li>Export animations as AVI or MOV video or as a collection of
-  invididual frame images.</li>
-  <li>Explore remote THREDDS and OpenDAP catalogs and open datasets served from them.</li>
-</ul>
-<p>
-Panoply requires that your computer have a Java SE 6 runtime
-environment, or better, installed.
-</p>
-<p>
-Panoply is developed at the NASA Goddard Institute for Space Studies. Questions
-and suggestions should be directed to <a
-href="http://www.giss.nasa.gov/staff/rschmunk.html" >Dr. Robert
-B. Schmunk</a>.
-</p>
-<p></p>
-<h2><a id="Parallel-NetCDF" name="Parallel-NetCDF">Parallel-NetCDF</a></h2>
-<p>
-A group of researchers at Northwestern University and Argonne National
-Laboratory (Jianwei Li, Wei-keng Liao, Alok Choudhary, Robert Ross, Rajeev
-Thakur, William Gropp, and Rob Latham) have designed and implemented a new
-<a href="http://www.mcs.anl.gov/parallel-netcdf/" >
-parallel interface for writing and reading netCDF data</a>, tailored for use on
-high performance platforms with parallel I/O.  The implementation builds on
-the MPI-IO interface, providing portability to most platforms in use and
-allowing users to leverage the many optimizations built into MPI-IO
-implementations.  Testing so far has been on Linux platforms with ROMIO and
-IBM SP machines using IBM's MPI.
-</p>
-<p>
-Documentation and code for Parallel-NetCDF is now available for
-testing.
-Although a few interfaces are not implemented yet, the current implementation
-is complete enough to provide significant I/O performance improvements on
-parallel platforms, as described in a <a
-href="ftp://info.mcs.anl.gov/pub/tech_reports/reports/P1048.pdf"
->technical report</a>.   Users are invited to test Parallel-NetCDF
-in their applications.
-</p>
-<p></p>
-
-<h2><a id="Paraview" name="Paraview">Paraview and vtkCSCSNetCDF</a></h2>
-
-<p><a href="http://www.paraview.org/">http://www.paraview.org/</a>
-
-<p>ParaView is an application designed with the need to visualize large
-data sets in mind. The goals of the ParaView project include the
-following:
-
-<ul>
-<li>Develop an open-source, multi-platform visualization application.
-<li>Support distributed computation models to process large data sets.
-<li>Create an open, flexible, and intuitive user interface.
-<li>Develop an extensible architecture based on open standards.
-</ul>
-
-<p>ParaView runs on distributed and shared memory parallel as well as
-single processor systems and has been successfully tested on
-Windows, Linux and various Unix workstations and clusters. Under the
-hood, ParaView uses the Visualization Toolkit as the data processing
-and rendering engine and has a user interface written using a unique
-blend of Tcl/Tk and C++.
-
-<p>A vtk/ParaView reader for netCDF files can be found <a
-http://www.paraview.org/Wiki/ParaView/Users_Guide/List_of_readers#NetCDF_Reader">here</a>.
-
-<h2><a id="Perl" name="Perl">Perl interfaces</a></h2>
-There are two netCDF interfaces for Perl:
-<ul>
-  <li> <a
-    href="http://search.cpan.org/~dhunt/PDL-NetCDF-4.05/netcdf.pd" > PDL::NetCDF</a>,
-    Doug Hunt's perl interface which uses the PDL (perl data language) extension.
-  </li>
-  <li> <a href="/software/netcdf-perl/" >NetCDFPerl</a>, Steve Emmerson's
-    extension module, based on version 2 of the netCDF package. Uses perl lists
-    for representing netCDF variables. </li>
-</ul>
-<p></p>
-<h2><a id="PolyPaint+" name="PolyPaint+">PolyPaint+</a></h2>
-<a
-href="http://lasp.colorado.edu/polypaint/home.html">PolyPaint+</a> is an interactive
-scientific visualization tool that displays complex structures within three-dimensional
-data fields. It provides both color shaded-surface display and simple volumetric
-rendering in either index or true color. For shaded surface rendering, the PolyPaint+
-routines first compute the polygon set that describes a desired surface within
-the 3D data volume. These polygons are then rendered as continuously shaded surfaces.
-PolyPaint+ contains a wide variety of options that control lighting, viewing,
-and shading. Objects rendered volumetrically may be viewed along with shaded surfaces.
-Additional data sets can be overlaid on shaded surfaces by color coding the data
-according to a specified color ramp. 3D visualizations can be viewed in stereo
-for added depth perspective.
-<p>Currently supported 3D visualizations are the following:</p>
-<ul>
-  <li>Shaded isosurface</li>
-  <li>Transparent contour shells or isosurfaces at varying levels</li>
-  <li>Volumetric or density plot</li>
-  <li>Planes</li>
-  <li>Contour ribbons</li>
-  <li>Topographic surface from 2D geographic data sets</li>
-</ul>
-<p>3D data volumes may be sliced in the X, Y, or Z plane using an interactive
-  cutting plane. A cross section of the data volume can be viewed in a 2D window
-  as a 2D contour plot, a vector plot, a raster image or a combination of these
-  options superimposed. Map outlines can be used as a background for 2D cross
-  section plots of geographic data. All data is projected according to the coordinates
-  specified by the user for the cross section window.</p>
-<p>The user interface provides direct manipulation tools for specifying the eye
-  position, center of view, light sources, and color ramps. Subsetting of data
-  can be done easily by selecting the data by index or geographic coordinate.
-  On-line contextual help provides easy access to more detail about the software.
-  Tutorials which range from very simple visualizations to complex combinations
-  of data sets provide the user with a quick learning tool.</p>
-<p>Currently PolyPaint+ accepts only data which is in the NetCDF file format.
-  A file conversion utility which converts from raw binary data to netCDf is a
-  part of the application.</p>
-<p>PolyPaint+ is a joint effort of the University of Colorado and NCAR (National
-  Center for Atmospheric Research) funded by the NASA AISRP program. A beta version
-  of PolyPaint+ is currently available free of charge using FTP or for a nominal
-  fee which would cover tape distribution. A license agreement must be signed
-  in order to use it.</p>
-<p>You may order by...</p>
-<ul>
-  <li>TELEPHONE : 303-492-7289 (Margi Klemp) : 303-497-8159 (Bill Boyd)</li>
-  <li>U.S. MAIL :
+    href="http://lasp.colorado.edu/polypaint/home.html">PolyPaint+</a> is an interactive
+    scientific visualization tool that displays complex structures within three-dimensional
+    data fields. It provides both color shaded-surface display and simple volumetric
+    rendering in either index or true color. For shaded surface rendering, the PolyPaint+
+    routines first compute the polygon set that describes a desired surface within
+    the 3D data volume. These polygons are then rendered as continuously shaded surfaces.
+    PolyPaint+ contains a wide variety of options that control lighting, viewing,
+    and shading. Objects rendered volumetrically may be viewed along with shaded surfaces.
+    Additional data sets can be overlaid on shaded surfaces by color coding the data
+    according to a specified color ramp. 3D visualizations can be viewed in stereo
+    for added depth perspective.
+    <p>
+      Currently supported 3D visualizations are the following:
+    </p>
+    <ul>
+      <li>
+        Shaded isosurface
+      </li>
+      <li>
+        Transparent contour shells or isosurfaces at varying levels
+      </li>
+      <li>
+        Volumetric or density plot
+      </li>
+      <li>
+        Planes
+      </li>
+      <li>
+        Contour ribbons
+      </li>
+      <li>
+        Topographic surface from 2D geographic data sets
+      </li>
+    </ul>
+    <p>
+      3D data volumes may be sliced in the X, Y, or Z plane using an interactive
+      cutting plane. A cross section of the data volume can be viewed in a 2D window
+      as a 2D contour plot, a vector plot, a raster image or a combination of these
+      options superimposed. Map outlines can be used as a background for 2D cross
+      section plots of geographic data. All data is projected according to the coordinates
+      specified by the user for the cross section window.
+    </p>
+    <p>
+      The user interface provides direct manipulation tools for specifying the eye
+      position, center of view, light sources, and color ramps. Subsetting of data
+      can be done easily by selecting the data by index or geographic coordinate.
+      On-line contextual help provides easy access to more detail about the software.
+      Tutorials which range from very simple visualizations to complex combinations
+      of data sets provide the user with a quick learning tool.
+    </p>
+    <p>
+      Currently PolyPaint+ accepts only data which is in the NetCDF file format.
+      A file conversion utility which converts from raw binary data to netCDf is a
+      part of the application.
+    </p>
+    <p>
+      PolyPaint+ is a joint effort of the University of Colorado and NCAR (National
+      Center for Atmospheric Research) funded by the NASA AISRP program. A beta version
+      of PolyPaint+ is currently available free of charge using FTP or for a nominal
+      fee which would cover tape distribution. A license agreement must be signed
+      in order to use it.
+    </p>
+    <p>
+      You may order by...
+    </p>
+    <ul>
+      <li>
+        TELEPHONE : 303-492-7289 (Margi Klemp) : 303-497-8159 (Bill Boyd)
+      </li>
+      <li>
+        U.S. MAIL :         <pre>
+      Margi Klemp
+      University of Colorado / LASP
+      1234 Innovation Dr.
+      Boulder, CO 80303
+      USA
+
+      </pre>
+      </li>
+      <li>
+        E-MAIL : margi at aries.colorado.edu
+      </li>
+    </ul>
+    <p></p>
+    <h2><a id="pomegranate" name="pomegranate">Pomegranate</a></h2>
+    <p>
+      The P9E Team at
+      NASA JPL has developed <a href="http://pomegranate.jpl.nasa.gov/"
+      >Pomegranate</a>, a python application that "webifies" science data files.
+      Supported formats include netCDF, HDF4, HDF5, GRIB and FITS.
+    </p>
+    <p>
+      Pomegranate can be installed on web servers as either a WSGI or CGI application
+      to provide webification (w10n) services. To learn more about w10n of
+      science data files, please visit
+      <a href="http://webification.org/">http://webification.org/</a>.
+      A brief <a href="http://pomegranate.jpl.nasa.gov/test/help.txt"
+      >help</a> document describes how to use the <a
+      href="http://pomegranate.jpl.nasa.gov/test" >demo directory</a> to
+      browse or download metadata or data in netCDF, JSON, or other
+      formats by clicking on data folder and document icons.
+    </p>
+    <p>
+      Pomegranate can also be used as a standalone library or command line application.
+      This greatly simplifies the retrieval of metadata and data
+      from files in supported formats.
+    </p>
+    <p>
+      Pomegranate is open source software and can be downloaded from
+      <a href="http://www.openchannelsoftware.com/projects/Pomegranate/" > http://www.openchannelsoftware.com/projects/Pomegranate/</a>.
+    </p>
+
+    <h2><a id="PyNGL" name="PyNGL">PyNGL and PyNIO</a></h2>
+    <p>
+      NCAR's Computational and Information Systems Laboratory has developed
+      <a href="http://www.pyngl.ucar.edu/" >PyNGL</a>, a python package for
+      scientific visualization and data analysis and <a
+      href="http://www.pyngl.ucar.edu/Nio.shtml" >PyNIO</a>, a Python
+      package supporting access to a variety of data formats using an
+      interface modelled on netCDF.
+    </p>
+    <p></p>
+
+    <h2><a id="Python" name="Python">Python interfaces</a></h2>
+    <p>
+      Python is an interpreted, object-oriented language that is supported on a wide
+      range of hardware and operating systems. Python information and sources can be
+      obtained from <a
+      href="http://www.python.org/">http://www.python.org/</a>. There are now
+      several netCDF interfaces for Python.
+    </p>
+    <p>
+      Jeff Whitaker of the NOAA Earth System Research Lab has developed a
+      netCDF-4 module for python:
+      <a
+      href="http://code.google.com/p/netcdf4-python/"> http://code.google.com/p/netcdf4-python/</a>.  Most new features of
+      netCDF-4 are implemented, such as multiple unlimited dimensions,
+      groups and zlib data compression. All the new numeric data types (such
+      as 64-bit and unsigned integer types) are implemented. Compound and
+      variable length (vlen) data types are supported, but the enum and
+      opaque data types are not. Mixtures of compound and vlen data types
+      (compound types containing vlens, and vlens containing compound types)
+      are not supported.
+    </p>
+    <p>
+      <a href="#xray" >xray</a> is a higher-level interface that uses
+      netcdf4-python internally to implement a pandas-like package for N-D
+      labelled arrays for scientific data.
+    </p>
+    <p>
+      André Gosselin of the Institut Maurice-Lamontagne, Péches & Océans Canada,
+      has implemented pycdf, a new Python interface to the netCDF library.  It
+      is available from <a href="http://pysclint.sourceforge.net/pycdf/"
+      >http://pysclint.sourceforge.net/pycdf/</a>, where you will find the install
+      files, installation instructions, extensive documentation in text and html
+      format, and examples. pycdf requires the Numeric python package, and
+      installs through the simple "python setyp.py install" command.
+    </p>
+    <p>
+      Bill Noon (noon at snow.cit.cornell.edu) has implemented another netCDF Python
+      module that allows easy creation, access, and browsing of netCDF data. The bindings
+      also use the <a
+      href="/software/udunits/">udunits library</a> to do unit conversions.
+      More information and source for Noon's Python netCDF module are available
+      from <a
+      href="http://snow.cit.cornell.edu/noon/ncmodule.html">http://snow.cit.cornell.edu/noon/ncmodule.html</a>.
+    </p>
+
+    <p>
+      The package from Konrad Hinsen has been integrated into his <a
+      href="https://sourcesup.cru.fr/projects/scientific-py/">ScientificPython</a>
+      package.
+    </p>
+
+    <p>
+      Dave Brown of NCAR's Computational and Information Systems Laboratory has developed <a
+      href="http://www.pyngl.ucar.edu/Nio.shtml" >PyNIO</a>, a Python
+      package that allows read and/or write access to a variety of data
+      formats using an interface modelled on netCDF.  Currently supported
+      formats include netCDF, HDF4, GRIB1 and GRIB2 (read only), and HDF-EOS
+      2 Grid and Swath data (read only).
+    </p>
+
+    <p>
+      Vicente Galiano of Miguel Hernandez University has developed a Python interface to
+      PnetCDF. This Python's package called "PyPnetCDF" allows access to NetCDF files using MPI and
+      the library pnetCDF developed by http://www.mcs.anl.gov/parallel-netcdf/.
+      The tools are very similar to Konrad Hinsen's NetCDF package to Python
+      but can read and write in a parallel way. For more information, see:
+      <a
+      href="http://www.pyacts.org/pypnetcdf">http://www.pyacts.org/pypnetcdf</a>.
+    </p>
+    <p>
+      <a id="pupynere" name="pupynere">Pupynere (PUre PYthon NEtcdf
+      REader)</a>
+      Roberto De Almeida has developed <a
+      href="http://pypi.python.org/pypi/pupynere/" >pupynere</a>, a PUre
+      PYthon NEtcdf REader that allows read-access to netCDF files using the
+      same syntax as the Scientific.IO.NetCDF Python module. Even though it's
+      written in Python, the module is up to 40% faster than
+      Scientific.IO.NetCDF and pynetcdf.
+    </p>
+
+    <p></p>
+    <h2><a id="R" name="R">R interface</a></h2>
+    <p>
+      The R Project for Statistical Computing has developed <a
+      href="http://www.R-project.org/" > R</a>, a language and environment for statistical
+      computing and graphics. It provides a wide variety of statistical and graphical
+      techniques, including linear and nonlinear modelling, statistical tests, time
+      series analysis, classification, and clustering.
+    </p>
+    <p>
+      David Pierce has contributed the <a
+      href="http://cran.r-project.org/web/packages/ncdf4/index.html"
+      >ncdf4 package</a> for reading netCDF data into R and for creating new netCDF
+      dimensions, variables, and files, or manipulating existing netCDF
+      files from R.
+    </p>
+    <p>
+      Pavel Michna has contributed another package, <a href="http://cran.r-project.org/web/packages/RNetCDF/index.html" >RNetCDF</a>, that also provides access to netCDF data and to udunits
+      calendar functions from R.
+    </p>
+    <p>
+      Robert Hijmans (with additional contributors) has created the <a
+      href="http://cran.r-project.org/web/packages/raster/index.html"
+      >R raster package</a> for geographic data analysis and modeling. The
+      raster package can be used for reading, writing, manipulating,
+      analyzing and modeling gridded spatial data. The package is especially
+      useful for large datasets that don't fit into memory, because data is
+      processed in chunks. See <a
+      href="http://cran.r-project.org/web/packages/raster/vignettes/Raster.pdf"
+      >Introduction to the 'raster' package</a> for more information.
+    </p>
+
+    <p></p>
+    <h2><a id="QGIS" name="QGIS">Quantum GIS (QGIS)</a></h2>
+    <p>
+      <a href="http://www.qgis.org/" >Quantum GIS</a> (QGIS) is an Open
+      Source Geographic Information System (GIS) licensed
+      under the GNU General Public License. QGIS is an official project of
+      the Open Source Geospatial Foundation (OSGeo). It runs on Linux, Unix,
+      Mac OSX, and Windows and supports numerous vector, raster, and
+      database formats and functionalities.  QGIS supports a desktop,
+      browser, server, and client for viewing, editing, analysis,
+      serving, and accessing data.  Its server complies with the OGC WMS 1.3 standard.
+      In addition to PostGIS and SpatiaLite formats, it can access data in vector
+      formats supported by the OGR library as well as most raster formats
+      supported by the GDAL library, including netCDF.  For a more detailed list of
+      features of the QGIS desktop, browser, server, and client, see the
+      <a href="http://www.qgis.org/en/about-qgis/features.html" >QGIS features page</a>.
+    </p>
+    <p></p>
+
+    <h2><a id="Ruby" name="Ruby">Ruby interface</a></h2>
+    <p>
+      A group at the Research Institute for Sustainable Humanosphere (RISH) of Kyoto
+      University has developed a <a
+      href="http://www.gfd-dennou.org/arch/ruby/products/ruby-netcdf/" >netCDF interface
+      for Ruby</a>, an interpreted, object-oriented scripting language. This interface
+      is intended to cover all the functionality of the C library for netCDF. Also
+      available are combination functions such as iterators (which offer abstract
+      ways to scan files and variables). Numeric arrays are handled by the "NArray"
+      multi-dimensional array class, which is becoming the de facto standard multi-dimensional
+      array for Ruby.  See also the Ruby-based <a href="#Gfdnavi" >GPhys
+      software and Gfdnavi tool</a>
+      for accessing GRIB, GrADS, and netCDF data uniformly.
+    </p>
+    <p>
+      More information about Ruby is available from the <a href="http://www.ruby-lang.org/" >Ruby
+      web site</a>.
+    </p>
+    <p></p>
+    <h2><a id="SDS" name="SDS">Scientific DataSet (SDS) Library</a></h2>
+    <p>
+      The <a href="http://sds.codeplex.com" >Scientific DataSet Library and
+      Tools project</a>, developed jointly by
+      Microsoft Research Cambridge and Moscow State University,
+      is aimed at manipulation and visualization of multidimensional data
+      sets.
+    </p>
+    <p>
+      Scientific DataSet (or SDS in short) is a .NET class library for
+      manipulating scientific data  and their metadata. SDS provides a unified API
+      for convenient access to various data storages. Three types of storages are
+      supported by the first release: NetCDF files, CSV text files and volatile
+      in-memory datasets. SDS uses native NetCDF library built from version 4.0.1
+      both for 32 and 64-bit Windows platforms. New storage types can be added to
+      SDS infractructure as plugins. Support for accessing TIFF image files from
+      SDS as 2D arrays will be available soon as a separate CodePlex project.
+    </p>
+    <p>
+      Three applications are built on top of SDS:
+    </p>
+    <ul>
+      <li>
+        sds command line utility. It allows users to examine data set schema,
+        copy data sets, modify their metadata.
+      </li>
+      <li>
+        DataSetViewer application for visualization of data sets. DataSetViewer
+        is both a standalone application and Windows Presentation Foundation Control
+        that can be built into your applications. DataSetViewer has support for
+        interactive slicing of multidimensional data along any dimension.
+      </li>
+      <li>
+        DataSetEditor add-in for Microsoft Office Excel. DataSetEditor provides
+        ability to view and modify the contents of any data set as Excel
+        worksheets.
+      </li>
+    </ul>
+    <p>
+      You can read the Getting Started document at
+      <a
+      href="http://sds.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=127282"
+      > http://sds.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=127282 </a>
+      for a more detailed introduction to the Scientific DataSet
+      software. A Windows
+      Installation package for SDS binaries along with DataSet Viewer and DataSet
+      Editor are available also. You can also build core class libraries and
+      the sds utility under Mono. You may use, copy, and reproduce this
+      software for any non-commercial purpose. For further details see license at
+      <a href="http://sds.codeplex.com/license" >http://sds.codeplex.com/license</a>.
+    </p>
+    <p>
+      The SDS project is in beta phase and keeps evolving.  You are welcome to
+      join discussions or report issues at the CodePlex site:
+      <a href="http://sds.codeplex.com" >http://sds.codeplex.com</a>.
+    </p>
+    <p></p>
+    <h2><a id="SIS" name="SIS">Apache Spatial Information System (SIS)</a></h2>
+    <p>
+      <a href="https://builds.apache.org/job/sis-trunk/site/index.html"
+      >Apache Spatial Information System (SIS)</a> is a Java library for
+      developing geospatial applications. SIS enables representation of
+      coordinates for searching, data clustering, archiving, or any other
+      relevant spatial needs. The library is an implementation of GeoAPI 3.0
+      interfaces and can be used for desktop or server applications.
+    </p>
+    <p>
+      SIS provides data structures for geographic data and associated
+      metadata along with methods to manipulate those data structures. The
+      SIS metadata module forms the base of the library and enables the
+      creation of metadata objects which comply with the ISO 19115 metadata
+      model and which can be read from or written to ISO 19139 compliant XML
+      documents. The SIS referencing module will enable the construction of
+      geodetic data structures for geospatial referencing based on the ISO
+      19111 model such as axis, projection and coordinate reference system
+      definitions, along with the associated operations which enable the
+      mathematical conversion of coordinates between different systems of
+      reference. The SIS storage modules will provide a common approach to
+      the reading and writing of grid coverages applicable to simple imagery
+      and multidimensional data structures.
+    </p>
+    <p>
+      SIS supports creating ISO 19115 metadata from metadata in a netCDF
+      store from a given file, URL, stream, or NetcdfFile object.  SIS
+      netCDF storage is intended to be a bridge between NetCDF Climate and
+      Forecast (CF) conventions and ISO 19115 metadata.
+    </p>
+    <p>
+      SIS is under developement as an Apache project.  Release 0.3 is
+      currently available for download.
+    </p>
+    <p></p>
+    <h2><a id="Tcl/Tk" name="Tcl/Tk">Tcl/Tk interfaces</a></h2>
+    <p>
+      Dan Schmitt has developed <a
+      href="http://cnrit.tamu.edu/rsg/cdftcl/">cdftcl</a>, a <a
+      href="http://www.scriptics.com/">Tcl/Tk</a> interface for netCDF. It allows the
+      use of "wildcards" (*) or ranges (1-4) in the subscript notation,
+      and use of name references instead of variable IDs. Contact dan at computer.org
+      for more information.
+    </p>
+    <p></p>
+    <h2><a id="Tcl-nap" name="Tcl-nap">Tcl-nap</a></h2>
+    <p>
+      <a href="http://tcl-nap.sourceforge.net" >Tcl-nap</a> (n-dimensional array
+      processor) is a loadable extension of Tcl which provides a powerful and efficient
+      facility for processing data in the form of n-dimensional arrays. It has been
+      designed to provide an array-processing facility with much of the functionality
+      of languages such as <a href="http://www.acm.org/sigapl/" >APL</a>, Fortran-90, <a href="#IDL" >IDL</a>, <a href="http://www.jsoftware.com/" >J</a>, <a href="http://www.mathworks.com" >matlab</a>, and <a href="http://www.octave.org/" >octave</a>.
+    </p>
+    <p>
+      Support is provided for data based on n-dimensional grids, where the dimensions
+      correspond to continuous spatial coordinates. There are interfaces to the HDF
+      and netCDF file formats commonly used for such data, especially in Earth sciences
+      such as Oceanography and Meteorology.
+    </p>
+    <p>
+      The internal data structure is called a NAO (n-dimensional array object) and
+      contains similar information to that of HDF SDSs and netCDF variables.
+    </p>
+    <p>
+      Tcl-nap was developed as part of the <a
+      href="http://www.dar.csiro.au/rs/avhrr_processing_software.htm" >CSIRO CAPS project</a>,
+      but can be loaded and used without the (satellite oriented) CAPS extension.
+    </p>
+    <p></p>
+    <h2><a id="VB" name="VB">Visual Basic and VB.net interfaces</a></h2>
+    <p>
+      Carsten Wieczorrek has developed code in VB 6 to export chromatographic
+      data into the netcdf/ANDI format.
+      The application writes netCDF files that can be read by
+      CHROMELEON, for example.  For others interested in programming with
+      netcdf.dll from VB 6, see
+      Wieczorrek's web page on <a
+      href="http://www.mn-net.com/netcdf_vb6"
+      >netCDF and VB 6.0</a> and for VB.net, see <a
+      href="http://www.mn-net.com/netcdf_vbnet" >netCDF and VB.net</a>.
+    </p>
+    <p></p>
+    <h2><a id="VisAD" name="VisAD">VisAD</a></h2>
+    <a href="http://www.ssec.wisc.edu/~billh/visad.html">VisAD</a> is a Java class
+    library for interactive and collaborative visualization and analysis of numerical
+    data. It combines:
+    <ul>
+      <li>
+        The use of pure Java for platform independence and to support data sharing
+        and real-time collaboration among geographically distributed users. Support
+        for distributed computing is integrated at the lowest levels of the system
+        using Java RMI distributed objects.
+      </li>
+      <li>
+        A general mathematical data model that can be adapted to virtually any numerical
+        data, that supports data sharing among different users, different data sources
+        and different scientific disciplines, and that provides transparent access
+        to data independent of storage format and location (i.e., memory, disk or
+        remote). The data model has been adapted to netCDF, FITS, HDF-EOS, McIDAS,
+        Vis5D, GIF and JPEG file formats.
+      </li>
+      <li>
+        A general display model that supports interactive 3-D, data fusion, multiple
+        data views, direct manipulation, collaboration, and virtual reality. The display
+        model has been adapted to Java3D and Java2D and used in an ImmersaDesk virtual
+        reality display.
+      </li>
+      <li>
+        Data analysis and computation integrated with visualization to support computational
+        steering and other complex interaction modes.
+      </li>
+      <li>
+        Support for two distinct communities: developers who create domain- specific
+        systems based on VisAD, and users of those domain-specific systems. VisAD
+        is designed to support a wide variety of user interfaces, ranging from simple
+        data browser applets to complex applications that allow groups of scientists
+        to collaboratively develop data analysis algorithms.
+      </li>
+      <li>
+        Developer extensibility in as many ways as possible.
+      </li>
+    </ul>
+    VisAD was written by programmers at the <a
+    href="http://www.ssec.wisc.edu/~billh/vis.html">SSEC Visualization Project</a>
+    at the University of Wisconsin-Madison <a
+    href="http://www.ssec.wisc.edu/">Space Science and Engineering Center</a>, and
+    the <a href="/index.html">Unidata Program Center</a>. <p></p>
+    <h2><a id="WCT" name="WCT">Weather and Climate Toolkit (WCT)</a></h2>
+    <p>
+      NOAA's <a href="https://www.ncdc.noaa.gov/wct/">Weather and
+      Climate Toolkit (WCT)</a> is free, platform independent
+      software distributed from NOAA's National Centers for
+      Environmental Information (NCEI). The WCT allows the
+      visualization and data export of weather and climate data,
+      including Radar, Satellite and Model data. The WCT also
+      provides access to weather/climate web services provided
+      from NCEI and other organizations.
+    </p>
+
+    <p>
+      The WCT provides tools for background maps, animations
+      and basic filtering. The export of images and movies is
+      provided in multiple formats. The data export feature
+      supports conversion of data to a variety of common formats
+      including GeoJSON, KMZ, Shapefile, Well-Known Text, GeoTIFF,
+      ESRI Grid and Gridded NetCDF. These data export features
+      promote the interoperability of weather and climate
+      information with various scientific communities and common
+      software packages such as ArcGIS, Google Earth, MatLAB,
+      QGIS, R and many more. Advanced data export support for
+      Google Earth enables the 2-D and 3D export of rendered data
+      and isosurfaces.
+    </p>
+
+    <h2><a id="WebWinds" name="WebWinds">WebWinds</a></h2>
+    <p>
+      <a href="http://www.openchannelsoftware.com/projects/WebWinds/"> WebWinds</a> is a free Java-based
+      science visualization and analysis package. In addition to several new analysis
+      tools, the current fourth version does automatic scripting. This allows
+    </p>
+    <ol>
+      <li>
+        a user to rapidly and automatically create and store a session, either
+        for his own use, or for use by a collaborator on another machine;
+      </li>
+      <li>
+        a data provider to automatically create a specialized analysis environment
+        which can be downloaded (as a small script file) along with a dataset from
+        a Website; and
+      </li>
+      <li>
+        realtime collaboration or sharing of sessions over (even low-bandwidth)
+        networks, including the Internet.
+      </li>
+    </ol>
+    <p>
+      This scripting requires no knowledge of the scripting language syntax. Several
+      sample script files are included with the distribution.
+    </p>
+    <p>
+      In addition, this version contains a capability to geo-reference some data
+      and to read ASCII data in tabular format. Also new is the ability to output
+      data in numerical form (e.g. NetCDF) and a context sensitive, integrated help
+      system.
+    </p>
+    <p>
+      As with earlier versions, data in several different formats, including NetCDF,
+      can be read in easily from your local machine or from the Web. In addition,
+      most data can be subset or subsampled on load, making it possible to visualize
+      very large multidimensional and/or multispectral datasets. The package includes
+      several step-by-step examples. Installation of the software (including Java)
+      on the PC or Mac is a process requiring one file to be downloaded and opened.
+      If you need help getting started, a remote tutorial is available once you've
+      downloaded the package.
+    </p>
+    <p>
+      WebWinds is `point and click' rather than language driven and it runs well
+      on Unix, Windows (95/98/NT) and Mac platforms. It currently requires JDK 1.1.
+      To download a copy of this release, go to <a href="http://www.sci-conservices.com/rel4/webpage/wwhome.html"
+      >http://www.sci-conservices.com/rel4/webpage/wwhome.html</a>
+    </p>
+    <p></p>
+
+    <h2><a id="xray" name="xray">xray (Python N-D labelled arrays)</a></h2>
+    <p>
+      <a href="http://xray.readthedocs.org/en/stable/index.html" >xray</a>
+      is an open source project and Python package that aims to bring the
+      labeled data power of <a href="http://pandas.pydata.org/" >pandas</a>
+      to the physical sciences, by providing N-dimensional variants of the
+      core pandas data structures, Series and DataFrame: the xray DataArray
+      and Dataset.
+    </p>
+    <p>
+      xray adopts the <a
+      href="http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/CDM"
+      >Common Data Model</a> for self-describing scientific data in
+      widespread use in the Earth sciences (e.g., netCDF and OPeNDAP):
+      xray.Dataset is an in-memory representation of a netCDF file.
+    </p>
+    <p>
+      xray is being developed by Stephan Hoyer, Alex Kleeman, and <a
+      href="https://github.com/xray/xray/graphs/contributors" >other
+      contributors</a>.
+    </p>
+
+    <h2><a id="Zebra" name="Zebra">Zebra</a></h2>
+    <a href="http://www.atd.ucar.edu/rdp/zebra.html">Zebra</a> (formerly named Zeb)
+    is a system for data ingest, storage, integration and display, designed to operate
+    in both real time and postprocessing modes. Zebra was developed by Jonathan Corbet
+    and others in NCAR's <a
+    href="http://www.atd.ucar.edu/rdp/rdp_home.html">Research Data Program</a>.
+    <p>
+      Zebra's primary use is for the superpositioning of observational data sets
+      (such as those collected by satellite, radar, mesonet and aircraft) and analysis
+      products (such as model results, dual-Doppler synthesis or algorithm output).
+      Data may be overlaid on a variety of display types, including constant altitude
+      planes, vertical cross-sections, X-Y graphs, Skew-T plots and time-height profiles.
+      The fields for display, color tables, contour intervals and various other display
+      options are defined using an icon based user-interface. This highly flexible
+      system allows scientific investigators to interactively superimpose and highlight
+      diverse data sets; thus aiding data interpretation.
+    </p>
+    <p>
+      Data handling capabilities permit external analysis programs to be easily linked
+      with display and data storage processes. The data store accepts incoming data,
+      stores it on disk, and makes it available to processes which need it. An application
+      library is available for data handling. The library functions allow data storage,
+      retrieval and queries using a single applications interface, regardless of the
+      data's source and organization. NetCDF data that conforms to Zebra conventions
+      is supported by this interface.
+    </p>
+    <p>
+      Zebra is currently available to the university research community through the
+      NCAR/ATD Research Data Program. Email requests to rdp-support at atd.ucar.edu.
+      More information is on the web page http://www.atd.ucar.edu/rdp/zebra.html.
+    </p>
+
+    <hr />
+
+    <h1><a id="user" name="user">User-Contributed Software</a></h1>
+    <p>
+      Unidata makes available a separate
+      <a href="/software/netcdf/Contrib.html">catalog</a>
+      to a
+      <a href="ftp://ftp.unidata.ucar.edu/pub/netcdf/contrib/">directory</a>
+      of freely available, user-contributed software and documentation related to the
+      netCDF library. This software may be retrieved by anonymous FTP. We haven't
+      necessarily used or tested this software; we make it available "as is".
+    </p>
+    <p>
+      The criteria for inclusion in the netcdf/contrib/ directory of user-contributed
+      software are:
+    </p>
+    <p></p>
+    <ul>
+      <li>
+        General usefulness to a significant part of the netCDF community
+      </li>
+      <li>
+        Small size
+      </li>
+      <li>
+        Infrequent need for updates
+      </li>
+      <li>
+        Free availability
+      </li>
+    </ul>
+    <hr />
+
+    <h1 id="commercial">Commercial or Licensed Packages</h1>
+
+    <h2><a id="ArcGIS" name="ArcGIS">ArcGIS Pro - Space Time Pattern Mining Toolbox</a></h2>
+    <p>
+      The <a href="https://pro.arcgis.com/en/pro-app/tool-reference/space-time-pattern-mining/an-overview-of-the-space-time-pattern-mining-toolbox.htm">Space Time Pattern Mining toolbox</a> contains statistical tools for analyzing data distributions and patterns in the context of both space and time. It includes a toolset for visualizing the data stored in the space-time netCDF cube in both 2D and 3D.
+
+      Create Space Time Cube takes point datasets and builds a multidimensional cube data structure (netCDF) for analysis. Emerging Hot Spot Analysis then takes the cube as input and identifies statistically significant hot and cold spot trends over time. You might use the Emerging Hot Spot Analysis tool to analyze crime or disease outbreak data in order to locate new, intensifying, persistent, or sporadic hot spot patterns at different time-step intervals. The Local Outlier Analysis too [...]
+    </p>
+    <p></p>
+
+    <h2><a id="ViewNcDap" name="ViewNcDap">ASA ViewNcDap</a></h2>
+    <p>
+      Applied Science Associates, Inc. has made the ASA View NC/Dap
+      application freely available for <a
+      href="http://www.asascience.com/downloads" >download</a>.  ViewNcDap
+      is a stand-alone research-based tool (with included demonstration
+      data) that allows a user to visualize four dimensional NetCDF and
+      OPeNDAP data.  ViewNcDap is a Windows application that includes
+      temporal/time step functionality for viewing animations of data that
+      include temporal information.  The application may be used to
+      visualize a variety of time-varying geospatial scientific data in a
+      simple map framework.  It handles CF conventions and includes some
+      aliasing features that could permit additional formats to be read.
+      It should not be considered a GIS system, but
+      is used to quickly preview a variety of data on a simple map. Data may
+      also be filtered and saved to a local netCDF file.
+    </p>
+    <p></p>
+
+    <h2><a id="Avizo" name="Avizo">Avizo</a></h2>
+    <p>
+      <a href="http://www.avizo3d.com/" >Avizo</a> software is a powerful
+      tool for 3D data visualization and
+      analysis.  It offers a comprehensive feature set that addresses
+      visualization, processing, analysis, communication and
+      presentation. <a href="http://www.vsg3d.com/vsg_prod_avizo_green.php"
+      > Avizo Green Edition</a> includes an advanced set of
+      features dedicated to climate, oceanography, environmental or
+      earth-mapped data.  It provides high-level support for the netCDF
+      format, a dedicated Earth visualization module, and a set of advanced
+      geographical projections applicable to a wide range of fast 2D and 3D
+      data representations.
+    </p>
+    <p>
+      For more information, see <a
+      href="http://www.avizo3d.com/" >www.avizo3d.com</a>.
+    </p>
+
+    <h2><a id="AVS" name="AVS">AVS</a></h2>
+    <a href="ftp://testavs.ncsc.org/avs/Info/WHAT_IS_AVS">AVS</a> (Application Visualization
+    System) is a visualization application software and development environment. An
+    AVS module has been written that allows multi-dimensional netCDF data sets to
+    read into AVS as uniform or rectilinear field files. The AVS user can point and
+    click to specify the name of the variable in the selected netCDF file, as well
+    as selecting the hyperslab. If 1D coordinate variables exist (a variable that
+    has the same name as a dimension) then the coordinate variable will be used to
+    specify the coordinates of resulting rectilinear field file. If no coordinate
+    variable exists, then the resulting field file will be uniform. Once in AVS, there
+    are hundreds of analysis and display modules available for image processing, isosurface
+    rendering, arbitrary slicing, alpha blending, streamline and vorticity calculation,
+    particle advection, etc. AVS runs on many different platforms (Stardent, DEC,
+    Cray, Convex, E and S, SET, Sun, IBM, SGI, HP, FPS and WaveTracer), and it has
+    a flexible data model capable of handling multidimensional data on non-Cartesian
+    grids.
+    <p>
+      The module source code and documentation is available from the <a href="http://iac.ncsc.org/">International
+      AVS Center</a>, in the <a
+      href="ftp://testavs.ncsc.org/avs/AVS5/Module_Src/data_input/read_netcdf/"> ftp://testavs.ncsc.org/avs/AVS5/Module_Src/data_input/read_netcdf/</a>
+      directory.
+    </p>
+    <p>
+      See also the information on <a href="#DDI">DDI</a> for another way to use netCDF
+      data with AVS.
+    </p>
+    <p></p>
+
+    <h2><a id="BCS-UFI" name="BCS-UFI" >Barrodale UFI</a></h2>
+
+    <p>
+      <a href="http://www.barrodale.com" >Barrodale Computing Services
+      Ltd.</a> (BCS) has developed a product that addresses one of
+      the main objections heard from "technologists" (e.g., scientists,
+      engineers, and other researchers) who avoid using databases to manage
+      their data: "my very large data files are too
+      cumbersome/difficult/slow/costly to load into a database".  In
+      addition to netCDF, these files come in a variety of formats (HDF5, GRIB,
+      NITFS, FITS, etc.).
+    </p>
+    <p>
+      This BCS product is called the <a
+      href="http://www.barrodale.com/bcs/universal-file-interface-ufi"
+      >Universal File Interface (UFI)</a>; it's a
+      database extension based on the IBM Informix Virtual Table Interface
+      (VTI). <em>(Please continue reading even if you don't have
+      Informix running on your system, because IBM has just made available, at
+      no charge, the <a
+      href="http://www-01.ibm.com/software/data/informix/innovator-c-edition/"
+      >Innovator-C Edition</a> of Informix.)</em> A demo that uses UFI to
+      access wind speeds can be seen <a
+      href="http://www.barrodale.com/bcs/universal-file-interface-animation"
+      >here</a>.
+    </p>
+    <p>
+      VTI is a technology that supports making external datasets appear as tables
+      to SQL queries and statements.  UFI is a BCS database extension for
+      delivering the contents of external data files as though they were rows in
+      a database table.  UFI makes a file look like a set of database tables, so
+      "UFI managed tables" are actually virtual database tables.   Consequently,
+      users of UFI can perform SQL queries on their files without having to first
+      load them into a database.
+    </p>
+
+    <p></p>
+
+    <h2><a id=></a></h2>
+
+    <h2><a id="DioVISTA/Storm" name="DioVISTA/Storm" >DioVISTA/Storm</a></h2>
+    <p>
+      <a href="http://www.hitachi-power-solutions.com/products/product03/p03_61.html"
+      >DioVISTA/Storm</a> is a commercial software package that visualizes content
+      of netCDF files as a time series of grids, isosurfaces, and arrows on a 3D
+      virtual earth. Its user interface is similar to standard 3D earth
+      visualizing software. It displays OGC KML files, Shapefiles, and online
+      map resources through OGC Web Tile Map Services (WTMS). It supports CF
+      Conventions version 1.6 (lon-lat-alt-time axis and trajectory). Its first
+      version was released on Aug 5 2014.
+    </p>
+
+    <p></p>
+
+    <h2><a id="Environmental WorkBench"
+    name="Environmental WorkBench">Environmental WorkBench</a></h2>
+    <a href="http://www.ssesco.com/">SuperComputer Systems Engineering and Services
+    Company</a> (SSESCO) has developed the <a
+    href="http://www.ssesco.com/files/ewb.html">Environmental WorkBench</a> (EWB),
+    an easy to use visualization and analysis application targeted at environmental
+    data. The EWB currently has numerous users in the fields of meteorological research,
+    air quality work, and groundwater remediation.
+    <p>
+      EWB system features include:
+    </p>
+    <ul>
+      <li>
+        Random access file structure using the netCDF-based public domain MeRAF
+        file system with support for gridded, discrete (non-grid-based observation),
+        and particle types
+      </li>
+      <li>
+        Support for geo-referenced or Cartesian coordinate systems
+      </li>
+      <li>
+        Object oriented Graphical User Interface (GUI) that is very easy to use
+      </li>
+      <li>
+        Tools for converting model and observational data sets and data writers
+        to netCDF
+      </li>
+      <li>
+        Interactive rotation/translation of scenes in 3D space
+      </li>
+      <li>
+        Time sequencing controls to step forward/backward, animate sequentially,
+        or go to a chosen time step; including multiple asynchronous or non-uniform
+        time steps
+      </li>
+      <li>
+        Interactive slicers to select cross sections through 3D data sets
+      </li>
+      <li>
+        Display operators available on the slices, including
+        <ul>
+          <li>
+            Contour lines with selectable contour levels
+          </li>
+          <li>
+            Color shading by data value with variable transparency level
+          </li>
+          <li>
+            Arrow and streamline representation for vector quantities
+          </li>
+          <li>
+            Positional reference lines at user selected intervals
+          </li>
+          <li>
+            Color coded shapes at each grid node
+          </li>
+        </ul>
+      </li>
+      <li>
+        Multiple 3D isosurfaces at selected parameters and values with variable
+        transparency
+      </li>
+      <li>
+        Display of particle positions with coloring by type, height, and source
+      </li>
+      <li>
+        Display of discrete data using colored spheres and labels for scalar data
+        and arrows for vectors (with arrowheads or meteorological style)
+      </li>
+      <li>
+        Multiple user definable color maps to which isosurface and colored field
+        shading may be separately assigned
+      </li>
+      <li>
+        On screen annotation for generation of report ready figures
+      </li>
+      <li>
+        Image export in any of the common image formats (gif, tiff, encapsulated
+        postscript, etc.)
+      </li>
+      <li>
+        Graceful handling of missing or bad data values by all the graphics rendering
+        routines
+      </li>
+      <li>
+        Automatic data synchronization to allow automatic screen updating as new
+        data arrives in real-time from a model or set of sensors
+      </li>
+      <li>
+        Two and three dimensional interpolation from scattered observations to a
+        grid, using the Natural Neighbor Method. This robust volume based method yields
+        results far superior to distance weighting schemes.
+      </li>
+    </ul>
+    <p>
+      Systems currently supported include Win95, WinNT, OS/2, IBM RS/6000, Silicon
+      Graphics, HP and SUN workstations.
+    </p>
+    <p>
+      SSESCO has implemented a meta-file layer on top of the netCDF library, called
+      MeRAF. It handles multiple netCDF files as well as automatic max-min calculations,
+      time-varying gridded, particle, and discrete data, logical groupings for discrete
+      data, and an overall simplified and flexible interface for storing scientific
+      data. MeRAF is being used by the DOE at the Hanford-Meteorological Site for
+      observational data and will be used for their weather-modeling.
+    </p>
+    <p></p>
+
+    <h2><a id="ESRI" name="ESRI">ESRI</a></h2>
+
+    <p>
+      <a href="http://www.esri.com/software/arcgis/index.html" >ESRI
+      ArcGIS</a> version 9.2 and later support <a
+      href="http://webhelp.esri.com/arcgisdesktop/9.2/index.cfm?TopicName=An_overview_of_data_support_in_ArcGIS"
+      >accessing netCDF time-based and multidimensional data</a> that
+      follows CF or COARDS conventions for associating spatial locations
+      with data.  A selected slice of netCDF data may be displayed in ArcGIS
+      as a raster layer, feature layer, or table.  You can also drag a
+      netCDF file from Windows Explorer and drop it in an ESRI application
+      such as ArcMap.
+    </p>
+
+    <p></p>
+
+    <h2><a id="FME">FME</a></h2>
+
+    <p>
+      <a href="http://www.safe.com/fme">FME</a>, developed by <a
+      href="http://www.safe.com">Safe Software Inc.</a>, is a tool for transforming
+      data for exchange between over <a href="http://www.safe.com/fme/format-search/">300
+      different formats and models</a>, including netCDF. FME's
+      read and write support for netCDF allows users to
+      move data into the netCDF common standard, regardless
+      of its source, and conversely enables end-users to consume netCDF
+      data for use in their preferred systems. For more information visit <a
+      href="http://www.safe.com/fme">http://www.safe.com/fme</a>.
+    </p>
+
+    <p></p>
+
+    <h2><a id="HDF-Explorer" name="HDF-Explorer">HDF Explorer</a></h2>
+    <p>
+      <a href="http://www.space-research.org/" >HDF Explorer</a>
+      is a data visualization program that reads the HDF, HDF5
+      and netCDF data file formats (including netCDF classic format data).
+      HDF Explorer runs in the Microsoft
+      Windows operating systems.
+    </p>
+    <p>
+      HDF Explorer offers a simple yet powerful interface for the
+      visualization of HDF and netCDF data.  The data is just a click of the mouse
+      away. Data is first viewed in a tree-like interface, and then
+      optionally loaded and visualized in a variety of ways.
+      HDF Explorer features include fast access to data, grid, scalar and
+      vector views. It also allows exporting your data either as an ASCII
+      text file or a bitmap image.
+    </p>
+    <p></p>
+
+    <h2><a id="IDL" name="IDL">IDL Interface</a></h2>
+    <a href="http://www.exelisvis.com/ProductsServices/IDL.aspx">IDL</a> (Interactive Data Language)
+    is a scientific computing environment, developed and supported by <a
+    href="http://www.exelisvis.com/" >Excelis Visual Information
+    Solutions</a>, that combines mathematics, advanced data
+    visualization, scientific graphics, and a graphical user interface toolkit to
+    analyze and visualize scientific data. Designed for use by scientists and scientific
+    application developers, IDL's array-oriented, fourth-generation programming
+    language allows you to prototype and develop complete applications. IDL now supports
+    data in netCDF format.
+    <p>
+      As an example, here is how to read data from a netCDF variable named GP in
+      a file named "data/aprin.nc" into an IDL variable named gp using the
+      IDL language:
+    </p>
+    <p></p>
     <pre>
-        Margi Klemp
-        University of Colorado / LASP
-        1234 Innovation Dr.
-        Boulder, CO 80303
-        USA
-
-</pre>
-  </li>
-  <li>E-MAIL : margi at aries.colorado.edu</li>
-</ul>
-<p></p>
-<h2><a id="pomegranate" name="Pomegranate">Pomegranate</a></h2>
-<p>
-The P9E Team at
-NASA JPL has developed <a href="http://pomegranate.jpl.nasa.gov/"
->Pomegranate</a>, a python application that "webifies" science data files.
-Supported formats include netCDF, HDF4, HDF5, GRIB and FITS.
-</p><p>
-Pomegranate can be installed on web servers as either a WSGI or CGI application
-to provide webification (w10n) services. To learn more about w10n of
-science data files, please visit
-<a href="http://webification.org/">http://webification.org/</a>.
-A brief <a href="http://pomegranate.jpl.nasa.gov/test/help.txt"
-  >help</a> document describes how to use the <a
-  href="http://pomegranate.jpl.nasa.gov/test" >demo directory</a> to
-  browse or download metadata or data in netCDF, JSON, or other
-  formats by clicking on data folder and document icons.
-</p><p>
-Pomegranate can also be used as a standalone library or command line application.
-This greatly simplifies the retrieval of metadata and data
-from files in supported formats.
-</p>
-<p>
-Pomegranate is open source software and can be downloaded from
-<a href="http://www.openchannelsoftware.com/projects/Pomegranate/" >
-http://www.openchannelsoftware.com/projects/Pomegranate/</a>.
-</p>
-
-<h2><a id="PyNGL" name="PyNGL">PyNGL and PyNIO</a></h2>
-<p>
-NCAR's Computational and Information Systems Laboratory has developed
-<a href="http://www.pyngl.ucar.edu/" >PyNGL</a>, a python package for
-scientific visualization and data analysis and <a
-href="http://www.pyngl.ucar.edu/Nio.shtml" >PyNIO</a>, a Python
-package supporting access to a variety of data formats using an
-interface modelled on netCDF.
-</p>
-<p></p>
-
-<h2><a id="Python" name="Python">Python interfaces</a></h2>
-<p>
-Python is an interpreted, object-oriented language that is supported on a wide
-range of hardware and operating systems. Python information and sources can be
-obtained from <a
-href="http://www.python.org/">http://www.python.org/</a>. There are now
-several netCDF interfaces for Python.
-</p>
-<p>
-Jeff Whitaker of the NOAA Earth System Research Lab has developed a
-netCDF-4 module for python:
-<a
-href="http://code.google.com/p/netcdf4-python/">
-http://code.google.com/p/netcdf4-python/</a>.  Most new features of
-netCDF-4 are implemented, such as multiple unlimited dimensions,
-groups and zlib data compression. All the new numeric data types (such
-as 64-bit and unsigned integer types) are implemented. Compound and
-variable length (vlen) data types are supported, but the enum and
-opaque data types are not. Mixtures of compound and vlen data types
-(compound types containing vlens, and vlens containing compound types)
-are not supported.
-</p>
-<p>
-<a href="#xray" >xray</a> is a higher-level interface that uses
-netcdf4-python internally to implement a pandas-like package for N-D
-labelled arrays for scientific data.
-</p>
-<p>
-André Gosselin of the Institut Maurice-Lamontagne, Péches & Océans Canada,
-has implemented pycdf, a new Python interface to the netCDF library.  It
-is available from <a href="http://pysclint.sourceforge.net/pycdf/"
->http://pysclint.sourceforge.net/pycdf/</a>, where you will find the install
-files, installation instructions, extensive documentation in text and html
-format, and examples. pycdf requires the Numeric python package, and
-installs through the simple "python setyp.py install" command.
-</p>
-<p>Bill Noon (noon at snow.cit.cornell.edu) has implemented another netCDF Python
-  module that allows easy creation, access, and browsing of netCDF data. The bindings
-  also use the <a
-href="/software/udunits/">udunits library</a> to do unit conversions.
-  More information and source for Noon's Python netCDF module are available
-  from <a
-href="http://snow.cit.cornell.edu/noon/ncmodule.html">http://snow.cit.cornell.edu/noon/ncmodule.html</a>.</p>
-
-<p>The package from Konrad Hinsen has been integrated into his <a
-href="https://sourcesup.cru.fr/projects/scientific-py/">ScientificPython</a>
-package.</p>
-
-<p> Dave Brown of NCAR's Computational and Information Systems Laboratory has developed <a
-href="http://www.pyngl.ucar.edu/Nio.shtml" >PyNIO</a>, a Python
-package that allows read and/or write access to a variety of data
-formats using an interface modelled on netCDF.  Currently supported
-formats include netCDF, HDF4, GRIB1 and GRIB2 (read only), and HDF-EOS
-2 Grid and Swath data (read only).  </p>
-
-<p>
-Vicente Galiano of Miguel Hernandez University has developed a Python interface to
-PnetCDF. This Python's package called "PyPnetCDF" allows access to NetCDF files using MPI and
-the library pnetCDF developed by http://www.mcs.anl.gov/parallel-netcdf/.
-The tools are very similar to Konrad Hinsen's NetCDF package to Python
-but can read and write in a parallel way. For more information, see:
-<a
-href="http://www.pyacts.org/pypnetcdf">http://www.pyacts.org/pypnetcdf</a>.
-</p>
-<p>
-<a id="pupynere" name="pupynere">Pupynere (PUre PYthon NEtcdf
-REader)</a>
-Roberto De Almeida has developed <a
-href="http://pypi.python.org/pypi/pupynere/" >pupynere</a>, a PUre
-PYthon NEtcdf REader that allows read-access to netCDF files using the
-same syntax as the Scientific.IO.NetCDF Python module. Even though it's
-written in Python, the module is up to 40% faster than
-Scientific.IO.NetCDF and pynetcdf.
-</p>
-
-<p></p>
-<h2><a id="R" name="R">R interface</a></h2>
-<p> The R Project for Statistical Computing has developed <a
-href="http://www.R-project.org/" > R</a>, a language and environment for statistical
-  computing and graphics. It provides a wide variety of statistical and graphical
-  techniques, including linear and nonlinear modelling, statistical tests, time
-  series analysis, classification, and clustering. </p>
-<p> David Pierce has contributed the <a
-href="http://cran.r-project.org/web/packages/ncdf4/index.html"
->ncdf4 package</a> for reading netCDF data into R and for creating new netCDF
-dimensions, variables, and files, or manipulating existing netCDF
-files from R. </p>
-<p>
-Pavel Michna has contributed another package, <a href="http://cran.r-project.org/web/packages/RNetCDF/index.html" >RNetCDF</a>, that also provides access to netCDF data and to udunits
-calendar functions from R.
-</p>
-<p> Robert Hijmans (with additional contributors) has created the <a
-href="http://cran.r-project.org/web/packages/raster/index.html"
->R raster package</a> for geographic data analysis and modeling. The
-raster package can be used for reading, writing, manipulating,
-analyzing and modeling gridded spatial data. The package is especially
-useful for large datasets that don't fit into memory, because data is
-processed in chunks. See <a
-href="http://cran.r-project.org/web/packages/raster/vignettes/Raster.pdf"
->Introduction to the 'raster' package</a> for more information.
-</p>
-
-<p></p>
-<h2><a id="QGIS" name="QGIS">Quantum GIS (QGIS)</a></h2>
-<p>
-<a href="http://www.qgis.org/" >Quantum GIS</a> (QGIS) is an Open
-Source Geographic Information System (GIS) licensed
-under the GNU General Public License. QGIS is an official project of
-the Open Source Geospatial Foundation (OSGeo). It runs on Linux, Unix,
-Mac OSX, and Windows and supports numerous vector, raster, and
-database formats and functionalities.  QGIS supports a desktop,
-browser, server, and client for viewing, editing, analysis,
-serving, and accessing data.  Its server complies with the OGC WMS 1.3 standard.
-In addition to PostGIS and SpatiaLite formats, it can access data in vector
-formats supported by the OGR library as well as most raster formats
-supported by the GDAL library, including netCDF.  For a more detailed list of
-features of the QGIS desktop, browser, server, and client, see the
-<a href="http://www.qgis.org/en/about-qgis/features.html" >QGIS features page</a>.
-</p>
-<p></p>
-
-<h2><a id="Ruby" name="Ruby">Ruby interface</a></h2>
-<p> A group at the Research Institute for Sustainable Humanosphere (RISH) of Kyoto
-  University has developed a <a
-href="http://www.gfd-dennou.org/arch/ruby/products/ruby-netcdf/" >netCDF interface
-  for Ruby</a>, an interpreted, object-oriented scripting language. This interface
-  is intended to cover all the functionality of the C library for netCDF. Also
-  available are combination functions such as iterators (which offer abstract
-  ways to scan files and variables). Numeric arrays are handled by the "NArray"
-  multi-dimensional array class, which is becoming the de facto standard multi-dimensional
-  array for Ruby.  See also the Ruby-based <a href="#Gfdnavi" >GPhys
-  software and Gfdnavi tool</a>
-  for accessing GRIB, GrADS, and netCDF data uniformly. </p>
-<p> More information about Ruby is available from the <a href="http://www.ruby-lang.org/" >Ruby
-  web site</a>. </p>
-<p></p>
-<h2><a id="SDS" name = "SDS">Scientific DataSet (SDS) Library</a></h2>
-<p>
-The <a href="http://sds.codeplex.com" >Scientific DataSet Library and
-Tools project</a>, developed jointly by
-Microsoft Research Cambridge and Moscow State University,
-is aimed at manipulation and visualization of multidimensional data
-sets.
-</p>
-<p>
-Scientific DataSet (or SDS in short) is a .NET class library for
-manipulating scientific data  and their metadata. SDS provides a unified API
-for convenient access to various data storages. Three types of storages are
-supported by the first release: NetCDF files, CSV text files and volatile
-in-memory datasets. SDS uses native NetCDF library built from version 4.0.1
-both for 32 and 64-bit Windows platforms. New storage types can be added to
-SDS infractructure as plugins. Support for accessing TIFF image files from
-SDS as 2D arrays will be available soon as a separate CodePlex project.
-</p>
-<p>
-Three applications are built on top of SDS:
-</p>
-<ul>
-  <li>sds command line utility. It allows users to examine data set schema,
-copy data sets, modify their metadata.
-  </li>
-  <li>DataSetViewer application for visualization of data sets. DataSetViewer
-is both a standalone application and Windows Presentation Foundation Control
-that can be built into your applications. DataSetViewer has support for
-interactive slicing of multidimensional data along any dimension.
-  </li>
-  <li>DataSetEditor add-in for Microsoft Office Excel. DataSetEditor provides
-  ability to view and modify the contents of any data set as Excel
-  worksheets.
-  </li>
-</ul>
-<p>
-You can read the Getting Started document at
-<a
-href="http://sds.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=127282"
->
-http://sds.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=127282
-</a>
-for a more detailed introduction to the Scientific DataSet
-software. A Windows
-Installation package for SDS binaries along with DataSet Viewer and DataSet
-Editor are available also. You can also build core class libraries and
-the sds utility under Mono. You may use, copy, and reproduce this
-software for any non-commercial purpose. For further details see license at
-<a href="http://sds.codeplex.com/license" >http://sds.codeplex.com/license</a>.
-</p>
-<p>
-The SDS project is in beta phase and keeps evolving.  You are welcome to
-join discussions or report issues at the CodePlex site:
-<a href="http://sds.codeplex.com" >http://sds.codeplex.com</a>.
-</p>
-<p></p>
-<h2><a id="SIS" name="SIS">Apache Spatial Information System (SIS)</a></h2>
-<p>
-<a href="https://builds.apache.org/job/sis-trunk/site/index.html"
->Apache Spatial Information System (SIS)</a> is a Java library for
-developing geospatial applications. SIS enables representation of
-coordinates for searching, data clustering, archiving, or any other
-relevant spatial needs. The library is an implementation of GeoAPI 3.0
-interfaces and can be used for desktop or server applications.
-</p>
-<p>
-SIS provides data structures for geographic data and associated
-metadata along with methods to manipulate those data structures. The
-SIS metadata module forms the base of the library and enables the
-creation of metadata objects which comply with the ISO 19115 metadata
-model and which can be read from or written to ISO 19139 compliant XML
-documents. The SIS referencing module will enable the construction of
-geodetic data structures for geospatial referencing based on the ISO
-19111 model such as axis, projection and coordinate reference system
-definitions, along with the associated operations which enable the
-mathematical conversion of coordinates between different systems of
-reference. The SIS storage modules will provide a common approach to
-the reading and writing of grid coverages applicable to simple imagery
-and multidimensional data structures.
-</p>
-<p>
-SIS supports creating ISO 19115 metadata from metadata in a netCDF
-store from a given file, URL, stream, or NetcdfFile object.  SIS
-netCDF storage is intended to be a bridge between NetCDF Climate and
-Forecast (CF) conventions and ISO 19115 metadata.
-</p>
-<p>
-SIS is under developement as an Apache project.  Release 0.3 is
-currently available for download.
-</p>
-<p></p>
-<h2><a id="Tcl/Tk" name="Tcl/Tk">Tcl/Tk interfaces</a></h2>
-<p> Dan Schmitt has developed <a
-href="http://cnrit.tamu.edu/rsg/cdftcl/">cdftcl</a>, a <a
-href="http://www.scriptics.com/">Tcl/Tk</a> interface for netCDF. It allows the
-  use of "wildcards" (*) or ranges (1-4) in the subscript notation,
-  and use of name references instead of variable IDs. Contact dan at computer.org
-  for more information.
-</p>
-<p></p>
-<h2><a id="Tcl-nap" name="Tcl-nap">Tcl-nap</a></h2>
-<p> <a href="http://tcl-nap.sourceforge.net" >Tcl-nap</a> (n-dimensional array
-  processor) is a loadable extension of Tcl which provides a powerful and efficient
-  facility for processing data in the form of n-dimensional arrays. It has been
-  designed to provide an array-processing facility with much of the functionality
-  of languages such as <a href="http://www.acm.org/sigapl/" >APL</a>, Fortran-90,
-  <a href="#IDL" >IDL</a>, <a href="http://www.jsoftware.com/" >J</a>,
-  <a href="http://www.mathworks.com" >matlab</a>, and <a href="http://www.octave.org/" >octave</a>.
-</p>
-<p> Support is provided for data based on n-dimensional grids, where the dimensions
-  correspond to continuous spatial coordinates. There are interfaces to the HDF
-  and netCDF file formats commonly used for such data, especially in Earth sciences
-  such as Oceanography and Meteorology. </p>
-<p> The internal data structure is called a NAO (n-dimensional array object) and
-  contains similar information to that of HDF SDSs and netCDF variables. </p>
-<p> Tcl-nap was developed as part of the <a
-href="http://www.dar.csiro.au/rs/avhrr_processing_software.htm" >CSIRO CAPS project</a>,
-  but can be loaded and used without the (satellite oriented) CAPS extension.
-</p>
-<p></p>
-<h2><a id="VB" name="VB">Visual Basic and VB.net interfaces</a></h2>
-<p>
-Carsten Wieczorrek has developed code in VB 6 to export chromatographic
-data into the netcdf/ANDI format.
-The application writes netCDF files that can be read by
-CHROMELEON, for example.  For others interested in programming with
-netcdf.dll from VB 6, see
-Wieczorrek's web page on <a
-href="http://www.mn-net.com/netcdf_vb6"
->netCDF and VB 6.0</a> and for VB.net, see <a
-href="http://www.mn-net.com/netcdf_vbnet" >netCDF and VB.net</a>.
-</p>
-<p></p>
-<h2><a id="VisAD" name="VisAD">VisAD</a></h2>
-<a href="http://www.ssec.wisc.edu/~billh/visad.html">VisAD</a> is a Java class
-library for interactive and collaborative visualization and analysis of numerical
-data. It combines:
-<ul>
-  <li>The use of pure Java for platform independence and to support data sharing
-    and real-time collaboration among geographically distributed users. Support
-    for distributed computing is integrated at the lowest levels of the system
-    using Java RMI distributed objects.</li>
-  <li>A general mathematical data model that can be adapted to virtually any numerical
-    data, that supports data sharing among different users, different data sources
-    and different scientific disciplines, and that provides transparent access
-    to data independent of storage format and location (i.e., memory, disk or
-    remote). The data model has been adapted to netCDF, FITS, HDF-EOS, McIDAS,
-    Vis5D, GIF and JPEG file formats.</li>
-  <li>A general display model that supports interactive 3-D, data fusion, multiple
-    data views, direct manipulation, collaboration, and virtual reality. The display
-    model has been adapted to Java3D and Java2D and used in an ImmersaDesk virtual
-    reality display.</li>
-  <li>Data analysis and computation integrated with visualization to support computational
-    steering and other complex interaction modes.</li>
-  <li>Support for two distinct communities: developers who create domain- specific
-    systems based on VisAD, and users of those domain-specific systems. VisAD
-    is designed to support a wide variety of user interfaces, ranging from simple
-    data browser applets to complex applications that allow groups of scientists
-    to collaboratively develop data analysis algorithms.</li>
-  <li>Developer extensibility in as many ways as possible.</li>
-</ul>
-VisAD was written by programmers at the <a
-href="http://www.ssec.wisc.edu/~billh/vis.html">SSEC Visualization Project</a>
-at the University of Wisconsin-Madison <a
-href="http://www.ssec.wisc.edu/">Space Science and Engineering Center</a>, and
-the <a href="/index.html">Unidata Program Center</a>.
-<p></p>
-
-<h2><a id="WebWinds" name="WebWinds">WebWinds</a></h2>
-<p> <a href="http://www.openchannelsoftware.com/projects/WebWinds/">
-WebWinds</a> is a free Java-based
-  science visualization and analysis package. In addition to several new analysis
-  tools, the current fourth version does automatic scripting. This allows
-</p>
-<ol>
-  <li> a user to rapidly and automatically create and store a session, either
-    for his own use, or for use by a collaborator on another machine;</li>
-  <li> a data provider to automatically create a specialized analysis environment
-    which can be downloaded (as a small script file) along with a dataset from
-    a Website; and</li>
-  <li> realtime collaboration or sharing of sessions over (even low-bandwidth)
-    networks, including the Internet.</li>
-</ol>
-<p>
-This scripting requires no knowledge of the scripting language syntax. Several
-sample script files are included with the distribution.
-</p>
-<p> In addition, this version contains a capability to geo-reference some data
-  and to read ASCII data in tabular format. Also new is the ability to output
-  data in numerical form (e.g. NetCDF) and a context sensitive, integrated help
-  system. </p>
-<p> As with earlier versions, data in several different formats, including NetCDF,
-  can be read in easily from your local machine or from the Web. In addition,
-  most data can be subset or subsampled on load, making it possible to visualize
-  very large multidimensional and/or multispectral datasets. The package includes
-  several step-by-step examples. Installation of the software (including Java)
-  on the PC or Mac is a process requiring one file to be downloaded and opened.
-  If you need help getting started, a remote tutorial is available once you've
-  downloaded the package. </p>
-<p> WebWinds is `point and click' rather than language driven and it runs well
-  on Unix, Windows (95/98/NT) and Mac platforms. It currently requires JDK 1.1.
-  To download a copy of this release, go to <a href="http://www.sci-conservices.com/rel4/webpage/wwhome.html"
->http://www.sci-conservices.com/rel4/webpage/wwhome.html</a> </p>
-<p></p>
-
-<h2><a id="xray" name="xray">xray (Python N-D labelled arrays)</a></h2>
-<p>
-<a href="http://xray.readthedocs.org/en/stable/index.html" >xray</a>
-is an open source project and Python package that aims to bring the
-labeled data power of <a href="http://pandas.pydata.org/" >pandas</a>
-to the physical sciences, by providing N-dimensional variants of the
-core pandas data structures, Series and DataFrame: the xray DataArray
-and Dataset.
-</p>
-<p>
-xray adopts the <a
-href="http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/CDM"
->Common Data Model</a> for self-describing scientific data in
-widespread use in the Earth sciences (e.g., netCDF and OPeNDAP):
-xray.Dataset is an in-memory representation of a netCDF file.
-</p>
-<p>xray is being developed by Stephan Hoyer, Alex Kleeman, and <a
-href="https://github.com/xray/xray/graphs/contributors" >other
-contributors</a>.
-</p>
-
-<h2><a id="Zebra" name="Zebra">Zebra</a></h2>
-<a href="http://www.atd.ucar.edu/rdp/zebra.html">Zebra</a> (formerly named Zeb)
-is a system for data ingest, storage, integration and display, designed to operate
-in both real time and postprocessing modes. Zebra was developed by Jonathan Corbet
-and others in NCAR's <a
-href="http://www.atd.ucar.edu/rdp/rdp_home.html">Research Data Program</a>.
-<p>Zebra's primary use is for the superpositioning of observational data sets
-  (such as those collected by satellite, radar, mesonet and aircraft) and analysis
-  products (such as model results, dual-Doppler synthesis or algorithm output).
-  Data may be overlaid on a variety of display types, including constant altitude
-  planes, vertical cross-sections, X-Y graphs, Skew-T plots and time-height profiles.
-  The fields for display, color tables, contour intervals and various other display
-  options are defined using an icon based user-interface. This highly flexible
-  system allows scientific investigators to interactively superimpose and highlight
-  diverse data sets; thus aiding data interpretation.</p>
-<p>Data handling capabilities permit external analysis programs to be easily linked
-  with display and data storage processes. The data store accepts incoming data,
-  stores it on disk, and makes it available to processes which need it. An application
-  library is available for data handling. The library functions allow data storage,
-  retrieval and queries using a single applications interface, regardless of the
-  data's source and organization. NetCDF data that conforms to Zebra conventions
-  is supported by this interface.</p>
-<p>Zebra is currently available to the university research community through the
-  NCAR/ATD Research Data Program. Email requests to rdp-support at atd.ucar.edu.
-  More information is on the web page http://www.atd.ucar.edu/rdp/zebra.html.</p>
-
-<hr />
-
-<h1><a id="user" name="user">User-Contributed Software</a></h1>
-<p>
-Unidata makes available a separate
-<a href="/software/netcdf/Contrib.html">catalog</a>
-to a
-<a href="ftp://ftp.unidata.ucar.edu/pub/netcdf/contrib/">directory</a>
-of freely available, user-contributed software and documentation related to the
-netCDF library. This software may be retrieved by anonymous FTP. We haven't
-necessarily used or tested this software; we make it available "as is".
-</p>
-<p>The criteria for inclusion in the netcdf/contrib/ directory of user-contributed
-  software are:</p>
-<p></p>
-<ul>
-  <li>General usefulness to a significant part of the netCDF community</li>
-  <li>Small size</li>
-  <li>Infrequent need for updates</li>
-  <li>Free availability</li>
-</ul>
-<hr />
-
-<h1 id="commercial">Commercial or Licensed Packages</h1>
-
-<h2><a id="ViewNcDap" name="ViewNcDap">ASA ViewNcDap</a></h2>
-<p>
-Applied Science Associates, Inc. has made the ASA View NC/Dap
-application freely available for <a
-href="http://www.asascience.com/downloads" >download</a>.  ViewNcDap
-is a stand-alone research-based tool (with included demonstration
-data) that allows a user to visualize four dimensional NetCDF and
-OPeNDAP data.  ViewNcDap is a Windows application that includes
-temporal/time step functionality for viewing animations of data that
-include temporal information.  The application may be used to
-visualize a variety of time-varying geospatial scientific data in a
-simple map framework.  It handles CF conventions and includes some
-aliasing features that could permit additional formats to be read.
-It should not be considered a GIS system, but
-is used to quickly preview a variety of data on a simple map. Data may
-also be filtered and saved to a local netCDF file.
-</p>
-<p></p>
-
-<h2><a id="Avizo" name="Avizo">Avizo</a></h2>
-<p>
-<a href="http://www.avizo3d.com/" >Avizo</a> software is a powerful
-tool for 3D data visualization and
-analysis.  It offers a comprehensive feature set that addresses
-visualization, processing, analysis, communication and
-presentation.  <a href="http://www.vsg3d.com/vsg_prod_avizo_green.php"
->
-Avizo Green Edition</a> includes an advanced set of
-features dedicated to climate, oceanography, environmental or
-earth-mapped data.  It provides high-level support for the netCDF
-format, a dedicated Earth visualization module, and a set of advanced
-geographical projections applicable to a wide range of fast 2D and 3D
-data representations.
-</p>
-<p>
-For more information, see <a
-href="http://www.avizo3d.com/" >www.avizo3d.com</a>.
-</p>
-
-<h2><a id="AVS" name="AVS">AVS</a></h2>
-<a href="ftp://testavs.ncsc.org/avs/Info/WHAT_IS_AVS">AVS</a> (Application Visualization
-System) is a visualization application software and development environment. An
-AVS module has been written that allows multi-dimensional netCDF data sets to
-read into AVS as uniform or rectilinear field files. The AVS user can point and
-click to specify the name of the variable in the selected netCDF file, as well
-as selecting the hyperslab. If 1D coordinate variables exist (a variable that
-has the same name as a dimension) then the coordinate variable will be used to
-specify the coordinates of resulting rectilinear field file. If no coordinate
-variable exists, then the resulting field file will be uniform. Once in AVS, there
-are hundreds of analysis and display modules available for image processing, isosurface
-rendering, arbitrary slicing, alpha blending, streamline and vorticity calculation,
-particle advection, etc. AVS runs on many different platforms (Stardent, DEC,
-Cray, Convex, E and S, SET, Sun, IBM, SGI, HP, FPS and WaveTracer), and it has
-a flexible data model capable of handling multidimensional data on non-Cartesian
-grids.
-<p>The module source code and documentation is available from the <a href="http://iac.ncsc.org/">International
-  AVS Center</a>, in the <a
-href="ftp://testavs.ncsc.org/avs/AVS5/Module_Src/data_input/read_netcdf/"> ftp://testavs.ncsc.org/avs/AVS5/Module_Src/data_input/read_netcdf/</a>
-  directory.</p>
-<p>See also the information on <a href="#DDI">DDI</a> for another way to use netCDF
-  data with AVS.</p>
-<p></p>
-
-<h2><a id="BCS-UFI" name="BCS-UFI" >Barrodale UFI</a></h2>
-
-<p>
-<a href="http://www.barrodale.com" >Barrodale Computing Services
-Ltd.</a> (BCS) has developed a product that addresses one of
-the main objections heard from "technologists" (e.g., scientists,
-engineers, and other researchers) who avoid using databases to manage
-their data: "my very large data files are too
-cumbersome/difficult/slow/costly to load into a database".  In
-addition to netCDF, these files come in a variety of formats (HDF5, GRIB,
-NITFS, FITS, etc.).
-</p>
-<p>
-This BCS product is called the <a
-href="http://www.barrodale.com/bcs/universal-file-interface-ufi"
->Universal File Interface (UFI)</a>; it's a
-database extension based on the IBM Informix Virtual Table Interface
-(VTI).  <em>(Please continue reading even if you don't have
-Informix running on your system, because IBM has just made available, at
-no charge, the <a
-href="http://www-01.ibm.com/software/data/informix/innovator-c-edition/"
->Innovator-C Edition</a> of Informix.)</em>  A demo that uses UFI to
-access wind speeds can be seen <a
-href="http://www.barrodale.com/bcs/universal-file-interface-animation"
->here</a>.
-</p>
-<p>
-VTI is a technology that supports making external datasets appear as tables
-to SQL queries and statements.  UFI is a BCS database extension for
-delivering the contents of external data files as though they were rows in
-a database table.  UFI makes a file look like a set of database tables, so
-"UFI managed tables" are actually virtual database tables.   Consequently,
-users of UFI can perform SQL queries on their files without having to first
-load them into a database.
-</p>
-
-<p></p>
-
-<h2><a id=></a></h2>
-
-<h2><a id="DioVISTA/Storm" name="DioVISTA/Storm" >DioVISTA/Storm</a></h2>
-<p> <a href="http://www.hitachi-power-solutions.com/products/product03/p03_61.html"
->DioVISTA/Storm</a> is a commercial software package that visualizes content
-of netCDF files as a time series of grids, isosurfaces, and arrows on a 3D
-virtual earth. Its user interface is similar to standard 3D earth
-visualizing software. It displays OGC KML files, Shapefiles, and online
-map resources through OGC Web Tile Map Services (WTMS). It supports CF
-Conventions version 1.6 (lon-lat-alt-time axis and trajectory). Its first
-version was released on Aug 5 2014.
-</p>
-
-<p></p>
-
-<h2><a id="Environmental WorkBench"
-name="Environmental WorkBench">Environmental WorkBench</a></h2>
-<a href="http://www.ssesco.com/">SuperComputer Systems Engineering and Services
-Company</a> (SSESCO) has developed the <a
-href="http://www.ssesco.com/files/ewb.html">Environmental WorkBench</a> (EWB),
-an easy to use visualization and analysis application targeted at environmental
-data. The EWB currently has numerous users in the fields of meteorological research,
-air quality work, and groundwater remediation.
-<p>EWB system features include:</p>
-<ul>
-  <li>Random access file structure using the netCDF-based public domain MeRAF
-    file system with support for gridded, discrete (non-grid-based observation),
-    and particle types</li>
-  <li>Support for geo-referenced or Cartesian coordinate systems</li>
-  <li>Object oriented Graphical User Interface (GUI) that is very easy to use</li>
-  <li>Tools for converting model and observational data sets and data writers
-    to netCDF</li>
-  <li>Interactive rotation/translation of scenes in 3D space</li>
-  <li>Time sequencing controls to step forward/backward, animate sequentially,
-    or go to a chosen time step; including multiple asynchronous or non-uniform
-    time steps</li>
-  <li>Interactive slicers to select cross sections through 3D data sets</li>
-  <li>Display operators available on the slices, including
+      id = ncdf_open('data/april.nc')
+      ncdf_varget,id, ncdf_varid( id, 'GP'), gp
+      </pre>
+      Now you can visualize the data in the gp variable in a large variety of ways and
+      use it in other computations in IDL. You can FTP a demo version of IDL, including
+      the netCDF interface, by following the instructions in pub/idl/README available
+      via anonymous FTP from gateway.rsinc.com or boulder.colorado.edu.
+
+    <p>
+      Other software packages that use or interoperate with IDL to access netCDF
+      data includes <a href="#ARGOS">ARGOS</a>, <a
+      href="#CIDS Tools">CIDS Tools</a>, <a href="#DDI">DDI</a>, <a
+      href="#HIPHOP">HIPHOP</a>, <a
+      href="Hyperslab OPerator Suite (HOPS)">Hyperslab OPerator Suite (HOPS)</a>, and <a href="Noesys">Noesys</a>.
+    </p>
+    <p></p>
+
+    <p></p>
+    <h2><a id="InterFormat" name="InterFormat">InterFormat</a></h2>
+    <a href="http://www.radio-logic.com/">InterFormat</a> is a medical image format
+    conversion program with both Motif and character interfaces. InterFormat can automatically
+    identify and convert most popular medical image formats and write output files
+    in many standard medical image formats, or in formats such as netCDF that are
+    suitable for input to leading scientific visualization packages. InterFormat runs
+    on UNIX workstations; a version for OpenVMS is also available. A separate external
+    module for <a
+    href="#OpenDX">IBM Data Explorer</a> is available for use in IBM Data Explorer's
+    Visual Program Editor.
+    <p>
+      For more details about the formats handled, program features, and pricing,
+      see the Radio-Logic web site at <a
+      href="http://www.radio-logic.com"><http://www.radio-logic.com></a>.
+    </p>
+    <h2><a id="IRIS Explorer Module" name="IRIS Explorer Module">IRIS Explorer Module</a></h2>
+    <p>
+      The Atmospheric and Oceanic Sciences Group at the National Center for Supercomputing
+      Applications (NCSA) and the Mesoscale Dynamics and Precipitation Branch at NASA-Goddard
+      Space Flight Center have developed the NCSA PATHFINDER module set for <a
+      href="http://www.nag.co.uk:70/1h/Welcome_IEC">IRIS Explorer</a>. Two of the modules, <a
+      href="http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/explorer/ReadDFG/ReadDFG.html"> ReadDFG</a> (to output Grids), and <a
+      href="http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/explorer/ReadDF/ReadDF.html"> ReadDF</a> (to output Lattices) are capable of reading from NCSA HDF files, MFHDF/3.3
+      files, and Unidata netCDF files. A user-friendly interface provides control and
+      information about the contents of the files.
+    </p>
+    <p>
+      For ReadDF, the format translation is handled transparently. Up to five unique
+      lattices may be generated from the file (as these files can contain multiple
+      data fields) using a single module. A variety of dimensionalities and data types
+      are supported also. Multiple variables may be combined in a single lattice to
+      generate vector data. All three Explorer coordinate systems are supported.
+    </p>
+    <p>
+      With ReadDFG, user selected variables from the file are output in up to five
+      PATHFINDER grids. Each grid can consist of scalar data from one variable or
+      vector data from multiple variables. Coordinate information from the file is
+      also included in the grids. Any number of dimensions in any of the Explorer
+      coordinate types are supported.
+    </p>
+    <p>
+      For more information on the NCSA PATHFINDER project and other available modules,
+      visit the WWW/Mosaic PATHFINDER Home Page at <a
+      href="http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/top/top.html"> http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/top/top.html</a>
+      The ReadDF module may be downloaded either via the WWW server or anonymous ftp
+      at redrock.ncsa.uiuc.edu in the /pub/PATHFINDER directory. For more information
+      please send email to: pathfinder at redrock.ncsa.uiuc.edu
+    </p>
+    <p>
+      See also the information on <a href="#DDI">DDI</a> for another way to use netCDF
+      data with IRIS Explorer.
+    </p>
+    <p></p>
+    <h2><a id="LeoNetCDF" name="LeoNetCDF">LeoNetCDF</a></h2>
+    <p>
+      <a href="http://www.leokrut.com/leonetcdf.html" >LeoNetCDF</a> is a
+      Windows application (Windows96/NT and higher) for editing netCDF
+      files.  It can display content of netCDF files in tree style control
+      and permits editing its parameters in a standard Windows interface
+      environment.
+    </p>
+    <p></p>
+    <h2><a id="Mathematica" name="Mathematica">Mathematica</a></h2>
+    <p>
+      <a href="http://www.wolfram.com/products/mathematica/index.html"
+      >Mathematica</a> is a technical computing environment that provides
+      advanced numerical and symbolic computation and visualization.
+      As of version 6, Mathematica adds classic
+      <a href="http://reference.wolfram.com/mathematica/ref/format/NetCDF.html" >netCDF data</a> to the many forms of
+      data it can import, export, and visualize.
+    </p>
+    <p></p>
+    <h2><a id="MATLAB" name="MATLAB">MATLAB</a></h2>
+    <a href="http://www.mathworks.com/products/matlab/">MATLAB</a> is an integrated
+    technical computing environment that combines numeric computation, advanced graphics
+    and visualization, and a high-level programming language.
+    Versions 7.7 and later of MATLAB have built-in support for reading and
+    writing netCDF data.  MATLAB version 2012a includes the netCDF 4.1.2 library
+    with OPeNDAP client support turned on, so remote access to netCDF and
+    other data formats supported by OPeNDAP servers is available.
+    </p>
+    <p>
+      For earlier versions, several freely-available software packages that implement a MATLAB/netCDF interface
+      are available:
+      <a href="#nctoolbox" >nctoolbox</a>, <a href="#NC4ML5">NetCDF Toolbox for MATLAB-5</a>, <a href="#MexEPS">MexEPS</a>,
+      the <a
+      href="#CSIRO-MATLAB">CSIRO MATLAB/netCDF interface</a>, <a href="http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=15177&objectType=file"
+      >NetCDF reader</a>,  and <a href="/software/netcdf/Contrib.html">fanmat</a>.
+    </p>
+    <h2><a id="Noesys" name="Noesys">Noesys</a></h2>
+    <a href="http://www.rsinc.com/NOeSYS/index.cfm" >Noesys</a> is software for desktop
+    science data access and visualization. Available for both Windows and Power Macintosh
+    platforms, Noesys allows users to access, process, organize and visualize large
+    amounts of technical data.
+    <p>
+      Noesys can be used to:
+    </p>
     <ul>
-      <li>Contour lines with selectable contour levels</li>
-      <li>Color shading by data value with variable transparency level</li>
-      <li>Arrow and streamline representation for vector quantities</li>
-      <li>Positional reference lines at user selected intervals</li>
-      <li>Color coded shapes at each grid node</li>
+      <li>
+        Access and organize complex technical data
+      </li>
+      <li>
+        Export data objects to text and binary
+      </li>
+      <li>
+        View and edit large multidimensional data sets (up to 7D) in a spreadsheet-like
+        environment
+      </li>
+      <li>
+        Manipulate and process data using <a
+        href="http://www.exelisvis.com/ProductsServices/IDL.aspx">IDL®</a>, the Interactive Data Language,
+        from Research Systems, Inc.
+      </li>
+      <li>
+        Interactively visualize column, matrix, and volumetric data sets
+      </li>
+      <li>
+        Image global datasets as various map projections
+      </li>
+      <li>
+        Create various projections from partial data or partial projections from
+        global data (Windows only)
+      </li>
+      <li>
+        View and Edit HDF-EOS grid object data
+      </li>
+      <li>
+        Subset datasets and data tables with a GUI dialog
+      </li>
+      <li>
+        Change and save the number format of datasets and data table fields
+      </li>
+      <li>
+        Drag and Drop HDF objects between files to organize or subset files
+      </li>
+      <li>
+        Attach text annotations directly to the data file
+      </li>
+      <li>
+        Add new data objects to files and create hierarchical groups
+      </li>
+      <li>
+        Edit or create new color palettes
+      </li>
+      <li>
+        Generate publication-quality graphics for data presentation
+      </li>
     </ul>
-  </li>
-  <li>Multiple 3D isosurfaces at selected parameters and values with variable
-    transparency</li>
-  <li>Display of particle positions with coloring by type, height, and source</li>
-  <li>Display of discrete data using colored spheres and labels for scalar data
-    and arrows for vectors (with arrowheads or meteorological style)</li>
-  <li>Multiple user definable color maps to which isosurface and colored field
-    shading may be separately assigned</li>
-  <li>On screen annotation for generation of report ready figures</li>
-  <li>Image export in any of the common image formats (gif, tiff, encapsulated
-    postscript, etc.)</li>
-  <li>Graceful handling of missing or bad data values by all the graphics rendering
-    routines</li>
-  <li>Automatic data synchronization to allow automatic screen updating as new
-    data arrives in real-time from a model or set of sensors</li>
-  <li>Two and three dimensional interpolation from scattered observations to a
-    grid, using the Natural Neighbor Method. This robust volume based method yields
-    results far superior to distance weighting schemes.</li>
-</ul>
-<p>Systems currently supported include Win95, WinNT, OS/2, IBM RS/6000, Silicon
-  Graphics, HP and SUN workstations.</p>
-<p>SSESCO has implemented a meta-file layer on top of the netCDF library, called
-  MeRAF. It handles multiple netCDF files as well as automatic max-min calculations,
-  time-varying gridded, particle, and discrete data, logical groupings for discrete
-  data, and an overall simplified and flexible interface for storing scientific
-  data. MeRAF is being used by the DOE at the Hanford-Meteorological Site for
-  observational data and will be used for their weather-modeling.</p>
-<p></p>
-
-<h2><a id="ESRI" name="ESRI">ESRI</a></h2>
-
-<p> <a href="http://www.esri.com/software/arcgis/index.html" >ESRI
-ArcGIS</a> version 9.2 and later support <a
-href="http://webhelp.esri.com/arcgisdesktop/9.2/index.cfm?TopicName=An_overview_of_data_support_in_ArcGIS"
->accessing netCDF time-based and multidimensional data</a> that
-follows CF or COARDS conventions for associating spatial locations
-with data.  A selected slice of netCDF data may be displayed in ArcGIS
-as a raster layer, feature layer, or table.  You can also drag a
-netCDF file from Windows Explorer and drop it in an ESRI application
-such as ArcMap.  </p>
-
-<p></p>
-
-<h2><a id="FME">FME</a></h2>
-
-<p>
-<a href="http://www.safe.com/fme">FME</a>, developed by <a
-href="http://www.safe.com">Safe Software Inc.</a>, is a tool for transforming
-data for exchange between over <a href="http://www.safe.com/fme/format-search/">300
-different formats and models</a>, including netCDF. FME's
-read and write support for netCDF allows users to
-move data into the netCDF common standard, regardless
-of its source, and conversely enables end-users to consume netCDF
-data for use in their preferred systems. For more information visit <a
-href="http://www.safe.com/fme">http://www.safe.com/fme</a>.
-</p>
-
-<p></p>
-
-<h2><a id="HDF-Explorer" name="HDF-Explorer">HDF Explorer</a></h2>
-<p>
-<a href="http://www.space-research.org/" >HDF Explorer</a>
-is a data visualization program that reads the HDF, HDF5
-and netCDF data file formats (including netCDF classic format data).
-HDF Explorer runs in the Microsoft
-Windows operating systems.
-</p>
-<p>
-HDF Explorer offers a simple yet powerful interface for the
-visualization of HDF and netCDF data.  The data is just a click of the mouse
-away. Data is first viewed in a tree-like interface, and then
-optionally loaded and visualized in a variety of ways.
-HDF Explorer features include fast access to data, grid, scalar and
-vector views. It also allows exporting your data either as an ASCII
-text file or a bitmap image.
-</p>
-<p></p>
-
-<h2><a id="IDL" name="IDL">IDL Interface</a></h2>
-<a href="http://www.exelisvis.com/ProductsServices/IDL.aspx">IDL</a> (Interactive Data Language)
-is a scientific computing environment, developed and supported by <a
-href="http://www.exelisvis.com/" >Excelis Visual Information
-Solutions</a>, that combines mathematics, advanced data
-visualization, scientific graphics, and a graphical user interface toolkit to
-analyze and visualize scientific data. Designed for use by scientists and scientific
-application developers, IDL's array-oriented, fourth-generation programming
-language allows you to prototype and develop complete applications. IDL now supports
-data in netCDF format.
-<p>As an example, here is how to read data from a netCDF variable named GP in
-  a file named "data/aprin.nc" into an IDL variable named gp using the
-  IDL language:</p>
-<p></p>
-<pre>
-   id = ncdf_open('data/april.nc')
-    ncdf_varget,id, ncdf_varid( id, 'GP'), gp
-</pre>
-Now you can visualize the data in the gp variable in a large variety of ways and
-use it in other computations in IDL. You can FTP a demo version of IDL, including
-the netCDF interface, by following the instructions in pub/idl/README available
-via anonymous FTP from gateway.rsinc.com or boulder.colorado.edu.
-<p>Other software packages that use or interoperate with IDL to access netCDF
-  data includes <a href="#ARGOS">ARGOS</a>, <a
-href="#CIDS Tools">CIDS Tools</a>, <a href="#DDI">DDI</a>, <a
-href="#HIPHOP">HIPHOP</a>, <a
-href="Hyperslab OPerator Suite (HOPS)">Hyperslab OPerator Suite (HOPS)</a>, and
-  <a href="Noesys">Noesys</a>.</p>
-<p></p>
-
-<p></p>
-<h2><a id="InterFormat" name="InterFormat">InterFormat</a></h2>
-<a href="http://www.radio-logic.com/">InterFormat</a> is a medical image format
-conversion program with both Motif and character interfaces. InterFormat can automatically
-identify and convert most popular medical image formats and write output files
-in many standard medical image formats, or in formats such as netCDF that are
-suitable for input to leading scientific visualization packages. InterFormat runs
-on UNIX workstations; a version for OpenVMS is also available. A separate external
-module for <a
-href="#OpenDX">IBM Data Explorer</a> is available for use in IBM Data Explorer's
-Visual Program Editor.
-<p>For more details about the formats handled, program features, and pricing,
-  see the Radio-Logic web site at <a
-href="http://www.radio-logic.com"><http://www.radio-logic.com></a>.</p>
-<h2><a id="IRIS Explorer Module" name="IRIS Explorer Module">IRIS Explorer Module</a></h2>
-<p>
-The Atmospheric and Oceanic Sciences Group at the National Center for Supercomputing
-Applications (NCSA) and the Mesoscale Dynamics and Precipitation Branch at NASA-Goddard
-Space Flight Center have developed the NCSA PATHFINDER module set for <a
-href="http://www.nag.co.uk:70/1h/Welcome_IEC">IRIS Explorer</a>. Two of the modules,
-<a
-href="http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/explorer/ReadDFG/ReadDFG.html">
-ReadDFG</a> (to output Grids), and <a
-href="http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/explorer/ReadDF/ReadDF.html">
-ReadDF</a> (to output Lattices) are capable of reading from NCSA HDF files, MFHDF/3.3
-files, and Unidata netCDF files. A user-friendly interface provides control and
-information about the contents of the files.
-</p>
-<p>For ReadDF, the format translation is handled transparently. Up to five unique
-  lattices may be generated from the file (as these files can contain multiple
-  data fields) using a single module. A variety of dimensionalities and data types
-  are supported also. Multiple variables may be combined in a single lattice to
-  generate vector data. All three Explorer coordinate systems are supported.</p>
-<p>With ReadDFG, user selected variables from the file are output in up to five
-  PATHFINDER grids. Each grid can consist of scalar data from one variable or
-  vector data from multiple variables. Coordinate information from the file is
-  also included in the grids. Any number of dimensions in any of the Explorer
-  coordinate types are supported.</p>
-<p>For more information on the NCSA PATHFINDER project and other available modules,
-  visit the WWW/Mosaic PATHFINDER Home Page at <a
-href="http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/top/top.html"> http://redrock.ncsa.uiuc.edu/PATHFINDER/pathrel2/top/top.html</a>
-  The ReadDF module may be downloaded either via the WWW server or anonymous ftp
-  at redrock.ncsa.uiuc.edu in the /pub/PATHFINDER directory. For more information
-  please send email to: pathfinder at redrock.ncsa.uiuc.edu</p>
-<p>See also the information on <a href="#DDI">DDI</a> for another way to use netCDF
-  data with IRIS Explorer.</p>
-<p></p>
-<h2><a id="LeoNetCDF" name="LeoNetCDF">LeoNetCDF</a></h2>
-<p>
-<a href="http://www.leokrut.com/leonetcdf.html" >LeoNetCDF</a> is a
-Windows application (Windows96/NT and higher) for editing netCDF
-files.  It can display content of netCDF files in tree style control
-and permits editing its parameters in a standard Windows interface
-environment.
-</p>
-<p></p>
-<h2><a id="Mathematica" name="Mathematica">Mathematica</a></h2>
-<p>
-<a href="http://www.wolfram.com/products/mathematica/index.html"
->Mathematica</a> is a technical computing environment that provides
-advanced numerical and symbolic computation and visualization.
-As of version 6, Mathematica adds classic
-<a href="http://reference.wolfram.com/mathematica/ref/format/NetCDF.html" >netCDF data</a> to the many forms of
-data it can import, export, and visualize.
-</p>
-<p></p>
-<h2><a id="MATLAB" name="MATLAB">MATLAB</a></h2>
-<a href="http://www.mathworks.com/products/matlab/">MATLAB</a> is an integrated
-technical computing environment that combines numeric computation, advanced graphics
-and visualization, and a high-level programming language.
-Versions 7.7 and later of MATLAB have built-in support for reading and
-writing netCDF data.  MATLAB version 2012a includes the netCDF 4.1.2 library
-with OPeNDAP client support turned on, so remote access to netCDF and
-other data formats supported by OPeNDAP servers is available.
-</p>
-<p>For earlier versions, several freely-available software packages that implement a MATLAB/netCDF interface
-  are available:
-<a href="#nctoolbox" >nctoolbox</a>,
-<a href="#NC4ML5">NetCDF Toolbox for MATLAB-5</a>, <a href="#MexEPS">MexEPS</a>,
-  the <a
-href="#CSIRO-MATLAB">CSIRO MATLAB/netCDF interface</a>,
-<a href="http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=15177&objectType=file"
->NetCDF reader</a>,  and
-<a href="/software/netcdf/Contrib.html">fanmat</a>.</p>
-<h2><a id="Noesys" name="Noesys">Noesys</a></h2>
-<a href="http://www.rsinc.com/NOeSYS/index.cfm" >Noesys</a> is software for desktop
-science data access and visualization. Available for both Windows and Power Macintosh
-platforms, Noesys allows users to access, process, organize and visualize large
-amounts of technical data.
-<p>Noesys can be used to:</p>
-<ul>
-  <li>Access and organize complex technical data</li>
-  <li>Export data objects to text and binary</li>
-  <li>View and edit large multidimensional data sets (up to 7D) in a spreadsheet-like
-    environment</li>
-  <li>Manipulate and process data using <a
-href="http://www.exelisvis.com/ProductsServices/IDL.aspx">IDL®</a>, the Interactive Data Language,
-    from Research Systems, Inc.</li>
-  <li>Interactively visualize column, matrix, and volumetric data sets</li>
-  <li>Image global datasets as various map projections</li>
-  <li>Create various projections from partial data or partial projections from
-    global data (Windows only)</li>
-  <li>View and Edit HDF-EOS grid object data</li>
-  <li>Subset datasets and data tables with a GUI dialog</li>
-  <li>Change and save the number format of datasets and data table fields</li>
-  <li>Drag and Drop HDF objects between files to organize or subset files</li>
-  <li>Attach text annotations directly to the data file</li>
-  <li>Add new data objects to files and create hierarchical groups</li>
-  <li>Edit or create new color palettes</li>
-  <li>Generate publication-quality graphics for data presentation</li>
-</ul>
-<p>Noesys has an interface to IDL®, allowing data to move back and forth between
-  Noesys and IDL with the click of a mouse. Noesys includes the visual data analysis
-  tools, Transform, T3D and Plot, for menu driven plotting, rendering, and image
-  analysis. Noesys can import HDF, HDF-EOS, netCDF, ASCII, Binary, DTED, GeoTIFF,
-  SDTS, TIFF, PICT, and BMP files, create annotations, macros, images, projections
-  and color palettes specific to the data and save it the result as an HDF file.
-  Noesys also includes an HDF-EOS Grid Editor. Noesys runs on Windows 95/98 &
-  NT and Power Macintosh OS. More details and information about ordering Noesys
-  are available from <a
-href="http://www.rsinc.com/NOeSYS/index.cfm"><http://www.rsinc.com/NOeSYS/index.cfm></a>.</p>
-
-<h2><a id="Origin" name="Origin">Origin</a></h2>
-
-<p>Ryan Toomey reports:
-
-<p>Our website is
-<a href="http://www.originlab.com/" >http://www.originlab.com/</a>
-</p>
-<p>A general description of Origin: Origin includes a suite of features
-that cater to the needs of scientists and engineers alike. Multi-sheet
-workbooks, publication-quality graphics, and standardized analysis
-tools provide a tightly integrated workspace for you to import data,
-create and annotate graphs, explore and analyze data, and publish your
-work. To ensure that Origin meets your data analysis requirements,
-intuitive tools for advanced statistics, regression, nonlinear curve
-fitting, signal processing, image processing and peak analysis are
-built-in. Since any analysis operation can be set to automatically
-recalculate, you can reuse your projects as templates for future work,
-thereby simplifying your daily routine.
-</p>
-<p>A general description of OriginPro: OriginPro offers all of the
-features of Origin plus extended analysis tools for statistics, 3D
-fitting, image processing and signal processing.
-</p>
-<p>
-A general description of OriginLab Corporation: "OriginLab Corporation
-produces professional data analysis and graphing software for
-scientists and engineers. Our products are designed to be easy-to-use,
-yet have the power and versatility to provide for the most demanding
-user."
-</p>
-
-<h2><a id="PPLUS" name="PPLUS">PPLUS</a></h2>
-<a href="http://dwd6.home.mindspring.com/">Plot-Plus (PPLUS)</a> is a general
-purpose scientific graphics package, which is used in several PMEL applications.
-It will read most standard ascii or binary files, as well as netCDF file format,
-which used by the TOGA-TAO Project and the EPIC system for management display
-and analysis. PPLUS is an interactive, command driven, scientific graphics package
-which includes features such as Mercator projection, Polar Stereographic projection,
-color or gray scale area-fill contour plotting, and support for many devices:
-X-windows, PostScript, HP, Tektronix, and others. This powerful and flexible package
-recognizes netCDF data format, and it can extract axis lables and graph titles
-from the data files. The user can customize a plots, or combine several plots
-into a composite. Plots are of publication quality. The PPLUS graphics package
-is used for all the TAO workstation displays, including the animations. The animations
-are created by generating a PPLUS plot for each frame, transforming the PPLUS
-metacode files into HDF format with the PPLUS m2hdf filter, and then displaying
-the resulting bit maps as an animation with the XDataSlice utility, which is freely
-available on Internet from the National Center for Supercomputing Applications,
-at anonymous at ftp.ncsa.uiuc.edu (141.142.20.50). There is also a new m2gif utility
-which produces GIF files from PPLUS metacode files.
-<p>PPLUS is supported for most Unix systems and for VAX/VMS, and is in use at
-  many oceanographic institutes in the US (e.g., (PMEL, Harvard, WHOI, Scripps,
-  NCAR, NASA, University of Rhode Island, University of Oregon, Texas A&M...)
-  and also internationally (Japan, Germany, Australia, Korea...). </p>
-<p>Plot Plus is now available at no charge. It does require licensing on a per
-  computer basis, but the license is at no cost. For more information about licensing,
-  see <a
-href="http://dwd6.home.mindspring.com/pplus_license.html">http://dwd6.home.mindspring.com/pplus_license.html/</a>;
-  source and documentation are available via anonymous FTP from <a
-href="ftp://ftp.halcyon.com/pub/users/dwd/pplus1_3_2.tar.gz">ftp://ftp.halcyon.com/pub/users/dwd/pplus1_3_2.tar.gz</a>
-  and <a
-href="ftp://ftp.pmel.noaa.gov/epic/manual-dir/pplus.pdf">ftp://ftp.pmel.noaa.gov/epic/manual-dir/pplus.pdf</a>.</p>
-<pre>
-    Email:      plot_plus at halcyon.com
-    Postal mail:    c/o Donald Denbo
-            2138 N 186th St
-            Shoreline, WA 98133
-    Fax and Voice:  (206) 366-0624
-</pre>
-<h2><a id="PV-Wave" name="PV-Wave">PV-Wave</a></h2>
-<a href="http://www.vni.com/products/wave/index.html">PV-Wave</a> is a software
-environment from <a href="http://www.vni.com/">Visual Numerics</a> for solving
-problems requiring the application of graphics, mathematics, numerics and statistics
-to data and equations.
-<p>PV-WAVE uses a fourth generation language (4GL) that analyzes and displays
-  data as you enter commands. PV-WAVE includes integrated graphics, numerics,
-  data I/O, and data management. The latest version of PV-Wave supports data access
-  in numerous formats, including netCDF.</p>
-<p>See also the information on <a href="#DDI">DDI</a> for another way to use netCDF
-  data with PV-Wave.</p>
-<p></p>
-<h2><a id="SlicerDicer" name="SlicerDicer">Slicer Dicer</a></h2>
-<a href="http://www.slicerdicer.com/">Slicer Dicer</a> is a volumetric data visualization
-tool, currently available for Windows and under development for other platforms.
-The Slicer Dicer Web site includes a complete list of features, an on-line user's
-guide, and examples of Slicer Dicer output. Visualizations features include:
-<ul>
-  <li>Perspective view of data rendered on interactively selected orthogonal slices,
-    oblique slices, blocks (arbitrary rectilinear sub-volumes), cutouts, isosurfaces,
-    and projected volumes (projected maximum, minimum, maximum absolute, or minimum
-    absolute).</li>
-  <li>Optional annotations: caption, axes ticks and labels (default "pretty"
-    ticks, or override to place ticks where you want them), color legend, data-cube
-    outline.</li>
-  <li>Animation modes: slices, space, time (any parametric dimension), transparency,
-    oblique slice orientation, rotation. Built-in animation viewer supports speed
-    and image size controls, single-step, forward, backward, loop, and back-and-forth
-    modes.</li>
-  <li>Select color scale from 25+ built in color tables, or import from palette
-    file. Any data level or range of levels can be painted with an arbitrary color.</li>
-  <li>Any data level or range of levels can be rendered as either opaque or transparent.</li>
-</ul>
-<p></p>
-<h2><a id="Surfer" name="Surfer">Surfer</a></h2>
-<p>
-<a href="http://www.goldensoftware.com/products/surfer">Surfer</a> is a
-full-function contouring, gridding and 3D surface mapping
-visualization software package. Surfer's sophisticated
-interpolation engine transforms XYZ data into
-publication-quality maps. Surfer imports from and exports to
-a multitude of file formats, including NetCDF grids.</p>
-
-<h2><a id="vGeo" name="vGeo">vGeo</a></h2>
-<p> <a href="http://www.vrco.com/products/vgeo/vgeo.html" >vGeo</a> (Virtual Global
-  Explorer and Observatory) is an end-user product from <a href="http://www.vrco.com/" >VRCO</a>
-  designed to import and visualize multiple disparate data sets, including computer
-  simulations, observed measurements, images, model objects, and more. vGeo is
-  available for IRIX, Linux and Windows platforms and supports displays ranging
-  from desktop monitors to multi-walled projection systems. It accepts data in
-  a variety of formats, including netCDF, and allows the user to specify how multiple
-  files and variables are mapped into a data source. 3D graphics are built from
-  the underlying data in real-time, and the user has interactive control of graphics,
-  navigation, animation, and more. </p>
-<p></p>
-<h2><a id="VISAGE and Decimate" name="VISAGE and Decimate">VISAGE and Decimate</a></h2>
-<p> <a
-href="http://www.crd.ge.com/esl/cgsp/projects/visage/">VISAGE</a> (VISualization,
-  Animation, and Graphics Environment) is a turnkey 3D visualization system developed
-  at General Electric Corporate Research and Development, (Schroeder, WJ et al,
-  "VISAGE: An Object-Oriented Scientific Visualization System", Proceedings
-  of Visualization `92 Conference). VISAGE is designed to interface with a wide
-  variety of data, and uses netCDF as the preferred format. </p>
-<p>VISAGE is used at GE Corporate R & D, GE Aircraft Engine, GE Canada, GE
-  Power Generation, as well as ETH Zurich, Switzerland, MQS In Chieti, Italy,
-  and Rensselaer Polytechnic Institute in Troy, New York.</p>
-<p>GE has another application called "Decimate" that does polygon reduction/decimation
-  (Schroeder,WJ et al, "Decimation of Triangle Meshes", Proceedings
-  of SIGGRAPH `92). This application uses netCDF as a preferred format. Decimate
-  is currently licensed to Cyberware, Inc., makers of 3D laser digitizing hardware.
-  Decimate is currently bundled with the scanners, and will soon be available
-  as a commercial product.</p>
-<p></p>
-<h2><a id="Voyager" name="Voyager">Voyager</a></h2>
-<p>
-<a href="http://voyager.makai.com/" >Makai Voyager</a>, developed by
-Makai Ocean Engineering, Inc., is 3D/4D
-geospatial visualization software that enables users to import, fuse, view, and analyze large
-earth, ocean, and atmosphere scientific data as it is collected or
-simulated in a global geo-referenced GIS platform. The key differentiator
-of Makai Voyager is its level-of-detail (LOD) technology that enables
-users to stream big data rapidly over a network or the web.
-</p>
-Features in Makai Voyager Version 1.2 include:<p>
-</p>
-<ul>
-  <li>Preprocessing LiDAR, GIS, & volumetric data from common formats
-  into streamable files</li>
-  <li>Volume rendering for large 4D (3D + time) data, such as
-  NetCDF</li>
-  <li>Analysis tools and customizable graphs</li>
-  <li>WMS and other streamable formats</li>
-</ul>
-<p>
-Individual or group licenses are available for Windows (32- and
-64-bit), Linux, and Mac OS X.
-A full-featured 30-day trial version of Makai Voyager is <a
-href="http://voyager.makai.com " >available for download</a>.
-</p>
-<hr>
-
-<!-- InstanceEndEditable -->
-</body>
+    <p>
+      Noesys has an interface to IDL®, allowing data to move back and forth between
+      Noesys and IDL with the click of a mouse. Noesys includes the visual data analysis
+      tools, Transform, T3D and Plot, for menu driven plotting, rendering, and image
+      analysis. Noesys can import HDF, HDF-EOS, netCDF, ASCII, Binary, DTED, GeoTIFF,
+      SDTS, TIFF, PICT, and BMP files, create annotations, macros, images, projections
+      and color palettes specific to the data and save it the result as an HDF file.
+      Noesys also includes an HDF-EOS Grid Editor. Noesys runs on Windows 95/98 &
+      NT and Power Macintosh OS. More details and information about ordering Noesys
+      are available from <a
+      href="http://www.rsinc.com/NOeSYS/index.cfm"><http://www.rsinc.com/NOeSYS/index.cfm></a>.
+    </p>
+
+    <h2><a id="Origin" name="Origin">Origin</a></h2>
+
+    <p>
+      Ryan Toomey reports:
+
+    <p>
+      Our website is <a href="http://www.originlab.com/" >http://www.originlab.com/</a>
+    </p>
+    <p>
+      A general description of Origin: Origin includes a suite of features
+      that cater to the needs of scientists and engineers alike. Multi-sheet
+      workbooks, publication-quality graphics, and standardized analysis
+      tools provide a tightly integrated workspace for you to import data,
+      create and annotate graphs, explore and analyze data, and publish your
+      work. To ensure that Origin meets your data analysis requirements,
+      intuitive tools for advanced statistics, regression, nonlinear curve
+      fitting, signal processing, image processing and peak analysis are
+      built-in. Since any analysis operation can be set to automatically
+      recalculate, you can reuse your projects as templates for future work,
+      thereby simplifying your daily routine.
+    </p>
+    <p>
+      A general description of OriginPro: OriginPro offers all of the
+      features of Origin plus extended analysis tools for statistics, 3D
+      fitting, image processing and signal processing.
+    </p>
+    <p>
+      A general description of OriginLab Corporation: "OriginLab Corporation
+      produces professional data analysis and graphing software for
+      scientists and engineers. Our products are designed to be easy-to-use,
+      yet have the power and versatility to provide for the most demanding
+      user."
+    </p>
+
+    <h2><a id="PPLUS" name="PPLUS">PPLUS</a></h2>
+    <a href="http://dwd6.home.mindspring.com/">Plot-Plus (PPLUS)</a> is a general
+    purpose scientific graphics package, which is used in several PMEL applications.
+    It will read most standard ascii or binary files, as well as netCDF file format,
+    which used by the TOGA-TAO Project and the EPIC system for management display
+    and analysis. PPLUS is an interactive, command driven, scientific graphics package
+    which includes features such as Mercator projection, Polar Stereographic projection,
+    color or gray scale area-fill contour plotting, and support for many devices:
+    X-windows, PostScript, HP, Tektronix, and others. This powerful and flexible package
+    recognizes netCDF data format, and it can extract axis lables and graph titles
+    from the data files. The user can customize a plots, or combine several plots
+    into a composite. Plots are of publication quality. The PPLUS graphics package
+    is used for all the TAO workstation displays, including the animations. The animations
+    are created by generating a PPLUS plot for each frame, transforming the PPLUS
+    metacode files into HDF format with the PPLUS m2hdf filter, and then displaying
+    the resulting bit maps as an animation with the XDataSlice utility, which is freely
+    available on Internet from the National Center for Supercomputing Applications,
+    at anonymous at ftp.ncsa.uiuc.edu (141.142.20.50). There is also a new m2gif utility
+    which produces GIF files from PPLUS metacode files.
+    <p>
+      PPLUS is supported for most Unix systems and for VAX/VMS, and is in use at
+      many oceanographic institutes in the US (e.g., (PMEL, Harvard, WHOI, Scripps,
+      NCAR, NASA, University of Rhode Island, University of Oregon, Texas A&M...)
+      and also internationally (Japan, Germany, Australia, Korea...).
+    </p>
+    <p>
+      Plot Plus is now available at no charge. It does require licensing on a per
+      computer basis, but the license is at no cost. For more information about licensing,
+      see <a
+      href="http://dwd6.home.mindspring.com/pplus_license.html">http://dwd6.home.mindspring.com/pplus_license.html/</a>;
+      source and documentation are available via anonymous FTP from <a
+      href="ftp://ftp.halcyon.com/pub/users/dwd/pplus1_3_2.tar.gz">ftp://ftp.halcyon.com/pub/users/dwd/pplus1_3_2.tar.gz</a>
+      and <a
+      href="ftp://ftp.pmel.noaa.gov/epic/manual-dir/pplus.pdf">ftp://ftp.pmel.noaa.gov/epic/manual-dir/pplus.pdf</a>.
+    </p>
+    <pre>
+      Email:      plot_plus at halcyon.com
+      Postal mail:    c/o Donald Denbo
+      2138 N 186th St
+      Shoreline, WA 98133
+      Fax and Voice:  (206) 366-0624
+      </pre>
+    <h2><a id="PV-Wave" name="PV-Wave">PV-Wave</a></h2>
+    <a href="http://www.vni.com/products/wave/index.html">PV-Wave</a> is a software
+    environment from <a href="http://www.vni.com/">Visual Numerics</a> for solving
+    problems requiring the application of graphics, mathematics, numerics and statistics
+    to data and equations.
+    <p>
+      PV-WAVE uses a fourth generation language (4GL) that analyzes and displays
+      data as you enter commands. PV-WAVE includes integrated graphics, numerics,
+      data I/O, and data management. The latest version of PV-Wave supports data access
+      in numerous formats, including netCDF.
+    </p>
+    <p>
+      See also the information on <a href="#DDI">DDI</a> for another way to use netCDF
+      data with PV-Wave.
+    </p>
+    <p></p>
+    <h2><a id="SlicerDicer" name="SlicerDicer">Slicer Dicer</a></h2>
+    <a href="http://www.slicerdicer.com/">Slicer Dicer</a> is a volumetric data visualization
+    tool, currently available for Windows and under development for other platforms.
+    The Slicer Dicer Web site includes a complete list of features, an on-line user's
+    guide, and examples of Slicer Dicer output. Visualizations features include:
+    <ul>
+      <li>
+        Perspective view of data rendered on interactively selected orthogonal slices,
+        oblique slices, blocks (arbitrary rectilinear sub-volumes), cutouts, isosurfaces,
+        and projected volumes (projected maximum, minimum, maximum absolute, or minimum
+        absolute).
+      </li>
+      <li>
+        Optional annotations: caption, axes ticks and labels (default "pretty"
+        ticks, or override to place ticks where you want them), color legend, data-cube
+        outline.
+      </li>
+      <li>
+        Animation modes: slices, space, time (any parametric dimension), transparency,
+        oblique slice orientation, rotation. Built-in animation viewer supports speed
+        and image size controls, single-step, forward, backward, loop, and back-and-forth
+        modes.
+      </li>
+      <li>
+        Select color scale from 25+ built in color tables, or import from palette
+        file. Any data level or range of levels can be painted with an arbitrary color.
+      </li>
+      <li>
+        Any data level or range of levels can be rendered as either opaque or transparent.
+      </li>
+    </ul>
+    <p></p>
+    <h2><a id="Surfer" name="Surfer">Surfer</a></h2>
+    <p>
+      <a href="http://www.goldensoftware.com/products/surfer">Surfer</a> is a
+      full-function contouring, gridding and 3D surface mapping
+      visualization software package. Surfer's sophisticated
+      interpolation engine transforms XYZ data into
+      publication-quality maps. Surfer imports from and exports to
+      a multitude of file formats, including NetCDF grids.
+    </p>
+
+    <h2><a id="vGeo" name="vGeo">vGeo</a></h2>
+    <p>
+      <a href="http://www.vrco.com/products/vgeo/vgeo.html" >vGeo</a> (Virtual Global
+      Explorer and Observatory) is an end-user product from <a href="http://www.vrco.com/" >VRCO</a>
+      designed to import and visualize multiple disparate data sets, including computer
+      simulations, observed measurements, images, model objects, and more. vGeo is
+      available for IRIX, Linux and Windows platforms and supports displays ranging
+      from desktop monitors to multi-walled projection systems. It accepts data in
+      a variety of formats, including netCDF, and allows the user to specify how multiple
+      files and variables are mapped into a data source. 3D graphics are built from
+      the underlying data in real-time, and the user has interactive control of graphics,
+      navigation, animation, and more.
+    </p>
+    <p></p>
+    <h2><a id="VISAGE and Decimate" name="VISAGE and Decimate">VISAGE and Decimate</a></h2>
+    <p>
+      <a
+      href="http://www.crd.ge.com/esl/cgsp/projects/visage/">VISAGE</a> (VISualization,
+      Animation, and Graphics Environment) is a turnkey 3D visualization system developed
+      at General Electric Corporate Research and Development, (Schroeder, WJ et al,
+      "VISAGE: An Object-Oriented Scientific Visualization System", Proceedings
+      of Visualization `92 Conference). VISAGE is designed to interface with a wide
+      variety of data, and uses netCDF as the preferred format.
+    </p>
+    <p>
+      VISAGE is used at GE Corporate R & D, GE Aircraft Engine, GE Canada, GE
+      Power Generation, as well as ETH Zurich, Switzerland, MQS In Chieti, Italy,
+      and Rensselaer Polytechnic Institute in Troy, New York.
+    </p>
+    <p>
+      GE has another application called "Decimate" that does polygon reduction/decimation
+      (Schroeder,WJ et al, "Decimation of Triangle Meshes", Proceedings
+      of SIGGRAPH `92). This application uses netCDF as a preferred format. Decimate
+      is currently licensed to Cyberware, Inc., makers of 3D laser digitizing hardware.
+      Decimate is currently bundled with the scanners, and will soon be available
+      as a commercial product.
+    </p>
+    <p></p>
+    <h2><a id="Voyager" name="Voyager">Voyager</a></h2>
+    <p>
+      <a href="http://voyager.makai.com/" >Makai Voyager</a>, developed by
+      Makai Ocean Engineering, Inc., is 3D/4D
+      geospatial visualization software that enables users to import, fuse, view, and analyze large
+      earth, ocean, and atmosphere scientific data as it is collected or
+      simulated in a global geo-referenced GIS platform. The key differentiator
+      of Makai Voyager is its level-of-detail (LOD) technology that enables
+      users to stream big data rapidly over a network or the web.
+    </p>
+    <p>
+      Features in Makai Voyager Version 1.2 include:
+    </p>
+    <ul>
+      <li>
+        Preprocessing LiDAR, GIS, & volumetric data from common formats
+        into streamable files
+      </li>
+      <li>
+        Volume rendering for large 4D (3D + time) data, such as
+        NetCDF
+      </li>
+      <li>
+        Analysis tools and customizable graphs
+      </li>
+      <li>
+        WMS and other streamable formats
+      </li>
+    </ul>
+    <p>
+      Individual or group licenses are available for Windows (32- and
+      64-bit), Linux, and Mac OS X.
+      A full-featured 30-day trial version of Makai Voyager is <a
+      href="http://voyager.makai.com " >available for download</a>.
+    </p>
+    <hr>
+
+    <!-- InstanceEndEditable -->
+  </body>
 </html>
 
-
 <!-- InstanceEnd -->
diff --git a/docs/static-pages/usage.html b/docs/static-pages/usage.html
new file mode 100644
index 0000000..d0387b3
--- /dev/null
+++ b/docs/static-pages/usage.html
@@ -0,0 +1,521 @@
+<html>
+  <!-- InstanceBegin template="../../../Templates/MyUnidata.dwt" codeOutsideHTMLIsLocked="true" -->
+
+  <head>
+    <!-- InstanceBeginEditable name="Title" -->
+    <TITLE>Where is NetCDF Used?</TITLE>
+    <!-- InstanceEndEditable -->
+    <!-- InstanceBeginEditable name="META Information" -->
+    <META NAME="UIINDEX" CONTENT="0">
+    <META NAME="BOOKMARK" CONTENT="NetCDF Usage">
+    <META NAME="AUTHOR" CONTENT="russ">
+    <META NAME="KEYWORDS" CONTENT="netcdf, use, usage, who, where">
+    <META NAME="DESCRIPTION" CONTENT="The netcdfgroup at unidata.ucar.edu mailing list has over 500 addresses in 32 countries. Several groups have adopted netCDF as a standard way to represent some forms of scientific data.">
+    <!-- InstanceEndEditable -->
+  </head>
+
+  <body>
+    <!-- InstanceBeginEditable name="Content Goes Here" -->
+    <A NAME="netcdf" ID="netcdf"></A>
+    <h1>Where is NetCDF Used?</h1>
+    <p>
+      Making the software available freely available without registration
+      makes it difficult
+      to know where and how netCDF is being used, but we have compiled a
+      <a
+      href="http://www.unidata.ucar.edu/committees/usercom/2013Apr/statusreports/metrics/downloads/session/netcdf/known_sites_list_per_year.html"
+      >list</a> of over 1300 educational, research, and government sites that have
+      recently made some use of netCDF, based on
+      <ol>
+        <li>
+          downloads from the Unidata site (ftp and http)
+        </li>
+        <li>
+          subscribers and posters to netCDF mailing lists
+        </li>
+        <li>
+          email support requests
+        </li>
+        <li>
+          participation in annual netCDF workshops
+        </li>
+      </ol>
+      during the period from 2012-04-01 through 2013-04-01.
+    </p>
+    <p>
+      Recent standardization efforts have resulted in <a href="docs/standards.html" >netCDF endorsements</a> by
+      several standards bodies.
+    </p>
+    <p>
+      Here is a partial list
+      of organizations using netCDF for archiving and
+      accessing some of their data:
+    </p>
+    <ul>
+      <li>
+        NOAA:
+        <ul>
+          <li>
+            GFDL
+          </li>
+          <li>
+            NOAA NODC (National Oceanographic Data Center)
+          </li>
+          <li>
+            NCEP NOMADS service
+          </li>
+          <li>
+            PMEL
+          </li>
+          <li>
+            FSL
+          </li>
+          <li>
+            NCDC NOMADS service
+          </li>
+          <li>
+            NDBC (National Buoy Data Center)
+          </li>
+          <li>
+            NOS/COOPS
+          </li>
+          <li>
+            NMFS/PFEL
+          </li>
+          <li>
+            ESRL (formerly CDC)
+          </li>
+        </ul>
+      </li>
+      <li>
+        EUMETSAT Data Centre
+      </li>
+      <li>
+        GOES-R Ground Segment Products
+      </li>
+      <li>
+        DOE/PCMDI CMIP5 climate model outputs
+      </li>
+      <li>
+        NASA/JPL
+      </li>
+      <li>
+        NASA/GSFC
+      </li>
+      <li>
+        GHRSST-PP community
+      </li>
+      <li>
+        US Navy/ Fleet Numerical/GODAE Data Server
+      </li>
+      <li>
+        OceanSITES.org
+      </li>
+      <li>
+        National Snow and Ice Data Center (NSIDC)
+      </li>
+      <li>
+        USGS, Woods Hole Field Center (WHFC)
+      </li>
+      <li>
+        National Center for Atmospheric Research (NCAR)
+      </li>
+      <li>
+        Center for Ocean-Land-Atmosphere Studies (COLA)
+      </li>
+      <li>
+        George Mason University (GMU) Center for Earth Observing and Space Research
+      </li>
+      <li>
+        Asia-Pacific Data-Research Center (APDRC)
+      </li>
+      <li>
+        (Australia) CSIRO Marine and Atmospheric Research (CMAR) Remote Sensing
+      </li>
+      <li>
+        (Australia) Centre for Australian Weather and Climate Research (CAWCR)
+      </li>
+      <li>
+        (France) AVISO (satellite data)
+      </li>
+      <li>
+        (France) French Research Institute for Exploitation of the Sea (IFREMER)
+      </li>
+      <li>
+        (Germany) Federal Waterways Engineering and Research Institute (BAW)
+      </li>
+      <li>
+      	(Germany) German Aerospace Agency (DLR)
+      </li>
+      <li>
+        (Italy) International Centre for Theoretical Physics (ICTP)
+      </li>
+      <li>
+        (South Korea) Seoul National University (SNU)
+      </li>
+      <li>
+        (Netherlands) European Climate Assessment (ECA), Atmospheric
+        Data Access for the Geospatial User Community (ADAGUC) product standard
+      </li>
+      <li>
+        (Netherlands) Cabauw Experimental Site for Atmospheric Research (CESAR)
+      </li>
+    </ul>
+    <p>
+      We list below brief descriptions of some of the projects
+      and groups that have reported on their use of netCDF.
+    </p>
+
+    <p></p>
+    <hr />
+    <ul>
+      <li>
+        Several commercial analysis and data visualization packages have been adapted
+        to access netCDF data. For more information about these and about freely-available
+        software packages that can be used to display, analyze, and manipulate netCDF
+        data, see the <a
+        href="/software/netcdf/software.html">http://www.unidata.ucar.edu/software/netcdf/software.html</a>
+        document.
+        <p></p>
+      </li>
+      <li>
+        NOAA's <a href="http://www.cdc.noaa.gov">Climate Analysis
+        Branch (CAB)</a>, conducts diagnostic studies of climate variability
+        on time scales of months to centuries. CAB climatological data is
+        archived in netCDF format.
+        This site gives access to metadata (information about these datasets) which
+        can be searched by various keywords; actual data can be subset or plotted
+        on-line and can be downloaded via ftp.
+        <p></p>
+      </li>
+      <li>
+        Modeling groups contributing output to the Intergovernmental
+        Panel on Climate Change (IPCC)
+        model archives at the Program for Climate Model Diagnosis and
+        Intercomparison (PCMDI) are <a href="http://www-pcmdi.llnl.gov/ipcc/IPCC_output_requirements.htm" >required</a> to provide files in netCDF
+        conforming with the NetCDF Climate and Forecast (CF) Metadata
+        Conventions.
+        <p></p>
+      </li>
+
+      <li>
+        EUMETSAT has begun to offer netCDF as a common delivery format
+        for <a
+        href="http://www.eumetsat.int/Home/Main/DataAccess/EUMETSATDataCentre/SP_20111027152034196?l=en)"
+        >popular datasets</a> ordered from their archive.  The developed
+        datasets use netCDF-4 classic model format.
+        <p></p>
+      </li>
+
+      <li>
+        NASA's Halogen Occultation Experiment ( <a
+        href="http://haloedata.larc.nasa.gov/">HALOE</a>) makes HALOE data available in
+        netCDF form. The <a
+        href="http://haloedata.larc.nasa.gov/haloe_data_2.html">HALOE Data Viewer</a>
+        provides each data type with a menu driven interface to assist in locating
+        files based on date, time, species, data version and mode.
+        <p></p>
+      </li>
+      <li>
+        The global ocean modeling effort at Los Alamos National Laboratory (LANL),
+        as part of the DOE <a
+        href="http://www.esd.ornl.gov/programs/chammp/chammp.html">CHAMMP</a> effort and
+        one of the DOE Grand Challenges, has selected netCDF as the archival format
+        for its computational data. An effort to bring netCDF up on the parallel disks
+        on the CM-5 is planned to begin shortly.
+        <p></p>
+      </li>
+      <li>
+        The National Center for Supercomputing Applications has incorporated the
+        netCDF 2.3 interfaces into the latest release of their <a href="http://hdf.ncsa.uiuc.edu/">HDF</a>
+        software, permitting HDF tools that use this interface to be applied to netCDF
+        datasets that are either XDR- or HDF-encoded.
+        <p></p>
+      </li>
+      <li>
+        The Computer Planning Committee of NOAA's Pacific Marine Environmental
+        Laboratory (PMEL) endorsed netCDF as the preferred data format for the Laboratory
+        in early 1993. PMEL has developed two freely-distributed applications that
+        utilize NetCDF -- the EPIC system (for observational data) and Ferret (gridded
+        data).
+        <p>
+          <a href="http://www.pmel.noaa.gov/epic">EPIC</a> is a system for management,
+          display and analysis of oceanographic time series and hydrographic data.
+          EPIC toolkits for netCDF include a data file I/O library, which is layered
+          on top of the netCDF library, a netCDF calculator (nccalc) linked with a
+          scientific graphics package (PPLUS), a suite of display and analysis programs
+          for oceanographic data, and a <a
+          href="http://www.pmel.noaa.gov/epic/mexeps.html">MATLAB interface</a> to netCDF.
+        </p>
+        <p>
+          <a href="http://www.pmel.noaa.gov/ferret/home.html">Ferret</a> is a visualization
+          and analysis program, also built upon the PPLUS program, that permits users
+          to explore large and complex gridded data sets. New variables may be defined
+          interactively as mathematical transformations. Complex analyses proceed
+          as hierarchical variable definitions. Visit <a
+          href="http://ferret.wrc.noaa.gov/fbin/climate_server">Live Access to Climate Data</a>
+          for a better sense of the Ferret program.
+        </p>
+        <p></p>
+      </li>
+      <li>
+        <a href="http://www.ldeo.columbia.edu/">Lamont-Doherty Earth Observatory</a>
+        of Columbia University has converted all Marine Geophysics data (gravity,
+        magnetics and bathymetry) acquired in the past 40 years by scientists at L-DEO
+        as well as at other institutions to netCDF. The <a
+        href="http://www.ldeo.columbia.edu/~mggdb/">Marine Geology & Geophysics Database</a>
+        is a fundamental resource for Lamont scientists and students.
+        <p></p>
+      </li>
+      <li>
+        The <a href="http://www.soest.hawaii.edu/gmt">Generic Mapping Tools (GMT)</a>,
+        a set of command-line tools for data manipulation and display using PostScript,
+        make use of netCDF for storage of 2-D gridded data sets. GMT is used worldwide
+        by about 6000 scientists, according to the developers.
+        <p></p>
+      </li>
+      <li>
+        <a href="http://www.epa.gov/asmdnerl/mod3.html">The Models-3 Project</a>,
+        being cooperatively pursued by the EPA's Atmospheric Research Laboratory
+        and by North Carolina Supercomputing Center, is using an environmental-modeling-specific
+        applications programming interface on top of UCAR's netCDF as the means
+        for persistent storage of both observational and model-output data, as well
+        as for storing sets of data-file-structure definitions and (prototype, so
+        far) data-dependency graphs for scheduling the sets of programs which constitute
+        their environmental models.
+        <p></p>
+      </li>
+      <li>
+        A group in the Atmospheric Chemistry Division at NCAR (the National Center
+        for Atmospheric Research) that deals with UARS (Upper Atmospheric Research
+        Satellite) data uses netCDF for their binary data format. Output from NCAR's
+        High Altitude Observatory Division Thermospheric General Circulation Model
+        (TGCM) and related models are converted to netCDF files for post-model visualization
+        and diagnostic codes. NCAR's Research Aviation Facility has decided to
+        use netCDF to distribute aircraft data.
+        <p></p>
+      </li>
+      <li>
+        NCAR's Research Data Program uses netCDF as the primary file format
+        for data archived and used in the <a
+        href="http://www.atd.ucar.edu/rdp/zebra.html">Zebra</a> display and analysis system.
+        Quick look data from various projects is distributed by RDP in netCDF. NetCDF
+        is also the file format used by the (Zebra-based) Integrated Sounding System.
+        <p></p>
+      </li>
+      <li>
+        The Cooperative Program for Operation Meteorology, Education, and Training
+        (COMET), a program of UCAR, has created an extensive archive of meteorological
+        case studies that contain observed and gridded data in netCDF. The netCDF
+        definition in use was created by the Forecast Systems Laboratory (FSL), a
+        NOAA agency, and files in this format are required for capatability with their
+        PC-DARE workstations which are used in the COMET teaching classroom. COMET
+        plans to create future case studies using the netCDF conventions currently
+        being developed by a working group of Unidata, COMET, and FSL personnel.
+        <p></p>
+      </li>
+      <li>
+        <p>
+          Climate data are archived at several of the NOAA Regional Climate Centers
+          (RCCs) usuig netCDF files. The netCDF software provides rapid access to
+          time-series data and is at the core of a newly developed distributed data
+          access system that will be employed at all of the NOAA RCCs and will be
+          linked to the NOAA Virtual Data System (NVDS).
+        </p>
+      </li>
+      <li>
+        The Earth Scan Lab, an HRPT ground station at Coastal Studies Institute,
+        is using both the Terascan TDF as well as the netCDF for ease of data exhange
+        of AVHRR, TOVS and DCS data. Further, in conjunction with Woods Hole, Scripps
+        and Texas A&M, CSI will be maintaining all oceanographic data in netCDF.
+        <p></p>
+      </li>
+      <li>
+        DataHub from JPL, with funding from AISRP/NASA identifies and converts between
+        a variety of data format, CDF, HDF, MMM/netCDF, FITS, PDS, ... Work is under
+        way to support conversion from a variety of NASA data formats to netCDF used
+        by the PolyPaint+ visualization system from NCAR's MMM division. (JPL
+        Contact for DataHub: Tom Handley, thandley at spacemouse.jpl.nasa.gov)
+        <p></p>
+      </li>
+      <li>
+        A major component of the US Climate and Global Change program is the TOGA-TAO
+        Array in the tropical Pacific, which proposes to maintain approximately 70
+        moored ATLAS wind and thermistor chain and current meter buoys, spanning the
+        Pacific ocean from 95W to 137E in the equatorial wave guide. The TAO Project
+        Office, at PMEL, has developed distribution and display software for the real-time
+        data from the TAO buoys, in a point-and-click UNIX workstation environment.
+        This software is distributed nationally and internationally. All data is stored
+        and distributed in netCDF format. All graphics displays and animations are
+        produced with the EPIC tools for working with netCDF data files.
+        <p></p>
+      </li>
+      <li>
+        The Woods Hole Field Center of the U.S.G.S. Marine and Coastal Geology Program
+        uses netCDF to access a variety of scientific data sets, including output
+        from circulation and sediment tranport models, sonar imagery, digital elevation
+        models, and environmental sensor data. They also make available the <a
+        href="http://crusty.er.usgs.gov/~cdenham/MexCDF/nc4ml5.html">NetCDF Toolbox for
+        Matlab-5</a>
+        <p></p>
+      </li>
+      <li>
+        At the Woods Hole Oceanographic Institution, netCDF is used in several areas.
+        Ships in the UNOLS fleet are recording measurements from the IMET systems
+        in netCDF form. These data include wind, barometer, humidity, air and sea
+        temperature, precipitation, short wave radiation, and GPS navigation. Data
+        sets from these systems taken during the WOCE experiments in the Pacific have
+        been archived recently at NCAR. Also, measurements from a diverse set of instruments
+        deployed on buoys for the Subduction, TOGA/COARE, and several other experiments
+        are translated into netCDF form for processing and archival. Reports that
+        describe the software systems used for these processing activities are available
+        from WHOI.
+        <p></p>
+      </li>
+      <li>
+        Scripps Institution of Oceanography (SIO) and the University Corporation
+        for Atmospheric Research (UCAR) conducted a multi-platform climate field project
+        during March of 1994 based in Nadi, Fiji. All data from this experiment will
+        be archived using Unidata's netCDF before release to the scientific community.
+        <p></p>
+      </li>
+      <li>
+        The Oregon State University Oceanographic <a
+        href="http://lubber.oce.orst.edu/Wecoma/WecomaHome.html">Research Vessel WECOMA</a>
+        uses the netCDF library for primary scientific data logging. This includes
+        navigational, meteorological, and other miscellaneous data. This logging is
+        part of a client/server system for data distribution, display, and management
+        known as XMIDAS.
+        <p></p>
+      </li>
+      <li>
+        NOAA's <a href="http://www.fsl.noaa.gov/">Forecast System Laboratory</a>
+        has adopted netCDF as a data access interface for some of their systems and
+        applications.
+        <p></p>
+      </li>
+      <li>
+        The <a href="http://www.its.csiro.au/">CSIRO</a> Division of Atmospheric
+        Research in Australia uses netCDF to store all their GCM and ocean model results.
+        <p></p>
+      </li>
+      <li>
+        The Cabauw Experimental Site for Atmospheric Research (<a
+        href="http://www.cesar-database.nl/" >Cesar</a>) is
+        a consortium of presently eight institutes and universities located
+        in the Netherlands. The goal of the consortium is to operate and
+        maintain at the Cabauw site a unique observational facility with a
+        comprehensive set of remote sensing and in-situ equipment to
+        characterize the state of the atmosphere, its radiative properties
+        and the interaction with the land surface.  All the data are stored
+        in netCDF formatted files and comply with the CF-1.4 convention.
+        <p></p>
+      </li>
+      <li>
+        Meteorological data from satellites is stored in netCDF form at CIRES (Cooperative
+        Institute for Research in the Environmental Sciences) and several data analysis
+        packages have been written to display and analyze the netCDF data.
+        <p></p>
+      </li>
+      <li>
+        A general purpose finite element data model (referred to as EXODUS II) utilizing
+        netCDF has been developed at Sandia National Laboratories. It consists of
+        a C and FORTRAN application programming interface (API) to read and write
+        geometry and results (including time varying data) for finite element analyses.
+        For more information, contact Larry Schoof (laschoo at somnet.sandia.gov).
+        <p></p>
+      </li>
+      <li>
+        <a href="http://www.aero.polimi.it/~mbdyn/" >MBDyn</a> is an
+        open-source Multi-body dynamics analysis system that
+        uses netCDF as its output format.  MBDyn features the integrated
+        multidisciplinary analysis of multibody, multiphysics systems,
+        including nonlinear mechanics of rigid and flexible constrained
+        bodies, smart materials, electric networks, active control,
+        hydraulic networks, essential fixed-wing and rotorcraft
+        aerodynamics.
+        <p></p>
+      </li>
+      <li>
+        NetCDF is the vehicle adopted by the Analytical Instrument Association [AIA]
+        to implement the Analytical Data Interchange Protocols [Andi Protocols] for
+        chromatography [released in 1992] and mass spectrometry [released in 1994].
+        The Andi
+        Protocols increase laboratory efficiency and productivity
+        by facilitating the integration and use of data from multiple vendors'
+        products. For more information about the Andi chromatography protocols, see
+        the article <a
+        href="http://pubs.acs.org/hotartcl/tcaw/98/may/stan.html">"Standards for
+        Chromatography Data Systems: ASTM adopts protocols for analytical data interchange
+        (Andi)"</a> from May 1998 issue of the American Chemical Society publication <i>Today's Chemist at Work</i> The resulting standard specifications and
+        guides may be downloaded from <a
+        href="http://www.astm.org/">ASTM</a>:
+
+        <ul>
+          <li>
+            <a
+            href="http://www.astm.org/cgi-bin/SoftCart.exe/DATABASE.CART/PAGES/E1947.htm?L+mystore+rpwd2606"> E1947-98 Standard Specification for Analytical Data Interchange Protocol for
+            Chromatographic Data</a>
+          </li>
+          <li>
+            <a
+            href="http://www.astm.org/cgi-bin/SoftCart.exe/DATABASE.CART/PAGES/E1948.htm?L+mystore+rpwd2606"> E1948-98 Standard Guide for Analytical Data Interchange Protocol for Chromatographic
+            Data</a>
+          </li>
+          <li>
+            <a
+            href="http://www.astm.org/cgi-bin/SoftCart.exe/DATABASE.CART/REDLINE_PAGES/E2077.htm?L+mystore+uvlt1856" > E2077-00 Standard Specification for Analytical Data Interchange
+            Protocol for Mass Spectrometric Data</a>
+          </li>
+        </ul>
+        Further development related to these standards now seems to be under the purview of
+        an ASTM subcommittee E13.15 on analytical Data Management, at the
+        Source Forge site <a href="http://andi.sourceforge.net/"
+        >http://andi.sourceforge.net/</a>. <p></p>
+      </li>
+      <li>
+        The Positron Imaging Laboratories and the Neuro-Imaging Laboratory of the
+        Montreal Neurological Institute have selected netCDF as the data format for
+        their medical image files. Conventions for variable and attribute names and
+        values have been established for the medical imaging context. These conventions,
+        along with a package of routines to assist in handling image data, make up
+        the MINC (Medical Image NetCDF) format. For more information, contact Peter
+        Neelin (neelin at pet.mni.mcgill.ca) or see <a href="http://www.bic.mni.mcgill.ca/software/minc/" > http://www.bic.mni.mcgill.ca/software/minc/</a>. <p></p>
+      </li>
+      <li>
+        In the field of molecular dynamics and the simulation of
+        biomolecules, <a
+        href="http://amber.scripps.edu/formats.html#netcdf" >netCDF
+        conventions</a> are now used
+        for storing and accessing trajectory files associated
+        with the <a href="http://amber.scripps.edu/index.html" >AMBER
+        project</a>. <p></p>
+      </li>
+      <li>
+        In computational biology, specifically flow cytometry, netCDF/HDF5
+        format has been used in new OpenCyto software. See
+        Finak G, Frelinger J, Jiang W, Newell EW, Ramey J, et al. (2014) OpenCyto: An Open Source Infrastructure for Scalable, Robust, Reproducible, and
+        Automated, End-to-End Flow Cytometry Data Analysis. PLoS Comput Biol 10(8): e1003806. doi:10.1371/journal.pcbi.1003806.
+        <p></p>
+      </li>
+      <li>
+        At the Federal Waterways Engineering and Research Institute (<a href="http://www.baw.de/EN/Home/home_node.html">BAW</a>),
+        netCDF is used in several ways. In combination with the <a href="https://github.com/ugrid-conventions/ugrid-conventions">UGRID conventions</a>
+        computational results from different hydrodynamic numerical models are stored for unstructured grids,
+        e.g. water level, current velocity, and salinity. NetCDF is also used to store derived quantities
+        like tidal high and low water, tidal range and many other similar characteristic numbers. In addition,
+        measured data (tide gauge data, ADCP) are also stored in netCDF files based on NOAA's
+        <a href="http://www.nodc.noaa.gov/data/formats/netcdf/v1.1/">NODC NetCDF templates</a>.<p></p>
+      </li>
+      <li>
+      <a href="http://www.dlr.de/">The German Aerospace Agency (DLR)</a>, located in Munich, are using netcdf-4 / CF
+	  standards for the provision of L2 data for S5p mission including L2
+	  products such as Sulfur Dioxide, Ozone, Formaldehyde and Clouds
+	  (<a href="https://en.wikipedia.org/wiki/Sentinel-5_Precursor">https://en.wikipedia.org/wiki/Sentinel-5_Precursor</a> or
+	  <a href="https://sentinel.esa.int/web/sentinel/missions/sentinel-5p">https://sentinel.esa.int/web/sentinel/missions/sentinel-5p</a>).
+      </li>     
+    </ul>
+    <!-- InstanceEndEditable -->
+  </body>
+
+  <!-- InstanceEnd -->
diff --git a/docs/windows-binaries.md b/docs/windows-binaries.md
index fb25cc6..4b0cae3 100644
--- a/docs/windows-binaries.md
+++ b/docs/windows-binaries.md
@@ -32,14 +32,14 @@ The included dependencies and versions are as follows:
 * `libcurl`: 7.35.0
 * `zlib`:    1.2.8
 
-## Latest Release (netCDF-C 4.4.1.1) {#msvc-latest-release}
+## Latest Release (netCDF-C 4.5.0-rc1) {#msvc-latest-release}
 
 Configuration		| 32-bit 						| 64-bit |
 :-------------------|:--------							|:-------|
-netCDF 3		| [netCDF4.4.1.1-NC3-32.exe][r1]		| [netCDF4.4.1.1-NC3-64.exe][r6]
-netCDF3+DAP		| [netCDF4.4.1.1-NC3-DAP-32.exe][r2]	| [netCDF4.4.1.1-NC3-DAP-64.exe][r6]
-netCDF4			| [netCDF4.4.1.1-NC4-32.exe][r3]		| [netCDF4.4.1.1-NC4-64.exe][r7]
-netCDF4+DAP		| [netCDF4.4.1.1-NC4-DAP-32.exe][r4]	| [netCDF4.4.1.1-NC4-DAP-64.exe][r8]
+netCDF 3		| [netCDF4.5.0-rc1-NC3-32.exe][r1]		| [netCDF4.5.0-rc1-NC3-64.exe][r6]
+netCDF3+DAP		| [netCDF4.5.0-rc1-NC3-DAP-32.exe][r2]	| [netCDF4.5.0-rc1-NC3-DAP-64.exe][r6]
+netCDF4			| [netCDF4.5.0-rc1-NC4-32.exe][r3]		| [netCDF4.5.0-rc1-NC4-64.exe][r7]
+netCDF4+DAP		| [netCDF4.5.0-rc1-NC4-DAP-32.exe][r4]	| [netCDF4.5.0-rc1-NC4-DAP-64.exe][r8]
 
 # Using the netCDF-C Libraries with Visual Studio {#msvc-using}
 
@@ -60,11 +60,11 @@ When installed, the netCDF libraries are placed in the specified locations, alon
 1. When building the netCDF-C libraries with netCDF4 support, using the `Debug` libraries may cause extraneous warnings. These warnings are related to cross-dll memory management, and appear to be harmless. You can safely ignore them by using the `Release` libraries. [NCF-220]
 
 
-[r1]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC3-32.exe
-[r2]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC3-DAP-32.exe
-[r3]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC4-32.exe
-[r4]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC4-DAP-32.exe
-[r6]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC3-64.exe
-[r6]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC3-DAP-64.exe
-[r7]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC4-64.exe
-[r8]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.4.1.1-NC4-DAP-64.exe
+[r1]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC3-32.exe
+[r2]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC3-DAP-32.exe
+[r3]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC4-32.exe
+[r4]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC4-DAP-32.exe
+[r6]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC3-64.exe
+[r6]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC3-DAP-64.exe
+[r7]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC4-64.exe
+[r8]: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.5.0-rc1-NC4-DAP-64.exe
diff --git a/examples/C/Makefile.in b/examples/C/Makefile.in
index dcc5a72..b5be590 100644
--- a/examples/C/Makefile.in
+++ b/examples/C/Makefile.in
@@ -495,6 +495,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -522,12 +523,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -562,6 +565,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/examples/CDL/Makefile.in b/examples/CDL/Makefile.in
index 745016a..bc5fd49 100644
--- a/examples/CDL/Makefile.in
+++ b/examples/CDL/Makefile.in
@@ -374,6 +374,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -401,12 +402,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -441,6 +444,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/examples/Makefile.in b/examples/Makefile.in
index 37e3af9..01901dd 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -230,6 +230,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -257,12 +258,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -297,6 +300,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/h5_test/Makefile.in b/h5_test/Makefile.in
index b1120cd..f266281 100644
--- a/h5_test/Makefile.in
+++ b/h5_test/Makefile.in
@@ -560,6 +560,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -587,12 +588,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -627,6 +630,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -691,6 +695,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Set AM_CPPFLAGS and AM_LDFLAGS based on user choices.
 
diff --git a/h5_test/h5_err_macros.h b/h5_test/h5_err_macros.h
index e51019d..d2889b3 100644
--- a/h5_test/h5_err_macros.h
+++ b/h5_test/h5_err_macros.h
@@ -14,6 +14,6 @@
 #define _H5_ERR_MACROS_H
 
 #define NONETCDF
-#include <err_macros.h>
+#include "err_macros.h"
 
 #endif /*_H5_ERR_MACROS_H*/
diff --git a/h5_test/run_par_tests.sh b/h5_test/run_par_tests.sh
index 881e74b..84ea3f0 100755
--- a/h5_test/run_par_tests.sh
+++ b/h5_test/run_par_tests.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs some parallel tests.
 
 # $Id: run_par_tests.sh,v 1.2 2007/12/20 16:25:26 ed Exp $
diff --git a/h5_test/run_valgrind_tests.sh b/h5_test/run_valgrind_tests.sh
index 7ab7826..9fa2568 100755
--- a/h5_test/run_valgrind_tests.sh
+++ b/h5_test/run_valgrind_tests.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs the tests with valgrind.
 
 set -e
diff --git a/h5_test/tst_h_par.c b/h5_test/tst_h_par.c
index c3da7f4..a419d55 100644
--- a/h5_test/tst_h_par.c
+++ b/h5_test/tst_h_par.c
@@ -11,6 +11,7 @@
    $Id: tst_h_par.c,v 1.15 2010/05/25 13:53:04 ed Exp $
 */
 #include <nc_tests.h>
+#include "err_macros.h"
 #include <hdf5.h>
 
 /* Defining USE_MPE causes the MPE trace library to be used (and you
diff --git a/include/Makefile.am b/include/Makefile.am
index aebb8e4..b51d7e5 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -15,10 +15,15 @@ include_HEADERS += netcdf_mem.h
 endif
 
 noinst_HEADERS = nc_logging.h nc_tests.h fbits.h nc.h	\
-nclist.h ncuri.h utf8proc.h ncdispatch.h ncdimscale.h		\
+nclist.h ncuri.h ncutf8.h ncdispatch.h ncdimscale.h		\
 netcdf_f.h err_macros.h ncbytes.h nchashmap.h ceconstraints.h rnd.h	\
-nclog.h ncconfigure.h nc4internal.h nctime.h nc3dispatch.h nc3internal.h \
-onstack.h nc_hashmap.h
+nclog.h ncconfigure.h nc4internal.h nctime.h nc3internal.h \
+onstack.h nc_hashmap.h ncrc.h ncoffsets.h nctestserver.h \
+nc4dispatch.h nc3dispatch.h ncexternl.h ncwinpath.h
+
+if USE_DAP
+noinst_HEADERS += ncdap.h
+endif
 
 if USE_NETCDF4
 noinst_HEADERS += ncaux.h
diff --git a/include/Makefile.in b/include/Makefile.in
index b16496a..4495abf 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -96,7 +96,8 @@ host_triplet = @host@
 target_triplet = @target@
 @BUILD_PARALLEL_TRUE at am__append_1 = netcdf_par.h
 @BUILD_DISKLESS_TRUE at am__append_2 = netcdf_mem.h
- at USE_NETCDF4_TRUE@am__append_3 = ncaux.h
+ at USE_DAP_TRUE@am__append_3 = ncdap.h
+ at USE_NETCDF4_TRUE@am__append_4 = ncaux.h
 subdir = include
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -161,10 +162,12 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(includedir)"
 am__noinst_HEADERS_DIST = nc_logging.h nc_tests.h fbits.h nc.h \
-	nclist.h ncuri.h utf8proc.h ncdispatch.h ncdimscale.h \
-	netcdf_f.h err_macros.h ncbytes.h nchashmap.h ceconstraints.h \
-	rnd.h nclog.h ncconfigure.h nc4internal.h nctime.h \
-	nc3dispatch.h nc3internal.h onstack.h nc_hashmap.h ncaux.h
+	nclist.h ncuri.h ncutf8.h ncdispatch.h ncdimscale.h netcdf_f.h \
+	err_macros.h ncbytes.h nchashmap.h ceconstraints.h rnd.h \
+	nclog.h ncconfigure.h nc4internal.h nctime.h nc3internal.h \
+	onstack.h nc_hashmap.h ncrc.h ncoffsets.h nctestserver.h \
+	nc4dispatch.h nc3dispatch.h ncexternl.h ncwinpath.h ncdap.h \
+	ncaux.h
 HEADERS = $(include_HEADERS) $(noinst_HEADERS)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
@@ -228,6 +231,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -255,12 +259,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -295,6 +301,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -362,10 +369,12 @@ top_srcdir = @top_srcdir@
 include_HEADERS = netcdf.h netcdf_meta.h $(am__append_1) \
 	$(am__append_2)
 noinst_HEADERS = nc_logging.h nc_tests.h fbits.h nc.h nclist.h ncuri.h \
-	utf8proc.h ncdispatch.h ncdimscale.h netcdf_f.h err_macros.h \
+	ncutf8.h ncdispatch.h ncdimscale.h netcdf_f.h err_macros.h \
 	ncbytes.h nchashmap.h ceconstraints.h rnd.h nclog.h \
-	ncconfigure.h nc4internal.h nctime.h nc3dispatch.h \
-	nc3internal.h onstack.h nc_hashmap.h $(am__append_3)
+	ncconfigure.h nc4internal.h nctime.h nc3internal.h onstack.h \
+	nc_hashmap.h ncrc.h ncoffsets.h nctestserver.h nc4dispatch.h \
+	nc3dispatch.h ncexternl.h ncwinpath.h $(am__append_3) \
+	$(am__append_4)
 EXTRA_DIST = CMakeLists.txt XGetopt.h netcdf_meta.h.in
 all: all-am
 
diff --git a/include/err_macros.h b/include/err_macros.h
index 5d52eb1..3c7ebe4 100644
--- a/include/err_macros.h
+++ b/include/err_macros.h
@@ -9,7 +9,7 @@
 #ifndef _ERR_MACROS_H
 #define _ERR_MACROS_H
 
-#include <config.h>
+#include "config.h"
 #include <assert.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/include/nc.h b/include/nc.h
index aa597c9..c4cddde 100644
--- a/include/nc.h
+++ b/include/nc.h
@@ -38,11 +38,7 @@ typedef struct NC {
 typedef struct {
 	/* all xdr'd */
 	size_t nchars;
-#ifdef __arm__
-  signed char *cp;
-#else
-  char *cp;
-#endif
+	char *cp;
 
 } NC_string;
 
@@ -55,18 +51,10 @@ free_NC_string(NC_string *ncstrp);
 extern int
 NC_check_name(const char *name);
 
-#ifdef __arm__
-extern NC_string *
-new_NC_string(size_t slen, const signed char *str);
-extern int
-set_NC_string(NC_string *ncstrp, const signed char *str);
-#else
 extern NC_string *
 new_NC_string(size_t slen, const char *str);
 extern int
 set_NC_string(NC_string *ncstrp, const char *str);
-#endif
-
 
 /* End defined in string.c */
 
@@ -77,17 +65,9 @@ NC_check_id(int ncid, NC **ncpp);
    overlap real file descriptors */
 extern int nc__pseudofd(void);
 
-/* This function sets a default create flag that will be logically
-   or'd to whatever flags are passed into nc_create for all future
-   calls to nc_create.
-   Valid default create flags are NC_64BIT_OFFSET, NC_CLOBBER,
-   NC_LOCK, NC_SHARE. */
-extern int nc_set_default_format(int format, int *old_formatp);
-
 /* This function gets a current default create flag */
 extern int nc_get_default_format(void);
 
-
 extern int add_to_NCList(NC*);
 extern void del_from_NCList(NC*);/* does not free object */
 extern NC* find_in_NCList(int ext_ncid);
@@ -100,4 +80,7 @@ extern int iterate_NCList(int i,NC**); /* Walk from 0 ...; ERANGE return => stop
 extern void free_NC(NC*);
 extern int new_NC(struct NC_Dispatch*, const char*, int, NC**);
 
+/* Defined in nc.c */
+extern int ncdebug;
+
 #endif /* _NC_H_ */
diff --git a/include/nc3dispatch.h b/include/nc3dispatch.h
index 8beac43..75b1a7a 100644
--- a/include/nc3dispatch.h
+++ b/include/nc3dispatch.h
@@ -1,9 +1,9 @@
 /*
  * Copyright 1993-1996 University Corporation for Atmospheric Research/Unidata
- * 
- * Portions of this software were developed by the Unidata Program at the 
+ *
+ * Portions of this software were developed by the Unidata Program at the
  * University Corporation for Atmospheric Research.
- * 
+ *
  * Access and use of this software shall impose the following obligations
  * and understandings on the user. The user is granted the right, without
  * any fee or cost, to use, copy, modify, alter, enhance and distribute
@@ -20,7 +20,7 @@
  * any support, consulting, training or assistance of any kind with regard
  * to the use, operation and performance of this software nor to provide
  * the user with any updates, revisions, new versions or "bug fixes."
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "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
@@ -50,129 +50,129 @@ extern "C" {
  */
 
 /* WARNING: this signature differs from external nc_create API*/
-EXTERNL int
+extern int
 NC3_create(const char *path, int cmode,
            size_t initialsz, int basepe, size_t *chunksizehintp,
 	   int useparallel, void* mpidata,
            struct NC_Dispatch*, NC* ncp);
 
 /* WARNING: this signature differs from external nc_open API*/
-EXTERNL int
+extern int
 NC3_open(const char *path, int mode,
          int basepe, size_t *chunksizehintp,
          int use_parallel, void* mpidata,
          NC_Dispatch*, NC* ncp);
 
-EXTERNL int
+extern int
 NC3_new_nc(NC**);
 
-EXTERNL int
+extern int
 NC3_redef(int ncid);
 
-EXTERNL int
+extern int
 NC3__enddef(int ncid, size_t h_minfree, size_t v_align,
 	size_t v_minfree, size_t r_align);
 
-EXTERNL int
+extern int
 NC3_sync(int ncid);
 
-EXTERNL int
+extern int
 NC3_abort(int ncid);
 
-EXTERNL int
+extern int
 NC3_close(int ncid);
 
-EXTERNL int
+extern int
 NC3_set_fill(int ncid, int fillmode, int *old_modep);
 
-EXTERNL int
+extern int
 NC3_set_base_pe(int ncid, int pe);
 
-EXTERNL int
+extern int
 NC3_inq_base_pe(int ncid, int *pe);
 
-EXTERNL int
+extern int
 NC3_inq_format(int ncid, int *formatp);
 
-EXTERNL int
+extern int
 NC3_inq_format_extended(int ncid, int *formatp, int *modep);
 
-EXTERNL int
+extern int
 NC3_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp);
 
-EXTERNL int
+extern int
 NC3_inq_type(int, nc_type, char *, size_t *);
 
 /* Begin _dim */
 
-EXTERNL int
+extern int
 NC3_def_dim(int ncid, const char *name, size_t len, int *idp);
 
-EXTERNL int
+extern int
 NC3_inq_dimid(int ncid, const char *name, int *idp);
 
-EXTERNL int
+extern int
 NC3_inq_dim(int ncid, int dimid, char *name, size_t *lenp);
 
-EXTERNL int
+extern int
 NC3_inq_unlimdim(int ncid, int *unlimdimidp);
 
-EXTERNL int
+extern int
 NC3_rename_dim(int ncid, int dimid, const char *name);
 
 /* End _dim */
 /* Begin _att */
 
-EXTERNL int
+extern int
 NC3_inq_att(int ncid, int varid, const char *name,
 	 nc_type *xtypep, size_t *lenp);
 
-EXTERNL int 
+extern int
 NC3_inq_attid(int ncid, int varid, const char *name, int *idp);
 
-EXTERNL int
+extern int
 NC3_inq_attname(int ncid, int varid, int attnum, char *name);
 
-EXTERNL int
+extern int
 NC3_rename_att(int ncid, int varid, const char *name, const char *newname);
 
-EXTERNL int
+extern int
 NC3_del_att(int ncid, int varid, const char*);
 
 /* End _att */
 /* Begin {put,get}_att */
 
-EXTERNL int
+extern int
 NC3_get_att(int ncid, int varid, const char *name, void *value, nc_type);
 
-EXTERNL int
+extern int
 NC3_put_att(int ncid, int varid, const char *name, nc_type datatype,
 	   size_t len, const void *value, nc_type);
 
 /* End {put,get}_att */
 /* Begin _var */
 
-EXTERNL int
+extern int
 NC3_def_var(int ncid, const char *name,
 	 nc_type xtype, int ndims, const int *dimidsp, int *varidp);
 
-EXTERNL int
+extern int
 NC3_inq_var(int ncid, int varid, char *name,
 	 nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp);
 
-EXTERNL int
+extern int
 NC3_inq_varid(int ncid, const char *name, int *varidp);
 
-EXTERNL int
+extern int
 NC3_rename_var(int ncid, int varid, const char *name);
 
 
-EXTERNL int
+extern int
 NC3_put_vara(int ncid, int varid,
    	     const size_t *start, const size_t *count,
              const void *value, nc_type);
 
-EXTERNL int
+extern int
 NC3_get_vara(int ncid, int varid,
 	     const size_t *start, const size_t *count,
              void *value, nc_type);
@@ -180,7 +180,7 @@ NC3_get_vara(int ncid, int varid,
 /* End _var */
 
 extern int NC3_initialize();
-
+extern int NC3_finalize();
 
 #if defined(__cplusplus)
 }
diff --git a/include/nc3internal.h b/include/nc3internal.h
index a9b2d81..517af66 100644
--- a/include/nc3internal.h
+++ b/include/nc3internal.h
@@ -8,7 +8,7 @@
 /*
  *	netcdf library 'private' data structures, objects and interfaces
  */
-#include <config.h>
+#include "config.h"
 #include <stddef.h>	/* size_t */
 #ifndef HAVE_STDINT_H
 #  include "pstdint.h"	/* attempts to define uint32_t etc portably */
@@ -17,9 +17,9 @@
 #endif /* HAVE_STDINT_H */
 #include <sys/types.h>	/* off_t */
 #ifdef USE_PARALLEL
-#include <netcdf_par.h>
+#include "netcdf_par.h"
 #else
-#include <netcdf.h>
+#include "netcdf.h"
 #endif /* USE_PARALLEL */
 
 /* Always needed */
@@ -389,6 +389,12 @@ NC_sync(NC3_INFO* ncp);
 extern int
 NC_calcsize(const NC3_INFO* ncp, off_t *filesizep);
 
+extern int
+NC3_inq_default_fill_value(int xtype, void *fillp);
+
+extern int
+NC3_inq_var_fill(const NC_var *varp, void *fill_value);
+
 /* End defined in nc.c */
 /* Begin defined in v1hpg.c */
 
@@ -418,6 +424,9 @@ nc_put_rec(int ncid, size_t recnum, void *const *datap);
 
 /* End defined in putget.c */
 
+extern int
+NC_check_vlens(NC3_INFO *ncp);
+
 /* Define accessors for the dispatchdata */
 #define NC3_DATA(nc) ((NC3_INFO*)(nc)->dispatchdata)
 #define NC3_DATA_SET(nc,data) ((nc)->dispatchdata = (void*)(data))
diff --git a/include/nc4dispatch.h b/include/nc4dispatch.h
new file mode 100644
index 0000000..2b6575c
--- /dev/null
+++ b/include/nc4dispatch.h
@@ -0,0 +1,271 @@
+/*********************************************************************
+ * Copyright 2010, UCAR/Unidata. See netcdf/COPYRIGHT file for copying
+ * and redistribution conditions.
+ *
+ * This header file contains the prototypes for the netCDF-4 versions
+ * of all the netCDF functions.
+ *********************************************************************/
+
+#ifndef _NC4DISPATCH_H
+#define _NC4DISPATCH_H
+
+#include "config.h"
+#include <stddef.h> /* size_t, ptrdiff_t */
+#include <errno.h>  /* netcdf functions sometimes return system errors */
+#include "ncdispatch.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern int
+NC4_create(const char *path, int cmode,
+           size_t initialsz, int basepe, size_t *chunksizehintp,
+	   int useparallel, void* parameters,
+	   NC_Dispatch*, NC*);
+
+extern int
+NC4_open(const char *path, int mode,
+         int basepe, size_t *chunksizehintp, 
+	 int use_parallel, void* parameters,
+	 NC_Dispatch*, NC*);
+
+extern int
+NC4_redef(int ncid);
+
+extern int
+NC4__enddef(int ncid, size_t h_minfree, size_t v_align,
+	size_t v_minfree, size_t r_align);
+
+extern int
+NC4_sync(int ncid);
+
+extern int
+NC4_abort(int ncid);
+
+extern int
+NC4_close(int ncid);
+
+extern int
+NC4_set_fill(int ncid, int fillmode, int *old_modep);
+
+extern int
+NC4_set_base_pe(int ncid, int pe);
+
+extern int
+NC4_inq_base_pe(int ncid, int *pe);
+
+extern int
+NC4_inq_format(int ncid, int *formatp);
+
+extern int
+NC4_inq_format_extended(int ncid, int *formatp, int *modep);
+
+extern int
+NC4_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp);
+
+extern int
+NC4_inq_type(int, nc_type, char *, size_t *);
+
+/* Begin _dim */
+
+extern int
+NC4_def_dim(int ncid, const char *name, size_t len, int *idp);
+
+extern int
+NC4_inq_dimid(int ncid, const char *name, int *idp);
+
+extern int
+NC4_inq_dim(int ncid, int dimid, char *name, size_t *lenp);
+
+extern int
+NC4_inq_unlimdim(int ncid, int *unlimdimidp);
+
+extern int
+NC4_rename_dim(int ncid, int dimid, const char *name);
+
+/* End _dim */
+/* Begin _att */
+
+extern int
+NC4_inq_att(int ncid, int varid, const char *name,
+	    nc_type *xtypep, size_t *lenp);
+
+extern int 
+NC4_inq_attid(int ncid, int varid, const char *name, int *idp);
+
+extern int
+NC4_inq_attname(int ncid, int varid, int attnum, char *name);
+
+extern int
+NC4_rename_att(int ncid, int varid, const char *name, const char *newname);
+
+extern int
+NC4_del_att(int ncid, int varid, const char*);
+
+/* End _att */
+/* Begin {put,get}_att */
+
+extern int
+NC4_get_att(int ncid, int varid, const char *name, void *value, nc_type);
+
+extern int
+NC4_put_att(int ncid, int varid, const char *name, nc_type datatype,
+	   size_t len, const void *value, nc_type);
+
+/* End {put,get}_att */
+/* Begin _var */
+
+extern int
+NC4_def_var(int ncid, const char *name,
+	 nc_type xtype, int ndims, const int *dimidsp, int *varidp);
+
+extern int
+NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep, 
+               int *ndimsp, int *dimidsp, int *nattsp, 
+               int *shufflep, int *deflatep, int *deflate_levelp,
+               int *fletcher32p, int *contiguousp, size_t *chunksizesp, 
+               int *no_fill, void *fill_valuep, int *endiannessp, 
+	       int *options_maskp, int *pixels_per_blockp);
+
+extern int
+NC4_inq_varid(int ncid, const char *name, int *varidp);
+
+extern int
+NC4_rename_var(int ncid, int varid, const char *name);
+
+extern int
+NC4_put_vara(int ncid, int varid,
+   	     const size_t *start, const size_t *count,
+             const void *value, nc_type);
+
+extern int
+NC4_get_vara(int ncid, int varid,
+	     const size_t *start, const size_t *count,
+             void *value, nc_type);
+
+/* End _var */
+
+/* netCDF4 API only */
+extern int
+NC4_var_par_access(int, int, int);
+
+extern int
+NC4_inq_ncid(int, const char *, int *);
+
+extern int
+NC4_inq_grps(int, int *, int *);
+
+extern int
+NC4_inq_grpname(int, char *);
+
+extern int
+NC4_inq_grpname_full(int, size_t *, char *);
+
+extern int
+NC4_inq_grp_parent(int, int *);
+
+extern int
+NC4_inq_grp_full_ncid(int, const char *, int *);
+
+extern int
+NC4_inq_varids(int, int * nvars, int *);
+
+extern int
+NC4_inq_dimids(int, int * ndims, int *, int);
+
+extern int
+NC4_inq_typeids(int, int * ntypes, int *);
+   
+extern int
+NC4_inq_type_equal(int, nc_type, int, nc_type, int *);
+
+extern int
+NC4_def_grp(int, const char *, int *);
+
+extern int
+NC4_rename_grp(int, const char *);
+
+extern int
+NC4_inq_user_type(int, nc_type, char *, size_t *, nc_type *, 
+		  size_t *, int *);
+
+extern int
+NC4_def_compound(int, size_t, const char *, nc_type *);
+
+extern int
+NC4_insert_compound(int, nc_type, const char *, size_t, nc_type);
+
+extern int
+NC4_insert_array_compound(int, nc_type, const char *, size_t, 
+			  nc_type, int, const int *);
+
+extern int
+NC4_inq_typeid(int, const char *, nc_type *);
+
+extern int
+NC4_inq_compound_field(int, nc_type, int, char *, size_t *, 
+		       nc_type *, int *, int *);
+
+extern int
+NC4_inq_compound_fieldindex(int, nc_type, const char *, int *);
+
+extern int
+NC4_def_vlen(int, const char *, nc_type base_typeid, nc_type *);
+
+extern int
+NC4_put_vlen_element(int, int, void *, size_t, const void *);
+
+extern int
+NC4_get_vlen_element(int, int, const void *, size_t *, void *);
+
+extern int
+NC4_def_enum(int, nc_type, const char *, nc_type *);
+
+extern int
+NC4_insert_enum(int, nc_type, const char *, const void *);
+
+extern int
+NC4_inq_enum_member(int, nc_type, int, char *, void *);
+
+extern int
+NC4_inq_enum_ident(int, nc_type, long long, char *);
+
+extern int
+NC4_def_opaque(int, size_t, const char *, nc_type *);
+
+extern int
+NC4_def_var_deflate(int, int, int, int, int);
+
+extern int
+NC4_def_var_fletcher32(int, int, int);
+
+extern int
+NC4_def_var_chunking(int, int, int, const size_t *);
+
+extern int
+NC4_def_var_fill(int, int, int, const void *);
+
+extern int
+NC4_def_var_endian(int, int, int);
+
+extern int
+NC4_set_var_chunk_cache(int, int, size_t, size_t, float);
+
+extern int
+NC4_get_var_chunk_cache(int, int, size_t *, size_t *, float *);
+
+extern int
+NC4_inq_unlimdims(int, int *, int *);
+
+extern int
+NC4_show_metadata(int);
+
+extern int 
+NC4_initialize(void);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /*_NC4DISPATCH_H */
diff --git a/include/nc4internal.h b/include/nc4internal.h
index bfd3678..1aa6068 100644
--- a/include/nc4internal.h
+++ b/include/nc4internal.h
@@ -146,7 +146,6 @@ typedef struct NC_ATT_INFO
 /* This is a struct to handle the var metadata. */
 typedef struct NC_VAR_INFO
 {
-   NC_LIST_NODE_T l;            /* Use generic doubly-linked list (must be first) */
    char *name;
    char *hdf5_name; /* used if different from name */
    int ndims;
@@ -262,6 +261,12 @@ typedef struct NC_TYPE_INFO
    } u;                         /* Union of structs, for each type/class */
 } NC_TYPE_INFO_T;
 
+typedef struct NC_VAR_ARRAY_T {
+	size_t nalloc;		/* number allocated >= nelems */
+	size_t nelems;		/* length of the array */
+	NC_VAR_INFO_T **value;
+} NC_VAR_ARRAY_T;
+
 /* This holds information for one group. Groups reproduce with
  * parthenogenesis. */
 typedef struct NC_GRP_INFO
@@ -273,12 +278,11 @@ typedef struct NC_GRP_INFO
    struct NC_HDF5_FILE_INFO *nc4_info;
    struct NC_GRP_INFO *parent;
    struct NC_GRP_INFO *children;
-   NC_VAR_INFO_T *var;
+   NC_VAR_ARRAY_T vars;
    NC_DIM_INFO_T *dim;
    NC_ATT_INFO_T *att;
    NC_TYPE_INFO_T *type;
    int nvars;
-   int ndims;
    int natts;
 } NC_GRP_INFO_T;
 
@@ -304,9 +308,6 @@ typedef struct  NC_HDF5_FILE_INFO
 #endif
    int flags;
    int cmode;
-   int nvars;
-   int ndims;
-   int natts;
    nc_bool_t parallel;          /* True if file is open for parallel access */
    nc_bool_t redef;             /* True if redefining an existing file */
    int fill_mode;               /* Fill mode for vars - Unused internally currently */
@@ -385,8 +386,8 @@ int nc4_type_free(NC_TYPE_INFO_T *type);
 
 /* These list functions add and delete vars, atts. */
 int nc4_nc4f_list_add(NC *nc, const char *path, int mode);
-int nc4_var_list_add(NC_VAR_INFO_T **list, NC_VAR_INFO_T **var);
-int nc4_var_list_del(NC_VAR_INFO_T **list, NC_VAR_INFO_T *var);
+int nc4_var_add(NC_VAR_INFO_T **var);
+int nc4_var_del(NC_VAR_INFO_T *var);
 int nc4_dim_list_add(NC_DIM_INFO_T **list, NC_DIM_INFO_T **dim);
 int nc4_dim_list_del(NC_DIM_INFO_T **list, NC_DIM_INFO_T *dim);
 int nc4_att_list_add(NC_ATT_INFO_T **list, NC_ATT_INFO_T **att);
diff --git a/include/nc_tests.h b/include/nc_tests.h
index 8ac5bc7..efbc09b 100644
--- a/include/nc_tests.h
+++ b/include/nc_tests.h
@@ -11,7 +11,7 @@ for conditions of use.
 #ifndef _NC_TESTS_H
 #define _NC_TESTS_H
 
-#include <config.h>
+#include "config.h"
 #include <assert.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/include/ncbytes.h b/include/ncbytes.h
index 382bd0f..824f7c7 100644
--- a/include/ncbytes.h
+++ b/include/ncbytes.h
@@ -4,6 +4,8 @@
 #ifndef NCBYTES_H
 #define NCBYTES_H 1
 
+#include "ncexternl.h"
+
 typedef struct NCbytes {
   int nonextendible; /* 1 => fail if an attempt is made to extend this buffer*/
   unsigned long alloc;
@@ -12,40 +14,41 @@ typedef struct NCbytes {
 } NCbytes;
 
 #if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
-#define EXTERNC extern "C"
-#else
-#define EXTERNC extern
+extern "C" {
 #endif
 
-EXTERNC NCbytes* ncbytesnew(void);
-EXTERNC void ncbytesfree(NCbytes*);
-EXTERNC int ncbytessetalloc(NCbytes*,unsigned long);
-EXTERNC int ncbytessetlength(NCbytes*,unsigned long);
-EXTERNC int ncbytesfill(NCbytes*, char fill);
+EXTERNL NCbytes* ncbytesnew(void);
+EXTERNL void ncbytesfree(NCbytes*);
+EXTERNL int ncbytessetalloc(NCbytes*,unsigned long);
+EXTERNL int ncbytessetlength(NCbytes*,unsigned long);
+EXTERNL int ncbytesfill(NCbytes*, char fill);
 
 /* Produce a duplicate of the contents*/
-EXTERNC char* ncbytesdup(NCbytes*);
+EXTERNL char* ncbytesdup(NCbytes*);
 /* Extract the contents and leave buffer empty */
-EXTERNC char* ncbytesextract(NCbytes*);
+EXTERNL char* ncbytesextract(NCbytes*);
 
 /* Return the ith byte; -1 if no such index */
-EXTERNC int ncbytesget(NCbytes*,unsigned long);
+EXTERNL int ncbytesget(NCbytes*,unsigned long);
 /* Set the ith byte */
-EXTERNC int ncbytesset(NCbytes*,unsigned long,char);
+EXTERNL int ncbytesset(NCbytes*,unsigned long,char);
 
 /* Append one byte */
-EXTERNC int ncbytesappend(NCbytes*,char); /* Add at Tail */
+EXTERNL int ncbytesappend(NCbytes*,char); /* Add at Tail */
 /* Append n bytes */
-EXTERNC int ncbytesappendn(NCbytes*,const void*,unsigned long); /* Add at Tail */
+EXTERNL int ncbytesappendn(NCbytes*,const void*,unsigned long); /* Add at Tail */
 
 /* Null terminate the byte string without extending its length (for debugging) */
-EXTERNC int ncbytesnull(NCbytes*);
+EXTERNL int ncbytesnull(NCbytes*);
+
+/* Remove char at position i */
+EXTERNL int ncbytesremove(NCbytes*,unsigned long);
 
 /* Concatenate a null-terminated string to the end of the buffer */
-EXTERNC int ncbytescat(NCbytes*,const char*);
+EXTERNL int ncbytescat(NCbytes*,const char*);
 
 /* Set the contents of the buffer; mark the buffer as non-extendible */
-EXTERNC int ncbytessetcontents(NCbytes*, char*, unsigned long);
+EXTERNL int ncbytessetcontents(NCbytes*, char*, unsigned long);
 
 /* Following are always "in-lined"*/
 #define ncbyteslength(bb) ((bb)!=NULL?(bb)->length:0)
@@ -55,4 +58,8 @@ EXTERNC int ncbytessetcontents(NCbytes*, char*, unsigned long);
 #define ncbytesclear(bb) ((bb)!=NULL?(bb)->length=0:0)
 #define ncbytesavail(bb,n) ((bb)!=NULL?((bb)->alloc - (bb)->length) >= (n):0)
 
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
+}
+#endif
+
 #endif /*NCBYTES_H*/
diff --git a/include/ncdap.h b/include/ncdap.h
new file mode 100644
index 0000000..50ccb44
--- /dev/null
+++ b/include/ncdap.h
@@ -0,0 +1,58 @@
+/*********************************************************************
+  *   Copyright 1993, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+
+#ifndef NCDAP_H
+#define NCDAP_H 1
+
+#ifndef nullfree
+#define nullfree(m) {if((m)!=NULL) {free(m);} else {}}
+#endif
+
+/**************************************************/
+/*
+Collect single bit flags that
+affect the operation of the system.
+*/
+
+typedef unsigned int NCFLAGS;
+#  define SETFLAG(controls,flag) ((controls.flags) |= (flag))
+#  define CLRFLAG(controls,flag) ((controls.flags) &= ~(flag))
+#  define FLAGSET(controls,flag) (((controls.flags) & (flag)) != 0)
+
+/* Defined flags */
+#define NCF_NC3             (0x0001) /* DAP->netcdf-3 */
+#define NCF_NC4             (0x0002) /* DAP->netcdf-4 */
+#define NCF_NCDAP           (0x0004) /* Do libnc-dap mimic */
+#define NCF_CACHE           (0x0008) /* Cache enabled/disabled */
+#define NCF_UPGRADE         (0x0010) /* Do proper type upgrades */
+#define NCF_UNCONSTRAINABLE (0x0020) /* Not a constrainable URL */
+#define NCF_SHOWFETCH       (0x0040) /* show fetch calls */
+#define NCF_ONDISK          (0x0080) /* cause oc to store data on disk */
+#define NCF_WHOLEVAR        (0x0100) /* retrieve only whole variables (as opposed to partial variable) into cache */
+#define NCF_PREFETCH        (0x0200) /* Cache prefetch enabled/disabled */
+#define NCF_PREFETCH_EAGER  (0x0400) /* Do eager prefetch; 0=>lazy */
+#define NCF_PREFETCH_ALL    (0x0800) /* Prefetch all variables */
+/*COLUMBIA_HACK*/
+#define NCF_COLUMBIA        (0x80000000) /* Hack for columbia server */
+
+/* Define all the default on flags */
+#define DFALT_ON_FLAGS (NCF_CACHE|NCF_PREFETCH)
+
+typedef struct NCCONTROLS {
+    NCFLAGS  flags;
+} NCCONTROLS;
+
+/* Misc. Constants */
+
+#ifndef DFALTPACKETSIZE
+#define DFALTPACKETSIZE 0x20000 /*approximately 100k bytes*/
+#endif
+
+#ifndef DFALTUSERAGENT
+#define DFALTUSERAGENT "netCDF"
+#endif
+
+#endif /*NCDAP_H*/
+
diff --git a/include/ncdispatch.h b/include/ncdispatch.h
index 2f292e0..0e988d8 100644
--- a/include/ncdispatch.h
+++ b/include/ncdispatch.h
@@ -119,11 +119,16 @@ extern NC_Dispatch* NC3_dispatch_table;
 extern int NC3_initialize(void);
 extern int NC3_finalize(void);
 
-#ifdef USE_DAP
+#ifdef ENABLE_DAP
 extern NC_Dispatch* NCD2_dispatch_table;
 extern int NCD2_initialize(void);
 extern int NCD2_finalize(void);
 #endif
+#ifdef ENABLE_DAP4
+extern NC_Dispatch* NCD4_dispatch_table;
+extern int NCD4_initialize(void);
+extern int NCD4_finalize(void);
+#endif
 
 #ifdef USE_PNETCDF
 extern NC_Dispatch* NCP_dispatch_table;
@@ -137,12 +142,6 @@ extern int NC4_initialize(void);
 extern int NC4_finalize(void);
 #endif
 
-#ifdef USE_DAP
-extern NC_Dispatch* NCD4_dispatch_table;
-extern int NCD4_initialize(void);
-extern int NCD4_finalize(void);
-#endif
-
 /* Vectors of ones and zeros */
 extern size_t nc_sizevector0[NC_MAX_VAR_DIMS];
 extern size_t nc_sizevector1[NC_MAX_VAR_DIMS];
@@ -331,35 +330,31 @@ extern NC_Dispatch* NC_get_dispatch_override(void);
 extern void NC_set_dispatch_override(NC_Dispatch*);
 #endif
 
-/* Does the path look like a url? */
-extern int NC_testurl(const char* path);
-/* Return model (0 or 3 or 4) as specified by the url */
-extern int NC_urlmodel(const char* path);
+/* Return model as specified by the url, if any;
+   return a modified url suitable for passing to curl
+*/
+extern int NC_urlmodel(const char* path, int mode, char** newurl);
 
 /* allow access url parse and params without exposing nc_url.h */
 extern int NCDAP_urlparse(const char* s, void** dapurl);
 extern void NCDAP_urlfree(void* dapurl);
 extern const char* NCDAP_urllookup(void* dapurl, const char* param);
 
-/* Test for specific set of servers */
-#if defined(DLL_NETCDF) /* Defined when library is a DLL */
-# if defined(DLL_EXPORT) /* Define when building the library. */
-#  define MSC_NCDISPATCH_EXTRA __declspec(dllexport)
-# else
-#  define MSC_NCDISPATCH_EXTRA __declspec(dllimport)
+#if defined(DLL_NETCDF)
+# if defined(DLL_EXPORT)
+#  define NCC_EXTRA __declspec(dllexport)
+#else
+#  define NCC_EXTRA __declspec(dllimport)
 # endif
+NCC_EXTRA extern int nc__testurl(const char* path, char** basename);
 #else
-#  define MSC_NCDISPATCH_EXTRA
+extern int
+ nc__testurl(const char* parth, char** basename);
 #endif
 
-#define NCD_EXTERNL MSC_NCDISPATCH_EXTRA extern
-
-NCD_EXTERNL char* NC_findtestserver(const char*, const char**);
-NCD_EXTERNL int nc_open_mem(const char*, int, size_t, void*, int*);
-NCD_EXTERNL int nc_finalize();
-
 /* Ping a specific server */
-extern int NCDAP_ping(const char*);
+extern int NCDAP2_ping(const char*);
+extern int NCDAP4_ping(const char*);
 
 /* Misc */
 
@@ -385,7 +380,9 @@ extern int NC_argc;
 extern char* NC_argv[];
 extern int NC_initialized;
 
-NCD_EXTERNL int nc_initialize();
+extern int nc_initialize();
+extern int nc_finalize();
+
 
 
 /**
diff --git a/include/ncexternl.h b/include/ncexternl.h
new file mode 100644
index 0000000..e3e8e52
--- /dev/null
+++ b/include/ncexternl.h
@@ -0,0 +1,23 @@
+/*********************************************************************
+ *   Copyright 2010, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *   $Header$
+ *********************************************************************/
+
+#ifndef NCEXTERNL_H
+#define NCEXTERNL_H
+
+#if defined(DLL_NETCDF) /* define when library is a DLL */
+#  if defined(DLL_EXPORT) /* define when building the library */
+#   define MSC_EXTRA __declspec(dllexport)
+#  else
+#   define MSC_EXTRA __declspec(dllimport)
+#  endif
+#else
+#  define MSC_EXTRA
+#endif	/* defined(DLL_NETCDF) */
+#ifndef EXTERNL
+# define EXTERNL MSC_EXTRA extern
+#endif
+
+#endif /*NCEXTERNL_H*/
diff --git a/include/nchashmap.h b/include/nchashmap.h
index 0d676f7..fa84e49 100644
--- a/include/nchashmap.h
+++ b/include/nchashmap.h
@@ -7,9 +7,7 @@
 #define NCHASHMAP_H 1
 
 #if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__)
-#define externC extern "C"
-#else
-#define externC extern
+extern "C" {
 #endif
 
 #include "nclist.h"
@@ -17,43 +15,47 @@
 /* Define the type of the elements in the hashmap*/
 typedef unsigned long nchashid;
 
-externC int nchashnull(void*);
-
 typedef struct NChashmap {
   size_t alloc;
   size_t size; /* # of pairs still in table*/
   NClist** table;
 } NChashmap;
 
-externC NChashmap* nchashnew(void);
-externC NChashmap* nchashnew0(size_t);
-externC int nchashfree(NChashmap*);
+extern int nchashnull(void*);
+
+extern NChashmap* nchashnew(void);
+extern NChashmap* nchashnew0(size_t);
+extern int nchashfree(NChashmap*);
 
 /* Insert a (ncnchashid,void*) pair into the table*/
 /* Fail if already there*/
-externC int nchashinsert(NChashmap*, nchashid nchash, void* value);
+extern int nchashinsert(NChashmap*, nchashid nchash, void* value);
 
 /* Insert a (nchashid,void*) pair into the table*/
 /* Overwrite if already there*/
-externC int nchashreplace(NChashmap*, nchashid nchash, void* value);
+extern int nchashreplace(NChashmap*, nchashid nchash, void* value);
 
 /* lookup a nchashid and return found/notfound*/
-externC int nchashlookup(NChashmap*, nchashid nchash, void** valuep);
+extern int nchashlookup(NChashmap*, nchashid nchash, void** valuep);
 
 /* lookup a nchashid and return 0 or the value*/
-externC void* nchashget(NChashmap*, nchashid nchash);
+extern void* nchashget(NChashmap*, nchashid nchash);
 
 /* remove a nchashid*/
-externC int nchashremove(NChashmap*, nchashid nchash);
+extern int nchashremove(NChashmap*, nchashid nchash);
 
 /* Return the ith pair; order is completely arbitrary*/
 /* Can be expensive*/
-externC int nchashith(NChashmap*, int i, nchashid*, void**);
+extern int nchashith(NChashmap*, int i, nchashid*, void**);
 
-externC int nchashkeys(NChashmap* hm, nchashid** keylist);
+extern int nchashkeys(NChashmap* hm, nchashid** keylist);
 
 /* return the # of pairs in table*/
 #define nchashsize(hm) ((hm)?(hm)->size:0)
 
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__)
+}
+#endif
+
 #endif /*NCHASHMAP_H*/
 
diff --git a/include/nclist.h b/include/nclist.h
index 1bd7a16..f176072 100644
--- a/include/nclist.h
+++ b/include/nclist.h
@@ -6,12 +6,10 @@
 /* Define the type of the elements in the list*/
 
 #if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__)
-#define EXTERNC extern "C"
-#else
-#define EXTERNC extern
+extern "C" {
 #endif
 
-EXTERNC int nclistnull(void*);
+extern int nclistnull(void*);
 
 typedef struct NClist {
   unsigned long alloc;
@@ -19,39 +17,42 @@ typedef struct NClist {
   void** content;
 } NClist;
 
-EXTERNC NClist* nclistnew(void);
-EXTERNC int nclistfree(NClist*);
-EXTERNC int nclistsetalloc(NClist*,unsigned long);
-EXTERNC int nclistsetlength(NClist*,unsigned long);
+extern NClist* nclistnew(void);
+extern int nclistfree(NClist*);
+extern int nclistfreeall(NClist*);
+extern int nclistsetalloc(NClist*,unsigned long);
+extern int nclistsetlength(NClist*,unsigned long);
 
 /* Set the ith element */
-EXTERNC int nclistset(NClist*,unsigned long,void*);
+extern int nclistset(NClist*,unsigned long,void*);
 /* Get value at position i */
-EXTERNC void* nclistget(NClist*,unsigned long);/* Return the ith element of l */
+extern void* nclistget(NClist*,unsigned long);/* Return the ith element of l */
 /* Insert at position i; will push up elements i..|seq|. */
-EXTERNC int nclistinsert(NClist*,unsigned long,void*);
+extern int nclistinsert(NClist*,unsigned long,void*);
 /* Remove element at position i; will move higher elements down */
-EXTERNC void* nclistremove(NClist* l, unsigned long i);
+extern void* nclistremove(NClist* l, unsigned long i);
 
 /* Tail operations */
-EXTERNC int nclistpush(NClist*,void*); /* Add at Tail */
-EXTERNC void* nclistpop(NClist*);
-EXTERNC void* nclisttop(NClist*);
+extern int nclistpush(NClist*,void*); /* Add at Tail */
+extern void* nclistpop(NClist*);
+extern void* nclisttop(NClist*);
 
 /* Duplicate and return the content (null terminate) */
-EXTERNC void** nclistdup(NClist*);
+extern void** nclistdup(NClist*);
 
 /* Look for value match */
-EXTERNC int nclistcontains(NClist*, void*);
+extern int nclistcontains(NClist*, void*);
 
 /* Remove element by value; only removes first encountered */
-EXTERNC int nclistelemremove(NClist* l, void* elem);
+extern int nclistelemremove(NClist* l, void* elem);
 
 /* remove duplicates */
-EXTERNC int nclistunique(NClist*);
+extern int nclistunique(NClist*);
 
 /* Create a clone of a list */
-EXTERNC NClist* nclistclone(NClist*);
+extern NClist* nclistclone(NClist*);
+
+extern void* nclistextract(NClist*);
 
 /* Following are always "in-lined"*/
 #define nclistclear(l) nclistsetlength((l),0)
@@ -59,4 +60,8 @@ EXTERNC NClist* nclistclone(NClist*);
 #define nclistcontents(l)  ((l)==NULL?NULL:(l)->content)
 #define nclistlength(l)  ((l)==NULL?0:(l)->length)
 
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__)
+}
+#endif
+
 #endif /*NCLIST_H*/
diff --git a/include/nclog.h b/include/nclog.h
index 4b8a0c7..f5b068c 100644
--- a/include/nclog.h
+++ b/include/nclog.h
@@ -7,6 +7,8 @@
 #ifndef NCLOG_H
 #define NCLOG_H
 
+#include "ncexternl.h"
+
 #define NCENVFLAG "NCLOGFILE"
 
 /* Suggested tag values */
@@ -15,17 +17,25 @@
 #define NCLOGERR 2
 #define NCLOGDBG 3
 
-extern void ncloginit(void);
-extern int ncsetlogging(int tf);
-extern int nclogopen(const char* file);
-extern void nclogclose(void);
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__)
+extern "C" {
+#endif
+
+EXTERNL void ncloginit(void);
+EXTERNL int ncsetlogging(int tf);
+EXTERNL int nclogopen(const char* file);
+EXTERNL void nclogclose(void);
 
 /* The tag value is an arbitrary integer */
-extern void nclog(int tag, const char* fmt, ...);
-extern void nclogtext(int tag, const char* text);
-extern void nclogtextn(int tag, const char* text, size_t count);
+EXTERNL void nclog(int tag, const char* fmt, ...);
+EXTERNL void nclogtext(int tag, const char* text);
+EXTERNL void nclogtextn(int tag, const char* text, size_t count);
 
 /* Provide printable names for tags */
-extern void nclogsettags(char** tagset, char* dfalt);
+EXTERNL void nclogsettags(char** tagset, char* dfalt);
+
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__)
+}
+#endif
 
 #endif /*NCLOG_H*/
diff --git a/include/ncoffsets.h b/include/ncoffsets.h
new file mode 100644
index 0000000..ca10796
--- /dev/null
+++ b/include/ncoffsets.h
@@ -0,0 +1,56 @@
+/*********************************************************************
+ *   Copyright 2009, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#ifndef NCOFFSETS_H
+#define NCOFFSETS_H 1
+
+typedef struct Alignment {
+    char* typename;
+    unsigned int alignment;
+} Alignment;
+
+/* Define indices for every primitive C type */
+/* NAT => NOT-A-TYPE*/
+#define NATINDEX       0
+#define CHARINDEX      1
+#define UCHARINDEX     2
+#define SHORTINDEX     3
+#define USHORTINDEX    4
+#define INTINDEX       5
+#define UINTINDEX      6
+#define LONGINDEX      7
+#define ULONGINDEX     8
+#define LONGLONGINDEX  9
+#define ULONGLONGINDEX 10
+#define FLOATINDEX     11
+#define DOUBLEINDEX    12
+#define PTRINDEX       13
+#define NCVLENINDEX    14
+
+#define NCTYPES        15
+
+/* Capture in struct and in a vector*/
+typedef struct Typealignset {
+    Alignment charalign;	/* char*/
+    Alignment ucharalign;	/* unsigned char*/
+    Alignment shortalign;	/* short*/
+    Alignment ushortalign;	/* unsigned short*/
+    Alignment intalign;		/* int*/
+    Alignment uintalign;	/* unsigned int*/
+    Alignment longalign;	/* long*/
+    Alignment ulongalign;	/* unsigned long*/
+    Alignment longlongalign;	/* long long*/
+    Alignment ulonglongalign;	/* unsigned long long*/
+    Alignment floatalign;	/* float*/
+    Alignment doublealign;	/* double*/
+    Alignment ptralign;		/* void**/
+    Alignment ncvlenalign;	/* nc_vlen_t*/
+} Typealignset;
+
+typedef Alignment Typealignvec;
+
+EXTERNL unsigned int nctypealignment(nc_type nctype);
+
+#endif /*NCOFFSETS_H*/
diff --git a/include/ncrc.h b/include/ncrc.h
new file mode 100644
index 0000000..c881680
--- /dev/null
+++ b/include/ncrc.h
@@ -0,0 +1,26 @@
+/*********************************************************************
+  *   Copyright 2016, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+
+#ifndef NCRC_H
+#define NCRC_H
+
+#include "nclist.h"
+
+typedef struct NCTriple {
+	char* tag;
+        char* key;
+        char* value;
+} NCTriple;
+
+typedef struct NCTripleStore {
+    NClist* triples; /* list of NCTriple* */
+} NCTripleStore;
+
+/* read and compile the rc file, if any */
+extern int ncrc_load(const char* filename);
+extern char* ncrc_lookup(NCTripleStore*, char* key, char* hostport);
+extern void ncrc_reset(NCTripleStore*);
+
+#endif /*NCRC_H*/
diff --git a/include/nctestserver.h b/include/nctestserver.h
new file mode 100644
index 0000000..2bd8eae
--- /dev/null
+++ b/include/nctestserver.h
@@ -0,0 +1,154 @@
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <curl/curl.h>
+#include "netcdf.h"
+
+#define MAXSERVERURL 4096
+#define TIMEOUT 10 /*seconds*/
+#define BUFSIZE 8192 /*bytes*/
+
+static int ping(const char* url);
+
+static char**
+parseServers(const char* remotetestservers)
+{
+    char* rts;
+    char** servers = NULL;
+    char** list;
+    char* p;
+    char* svc;
+    char** l;
+    
+    list = (char**)malloc(sizeof(char*) * (int)(strlen(remotetestservers)/2));
+    if(list == NULL) return NULL;
+    l = list;
+    rts = strdup(remotetestservers);
+    if(rts == NULL) {free(list); return NULL;}
+    p = rts;
+    for(;;) {
+	svc = p;
+	p = strchr(svc,',');
+	if(p != NULL) *p = '\0';
+	*l++ = strdup(svc);
+	if(p == NULL) break;
+	p++;
+    }
+    *l = NULL;
+    if(p) free(p);
+    servers = list;
+    return servers;
+}
+
+/**
+Given a partial suffix path and a specified
+protocol, test if a request to any of the test
+servers + path returns some kind of result.
+This indicates that the server is up and running.
+Return the complete url for the server plus the path.
+*/
+
+char*
+nc_findtestserver(const char* path, int isdap4, const char* serverlist)
+{
+    char** svc;
+    char url[MAXSERVERURL];
+
+    if((svc = parseServers(serverlist))==NULL) {
+	fprintf(stderr,"cannot parse test server list: %s\n",serverlist);
+	return NULL;
+    }
+    for(;*svc;svc++) {
+	if(*svc == NULL || strlen(*svc) == 0)
+	    return NULL;
+        if(path == NULL) path = "";
+        if(strlen(path) > 0 && path[0] == '/')
+	    path++;
+        snprintf(url,MAXSERVERURL,"http://%s/%s",*svc,path);
+	if(ping(url) == NC_NOERR)
+	    return strdup(url);
+    }
+    return NULL;
+}
+
+#define CERR(expr) if((cstat=(expr)) != CURLE_OK) goto done;
+
+struct Buffer {
+    char data[BUFSIZE];
+    size_t offset; /* into buffer */
+};
+
+static size_t
+WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
+{
+    struct Buffer* buffer = (struct Buffer*)data;
+    size_t total = size * nmemb;
+    size_t canwrite = total; /* assume so */
+    if(total == 0) {
+        fprintf(stderr,"WriteMemoryCallback: zero sized chunk\n");
+	goto done;
+    }
+    if((buffer->offset + total) > sizeof(buffer->data))
+	canwrite = (sizeof(buffer->data) - buffer->offset); /* partial read */
+    if(canwrite > 0)
+        memcpy(&(buffer->data[buffer->offset]),ptr,canwrite);
+    buffer->offset += canwrite;
+done:
+    return total; /* pretend we captured everything */
+}
+
+static int
+ping(const char* url)
+{
+    int stat = NC_NOERR;
+    CURLcode cstat = CURLE_OK;
+    CURL* curl = NULL;
+    long http_code = 0;
+    struct Buffer data;
+
+    /* Create a CURL instance */
+    curl = curl_easy_init();
+    if (curl == NULL) {cstat = CURLE_OUT_OF_MEMORY; goto done;}
+    CERR((curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1)));
+
+    /* Use redirects */
+    CERR((curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10L)));
+    CERR((curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L)));
+
+    /* use a very short timeout: 10 seconds */
+    CERR((curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)TIMEOUT)));
+
+    /* fail on HTTP 400 code errors */
+    CERR((curl_easy_setopt(curl, CURLOPT_FAILONERROR, (long)1)));
+
+    /* Set the URL */
+    CERR((curl_easy_setopt(curl, CURLOPT_URL, (void*)url)));
+
+    /* send all data to this function  */
+    CERR((curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)));
+
+    /* we pass our file to the callback function */
+    CERR((curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&data)));
+
+    data.offset = 0;
+    memset(data.data,0,sizeof(data.data));
+
+    CERR((curl_easy_perform(curl)));
+
+    /* Don't trust curl to return an error when request gets 404 */
+    CERR((curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &http_code)));
+    if(http_code >= 400) {
+	cstat = CURLE_HTTP_RETURNED_ERROR;
+	goto done;
+    }
+
+done:
+    if(cstat != CURLE_OK) {
+        fprintf(stderr, "curl error: %s", curl_easy_strerror(cstat));
+	stat = NC_ECURL;
+    }
+    if (curl != NULL)
+        curl_easy_cleanup(curl);
+    return stat;
+}
diff --git a/include/ncuri.h b/include/ncuri.h
index 6709859..62e2739 100644
--- a/include/ncuri.h
+++ b/include/ncuri.h
@@ -1,59 +1,92 @@
-/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
-   See the COPYRIGHT file for more information. */
+/*
+ *	Copyright 1996, University Corporation for Atmospheric Research
+ *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ */
 
 #ifndef NCURI_H
 #define NCURI_H
 
+/* Define error codes */
+#define NCU_OK (0)
+#define NCU_EINVAL        (1) /* Generic, mostly means bad argument */
+#define NCU_EBADURL       (2)
+#define NCU_ENOMEM        (3)
+#define NCU_EPROTO        (4)
+#define NCU_EPATH         (5)
+#define NCU_EUSRPWD       (6)
+#define NCU_EHOST         (7)
+#define NCU_EPORT         (8)
+#define NCU_EPARAMS       (9)
+#define NCU_ENOPARAM      (10)
+#define NCU_ECONSTRAINTS  (11)
+
+/* Define flags to control what is included by ncuribuild*/
+#define NCURIPATH    1
+#define NCURIPWD     2
+#define NCURIQUERY   4
+#define NCURIFRAG    8
+#define NCURIENCODE  16 /* If output should be encoded */
+#define NCURIBASE    (NCURIPWD|NCURIPATH)
+#define NCURISVC     (NCURIQUERY|NCURIBASE) /* for sending to server  */
+#define NCURIALL     (NCURIPATH|NCURIPWD|NCURIQUERY|NCURIFRAG) /* for rebuilding after changes */
+
+
 /*! This is an open structure meaning
-	it is ok to directly access its fields*/
+	it is ok to directly access its fields
+*/
 typedef struct NCURI {
-    char* uri;        /* as passed by the caller */
-    char* params;     /* all params */
-    char** paramlist;    /*!<null terminated list */
-    char* constraint; /*!< projection+selection */
-    char* projection; /*!< without leading '?'*/
-    char* selection;  /*!< with leading '&'*/
-    char* strings;    /* first char of strings is always '\0' */
-    /* Following all point into the strings field */
+    char* uri; /* copy of url as passed by the caller */
     char* protocol;
     char* user; /* from user:password@ */
     char* password; /* from user:password@ */
     char* host;	      /*!< host*/
-    char* port;	      /*!< host */
-    char* file;	      /*!< file */
+    char* port;	      /*!< port */
+    char* path;	      /*!< path */
+    char* query;      /*!< query */
+    char* fragment;   /*!< fragment */
+    char** fraglist; /* envv style list of decomposed fragment*/
+    char** querylist; /* envv style list of decomposed query*/
+#if 0
+    char* projection; /*!< without leading '?'*/
+    char* selection;  /*!< with leading '&'*/
+#endif
 } NCURI;
 
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
+extern "C" {
+#endif
+
 extern int ncuriparse(const char* s, NCURI** ncuri);
 extern void ncurifree(NCURI* ncuri);
 
+/* Replace the protocol */
+extern int ncurisetprotocol(NCURI*,const char* newprotocol);
+
 /* Replace the constraints */
-extern void ncurisetconstraints(NCURI*,const char* constraints);
+extern int ncurisetquery(NCURI*,const char* query);
 
 /* Construct a complete NC URI; caller frees returned string */
-
-/* Define flags to control what is included */
-#define NCURICONSTRAINTS	 1
-#define NCURIUSERPWD	  	 2
-#define NCURIPREFIXPARAMS  	 4
-#define NCURISUFFIXPARAMS	 8
-#define NCURIPARAMS	  	NCURIPREFIXPARAMS
-#define NCURIENCODE		16 /* If output should be encoded */
-#define NCURISTD	  	(NCURICONSTRAINTS|NCURIUSERPWD)
-
 extern char* ncuribuild(NCURI*,const char* prefix, const char* suffix, int flags);
 
+/*! Search the fragment for a given parameter
+    Null result => entry not found; !NULL=>found;
+    In any case, the result is imutable and should not be free'd.
+*/
+extern const char* ncurilookup(NCURI*, const char* param);
 
-/* Param Management */
-extern int ncuridecodeparams(NCURI* ncuri);
-extern int ncurisetparams(NCURI* ncuri,const char*);
-
-/*! 0 result => entry not found; 1=>found; result holds value (may be null).
+/*! Search the query for a given parameter
+    Null result => entry not found; !NULL=>found;
     In any case, the result is imutable and should not be free'd.
 */
-extern int ncurilookup(NCURI*, const char* param, const char** result);
+extern const char* ncuriquerylookup(NCURI*, const char* param);
 
+/* URL Encode/Decode */
 extern char* ncuriencode(char* s, char* allowable);
 extern char* ncuridecode(char* s);
 extern char* ncuridecodeonly(char* s, char*);
 
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
+}
+#endif
+
 #endif /*NCURI_H*/
diff --git a/include/ncutf8.h b/include/ncutf8.h
new file mode 100644
index 0000000..4ddbf75
--- /dev/null
+++ b/include/ncutf8.h
@@ -0,0 +1,34 @@
+/*
+ *	Copyright 2017, University Corporation for Atmospheric Research
+ *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ */
+
+#ifndef NCUTF8_H
+#define NCUTF8_H 1
+
+/* Provide a wrapper around whatever utf8 library we use. */
+
+/*
+ * Check validity of a UTF8 encoded null-terminated byte string.
+ * Return codes:
+ * NC_NOERR -- string is valid utf8
+ * NC_ENOMEM -- out of memory
+ * NC_EBADNAME-- not valid utf8
+ */
+extern int nc_utf8_validate(const unsigned char * name);
+
+/*
+ * Apply NFC normalization to a string.
+ * Returns a pointer to newly allocated memory of an NFC
+ * normalized version of the null-terminated string 'str'.
+ * Pointer to normalized string is returned in normalp argument;
+ * caller must free.
+ * Return codes:
+ * NC_NOERR -- success
+ * NC_ENOMEM -- out of memory
+ * NC_EBADNAME -- other failure
+ */
+extern int nc_utf8_normalize(const unsigned char* str, unsigned char** normalp);
+
+#endif /*NCUTF8_H*/
+
diff --git a/include/ncwinpath.h b/include/ncwinpath.h
new file mode 100644
index 0000000..0960011
--- /dev/null
+++ b/include/ncwinpath.h
@@ -0,0 +1,35 @@
+/*
+ *	Copyright 1996, University Corporation for Atmospheric Research
+ *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ */
+#ifndef _NCWINIO_H_
+#define _NCWINIO_H_
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "ncexternl.h"
+
+#ifdef _MSC_VER
+#define WINPATH 1
+#endif
+#ifdef __MINGW32__
+#define WINPATH 1
+#endif
+
+
+/* path converter */
+EXTERNL char* NCpathcvt(const char* path);
+
+#ifdef WINPATH
+/* path converter wrappers*/
+EXTERNL FILE* NCfopen(const char* path, const char* flags);
+EXTERNL int NCopen3(const char* path, int flags, int mode);
+EXTERNL int NCopen2(const char* path, int flags);
+#else /*!WINPATH*/
+#define NCfopen(path,flags) fopen((path),(flags))
+#define NCopen3(path,flags,mode) open((path),(flags),(mode))
+#define NCopen2(path,flags) open((path),(flags))
+#endif /*WINPATH*/
+
+#endif /* _NCWINIO_H_ */
diff --git a/include/netcdf.h b/include/netcdf.h
index 2dbcebe..176c791 100644
--- a/include/netcdf.h
+++ b/include/netcdf.h
@@ -20,10 +20,6 @@ See \ref copyright file for more info.
 #include <malloc.h>
 #endif
 
-#ifdef _WIN64
-#include <sys/stat.h>
-#endif
-
 /*! The nc_type type is just an int. */
 typedef int nc_type;
 
@@ -406,7 +402,9 @@ by the desired type. */
 #define NC_EDAPSVC      (-70)      /**< DAP server error */
 #define NC_EDAS		(-71)      /**< Malformed or inaccessible DAS */
 #define NC_EDDS		(-72)      /**< Malformed or inaccessible DDS */
+#define NC_EDMR         NC_EDDS    /**< Dap4 alias */
 #define NC_EDATADDS	(-73)      /**< Malformed or inaccessible DATADDS */
+#define NC_EDATADAP     NC_EDATADDS    /**< Dap4 alias */
 #define NC_EDAPURL	(-74)      /**< Malformed DAP URL */
 #define NC_EDAPCONSTRAINT (-75)    /**< Malformed DAP Constraint*/
 #define NC_ETRANSLATION (-76)      /**< Untranslatable construct */
@@ -484,9 +482,9 @@ by the desired type. */
 #  else
 #   define MSC_EXTRA __declspec(dllimport)
 #  endif
-#include <io.h>
+#  include <io.h>
 #else
-#define MSC_EXTRA
+#  define MSC_EXTRA
 #endif	/* defined(DLL_NETCDF) */
 
 # define EXTERNL MSC_EXTRA extern
@@ -1948,7 +1946,7 @@ ncrecget(int ncid, long recnum, void **datap);
 EXTERNL int
 ncrecput(int ncid, long recnum, void *const *datap);
 
-/* EXTERNL int nc_finalize(); */
+EXTERNL int nc_finalize();
 
 /* End v2.4 backward compatibility */
 #endif /*!NO_NETCDF_2*/
diff --git a/include/netcdf_mem.h b/include/netcdf_mem.h
index 12f6bfa..a388d28 100644
--- a/include/netcdf_mem.h
+++ b/include/netcdf_mem.h
@@ -12,24 +12,12 @@
 #ifndef NETCDF_MEM_H
 #define NETCDF_MEM_H 1
 
+#include <netcdf.h>
+
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
-/* Declaration modifiers for DLL support (MSC et al) */
-#if defined(DLL_NETCDF) /* define when library is a DLL */
-#  if defined(DLL_EXPORT) /* define when building the library */
-#   define MSC_EXTRA __declspec(dllexport)
-#  else
-#   define MSC_EXTRA __declspec(dllimport)
-#  endif
-#include <io.h>
-#else
-#define MSC_EXTRA
-#endif	/* defined(DLL_NETCDF) */
-
-# define EXTERNL MSC_EXTRA extern
-
 EXTERNL int nc_open_mem(const char* path, int mode, size_t size, void* memory, int* ncidp);
 
 #if defined(__cplusplus)
diff --git a/include/netcdf_meta.h.in b/include/netcdf_meta.h.in
index 3281cbf..a50d0ae 100644
--- a/include/netcdf_meta.h.in
+++ b/include/netcdf_meta.h.in
@@ -42,7 +42,8 @@
 #define NC_HAS_HDF4      @NC_HAS_HDF4@ /*!< hdf4 support. */
 #define NC_HAS_HDF5      @NC_HAS_HDF5@ /*!< hdf5 support. */
 #define NC_HAS_SZIP      @NC_HAS_SZIP@ /*!< szip support (hdf5 only) */
-#define NC_HAS_DAP       @NC_HAS_DAP@ /*!< DAP support. */
+#define NC_HAS_DAP2      @NC_HAS_DAP2@ /*!< DAP2 support. */
+#define NC_HAS_DAP4      @NC_HAS_DAP4@ /*!< DAP4 support. */
 #define NC_HAS_DISKLESS  @NC_HAS_DISKLESS@ /*!< diskless support. */
 #define NC_HAS_MMAP      @NC_HAS_MMAP@ /*!< mmap support. */
 #define NC_HAS_JNA       @NC_HAS_JNA@ /*!< jna support. */
diff --git a/include/utf8proc.h b/include/utf8proc.h
deleted file mode 100644
index 9d9bf82..0000000
--- a/include/utf8proc.h
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- *  Copyright (c) 2006-2007 Jan Behrens, FlexiGuided GmbH, Berlin
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),
- *  to deal in the Software without restriction, including without limitation
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- *  Software is furnished to do so, subject to the following conditions:
- *
- *  The above copyright notice and this permission notice shall be included in
- *  all copies or substantial portions of the Software.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *  DEALINGS IN THE SOFTWARE.
- */
-
-
-/*
- *  File name:    utf8proc.h
- *  Version:      1.1.1
- *  Last changed: 2007-07-22
- *  Changed 2008-05-16 by rkr to add config.h and replacement for stdbool.h
- *                            for pre-C99 compilers that don't support bool.
- *  Changed 2008-06-05 by rkr to add utf8proc_check(str, options) function for
- *                            for just checking UTF-8 validity
- *  Description:
- *  Header files for libutf8proc, which is a mapping tool for UTF-8 strings
- *  with following features:
- *  - decomposing and composing of strings
- *  - replacing compatibility characters with their equivalents
- *  - stripping of "default ignorable characters"
- *    like SOFT-HYPHEN or ZERO-WIDTH-SPACE
- *  - folding of certain characters for string comparison
- *    (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-")
- *    (see "LUMP" option)
- *  - optional rejection of strings containing non-assigned code points
- *  - stripping of control characters
- *  - stripping of character marks (accents, etc.)
- *  - transformation of LF, CRLF, CR and NEL to line-feed (LF)
- *    or to the unicode chararacters for paragraph separation (PS)
- *    or line separation (LS).
- *  - unicode case folding (for case insensitive string comparisons)
- *  - rejection of illegal UTF-8 data
- *    (i.e. UTF-8 encoded UTF-16 surrogates)
- *  - support for korean hangul characters
- *  Unicode Version 5.0.0 is supported.
- */
-
-
-#ifndef UTF8PROC_H
-#define UTF8PROC_H
-
-
-#include "config.h"
-
-#include <stdlib.h>
-#ifdef HAVE_STDBOOL_H
-#include <stdbool.h>
-#else
-# if ! HAVE__BOOL
-#  ifdef __cplusplus
-typedef bool _Bool;
-#  else
-typedef unsigned char _Bool;
-#  endif
-# endif
-#ifndef _Bool
-# define bool _Bool
-#endif
-# define false 0
-# define true 1
-# define __bool_true_false_are_defined 1
-#endif
-#include <sys/types.h>
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#elif defined(_MSC_VER) && defined(HAVE_STDINT_H)
-#include <stdint.h>
-#else /* HAVE_INTTYPES_H */
-#include <pstdint.h>
-#endif /* HAVE_INTTYPES_H */ 
-#include <limits.h>
-
-#ifndef HAVE_SSIZE_T
-#define ssize_t int
-#endif
-
-#ifndef SSIZE_MAX
-#define SSIZE_MAX (SIZE_MAX/2)
-#endif
-
-#define UTF8PROC_NULLTERM  (1<<0)
-#define UTF8PROC_STABLE    (1<<1)
-#define UTF8PROC_COMPAT    (1<<2)
-#define UTF8PROC_COMPOSE   (1<<3)
-#define UTF8PROC_DECOMPOSE (1<<4)
-#define UTF8PROC_IGNORE    (1<<5)
-#define UTF8PROC_REJECTNA  (1<<6)
-#define UTF8PROC_NLF2LS    (1<<7)
-#define UTF8PROC_NLF2PS    (1<<8)
-#define UTF8PROC_NLF2LF    (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS)
-#define UTF8PROC_STRIPCC   (1<<9)
-#define UTF8PROC_CASEFOLD  (1<<10)
-#define UTF8PROC_CHARBOUND (1<<11)
-#define UTF8PROC_LUMP      (1<<12)
-#define UTF8PROC_STRIPMARK (1<<13)
-/*
- *  Flags being regarded by several functions in the library:
- *  NULLTERM:  The given UTF-8 input is NULL terminated.
- *  STABLE:    Unicode Versioning Stability has to be respected.
- *  COMPAT:    Compatibility decomposition
- *             (i.e. formatting information is lost)
- *  COMPOSE:   Return a result with composed characters.
- *  DECOMPOSE: Return a result with decomposed characters.
- *  IGNORE:    Strip "default ignorable characters"
- *  REJECTNA:  Return an error, if the input contains unassigned
- *             code points.
- *  NLF2LS:    Indicating that NLF-sequences (LF, CRLF, CR, NEL) are
- *             representing a line break, and should be converted to the
- *             unicode character for line separation (LS).
- *  NLF2PS:    Indicating that NLF-sequences are representing a paragraph
- *             break, and should be converted to the unicode character for
- *             paragraph separation (PS).
- *  NLF2LF:    Indicating that the meaning of NLF-sequences is unknown.
- *  STRIPCC:   Strips and/or convers control characters.
- *             NLF-sequences are transformed into space, except if one of
- *             the NLF2LS/PS/LF options is given.
- *             HorizontalTab (HT) and FormFeed (FF) are treated as a
- *             NLF-sequence in this case.
- *             All other control characters are simply removed.
- *  CASEFOLD:  Performs unicode case folding, to be able to do a
- *             case-insensitive string comparison.
- *  CHARBOUND: Inserts 0xFF bytes at the beginning of each sequence which
- *             is representing a single grapheme cluster (see UAX#29).
- *  LUMP:      Lumps certain characters together
- *             (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-").
- *             (See lump.txt for details.)
- *             If NLF2LF is set, this includes a transformation of
- *             paragraph and line separators to ASCII line-feed (LF).
- *  STRIPMARK: Strips all character markings
- *             (non-spacing, spacing and enclosing) (i.e. accents)
- *             NOTE: this option works only with COMPOSE or DECOMPOSE
- */
-
-#define UTF8PROC_ERROR_NOMEM -1
-#define UTF8PROC_ERROR_OVERFLOW -2
-#define UTF8PROC_ERROR_INVALIDUTF8 -3
-#define UTF8PROC_ERROR_NOTASSIGNED -4
-#define UTF8PROC_ERROR_INVALIDOPTS -5
-/*
- *  Error codes being returned by almost all functions:
- *  ERROR_NOMEM:       Memory could not be allocated.
- *  ERROR_OVERFLOW:    The given string is too long to be processed.
- *  ERROR_INVALIDUTF8: The given string is not a legal UTF-8 string.
- *  ERROR_NOTASSIGNED: The REJECTNA flag was set,
- *                     and an unassigned code point was found.
- *  ERROR_INVALIDOPTS: Invalid options have been used.
- */
-
-typedef int16_t utf8proc_propval_t;
-typedef struct utf8proc_property_struct {
-  utf8proc_propval_t category;
-  utf8proc_propval_t combining_class;
-  utf8proc_propval_t bidi_class;
-  utf8proc_propval_t decomp_type;
-  const int32_t *decomp_mapping;
-  unsigned bidi_mirrored:1;
-  int32_t uppercase_mapping;
-  int32_t lowercase_mapping;
-  int32_t titlecase_mapping;
-  int32_t comb1st_index;
-  int32_t comb2nd_index;
-  unsigned comp_exclusion:1;
-  unsigned ignorable:1;
-  unsigned control_boundary:1;
-  unsigned extend:1;
-  const int32_t *casefold_mapping;
-} utf8proc_property_t;
-
-#define UTF8PROC_CATEGORY_LU  1
-#define UTF8PROC_CATEGORY_LL  2
-#define UTF8PROC_CATEGORY_LT  3
-#define UTF8PROC_CATEGORY_LM  4
-#define UTF8PROC_CATEGORY_LO  5
-#define UTF8PROC_CATEGORY_MN  6
-#define UTF8PROC_CATEGORY_MC  7
-#define UTF8PROC_CATEGORY_ME  8
-#define UTF8PROC_CATEGORY_ND  9
-#define UTF8PROC_CATEGORY_NL 10
-#define UTF8PROC_CATEGORY_NO 11
-#define UTF8PROC_CATEGORY_PC 12
-#define UTF8PROC_CATEGORY_PD 13
-#define UTF8PROC_CATEGORY_PS 14
-#define UTF8PROC_CATEGORY_PE 15
-#define UTF8PROC_CATEGORY_PI 16
-#define UTF8PROC_CATEGORY_PF 17
-#define UTF8PROC_CATEGORY_PO 18
-#define UTF8PROC_CATEGORY_SM 19
-#define UTF8PROC_CATEGORY_SC 20
-#define UTF8PROC_CATEGORY_SK 21
-#define UTF8PROC_CATEGORY_SO 22
-#define UTF8PROC_CATEGORY_ZS 23
-#define UTF8PROC_CATEGORY_ZL 24
-#define UTF8PROC_CATEGORY_ZP 25
-#define UTF8PROC_CATEGORY_CC 26
-#define UTF8PROC_CATEGORY_CF 27
-#define UTF8PROC_CATEGORY_CS 28
-#define UTF8PROC_CATEGORY_CO 29
-#define UTF8PROC_CATEGORY_CN 30
-#define UTF8PROC_BIDI_CLASS_L    1
-#define UTF8PROC_BIDI_CLASS_LRE  2
-#define UTF8PROC_BIDI_CLASS_LRO  3
-#define UTF8PROC_BIDI_CLASS_R    4
-#define UTF8PROC_BIDI_CLASS_AL   5
-#define UTF8PROC_BIDI_CLASS_RLE  6
-#define UTF8PROC_BIDI_CLASS_RLO  7
-#define UTF8PROC_BIDI_CLASS_PDF  8
-#define UTF8PROC_BIDI_CLASS_EN   9
-#define UTF8PROC_BIDI_CLASS_ES  10
-#define UTF8PROC_BIDI_CLASS_ET  11
-#define UTF8PROC_BIDI_CLASS_AN  12
-#define UTF8PROC_BIDI_CLASS_CS  13
-#define UTF8PROC_BIDI_CLASS_NSM 14
-#define UTF8PROC_BIDI_CLASS_BN  15
-#define UTF8PROC_BIDI_CLASS_B   16
-#define UTF8PROC_BIDI_CLASS_S   17
-#define UTF8PROC_BIDI_CLASS_WS  18
-#define UTF8PROC_BIDI_CLASS_ON  19
-#define UTF8PROC_DECOMP_TYPE_FONT      1
-#define UTF8PROC_DECOMP_TYPE_NOBREAK   2
-#define UTF8PROC_DECOMP_TYPE_INITIAL   3
-#define UTF8PROC_DECOMP_TYPE_MEDIAL    4
-#define UTF8PROC_DECOMP_TYPE_FINAL     5
-#define UTF8PROC_DECOMP_TYPE_ISOLATED  6
-#define UTF8PROC_DECOMP_TYPE_CIRCLE    7
-#define UTF8PROC_DECOMP_TYPE_SUPER     8
-#define UTF8PROC_DECOMP_TYPE_SUB       9
-#define UTF8PROC_DECOMP_TYPE_VERTICAL 10
-#define UTF8PROC_DECOMP_TYPE_WIDE     11
-#define UTF8PROC_DECOMP_TYPE_NARROW   12
-#define UTF8PROC_DECOMP_TYPE_SMALL    13
-#define UTF8PROC_DECOMP_TYPE_SQUARE   14
-#define UTF8PROC_DECOMP_TYPE_FRACTION 15
-#define UTF8PROC_DECOMP_TYPE_COMPAT   16
-
-extern const int8_t utf8proc_utf8class[256];
-
-const char *utf8proc_errmsg(ssize_t errcode);
-/*
- *  Returns a static error string for the given error code.
- */
-
-ssize_t utf8proc_iterate(const uint8_t *str, ssize_t strlen, int32_t *dst);
-/*
- *  Reads a single char from the UTF-8 sequence being pointed to by 'str'.
- *  The maximum number of bytes read is 'strlen', unless 'strlen' is
- *  negative.
- *  If a valid unicode char could be read, it is stored in the variable
- *  being pointed to by 'dst', otherwise that variable will be set to -1.
- *  In case of success the number of bytes read is returned, otherwise a
- *  negative error code is returned.
- */
-
-bool utf8proc_codepoint_valid(int32_t uc);
-/*
- *  Returns 1, if the given unicode code-point is valid, otherwise 0.
- */
-
-ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst);
-/*
- *  Encodes the unicode char with the code point 'uc' as an UTF-8 string in
- *  the byte array being pointed to by 'dst'. This array has to be at least
- *  4 bytes long.
- *  In case of success the number of bytes written is returned,
- *  otherwise 0.
- *  This function does not check if 'uc' is a valid unicode code point.
- */
-
-const utf8proc_property_t *utf8proc_get_property(int32_t uc);
-/*
- *  Returns a pointer to a (constant) struct containing information about
- *  the unicode char with the given code point 'uc'.
- *  If the character is not existent a pointer to a special struct is
- *  returned, where 'category' is a NULL pointer.
- *  WARNING: The parameter 'uc' has to be in the range of 0x0000 to
- *           0x10FFFF, otherwise the program might crash!
- */
-
-ssize_t utf8proc_decompose_char(
-  int32_t uc, int32_t *dst, ssize_t bufsize,
-  int options, int *last_boundclass
-);
-/*
- *  Writes a decomposition of the unicode char 'uc' into the array being
- *  pointed to by 'dst'.
- *  Following flags in the 'options' field are regarded:
- *  REJECTNA:  an unassigned unicode code point leads to an error
- *  IGNORE:    "default ignorable" chars are stripped
- *  CASEFOLD:  unicode casefolding is applied
- *  COMPAT:    replace certain characters with their
- *             compatibility decomposition
- *  CHARBOUND: Inserts 0xFF bytes before each grapheme cluster
- *  LUMP:      lumps certain different characters together
- *  STRIPMARK: removes all character marks
- *  The pointer 'last_boundclass' has to point to an integer variable which
- *  is storing the last character boundary class, if the CHARBOUND option
- *  is used.
- *  In case of success the number of chars written is returned,
- *  in case of an error, a negative error code is returned.
- *  If the number of written chars would be bigger than 'bufsize',
- *  the buffer (up to 'bufsize') has inpredictable data, and the needed
- *  buffer size is returned.
- *  WARNING: The parameter 'uc' has to be in the range of 0x0000 to
- *           0x10FFFF, otherwise the program might crash!
- */
-
-ssize_t utf8proc_decompose(
-  const uint8_t *str, ssize_t strlen,
-  int32_t *buffer, ssize_t bufsize, int options
-);
-/*
- *  Does the same as 'utf8proc_decompose_char', but acts on a whole UTF-8
- *  string, and orders the decomposed sequences correctly.
- *  If the NULLTERM flag in 'options' is set, processing will be stopped,
- *  when a NULL byte is encounted, otherwise 'strlen' bytes are processed.
- *  The result in form of unicode code points is written into the buffer
- *  being pointed to by 'buffer', having the length of 'bufsize' entries.
- *  In case of success the number of chars written is returned,
- *  in case of an error, a negative error code is returned.
- *  If the number of written chars would be bigger than 'bufsize',
- *  the buffer (up to 'bufsize') has inpredictable data, and the needed
- *  buffer size is returned.
- */
-
-ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options);
-/*
- *  Reencodes the sequence of unicode characters given by the pointer
- *  'buffer' and 'length' as UTF-8.
- *  The result is stored in the same memory area where the data is read.
- *  Following flags in the 'options' field are regarded:
- *  NLF2LS:  converts LF, CRLF, CR and NEL into LS
- *  NLF2PS:  converts LF, CRLF, CR and NEL into PS
- *  NLF2LF:  converts LF, CRLF, CR and NEL into LF
- *  STRIPCC: strips or converts all non-affected control characters
- *  COMPOSE: tries to combine decomposed characters into composite
- *           characters
- *  STABLE:  prohibits combining characters which would violate
- *           the unicode versioning stability
- *  In case of success the length of the resulting UTF-8 string is
- *  returned, otherwise a negative error code is returned.
- *  WARNING: The amount of free space being pointed to by 'buffer', has to
- *           exceed the amount of the input data by one byte, and the
- *           entries of the array pointed to by 'str' have to be in the
- *           range of 0x0000 to 0x10FFFF, otherwise the program might
- *           crash!
- */
-
-ssize_t utf8proc_map(
-  const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options
-);
-/*
- *  Maps the given UTF-8 string being pointed to by 'str' to a new UTF-8
- *  string, which is allocated dynamically, and afterwards pointed to by
- *  the pointer being pointed to by 'dstptr'.
- *  If the NULLTERM flag in the 'options' field is set, the length is
- *  determined by a NULL terminator, otherwise the parameter 'strlen' is
- *  evaluated to determine the string length, but in any case the result
- *  will be NULL terminated (though it might contain NULL characters
- *  before). Other flags in the 'options' field are passed to the functions
- *  defined above, and regarded as described.
- *  In case of success the length of the new string is returned,
- *  otherwise a negative error code is returned.
- *  NOTICE: The memory of the new UTF-8 string will have been allocated with
- *          'malloc', and has theirfore to be freed with 'free'.
- */
-
-uint8_t *utf8proc_NFD(const uint8_t *str);
-uint8_t *utf8proc_NFC(const uint8_t *str);
-uint8_t *utf8proc_NFKD(const uint8_t *str);
-uint8_t *utf8proc_NFKC(const uint8_t *str);
-/*
- *  Returns a pointer to newly allocated memory of a NFD, NFC, NFKD or NFKC
- *  normalized version of the null-terminated string 'str'.
- */
-
-ssize_t utf8proc_check(const uint8_t *str);
-/*
- * Just checks UTF-8 string for validity, returns 0 if valid or one of
- * the negative UTF8PROC_ERROR_* codes if invalid or memory exhausted
- * checking.  Assumes null-terminated string str and UTF8PROC_STABLE
- * option.
- */
-
-#endif
-
diff --git a/lib_flags.am b/lib_flags.am
index 3f1e6bf..71b249d 100644
--- a/lib_flags.am
+++ b/lib_flags.am
@@ -18,4 +18,8 @@ if BUILD_DLL
 AM_CPPFLAGS += -DDLL_NETCDF
 endif
 
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
+
+
+
 
diff --git a/libdap2/CMakeLists.txt b/libdap2/CMakeLists.txt
index 42e4083..a5bfb10 100644
--- a/libdap2/CMakeLists.txt
+++ b/libdap2/CMakeLists.txt
@@ -1,4 +1,4 @@
-SET(dap2_SOURCES constraints.c dapcvt.c dapalign.c dapodom.c daputil.c ncdaperr.c cdf.c cache.c dapdump.c dapdebug.c dapattr.c ncd2dispatch.c getvara.c dceconstraints.c dcetab.c dceparse.c dcelex.c)
+SET(dap2_SOURCES constraints.c dapcvt.c dapodom.c daputil.c ncdaperr.c cdf.c cache.c dapdump.c dapdebug.c dapattr.c ncd2dispatch.c getvara.c dceconstraints.c dcetab.c dceparse.c dcelex.c)
 
 add_library(dap2 OBJECT ${dap2_SOURCES})
 
diff --git a/libdap2/Make0 b/libdap2/Make0
old mode 100755
new mode 100644
diff --git a/libdap2/Makefile.am b/libdap2/Makefile.am
old mode 100755
new mode 100644
index 4a5a7ec..01bf244
--- a/libdap2/Makefile.am
+++ b/libdap2/Makefile.am
@@ -15,12 +15,12 @@ EXTRA_DIST = CMakeLists.txt
 
 LDADD=
 
-SRC= constraints.c dapcvt.c dapalign.c dapodom.c daputil.c	\
+SRC= constraints.c dapcvt.c dapodom.c daputil.c	\
 ncdaperr.c cdf.c cache.c dapdump.c dapdebug.c dapattr.c		\
-ncd2dispatch.c getvara.c dceconstraints.c dcetab.c	\
+ncd2dispatch.c getvara.c dceconstraints.c dcetab.c		\
 dceparse.c dcelex.c
 
-HDRS= nccommon.h constraints.h ncd2dispatch.h ncdap.h dapalign.h	\
+HDRS= nccommon.h constraints.h ncd2dispatch.h dapincludes.h 	\
 dapodom.h getvara.h dapnc.h daputil.h dapdebug.h dapdump.h		\
 dceconstraints.h dcetab.h dceparselex.h
 
@@ -29,7 +29,7 @@ if USE_NETCDF4
 #HDRS +=constraints4.h ncd4dispatch.h ncdap4.h
 endif
 
-if BUILD_DAP
+if ENABLE_DAP
 
 if USE_NETCDF4
 AM_CPPFLAGS += -I$(top_srcdir)/libsrc4
@@ -49,7 +49,7 @@ libdap2_la_LIBADD =
 #	 ${top_builddir}/oc2/liboc.la			\
 #	 ${top_builddir}/libdispatch/libdispatch.la
 #
-endif # BUILD_DAP
+endif # ENABLE_DAP
 
 # These rule are used if someone wants to rebuild the grammar files.
 # Otherwise never invoked, but records how to do it.
diff --git a/libdap2/Makefile.in b/libdap2/Makefile.in
index c225f5a..6a83f8e 100644
--- a/libdap2/Makefile.in
+++ b/libdap2/Makefile.in
@@ -109,7 +109,7 @@ target_triplet = @target@
 
 #SRC += cdf4.c constraints4.c ncd4dispatch.c ncdap4.c getvara4.c
 #HDRS +=constraints4.h ncd4dispatch.h ncdap4.h
- at BUILD_DAP_TRUE@@USE_NETCDF4_TRUE at am__append_3 = -I$(top_srcdir)/libsrc4
+ at ENABLE_DAP_TRUE@@USE_NETCDF4_TRUE at am__append_3 = -I$(top_srcdir)/libsrc4
 subdir = libdap2
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -125,30 +125,29 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LTLIBRARIES = $(noinst_LTLIBRARIES)
 libdap2_la_DEPENDENCIES =
-am__libdap2_la_SOURCES_DIST = constraints.c dapcvt.c dapalign.c \
-	dapodom.c daputil.c ncdaperr.c cdf.c cache.c dapdump.c \
-	dapdebug.c dapattr.c ncd2dispatch.c getvara.c dceconstraints.c \
-	dcetab.c dceparse.c dcelex.c nccommon.h constraints.h \
-	ncd2dispatch.h ncdap.h dapalign.h dapodom.h getvara.h dapnc.h \
-	daputil.h dapdebug.h dapdump.h dceconstraints.h dcetab.h \
-	dceparselex.h
+am__libdap2_la_SOURCES_DIST = constraints.c dapcvt.c dapodom.c \
+	daputil.c ncdaperr.c cdf.c cache.c dapdump.c dapdebug.c \
+	dapattr.c ncd2dispatch.c getvara.c dceconstraints.c dcetab.c \
+	dceparse.c dcelex.c nccommon.h constraints.h ncd2dispatch.h \
+	dapincludes.h dapodom.h getvara.h dapnc.h daputil.h dapdebug.h \
+	dapdump.h dceconstraints.h dcetab.h dceparselex.h
 am__objects_1 = libdap2_la-constraints.lo libdap2_la-dapcvt.lo \
-	libdap2_la-dapalign.lo libdap2_la-dapodom.lo \
-	libdap2_la-daputil.lo libdap2_la-ncdaperr.lo libdap2_la-cdf.lo \
-	libdap2_la-cache.lo libdap2_la-dapdump.lo \
-	libdap2_la-dapdebug.lo libdap2_la-dapattr.lo \
-	libdap2_la-ncd2dispatch.lo libdap2_la-getvara.lo \
-	libdap2_la-dceconstraints.lo libdap2_la-dcetab.lo \
-	libdap2_la-dceparse.lo libdap2_la-dcelex.lo
+	libdap2_la-dapodom.lo libdap2_la-daputil.lo \
+	libdap2_la-ncdaperr.lo libdap2_la-cdf.lo libdap2_la-cache.lo \
+	libdap2_la-dapdump.lo libdap2_la-dapdebug.lo \
+	libdap2_la-dapattr.lo libdap2_la-ncd2dispatch.lo \
+	libdap2_la-getvara.lo libdap2_la-dceconstraints.lo \
+	libdap2_la-dcetab.lo libdap2_la-dceparse.lo \
+	libdap2_la-dcelex.lo
 am__objects_2 =
- at BUILD_DAP_TRUE@am_libdap2_la_OBJECTS = $(am__objects_1) \
- at BUILD_DAP_TRUE@	$(am__objects_2)
+ at ENABLE_DAP_TRUE@am_libdap2_la_OBJECTS = $(am__objects_1) \
+ at ENABLE_DAP_TRUE@	$(am__objects_2)
 libdap2_la_OBJECTS = $(am_libdap2_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
- at BUILD_DAP_TRUE@am_libdap2_la_rpath =
+ at ENABLE_DAP_TRUE@am_libdap2_la_rpath =
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -254,6 +253,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -281,12 +281,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -321,6 +323,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -385,6 +388,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 
@@ -408,21 +412,21 @@ CLEANFILES =
 # autoconf will forcibly delete files of the name *.tab.*
 EXTRA_DIST = CMakeLists.txt dce.y
 LDADD = 
-SRC = constraints.c dapcvt.c dapalign.c dapodom.c daputil.c	\
+SRC = constraints.c dapcvt.c dapodom.c daputil.c	\
 ncdaperr.c cdf.c cache.c dapdump.c dapdebug.c dapattr.c		\
-ncd2dispatch.c getvara.c dceconstraints.c dcetab.c	\
+ncd2dispatch.c getvara.c dceconstraints.c dcetab.c		\
 dceparse.c dcelex.c
 
-HDRS = nccommon.h constraints.h ncd2dispatch.h ncdap.h dapalign.h	\
+HDRS = nccommon.h constraints.h ncd2dispatch.h dapincludes.h 	\
 dapodom.h getvara.h dapnc.h daputil.h dapdebug.h dapdump.h		\
 dceconstraints.h dcetab.h dceparselex.h
 
 
 # Build convenience library
- at BUILD_DAP_TRUE@noinst_LTLIBRARIES = libdap2.la
- at BUILD_DAP_TRUE@libdap2_la_SOURCES = $(SRC) $(HDRS)
- at BUILD_DAP_TRUE@libdap2_la_CPPFLAGS = $(AM_CPPFLAGS)
- at BUILD_DAP_TRUE@libdap2_la_LIBADD = 
+ at ENABLE_DAP_TRUE@noinst_LTLIBRARIES = libdap2.la
+ at ENABLE_DAP_TRUE@libdap2_la_SOURCES = $(SRC) $(HDRS)
+ at ENABLE_DAP_TRUE@libdap2_la_CPPFLAGS = $(AM_CPPFLAGS)
+ at ENABLE_DAP_TRUE@libdap2_la_LIBADD = 
 all: all-am
 
 .SUFFIXES:
@@ -481,7 +485,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap2_la-cache.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap2_la-cdf.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap2_la-constraints.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap2_la-dapalign.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap2_la-dapattr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap2_la-dapcvt.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap2_la-dapdebug.Plo at am__quote@
@@ -534,13 +537,6 @@ libdap2_la-dapcvt.lo: dapcvt.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap2_la-dapcvt.lo `test -f 'dapcvt.c' || echo '$(srcdir)/'`dapcvt.c
 
-libdap2_la-dapalign.lo: dapalign.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap2_la-dapalign.lo -MD -MP -MF $(DEPDIR)/libdap2_la-dapalign.Tpo -c -o libdap2_la-dapalign.lo `test -f 'dapalign.c' || echo '$(srcdir)/'`dapalign.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap2_la-dapalign.Tpo $(DEPDIR)/libdap2_la-dapalign.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dapalign.c' object='libdap2_la-dapalign.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap2_la-dapalign.lo `test -f 'dapalign.c' || echo '$(srcdir)/'`dapalign.c
-
 libdap2_la-dapodom.lo: dapodom.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap2_la-dapodom.lo -MD -MP -MF $(DEPDIR)/libdap2_la-dapodom.Tpo -c -o libdap2_la-dapodom.lo `test -f 'dapodom.c' || echo '$(srcdir)/'`dapodom.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap2_la-dapodom.Tpo $(DEPDIR)/libdap2_la-dapodom.Plo
diff --git a/libdap2/cache.c b/libdap2/cache.c
index 56fa0d9..8c82695 100644
--- a/libdap2/cache.c
+++ b/libdap2/cache.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "dapdump.h"
 
 /*
diff --git a/libdap2/cdf.c b/libdap2/cdf.c
index 651820b..a538a02 100644
--- a/libdap2/cdf.c
+++ b/libdap2/cdf.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "daputil.h"
 #include "dapdump.h"
 
diff --git a/libdap2/common.c b/libdap2/common.c
index a4e278f..cf366c1 100644
--- a/libdap2/common.c
+++ b/libdap2/common.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 
 #include "dapdump.h"
 
diff --git a/libdap2/constraints.c b/libdap2/constraints.c
index 9065aa5..aa41d04 100644
--- a/libdap2/constraints.c
+++ b/libdap2/constraints.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT filey for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "dceparselex.h"
 #include "dceconstraints.h"
 #include "dapdump.h"
diff --git a/libdap2/dapalign.c b/libdap2/dapalign.c
deleted file mode 100644
index 63d642a..0000000
--- a/libdap2/dapalign.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*********************************************************************
- *   Copyright 1993, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *********************************************************************/
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group.                                               *
- * Copyright by the Board of Trustees of the University of Illinois.         *
- * All rights reserved.                                                      *
- *                                                                           *
- * This file is part of HDF5.  The full HDF5 copyright notice, including     *
- * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
-This code is a variantion of the H5detect.c code from HDF5.
-Author: D. Heimbigner 10/7/2008
-*/
-#include "config.h"
-#ifndef OFFSETTEST
-#include        "ncdap.h"
-#else
-#include        <stdlib.h>
-#include        <string.h>
-#include        <assert.h>
-#endif
-
-#include        "dapnc.h"
-#include        "dapdebug.h"
-#include        "dapalign.h"
-
-typedef struct nccalignvlen_t {
-    size_t len;
-    void* p;
-} nccalignvlen_t;
-
-#ifdef OFFSETTEST
-typedef int nc_type;
-#define	NC_NAT 	        0	/* NAT = 'Not A Type' (c.f. NaN) */
-#define	NC_BYTE         1	/* signed 1 byte integer */
-#define	NC_CHAR 	2	/* ISO/ASCII character */
-#define	NC_SHORT 	3	/* signed 2 byte integer */
-#define	NC_INT 	        4	/* signed 4 byte integer */
-#define	NC_FLOAT 	5	/* single precision floating point number */
-#define	NC_DOUBLE 	6	/* double precision floating point number */
-#define	NC_UBYTE 	7	/* unsigned 1 byte int */
-#define	NC_USHORT 	8	/* unsigned 2-byte int */
-#define	NC_UINT 	9	/* unsigned 4-byte int */
-#define	NC_INT64 	10	/* signed 8-byte int */
-#define	NC_UINT64 	11	/* unsigned 8-byte int */
-#define	NC_STRING 	12	/* string */
-#define NC_VLEN         13
-#define NC_OPAQUE       14
-#endif
-
-/*
-The heart of this is the following macro,
-which computes the offset of a field x
-when preceded by a char field.
-The assumptions appear to be as follows:
-1. the offset produced in this situation indicates
-   the alignment for x relative in such a way that it
-   depends only on the types that precede it in the struct.
-2. the compiler does not reorder fields.
-3. arrays are tightly packed.
-4. nested structs are alignd according to their first member
-   (this actually follows from C language requirement that
-    a struct can legally be cast to an instance of its first member).
-Given the alignments for the various common primitive types,
-it is assumed that one can use them anywhere to construct
-the layout of a struct of such types.
-It seems to work for HDF5 for a wide variety of machines.
-*/
-
-#define COMP_ALIGNMENT(DST,TYPE)  {\
-    struct {char f1; TYPE x;} tmp; \
-    DST.typename = #TYPE ;        \
-    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
-
-
-#define NCCTYPECOUNT     (NCCTYPENCVLEN+1)
-
-static NCtypealignvec vec[NCCTYPECOUNT];
-static NCtypealignset set;
-static int dapaligninit = 0;
-
-unsigned int
-ncctypealignment(int nctype)
-{
-    NCtypealignment* align = NULL;
-    int index = 0;
-    if(!dapaligninit) compute_nccalignments();
-    switch (nctype) {
-      case NC_BYTE:   index = NCCTYPEUCHAR; break;
-      case NC_CHAR:   index = NCCTYPECHAR; break;
-      case NC_SHORT:  index = NCCTYPESHORT; break;
-      case NC_INT:    index = NCCTYPEINT; break;
-      case NC_FLOAT:  index = NCCTYPEFLOAT; break;
-      case NC_DOUBLE: index = NCCTYPEDOUBLE; break;
-      case NC_UBYTE:  index = NCCTYPEUCHAR; break;
-      case NC_USHORT: index = NCCTYPEUSHORT; break;
-      case NC_UINT:   index = NCCTYPEUINT; break;
-      case NC_INT64:  index = NCCTYPELONGLONG; break;
-      case NC_UINT64: index = NCCTYPEULONGLONG; break;
-      case NC_STRING: index = NCCTYPEPTR; break;
-      case NC_VLEN:   index = NCCTYPENCVLEN; break;
-      case NC_OPAQUE: index = NCCTYPEUCHAR; break;
-      default:
-#ifndef OFFSETTEST
-	PANIC1("nctypealignment: bad type code: %d",nctype);
-#else
-	return 0;
-#endif
-    }
-    align = &vec[index];
-    return align->alignment;
-}
-
-
-void
-compute_nccalignments(void)
-{
-    /* Compute the alignments for all the common C data types*/
-    /* First for the struct*/
-    /* initialize*/
-    memset((void*)&set,0,sizeof(set));
-    memset((void*)vec,0,sizeof(vec));
-
-    COMP_ALIGNMENT(set.charalign,char);
-    COMP_ALIGNMENT(set.ucharalign,unsigned char);
-    COMP_ALIGNMENT(set.shortalign,short);
-    COMP_ALIGNMENT(set.ushortalign,unsigned short);
-    COMP_ALIGNMENT(set.intalign,int);
-    COMP_ALIGNMENT(set.uintalign,unsigned int);
-    COMP_ALIGNMENT(set.longalign,long);
-    COMP_ALIGNMENT(set.ulongalign,unsigned long);
-    COMP_ALIGNMENT(set.longlongalign,long long);
-    COMP_ALIGNMENT(set.ulonglongalign,unsigned long long);
-    COMP_ALIGNMENT(set.floatalign,float);
-    COMP_ALIGNMENT(set.doublealign,double);
-    COMP_ALIGNMENT(set.ptralign,void*);
-    COMP_ALIGNMENT(set.ncvlenalign,nccalignvlen_t);
-
-    /* Then the vector*/
-    COMP_ALIGNMENT(vec[NCCTYPECHAR],char);
-    COMP_ALIGNMENT(vec[NCCTYPEUCHAR],unsigned char); 
-    COMP_ALIGNMENT(vec[NCCTYPESHORT],short);
-    COMP_ALIGNMENT(vec[NCCTYPEUSHORT],unsigned short);
-    COMP_ALIGNMENT(vec[NCCTYPEINT],int);
-    COMP_ALIGNMENT(vec[NCCTYPEUINT],unsigned int);
-    COMP_ALIGNMENT(vec[NCCTYPELONG],long);
-    COMP_ALIGNMENT(vec[NCCTYPEULONG],unsigned long);
-    COMP_ALIGNMENT(vec[NCCTYPELONGLONG],long long);
-    COMP_ALIGNMENT(vec[NCCTYPEULONGLONG],unsigned long long);
-    COMP_ALIGNMENT(vec[NCCTYPEFLOAT],float);
-    COMP_ALIGNMENT(vec[NCCTYPEDOUBLE],double);
-    COMP_ALIGNMENT(vec[NCCTYPEPTR],void*);
-    COMP_ALIGNMENT(vec[NCCTYPENCVLEN],nccalignvlen_t);
-
-    dapaligninit = 1;
-}
-
-/* Compute padding */
-int
-nccpadding(unsigned long offset, int alignment)
-{
-    int pad,rem;
-    rem = (alignment==0?0:(offset % alignment));
-    pad = (rem==0?0:(alignment - rem));
-    return pad;
-}
-
-#ifdef OFFSETTEST
-
-#define COMP_ALIGNMENT1(DST,TYPE1,TYPE)  {\
-    struct {TYPE1 f1; TYPE x;} tmp; \
-    DST.typename = #TYPE ;        \
-    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
-
-#define COMP_ALIGNMENT2(DST,TYPE1,TYPE2,TYPE)  {\
-    struct {TYPE1 f1, TYPE2 f2; TYPE x;} tmp;   \
-    DST.typename = #TYPE ;                      \
-    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
-
-#define COMP_SIZE0(DST,TYPE1,TYPE2)  {\
-    struct {TYPE1 c; TYPE2 x;} tmp; \
-    DST = sizeof(tmp); }
-
-static char*
-padname(char* name)
-{
-#define MAX 20
-    if(name == NULL) name = "null";
-    int len = strlen(name);
-    if(len > MAX) len = MAX;
-    char* s = (char*)malloc(MAX+1);
-    memset(s,' ',MAX);
-    s[MAX+1] = '\0';
-    strncpy(s,name,len);
-    return s;
-}
-
-static void
-verify(NCtypealignvec* vec)
-{
-    int i,j;
-    NCtypealignvec* vec16;
-    NCtypealignvec* vec32;
-    int* sizes8;
-    int* sizes16;
-    int* sizes32;
-
-    vec16 = (NCtypealignvec*)malloc(sizeof(NCtypealignvec)*NCCTYPECOUNT);
-    vec32 = (NCtypealignvec*)malloc(sizeof(NCtypealignvec)*NCCTYPECOUNT);
-    sizes8 = (int*)malloc(sizeof(int)*NCCTYPECOUNT);
-    sizes16 = (int*)malloc(sizeof(int)*NCCTYPECOUNT);
-    sizes32 = (int*)malloc(sizeof(int)*NCCTYPECOUNT);
-
-    COMP_SIZE0(sizes8[1],char,char);
-    COMP_SIZE0(sizes8[2],unsigned char,char);
-    COMP_SIZE0(sizes8[3],short,char);
-    COMP_SIZE0(sizes8[4],unsigned short,char);
-    COMP_SIZE0(sizes8[5],int,char);
-    COMP_SIZE0(sizes8[6],unsigned int,char);
-    COMP_SIZE0(sizes8[7],long,char);
-    COMP_SIZE0(sizes8[8],unsigned long,char);
-    COMP_SIZE0(sizes8[9],long long,char);
-    COMP_SIZE0(sizes8[10],unsigned long long,char);
-    COMP_SIZE0(sizes8[11],float,char);
-    COMP_SIZE0(sizes8[12],double,char) ;
-    COMP_SIZE0(sizes8[13],void*,char);
-    COMP_SIZE0(sizes8[14],alignvlen_t,char);
-
-    COMP_SIZE0(sizes16[1],char,short);
-    COMP_SIZE0(sizes16[2],unsigned char,short);
-    COMP_SIZE0(sizes16[3],short,short);
-    COMP_SIZE0(sizes16[4],unsigned short,short);
-    COMP_SIZE0(sizes16[5],int,short);
-    COMP_SIZE0(sizes16[6],unsigned int,short);
-    COMP_SIZE0(sizes16[7],long,short);
-    COMP_SIZE0(sizes16[8],unsigned long,short);
-    COMP_SIZE0(sizes16[9],long long,short);
-    COMP_SIZE0(sizes16[10],unsigned long long,short);
-    COMP_SIZE0(sizes16[11],float,short);
-    COMP_SIZE0(sizes16[12],double,short) ;
-    COMP_SIZE0(sizes16[13],void*,short);
-    COMP_SIZE0(sizes16[14],alignvlen_t*,short);
-
-    COMP_SIZE0(sizes32[1],char,int);
-    COMP_SIZE0(sizes32[2],unsigned char,int);
-    COMP_SIZE0(sizes32[3],short,int);
-    COMP_SIZE0(sizes32[4],unsigned short,int);
-    COMP_SIZE0(sizes32[5],int,int);
-    COMP_SIZE0(sizes32[6],unsigned int,int);
-    COMP_SIZE0(sizes32[7],long,int);
-    COMP_SIZE0(sizes32[8],unsigned long,int);
-    COMP_SIZE0(sizes32[9],long long,int);
-    COMP_SIZE0(sizes32[10],unsigned long long,int);
-    COMP_SIZE0(sizes32[11],float,int);
-    COMP_SIZE0(sizes32[12],double,int) ;
-    COMP_SIZE0(sizes32[13],void*,int);
-    COMP_SIZE0(sizes32[14],alignvlen_t*,int);
-
-    COMP_ALIGNMENT1(vec16[1],char,short);
-    COMP_ALIGNMENT1(vec16[2],unsigned char,short);
-    COMP_ALIGNMENT1(vec16[3],short,short);
-    COMP_ALIGNMENT1(vec16[4],unsigned short,short);
-    COMP_ALIGNMENT1(vec16[5],int,short);
-    COMP_ALIGNMENT1(vec16[6],unsigned int,short);
-    COMP_ALIGNMENT1(vec32[7],long,short);
-    COMP_ALIGNMENT1(vec32[8],unsigned long,short);
-    COMP_ALIGNMENT1(vec32[9],long long,short);
-    COMP_ALIGNMENT1(vec32[10],unsigned long long,short);
-    COMP_ALIGNMENT1(vec16[11],float,short);
-    COMP_ALIGNMENT1(vec16[12],double,short);
-    COMP_ALIGNMENT1(vec16[13],void*,short);
-    COMP_ALIGNMENT1(vec16[14],alignvlen_t*,short);
-
-    COMP_ALIGNMENT1(vec32[1],char,short);
-    COMP_ALIGNMENT1(vec32[2],unsigned char,short);
-    COMP_ALIGNMENT1(vec32[3],char,short);
-    COMP_ALIGNMENT1(vec32[4],unsigned short,short);
-    COMP_ALIGNMENT1(vec32[5],int,int);
-    COMP_ALIGNMENT1(vec32[6],unsigned int,int);
-    COMP_ALIGNMENT1(vec32[7],long,int);
-    COMP_ALIGNMENT1(vec32[8],unsigned long,int);
-    COMP_ALIGNMENT1(vec32[9],long long,int);
-    COMP_ALIGNMENT1(vec32[10],unsigned long long,int);
-    COMP_ALIGNMENT1(vec32[11],float,int);
-    COMP_ALIGNMENT1(vec32[12],double,int);
-    COMP_ALIGNMENT1(vec32[13],void*,int);
-    COMP_ALIGNMENT1(vec32[14],alignvlen_t*,int);
-
-    for(i=0;i<NCCTYPECOUNT;i++) {
-	printf("%s: size=%2d  alignment=%2d\n",
-		padname(vec[i].typename),sizes8[i],vec[i].alignment);
-    }
-    for(i=0;i<NCCTYPECOUNT;i++) {
-	printf("short vs %s: size=%2d  alignment=%2d\n",
-		padname(vec[i].typename),sizes16[i],vec16[i].alignment);
-    }
-    for(i=0;i<NCCTYPECOUNT;i++) {
-	printf("int vs %s: size=%2d  alignment=%2d\n",
-		padname(vec[i].typename),sizes32[i],vec32[i].alignment);
-    }
-
-}
-
-int
-main(int argc, char** argv)
-{
-    int i;
-
-    compute_nccalignments();
-
-    verify(vec);
-
-/*
-    for(i=0;i<NCCTYPECOUNT;i++) {
-	printf("%s:\talignment=%d\n",vec[i].typename,vec[i].alignment);
-    }
-*/
-    exit(0);
-}
-#endif /*OFFSETTEST*/
diff --git a/libdap2/dapalign.h b/libdap2/dapalign.h
deleted file mode 100644
index ac1b1ce..0000000
--- a/libdap2/dapalign.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*********************************************************************
- *   Copyright 1993, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *********************************************************************/
-#ifndef ALIGN_H
-#define ALIGN_H 1
-
-typedef struct NCtypealignment {
-    char* typename;
-    int alignment;
-} NCtypealignment;
-
-/* Define indices for every primitive C type */
-/* NAT => NOT-A-TYPE*/
-#define NCCTYPENAT       0
-#define NCCTYPECHAR      1
-#define NCCTYPEUCHAR     2
-#define NCCTYPESHORT     3
-#define NCCTYPEUSHORT    4
-#define NCCTYPEINT       5
-#define NCCTYPEUINT      6
-#define NCCTYPELONG      7
-#define NCCTYPEULONG     8
-#define NCCTYPELONGLONG  9
-#define NCCTYPEULONGLONG 10
-#define NCCTYPEFLOAT     11
-#define NCCTYPEDOUBLE    12
-#define NCCTYPEPTR       13
-#define NCCTYPENCVLEN    14
-
-/* Capture in struct and in a vector*/
-typedef struct NCtypealignset {
-    NCtypealignment charalign;	  /* char*/
-    NCtypealignment ucharalign;	  /* unsigned char*/
-    NCtypealignment shortalign;	  /* short*/
-    NCtypealignment ushortalign;	  /* unsigned short*/
-    NCtypealignment intalign;	  /* int*/
-    NCtypealignment uintalign;	  /* unsigned int*/
-    NCtypealignment longalign;	  /* long*/
-    NCtypealignment ulongalign;	  /* unsigned long*/
-    NCtypealignment longlongalign;  /* long long*/
-    NCtypealignment ulonglongalign; /* unsigned long long*/
-    NCtypealignment floatalign;	  /* float*/
-    NCtypealignment doublealign;	  /* double*/
-    NCtypealignment ptralign;	  /* void**/
-    NCtypealignment ncvlenalign;	  /* nc_vlen_t*/
-} NCtypealignset;
-
-typedef NCtypealignment NCtypealignvec;
-
-extern void compute_nccalignments(void);
-extern unsigned int ncctypealignment(int nctype);
-extern int nccpadding(unsigned long offset, int alignment);
-
-#endif /*ALIGN_H*/
diff --git a/libdap2/dapattr.c b/libdap2/dapattr.c
index e4567e3..87dd643 100644
--- a/libdap2/dapattr.c
+++ b/libdap2/dapattr.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 
 #define OCCHECK(exp) if((ocstat = (exp))) {THROWCHK(ocstat); goto done;}
 
diff --git a/libdap2/dapcvt.c b/libdap2/dapcvt.c
index b67ff84..64ecdb6 100644
--- a/libdap2/dapcvt.c
+++ b/libdap2/dapcvt.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 #include "config.h"
-#include "ncdap.h"
+#include "dapincludes.h"
 
 #ifdef _MSC_VER
 #include <crtdbg.h>
@@ -210,14 +210,15 @@ dapcvtattrval(nc_type etype, void* dst, NClist* src)
 	ok = 0;
 	switch (etype) {
 	case NC_BYTE: {
-		char tmp[128];
-		
-		unsigned char* p = (unsigned char*)dstmem;
+	    char* p = (char*)dstmem;
 #ifdef _MSC_VER
-		ok = sscanf(s,"%hC%n",p,&nread);
-		_ASSERTE(_CrtCheckMemory());
+	    int ival;
+	    ok = sscanf(s,"%d%n",&ival,&nread);
+	    _ASSERTE(_CrtCheckMemory());
+	    if(ival < NC_MIN_BYTE || ival > NC_MAX_BYTE) ok = 0;
+	    *p = (char)ival;
 #else	
-		ok = sscanf(s,"%hhu%n",p,&nread);
+	   ok = sscanf(s,"%hhu%n",p,&nread);
 #endif
 	    } break;
 	case NC_CHAR: {
@@ -243,12 +244,15 @@ dapcvtattrval(nc_type etype, void* dst, NClist* src)
 	case NC_UBYTE: {
 	    unsigned char* p = (unsigned char*)dstmem;
 #ifdef _MSC_VER
-		ok = sscanf(s, "%hc%n", p,&nread);
-		_ASSERTE(_CrtCheckMemory());
+	    unsigned int uval;
+	    ok = sscanf(s,"%u%n",&uval,&nread);
+	    _ASSERTE(_CrtCheckMemory());
+	    if(uval > NC_MAX_UBYTE) ok = 0;
+	    *p = (unsigned char)uval;
 #else
 	    ok = sscanf(s,"%hhu%n",p,&nread);
 #endif
-		} break;
+	    } break;
 	case NC_USHORT: {
 	    unsigned short* p = (unsigned short*)dstmem;
 	    ok = sscanf(s,"%hu%n",p,&nread);
diff --git a/libdap2/dapdebug.c b/libdap2/dapdebug.c
index a290d80..558b653 100644
--- a/libdap2/dapdebug.c
+++ b/libdap2/dapdebug.c
@@ -6,8 +6,8 @@
 #include <stdarg.h>
 #include <stdio.h>
 
+#include "dapincludes.h"
 #include "nclog.h"
-#include "ncdap.h"
 
 int ncdap3debug = 0;
 
diff --git a/libdap2/dapdump.c b/libdap2/dapdump.c
index 735bf0d..b740424 100644
--- a/libdap2/dapdump.c
+++ b/libdap2/dapdump.c
@@ -7,7 +7,7 @@
 #ifdef USE_PARALLEL
 #include "netcdf_par.h"
 #endif
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "dapdump.h"
 #include "dceconstraints.h"
 
diff --git a/libdap2/dapincludes.h b/libdap2/dapincludes.h
new file mode 100644
index 0000000..0b842da
--- /dev/null
+++ b/libdap2/dapincludes.h
@@ -0,0 +1,113 @@
+/*********************************************************************
+  *   Copyright 1993, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+#ifndef DAPINCLUDES_H
+#define DAPINCLUDES_H 1
+
+#include "config.h"
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <stdio.h>
+
+#include "netcdf.h"
+
+#include "ncbytes.h"
+#include "nclist.h"
+#include "nchashmap.h"
+#include "nclog.h"
+#include "ncuri.h"
+
+#include "fbits.h"
+#include "dceconstraints.h"
+
+#include "ncdispatch.h"
+#include "nc.h"
+#include "nc3internal.h"
+ /* netcdf overrides*/
+#include "dapnc.h"
+
+#include "oc.h"
+
+#include "ncdap.h"
+#include "dapdebug.h"
+#include "daputil.h"
+
+/**************************************************/
+/* sigh, do the forwards */
+struct NCprojection;
+struct NCselection;
+struct Getvara;
+struct NCcachenode;
+struct NCcache;
+struct NCslice;
+struct NCsegment;
+
+/**************************************************/
+
+#include "nccommon.h"
+#include "getvara.h"
+#include "constraints.h"
+
+/**************************************************/
+
+extern struct NCTMODEL nctmodels[];
+
+/**************************************************/
+/* Import some internal procedures from libsrc*/
+
+/* Internal, but non-static procedures */
+extern NCerror computecdfvarnames(NCDAPCOMMON*,CDFnode*,NClist*);
+extern NCerror computecdfnodesets(NCDAPCOMMON* nccomm, CDFtree* tree);
+extern NCerror computevarnodes(NCDAPCOMMON*, NClist*, NClist*);
+extern NCerror collectvardefdims(NCDAPCOMMON* drno, CDFnode* var, NClist* dimset);
+extern NCerror fixgrids(NCDAPCOMMON* drno);
+extern NCerror dapmerge(NCDAPCOMMON* drno, CDFnode* node, OCobject dasroot);
+extern NCerror sequencecheck(NCDAPCOMMON* drno);
+extern NCerror computecdfdimnames(NCDAPCOMMON*);
+extern NCerror attachdatadds(struct NCDAPCOMMON*);
+extern NCerror detachdatadds(struct NCDAPCOMMON*);
+extern void dapdispatch3init(void);
+
+/*
+extern void dereference(NCconstraint* constraint);
+extern NCerror rereference(NCconstraint*, NClist*);
+*/
+
+extern NCerror dapbuildvaraprojection(CDFnode*,
+		     const size_t* startp, const size_t* countp, const ptrdiff_t* stridep,
+		     struct DCEprojection** projectionlist);
+
+extern NCerror nc3d_getvarx(int ncid, int varid,
+	    const size_t *startp,
+	    const size_t *countp,
+	    const ptrdiff_t *stridep,
+	    void *data,
+	    nc_type dsttype0);
+
+/**************************************************/
+
+extern NCerror nc3d_open(const char* path, int mode, int* ncidp);
+extern int nc3d_close(int ncid);
+extern NCerror restruct(NCDAPCOMMON*, CDFnode* ddsroot, CDFnode* pattern, NClist*);
+extern void setvisible(CDFnode* root, int visible);
+extern NCerror mapnodes(CDFnode* dstroot, CDFnode* srcroot);
+extern void unmap(CDFnode* root);
+
+#if 0
+extern NCerror fetchpatternmetadata(NCDAPCOMMON* nccomm);
+extern NCerror fetchconstrainedmetadata(NCDAPCOMMON* nccomm);
+extern void applyclientparamcontrols(NCDAPCOMMON*);
+extern NCerror suppressunusablevars(NCDAPCOMMON*);
+extern void estimatevarsizes(NCDAPCOMMON*);
+extern NCerror showprojection(NCDAPCOMMON*, CDFnode* var);
+#endif
+
+/* From: dapcvt.c*/
+extern NCerror dapconvert(nc_type, nc_type, char*, char*, size_t);
+extern int dapcvtattrval(nc_type, void*, NClist*);
+
+#endif /*DAPINCLUDES_H*/
diff --git a/libdap2/dapodom.c b/libdap2/dapodom.c
index 2675f47..8df5756 100644
--- a/libdap2/dapodom.c
+++ b/libdap2/dapodom.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "dapodom.h"
 
 /**********************************************/
diff --git a/libdap2/daputil.c b/libdap2/daputil.c
index 36885c7..120a310 100644
--- a/libdap2/daputil.c
+++ b/libdap2/daputil.c
@@ -12,51 +12,15 @@
 #include "oc.h"
 extern int oc_dumpnode(OClink, OCddsnode);
 
-#include "ncdap.h"
-#include "dapalign.h"
+#include "dapincludes.h"
+#include "ncoffsets.h"
 
 #define LBRACKET '['
 #define RBRACKET ']'
 
 
 static char* repairname(const char* name, const char* badchars);
-
-/**************************************************/
-/**
- * Provide a hidden interface to allow utilities
- * to check if a given path name is really an ncdap3 url.
- * If no, return null, else return basename of the url
- * minus any extension.
- */
-
-int
-nc__testurl(const char* path, char** basenamep)
-{
-    NCURI* uri;
-    int ok = ncuriparse(path,&uri);
-    if(ok) {
-	char* slash = (uri->file == NULL ? NULL : strrchr(uri->file, '/'));
-	char* dot;
-	if(slash == NULL) slash = (char*)path; else slash++;
-    slash = nulldup(slash);
-
-    if(slash == NULL)
-      dot = NULL;
-    else
-      dot = strrchr(slash, '.');
-
-    if(dot != NULL &&  dot != slash) *dot = '\0';
-
-	if(basenamep)
-      *basenamep=slash;
-    else  {
-      if(slash)
-        free(slash);
-    }
-    ncurifree(uri);
-    }
-    return ok;
-}
+static int nccpadding(unsigned long offset, int alignment);
 
 /**************************************************/
 
@@ -272,8 +236,7 @@ dapparamvalue(NCDAPCOMMON* nccomm, const char* key)
     const char* value;
 
     if(nccomm == NULL || key == NULL) return 0;
-    if(!ncurilookup(nccomm->oc.url,key,&value))
-	return NULL;
+    value=ncurilookup(nccomm->oc.url,key);
     return value;
 }
 
@@ -289,7 +252,7 @@ dapparamcheck(NCDAPCOMMON* nccomm, const char* key, const char* subkey)
     char* p;
 
     if(nccomm == NULL || key == NULL) return 0;
-    if(!ncurilookup(nccomm->oc.url,key,&value))
+    if((value=ncurilookup(nccomm->oc.url,key)) == NULL)
 	return 0;
     if(subkey == NULL) return 1;
     p = strstr(value,subkey);
@@ -733,7 +696,7 @@ dap_fetch(NCDAPCOMMON* nccomm, OClink conn, const char* ce,
 
     if(SHOWFETCH) {
 	/* Build uri string minus the constraint and #tag */
-	char* baseurl = ncuribuild(nccomm->oc.url,NULL,ext,0);
+	char* baseurl = ncuribuild(nccomm->oc.url,NULL,ext,NCURIBASE);
 	if(ce == NULL)
             LOG1(NCLOGNOTE,"fetch: %s",baseurl);
 	else
@@ -836,3 +799,25 @@ repairname(const char* name, const char* badchars)
     *q = '\0'; /* ensure trailing null */
     return newname;
 }
+
+char*
+dap_getselection(NCURI* uri)
+{
+    char* p;
+    char* q = uri->query;
+    if(q == NULL) return NULL;
+    p = strchr(q,'&');
+    if(p == NULL) return NULL;
+    return strdup(p+1);
+}
+
+/* Compute padding */
+static int
+nccpadding(unsigned long offset, int alignment)
+{
+    int pad,rem;
+    rem = (alignment==0?0:(offset % alignment));
+    pad = (rem==0?0:(alignment - rem));
+    return pad;
+}
+
diff --git a/libdap2/daputil.h b/libdap2/daputil.h
index 44dd046..816b063 100644
--- a/libdap2/daputil.h
+++ b/libdap2/daputil.h
@@ -65,22 +65,11 @@ extern void dapexpandescapes(char *termstring);
 extern int dapalignbuffer(NCbytes*, int alignment);
 extern size_t dapdimproduct(NClist* dimensions);
 
-#if defined(DLL_NETCDF)
-# if defined(DLL_EXPORT)
-#  define NCC_EXTRA __declspec(dllexport)
-#else
-#  define NCC_EXTRA __declspec(dllimport)
-# endif
-NCC_EXTRA extern int nc__testurl(const char* path, char** basename);
-#else
-extern int nc__testurl(const char* parth, char** basename);
-#endif
-
-
 /* Provide a wrapper for oc_fetch so we can log what it does */
 extern NCerror dap_fetch(struct NCDAPCOMMON*,OClink,const char*,OCdxd,OCobject*);
 
 extern int dap_badname(char* name);
 extern char* dap_repairname(char* name);
+extern char* dap_getselection(NCURI* uri);
 
 #endif /*DAPUTIL_H*/
diff --git a/libdap2/dceconstraints.c b/libdap2/dceconstraints.c
index 67428e6..2e5a851 100644
--- a/libdap2/dceconstraints.c
+++ b/libdap2/dceconstraints.c
@@ -10,13 +10,7 @@
 #include <string.h>
 #include <assert.h>
 
-#include "nclist.h"
-#include "ncbytes.h"
-#include "nclog.h"
-
-#include "netcdf.h"
-#include "dceconstraints.h"
-#include "dapdebug.h"
+#include "dapincludes.h"
 #include "dceparselex.h"
 
 #define DEBUG
diff --git a/libdap2/env b/libdap2/env
index d6d8bca..1e27a0e 100644
--- a/libdap2/env
+++ b/libdap2/env
@@ -4,12 +4,12 @@ alias xx="cd ..;make; cd libdap2"
 PARMS=""; ARGS=""; CON="" ; CE="";  OCON="" ; VAR=""; SHARP='#'
 alias q0=;alias qq=;alias qv=;alias q=;alias  qh=;alias qqh=;alias qall=;alias qv=;alias qo=;
 
-F="http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.dailyavgs/pressure/air.1947.nc"
+F='https://cida.usgs.gov/thredds/dodsC/new_gmo?longitude[0:1:461],latitude[0:1:221],time[0:1:22644]'
 
-if test -e "/cygdrive/f/git/netcdf-c" ; then
-TOP="/cygdrive/f/git/netcdf-c"
-elif test -e "/cygdrive/d/git/netcdf-c" ; then
+if test -e "/cygdrive/d/git/netcdf-c" ; then
 TOP="/cygdrive/d/git/netcdf-c"
+elif test -e "/cygdrive/f/git/netcdf-c" ; then
+TOP="/cygdrive/f/git/netcdf-c"
 elif test -e "/home/dmh/git/netcdf-c" ; then
 TOP="/home/dmh/git/netcdf-c"
 else
@@ -25,15 +25,15 @@ fi
 P=`pwd`
 
 PARMS="log"
-#PARMS="${PARMS}&netcdf3"
-#PARMS="${PARMS}&fetch=disk"
-#PARMS="${PARMS}&cache"
-#PARMS="${PARMS}&nocache"
-#PARMS="${PARMS}&wholevar"
-PARMS="${PARMS}&show=fetch"
-#PARMS="${PARMS}&noprefetch"
-#PARMS="${PARMS}&prefetch"
-#PARMS="${PARMS}&prefetch=eager"
+#PARMS="${PARMS}[netcdf3]"
+#PARMS="${PARMS}[fetch=disk]"
+#PARMS="${PARMS}[cache]"
+#PARMS="${PARMS}[nocache]"
+#PARMS="${PARMS}[wholevar]"
+PARMS="${PARMS}[show=fetch]"
+#PARMS="${PARMS}[noprefetch]"
+#PARMS="${PARMS}[prefetch]"
+#PARMS="${PARMS}[prefetch=eager]"
 PARMS="[log][cache][noprefetch]"
 
 VARGS="--leak-check=full"
@@ -52,10 +52,9 @@ if test "x$PROG" = x ; then
  PROG="../ncdump/ncdump"
 fi
 
-if test "x$PARMS" != "x" ; then PARMS="\#$PARMS"; fi
 U="$F"
 if test "x$CON" != "x" ; then U="$U?$CON"; fi
-UALL="$U${PARMS}"
+UALL="${PARMS}$U"
 #ARGS="-h $ARGS"
 #ARGS="-w $ARGS"
 #ARGS="-c $ARGS"
@@ -133,4 +132,5 @@ F="http://nomads.ncep.noaa.gov:9090/dods/gens/gens20140123/gep_all_12z"
 VAR=prmslmsl 
 F="http://data.nodc.noaa.gov/thredds/dodsC/testdata/pathfinderAgg/pathFinderV5.2_night.ncml"
 CON="sst_dtime.sst_dtime"
+F="http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.dailyavgs/pressure/air.1947.nc"
 fi
diff --git a/libdap2/getvara.c b/libdap2/getvara.c
index 508e579..2b54901 100644
--- a/libdap2/getvara.c
+++ b/libdap2/getvara.c
@@ -4,7 +4,7 @@
  *********************************************************************/
 
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "dapodom.h"
 #include "dapdump.h"
 #include "ncd2dispatch.h"
@@ -821,7 +821,7 @@ fprintf(stderr,"\n");
 	    count = dcesegmentsize(segment,0,rank0); /* how many to read */
 	    internlen = interntypesize*count;
             /* Read the whole variable directly into memory.*/
-            ocstat = oc_data_readn(conn,currentcontent,dap_zero,count,internlen,memory->next);
+            ocstat = oc_data_readn(conn,currentcontent,NC_coord_zero,count,internlen,memory->next);
 	    /* bump memory pointer */
 	    memory->next += internlen;
             if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;}
@@ -878,7 +878,7 @@ fprintf(stderr,"\n");
             size_t internlen;
 	    count = dcesegmentsize(segment,0,rank0); /* how many to read */
 	    internlen = interntypesize*count;
-            ocstat = oc_data_readn(conn,currentcontent,dap_zero,count,internlen,memory->next);
+            ocstat = oc_data_readn(conn,currentcontent,NC_coord_zero,count,internlen,memory->next);
             if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;}
 	}
     }
diff --git a/libdap2/main.c b/libdap2/main.c
index b9294fe..8111eba 100644
--- a/libdap2/main.c
+++ b/libdap2/main.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "dapdump.h"
 
 #define LIMIT 1000
diff --git a/libdap2/nccommon.h b/libdap2/nccommon.h
index abb7b0f..2f12376 100644
--- a/libdap2/nccommon.h
+++ b/libdap2/nccommon.h
@@ -6,6 +6,8 @@
 #ifndef NCCOMMON_H
 #define NCCOMMON_H 1
 
+#include "dapincludes.h"
+
 /* Mnemonics */
 #ifndef BOOL
 #define BOOL int
@@ -56,41 +58,6 @@ struct NCcache;
 struct NCslice;
 struct NCsegment;
 struct OClist;
-/**************************************************/
-/*
-Collect single bit flags that
-affect the operation of the system.
-*/
-
-typedef unsigned int NCFLAGS;
-#  define SETFLAG(controls,flag) ((controls.flags) |= (flag))
-#  define CLRFLAG(controls,flag) ((controls.flags) &= ~(flag))
-#  define FLAGSET(controls,flag) (((controls.flags) & (flag)) != 0)
-
-/* Defined flags */
-#define NCF_NC3             (0x0001) /* DAP->netcdf-3 */
-#define NCF_NC4             (0x0002) /* DAP->netcdf-4 */
-#define NCF_NCDAP           (0x0004) /* Do libnc-dap mimic */
-#define NCF_CACHE           (0x0008) /* Cache enabled/disabled */
-#define NCF_UPGRADE         (0x0010) /* Do proper type upgrades */
-#define NCF_UNCONSTRAINABLE (0x0020) /* Not a constrainable URL */
-#define NCF_SHOWFETCH       (0x0040) /* show fetch calls */
-#define NCF_ONDISK          (0x0080) /* cause oc to store data on disk */
-#define NCF_WHOLEVAR        (0x0100) /* retrieve only whole variables (as opposed to partial variable) into cache */
-#define NCF_PREFETCH        (0x0200) /* Cache prefetch enabled/disabled */
-#define NCF_PREFETCH_EAGER  (0x0400) /* Do eager prefetch; 0=>lazy */
-#define NCF_PREFETCH_ALL    (0x0800) /* Prefetch all variables */
-#ifdef COLUMBIA_HACK
-#define NCF_COLUMBIA        (0x80000000) /* Hack for columbia server */
-#endif
-
-/* Define all the default on flags */
-#define DFALT_ON_FLAGS (NCF_CACHE|NCF_PREFETCH)
-
-typedef struct NCCONTROLS {
-    NCFLAGS  flags;
-} NCCONTROLS;
-
 struct NCTMODEL {
     int translation;
     char* model;
@@ -149,10 +116,6 @@ typedef struct NCCDF {
     struct CDFnode* globalstringdim;
     char* recorddimname; /* From DODS_EXTRA */
     struct CDFnode* recorddim;
-#if 0
-    /* libncdap4 only */
-    NClist*  usertypes; /* nodes which will represent netcdf types */
-#endif
 } NCCDF;
 
 /* Define a structure holding common info for NCDAP */
diff --git a/libdap2/ncd2dispatch.c b/libdap2/ncd2dispatch.c
index b679c4d..cfd5040 100644
--- a/libdap2/ncd2dispatch.c
+++ b/libdap2/ncd2dispatch.c
@@ -3,9 +3,9 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "ncd2dispatch.h"
-#include "dapalign.h"
+#include "ncoffsets.h"
 
 #ifdef _MSC_VER
 #include <crtdbg.h>
@@ -27,9 +27,6 @@ static char* constrainableprotocols[] = {"http", "https",NULL};
 
 static int ncd2initialized = 0;
 
-size_t dap_one[NC_MAX_VAR_DIMS];
-size_t dap_zero[NC_MAX_VAR_DIMS];
-
 /* Forward */
 static NCerror buildncstructures(NCDAPCOMMON*);
 static NCerror builddims(NCDAPCOMMON*);
@@ -189,15 +186,7 @@ static NC_Dispatch NCD2_dispatcher;
 int
 NCD2_initialize(void)
 {
-    int i;
-
     NCD2_dispatch_table = &NCD2_dispatch_base;
-    /* Local Initialization */
-    compute_nccalignments();
-    for(i=0;i<NC_MAX_VAR_DIMS;i++) {
-	dap_one[i] = 1;
-	dap_zero[i] = 0;
-    }
     ncd2initialized = 1;
 #ifdef DEBUG
     /* force logging to go to stderr */
@@ -304,7 +293,7 @@ NCD2_open(const char * path, int mode,
 
     if(path == NULL)
 	return NC_EDAPURL;
-    if(dispatch == NULL) PANIC("NC3D_open: no dispatch table");
+    if(dispatch == NULL) PANIC("NCD3_open: no dispatch table");
 
     /* Setup our NC and NCDAPCOMMON state*/
 
@@ -336,10 +325,8 @@ NCD2_open(const char * path, int mode,
     dapcomm->oc.rawurltext = strdup(path);
 #endif
 
-    ncuriparse(dapcomm->oc.rawurltext,&dapcomm->oc.url);
-
-    /* parse the client parameters */
-    ncuridecodeparams(dapcomm->oc.url);
+    if(ncuriparse(dapcomm->oc.rawurltext,&dapcomm->oc.url) != NCU_OK)
+	{ncstat = NC_EURL; goto done;}
 
     if(!constrainable(dapcomm->oc.url))
 	SETFLAG(dapcomm->controls,NCF_UNCONSTRAINABLE);
@@ -359,9 +346,9 @@ NCD2_open(const char * path, int mode,
 
     /* fail if we are unconstrainable but have constraints */
     if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) {
-	if(dapcomm->oc.url->constraint != NULL) {
+	if(dapcomm->oc.url->query != NULL) {
 	    nclog(NCLOGWARN,"Attempt to constrain an unconstrainable data source: %s",
-		   dapcomm->oc.url->constraint);
+		   dapcomm->oc.url->query);
 	    ncstat = THROW(NC_EDAPCONSTRAINT);
 	    goto done;
 	}
@@ -381,7 +368,7 @@ NCD2_open(const char * path, int mode,
            force default format temporarily in case user changed it.
 	*/
 	{
-	    int new = NC_CLASSIC_MODEL;
+	    int new = 0; /* format netcdf-3 */
 	    int old = 0;
 	    nc_set_default_format(new,&old); /* save and change */
             ncstat = nc_create(tmpname,NC_DISKLESS|NC_CLASSIC_MODEL,&nc3id);
@@ -399,12 +386,11 @@ NCD2_open(const char * path, int mode,
     dapcomm->oc.dapconstraint->selections = nclistnew();
 
      /* Parse constraints to make sure they are syntactically correct */
-     ncstat = dapparsedapconstraints(dapcomm,dapcomm->oc.url->constraint,dapcomm->oc.dapconstraint);
+     ncstat = dapparsedapconstraints(dapcomm,dapcomm->oc.url->query,dapcomm->oc.dapconstraint);
      if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;}
 
     /* Construct a url for oc minus any constraint and params*/
-    dapcomm->oc.urltext = ncuribuild(dapcomm->oc.url,NULL,NULL,
-				      (NCURISTD ^ NCURICONSTRAINTS));
+    dapcomm->oc.urltext = ncuribuild(dapcomm->oc.url,NULL,NULL,NCURIBASE);
 
     /* Pass to OC */
     ocstat = oc_open(dapcomm->oc.urltext,&dapcomm->oc.conn);
@@ -542,16 +528,16 @@ fprintf(stderr,"constrained dds: %s\n",dumptree(dapcomm->cdf.ddsroot));
     /* using the modified constraint, rebuild the constraint string */
     if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) {
 	/* ignore all constraints */
-	dapcomm->oc.urltext = ncuribuild(dapcomm->oc.url,NULL,NULL,0);
+	dapcomm->oc.urltext = ncuribuild(dapcomm->oc.url,NULL,NULL,NCURIBASE);
     } else {
 	char* constraintstring = dcebuildconstraintstring(dapcomm->oc.dapconstraint);
-        ncurisetconstraints(dapcomm->oc.url,constraintstring);
+        ncurisetquery(dapcomm->oc.url,constraintstring);
 	nullfree(constraintstring);
-        dapcomm->oc.urltext = ncuribuild(dapcomm->oc.url,NULL,NULL,NCURICONSTRAINTS);
+        dapcomm->oc.urltext = ncuribuild(dapcomm->oc.url,NULL,NULL,NCURISVC);
     }
 
 #ifdef DEBUG
-fprintf(stderr,"ncdap3: final constraint: %s\n",dapcomm->oc.url->constraint);
+fprintf(stderr,"ncdap3: final constraint: %s\n",dapcomm->oc.url->query);
 #endif
 
     /* Estimate the variable sizes */
@@ -635,7 +621,6 @@ buildncstructures(NCDAPCOMMON* dapcomm)
 {
     NCerror ncstat = NC_NOERR;
     CDFnode* dds = dapcomm->cdf.ddsroot;
-    NC* ncsub;
 
     ncstat = buildglobalattrs(dapcomm,dds);
     if(ncstat != NC_NOERR) goto done;
@@ -994,7 +979,7 @@ getdefinename(CDFnode* node)
 }
 
 int
-NCDAP_ping(const char* url)
+NCDAP2_ping(const char* url)
 {
     OCerror ocstat = OC_NOERR;
     ocstat = oc_ping(url);
@@ -1755,6 +1740,7 @@ done:
 static NCerror
 freeNCDAPCOMMON(NCDAPCOMMON* dapcomm)
 {
+    if(dapcomm == NULL) return NC_NOERR;
     freenccache(dapcomm,dapcomm->cdf.cache);
     nclistfree(dapcomm->cdf.projectedvars);
     nullfree(dapcomm->cdf.recorddimname);
@@ -1844,8 +1830,8 @@ computeseqcountconstraints(NCDAPCOMMON* dapcomm, CDFnode* seq, NCbytes* seqcount
 	}
     }
     /* Finally, add in any selection from the original URL */
-    if(dapcomm->oc.url->selection != NULL)
-        ncbytescat(seqcountconstraints,dapcomm->oc.url->selection);
+    if(dap_getselection(dapcomm->oc.url) != NULL)
+        ncbytescat(seqcountconstraints,dap_getselection(dapcomm->oc.url));
     nclistfree(path);
     return NC_NOERR;
 }
@@ -1992,7 +1978,7 @@ fetchpatternmetadata(NCDAPCOMMON* dapcomm)
     if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE))
 	ce = NULL;
     else
-        ce = nulldup(dapcomm->oc.url->selection);
+        ce = nulldup(dap_getselection(dapcomm->oc.url));
 
     /* Get selection constrained DDS */
     ncstat = dap_fetch(dapcomm,dapcomm->oc.conn,ce,OCDDS,&ocroot);
diff --git a/libdap2/ncd2dispatch.h b/libdap2/ncd2dispatch.h
index 9b3e826..04df44f 100644
--- a/libdap2/ncd2dispatch.h
+++ b/libdap2/ncd2dispatch.h
@@ -43,93 +43,93 @@
 extern "C" {
 #endif
 
-EXTERNL int
+extern int
 NCD2_open(const char *path, int mode,
          int basepe, size_t *chunksizehintp,
          int use_parallel, void* mpidata,
          struct NC_Dispatch* dispatch, NC* ncp);
 
-EXTERNL int
+extern int
 NCD2_close(int ncid);
 
-EXTERNL int
+extern int
 NCD2_inq_format_extended(int ncid, int* formatp, int* modep);
 
-EXTERNL int
+extern int
 NCD2_set_fill(int ncid, int fillmode, int *old_modep);
 
-EXTERNL int
+extern int
 NCD2_set_base_pe(int ncid, int pe);
 
-EXTERNL int
+extern int
 NCD2_inq_base_pe(int ncid, int *pe);
 
-EXTERNL int
+extern int
 NCD2_inq_format(int ncid, int *formatp);
 
-EXTERNL int
+extern int
 NCD2_inq_format_extended(int ncid, int *formatp, int *modep);
 
-EXTERNL int
+extern int
 NCD2_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp);
 
-EXTERNL int
+extern int
 NCD2_inq_type(int, nc_type, char *, size_t *);
 
 /* Begin _dim */
 
-EXTERNL int
+extern int
 NCD2_def_dim(int ncid, const char *name, size_t len, int *idp);
 
-EXTERNL int
+extern int
 NCD2_inq_dimid(int ncid, const char *name, int *idp);
 
-EXTERNL int
+extern int
 NCD2_inq_dim(int ncid, int dimid, char *name, size_t *lenp);
 
-EXTERNL int
+extern int
 NCD2_inq_unlimdim(int ncid, int *unlimdimidp);
 
-EXTERNL int
+extern int
 NCD2_rename_dim(int ncid, int dimid, const char *name);
 
 /* End _dim */
 /* Begin _att */
 
-EXTERNL int
+extern int
 NCD2_inq_att(int ncid, int varid, const char *name,
 	    nc_type *xtypep, size_t *lenp);
 
-EXTERNL int
+extern int
 NCD2_inq_attid(int ncid, int varid, const char *name, int *idp);
 
-EXTERNL int
+extern int
 NCD2_inq_attname(int ncid, int varid, int attnum, char *name);
 
-EXTERNL int
+extern int
 NCD2_rename_att(int ncid, int varid, const char *name, const char *newname);
 
-EXTERNL int
+extern int
 NCD2_del_att(int ncid, int varid, const char*);
 
 /* End _att */
 /* Begin {put,get}_att */
 
-EXTERNL int
+extern int
 NCD2_get_att(int ncid, int varid, const char *name, void *value, nc_type);
 
-EXTERNL int
+extern int
 NCD2_put_att(int ncid, int varid, const char *name, nc_type datatype,
 	   size_t len, const void *value, nc_type);
 
 /* End {put,get}_att */
 /* Begin _var */
 
-EXTERNL int
+extern int
 NCD2_def_var(int ncid, const char *name,
 	 nc_type xtype, int ndims, const int *dimidsp, int *varidp);
 
-EXTERNL int
+extern int
 NCD2_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
                int *ndimsp, int *dimidsp, int *nattsp,
                int *shufflep, int *deflatep, int *deflate_levelp,
@@ -137,7 +137,7 @@ NCD2_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
                int *no_fill, void *fill_valuep, int *endiannessp,
 	       int *options_maskp, int *pixels_per_blockp);
 
-EXTERNL int
+extern int
 NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
                int *ndimsp, int *dimidsp, int *nattsp,
                int *shufflep, int *deflatep, int *deflate_levelp,
@@ -145,142 +145,133 @@ NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
                int *no_fill, void *fill_valuep, int *endiannessp,
 	       int *options_maskp, int *pixels_per_blockp);
 
-EXTERNL int
+extern int
 NCD2_inq_varid(int ncid, const char *name, int *varidp);
 
-EXTERNL int
+extern int
 NCD2_rename_var(int ncid, int varid, const char *name);
 
 /* End _var */
 
-EXTERNL int
+extern int
 NCD2_var_par_access(int, int, int);
 
   /* netCDF4 API only */
 #ifdef USE_NETCDF4
-  EXTERNL int
+  extern int
   NCD2_inq_ncid(int, const char *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_grps(int, int *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_grpname(int, char *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_grpname_full(int, size_t *, char *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_grp_parent(int, int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_grp_full_ncid(int, const char *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_varids(int, int * nvars, int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_dimids(int, int * ndims, int *, int);
 
-  EXTERNL int
+  extern int
   NCD2_inq_typeids(int, int * ntypes, int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_type_equal(int, nc_type, int, nc_type, int *);
 
-  EXTERNL int
+  extern int
   NCD2_rename_grp(int, const char *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_user_type(int, nc_type, char *, size_t *, nc_type *,
                      size_t *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_insert_compound(int, nc_type, const char *, size_t, nc_type);
 
-  EXTERNL int
+  extern int
   NCD2_insert_array_compound(int, nc_type, const char *, size_t,
                              nc_type, int, const int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_typeid(int, const char *, nc_type *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_compound_field(int, nc_type, int, char *, size_t *,
                           nc_type *, int *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_compound_fieldindex(int, nc_type, const char *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_def_vlen(int, const char *, nc_type base_typeid, nc_type *);
 
-  EXTERNL int
+  extern int
   NCD2_put_vlen_element(int, int, void *, size_t, const void *);
 
-  EXTERNL int
+  extern int
   NCD2_get_vlen_element(int, int, const void *, size_t *, void *);
 
-  EXTERNL int
+  extern int
   NCD2_insert_enum(int, nc_type, const char *, const void *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_enum_member(int, nc_type, int, char *, void *);
 
-  EXTERNL int
+  extern int
   NCD2_inq_enum_ident(int, nc_type, long long, char *);
 
-  EXTERNL int
+  extern int
   NCD2_def_var_deflate(int, int, int, int, int);
 
-  EXTERNL int
+  extern int
   NCD2_def_var_fletcher32(int, int, int);
 
-  EXTERNL int
+  extern int
   NCD2_def_var_chunking(int, int, int, const size_t *);
 
-  EXTERNL int
+  extern int
   NCD2_def_var_fill(int, int, int, const void *);
 
-  EXTERNL int
+  extern int
   NCD2_def_var_endian(int, int, int);
 
-  EXTERNL int
+  extern int
   NCD2_inq_unlimdims(int, int *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_show_metadata(int);
 
-  EXTERNL int
+  extern int
   NCD2_def_compound(int, size_t, const char *, nc_type *);
 
-  EXTERNL int
+  extern int
   NCD2_def_enum(int, nc_type, const char *, nc_type *);
 
-  EXTERNL int
+  extern int
   NCD2_def_grp(int, const char *, int *);
 
-  EXTERNL int
+  extern int
   NCD2_def_opaque(int, size_t, const char *, nc_type *);
 
-  EXTERNL int
+  extern int
   NCD2_set_var_chunk_cache(int, int, size_t, size_t, float);
 
 
-EXTERNL int
+extern int
 NCD2_get_var_chunk_cache(int, int, size_t *, size_t *, float *);
 
-
 #endif //USE_NETCDF4
 
-
-
-
-
-
-
-extern int NCD2_initialize(void);
-
 #if defined(__cplusplus)
 }
 #endif
diff --git a/libdap2/ncdap.c b/libdap2/ncdap.c
index 6b277a2..62aaea4 100644
--- a/libdap2/ncdap.c
+++ b/libdap2/ncdap.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 
 #ifdef HAVE_GETRLIMIT
 #  ifdef HAVE_SYS_RESOURCE_H
@@ -19,7 +19,7 @@
 #include "nc3internal.h"
 #include "nc3dispatch.h"
 #include "ncd2dispatch.h"
-#include "dapalign.h"
+#include "ncoffsets.h"
 #include "dapdump.h"
 
 static NCerror buildncstructures(NCDAPCOMMON*);
diff --git a/libdap2/ncdap.h b/libdap2/ncdap.h
deleted file mode 100644
index b3ca460..0000000
--- a/libdap2/ncdap.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*********************************************************************
-  *   Copyright 1993, UCAR/Unidata
-  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
-  *********************************************************************/
-#ifndef NCDAP_H
-#define NCDAP_H 1
-
-#include "config.h"
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "ncbytes.h"
-#include "nclist.h"
-#include "nchashmap.h"
-#include "nclog.h"
-#include "ncuri.h"
-
-#include "fbits.h"
-#include "dceconstraints.h"
-
-#include "netcdf.h"
-#include "ncdispatch.h"
-#include "nc.h"
-#include "nc3internal.h"
- /* netcdf overrides*/
-#include "dapnc.h"
-
-#include "oc.h"
-
-#include "dapdebug.h"
-#include "daputil.h"
-
-/**************************************************/
-/* sigh, do the forwards */
-struct NCprojection;
-struct NCselection;
-struct Getvara;
-struct NCcachenode;
-struct NCcache;
-struct NCslice;
-struct NCsegment;
-
-/**************************************************/
-
-#include "nccommon.h"
-#include "getvara.h"
-#include "constraints.h"
-
-/**************************************************/
-
-#ifndef USE_NETCDF4
-#define	NC_UBYTE 	7	/* unsigned 1 byte int */
-#define	NC_USHORT 	8	/* unsigned 2-byte int */
-#define	NC_UINT 	9	/* unsigned 4-byte int */
-#define	NC_INT64 	10	/* signed 8-byte int */
-#define	NC_UINT64 	11	/* unsigned 8-byte int */
-#define	NC_STRING 	12	/* string */
-
-#define NC_MAX_BYTE 127
-#define NC_MIN_BYTE (-NC_MAX_BYTE-1)
-#define NC_MAX_CHAR 255
-#define NC_MAX_SHORT 32767
-#define NC_MIN_SHORT (-NC_MAX_SHORT - 1)
-#define NC_MAX_INT 2147483647
-#define NC_MIN_INT (-NC_MAX_INT - 1)
-#define NC_MAX_FLOAT 3.402823466e+38f
-#define NC_MIN_FLOAT (-NC_MAX_FLOAT)
-#define NC_MAX_DOUBLE 1.7976931348623157e+308 
-#define NC_MIN_DOUBLE (-NC_MAX_DOUBLE)
-#define NC_MAX_UBYTE NC_MAX_CHAR
-#define NC_MAX_USHORT 65535U
-#define NC_MAX_UINT 4294967295U
-#define NC_MAX_INT64 (9223372036854775807LL)
-#define NC_MIN_INT64 (-9223372036854775807LL-1)
-#define NC_MAX_UINT64 (18446744073709551615ULL)
-#define X_INT64_MAX     (9223372036854775807LL)
-#define X_INT64_MIN     (-X_INT64_MAX - 1)
-#define X_UINT64_MAX    (18446744073709551615ULL)
-#endif /*USE_NETCDF4*/
-
-
-/**************************************************/
-
-extern struct NCTMODEL nctmodels[];
-
-/**************************************************/
-/* Import some internal procedures from libsrc*/
-
-/* Internal, but non-static procedures */
-extern NCerror computecdfvarnames(NCDAPCOMMON*,CDFnode*,NClist*);
-extern NCerror computecdfnodesets(NCDAPCOMMON* nccomm, CDFtree* tree);
-extern NCerror computevarnodes(NCDAPCOMMON*, NClist*, NClist*);
-extern NCerror collectvardefdims(NCDAPCOMMON* drno, CDFnode* var, NClist* dimset);
-extern NCerror fixgrids(NCDAPCOMMON* drno);
-extern NCerror dapmerge(NCDAPCOMMON* drno, CDFnode* node, OCobject dasroot);
-extern NCerror sequencecheck(NCDAPCOMMON* drno);
-extern NCerror computecdfdimnames(NCDAPCOMMON*);
-extern NCerror attachdatadds(struct NCDAPCOMMON*);
-extern NCerror detachdatadds(struct NCDAPCOMMON*);
-extern void dapdispatch3init(void);
-
-/*
-extern void dereference(NCconstraint* constraint);
-extern NCerror rereference(NCconstraint*, NClist*);
-*/
-
-extern NCerror dapbuildvaraprojection(CDFnode*,
-		     const size_t* startp, const size_t* countp, const ptrdiff_t* stridep,
-		     struct DCEprojection** projectionlist);
-
-extern NCerror nc3d_getvarx(int ncid, int varid,
-	    const size_t *startp,
-	    const size_t *countp,
-	    const ptrdiff_t *stridep,
-	    void *data,
-	    nc_type dsttype0);
-
-/**************************************************/
-
-/* From: ncd2dispatch.c*/
-extern size_t dap_one[NC_MAX_VAR_DIMS];
-extern size_t dap_zero[NC_MAX_VAR_DIMS];
-
-extern NCerror nc3d_open(const char* path, int mode, int* ncidp);
-extern int nc3d_close(int ncid);
-extern NCerror restruct(NCDAPCOMMON*, CDFnode* ddsroot, CDFnode* pattern, NClist*);
-extern void setvisible(CDFnode* root, int visible);
-extern NCerror mapnodes(CDFnode* dstroot, CDFnode* srcroot);
-extern void unmap(CDFnode* root);
-
-#if 0
-extern NCerror fetchpatternmetadata(NCDAPCOMMON* nccomm);
-extern NCerror fetchconstrainedmetadata(NCDAPCOMMON* nccomm);
-extern void applyclientparamcontrols(NCDAPCOMMON*);
-extern NCerror suppressunusablevars(NCDAPCOMMON*);
-extern void estimatevarsizes(NCDAPCOMMON*);
-extern NCerror showprojection(NCDAPCOMMON*, CDFnode* var);
-#endif
-
-/* From: dapcvt.c*/
-extern NCerror dapconvert(nc_type, nc_type, char*, char*, size_t);
-extern int dapcvtattrval(nc_type, void*, NClist*);
-
-#endif /*NCDAP_H*/
diff --git a/libdap2/ncdapa.c b/libdap2/ncdapa.c
index 6b66f8e..12a912a 100644
--- a/libdap2/ncdapa.c
+++ b/libdap2/ncdapa.c
@@ -3,10 +3,10 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 #include "nc3dispatch.h"
 #include "ncd2dispatch.h"
-#include "dapalign.h"
+#include "ncoffsets.h"
 #include "dapdump.h"
 #include "oc.h"
 
diff --git a/libdap2/ncdaperr.c b/libdap2/ncdaperr.c
index 476cd55..1833280 100644
--- a/libdap2/ncdaperr.c
+++ b/libdap2/ncdaperr.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include "ncdap.h"
+#include "dapincludes.h"
 
 NCerror
 ocerrtoncerr(OCerror ocerr)
diff --git a/libdap2/test_vara.c b/libdap2/test_vara.c
index 90ed90e..c4bd0e0 100644
--- a/libdap2/test_vara.c
+++ b/libdap2/test_vara.c
@@ -4,6 +4,8 @@
 #include <string.h>
 #include <netcdf.h>
 
+extern char* nc_findtestserver(const char* path, int isdap4);
+
 #define DTSTEST "/dts/test.06"
 
 /* The DDS in netcdf classic form is as follows: 
@@ -82,7 +84,7 @@ main()
     const char* svc = NULL;
     
     /* Find Test Server */
-    svc = NC_findtestserver("dts");
+    svc = nc_findtestserver("dts",0);
     if(svc == NULL) {
 	fprintf(stderr,"Cannot locate test server\n");
 	exit(1);
diff --git a/libdap4/CMakeLists.txt b/libdap4/CMakeLists.txt
new file mode 100644
index 0000000..cbf6f5b
--- /dev/null
+++ b/libdap4/CMakeLists.txt
@@ -0,0 +1,32 @@
+SET(dap4_SOURCES d4crc32.c d4curlfunctions.c d4curlflags.c d4rc.c d4fix.c d4data.c d4file.c d4parser.c d4meta.c d4varx.c d4dump.c d4swap.c d4chunk.c d4printer.c d4read.c d4http.c d4util.c d4odom.c d4cvt.c d4debug.c ncd4dispatch.c ezxml_extra.c ezxml.c)
+
+add_library(dap4 OBJECT ${dap4_SOURCES})
+
+###
+# Options related to the man page generation.
+###
+
+###
+# The C API man page.
+###
+
+set(man_MANS netcdf.3)
+
+set(ARGS_MANPAGE -DAPI=C)
+
+IF (USE_NETCDF4)
+  SET(ARGS_MANPAGE ${ARGS_MANPAGE} -DNETCDF4=TRUE)
+ENDIF(USE_NETCDF4)
+
+IF (BUILD_DAP)
+  SET(ARGS_MANPAGE ${ARGS_MANPAGE} -DDAP=TRUE)
+ENDIF(BUILD_DAP)
+
+IF (BUILD_PARALLEL)
+  SET(ARGS_MANPAGE ${ARGS_MANPAGE} -DPARALLEL_IO=TRUE)
+ENDIF(BUILD_PARALLEL)
+
+FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
+SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} dce.y CMakeLists.txt Makefile.am)
+ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
+
diff --git a/libdap4/Make0 b/libdap4/Make0
new file mode 100644
index 0000000..9d7929d
--- /dev/null
+++ b/libdap4/Make0
@@ -0,0 +1,103 @@
+P=data
+
+V=valgrind --leak-check=full --num-callers=100
+G=gdb --args
+
+#ROOT=${HOME}/git/dap4
+ROOT=d:/git/dap4
+
+X=test_one_var.nc
+
+ifeq ($P, parse)
+T=../dap4_test/test_parse.c
+DIR=dmrtestfiles
+EXT=.dmr
+O=
+endif
+ifeq ($P, parser)
+T=../dap4_test/test_parse.c
+DIR=dmrtestfiles
+EXT=.dmr
+O=
+endif
+ifeq ($P, meta)
+T=../dap4_test/test_meta.c
+DIR=dmrtestfiles
+EXT=.dmr
+endif
+ifeq ($P, data)
+T=../dap4_test/test_data.c
+DIR=daptestfiles
+EXT=
+endif
+
+I=${ROOT}/dap4_test/${DIR}/${X}${EXT}
+O=./t.nc
+
+CFLAGS=-Wall -g -O0 -I.. -I../include -I../libdap4 -I../dap4_test
+
+CC=gcc
+LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz  -ldl -lm -lcurl
+
+LLP=/usr/local/lib:${LD_LIBRARY_PATH}
+
+SHELL=/bin/bash
+
+ifeq ($P, meta)
+all:: clean build
+else
+all:: clean mkt
+	./t $I $O
+	if test "x$O" != x ; then ../ncdump/ncdump $O; fi
+endif
+
+g:: mkt
+	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS; \
+	${G} ./t $I $O
+
+v:: mkt
+	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS; \
+	${V} ./t $I $O
+
+build:: mkt
+	./t $I $O
+	../ncdump/ncdump -h $O	
+	
+diff:: mkt
+	rm -fr ./j
+	./t ${ARGS} >& ./j
+
+mkt:: clean t.exe
+
+t.exe: ${T}
+	${CC} -o t ${CFLAGS} ${T} ${LDFLAGS}
+
+#	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS;
+
+d4printer.o: d4printer.c ../liblib/.libs/libnetcdf.a
+	${MAKE}
+
+clean::
+	rm -fr t t.exe t.o
+
+cpp::
+	rm -f cpp.txt
+	${CC} -E ${CFLAGS} d4rc.c > cpp.txt
+
+x:
+	pushd .. ; ${MAKE} ; popd
+
+D=test_struct_type
+TF=../dap4_test/testfiles/${D}
+debug::
+	rm -f t.dmr t.cdl t.dap
+	if test -f ${TF}.syn.dmr; then cp ${TF}.syn.dmr ./t.dmr ; fi
+	if test -f ${TF}.nc.dmr; then cp ${TF}.nc.dmr ./t.dmr ; fi
+	if test -f ${TF}.cdl; then cp ${TF}.cdl ./t.cdl ; fi
+	if test -f ${TF}.dap; then cp ${TF}.dap ./t.dap ; fi
+	if test -f ${TF}.syn.dap; then cp ${TF}.syn.dap ./t.dap ; fi
+	if test -f ${TF}.nc.dap; then cp ${TF}.nc.dap ./t.dap ; fi
+
+gdb:: mkt
+	gdb --args ../ncdump/ncdump '[log][dap4]http://localhost:8081/d4ts/${D}.nc'
+
diff --git a/libdap4/Makefile.am b/libdap4/Makefile.am
new file mode 100644
index 0000000..33223f7
--- /dev/null
+++ b/libdap4/Makefile.am
@@ -0,0 +1,80 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2005, see the COPYRIGHT file for more information.
+
+# This automake file generates the Makefile to libdap2. Whatever that
+# is!
+
+# Put together AM_CPPFLAGS and AM_LDFLAGS.
+include $(top_srcdir)/lib_flags.am
+
+# We may have to add to these later.
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
+CLEANFILES =
+EXTRA_DIST = CMakeLists.txt
+
+LDADD=
+
+SRC= \
+d4crc32.c \
+d4curlfunctions.c \
+d4curlflags.c \
+d4rc.c \
+d4fix.c \
+d4data.c \
+d4file.c \
+d4parser.c \
+d4meta.c \
+d4varx.c \
+d4dump.c \
+d4swap.c \
+d4chunk.c \
+d4printer.c \
+d4read.c \
+d4http.c \
+d4util.c \
+d4odom.c \
+d4cvt.c \
+d4debug.c \
+ncd4dispatch.c \
+ezxml_extra.c \
+ezxml.c
+
+HDRS= \
+ncd4dispatch.h \
+ncd4types.h \
+ncd4.h \
+d4chunk.h \
+d4http.h \
+d4read.h \
+d4curlfunctions.h \
+d4util.h \
+d4debug.h \
+d4odom.h \
+d4bytes.h \
+d4includes.h \
+ezxml.h
+
+if ENABLE_DAP4
+if USE_NETCDF4
+AM_CPPFLAGS += -I$(top_srcdir)/libsrc4
+endif
+
+# Build convenience library
+noinst_LTLIBRARIES = libdap4.la
+libdap4_la_SOURCES = $(SRC) $(HDRS)
+libdap4_la_CPPFLAGS = $(AM_CPPFLAGS)
+libdap4_la_LIBADD =
+
+endif # ENABLE_DAP4
+
+# Show what is needed to insert a new version of ezxml
+# primary fix: The original ezxml.[ch] uses '//' comments;
+# unpack and replace with '/*..*/'
+EZXML=ezxml-0.8.6.tar.gz
+ezxml::
+	rm -fr ./ezxml ./ezxml.[ch] ./license.txt
+	tar -zxf ./${EZXML}
+	sed -e 's|//\(.*\)|/*\1*/|' <ezxml/ezxml.c >./ezxml.c
+	sed -e 's|//\(.*\)|/*\1*/|' <ezxml/ezxml.h >./ezxml.h
+	cp ezxml/license.txt .
diff --git a/libdap4/Makefile.in b/libdap4/Makefile.in
new file mode 100644
index 0000000..f19f98c
--- /dev/null
+++ b/libdap4/Makefile.in
@@ -0,0 +1,940 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2005, see the COPYRIGHT file for more information.
+
+# This automake file generates the Makefile to libdap2. Whatever that
+# is!
+
+# This is part of the netCDF package.
+# Copyright 2005 University Corporation for Atmospheric Research/Unidata
+# See COPYRIGHT file for conditions of use.
+# 
+# Assemble the CPPFLAGS and LDFLAGS that point to all the needed
+# libraries for netCDF-4.
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+ at USE_DAP_TRUE@am__append_1 = -I${top_srcdir}/oc2
+
+# This turns on declspec magic in netcdf.h for windows DLLs.
+ at BUILD_DLL_TRUE@am__append_2 = -DDLL_NETCDF
+ at ENABLE_DAP4_TRUE@@USE_NETCDF4_TRUE at am__append_3 = -I$(top_srcdir)/libsrc4
+subdir = libdap4
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libdap4_la_DEPENDENCIES =
+am__libdap4_la_SOURCES_DIST = d4crc32.c d4curlfunctions.c \
+	d4curlflags.c d4rc.c d4fix.c d4data.c d4file.c d4parser.c \
+	d4meta.c d4varx.c d4dump.c d4swap.c d4chunk.c d4printer.c \
+	d4read.c d4http.c d4util.c d4odom.c d4cvt.c d4debug.c \
+	ncd4dispatch.c ezxml_extra.c ezxml.c ncd4dispatch.h \
+	ncd4types.h ncd4.h d4chunk.h d4http.h d4read.h \
+	d4curlfunctions.h d4util.h d4debug.h d4odom.h d4bytes.h \
+	d4includes.h ezxml.h
+am__objects_1 = libdap4_la-d4crc32.lo libdap4_la-d4curlfunctions.lo \
+	libdap4_la-d4curlflags.lo libdap4_la-d4rc.lo \
+	libdap4_la-d4fix.lo libdap4_la-d4data.lo libdap4_la-d4file.lo \
+	libdap4_la-d4parser.lo libdap4_la-d4meta.lo \
+	libdap4_la-d4varx.lo libdap4_la-d4dump.lo libdap4_la-d4swap.lo \
+	libdap4_la-d4chunk.lo libdap4_la-d4printer.lo \
+	libdap4_la-d4read.lo libdap4_la-d4http.lo libdap4_la-d4util.lo \
+	libdap4_la-d4odom.lo libdap4_la-d4cvt.lo libdap4_la-d4debug.lo \
+	libdap4_la-ncd4dispatch.lo libdap4_la-ezxml_extra.lo \
+	libdap4_la-ezxml.lo
+am__objects_2 =
+ at ENABLE_DAP4_TRUE@am_libdap4_la_OBJECTS = $(am__objects_1) \
+ at ENABLE_DAP4_TRUE@	$(am__objects_2)
+libdap4_la_OBJECTS = $(am_libdap4_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+ at ENABLE_DAP4_TRUE@am_libdap4_la_rpath =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libdap4_la_SOURCES)
+DIST_SOURCES = $(am__libdap4_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+	$(top_srcdir)/lib_flags.am
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_CFLAGS = @AM_CFLAGS@
+AM_CPPFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) \
+	$(am__append_3)
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_LDFLAGS = 
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BINFILE_NAME = @BINFILE_NAME@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CONFIG_DATE = @CONFIG_DATE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DOXYGEN_CSS_FILE = @DOXYGEN_CSS_FILE@
+DOXYGEN_HEADER_FILE = @DOXYGEN_HEADER_FILE@
+DOXYGEN_SEARCHENGINE = @DOXYGEN_SEARCHENGINE@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
+HAS_DISKLESS = @HAS_DISKLESS@
+HAS_HDF4 = @HAS_HDF4@
+HAS_HDF5 = @HAS_HDF5@
+HAS_JNA = @HAS_JNA@
+HAS_LOGGING = @HAS_LOGGING@
+HAS_MMAP = @HAS_MMAP@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAS_PARALLEL = @HAS_PARALLEL@
+HAS_PARALLEL4 = @HAS_PARALLEL4@
+HAS_PNETCDF = @HAS_PNETCDF@
+HAS_SZLIB = @HAS_SZLIB@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
+NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
+NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
+NC_HAS_HDF4 = @NC_HAS_HDF4@
+NC_HAS_HDF5 = @NC_HAS_HDF5@
+NC_HAS_JNA = @NC_HAS_JNA@
+NC_HAS_MMAP = @NC_HAS_MMAP@
+NC_HAS_NC2 = @NC_HAS_NC2@
+NC_HAS_NC4 = @NC_HAS_NC4@
+NC_HAS_PARALLEL = @NC_HAS_PARALLEL@
+NC_HAS_PARALLEL4 = @NC_HAS_PARALLEL4@
+NC_HAS_PNETCDF = @NC_HAS_PNETCDF@
+NC_HAS_SZIP = @NC_HAS_SZIP@
+NC_LIBS = @NC_LIBS@
+NC_M4 = @NC_M4@
+NC_VERSION = @NC_VERSION@
+NC_VERSION_MAJOR = @NC_VERSION_MAJOR@
+NC_VERSION_MINOR = @NC_VERSION_MINOR@
+NC_VERSION_NOTE = @NC_VERSION_NOTE@
+NC_VERSION_PATCH = @NC_VERSION_PATCH@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NOUNDEFINED = @NOUNDEFINED@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHOW_DOXYGEN_TAG_LIST = @SHOW_DOXYGEN_TAG_LIST@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+enable_shared = @enable_shared@
+enable_static = @enable_static@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
+
+# Put together AM_CPPFLAGS and AM_LDFLAGS.
+
+# We may have to add to these later.
+DISTCLEANFILES = 
+MAINTAINERCLEANFILES = 
+CLEANFILES = 
+EXTRA_DIST = CMakeLists.txt
+LDADD = 
+SRC = \
+d4crc32.c \
+d4curlfunctions.c \
+d4curlflags.c \
+d4rc.c \
+d4fix.c \
+d4data.c \
+d4file.c \
+d4parser.c \
+d4meta.c \
+d4varx.c \
+d4dump.c \
+d4swap.c \
+d4chunk.c \
+d4printer.c \
+d4read.c \
+d4http.c \
+d4util.c \
+d4odom.c \
+d4cvt.c \
+d4debug.c \
+ncd4dispatch.c \
+ezxml_extra.c \
+ezxml.c
+
+HDRS = \
+ncd4dispatch.h \
+ncd4types.h \
+ncd4.h \
+d4chunk.h \
+d4http.h \
+d4read.h \
+d4curlfunctions.h \
+d4util.h \
+d4debug.h \
+d4odom.h \
+d4bytes.h \
+d4includes.h \
+ezxml.h
+
+
+# Build convenience library
+ at ENABLE_DAP4_TRUE@noinst_LTLIBRARIES = libdap4.la
+ at ENABLE_DAP4_TRUE@libdap4_la_SOURCES = $(SRC) $(HDRS)
+ at ENABLE_DAP4_TRUE@libdap4_la_CPPFLAGS = $(AM_CPPFLAGS)
+ at ENABLE_DAP4_TRUE@libdap4_la_LIBADD = 
+
+# Show what is needed to insert a new version of ezxml
+# primary fix: The original ezxml.[ch] uses '//' comments;
+# unpack and replace with '/*..*/'
+EZXML = ezxml-0.8.6.tar.gz
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/lib_flags.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libdap4/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign libdap4/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(top_srcdir)/lib_flags.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libdap4.la: $(libdap4_la_OBJECTS) $(libdap4_la_DEPENDENCIES) $(EXTRA_libdap4_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_libdap4_la_rpath) $(libdap4_la_OBJECTS) $(libdap4_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4chunk.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4crc32.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4curlflags.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4curlfunctions.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4cvt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4data.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4debug.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4dump.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4file.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4fix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4http.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4meta.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4odom.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4parser.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4printer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4rc.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4read.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4swap.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4util.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-d4varx.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-ezxml.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-ezxml_extra.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdap4_la-ncd4dispatch.Plo at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+libdap4_la-d4crc32.lo: d4crc32.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4crc32.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4crc32.Tpo -c -o libdap4_la-d4crc32.lo `test -f 'd4crc32.c' || echo '$(srcdir)/'`d4crc32.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4crc32.Tpo $(DEPDIR)/libdap4_la-d4crc32.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4crc32.c' object='libdap4_la-d4crc32.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4crc32.lo `test -f 'd4crc32.c' || echo '$(srcdir)/'`d4crc32.c
+
+libdap4_la-d4curlfunctions.lo: d4curlfunctions.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4curlfunctions.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4curlfunctions.Tpo -c -o libdap4_la-d4curlfunctions.lo `test -f 'd4curlfunctions.c' || echo '$(srcdir)/'`d4curlfunctions.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4curlfunctions.Tpo $(DEPDIR)/libdap4_la-d4curlfunctions.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4curlfunctions.c' object='libdap4_la-d4curlfunctions.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4curlfunctions.lo `test -f 'd4curlfunctions.c' || echo '$(srcdir)/'`d4curlfunctions.c
+
+libdap4_la-d4curlflags.lo: d4curlflags.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4curlflags.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4curlflags.Tpo -c -o libdap4_la-d4curlflags.lo `test -f 'd4curlflags.c' || echo '$(srcdir)/'`d4curlflags.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4curlflags.Tpo $(DEPDIR)/libdap4_la-d4curlflags.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4curlflags.c' object='libdap4_la-d4curlflags.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4curlflags.lo `test -f 'd4curlflags.c' || echo '$(srcdir)/'`d4curlflags.c
+
+libdap4_la-d4rc.lo: d4rc.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4rc.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4rc.Tpo -c -o libdap4_la-d4rc.lo `test -f 'd4rc.c' || echo '$(srcdir)/'`d4rc.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4rc.Tpo $(DEPDIR)/libdap4_la-d4rc.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4rc.c' object='libdap4_la-d4rc.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4rc.lo `test -f 'd4rc.c' || echo '$(srcdir)/'`d4rc.c
+
+libdap4_la-d4fix.lo: d4fix.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4fix.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4fix.Tpo -c -o libdap4_la-d4fix.lo `test -f 'd4fix.c' || echo '$(srcdir)/'`d4fix.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4fix.Tpo $(DEPDIR)/libdap4_la-d4fix.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4fix.c' object='libdap4_la-d4fix.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4fix.lo `test -f 'd4fix.c' || echo '$(srcdir)/'`d4fix.c
+
+libdap4_la-d4data.lo: d4data.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4data.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4data.Tpo -c -o libdap4_la-d4data.lo `test -f 'd4data.c' || echo '$(srcdir)/'`d4data.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4data.Tpo $(DEPDIR)/libdap4_la-d4data.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4data.c' object='libdap4_la-d4data.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4data.lo `test -f 'd4data.c' || echo '$(srcdir)/'`d4data.c
+
+libdap4_la-d4file.lo: d4file.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4file.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4file.Tpo -c -o libdap4_la-d4file.lo `test -f 'd4file.c' || echo '$(srcdir)/'`d4file.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4file.Tpo $(DEPDIR)/libdap4_la-d4file.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4file.c' object='libdap4_la-d4file.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4file.lo `test -f 'd4file.c' || echo '$(srcdir)/'`d4file.c
+
+libdap4_la-d4parser.lo: d4parser.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4parser.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4parser.Tpo -c -o libdap4_la-d4parser.lo `test -f 'd4parser.c' || echo '$(srcdir)/'`d4parser.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4parser.Tpo $(DEPDIR)/libdap4_la-d4parser.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4parser.c' object='libdap4_la-d4parser.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4parser.lo `test -f 'd4parser.c' || echo '$(srcdir)/'`d4parser.c
+
+libdap4_la-d4meta.lo: d4meta.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4meta.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4meta.Tpo -c -o libdap4_la-d4meta.lo `test -f 'd4meta.c' || echo '$(srcdir)/'`d4meta.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4meta.Tpo $(DEPDIR)/libdap4_la-d4meta.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4meta.c' object='libdap4_la-d4meta.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4meta.lo `test -f 'd4meta.c' || echo '$(srcdir)/'`d4meta.c
+
+libdap4_la-d4varx.lo: d4varx.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4varx.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4varx.Tpo -c -o libdap4_la-d4varx.lo `test -f 'd4varx.c' || echo '$(srcdir)/'`d4varx.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4varx.Tpo $(DEPDIR)/libdap4_la-d4varx.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4varx.c' object='libdap4_la-d4varx.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4varx.lo `test -f 'd4varx.c' || echo '$(srcdir)/'`d4varx.c
+
+libdap4_la-d4dump.lo: d4dump.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4dump.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4dump.Tpo -c -o libdap4_la-d4dump.lo `test -f 'd4dump.c' || echo '$(srcdir)/'`d4dump.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4dump.Tpo $(DEPDIR)/libdap4_la-d4dump.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4dump.c' object='libdap4_la-d4dump.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4dump.lo `test -f 'd4dump.c' || echo '$(srcdir)/'`d4dump.c
+
+libdap4_la-d4swap.lo: d4swap.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4swap.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4swap.Tpo -c -o libdap4_la-d4swap.lo `test -f 'd4swap.c' || echo '$(srcdir)/'`d4swap.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4swap.Tpo $(DEPDIR)/libdap4_la-d4swap.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4swap.c' object='libdap4_la-d4swap.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4swap.lo `test -f 'd4swap.c' || echo '$(srcdir)/'`d4swap.c
+
+libdap4_la-d4chunk.lo: d4chunk.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4chunk.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4chunk.Tpo -c -o libdap4_la-d4chunk.lo `test -f 'd4chunk.c' || echo '$(srcdir)/'`d4chunk.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4chunk.Tpo $(DEPDIR)/libdap4_la-d4chunk.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4chunk.c' object='libdap4_la-d4chunk.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4chunk.lo `test -f 'd4chunk.c' || echo '$(srcdir)/'`d4chunk.c
+
+libdap4_la-d4printer.lo: d4printer.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4printer.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4printer.Tpo -c -o libdap4_la-d4printer.lo `test -f 'd4printer.c' || echo '$(srcdir)/'`d4printer.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4printer.Tpo $(DEPDIR)/libdap4_la-d4printer.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4printer.c' object='libdap4_la-d4printer.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4printer.lo `test -f 'd4printer.c' || echo '$(srcdir)/'`d4printer.c
+
+libdap4_la-d4read.lo: d4read.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4read.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4read.Tpo -c -o libdap4_la-d4read.lo `test -f 'd4read.c' || echo '$(srcdir)/'`d4read.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4read.Tpo $(DEPDIR)/libdap4_la-d4read.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4read.c' object='libdap4_la-d4read.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4read.lo `test -f 'd4read.c' || echo '$(srcdir)/'`d4read.c
+
+libdap4_la-d4http.lo: d4http.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4http.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4http.Tpo -c -o libdap4_la-d4http.lo `test -f 'd4http.c' || echo '$(srcdir)/'`d4http.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4http.Tpo $(DEPDIR)/libdap4_la-d4http.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4http.c' object='libdap4_la-d4http.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4http.lo `test -f 'd4http.c' || echo '$(srcdir)/'`d4http.c
+
+libdap4_la-d4util.lo: d4util.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4util.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4util.Tpo -c -o libdap4_la-d4util.lo `test -f 'd4util.c' || echo '$(srcdir)/'`d4util.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4util.Tpo $(DEPDIR)/libdap4_la-d4util.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4util.c' object='libdap4_la-d4util.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4util.lo `test -f 'd4util.c' || echo '$(srcdir)/'`d4util.c
+
+libdap4_la-d4odom.lo: d4odom.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4odom.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4odom.Tpo -c -o libdap4_la-d4odom.lo `test -f 'd4odom.c' || echo '$(srcdir)/'`d4odom.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4odom.Tpo $(DEPDIR)/libdap4_la-d4odom.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4odom.c' object='libdap4_la-d4odom.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4odom.lo `test -f 'd4odom.c' || echo '$(srcdir)/'`d4odom.c
+
+libdap4_la-d4cvt.lo: d4cvt.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4cvt.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4cvt.Tpo -c -o libdap4_la-d4cvt.lo `test -f 'd4cvt.c' || echo '$(srcdir)/'`d4cvt.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4cvt.Tpo $(DEPDIR)/libdap4_la-d4cvt.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4cvt.c' object='libdap4_la-d4cvt.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4cvt.lo `test -f 'd4cvt.c' || echo '$(srcdir)/'`d4cvt.c
+
+libdap4_la-d4debug.lo: d4debug.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-d4debug.lo -MD -MP -MF $(DEPDIR)/libdap4_la-d4debug.Tpo -c -o libdap4_la-d4debug.lo `test -f 'd4debug.c' || echo '$(srcdir)/'`d4debug.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-d4debug.Tpo $(DEPDIR)/libdap4_la-d4debug.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='d4debug.c' object='libdap4_la-d4debug.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-d4debug.lo `test -f 'd4debug.c' || echo '$(srcdir)/'`d4debug.c
+
+libdap4_la-ncd4dispatch.lo: ncd4dispatch.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-ncd4dispatch.lo -MD -MP -MF $(DEPDIR)/libdap4_la-ncd4dispatch.Tpo -c -o libdap4_la-ncd4dispatch.lo `test -f 'ncd4dispatch.c' || echo '$(srcdir)/'`ncd4dispatch.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-ncd4dispatch.Tpo $(DEPDIR)/libdap4_la-ncd4dispatch.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ncd4dispatch.c' object='libdap4_la-ncd4dispatch.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-ncd4dispatch.lo `test -f 'ncd4dispatch.c' || echo '$(srcdir)/'`ncd4dispatch.c
+
+libdap4_la-ezxml_extra.lo: ezxml_extra.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-ezxml_extra.lo -MD -MP -MF $(DEPDIR)/libdap4_la-ezxml_extra.Tpo -c -o libdap4_la-ezxml_extra.lo `test -f 'ezxml_extra.c' || echo '$(srcdir)/'`ezxml_extra.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-ezxml_extra.Tpo $(DEPDIR)/libdap4_la-ezxml_extra.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ezxml_extra.c' object='libdap4_la-ezxml_extra.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-ezxml_extra.lo `test -f 'ezxml_extra.c' || echo '$(srcdir)/'`ezxml_extra.c
+
+libdap4_la-ezxml.lo: ezxml.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdap4_la-ezxml.lo -MD -MP -MF $(DEPDIR)/libdap4_la-ezxml.Tpo -c -o libdap4_la-ezxml.lo `test -f 'ezxml.c' || echo '$(srcdir)/'`ezxml.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdap4_la-ezxml.Tpo $(DEPDIR)/libdap4_la-ezxml.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ezxml.c' object='libdap4_la-ezxml.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdap4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdap4_la-ezxml.lo `test -f 'ezxml.c' || echo '$(srcdir)/'`ezxml.c
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+ezxml::
+	rm -fr ./ezxml ./ezxml.[ch] ./license.txt
+	tar -zxf ./${EZXML}
+	sed -e 's|//\(.*\)|/*\1*/|' <ezxml/ezxml.c >./ezxml.c
+	sed -e 's|//\(.*\)|/*\1*/|' <ezxml/ezxml.h >./ezxml.h
+	cp ezxml/license.txt .
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libdap4/d4bytes.c b/libdap4/d4bytes.c
new file mode 100644
index 0000000..8a7ee3f
--- /dev/null
+++ b/libdap4/d4bytes.c
@@ -0,0 +1,73 @@
+/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
+   See the COPYRIGHT file for more information. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "config.h"
+#include "d4util.h"
+#include "d4bytes.h"
+
+#define DEFAULTMINALLOC 8
+
+D4bytes*
+d4bytesnew(void)
+{
+    D4bytes* d4m = (D4bytes*)malloc(sizeof(D4bytes));
+    if(d4m == NULL) return NULL;
+    d4m->alloc=0;
+    d4m->used=0;
+    d4m->memory=NULL;
+    return d4m;
+}
+
+void
+d4bytesfree(D4bytes* d4m)
+{
+    if(d4m == NULL) return;
+    if(d4m->memory != NULL) free(d4m->memory);
+    free(d4m);
+}
+
+void*
+d4bytesalloc(D4bytes* d4m, size_t sz)
+{
+    void* allocation;
+    size_t newalloc;
+    if(sz == 0 || d4m == NULL) return NULL;
+    newalloc = d4m->alloc;
+    if(newalloc == 0) newalloc = DEFAULTMINALLOC;
+    for(;;) {
+        size_t avail = newalloc - d4m->used;
+        if(avail >= sz) { /* rebuild */
+	    void* newmem = realloc(d4m->memory,newalloc);
+	    d4m->memory = newmem;
+	    d4m->alloc = newalloc;
+	    break;
+        }
+	newalloc = (2*newalloc); /* keep doubling */
+    }
+    allocation = (void*)(((char*)d4m->memory)+d4m->used);
+    d4m->used += sz;
+    return allocation;
+}
+
+
+void*
+d4byteszero(D4bytes* d4m, size_t sz)
+{
+    void* mem = d4bytesalloc(d4m,sz);
+    memset(mem,0,sz);
+    return mem;
+}
+
+D4bytes*
+d4bytesconcat(D4bytes* dst, D4bytes* src)
+{
+    if(dst == NULL && src != NULL && src->used > 0) {
+	void* target = d4bytesalloc(dst,src->used);
+	d4memmove(target,src->memory,src->used);
+    }
+    return dst;
+}
diff --git a/libdap4/d4bytes.h b/libdap4/d4bytes.h
new file mode 100644
index 0000000..2ad1c61
--- /dev/null
+++ b/libdap4/d4bytes.h
@@ -0,0 +1,31 @@
+/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
+   See the COPYRIGHT file for more information. */
+
+#ifndef D4BYTES_H
+#define D4BYTES_H 1
+
+typedef struct D4bytes {
+  size_t alloc;
+  size_t used;
+  void* memory;
+} D4bytes;
+
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
+extern "C" {
+#endif
+
+extern D4bytes* d4bytesnew(void);
+extern void d4bytesfree(D4bytes*);
+extern void* d4bytesalloc(D4bytes*,size_t);
+extern void* d4byteszero(D4bytes*,size_t);
+extern D4bytes* d4bytesconcat(D4bytes*,D4bytes*);
+
+#define d4byteslength(d4) ((d4)->used)
+#define d4bytesmemory(d4) ((d4)->memory)
+#define d4bytesreset(d4) {(d4)->used = 0;}
+
+#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
+}
+#endif
+
+#endif /*D4BYTES_H*/
diff --git a/libdap4/d4chunk.c b/libdap4/d4chunk.c
new file mode 100644
index 0000000..b748879
--- /dev/null
+++ b/libdap4/d4chunk.c
@@ -0,0 +1,207 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include "d4chunk.h"
+
+/**************************************************/
+
+/* Header flags */
+#define LAST_CHUNK          (1)
+#define ERR_CHUNK           (2)
+#define LITTLE_ENDIAN_CHUNK (4)
+#define NOCHECKSUM_CHUNK    (8)
+
+#define ALL_CHUNK_FLAGS (LAST_CHUNK|ERR_CHUNK|LITTLE_ENDIAN_CHUNK|NOCHECKSUM_CHUNK)
+
+/**************************************************/
+
+/*
+Given a packet as read from the wire via http (or a file), convert in
+place from chunked format to a single continguous set of bytes. If an
+error packet is recovered, then make that available to the caller and
+return an error. Also return whether the data was big endian encoded
+and whether it has checksums.
+Notes:
+*/
+
+/* Define a local struct for convenience */
+struct HDR {unsigned int flags;	unsigned int count;};
+
+/* Forward */
+static void* getheader(void* p, struct HDR* hdr, int hostlittleendian);
+static int processerrchunk(NCD4meta* metadata, void* errchunk, unsigned int count);
+
+/**************************************************/
+
+int
+NCD4_dechunk(NCD4meta* metadata)
+{
+    unsigned char* p;
+    unsigned char* q;
+    struct HDR hdr;
+
+    if(metadata->mode == NCD4_DSR) 
+        return THROW(NC_EDMR);
+
+    metadata->serial.errdata = NULL;
+    metadata->serial.dmr = NULL;
+    metadata->serial.dap = NULL;
+    metadata->serial.hostlittleendian = NCD4_isLittleEndian();
+    metadata->serial.remotelittleendian = 0; /* do not actually know yet */
+    metadata->serial.remotechecksumming = 0; /* do not actually know yet */
+    metadata->localchecksumming = 0; /* do not actually know yet */
+
+    /* Assume proper mode has been inferred already. */
+
+    /* Verify the mode; assume that the <?xml...?> is optional */
+    q = metadata->serial.rawdata;
+    if(memcmp(q,"<?xml",strlen("<?xml"))==0
+       || memcmp(q,"<Dataset",strlen("<Dataset"))==0) {
+	if(metadata->mode != NCD4_DMR) 
+	    return THROW(NC_EDMR);
+	/* setup as dmr only */
+	metadata->serial.dmr = (char*)metadata->serial.rawdata; /* temp */
+	metadata->serial.dmr[metadata->serial.rawsize-1] = '\0';
+	metadata->serial.dmr = strdup(q);
+	if(metadata->serial.dmr == NULL)
+	    return THROW(NC_ENOMEM);
+	return THROW(NC_NOERR); 
+    }
+
+    /* We must be processing a DAP mode packet */
+    p = metadata->serial.rawdata;
+    metadata->serial.dap = p;
+
+#ifdef D4DUMPRAW
+    NCD4_tagdump(metadata->serial.rawsize,metadata->serial.rawdata,0,"RAW");
+#endif
+
+    /* Get the DMR chunk header*/
+    p = getheader(p,&hdr,metadata->serial.hostlittleendian);
+    if(hdr.count == 0)
+	return THROW(NC_EDMR);
+    if(hdr.flags & ERR_CHUNK) {
+        return processerrchunk(metadata, (void*)p, hdr.count);
+    }
+
+    metadata->serial.remotechecksumming = ((hdr.flags & NOCHECKSUM_CHUNK) ? 0 : 1);
+    metadata->localchecksumming = metadata->serial.remotechecksumming;
+
+    metadata->serial.remotelittleendian = ((hdr.flags & LITTLE_ENDIAN_CHUNK) ? 1 : 0);
+    metadata->serial.dmr = p;
+    metadata->serial.dmr[hdr.count-1] = '\0';
+    metadata->serial.dmr = strdup(metadata->serial.dmr);
+    if(metadata->serial.dmr == NULL)
+	return THROW(NC_ENOMEM);
+    p += hdr.count;
+
+    if(hdr.flags & LAST_CHUNK)
+        return THROW(NC_ENODATA);
+    /* Read and compress the data chunks */
+    q = metadata->serial.dap;
+    for(;;) {
+	p = getheader(p,&hdr,metadata->serial.hostlittleendian);
+	if(hdr.flags & ERR_CHUNK) {
+            return processerrchunk(metadata, (void*)p, hdr.count);
+	}
+	/* data chunk; possibly last; possibly empty */
+	if(hdr.count > 0) {
+	    d4memmove(q,p,hdr.count); /* will overwrite the header */
+	    p += hdr.count;
+	    q += hdr.count;
+	}
+	if(hdr.flags & LAST_CHUNK) break;
+    }
+    metadata->serial.dapsize = (size_t)DELTA(q,metadata->serial.dap);
+#ifdef D4DUMPDMR
+    fprintf(stderr,"%s\n",metadata->serial.dmr);
+    fflush(stderr);
+#endif
+#ifdef D4DUMPDAP
+    NCD4_tagdump(metadata->serial.dapsize,metadata->serial.dap,0,"DAP");
+#endif
+    return THROW(NC_NOERR);    
+}
+
+static int
+processerrchunk(NCD4meta* metadata, void* errchunk, unsigned int count)
+{
+    metadata->serial.errdata = (char*)d4alloc(count+1);
+    if(metadata->serial.errdata == NULL)
+        return THROW(NC_ENOMEM);
+    memcpy(metadata->serial.errdata,errchunk,count);
+    metadata->serial.errdata[count] = '\0';
+    return THROW(NC_ENODATA); /* slight lie */
+}
+
+/* At the moment, the Hyrax test server
+       is serving up the chunk data as little endian.
+       So use a heuristic to see which endianness
+       makes the more sense.
+   This fails for very small dap data sections.
+*/
+static void*
+getheader(void* p, struct HDR* hdr, int hostlittleendian)
+{
+    unsigned char bytes[4];
+#ifdef HYRAXHACK
+    struct HDR hyrax;
+    unsigned char orig[4];
+    memcpy(orig,p,sizeof(bytes));/* save a copy */
+#endif
+    memcpy(bytes,p,sizeof(bytes));
+    p = INCR(p,4); /* on-the-wire hdr is 4 bytes */
+    /* assume header is network (big) order */
+    hdr->flags = bytes[0]; /* big endian => flags are in byte 0 */
+    bytes[0] = 0; /* so we can do byte swap to get count */
+    if(hostlittleendian)
+        swapinline32(bytes); /* host is little endian */
+    hdr->count = *(unsigned int*)bytes; /* get count */
+#ifdef HYRAXHACK
+    memcpy(bytes,orig,sizeof(bytes)); /* restore */
+    hyrax.flags = bytes[3];
+    bytes[3] = 0; /* so we can do byte swap to get count */
+    if(!hostlittleendian)
+        swapinline32(bytes); /* host is big endian */
+    hyrax.count = *(unsigned int*)bytes; /* get count */
+    /* See which makes more sense */
+    if(hyrax.flags <= ALL_CHUNK_FLAGS && hyrax.count >= 0 && hyrax.count < hdr->count) {
+	/* Use hyrax version */
+	*hdr = hyrax;	
+    }
+#endif
+    return p;
+}
+
+/**
+Given a raw response, attempt to infer the mode: DMR, DAP, DSR.
+Since DSR is not standardizes, it becomes the default.
+*/
+int
+NCD4_infermode(NCD4meta* meta)
+{
+    d4size_t size = meta->serial.rawsize;
+    char* raw = meta->serial.rawdata;
+
+    if(size < 16)
+	return THROW(NC_EDAP); /* must have at least this to hold a hdr + partial dmr*/	
+    if(memcmp(raw,"<?xml",strlen("<?xml"))==0
+       || memcmp(raw,"<Dataset",strlen("<Dataset"))==0) {
+	meta->mode = NCD4_DMR;
+	goto done;
+    }
+    raw += 4; /* Pretend we have a DAP hdr */
+    if(memcmp(raw,"<?xml",strlen("<?xml"))==0
+       || memcmp(raw,"<Dataset",strlen("<Dataset"))==0) {
+	meta->mode = NCD4_DAP;
+	goto done;
+    }
+    /* Default to DSR */
+    meta->mode = NCD4_DSR;
+
+done:
+    return NC_NOERR;
+}
diff --git a/libdap4/d4chunk.h b/libdap4/d4chunk.h
new file mode 100644
index 0000000..eecf500
--- /dev/null
+++ b/libdap4/d4chunk.h
@@ -0,0 +1,11 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#ifndef D4CHUNK_H
+#define D4CHUNK_H 1
+/**************************************************/
+
+
+#endif /*D4CHUNK_H*/
diff --git a/libdap4/d4crc32.c b/libdap4/d4crc32.c
new file mode 100644
index 0000000..0c0b635
--- /dev/null
+++ b/libdap4/d4crc32.c
@@ -0,0 +1,103 @@
+/*-
+ *  COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
+ *  code or tables extracted from it, as desired without restriction.
+ *
+ *  First, the polynomial itself and its table of feedback terms.  The
+ *  polynomial is
+ *  X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
+ *
+ *  Note that we take it "backwards" and put the highest-order term in
+ *  the lowest-order bit.  The X^32 term is "implied"; the LSB is the
+ *  X^31 term, etc.  The X^0 term (usually shown as "+1") results in
+ *  the MSB being 1
+ *
+ *  Note that the usual hardware shift register implementation, which
+ *  is what we're using (we're merely optimizing it by doing eight-bit
+ *  chunks at a time) shifts bits into the lowest-order term.  In our
+ *  implementation, that means shifting towards the right.  Why do we
+ *  do it this way?  Because the calculated CRC must be transmitted in
+ *  order from highest-order term to lowest-order term.  UARTs transmit
+ *  characters in order from LSB to MSB.  By storing the CRC this way
+ *  we hand it to the UART in the order low-byte to high-byte; the UART
+ *  sends each low-bit to hight-bit; and the result is transmission bit
+ *  by bit from highest- to lowest-order term without requiring any bit
+ *  shuffling on our part.  Reception works similarly
+ *
+ *  The feedback terms table consists of 256, 32-bit entries.  Notes
+ *
+ *      The table can be generated at runtime if desired; code to do so
+ *      is shown later.  It might not be obvious, but the feedback
+ *      terms simply represent the results of eight shift/xor opera
+ *      tions for all combinations of data and CRC register values
+ *
+ *      The values must be right-shifted by eight bits by the "updcrc
+ *      logic; the shift must be unsigned (bring in zeroes).  On some
+ *      hardware you could probably optimize the shift in assembler by
+ *      using byte-swap instructions
+ *      polynomial $edb88320
+ *
+ *
+ * CRC32 code derived from work by Gary S. Brown.
+ */
+
+#include "d4includes.h"
+
+static uint32_t crc32_tab[] = {
+	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
+};
+
+uint32_t
+NCD4_crc32(uint32_t crc, const void *buf, size_t size)
+{
+	const uint8_t *p;
+
+	p = buf;
+	crc = crc ^ ~0U;
+
+	while (size--)
+		crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
+
+	return crc ^ ~0U;
+}
diff --git a/libdap4/d4curlflags.c b/libdap4/d4curlflags.c
new file mode 100644
index 0000000..56e36ba
--- /dev/null
+++ b/libdap4/d4curlflags.c
@@ -0,0 +1,33 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include "d4curlfunctions.h"
+
+/* Define supported curl flags */
+struct CURLFLAG curlopts[] = { 
+{"CURLOPT_PROXYUSERPWD",CURLOPT_PROXYUSERPWD,10006,CF_STRING},
+{"CURLOPT_SSLCERT",CURLOPT_SSLCERT,10025,CF_STRING},
+{"CURLOPT_SSLKEY",CURLOPT_SSLKEY,10087,CF_STRING},
+{"CURLOPT_SSLKEYPASSWD",CURLOPT_SSLKEYPASSWD,CURLOPT_KEYPASSWD,CF_STRING},
+{"CURLOPT_SSL_VERIFYHOST",CURLOPT_SSL_VERIFYHOST,81,CF_LONG},
+{"CURLOPT_SSL_VERIFYPEER",CURLOPT_SSL_VERIFYPEER,64,CF_LONG},
+{"CURLOPT_TIMEOUT",CURLOPT_TIMEOUT,13,CF_LONG},
+{"CURLOPT_USERAGENT",CURLOPT_USERAGENT,10018,CF_STRING},
+{"CURLOPT_USERPWD",CURLOPT_USERPWD,10005,CF_STRING},
+{"CURLOPT_VERBOSE",CURLOPT_VERBOSE,41,CF_LONG},
+{"CURLOPT_USE_SSL",CURLOPT_USE_SSL,119,CF_LONG},
+{NULL,0}
+};
+
+struct CURLFLAG*
+NCD4_curlflagbyname(const char* name)
+{
+    struct CURLFLAG* p;
+    for(p=curlopts;p->name;p++) {
+	if(strcmp(p->name,name)==0) return p;
+    }
+    return NULL;
+}
diff --git a/libdap4/d4curlfunctions.c b/libdap4/d4curlfunctions.c
new file mode 100644
index 0000000..4fba4ad
--- /dev/null
+++ b/libdap4/d4curlfunctions.c
@@ -0,0 +1,367 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include "d4curlfunctions.h"
+
+#define MAX_REDIRECTS 20L
+
+/* Mnemonic */
+#define OPTARG void*
+
+/* Condition on libcurl version */
+/* Set up an alias as needed */
+#ifndef HAVE_CURLOPT_KEYPASSWD
+#define CURLOPT_KEYPASSWD CURLOPT_SSLKEYPASSWD
+#endif
+
+#define NETRCFILETAG "HTTP.NETRC"
+
+#define CHECK(state,flag,value) {if(check(state,flag,(void*)value) != NC_NOERR) {goto done;}}
+
+/* forward */
+static int set_curlflag(NCD4INFO* state, int flag);
+static int set_curlopt(NCD4INFO* state, int flag, void* value);
+static int set_curl_options(NCD4INFO* state);
+static void* cvt(char* value, enum CURLFLAGTYPE type);
+
+static int
+check(NCD4INFO* state, int flag, void* value)
+{
+    int ret = set_curlopt(state,flag,value);
+    return THROW(ret);
+}
+
+/*
+Set a specific curl flag; primary wrapper for curl_easy_setopt
+*/
+static int
+set_curlopt(NCD4INFO* state, int flag, void* value)
+{
+    int ret = NC_NOERR;
+    CURLcode cstat = CURLE_OK;
+    cstat = curl_easy_setopt(state->curl->curl,flag,value);
+    if(cstat != CURLE_OK)
+	ret = NC_ECURL;
+    return THROW(ret);
+}
+
+/*
+Update a specific flag from state
+*/
+static int
+set_curlflag(NCD4INFO* state, int flag)
+{
+    int ret = NC_NOERR;
+    switch (flag) {
+    case CURLOPT_USERPWD:
+        if(state->curl->creds.userpwd != NULL) {
+	    CHECK(state, CURLOPT_USERPWD, state->curl->creds.userpwd);
+            CHECK(state, CURLOPT_HTTPAUTH, (OPTARG)CURLAUTH_ANY);
+	}
+	break;
+    case CURLOPT_COOKIEJAR: case CURLOPT_COOKIEFILE:
+        if(state->curl->curlflags.cookiejar) {
+	    /* Assume we will read and write cookies to same place */
+	    CHECK(state, CURLOPT_COOKIEJAR, state->curl->curlflags.cookiejar);
+	    CHECK(state, CURLOPT_COOKIEFILE, state->curl->curlflags.cookiejar);
+        }
+	break;
+    case CURLOPT_NETRC: case CURLOPT_NETRC_FILE:
+	if(state->curl->curlflags.netrc) {
+	    CHECK(state, CURLOPT_NETRC, (OPTARG)CURL_NETRC_REQUIRED);
+	    CHECK(state, CURLOPT_NETRC_FILE, state->curl->curlflags.netrc);
+        }
+	break;
+    case CURLOPT_VERBOSE:
+	if(state->curl->curlflags.verbose)
+	    CHECK(state, CURLOPT_VERBOSE, (OPTARG)1L);
+	break;
+    case CURLOPT_TIMEOUT:
+	if(state->curl->curlflags.timeout)
+	    CHECK(state, CURLOPT_TIMEOUT, (OPTARG)((long)state->curl->curlflags.timeout));
+	break;
+    case CURLOPT_USERAGENT:
+        if(state->curl->curlflags.useragent)
+	    CHECK(state, CURLOPT_USERAGENT, state->curl->curlflags.useragent);
+	break;
+    case CURLOPT_FOLLOWLOCATION:
+        CHECK(state, CURLOPT_FOLLOWLOCATION, (OPTARG)1L);
+	break;
+    case CURLOPT_MAXREDIRS:
+	CHECK(state, CURLOPT_MAXREDIRS, (OPTARG)MAX_REDIRECTS);
+	break;
+    case CURLOPT_ERRORBUFFER:
+	CHECK(state, CURLOPT_ERRORBUFFER, state->curl->errdata.errorbuf);
+	break;
+    case CURLOPT_ENCODING:
+#ifdef CURLOPT_ENCODING
+	if(state->curl->curlflags.compress) {
+	    CHECK(state, CURLOPT_ENCODING,"deflate, gzip");
+        }
+#endif
+	break;
+    case CURLOPT_PROXY:
+	if(state->curl->proxy.host != NULL) {
+	    CHECK(state, CURLOPT_PROXY, state->curl->proxy.host);
+	    CHECK(state, CURLOPT_PROXYPORT, (OPTARG)(long)state->curl->proxy.port);
+	    if(state->curl->proxy.userpwd) {
+                CHECK(state, CURLOPT_PROXYUSERPWD, state->curl->proxy.userpwd);
+#ifdef CURLOPT_PROXYAUTH
+	        CHECK(state, CURLOPT_PROXYAUTH, (long)CURLAUTH_ANY);
+#endif
+	    }
+	}
+	break;
+    case CURLOPT_USE_SSL:
+    case CURLOPT_SSLCERT: case CURLOPT_SSLKEY:
+    case CURLOPT_SSL_VERIFYPEER: case CURLOPT_SSL_VERIFYHOST:
+    {
+        struct ssl* ssl = &state->curl->ssl;
+        CHECK(state, CURLOPT_SSL_VERIFYPEER, (OPTARG)(ssl->verifypeer?1L:0L));
+        CHECK(state, CURLOPT_SSL_VERIFYHOST, (OPTARG)(ssl->verifyhost?1L:0L));
+        if(ssl->certificate)
+            CHECK(state, CURLOPT_SSLCERT, ssl->certificate);
+        if(ssl->key)
+            CHECK(state, CURLOPT_SSLKEY, ssl->key);
+        if(ssl->keypasswd)
+            /* libcurl prior to 7.16.4 used 'CURLOPT_SSLKEYPASSWD' */
+            CHECK(state, CURLOPT_KEYPASSWD, ssl->keypasswd);
+        if(ssl->cainfo)
+            CHECK(state, CURLOPT_CAINFO, ssl->cainfo);
+        if(ssl->capath)
+            CHECK(state, CURLOPT_CAPATH, ssl->capath);
+    }
+    break;
+
+    default:
+        nclog(NCLOGWARN,"Attempt to update unexpected curl flag: %d",flag);
+	break;
+    }
+done:
+    return THROW(ret);
+}
+
+/* Set various general curl flags per fetch  */
+int
+NCD4_set_flags_perfetch(NCD4INFO* state)
+{
+    int ret = NC_NOERR;
+    /* currently none */
+    return THROW(ret);
+}
+
+/* Set various general curl flags per link */
+
+int
+NCD4_set_flags_perlink(NCD4INFO* state)
+{
+    int ret = NC_NOERR;
+    /* Following are always set */
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_ENCODING);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_NETRC);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_VERBOSE);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_TIMEOUT);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_USERAGENT);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_COOKIEJAR);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_USERPWD);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_PROXY);
+    if(ret == NC_NOERR) ret = set_curlflag(state,CURLOPT_USE_SSL);
+    if(ret == NC_NOERR) ret = set_curlflag(state, CURLOPT_FOLLOWLOCATION);
+    if(ret == NC_NOERR) ret = set_curlflag(state, CURLOPT_MAXREDIRS);
+    if(ret == NC_NOERR) ret = set_curlflag(state, CURLOPT_ERRORBUFFER);
+
+    /* Set the CURL. options */
+    if(ret == NC_NOERR) ret = set_curl_options(state);
+    return THROW(ret);
+}
+
+/**
+Directly set any options starting with 'CURL.'
+*/
+static int
+set_curl_options(NCD4INFO* state)
+{
+    int ret = NC_NOERR;
+    NClist* store = NULL;
+    int i;
+    char hostport[NC_MAX_PATH];
+
+    NCD4_hostport(state->uri,hostport,sizeof(hostport));
+
+    store = NCD4_globalstate->rc.rc;
+
+    for(i=0;i<nclistlength(store);i++) {
+        struct CURLFLAG* flag;
+	NCD4triple* triple = (NCD4triple*)nclistget(store,i);
+        size_t hostlen = strlen(triple->host);
+        const char* flagname;
+        if(strncmp("CURL.",triple->key,5) != 0) continue; /* not a curl flag */
+        /* do hostport prefix comparison */
+        if(hostport[0] != '\0') {
+          int t = strncmp(hostport,triple->host,hostlen);
+          if(t !=  0) continue;
+        }
+        flagname = triple->key+5; /* 5 == strlen("CURL."); */
+        flag = NCD4_curlflagbyname(flagname);
+        if(flag == NULL) {ret = NC_ECURL; goto done;}
+        ret = set_curlopt(state,flag->flag,cvt(triple->value,flag->type));
+    }
+ done:
+    return THROW(ret);
+}
+
+static void*
+cvt(char* value, enum CURLFLAGTYPE type)
+{
+    switch (type) {
+    case CF_LONG: {
+	/* Try to convert to long value */
+	const char* p = value;
+	char* q = NULL;
+	long longvalue = strtol(p,&q,10);
+	if(*q != '\0')
+	    return NULL;
+	return (void*)longvalue;
+	}
+    case CF_STRING:
+	return (void*)value;
+    case CF_UNKNOWN: case CF_OTHER:
+	return (void*)value;
+    }
+    return NULL;
+}
+
+void
+NCD4_curl_debug(NCD4INFO* state)
+{
+    state->curl->curlflags.verbose = 1;
+    set_curlflag(state,CURLOPT_VERBOSE);
+    set_curlflag(state,CURLOPT_ERRORBUFFER);
+}
+
+/* Misc. */
+
+/* Determine if this version of curl supports
+       "file://..." &/or "https://..." urls.
+*/
+void
+NCD4_curl_protocols(NCD4globalstate* state)
+{
+    const char* const* proto; /*weird*/
+    curl_version_info_data* curldata;
+    curldata = curl_version_info(CURLVERSION_NOW);
+    for(proto=curldata->protocols;*proto;proto++) {
+        if(strcmp("file",*proto)==0) {state->curl.proto_file=1;}
+        if(strcmp("http",*proto)==0) {state->curl.proto_https=1;}
+    }
+#ifdef D4DEBUG	
+    nclog(NCLOGNOTE,"Curl file:// support = %d",state->curl.proto_file);
+    nclog(NCLOGNOTE,"Curl https:// support = %d",state->curl.proto_https);
+#endif
+}
+
+
+/*
+"Inverse" of set_curlflag;
+Given a flag and value, it updates state.
+Update a specific flag from state->curlflags.
+*/
+int
+NCD4_set_curlstate(NCD4INFO* state, int flag, void* value)
+{
+    int ret = NC_NOERR;
+    switch (flag) {
+    case CURLOPT_USERPWD:
+        if(state->curl->creds.userpwd != NULL) free(state->curl->creds.userpwd);
+	state->curl->creds.userpwd = strdup((char*)value);
+	break;
+    case CURLOPT_COOKIEJAR: case CURLOPT_COOKIEFILE:
+        if(state->curl->curlflags.cookiejar != NULL) free(state->curl->curlflags.cookiejar);
+	state->curl->curlflags.cookiejar = strdup((char*)value);
+	break;
+    case CURLOPT_NETRC: case CURLOPT_NETRC_FILE:
+        if(state->curl->curlflags.netrc != NULL) free(state->curl->curlflags.netrc);
+	state->curl->curlflags.netrc = strdup((char*)value);
+	break;
+    case CURLOPT_VERBOSE:
+	state->curl->curlflags.verbose = (long)value;
+	break;
+    case CURLOPT_TIMEOUT:
+	state->curl->curlflags.timeout = (long)value;
+	break;
+    case CURLOPT_USERAGENT:
+        if(state->curl->curlflags.useragent != NULL) free(state->curl->curlflags.useragent);
+        state->curl->curlflags.useragent = strdup((char*)value);
+	break;
+    case CURLOPT_FOLLOWLOCATION:
+	/* no need to store; will always be set */
+	break;
+    case CURLOPT_MAXREDIRS:
+	/* no need to store; will always be set */
+	break;
+    case CURLOPT_ERRORBUFFER:
+	/* no need to store; will always be set */
+	break;
+    case CURLOPT_ENCODING:
+	/* no need to store; will always be set to fixed value */
+	break;
+    case CURLOPT_PROXY:
+	/* We assume that the value is the proxy url */
+	if(state->curl->proxy.host != NULL) free(state->curl->proxy.host);
+	if(state->curl->proxy.userpwd != NULL) free(state->curl->proxy.userpwd);
+	state->curl->proxy.host = NULL;
+	state->curl->proxy.userpwd = NULL;
+	if(!NCD4_parseproxy(state,(char*)value))
+		{ret = NC_EINVAL; goto done;}
+	break;
+    case CURLOPT_SSLCERT:
+	if(state->curl->ssl.certificate != NULL) free(state->curl->ssl.certificate);
+	state->curl->ssl.certificate = strdup((char*)value);
+	break;
+    case CURLOPT_SSLKEY:
+	if(state->curl->ssl.key != NULL) free(state->curl->ssl.key);
+	state->curl->ssl.key = strdup((char*)value);
+	break;
+    case CURLOPT_KEYPASSWD:
+	if(state->curl->ssl.keypasswd!= NULL) free(state->curl->ssl.keypasswd);
+	state->curl->ssl.keypasswd = strdup((char*)value);
+	break;
+    case CURLOPT_SSL_VERIFYPEER:
+      state->curl->ssl.verifypeer = (long)value;
+      break;
+    case CURLOPT_SSL_VERIFYHOST:
+      state->curl->ssl.verifyhost = (long)value;
+      break;
+    case CURLOPT_CAINFO:
+      if(state->curl->ssl.cainfo != NULL) free(state->curl->ssl.cainfo);
+      state->curl->ssl.cainfo = strdup((char*)value);
+      break;
+    case CURLOPT_CAPATH:
+	if(state->curl->ssl.capath != NULL) free(state->curl->ssl.capath);
+	state->curl->ssl.capath = strdup((char*)value);
+	break;
+
+    default: break;
+    }
+done:
+    return THROW(ret);
+}
+
+void
+NCD4_curl_printerror(NCD4INFO* state)
+{
+    fprintf(stderr,"curl error details: %s\n",state->curl->errdata.errorbuf);
+}
+
+CURLcode
+NCD4_reportcurlerror(CURLcode cstat)
+{
+    if(cstat != CURLE_OK) {
+        fprintf(stderr,"CURL Error: %s\n",curl_easy_strerror(cstat));
+    }
+    fflush(stderr);
+    return cstat;
+}
diff --git a/libdap4/d4curlfunctions.h b/libdap4/d4curlfunctions.h
new file mode 100644
index 0000000..0bfa739
--- /dev/null
+++ b/libdap4/d4curlfunctions.h
@@ -0,0 +1,30 @@
+/*********************************************************************
+  *   Copyright 2016, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+
+#ifndef D4CURLFUNCTIONS_H
+#define D4CURLFUNCTIONS_H
+
+enum CURLFLAGTYPE {CF_UNKNOWN=0,CF_OTHER=1,CF_STRING=2,CF_LONG=3};
+struct CURLFLAG {
+    const char* name;
+    int flag;
+    int value;
+    enum CURLFLAGTYPE type;
+};
+
+extern ncerror NCD4_set_curlopt(NCD4INFO* state, int flag, void* value);
+
+extern ncerror NCD4_set_flags_perfetch(NCD4INFO*);
+extern ncerror NCD4_set_flags_perlink(NCD4INFO*);
+
+extern ncerror NCD4_set_curlflag(NCD4INFO*,int);
+extern ncerror NCD4_set_curlstate(NCD4INFO* state, int flag, void* value);
+
+extern void NCD4_curl_debug(NCD4INFO* state);
+
+extern struct CURLFLAG* NCD4_curlflagbyname(const char* name);
+extern void NCD4_curl_protocols(NCD4globalstate* state);
+
+#endif /*D4CURLFUNCTIONS_H*/
diff --git a/libdap4/d4cvt.c b/libdap4/d4cvt.c
new file mode 100644
index 0000000..2b68611
--- /dev/null
+++ b/libdap4/d4cvt.c
@@ -0,0 +1,224 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+#include "config.h"
+#include <assert.h>
+#include "netcdf.h"
+
+#ifdef _MSC_VER
+#include <crtdbg.h>
+#endif
+
+/*
+Code taken directly from libdap4/dapcvt.c
+*/
+
+/* Forward */
+static size_t nctypesizeof(nc_type nctype);
+
+
+int
+NCD4_convert(nc_type srctype, nc_type dsttype, char* memory0, char* value0, size_t count)
+{
+    int ncstat = NC_NOERR;
+    size_t i;
+    char* memory = memory0;
+    char* value = value0;
+
+    /* In order to deal with the DAP upgrade problem,
+	try to preserve the bit patterns
+    */
+
+    /* Provide space and pointer casts for intermediate results */
+    signed char ncbyte;
+    signed char* ncbytep;
+    char ncchar;
+    char* nccharp;
+    short ncshort;
+    short* ncshortp;
+    int ncint;
+    int* ncintp;
+    float ncfloat;
+    float* ncfloatp;
+    double ncdouble;
+    double* ncdoublep;
+    unsigned char ncubyte;
+    unsigned char* ncubytep;
+    unsigned short ncushort;
+    unsigned short* ncushortp;
+    unsigned int ncuint;
+    unsigned int* ncuintp;
+    long long ncint64;
+    long long* ncint64p;
+    unsigned long long ncuint64;
+    unsigned long long* ncuint64p;
+
+
+#define CASE(nc1,nc2) (nc1*256+nc2)
+#define CUT8(e) ((unsigned char)((e) & 0xff))
+#define CUT16(e) ((unsigned short)((e) & 0xffff))
+#define CUT32(e) ((unsigned int)((e) & 0xffffffff))
+#define ARM(vs,ncs,ts,vd,ncd,td) \
+case CASE(ncs,ncd):\
+    vs##p = (ts *)value;\
+    vs = *vs##p;\
+    vd##p = (td *)memory;\
+    *vd##p = (td)vs;\
+    break;
+
+    for(i=0;i<count;i++) {
+
+        switch (CASE(srctype,dsttype)) {
+ARM(ncchar,NC_CHAR,char,ncchar,NC_CHAR,char)
+ARM(ncchar,NC_CHAR,char,ncbyte,NC_BYTE,signed char)
+ARM(ncchar,NC_CHAR,char,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncchar,NC_CHAR,char,ncshort,NC_SHORT,short)
+ARM(ncchar,NC_CHAR,char,ncushort,NC_USHORT,unsigned short)
+ARM(ncchar,NC_CHAR,char,ncint,NC_INT,int)
+ARM(ncchar,NC_CHAR,char,ncuint,NC_UINT,unsigned int)
+ARM(ncchar,NC_CHAR,char,ncint64,NC_INT64,long long)
+ARM(ncchar,NC_CHAR,char,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncchar,NC_CHAR,char,ncfloat,NC_FLOAT,float)
+ARM(ncchar,NC_CHAR,char,ncdouble,NC_DOUBLE,double)
+ARM(ncbyte,NC_BYTE,signed char,ncchar,NC_CHAR,char)
+ARM(ncbyte,NC_BYTE,signed char,ncbyte,NC_BYTE,signed char)
+ARM(ncbyte,NC_BYTE,signed char,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncbyte,NC_BYTE,signed char,ncshort,NC_SHORT,short)
+ARM(ncbyte,NC_BYTE,signed char,ncushort,NC_USHORT,unsigned short)
+ARM(ncbyte,NC_BYTE,signed char,ncint,NC_INT,int)
+ARM(ncbyte,NC_BYTE,signed char,ncuint,NC_UINT,unsigned int)
+ARM(ncbyte,NC_BYTE,signed char,ncint64,NC_INT64,long long)
+ARM(ncbyte,NC_BYTE,signed char,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncbyte,NC_BYTE,signed char,ncfloat,NC_FLOAT,float)
+ARM(ncbyte,NC_BYTE,signed char,ncdouble,NC_DOUBLE,double)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncchar,NC_CHAR,char)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncbyte,NC_BYTE,signed char)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncshort,NC_SHORT,short)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncushort,NC_USHORT,unsigned short)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncint,NC_INT,int)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncuint,NC_UINT,unsigned int)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncint64,NC_INT64,long long)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncfloat,NC_FLOAT,float)
+ARM(ncubyte,NC_UBYTE,unsigned char,ncdouble,NC_DOUBLE,double)
+ARM(ncshort,NC_SHORT,short,ncchar,NC_CHAR,char)
+ARM(ncshort,NC_SHORT,short,ncbyte,NC_BYTE,signed char)
+ARM(ncshort,NC_SHORT,short,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncshort,NC_SHORT,short,ncshort,NC_SHORT,short)
+ARM(ncshort,NC_SHORT,short,ncushort,NC_USHORT,unsigned short)
+ARM(ncshort,NC_SHORT,short,ncint,NC_INT,int)
+ARM(ncshort,NC_SHORT,short,ncuint,NC_UINT,unsigned int)
+ARM(ncshort,NC_SHORT,short,ncint64,NC_INT64,long long)
+ARM(ncshort,NC_SHORT,short,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncshort,NC_SHORT,short,ncfloat,NC_FLOAT,float)
+ARM(ncshort,NC_SHORT,short,ncdouble,NC_DOUBLE,double)
+ARM(ncushort,NC_USHORT,unsigned short,ncchar,NC_CHAR,char)
+ARM(ncushort,NC_USHORT,unsigned short,ncbyte,NC_BYTE,signed char)
+ARM(ncushort,NC_USHORT,unsigned short,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncushort,NC_USHORT,unsigned short,ncshort,NC_SHORT,short)
+ARM(ncushort,NC_USHORT,unsigned short,ncushort,NC_USHORT,unsigned short)
+ARM(ncushort,NC_USHORT,unsigned short,ncint,NC_INT,int)
+ARM(ncushort,NC_USHORT,unsigned short,ncuint,NC_UINT,unsigned int)
+ARM(ncushort,NC_USHORT,unsigned short,ncint64,NC_INT64,long long)
+ARM(ncushort,NC_USHORT,unsigned short,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncushort,NC_USHORT,unsigned short,ncfloat,NC_FLOAT,float)
+ARM(ncushort,NC_USHORT,unsigned short,ncdouble,NC_DOUBLE,double)
+ARM(ncint,NC_INT,int,ncchar,NC_CHAR,char)
+ARM(ncint,NC_INT,int,ncbyte,NC_BYTE,signed char)
+ARM(ncint,NC_INT,int,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncint,NC_INT,int,ncshort,NC_SHORT,short)
+ARM(ncint,NC_INT,int,ncushort,NC_USHORT,unsigned short)
+ARM(ncint,NC_INT,int,ncint,NC_INT,int)
+ARM(ncint,NC_INT,int,ncuint,NC_UINT,unsigned int)
+ARM(ncint,NC_INT,int,ncint64,NC_INT64,long long)
+ARM(ncint,NC_INT,int,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncint,NC_INT,int,ncfloat,NC_FLOAT,float)
+ARM(ncint,NC_INT,int,ncdouble,NC_DOUBLE,double)
+ARM(ncuint,NC_UINT,unsigned int,ncchar,NC_CHAR,char)
+ARM(ncuint,NC_UINT,unsigned int,ncbyte,NC_BYTE,signed char)
+ARM(ncuint,NC_UINT,unsigned int,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncuint,NC_UINT,unsigned int,ncshort,NC_SHORT,short)
+ARM(ncuint,NC_UINT,unsigned int,ncushort,NC_USHORT,unsigned short)
+ARM(ncuint,NC_UINT,unsigned int,ncint,NC_INT,int)
+ARM(ncuint,NC_UINT,unsigned int,ncuint,NC_UINT,unsigned int)
+ARM(ncuint,NC_UINT,unsigned int,ncint64,NC_INT64,long long)
+ARM(ncuint,NC_UINT,unsigned int,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncuint,NC_UINT,unsigned int,ncfloat,NC_FLOAT,float)
+ARM(ncuint,NC_UINT,unsigned int,ncdouble,NC_DOUBLE,double)
+ARM(ncint64,NC_INT64,long long,ncchar,NC_CHAR,char)
+ARM(ncint64,NC_INT64,long long,ncbyte,NC_BYTE,signed char)
+ARM(ncint64,NC_INT64,long long,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncint64,NC_INT64,long long,ncshort,NC_SHORT,short)
+ARM(ncint64,NC_INT64,long long,ncushort,NC_USHORT,unsigned short)
+ARM(ncint64,NC_INT64,long long,ncint,NC_INT,int)
+ARM(ncint64,NC_INT64,long long,ncuint,NC_UINT,unsigned int)
+ARM(ncint64,NC_INT64,long long,ncint64,NC_INT64,long long)
+ARM(ncint64,NC_INT64,long long,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncint64,NC_INT64,long long,ncfloat,NC_FLOAT,float)
+ARM(ncint64,NC_INT64,long long,ncdouble,NC_DOUBLE,double)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncchar,NC_CHAR,char)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncbyte,NC_BYTE,signed char)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncshort,NC_SHORT,short)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncushort,NC_USHORT,unsigned short)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncint,NC_INT,int)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncuint,NC_UINT,unsigned int)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncint64,NC_INT64,long long)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncfloat,NC_FLOAT,float)
+ARM(ncuint64,NC_UINT64,unsigned long long,ncdouble,NC_DOUBLE,double)
+ARM(ncfloat,NC_FLOAT,float,ncchar,NC_CHAR,char)
+ARM(ncfloat,NC_FLOAT,float,ncbyte,NC_BYTE,signed char)
+ARM(ncfloat,NC_FLOAT,float,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncfloat,NC_FLOAT,float,ncshort,NC_SHORT,short)
+ARM(ncfloat,NC_FLOAT,float,ncushort,NC_USHORT,unsigned short)
+ARM(ncfloat,NC_FLOAT,float,ncint,NC_INT,int)
+ARM(ncfloat,NC_FLOAT,float,ncuint,NC_UINT,unsigned int)
+ARM(ncfloat,NC_FLOAT,float,ncint64,NC_INT64,long long)
+ARM(ncfloat,NC_FLOAT,float,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncfloat,NC_FLOAT,float,ncfloat,NC_FLOAT,float)
+ARM(ncfloat,NC_FLOAT,float,ncdouble,NC_DOUBLE,double)
+ARM(ncdouble,NC_DOUBLE,double,ncchar,NC_CHAR,char)
+ARM(ncdouble,NC_DOUBLE,double,ncbyte,NC_BYTE,signed char)
+ARM(ncdouble,NC_DOUBLE,double,ncubyte,NC_UBYTE,unsigned char)
+ARM(ncdouble,NC_DOUBLE,double,ncshort,NC_SHORT,short)
+ARM(ncdouble,NC_DOUBLE,double,ncushort,NC_USHORT,unsigned short)
+ARM(ncdouble,NC_DOUBLE,double,ncint,NC_INT,int)
+ARM(ncdouble,NC_DOUBLE,double,ncuint,NC_UINT,unsigned int)
+ARM(ncdouble,NC_DOUBLE,double,ncint64,NC_INT64,long long)
+ARM(ncdouble,NC_DOUBLE,double,ncuint64,NC_UINT64,unsigned long long)
+ARM(ncdouble,NC_DOUBLE,double,ncfloat,NC_FLOAT,float)
+ARM(ncdouble,NC_DOUBLE,double,ncdouble,NC_DOUBLE,double)
+	
+        default: ncstat = NC_EINVAL; goto fail;
+        }
+        value += nctypesizeof(srctype);
+        memory += nctypesizeof(dsttype);
+    }
+
+fail:
+    return (ncstat);
+}
+
+static size_t
+nctypesizeof(nc_type nctype)
+{
+    switch (nctype) {
+    case NC_CHAR:	return sizeof(char);
+    case NC_BYTE:	return sizeof(signed char);
+    case NC_UBYTE:	return sizeof(unsigned char);
+    case NC_SHORT:	return sizeof(short);
+    case NC_USHORT:	return sizeof(unsigned short);
+    case NC_INT:	return sizeof(int);
+    case NC_UINT:	return sizeof(unsigned int);
+    case NC_INT64:	return sizeof(long long);
+    case NC_UINT64:	return sizeof(unsigned long long);
+    case NC_FLOAT:	return sizeof(float);
+    case NC_DOUBLE:	return sizeof(double);
+    case NC_STRING:	return sizeof(char*);
+    default: assert(0);
+    }
+    return 0;
+}
diff --git a/libdap4/d4data.c b/libdap4/d4data.c
new file mode 100644
index 0000000..fa39d60
--- /dev/null
+++ b/libdap4/d4data.c
@@ -0,0 +1,361 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include <stdarg.h>
+#include <assert.h>
+#include "ezxml.h"
+#include "d4includes.h"
+#include "d4odom.h"
+
+/**
+This code serves two purposes
+1. Preprocess the dap4 serialization wrt endianness, etc.
+   (NCD4_processdata)
+2. Walk a specified variable instance to convert to netcdf4
+   memory representation.
+   (NCD4_fillinstance)
+
+*/
+
+/***************************************************/
+/* Forwards */
+static int fillstring(NCD4meta*, void** offsetp, void** dstp, NClist* blobs);
+static int fillopfixed(NCD4meta*, d4size_t opaquesize, void** offsetp, void** dstp);
+static int fillopvar(NCD4meta*, NCD4node* type, void** offsetp, void** dstp, NClist* blobs);
+static int fillstruct(NCD4meta*, NCD4node* type, void** offsetp, void** dstp, NClist* blobs);
+static int fillseq(NCD4meta*, NCD4node* type, void** offsetp, void** dstp, NClist* blobs);
+
+/***************************************************/
+/* Macro define procedures */
+
+#ifdef D4DUMPCSUM
+static unsigned int debugcrc32(unsigned int crc, const void *buf, size_t size)
+{
+    int i;
+    fprintf(stderr,"crc32: ");
+    for(i=0;i<size;i++) {fprintf(stderr,"%02x",((unsigned char*)buf)[i]);}
+    fprintf(stderr,"\n");
+    return NCD4_crc32(crc,buf,size);
+}
+#define CRC32 debugcrc32
+#else
+#define CRC32 NCD4_crc32
+#endif
+
+#define ISTOPLEVEL(var) ((var)->container == NULL || (var)->container->sort == NCD4_GROUP)
+
+/***************************************************/
+/* API */
+
+int
+NCD4_processdata(NCD4meta* meta)
+{
+    int ret = NC_NOERR;
+    int i;
+    NClist* toplevel;
+    NCD4node* root = meta->root;
+    void* offset;
+
+    /* Recursively walk the tree in prefix order 
+       to get the top-level variables; also mark as unvisited */
+    toplevel = nclistnew();
+    NCD4_getToplevelVars(meta,root,toplevel);
+
+    /* If necessary, byte swap the serialized data */
+    /* Do we need to swap the dap4 data? */
+    meta->swap = (meta->serial.hostlittleendian != meta->serial.remotelittleendian);
+
+    /* Compute the  offset and size of the toplevel vars in the raw dap data. */
+    offset = meta->serial.dap;
+    for(i=0;i<nclistlength(toplevel);i++) {
+	NCD4node* var = (NCD4node*)nclistget(toplevel,i);
+        if((ret=NCD4_delimit(meta,var,&offset)))
+	    FAIL(ret,"delimit failure");
+    }
+
+    /* Swap the data for each top level variable,
+	including the checksum (if any)
+    */
+    if(meta->swap) {
+        if((ret=NCD4_swapdata(meta,toplevel)))
+	    FAIL(ret,"byte swapping failed");
+    }
+
+    /* Compute the checksums of the top variables */
+    if(meta->localchecksumming) {
+	for(i=0;i<nclistlength(toplevel);i++) {
+	    unsigned int csum = 0;
+	    NCD4node* var = (NCD4node*)nclistget(toplevel,i);
+            csum = CRC32(csum,var->data.dap4data.memory,var->data.dap4data.size);
+            var->data.localchecksum = csum;
+	}
+    }
+
+    /* verify checksums */
+    if(!meta->ignorechecksums && meta->serial.remotechecksumming) {
+        for(i=0;i<nclistlength(toplevel);i++) {
+	    NCD4node* var = (NCD4node*)nclistget(toplevel,i);
+	    if(var->data.localchecksum != var->data.remotechecksum) {
+		fprintf(stderr,"Checksum mismatch: %s\n",var->name);
+		fflush(stderr);
+		ret = NC_EDAP;
+		goto done;
+	    }
+        }
+    }
+done:
+    return THROW(ret);
+}
+
+/*
+Build a single instance of a type. The blobs
+argument accumulates any malloc'd data so we can
+reclaim it in case of an error.
+
+Activity is to walk the variable's data to
+produce a copy that is compatible with the
+netcdf4 memory format.
+
+Assumes that NCD4_processdata has been called.
+*/
+
+int
+NCD4_fillinstance(NCD4meta* meta, NCD4node* type, void** offsetp, void** dstp, NClist* blobs)
+{
+    int ret = NC_NOERR;
+    void* offset = *offsetp;
+    void* dst = *dstp;
+    d4size_t memsize = type->meta.memsize;
+    d4size_t dapsize = type->meta.dapsize;
+
+    /* If the type is fixed size, then just copy it  */
+    if(type->subsort <= NC_UINT64 || type->subsort == NC_ENUM) {
+	/* memsize and dapsize are the same */
+	assert(memsize == dapsize);
+	memcpy(dst,offset,dapsize);
+	offset = INCR(offset,dapsize);
+    } else switch(type->subsort) {
+        case NC_STRING: /* oob strings */
+	    if((ret=fillstring(meta,&offset,&dst,blobs)))
+	        FAIL(ret,"fillinstance");
+	    break;
+	case NC_OPAQUE:
+	    if(type->opaque.size > 0) {
+	        /* We know the size and its the same for all instances */
+	        if((ret=fillopfixed(meta,type->opaque.size,&offset,&dst)))
+	            FAIL(ret,"fillinstance");
+   	    } else {
+	        /* Size differs per instance, so we need to convert each opaque to a vlen */
+	        if((ret=fillopvar(meta,type,&offset,&dst,blobs)))
+	            FAIL(ret,"fillinstance");
+	    }
+	    break;
+	case NC_STRUCT:
+	    if((ret=fillstruct(meta,type,&offset,&dst,blobs)))
+                FAIL(ret,"fillinstance");
+	    break;
+	case NC_SEQ:
+	    if((ret=fillseq(meta,type,&offset,&dst,blobs)))
+                FAIL(ret,"fillinstance");
+	    break;
+	default:
+	    ret = NC_EINVAL;
+            FAIL(ret,"fillinstance");
+    }
+    *dstp = dst;
+    *offsetp = offset; /* return just past this object in dap data */
+done:
+    return THROW(ret);
+}
+
+static int
+fillstruct(NCD4meta* meta, NCD4node* type, void** offsetp, void** dstp, NClist* blobs)
+{
+    int i,ret = NC_NOERR;
+    void* offset = *offsetp;
+    void* dst = *dstp;
+ 
+#ifdef CLEARSTRUCT
+    /* Avoid random data within aligned structs */
+    d4size_t prevoffset = 0;    
+    memset(dst,0,type->meta.memsize);
+#endif
+
+    /* Walk and read each field taking alignments into account */
+    for(i=0;i<nclistlength(type->vars);i++) {
+	NCD4node* field = nclistget(type->vars,i);
+	NCD4node* ftype = field->basetype;
+	void* fdst = INCR(dst,field->meta.offset);
+	if((ret=NCD4_fillinstance(meta,ftype,&offset,&fdst,blobs)))
+            FAIL(ret,"fillstruct");
+    }
+    dst = INCR(dst,type->meta.memsize);
+    *dstp = dst;
+    *offsetp = offset;    
+done:
+    return THROW(ret);
+}
+
+static int
+fillseq(NCD4meta* meta, NCD4node* type, void** offsetp, void** dstp, NClist* blobs)
+{
+    int ret = NC_NOERR;
+    d4size_t i,recordcount;    
+    void* offset;
+    nc_vlen_t* dst;
+    NCD4node* vlentype;
+    d4size_t recordsize;
+
+    offset = *offsetp;
+
+    dst = (nc_vlen_t*)*dstp;
+    vlentype = type->basetype;    
+    recordsize = vlentype->meta.memsize;
+
+    /* Get record count (remember, it is already properly swapped) */
+    recordcount = GETCOUNTER(offset);
+    SKIPCOUNTER(offset);
+    dst->len = (size_t)recordcount;
+
+    /* compute the required memory */
+    dst->p = d4alloc(recordsize*recordcount);
+    if(dst->p == NULL) 
+	FAIL(NC_ENOMEM,"fillseq");
+
+    for(i=0;i<recordcount;i++) {
+	/* Read each record instance */
+	void* recdst = INCR((dst->p),(recordsize * i));
+	if((ret=NCD4_fillinstance(meta,vlentype,&offset,&recdst,blobs)))
+	    FAIL(ret,"fillseq");
+    }
+    dst++;
+    *dstp = dst;
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+/*
+Extract and oob a single string instance
+*/
+static int
+fillstring(NCD4meta* meta, void** offsetp, void** dstp, NClist* blobs)
+{
+    int ret = NC_NOERR;
+    d4size_t count;    
+    void* offset = *offsetp;
+    char** dst = *dstp;
+    char* q;
+
+    /* Get string count (remember, it is already properly swapped) */
+    count = GETCOUNTER(offset);
+    SKIPCOUNTER(offset);
+    /* Transfer out of band */
+    q = (char*)d4alloc(count+1);
+    if(q == NULL)
+	{FAIL(NC_ENOMEM,"out of space");}
+    nclistpush(blobs,q);
+    memcpy(q,offset,count);
+    q[count] = '\0';
+    /* Write the pointer to the string */
+    *dst = q;
+    dst++;
+    *dstp = dst;    
+    offset = INCR(offset,count);
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+fillopfixed(NCD4meta* meta, d4size_t opaquesize, void** offsetp, void** dstp)
+{
+    int ret = NC_NOERR;
+    d4size_t count;
+    void* offset = *offsetp;
+    void* dst = *dstp;
+
+    /* Get opaque count */
+    count = GETCOUNTER(offset);
+    SKIPCOUNTER(offset);
+    /* verify that it is the correct size */
+    if(count != opaquesize)
+        FAIL(NC_EVARSIZE,"Expected opaque size to be %lld; found %lld",opaquesize,count);
+    /* move */
+    memcpy(dst,offset,count);
+    dst = INCR(dst,count);
+    *dstp = dst;
+    offset = INCR(offset,count);
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+/*
+Move a dap4 variable length opaque out of band.
+We treat as if it was (in cdl) ubyte(*).
+*/
+
+static int
+fillopvar(NCD4meta* meta, NCD4node* type, void** offsetp, void** dstp, NClist* blobs)
+{
+    int ret = NC_NOERR;
+    d4size_t count;
+    nc_vlen_t* vlen;
+    void* offset = *offsetp;
+    void* dst = *dstp;
+    char* q;
+
+    /* alias dst format */
+    vlen = (nc_vlen_t*)dst;
+
+    /* Get opaque count */
+    count = GETCOUNTER(offset);
+    SKIPCOUNTER(offset);
+    /* Transfer out of band */
+    q = (char*)d4alloc(count);
+    if(q == NULL) FAIL(NC_ENOMEM,"out of space");
+    nclistpush(blobs,q);
+    memcpy(q,offset,count);
+    vlen->p = q;
+    vlen->len = (size_t)count;
+    dst = INCR(dst,sizeof(nc_vlen_t));
+    *dstp = dst;
+    offset = INCR(offset,count);
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+
+/**************************************************/
+/* Utilities */
+int
+NCD4_getToplevelVars(NCD4meta* meta, NCD4node* group, NClist* toplevel)
+{
+    int ret = NC_NOERR;
+    int i;
+
+    if(group == NULL)
+	group = meta->root;
+
+    /* Collect vars in this group */
+    for(i=0;i<nclistlength(group->vars);i++) {
+        NCD4node* node = (NCD4node*)nclistget(group->vars,i);
+        nclistpush(toplevel,node);
+        node->visited = 0; /* We will set later to indicate written vars */
+#ifdef D4DEBUGDATA
+fprintf(stderr,"toplevel: var=%s\n",node->name);
+#endif
+    }
+    /* Now, recurse into subgroups; will produce prefix order */
+    for(i=0;i<nclistlength(group->groups);i++) {
+        NCD4node* g = (NCD4node*)nclistget(group->groups,i);
+	if((ret=NCD4_getToplevelVars(meta,g,toplevel))) goto done;
+    }
+done:
+    return THROW(ret);
+}
diff --git a/libdap4/d4debug.c b/libdap4/d4debug.c
new file mode 100644
index 0000000..282575a
--- /dev/null
+++ b/libdap4/d4debug.c
@@ -0,0 +1,155 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+#include "config.h"
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "d4includes.h"
+#include "ncdispatch.h"
+
+int ncdap4debug = 0;
+
+#ifdef D4CATCH
+/* Place breakpoint here to catch errors close to where they occur*/
+int
+d4breakpoint(int err) {return err;}
+
+int
+d4throw(int err)
+{
+    if(err == 0) return err;
+    return d4breakpoint(err);
+}
+#endif
+
+int
+d4panic(const char* fmt, ...)
+{
+    va_list args;
+    if(fmt != NULL) {
+      va_start(args, fmt);
+      vfprintf(stderr, fmt, args);
+      fprintf(stderr, "\n" );
+      va_end( args );
+    } else {
+      fprintf(stderr, "panic" );
+    }
+    fprintf(stderr, "\n" );
+    fflush(stderr);
+    return 0;
+}
+
+const char*
+NCD4_sortname(NCD4sort sort)
+{
+    switch (sort) {
+    case NCD4_NULL: return "NCD4_NULL";
+    case NCD4_ATTR: return "NCD4_ATTR";
+    case NCD4_ATTRSET: return "NCD4_ATTRSET";
+    case NCD4_XML: return "NCD4_XML";
+    case NCD4_DIM: return "NCD4_DIM";
+    case NCD4_GROUP: return "NCD4_GROUP";
+    case NCD4_TYPE: return "NCD4_TYPE";
+    case NCD4_VAR: return "NCD4_VAR";
+    case NCD4_ECONST: return "NCD4_ECONST";
+    default: break;
+    }
+    return "unknown";
+}
+
+const char*
+NCD4_subsortname(nc_type subsort)
+{
+    switch (subsort) {
+    case NC_NAT: return "NC_NAT";
+    case NC_BYTE: return "NC_BYTE";
+    case NC_CHAR: return "NC_CHAR";
+    case NC_SHORT: return "NC_SHORT";
+    case NC_INT: return "NC_INT";
+    case NC_FLOAT: return "NC_FLOAT";
+    case NC_DOUBLE: return "NC_DOUBLE";
+    case NC_UBYTE: return "NC_UBYTE";
+    case NC_USHORT: return "NC_USHORT";
+    case NC_UINT: return "NC_UINT";
+    case NC_INT64: return "NC_INT64";
+    case NC_UINT64: return "NC_UINT64";
+    case NC_STRING: return "NC_STRING";
+    case NC_VLEN: return "NC_VLEN";
+    case NC_OPAQUE: return "NC_OPAQUE";
+    case NC_ENUM: return "NC_ENUM";
+    case NC_COMPOUND: return "NC_COMPOUND";
+    default: break;
+    }
+    return "unknown";
+}
+
+/*
+For debugging purposes, it is desirable to fake an nccopy
+bv inserting the data into the substrate and then writing it out.
+*/
+
+int
+NCD4_debugcopy(NCD4INFO* info)
+{
+    int i,ret=NC_NOERR;
+    NCD4meta* meta = info->substrate.metadata;
+    NClist* topvars = nclistnew();
+    NC* ncp = info->controller;
+
+    /* Walk each top level variable, read all of it and write it to the substrate */
+    if((ret=NCD4_getToplevelVars(meta, NULL, topvars)))
+	goto done;
+    /* Read from the dap data by going thru the dap4 interface */
+    for(i=0;i<nclistlength(topvars);i++) {
+	NCD4node* var = nclistget(topvars,i);
+	NCD4node* type = var->basetype;
+	NCD4node* grp = NCD4_groupFor(var);
+	int grpid = grp->meta.id;
+	int varid = var->meta.id;
+	d4size_t varsize;
+	void* memory = NULL;
+
+	varsize = type->meta.memsize * NCD4_dimproduct(var);
+	memory = d4alloc(varsize);
+        if(memory == NULL)
+	    {ret = NC_ENOMEM; goto done;}		
+	{
+	    /* We need to read via NCD4 */
+	    int d4gid = makedap4id(ncp,grpid);
+            if((ret=nc_get_var(d4gid,varid,memory)))
+	        goto done;
+ 	}
+	/* Now, turn around and write it to the substrate.
+	  WARNING: we have to specify the shape ourselves
+          because, if unlimited is involved then there is
+          potentially a difference between the substrate unlimited
+          size and the dap4 data specified size. In fact,
+          the substrate will always be zero unless debugcopy is used.
+	*/
+	{	
+	    size_t edges[NC_MAX_VAR_DIMS];
+	    int d;
+	    for(d=0;d<nclistlength(var->dims);d++) {
+		NCD4node* dim = (NCD4node*)nclistget(var->dims,d);
+		edges[d] = (size_t)dim->dim.size;
+	    }
+            if((ret=nc_put_vara(grpid,varid,nc_sizevector0,edges,memory)))
+	        goto done;
+	}
+    }	    
+done:
+    if(ret != NC_NOERR) {
+        fprintf(stderr,"debugcopy: %d %s\n",ret,nc_strerror(ret));
+    }
+    return THROW(ret);
+}
+
+/* Provide a string printer that can be called from gdb */
+void
+NCD4_printstring(const char* s)
+{
+    fprintf(stderr,"%s\n",s);
+    fflush(stderr);
+}
diff --git a/libdap4/d4debug.h b/libdap4/d4debug.h
new file mode 100644
index 0000000..4d4ff68
--- /dev/null
+++ b/libdap4/d4debug.h
@@ -0,0 +1,70 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+#ifndef D4DEBUG_H
+#define D4DEBUG_H
+
+#include <assert.h>
+#include <stdarg.h>
+
+#undef D4DEBUG /* general debug */
+#undef D4DEBUGPARSER
+#undef D4DEBUGMETA
+#undef D4DUMPDAP
+#undef D4DUMPRAW
+#undef D4DEBUGDATA
+#undef D4DUMPDMR
+#undef D4DUMPCSUM
+
+#ifdef D4DEBUG
+#define D4DEBUGPARSER
+#define D4DEBUGMETA
+#define D4DEBUGDATA
+#define D4DUMPCSUM
+#define D4DUMPDMR
+#define D4DUMPDAP
+#endif
+
+
+#define D4CATCH /* Warning: significant performance impact */
+
+#define PANIC(msg) assert(d4panic(msg));
+#define PANIC1(msg,arg) assert(d4panic(msg,arg));
+#define PANIC2(msg,arg1,arg2) assert(d4panic(msg,arg1,arg2));
+
+#define ASSERT(expr) if(!(expr)) {PANIC(#expr);} else {}
+
+extern int ncd4debug;
+
+extern int d4panic(const char* fmt, ...);
+
+#define MEMCHECK(var) {if((var)==NULL) return (NC_ENOMEM);}
+
+#ifdef D4CATCH
+/* Place breakpoint on dapbreakpoint to catch errors close to where they occur*/
+#define THROW(e) d4throw(e)
+#define THROWCHK(e) (void)d4throw(e)
+extern int d4breakpoint(int err);
+extern int d4throw(int err);
+#else
+#define THROW(e) (e)
+#define THROWCHK(e)
+#endif
+
+#ifdef D4DEBUG
+#define SHOWFETCH (1)
+#else
+#define SHOWFETCH FLAGSET(nccomm->controls,NCF_SHOWFETCH)
+#endif
+
+#define LOG0(level,msg) nclog(level,msg)
+#define LOG1(level,msg,a1) nclog(level,msg,a1)
+#define LOG2(level,msg,a1,a2) nclog(level,msg,a1,a2)
+
+extern const char* NCD4_sortname(NCD4sort sort);
+extern const char* NCD4_subsortname(nc_type subsort);
+
+extern int NCD4_debugcopy(NCD4INFO* info);
+
+#endif /*D4DEBUG_H*/
diff --git a/libdap4/d4dump.c b/libdap4/d4dump.c
new file mode 100644
index 0000000..1d8126f
--- /dev/null
+++ b/libdap4/d4dump.c
@@ -0,0 +1,110 @@
+/* Copyright 2012, UCAR/Unidata.
+   See the LICENSE file for more information.
+*/
+
+#include "d4includes.h"
+
+/*
+Provide a simple dump of binary data
+*/
+
+/**************************************************/
+
+void
+NCD4_dumpbytes(size_t size, const void* data0, int swap)
+{
+    size_t extended;
+    void* data;
+    char* pos;
+    size_t i;
+
+    extended = size + 8;
+    data = calloc(1,extended); /* provide some space to simplify the code */
+    memcpy(data,data0,size);
+    for(i=0,pos=data;i<size; pos++,i++) {
+	struct {
+	    unsigned char u8[1];
+	      signed char i8[1];
+	    unsigned short u16[1];
+	             short i16[1];
+	    unsigned int u32[1];
+	             int i32[1];
+	    unsigned long long u64[1];
+	             long long i64[1];
+	    float f32[1];
+	    double f64[1];
+	    char s[8];
+	} v;
+	v.s[0] = *((char*)pos);
+	v.s[1] = '\0';
+	v.u8[0] = *((unsigned char*)pos);
+	v.i8[0] = *((signed char*)pos);
+        v.u16[0] = *((unsigned short*)pos);
+        v.i16[0] = *((short*)pos);
+        v.u32[0] = *((unsigned int*)pos);
+        v.i32[0] = *((int*)pos);
+        v.u64[0] = *((unsigned long long*)pos);
+        v.i64[0] = *((long long*)pos);
+	if(swap) {
+	    swapinline16(v.u16);
+	    swapinline32(v.u32);
+	    swapinline32(v.u64);
+	    swapinline16(v.i16);
+	    swapinline32(v.i32);
+	    swapinline32(v.i64);
+	    swapinline32(v.f32);
+	    swapinline32(v.f64);
+        }
+        if(v.s[0] == '\r') strcpy(v.s,"\\r");
+        else if(v.s[0] == '\n') strcpy(v.s,"\\n");
+        else if(v.s[0] < ' ' || v.s[0] >= 0x7f) v.s[0] = '?';
+        fprintf(stderr,"[%03lu] %02x %03u %4d", i, v.u8[0], v.u8[0], v.i8[0]);
+        fprintf(stderr," 0x%08x %12u %13d", v.u32[0], v.u32[0], v.i32[0]);
+        fprintf(stderr," 0x%04x %06u %7d", v.u16[0], v.u16[0], v.i16[0]);
+        fprintf(stderr," '%s'\n",v.s);
+	fflush(stderr);
+    }
+}
+
+void
+NCD4_tagdump(size_t size, const void* data0, int swap, const char* tag)
+{
+    fprintf(stderr,"++++++++++ %s ++++++++++\n",tag);
+    NCD4_dumpbytes(size,data0,swap);
+    fprintf(stderr,"++++++++++ %s ++++++++++\n",tag);
+    fflush(stderr);
+}
+
+/* Dump the variables in a group */
+void
+NCD4_dumpvars(NCD4node* group)
+{
+    int i;
+    fprintf(stderr,"%s.vars:\n",group->name);
+    for(i=0;i<nclistlength(group->vars);i++) {
+	NCD4node* var = (NCD4node*)nclistget(group->vars,i);
+	NCD4node* type;
+
+	switch (var->subsort) {
+	default:
+	    type = var->basetype;
+	    fprintf(stderr,"<%s name=\"%s\"/>\n",type->name,var->name);
+	    break;
+	case NC_STRUCT:
+	    fprintf(stderr,"<%s name=\"%s\"/>\n","Struct",var->name);
+	    break;
+	case NC_SEQ:
+	    fprintf(stderr,"<%s name=\"%s\"/>\n","Sequence",var->name);
+	    break;
+        }
+    }
+    fflush(stderr);
+}
+
+union ATOMICS*
+NCD4_dumpatomic(NCD4node* var, void* data)
+{
+    union ATOMICS* p = (union ATOMICS*)data;
+    return p;
+}
+
diff --git a/libdap4/d4file.c b/libdap4/d4file.c
new file mode 100644
index 0000000..6a27caf
--- /dev/null
+++ b/libdap4/d4file.c
@@ -0,0 +1,491 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "ncdispatch.h"
+#include "ncd4dispatch.h"
+#include "d4includes.h"
+#include "d4read.h"
+#include "d4curlfunctions.h"
+
+#if defined(_WIN32) || defined(_WIN64)
+#include <process.h>
+#include <direct.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+/**************************************************/
+/* Forward */
+
+static void applyclientmetacontrols(NCD4meta* meta);
+static void applyclientparamcontrols(NCD4INFO*);
+static int constrainable(NCURI*);
+static void freeCurl(NCD4curl*);
+static void freeInfo(NCD4INFO*);
+static int paramcheck(NCD4INFO*, const char* key, const char* subkey);
+static const char* getparam(NCD4INFO* info, const char* key);
+static int set_curl_properties(NCD4INFO*);
+
+/**************************************************/
+/* Constants */
+
+static const char* checkseps = "+,:;";
+
+/**************************************************/
+int
+NCD4_open(const char * path, int mode,
+               int basepe, size_t *chunksizehintp,
+ 	       int useparallel, void* mpidata,
+               NC_Dispatch* dispatch, NC* nc)
+{
+    int ret = NC_NOERR;
+    NCD4INFO* d4info = NULL;
+    const char* value;
+    NCD4meta* meta;
+
+    if(path == NULL)
+	return THROW(NC_EDAPURL);
+
+    assert(dispatch != NULL);
+
+    /* Setup our NC and NCDAPCOMMON state*/
+
+    d4info = (NCD4INFO*)calloc(1,sizeof(NCD4INFO));
+    if(d4info == NULL) {ret = NC_ENOMEM; goto done;}
+
+    nc->dispatchdata = d4info;
+    nc->int_ncid = nc__pseudofd(); /* create a unique id */
+    d4info->controller = (NC*)nc;
+
+    /* Parse url and params */
+    if(ncuriparse(nc->path,&d4info->uri) != NCU_OK)
+	{ret = NC_EDAPURL; goto done;}
+
+    if(!constrainable(d4info->uri))
+	SETFLAG(d4info->controls.flags,NCF_UNCONSTRAINABLE);
+
+    /* fail if we are unconstrainable but have constraints */
+    if(FLAGSET(d4info->controls.flags,NCF_UNCONSTRAINABLE)) {
+	if(d4info->uri->query != NULL) {
+	    nclog(NCLOGWARN,"Attempt to constrain an unconstrainable data source: %s",
+		   d4info->uri->query);
+	    ret = THROW(NC_EDAPCONSTRAINT);
+	    goto done;
+	}
+    }
+
+    /* process control client parameters */
+    applyclientparamcontrols(d4info);
+
+    /* Use libsrc4 code (netcdf-4) for storing metadata */
+    {
+	char tmpname[NC_MAX_NAME];
+
+        /* Create fake file name: exact name must be unique,
+           but is otherwise irrelevant because we are using NC_DISKLESS
+        */
+	if(strlen(d4info->controls.substratename) > 0)
+            snprintf(tmpname,sizeof(tmpname),"%s",d4info->controls.substratename);
+	else
+            snprintf(tmpname,sizeof(tmpname),"tmp_%d",nc->int_ncid);
+
+        /* Now, use the file to create the hidden, in-memory netcdf file.
+	   We want this hidden file to always be NC_NETCDF4, so we need to
+           force default format temporarily in case user changed it.
+	*/
+	{
+	    int new = NC_NETCDF4;
+	    int old = 0;
+	    int ncflags = NC_DISKLESS|NC_NETCDF4|NC_CLOBBER;
+
+	    if(FLAGSET(d4info->controls.debugflags,NCF_DEBUG_COPY))
+		ncflags |= NC_WRITE;
+	    
+	    nc_set_default_format(new,&old); /* save and change */
+            ret = nc_create(tmpname,ncflags,&d4info->substrate.nc4id);
+	    nc_set_default_format(old,&new); /* restore */
+	}
+        if(ret != NC_NOERR) goto done;
+	/* Avoid fill */
+	nc_set_fill(getnc4id(nc),NC_NOFILL,NULL);
+    }
+
+    /* Turn on logging; only do this after oc_open*/
+    if((value = ncurilookup(d4info->uri,"log")) != NULL) {
+	ncloginit();
+        if(nclogopen(value))
+	    ncsetlogging(1);
+	ncloginit();
+        if(nclogopen(value))
+	    ncsetlogging(1);
+    }
+
+    /* Setup a curl connection */
+    {
+        CURL* curl = NULL; /* curl handle*/
+	d4info->curl = (NCD4curl*)calloc(1,sizeof(NCD4curl));
+	if(d4info->curl == NULL)
+	    {ret = NC_ENOMEM; goto done;}
+	/* create the connection */
+        if((ret=NCD4_curlopen(&curl))!= NC_NOERR) goto done;
+	d4info->curl->curl = curl;
+        if((ret=set_curl_properties(d4info))!= NC_NOERR) goto done;	
+        /* Set the one-time curl flags */
+        if((ret=NCD4_set_flags_perlink(d4info))!= NC_NOERR) goto done;
+#if 1 /* temporarily make per-link */
+        if((ret=NCD4_set_flags_perfetch(d4info))!= NC_NOERR) goto done;
+#endif
+    }
+
+    d4info->curl->packet = ncbytesnew();
+    ncbytessetalloc(d4info->curl->packet,DFALTPACKETSIZE); /*initial reasonable size*/
+
+    /* fetch the dmr + data*/
+    {
+	int inmem = FLAGSET(d4info->controls.flags,NCF_ONDISK) ? 0 : 1;
+        if((ret = NCD4_readDAP(d4info,inmem))) goto done;
+    }
+
+    /* if the url goes astray to a random web page, then try to just dump it */
+    {
+	char* response = ncbytescontents(d4info->curl->packet);
+	size_t responselen = ncbyteslength(d4info->curl->packet);
+
+        /* Apply some heuristics to see what we have.
+           The leading byte will have the chunk flags, which should
+           be less than 0x0f (for now). However, it will not be zero if
+           the data was little-endian
+	*/
+        if(responselen == 0 || response[0] >= ' ') {
+	    /* does not look like a chunk, so probable server failure */
+	    if(responselen == 0)
+	        nclog(NCLOGERR,"Empty DAP4 response");
+	    else {/* probable html response */
+		nclog(NCLOGERR,"Unexpected DAP response:");
+		nclog(NCLOGERR,"==============================");
+		nclogtext(NCLOGERR,response);
+		nclog(NCLOGERR,"==============================\n");
+	    }
+	    ret = NC_EDAPSVC;
+  	    fflush(stderr);
+	    goto done;
+	}
+    }
+
+    /* Build the meta data */
+    if((d4info->substrate.metadata=NCD4_newmeta(ncbyteslength(d4info->curl->packet),
+        ncbytescontents(d4info->curl->packet)))==NULL)
+	{ret = NC_ENOMEM; goto done;}
+    meta = d4info->substrate.metadata;
+    meta->controller = d4info;
+    meta->ncid = getnc4id(nc); /* Transfer netcdf ncid */
+
+    /* process meta control parameters */
+    applyclientmetacontrols(meta);
+
+    /* Infer the mode */
+    if((ret=NCD4_infermode(meta))) goto done;
+
+    if((ret=NCD4_dechunk(meta))) goto done;
+
+#ifdef D4DUMPDMR
+  {
+    fprintf(stderr,"=============\n");
+    fputs(d4info->substrate.metadata->serial.dmr,stderr);
+    fprintf(stderr,"\n=============\n");
+    fflush(stderr);
+  }
+#endif
+
+    if((ret = NCD4_parse(d4info->substrate.metadata))) goto done;
+#ifdef D4DEBUGMETA
+  {
+    fprintf(stderr,"\n/////////////\n");
+    NCbytes* buf = ncbytesnew();
+    NCD4_print(d4info->substrate.metadata,buf);
+    ncbytesnull(buf);
+    fputs(ncbytescontents(buf),stderr);
+    ncbytesfree(buf);
+    fprintf(stderr,"\n/////////////\n");
+    fflush(stderr);
+  }
+#endif
+    if((ret = NCD4_metabuild(d4info->substrate.metadata,d4info->substrate.metadata->ncid))) goto done;
+    if(ret != NC_NOERR && ret != NC_EVARSIZE) goto done;
+    if((ret = NCD4_processdata(d4info->substrate.metadata))) goto done;
+
+    return THROW(ret);
+
+done:
+    if(ret) {
+	freeInfo(d4info);
+        nc->dispatchdata = NULL;
+    }
+    return THROW(ret);
+}
+
+int
+NCD4_close(int ncid)
+{
+    int ret = NC_NOERR;
+    NC* nc;
+    NCD4INFO* d4info;
+    int substrateid;
+
+    ret = NC_check_id(ncid, (NC**)&nc);
+    if(ret != NC_NOERR) goto done;
+    d4info = (NCD4INFO*)nc->dispatchdata;
+    substrateid = makenc4id(nc,ncid);
+
+    /* We call abort rather than close to avoid trying to write anything,
+       except if we are debugging
+     */
+    if(FLAGSET(d4info->controls.debugflags,NCF_DEBUG_COPY)) {
+        /* Dump the data into the substrate */
+	if((ret = NCD4_debugcopy(d4info)))
+	    goto done;
+        ret = nc_close(substrateid);
+    } else {
+        ret = nc_abort(substrateid);
+    }
+
+    freeInfo(d4info);
+
+done:
+    return THROW(ret);
+}
+
+int
+NCD4_abort(int ncid)
+{
+    return NCD4_close(ncid);
+}
+
+/**************************************************/
+
+static void
+freeInfo(NCD4INFO* d4info)
+{
+    if(d4info == NULL) return;
+    d4info->controller = NULL; /* break link */
+    nullfree(d4info->rawurltext);
+    nullfree(d4info->urltext);
+    ncurifree(d4info->uri);
+    freeCurl(d4info->curl);
+    nullfree(d4info->data.memory);
+    nullfree(d4info->data.ondiskfilename);
+    if(d4info->data.ondiskfile != NULL)
+	fclose(d4info->data.ondiskfile);
+    nullfree(d4info->substrate.filename);
+    NCD4_reclaimMeta(d4info->substrate.metadata);
+    free(d4info);    
+}
+
+static void
+freeCurl(NCD4curl* curl)
+{
+    if(curl == NULL) return;
+    NCD4_curlclose(curl->curl);
+    ncbytesfree(curl->packet);
+    nullfree(curl->errdata.code);
+    nullfree(curl->errdata.message);
+    nullfree(curl->curlflags.useragent);
+    nullfree(curl->curlflags.cookiejar);
+    nullfree(curl->curlflags.netrc);
+    nullfree(curl->ssl.certificate);
+    nullfree(curl->ssl.key);
+    nullfree(curl->ssl.keypasswd);
+    nullfree(curl->ssl.cainfo);
+    nullfree(curl->ssl.capath);
+    nullfree(curl->proxy.host);
+    nullfree(curl->proxy.userpwd);
+    nullfree(curl->creds.userpwd);
+}
+
+/* Define the set of protocols known to be constrainable */
+static char* constrainableprotocols[] = {"http", "https",NULL};
+
+static int
+constrainable(NCURI* durl)
+{
+   char** protocol = constrainableprotocols;
+   for(;*protocol;protocol++) {
+	if(strcmp(durl->protocol,*protocol)==0)
+	    return 1;
+   }
+   return 0;
+}
+
+/*
+Set curl properties for link based on rc files etc.
+*/
+static int
+set_curl_properties(NCD4INFO* d4info)
+{
+    int ret = NC_NOERR;
+
+    /* defaults first */
+    NCD4_rcdefault(d4info);
+
+    /* extract the relevant triples into d4info */
+    NCD4_rcprocess(d4info);
+
+    if(d4info->curl->curlflags.useragent == NULL) {
+        size_t len = strlen(DFALTUSERAGENT) + strlen(VERSION) + 1;
+	char* agent = (char*)malloc(len+1);
+	strncpy(agent,DFALTUSERAGENT,len);
+	strncat(agent,VERSION,len);
+        d4info->curl->curlflags.useragent = agent;
+    }
+
+    /* Some servers (e.g. thredds and columbia) appear to require a place
+       to put cookies in order for some security functions to work
+    */
+    if(d4info->curl->curlflags.cookiejar != NULL
+       && strlen(d4info->curl->curlflags.cookiejar) == 0) {
+	free(d4info->curl->curlflags.cookiejar);
+	d4info->curl->curlflags.cookiejar = NULL;
+    }
+
+    if(d4info->curl->curlflags.cookiejar == NULL) {
+	/* If no cookie file was defined, define a default */
+	char tmp[4096+1];
+        int ok;
+#if defined(_WIN32) || defined(_WIN64)
+	int pid = _getpid();
+#else
+	pid_t pid = getpid();
+#endif
+	snprintf(tmp,sizeof(tmp)-1,"%s/%s.%ld/",NCD4_globalstate->tempdir,"netcdf",(long)pid);
+
+#if defined(_WIN32) || defined(_WIN64)
+	ok = _mkdir(tmp);
+#else
+	ok = mkdir(tmp,S_IRUSR | S_IWUSR | S_IXUSR);
+#endif
+	if(ok != 0 && errno != EEXIST) {
+	    fprintf(stderr,"Cannot create cookie directory\n");
+	    goto fail;
+	}
+	errno = 0;
+	/* Create the unique cookie file name */
+	ok = NCD4_mktmp(tmp,&d4info->curl->curlflags.cookiejar);
+	d4info->curl->curlflags.createdflags |= COOKIECREATED;
+	if(ok != NC_NOERR && errno != EEXIST) {
+	    fprintf(stderr,"Cannot create cookie file\n");
+	    goto fail;
+	}
+	errno = 0;
+    }
+    assert(d4info->curl->curlflags.cookiejar != NULL);
+
+    /* Make sure the cookie jar exists and can be read and written */
+    {
+	FILE* f = NULL;
+	char* fname = d4info->curl->curlflags.cookiejar;
+	/* See if the file exists already */
+        f = fopen(fname,"r");
+	if(f == NULL) {
+	    /* Ok, create it */
+	    f = fopen(fname,"w+");
+	    if(f == NULL) {
+	        fprintf(stderr,"Cookie file cannot be read and written: %s\n",fname);
+	        {ret= NC_EPERM; goto fail;}
+	    }
+	} else { /* test if file can be written */
+	    fclose(f);
+	    f = fopen(fname,"r+");
+	    if(f == NULL) {
+	        fprintf(stderr,"Cookie file is cannot be written: %s\n",fname);
+	        {ret = NC_EPERM; goto fail;}
+	    }
+	}
+	if(f != NULL) fclose(f);
+    }
+
+    return THROW(ret);
+
+fail:
+    return THROW(ret);
+}
+
+static void
+applyclientparamcontrols(NCD4INFO* info)
+{
+    NCD4meta* meta = info->substrate.metadata;
+    const char* value;
+
+    /* clear the flags */
+    CLRFLAG(info->controls.flags,NCF_CACHE);
+    CLRFLAG(info->controls.flags,NCF_SHOWFETCH);
+    CLRFLAG(info->controls.flags,NCF_NC4);
+    CLRFLAG(info->controls.flags,NCF_NCDAP);
+
+    /* Turn on any default on flags */
+    SETFLAG(info->controls.flags,DFALT_ON_FLAGS);
+    SETFLAG(info->controls.flags,(NCF_NC4|NCF_NCDAP));
+
+    if(paramcheck(info,"show","fetch"))
+	SETFLAG(info->controls.flags,NCF_SHOWFETCH);
+
+    if(paramcheck(info,"translate","nc4"))
+	info->controls.translation = NCD4_TRANSNC4;
+
+    /* Look at the debug flags */
+    if(paramcheck(info,"debug","copy"))
+	SETFLAG(info->controls.debugflags,NCF_DEBUG_COPY); /* => close */
+
+    value = getparam(info,"substratename");
+    if(value != NULL)
+	strncpy(info->controls.substratename,value,NC_MAX_NAME);
+
+}
+
+static void
+applyclientmetacontrols(NCD4meta* meta)    
+{
+    NCD4INFO* info = meta->controller;
+    const char* value = getparam(info,"checksummode");
+    if(value != NULL) {
+        if(strcmp(value,"ignore")==0)
+	    meta->ignorechecksums = 1;
+    }
+}
+
+/* Search for substring in value of param. If substring == NULL; then just
+   check if param is defined.
+*/
+static int
+paramcheck(NCD4INFO* info, const char* key, const char* subkey)
+{
+    const char* value;
+    char* p;
+
+    value = getparam(info, key);
+    if(value == NULL)
+	return 0;
+    if(subkey == NULL) return 1;
+    p = strstr(value,subkey);
+    if(p == NULL) return 0;
+    p += strlen(subkey);
+    if(*p != '\0' && strchr(checkseps,*p) == NULL) return 0;
+    return 1;
+}
+
+/*
+Given a parameter key, return its value or NULL if not defined.
+*/
+static const char*
+getparam(NCD4INFO* info, const char* key)
+{
+    const char* value;
+
+    if(info == NULL || key == NULL) return NULL;
+    if((value=ncurilookup(info->uri,key)) == NULL)
+	return NULL;
+    return value;
+}
diff --git a/libdap4/d4fix.c b/libdap4/d4fix.c
new file mode 100644
index 0000000..1fa5845
--- /dev/null
+++ b/libdap4/d4fix.c
@@ -0,0 +1,554 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include <stdarg.h>
+#include <assert.h>
+
+#include "d4includes.h"
+#include "ezxml.h"
+
+/*
+The primary purpose of this code is to provide node and data walkers
+to do a variety of things.
+
+* (topo)
+  a. topologically sort the set of allnodes in postfix order.
+
+* (delimit)
+  a. Delimit the top-level vars in the dap4data and also compute checksum
+
+* (move)
+  a. Walk the (toplevel) var's data to get to the count'th instance.
+
+*/
+
+/**************************************************/
+
+#define COUNTSIZE 8
+
+/**************************************************/
+/* Forward */
+
+static int delimitAtomicVar(NCD4meta*, NCD4node* var, void** offsetp);
+static int delimitOpaqueVar(NCD4meta*,  NCD4node* var, void** offsetp);
+static int delimitSeq(NCD4meta*, NCD4node* var, void** offsetp);
+static int delimitSeqArray(NCD4meta*, NCD4node* var,  void** offsetp);
+static int delimitStruct(NCD4meta*, NCD4node* var, void** offsetp);
+static int delimitStructArray(NCD4meta*, NCD4node* var,  void** offsetp);
+static int skipInstance(NCD4meta*, NCD4node* type, void** offsetp);
+static int skipAtomicInstance(NCD4meta*, NCD4node* type, void** offsetp);
+static int skipStructInstance(NCD4meta*, NCD4node* type,  void** offsetp);
+static int skipSeqInstance(NCD4meta*, NCD4node* vlentype, void** offsetp);
+
+static void walk(NCD4node* node, NClist* sorted);
+
+#ifdef D4DEBUGDATA
+static void
+ADDNODE(NClist* list, NCD4node* node)
+{
+    fprintf(stderr,"addnode: %s: %s %s (%llu)\n",
+	node->name,
+	NCD4_sortname(node->sort),
+	NCD4_subsortname(node->subsort),
+	node);
+    fflush(stderr);
+    nclistpush(list,node);
+}
+#else
+#define ADDNODE(list,node) nclistpush((list),(node))
+#endif
+
+
+	
+/**************************************************/
+/* Topo sort in postfix order */
+
+int
+NCD4_toposort(NCD4meta* compiler)
+{
+    int i, ret=NC_NOERR;
+    size_t len = nclistlength(compiler->allnodes);
+    NCD4node** list = (NCD4node**)nclistcontents(compiler->allnodes);
+    NCD4node** p;
+    NClist* sorted = nclistnew();
+    nclistsetalloc(sorted,len);
+    for(i=0,p=list;i<len;p++,i++) {
+	NCD4node* node = *p;
+	switch (node->sort) { /* Collect things known to have no dependencies */
+	case NCD4_DIM:
+	    node->visited = 1;
+	    ADDNODE(sorted,node);
+	    break;
+	case NCD4_TYPE:
+	    if(node->subsort <= NC_MAX_ATOMIC_TYPE || node->subsort == NC_OPAQUE) {
+		node->visited = 1;
+		ADDNODE(sorted,node);
+	    } else
+		node->visited = 0;
+	    break;
+	default:
+	    node->visited = 0;
+	}
+    }
+    walk(compiler->root,sorted);
+    /* Last step is to add in any remaining unvisited nodes, but report them */
+    for(i=0,p=list;i<len;p++,i++) {
+	NCD4node* node = *p;
+	if(node->visited) continue;
+#ifdef D4DEBUGDATA
+fprintf(stderr,"unvisited node: %s\n",node->name); fflush(stderr);
+#endif
+	node->visited = 1;
+	ADDNODE(sorted,node);
+    }
+    nclistfree(compiler->allnodes);
+    compiler->allnodes = sorted;
+#ifdef D4DEBUGDATA
+{int i;
+for(i=0;i<nclistlength(sorted);i++)
+fprintf(stderr,"sorted: %s\n",((NCD4node*)nclistget(sorted,i))->name);
+fflush(stderr);
+}
+#endif
+    return THROW(ret);
+}
+
+/*
+Do depth first search
+*/
+static void
+walk(NCD4node* node, NClist* sorted)
+{
+    int i;
+
+    if(node->visited) return;
+    node->visited = 1;
+
+    switch (node->sort) {
+    case NCD4_GROUP: /* depends on its elements and attributes and subgroups */
+	for(i=0;i<nclistlength(node->group.elements);i++) {
+	    NCD4node* elem = (NCD4node*)nclistget(node->group.elements,i);
+	    walk(elem,sorted);
+	}		
+	break;	
+    case NCD4_TYPE: /* Need to discriminate on the subsort */
+	switch (node->subsort) {
+	case NC_SEQ:
+	    /* Depends on its basetype */
+	    walk(node->basetype,sorted);
+	    break;
+	case NC_STRUCT: /* Depends on its fields */
+            for(i=0;i<nclistlength(node->vars);i++) {
+	        NCD4node* f = (NCD4node*)nclistget(node->vars,i);
+		walk(f,sorted);
+	    }
+	    break;	
+	case NC_ENUM: /* Depends on its basetype, but since that is atomic, we can ignore */
+	    /* fall thru */
+	default: /* Atomic or opaque, so already marked */
+	   break;
+	}
+	break;
+
+    case NCD4_VAR: /* Depends on: dimensions and basetype and maps */
+        for(i=0;i<nclistlength(node->dims);i++) {
+	    NCD4node* d = (NCD4node*)nclistget(node->dims,i);
+  	    walk(d,sorted);
+	}
+	walk(node->basetype,sorted);
+        for(i=0;i<nclistlength(node->maps);i++) {
+	    NCD4node* m = (NCD4node*)nclistget(node->maps,i);
+  	    walk(m,sorted);
+	}
+	break;
+	
+    case NCD4_ATTR: /* Depends on its base type */
+	walk(node->basetype,sorted);
+	break;
+
+    case NCD4_ATTRSET: /* Depends on its contained attributes, but handled after switch */
+	/* fall thru */
+    default: /* depends on nothing else */
+	break;
+    }
+
+    /* Do Attributes last */
+    for(i=0;i<nclistlength(node->attributes);i++) {
+	NCD4node* a = (NCD4node*)nclistget(node->attributes,i);
+	walk(a,sorted);
+    }		
+    ADDNODE(sorted,node);    
+}
+
+
+/**************************************************/
+/* Mark the offset and length of each var/field
+   inside the raw dapdata.
+   Assumes it is called before byte swapping, so we
+   need to do swapping of counts and the final remote checksum.
+*/
+
+int
+NCD4_delimit(NCD4meta* compiler, NCD4node* topvar, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+
+    offset = *offsetp;
+    ASSERT((ISTOPLEVEL(topvar)));
+    topvar->data.dap4data.memory = offset;
+    if(topvar->sort == NCD4_VAR) {
+	switch (topvar->subsort) {
+        case NC_STRUCT:
+            if((ret=delimitStructArray(compiler,topvar,&offset))) goto done;
+            break;
+        case NC_SEQ:
+            if((ret=delimitSeqArray(compiler,topvar,&offset))) goto done;
+            break;
+	default:
+            if((ret=delimitAtomicVar(compiler,topvar,&offset))) goto done;
+            break;
+	}
+    }
+    /* Track the variable size (in the dap4 data) but do not include
+       any checksum */
+    topvar->data.dap4data.size = (d4size_t)(((char*)offset) - ((char*)*offsetp));
+    /* extract the dap4 data checksum, if present */
+    if(compiler->serial.remotechecksumming) {
+	union ATOMICS csum;
+        memcpy(csum.u8,offset,CHECKSUMSIZE);
+        topvar->data.remotechecksum = csum.u32[0];
+	if(compiler->swap) swapinline32(&topvar->data.remotechecksum);
+	offset = INCR(offset,CHECKSUMSIZE);
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+/* Includes opaque and enum */
+static int
+delimitAtomicVar(NCD4meta* compiler, NCD4node* var, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    int typesize;
+    d4size_t i;
+    d4size_t dimproduct;
+    nc_type tid;
+    NCD4node* basetype;
+    NCD4node* truetype;
+
+    assert(var->sort == NCD4_VAR);
+    dimproduct = NCD4_dimproduct(var);
+    basetype = var->basetype;
+    if(basetype->subsort == NC_OPAQUE)
+        return delimitOpaqueVar(compiler,var,offsetp);
+
+    truetype = basetype;
+    if(truetype->subsort == NC_ENUM)
+        truetype = basetype->basetype;
+
+    offset = *offsetp;
+    tid = truetype->subsort;
+    typesize = NCD4_typesize(tid);
+    if(tid != NC_STRING) {
+	offset = INCR(offset,(typesize*dimproduct));
+    } else if(tid == NC_STRING) { /* walk the counts */
+        unsigned long long count;
+        for(i=0;i<dimproduct;i++) {
+            /* Get string count */
+            count = GETCOUNTER(offset);
+            SKIPCOUNTER(offset);
+  	    if(compiler->swap) swapinline64(&count);
+            /* skip count bytes */
+  	    offset = INCR(offset,count);
+        }
+    }
+    *offsetp = offset;
+    return THROW(ret);
+}
+
+static int
+delimitOpaqueVar(NCD4meta* compiler,  NCD4node* var, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t i;
+    unsigned long long count;
+    d4size_t dimproduct = NCD4_dimproduct(var);
+
+    offset = *offsetp;
+    for(i=0;i<dimproduct;i++) {
+        /* Walk the instances */
+        count = GETCOUNTER(offset);
+        SKIPCOUNTER(offset);
+        if(compiler->swap) swapinline64(&count);
+        offset = INCR(offset,count);
+    }
+    *offsetp = offset;
+    return THROW(ret);
+}
+
+static int
+delimitStructArray(NCD4meta* compiler, NCD4node* varortype,  void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t i;
+    d4size_t dimproduct;
+    NCD4node* type;
+
+   if(varortype->sort == NCD4_VAR) {
+	dimproduct = NCD4_dimproduct(varortype);	
+	type = varortype->basetype;
+   } else {
+	dimproduct = 1;
+	type = varortype;	
+   }
+
+    offset = *offsetp;
+    for(i=0;i<dimproduct;i++) {
+        if((ret=delimitStruct(compiler,type,&offset))) goto done;
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+delimitStruct(NCD4meta* compiler, NCD4node* basetype, void** offsetp)
+{
+    int ret = NC_NOERR;
+    int i;
+    void* offset;
+
+    offset = *offsetp;
+    /* The fields are associated with the basetype struct */
+    for(i=0;i<nclistlength(basetype->vars);i++) {
+        NCD4node* field = (NCD4node*)nclistget(basetype->vars,i);
+        switch (field->subsort) {
+	default:
+            if((ret=delimitAtomicVar(compiler,field,&offset))) goto done;
+            break;
+        case NC_STRUCT: /* recurse */
+            if((ret=delimitStructArray(compiler,field,&offset))) goto done;
+            break;
+        case NC_SEQ:
+            if((ret=delimitSeqArray(compiler,field,&offset))) goto done;
+            break;
+        }
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+delimitSeqArray(NCD4meta* compiler, NCD4node* varortype,  void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t i;
+    d4size_t dimproduct;
+    NCD4node* type;
+
+    if(varortype->sort == NCD4_VAR) {
+	dimproduct = NCD4_dimproduct(varortype);	
+	type = varortype->basetype;
+    } else {
+	dimproduct = 1;
+	type = varortype;	
+    }
+
+    offset = *offsetp;
+    for(i=0;i<dimproduct;i++) {
+        if((ret=delimitSeq(compiler,type,&offset))) goto done;
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+delimitSeq(NCD4meta* compiler, NCD4node* vlentype, void** offsetp)
+{
+    int ret = NC_NOERR;
+    int i;
+    void* offset;
+    d4size_t recordcount;
+    NCD4node* recordtype;
+
+    /* The true type of the record is the basetype of the vlen,
+       where the vlen type is the basetype of the var
+     */ 
+    assert(vlentype->subsort == NC_VLEN);
+    recordtype = vlentype->basetype;
+
+    offset = *offsetp;
+
+    /* Get he record count */
+    recordcount = GETCOUNTER(offset);
+    SKIPCOUNTER(offset);
+    if(compiler->swap) swapinline64(&recordcount);
+
+    for(i=0;i<recordcount;i++) {
+	switch (recordtype->subsort) {
+        case NC_STRUCT:
+            if((ret=delimitStructArray(compiler,recordtype,&offset))) goto done;
+            break;
+        case NC_SEQ:
+            if((ret=delimitSeqArray(compiler,recordtype,&offset))) goto done;
+            break;
+	default:
+            if((ret=delimitAtomicVar(compiler,recordtype,&offset))) goto done;
+            break;
+	}
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+/**************************************************/
+/*
+Walk the (toplevel) var's data to get to the count'th instance.
+For effiency, it can be supplied with a previous case.
+Assumes it is called after byte swapping and offsetting.
+Assumes that var is not fixed size.
+*/
+
+int 
+NCD4_moveto(NCD4meta* compiler, NCD4node* var, d4size_t count, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset = NULL;
+    d4size_t startcount = 0;
+    NCD4node* basetype = NULL;
+
+    ASSERT((ISTOPLEVEL(var)));
+
+    offset = *offsetp;
+    startcount = 0;
+    basetype = var->basetype;
+    for(;startcount < count;startcount++) {
+	if((ret=skipInstance(compiler,basetype,&offset)))
+	    goto done;
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+skipInstance(NCD4meta* compiler, NCD4node* type, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset = NULL;
+ 
+    offset = *offsetp;
+    switch (type->subsort) {
+    case NC_STRUCT:
+        if((ret=skipStructInstance(compiler,type,&offset))) goto done;
+        break;
+    case NC_SEQ:
+        if((ret=skipSeqInstance(compiler,type,&offset))) goto done;
+        break;
+    default:
+        if((ret=skipAtomicInstance(compiler,type,&offset))) goto done;
+        break;
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+/* Includes opaque and enum */
+static int
+skipAtomicInstance(NCD4meta* compiler, NCD4node* type, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t count;
+    int typesize;
+
+    offset = *offsetp;
+
+    switch (type->subsort) {
+    default: /* fixed size atomic type */
+        typesize = NCD4_typesize(type->meta.id);
+	offset = INCR(offset,typesize);
+	break;
+    case NC_STRING:
+        /* Get string count */
+        count = GETCOUNTER(offset);
+        SKIPCOUNTER(offset);
+        /* skip count bytes */
+	offset = INCR(offset,count);
+	break;
+    case NC_OPAQUE:
+        /* get count */
+        count = GETCOUNTER(offset);
+        SKIPCOUNTER(offset);
+	offset = INCR(offset,count);
+	break;
+    case NC_ENUM:
+        return skipAtomicInstance(compiler,type->basetype,offsetp);
+    }
+    *offsetp = offset;
+    return THROW(ret);
+}
+
+static int
+skipStructInstance(NCD4meta* compiler, NCD4node* type,  void** offsetp)
+{
+    int ret = NC_NOERR;
+    d4size_t i,j;
+    void* offset;
+
+    offset = *offsetp;
+    /* Skip each field */
+    for(i=0;i<nclistlength(type->vars);i++) {
+        NCD4node* field = (NCD4node*)nclistget(type->vars,i);
+	NCD4node* ftype = field->basetype;
+        d4size_t dimproduct = NCD4_dimproduct(field);	
+	for(j=0;j<dimproduct;j++) {
+	    if((ret=skipInstance(compiler,ftype,&offset)))
+		goto done;
+	}
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+skipSeqInstance(NCD4meta* compiler, NCD4node* vlentype, void** offsetp)
+{
+    int ret = NC_NOERR;
+    d4size_t i;
+    void* offset;
+    NCD4node* structtype;
+    d4size_t recordcount;
+
+    offset = *offsetp;
+
+    structtype = vlentype->basetype;
+    ASSERT((structtype->subsort == NC_STRUCT));
+
+    /* Get record count */
+    recordcount = GETCOUNTER(offset);
+    SKIPCOUNTER(offset);
+
+    for(i=0;i<recordcount;i++) {
+	/* Skip a record instance */
+	if((ret=skipStructInstance(compiler,structtype,&offset)))
+	    goto done;
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
diff --git a/libdap4/d4http.c b/libdap4/d4http.c
new file mode 100644
index 0000000..e966de8
--- /dev/null
+++ b/libdap4/d4http.c
@@ -0,0 +1,342 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include "d4curlfunctions.h"
+
+static size_t WriteFileCallback(void*, size_t, size_t, void*);
+static size_t WriteMemoryCallback(void*, size_t, size_t, void*);
+static int curlerrtoncerr(CURLcode cstat);
+
+struct Fetchdata {
+        FILE* stream;
+        size_t size;
+};
+
+long
+NCD4_fetchhttpcode(CURL* curl)
+{
+    long httpcode = 200;
+    CURLcode cstat = CURLE_OK;
+    /* Extract the http code */
+#ifdef HAVE_CURLINFO_RESPONSE_CODE
+    cstat = curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&httpcode);
+#else
+    cstat = curl_easy_getinfo(curl,CURLINFO_HTTP_CODE,&httpcode);
+#endif
+    if(cstat != CURLE_OK) {
+	httpcode = 0;
+        nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+    }
+    return httpcode;
+}
+
+int
+NCD4_fetchurl_file(CURL* curl, const char* url, FILE* stream,
+                d4size_t* sizep, long* filetime)
+{
+    int ret = NC_NOERR;
+    CURLcode cstat = CURLE_OK;
+    struct Fetchdata fetchdata;
+
+    /* Set the URL */
+    cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)url);
+    if (cstat != CURLE_OK) goto fail;
+
+    /* send all data to this function  */
+    cstat = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteFileCallback);
+    if (cstat != CURLE_OK) goto fail;
+
+    /* we pass our file to the callback function */
+    cstat = curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&fetchdata);
+    if(cstat != CURLE_OK) goto fail;
+
+    /* One last thing; always try to get the last modified time */
+    cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1);
+    if (cstat != CURLE_OK) goto fail;
+
+    fetchdata.stream = stream;
+    fetchdata.size = 0;
+    cstat = curl_easy_perform(curl);
+    if (cstat != CURLE_OK)
+        {ret = NC_EDAPSVC; goto fail;}
+
+    if (ret == NC_NOERR) {
+        /* return the file size*/
+#ifdef D4DEBUG
+	nclog(NCLOGNOTE,"filesize: %lu bytes",fetchdata.size);
+#endif
+        if (sizep != NULL)
+            *sizep = fetchdata.size;
+        /* Get the last modified time */
+        if(filetime != NULL)
+            cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime);
+        if(cstat != CURLE_OK)
+	    {ret = NC_ECURL; goto fail;}
+    }
+    return THROW(ret);
+
+fail:
+    if(cstat != CURLE_OK) {
+        nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+        ret = curlerrtoncerr(cstat);
+    }
+    return THROW(ret);
+}
+
+int
+NCD4_fetchurl(CURL* curl, const char* url, NCbytes* buf, long* filetime,
+           struct credentials* creds)
+{
+    int ret = NC_NOERR;
+    CURLcode cstat = CURLE_OK;
+    size_t len;
+    long httpcode = 0;
+
+    /* send all data to this function  */
+    cstat = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+    if (cstat != CURLE_OK)
+        goto fail;
+
+    /* we pass our file to the callback function */
+    cstat = curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)buf);
+    if (cstat != CURLE_OK)
+        goto fail;
+
+    /* One last thing; always try to get the last modified time */
+    cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1);
+
+    /* Set the URL */
+    cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)"");
+    cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)url);
+    if (cstat != CURLE_OK)
+        goto fail;
+
+    cstat = curl_easy_perform(curl);
+
+    if(cstat == CURLE_PARTIAL_FILE) {
+        /* Log it but otherwise ignore */
+        nclog(NCLOGWARN, "curl error: %s; ignored",
+               curl_easy_strerror(cstat));
+        cstat = CURLE_OK;
+    }
+    httpcode = NCD4_fetchhttpcode(curl);
+
+    if(cstat != CURLE_OK) goto fail;
+
+    /* Get the last modified time */
+    if(filetime != NULL)
+        cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime);
+    if(cstat != CURLE_OK) goto fail;
+
+    /* Null terminate the buffer*/
+    len = ncbyteslength(buf);
+    ncbytesappend(buf, '\0');
+    ncbytessetlength(buf, len); /* dont count null in buffer size*/
+#ifdef D4DEBUG
+    nclog(NCLOGNOTE,"buffersize: %lu bytes",(d4size_t)ncbyteslength(buf));
+#endif
+    return THROW(ret);
+
+fail:
+    if(cstat != CURLE_OK) {
+        nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+        ret = curlerrtoncerr(cstat);
+    } else switch (httpcode) {
+    case 401: ret = NC_EAUTH; break;
+    case 404: ret = ENOENT; break;
+    case 500: ret = NC_EDAPSVC; break;
+    case 200: break;
+    default: ret = NC_ECURL; break;
+    }
+    return THROW(ret);
+}
+
+static size_t
+WriteFileCallback(void* ptr, size_t size, size_t nmemb, void* data)
+{
+    size_t realsize = size * nmemb;
+    size_t count;
+    struct Fetchdata* fetchdata;
+    fetchdata = (struct Fetchdata*) data;
+    if(realsize == 0)
+        nclog(NCLOGWARN,"WriteFileCallback: zero sized chunk");
+    count = fwrite(ptr, size, nmemb, fetchdata->stream);
+    if (count > 0) {
+            fetchdata->size += (count * size);
+    } else {
+        nclog(NCLOGWARN,"WriteFileCallback: zero sized write");
+    }
+#ifdef PROGRESS
+    nclog(NCLOGNOTE,"callback: %lu bytes",(d4size_t)realsize);
+#endif
+    return count;
+}
+
+static size_t
+WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
+{
+    size_t realsize = size * nmemb;
+    NCbytes* buf = (NCbytes*) data;
+    if(realsize == 0)
+        nclog(NCLOGWARN,"WriteMemoryCallback: zero sized chunk");
+    /* Optimize for reading potentially large dods datasets */
+    if(!ncbytesavail(buf,realsize)) {
+        /* double the size of the packet */
+        ncbytessetalloc(buf,2*ncbytesalloc(buf));
+    }
+    ncbytesappendn(buf, ptr, realsize);
+#ifdef PROGRESS
+    nclog(NCLOGNOTE,"callback: %lu bytes",(d4size_t)realsize);
+#endif
+    return realsize;
+}
+
+int
+NCD4_curlopen(CURL** curlp)
+{
+    int ret = NC_NOERR;
+    CURLcode cstat = CURLE_OK;
+    CURL* curl;
+    /* initialize curl*/
+    curl = curl_easy_init();
+    if (curl == NULL)
+        ret = NC_ECURL;
+    else {
+        cstat = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
+        if (cstat != CURLE_OK)
+            ret = NC_ECURL;
+    }
+    if (curlp)
+        *curlp = curl;
+    if(cstat != CURLE_OK) {
+        nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+        ret = curlerrtoncerr(cstat);
+    }
+    return THROW(ret);
+}
+
+void
+NCD4_curlclose(CURL* curl)
+{
+    if (curl != NULL)
+        curl_easy_cleanup(curl);
+}
+
+int
+NCD4_fetchlastmodified(CURL* curl, char* url, long* filetime)
+{
+    int ret = NC_NOERR;
+    CURLcode cstat = CURLE_OK;
+
+    /* Set the URL */
+    cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)url);
+    if (cstat != CURLE_OK)
+        goto fail;
+
+    /* Ask for head */
+    cstat = curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30); /* 30sec timeout*/
+    cstat = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2);
+    cstat = curl_easy_setopt(curl, CURLOPT_HEADER, 1);
+    cstat = curl_easy_setopt(curl, CURLOPT_NOBODY, 1);
+    cstat = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
+    cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1);
+
+    cstat = curl_easy_perform(curl);
+    if(cstat != CURLE_OK) goto fail;
+    if(filetime != NULL)
+        cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime);
+    if(cstat != CURLE_OK) goto fail;
+    return THROW(ret);
+
+fail:
+    if(cstat != CURLE_OK) {
+        nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+        ret = curlerrtoncerr(cstat);
+    }
+    return THROW(ret);
+}
+
+int
+NCD4_ping(const char* url)
+{
+    int ret = NC_NOERR;
+    CURLcode cstat = CURLE_OK;
+    CURL* curl = NULL;
+    NCbytes* buf = NULL;
+
+    /* Create a CURL instance */
+    ret = NCD4_curlopen(&curl);
+    if(ret != NC_NOERR) return THROW(ret);
+
+    /* Use redirects */
+    cstat = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10L);
+    if (cstat != CURLE_OK)
+        goto done;
+    cstat = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+    if (cstat != CURLE_OK)
+        goto done;
+
+    /* use a very short timeout: 10 seconds */
+    cstat = curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)5);
+    if (cstat != CURLE_OK)
+        goto done;
+
+    /* fail on HTTP 400 code errors */
+    cstat = curl_easy_setopt(curl, CURLOPT_FAILONERROR, (long)1);
+    if (cstat != CURLE_OK)
+        goto done;
+
+    /* Try to get the file */
+    buf = ncbytesnew();
+    ret = NCD4_fetchurl(curl,url,buf,NULL,NULL);
+    if(ret == NC_NOERR) {
+        /* Don't trust curl to return an error when request gets 404 */
+        long http_code = 0;
+        cstat = curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &http_code);
+        if (cstat != CURLE_OK)
+            goto done;
+        if(http_code >= 400) {
+            cstat = CURLE_HTTP_RETURNED_ERROR;
+            goto done;
+        }
+    } else
+        goto done;
+
+done:
+    ncbytesfree(buf);
+    NCD4_curlclose(curl);
+    if(cstat != CURLE_OK) {
+        nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+        ret = curlerrtoncerr(cstat);
+    }
+    return THROW(ret);
+}
+
+static int
+curlerrtoncerr(CURLcode cstat)
+{
+    switch (cstat) {
+    case CURLE_OK: return THROW(NC_NOERR);
+    case CURLE_URL_MALFORMAT:
+	return THROW(NC_EURL);   
+    case CURLE_COULDNT_RESOLVE_HOST:
+    case CURLE_COULDNT_CONNECT:
+    case CURLE_REMOTE_ACCESS_DENIED:
+    case CURLE_TOO_MANY_REDIRECTS:
+	return THROW(NC_EDAPSVC);
+    case CURLE_OUT_OF_MEMORY:
+	return THROW(NC_ENOMEM);
+    /* Eventually would be nice to convert these */
+    case CURLE_SSL_CONNECT_ERROR:
+    case CURLE_READ_ERROR:
+    case CURLE_OPERATION_TIMEDOUT:
+    case CURLE_SSL_CERTPROBLEM:
+    case CURLE_FILESIZE_EXCEEDED:
+    case CURLE_SSL_CACERT_BADFILE:
+    default: break;
+    }
+    return THROW(NC_ECURL);	
+}
diff --git a/libdap4/d4http.h b/libdap4/d4http.h
new file mode 100644
index 0000000..dbd307a
--- /dev/null
+++ b/libdap4/d4http.h
@@ -0,0 +1,24 @@
+/*********************************************************************
+  *   Copyright 2016, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+
+#ifndef D4HTTP_H
+#define D4HTTP_H 1
+
+extern int curlopen(CURL** curlp);
+extern void curlclose(CURL*);
+
+extern ncerror ncd4_fetchurl(CURL*, const char*, NCbytes*, long*, struct credentials*);
+extern ncerror ncd4_fetchurl_file(CURL*, const char*, FILE*, d4size_t*, long*);
+
+extern long ncd4_fetchhttpcode(CURL* curl);
+
+extern ncerror ncd4_fetchlastmodified(CURL* curl, char* url, long* filetime);
+
+extern ncerror ncd4_curlopen(CURL** curlp);
+extern void ncd4_curlclose(CURL* curlp);
+
+extern ncerror ncd4_ping(const char* url);
+
+#endif /*D4HTTP_H*/
diff --git a/libdap4/d4includes.h b/libdap4/d4includes.h
new file mode 100644
index 0000000..dfcb152
--- /dev/null
+++ b/libdap4/d4includes.h
@@ -0,0 +1,50 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#ifndef D4INCLUDES_H
+#define D4INCLUDES_H 1
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <curl/curl.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#ifdef HAVE_GETRLIMIT
+#  ifdef HAVE_SYS_RESOURCE_H
+#    include <sys/time.h>
+#  endif
+#  ifdef HAVE_SYS_RESOURCE_H
+#    include <sys/resource.h>
+#  endif
+#endif
+
+#include "netcdf.h"
+#include "nc.h"
+#include "ncbytes.h"
+#include "nclist.h"
+#include "ncuri.h"
+#include "nclog.h"
+#include "ncdap.h"
+
+#include "d4util.h"
+
+#include "ncd4types.h"
+#include "ncd4.h"
+
+#include "d4debug.h"
+#include "d4chunk.h"
+
+#endif /*D4INCLUDES_H*/
+
diff --git a/libdap4/d4meta.c b/libdap4/d4meta.c
new file mode 100644
index 0000000..a0c4c42
--- /dev/null
+++ b/libdap4/d4meta.c
@@ -0,0 +1,1112 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include <stdarg.h>
+#include "nc4internal.h"
+#include "ncoffsets.h"
+#include "ezxml.h"
+
+/**
+ * Build the netcdf-4 metadata from the NCD4node nodes.
+ */
+
+/***************************************************/
+/* Forwards */
+
+static char* backslashEscape(const char* s);
+static char* getFieldFQN(NCD4node* field, const char* tail);
+static int build(NCD4meta* builder, NCD4node* root);
+static int buildAtomicVar(NCD4meta* builder, NCD4node* var);
+static int buildAttributes(NCD4meta* builder, NCD4node* varorgroup);
+static int buildBytestringType(NCD4meta* builder);
+static int buildCompound(NCD4meta* builder, NCD4node* cmpdtype, NCD4node* group, char* name);
+static int buildDimension(NCD4meta* builder, NCD4node* dim);
+static int buildEnumeration(NCD4meta* builder, NCD4node* en);
+static int buildGroups(NCD4meta*, NCD4node* parent);
+static int buildMaps(NCD4meta* builder, NCD4node* var);
+static int buildMetaData(NCD4meta* builder, NCD4node* var);
+static int buildOpaque(NCD4meta* builder, NCD4node* op);
+static int buildSequence(NCD4meta* builder, NCD4node* seq);
+static int buildStructure(NCD4meta* builder, NCD4node* structvar);
+static int buildStructureType(NCD4meta* builder, NCD4node* structtype);
+static int buildVariable(NCD4meta* builder, NCD4node* var);
+static int buildVlenType(NCD4meta* builder, NCD4node* seqtype);
+static int compileAttrValues(NCD4meta* builder, NCD4node* basetype, NClist* values, void** memoryp);
+static void computeOffsets(NCD4meta* builder, NCD4node* cmpd);
+static int convertString(union ATOMICS* converter, NCD4node* type, const char* s);
+static void* copyAtomic(union ATOMICS* converter, nc_type type, size_t len, void* dst);
+static int decodeEconst(NCD4meta* builder, NCD4node* enumtype, const char* nameorval, union ATOMICS* converter);
+static int downConvert(union ATOMICS* converter, NCD4node* type);
+static void freeStringMemory(char** mem, int count);
+static size_t getDimrefs(NCD4node* var, int* dimids);
+static size_t getDimsizes(NCD4node* var, size_t* dimsizes);
+static void reclaimNode(NCD4node* node);
+static d4size_t getpadding(d4size_t offset, size_t alignment);
+static int markdapsize(NCD4meta* meta);
+static int markfixedsize(NCD4meta* meta);
+static void savegroupbyid(NCD4meta*,NCD4node* group);
+static void savevarbyid(NCD4node* group, NCD4node* var);
+
+/***************************************************/
+/* API */
+
+int
+NCD4_metabuild(NCD4meta* metadata, int ncid)
+{
+    int ret = NC_NOERR;
+    int i;
+
+    metadata->ncid = ncid;
+    metadata->root->meta.id = ncid;
+
+    /* Fix up the atomic types */
+    for(i=0;i<nclistlength(metadata->allnodes);i++) {
+	NCD4node* n = (NCD4node*)nclistget(metadata->allnodes,i);
+	if(n->sort != NCD4_TYPE) continue;
+	if(n->subsort > NC_MAX_ATOMIC_TYPE) continue;
+	n->meta.id = n->subsort;
+        n->meta.isfixedsize = (n->subsort == NC_STRING ? 0 : 1);
+	if(n->subsort <= NC_STRING)
+	    n->meta.dapsize = NCD4_typesize(n->subsort);
+    }
+
+    /* Topo sort the set of all nodes */
+    NCD4_toposort(metadata);
+    markfixedsize(metadata);
+    markdapsize(metadata);
+    /* Process the metadata state */
+    ret = build(metadata,metadata->root);
+    /* Done with the metadata*/
+    if((ret=nc_enddef(metadata->ncid)))
+	goto done;
+
+done:
+    return THROW(ret);
+}
+
+
+/* Create an empty NCD4meta object for
+   use in subsequent calls
+   (is the the right src file to hold this?)
+*/
+
+NCD4meta*
+NCD4_newmeta(size_t rawsize, void* rawdata)
+{
+    NCD4meta* meta = (NCD4meta*)calloc(1,sizeof(NCD4meta));
+    if(meta == NULL) return NULL;
+    meta->allnodes = nclistnew();
+    meta->serial.rawsize = rawsize;
+    meta->serial.rawdata = rawdata;
+#ifdef D4DEBUG
+    meta->debuglevel = 1;
+#endif
+    return meta;
+}
+
+void
+NCD4_setdebuglevel(NCD4meta* meta, int debuglevel)
+{
+    meta->debuglevel = debuglevel;
+}
+
+void
+NCD4_reclaimMeta(NCD4meta* dataset)
+{
+    int i;
+    if(dataset == NULL) return;
+    for(i=0;i<nclistlength(dataset->allnodes);i++) {
+	NCD4node* node = (NCD4node*)nclistget(dataset->allnodes,i);
+	reclaimNode(node);
+    } 
+    nullfree(dataset->error.parseerror);
+    nullfree(dataset->error.message);
+    nullfree(dataset->error.context);
+    nullfree(dataset->error.otherinfo);
+    nullfree(dataset->serial.errdata);
+    nclistfree(dataset->groupbyid);
+#if 0
+    for(i=0;i<nclistlength(dataset->blobs);i++) {
+	void* p = nclistget(dataset->blobs,i);
+	nullfree(p);
+    }
+    nclistfree(dataset->blobs);
+#endif
+    nclistfree(dataset->allnodes);
+    nullfree(dataset->serial.dmr);
+    free(dataset);
+}
+
+static void
+reclaimNode(NCD4node* node)
+{
+    if(node == NULL) return;
+    nullfree(node->name);
+    nclistfree(node->groups);
+    nclistfree(node->vars);
+    nclistfree(node->types);
+    nclistfree(node->dims);
+    nclistfree(node->attributes);
+    nclistfree(node->maps);
+    nclistfreeall(node->xmlattributes);
+    nclistfreeall(node->attr.values);
+    nclistfree(node->en.econsts);
+    nclistfree(node->group.elements);
+    nullfree(node->group.dapversion);
+    nullfree(node->group.dmrversion);
+    nullfree(node->group.datasetname);
+    nclistfree(node->group.varbyid);
+    nullfree(node->nc4.orig.name);
+}
+
+/**************************************************/
+
+/* Recursively walk the tree to create the metadata */
+static int
+build(NCD4meta* builder, NCD4node* root)
+{
+    int i,ret = NC_NOERR;
+    size_t len = nclistlength(builder->allnodes);
+
+    /* Tag the root group */
+    savegroupbyid(builder,root);
+
+    /* Compute the sizes for all type objects. Will of necessity
+       compute the offsets for compound types as well
+    */
+    for(i=0;i<len;i++) {/* Walk in postfix order */
+	NCD4node* x = (NCD4node*)nclistget(builder->allnodes,i);
+	if(x->sort != NCD4_TYPE) continue;
+	switch (x->subsort) {
+	case NC_OPAQUE:
+	case NC_ENUM:
+	case NC_SEQ:
+	default: /* Atomic */
+	    x->meta.memsize = NCD4_computeTypeSize(builder,x);
+	    x->meta.alignment = x->meta.memsize; /* Same for these cases */
+	    break;
+	case NC_STRUCT:
+	    /* We need to compute the field offsets in order to compute the struct size */
+	    computeOffsets(builder,x);
+	    break;		
+        }
+    }
+
+    /* Start by defining  group tree separately so we can maintain
+       order */
+    if((ret=buildGroups(builder,root))) goto done;
+
+    /* Now, walks selected other nodes to define the netcdf-4 substrate metadata */
+
+    /* Walk and define the dimensions */
+    for(i=0;i<len;i++) {/* Walk in postfix order */
+	NCD4node* x = (NCD4node*)nclistget(builder->allnodes,i);
+	if(x->sort != NCD4_DIM) continue;
+        if((ret=buildDimension(builder,x)))
+	    goto done;
+    }
+
+    /* Walk and define the enums */
+    for(i=0;i<len;i++) {/* Walk in postfix order */
+	NCD4node* x = (NCD4node*)nclistget(builder->allnodes,i);
+	if(x->sort != NCD4_TYPE) continue;
+	if(x->subsort != NC_ENUM) continue;
+        if((ret=buildEnumeration(builder,x)))
+	    goto done;
+    }
+
+    /* Walk and define the opaques */
+    /* If _bytestring was required by parser, then create it */
+    if(builder->_bytestring != NULL && (ret = buildBytestringType(builder)))
+	goto done;
+    /* Create other opaque types */
+    for(i=0;i<len;i++) {/* Walk in postfix order */
+	NCD4node* x = (NCD4node*)nclistget(builder->allnodes,i);
+	if(x->sort != NCD4_TYPE) continue;
+	if(x->subsort != NC_OPAQUE) continue;
+	if(x->opaque.size > 0 && (ret=buildOpaque(builder,x)))
+	    goto done;
+    }
+
+    /* Walk and define the compounds and sequences */
+    for(i=0;i<len;i++) {/* Walk in postfix order */
+	NCD4node* x = (NCD4node*)nclistget(builder->allnodes,i);
+	if(x->sort != NCD4_TYPE) continue;
+	switch(x->subsort) {
+	case NC_STRUCT:
+	    if((ret=buildStructureType(builder,x)))
+		goto done;
+	    break;
+	case NC_SEQ:
+	    if((ret=buildVlenType(builder,x)))
+		goto done;
+	    break;
+	default: /* ignore */ break;
+	}
+    }
+
+    /* Compute the type size for all type */
+    for(i=0;i<len;i++) {/* Walk in postfix order */
+	NCD4node* x = (NCD4node*)nclistget(builder->allnodes,i);
+	if(x->sort != NCD4_TYPE) continue;;
+        NCD4_computeTypeSize(builder,x);
+    }
+
+    /* Finally, define the top-level variables */
+    for(i=0;i<len;i++) {
+	NCD4node* x = (NCD4node*)nclistget(builder->allnodes,i);
+	if(ISVAR(x->sort) && ISTOPLEVEL(x)) buildVariable(builder,x);
+    }
+
+done:
+    return THROW(ret);
+}
+
+static int
+buildGroups(NCD4meta* builder, NCD4node* parent)
+{
+    int i,ret=NC_NOERR;
+#ifdef D4DEBUG
+    fprintf(stderr,"build group: %s\n",parent->name);
+#endif
+    /* Define any group level attributes */
+    if((ret = buildAttributes(builder,parent))) goto done;    
+
+    for(i=0;i<nclistlength(parent->groups);i++) {
+	NCD4node* g = (NCD4node*)nclistget(parent->groups,i);
+        if(g->group.isdataset) {
+	    g->meta.id = builder->ncid;
+        } else {
+	    NCCHECK((nc_def_grp(parent->meta.id,g->name,&g->meta.id)));
+	    savegroupbyid(builder,g);
+        }
+	if((ret=buildGroups(builder,g))) goto done; /* recurse */
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+buildDimension(NCD4meta* builder, NCD4node* dim)
+{
+    int ret = NC_NOERR;
+    NCD4node* group = NCD4_groupFor(dim);
+    if(dim->dim.isunlimited) {
+	NCCHECK((nc_def_dim(group->meta.id,dim->name,NC_UNLIMITED,&dim->meta.id)));
+    } else {    
+	NCCHECK((nc_def_dim(group->meta.id,dim->name,(size_t)dim->dim.size,&dim->meta.id)));
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+buildEnumeration(NCD4meta* builder, NCD4node* en)
+{
+    int i,ret = NC_NOERR;
+    NCD4node* group = NCD4_groupFor(en);
+    NCCHECK((nc_def_enum(group->meta.id,en->basetype->meta.id,en->name,&en->meta.id)));
+    for(i=0;i<nclistlength(en->en.econsts);i++) {	
+	NCD4node* ec = (NCD4node*)nclistget(en->en.econsts,i);
+	NCCHECK((nc_insert_enum(group->meta.id, en->meta.id, ec->name, ec->en.ecvalue.i8)));
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+buildOpaque(NCD4meta* builder, NCD4node* op)
+{
+    int ret = NC_NOERR;
+    NCD4node* group = NCD4_groupFor(op);
+    char* name  = op->name;
+
+    assert(op->opaque.size > 0);
+    /* Two cases, with and without UCARTAGORIGTYPE */
+    if(op->nc4.orig.name != NULL) {
+	name = op->nc4.orig.name;
+	group = op->nc4.orig.group;		
+    }
+    NCCHECK((nc_def_opaque(group->meta.id,op->opaque.size,name,&op->meta.id)));
+done:
+    return THROW(ret);
+}
+
+static int
+buildBytestringType(NCD4meta* builder)
+{
+    int ret = NC_NOERR;
+    NCD4node* bstring = builder->_bytestring;
+
+    assert(bstring != NULL); /* Will fail if we need bytestring and it was not created in d4parse*/
+
+    /* Define once */
+    if(bstring->meta.id > 0) goto done;
+    /* create in root as ubyte(*) vlen named "_bytestring" */
+    NCCHECK((nc_def_vlen(builder->root->meta.id,bstring->name,NC_UBYTE,&bstring->meta.id)));
+
+done:
+    return THROW(ret);
+}
+
+static int
+buildVariable(NCD4meta* builder, NCD4node* var)
+{
+    int ret = NC_NOERR;
+
+    switch (var->subsort) {
+    default:
+	if((ret = buildAtomicVar(builder,var))) goto done;
+	break;
+    case NC_STRUCT:
+	if((ret = buildStructure(builder,var))) goto done;
+	break;
+    case NC_SEQ:
+	if((ret = buildSequence(builder,var))) goto done;
+	break;
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+buildMetaData(NCD4meta* builder, NCD4node* var)
+{
+    int ret = NC_NOERR;
+    if((ret = buildAttributes(builder,var))) goto done;    
+    if((ret = buildMaps(builder,var))) goto done;    
+done:
+    return THROW(ret);
+}
+
+static int
+buildMaps(NCD4meta* builder, NCD4node* var)
+{
+    int i,ret = NC_NOERR;
+    size_t count = nclistlength(var->maps);
+    char** memory = NULL;
+    char** p;
+    NCD4node* group;
+
+    if(count == 0) goto done;
+
+    /* Add an attribute to the parent variable
+       listing fqn's of all specified variables in map order*/
+    memory = (char**)d4alloc(count*sizeof(char*));
+    if(memory == NULL) {ret=NC_ENOMEM; goto done;}
+    p = memory;
+    for(i=0;i<count;i++) {
+        NCD4node* mapref = (NCD4node*)nclistget(var->maps,i);
+	char* fqn = NCD4_makeFQN(mapref);
+        *p++ = fqn;
+    }
+    /* Make map info visible in the netcdf-4 file */
+    group = NCD4_groupFor(var);
+    NCCHECK((nc_put_att(group->meta.id,var->meta.id,NC4TAGMAPS,NC_STRING,count,memory)));
+done:
+    if(memory != NULL)
+	freeStringMemory(memory,count);
+    return THROW(ret);
+}
+
+static int
+buildAttributes(NCD4meta* builder, NCD4node* varorgroup)
+{
+    int i,ret = NC_NOERR;
+
+    for(i=0;i<nclistlength(varorgroup->attributes);i++) {
+	NCD4node* attr = nclistget(varorgroup->attributes,i);
+	void* memory = NULL;
+	size_t count = nclistlength(attr->attr.values);
+	NCD4node* group;
+        int varid;
+
+	/* Supress all UCARTAG attributes */
+	if(strncmp(attr->name,UCARTAG,strlen(UCARTAG)) == 0)
+	    continue;
+
+	if(ISGROUP(varorgroup->sort))
+	    varid = NC_GLOBAL;
+	else
+	    varid = varorgroup->meta.id;
+        if((ret=compileAttrValues(builder,attr->basetype,attr->attr.values,&memory))) {
+	        nullfree(memory);
+                FAIL(NC_ERANGE,"Malformed attribute value(s) for: %s",attr->name);
+        }
+	group = NCD4_groupFor(varorgroup);
+        NCCHECK((nc_put_att(group->meta.id,varid,attr->name,attr->basetype->meta.id,count,memory)));
+        nullfree(memory);
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+buildStructureType(NCD4meta* builder, NCD4node* structtype)
+{
+    int tid,ret = NC_NOERR;
+    NCD4node* group = NULL;
+    char* name = NULL;
+
+    group = NCD4_groupFor(structtype); /* default */
+
+    /* Figure out the type name and containing group */
+    if(structtype->nc4.orig.name != NULL) {
+	name = strdup(structtype->nc4.orig.name);
+	group = structtype->nc4.orig.group;
+    } else {
+        name = getFieldFQN(structtype,"_t");
+    }
+
+    /* Step 2: See if already defined */
+    if(nc_inq_typeid(group->meta.id,name,&tid) == NC_NOERR) {/* Already exists */
+	FAIL(NC_ENAMEINUSE,"Inferred type name conflict",name);
+    }    
+
+    /* Since netcdf does not support forward references,
+       we presume all field types are defined */
+    if((ret=buildCompound(builder,structtype,group,name))) goto done;
+
+done:
+    nullfree(name);
+    return THROW(ret);
+}
+
+static int
+buildVlenType(NCD4meta* builder, NCD4node* vlentype)
+{
+    int ret = NC_NOERR;
+    NCD4node* group;
+    NCD4node* basetype;
+    nc_type tid = NC_NAT;
+    char* name = NULL;
+
+    group = NCD4_groupFor(vlentype);
+
+    /* Figure out the type name and containing group */
+    if(vlentype->nc4.orig.name != NULL) {
+	name = strdup(vlentype->nc4.orig.name);
+	group = vlentype->nc4.orig.group;
+    } else {
+        name = getFieldFQN(vlentype,NULL);
+    }
+
+    /* See if already defined */
+    if(nc_inq_typeid(group->meta.id,name,&tid) == NC_NOERR) {/* Already exists */
+	FAIL(NC_ENAMEINUSE,"Inferred type name conflict",name);
+    }    
+
+    /* Get the baseline type */
+    basetype = vlentype->basetype;
+    /* build the vlen type */
+    NCCHECK(nc_def_vlen(group->meta.id, name, basetype->meta.id, &vlentype->meta.id));
+
+done:
+    nullfree(name);
+    return THROW(ret);
+}
+
+static int
+buildCompound(NCD4meta* builder, NCD4node* cmpdtype, NCD4node* group, char* name)
+{
+    int i,ret = NC_NOERR;
+
+    /* Step 1: compute field offsets */
+    computeOffsets(builder,cmpdtype);
+
+    /* Step 2: define this node's compound type */
+    NCCHECK((nc_def_compound(group->meta.id,(size_t)cmpdtype->meta.memsize,name,&cmpdtype->meta.id)));
+
+    /* Step 3: add the fields to type */
+    for(i=0;i<nclistlength(cmpdtype->vars);i++) {  
+	int rank;
+	size_t dimsizes[NC_MAX_VAR_DIMS];
+        NCD4node* field = (NCD4node*)nclistget(cmpdtype->vars,i);
+	rank = nclistlength(field->dims);
+        if(rank == 0) { /* scalar */
+            NCCHECK((nc_insert_compound(group->meta.id, cmpdtype->meta.id,
+					field->name, field->meta.offset,
+					field->basetype->meta.id)));
+        } else if(rank > 0) { /* array  */
+	    getDimsizes(field,dimsizes);
+            NCCHECK((nc_insert_array_compound(group->meta.id, cmpdtype->meta.id,
+					      field->name, field->meta.offset,
+					      field->basetype->meta.id,
+					      rank, dimsizes)));
+	}
+    }
+
+done:
+    return THROW(ret);
+}
+
+static int
+buildAtomicVar(NCD4meta* builder, NCD4node* var)
+{
+    int ret = NC_NOERR;
+    size_t rank;
+    int dimids[NC_MAX_VAR_DIMS];
+    NCD4node* group;
+
+    group = NCD4_groupFor(var);
+
+#ifdef D4DEBUG
+    fprintf(stderr,"build var: %s.%s\n",group->name,var->name); fflush(stderr);
+#endif
+
+    rank = getDimrefs(var,dimids);
+    NCCHECK((nc_def_var(group->meta.id,var->name,var->basetype->meta.id,rank,dimids,&var->meta.id)));
+    /* Tag the var */
+    savevarbyid(group,var);
+
+    /* Build attributes and map attributes */
+    if((ret = buildMetaData(builder,var))) goto done;    
+done:
+    return THROW(ret);
+}
+
+static int
+buildStructure(NCD4meta* builder, NCD4node* structvar)
+{
+    int ret = NC_NOERR;
+    NCD4node* group;
+    int rank;
+    int dimids[NC_MAX_VAR_DIMS];
+
+    /* Step 1: define the variable */
+    rank = nclistlength(structvar->dims);
+    getDimrefs(structvar,dimids);
+    group = NCD4_groupFor(structvar);
+    NCCHECK((nc_def_var(group->meta.id,structvar->name,structvar->basetype->meta.id,rank,dimids,&structvar->meta.id)));
+    /* Tag the var */
+    savevarbyid(group,structvar);
+
+    /* Build attributes and map attributes WRT the variable */
+    if((ret = buildMetaData(builder,structvar))) goto done;    
+
+done:
+    return THROW(ret);
+}
+
+static int
+buildSequence(NCD4meta* builder, NCD4node* seq)
+{
+
+    int ret = NC_NOERR;
+    NCD4node* group;
+    int rank;
+    int dimids[NC_MAX_VAR_DIMS];
+
+    rank = nclistlength(seq->dims);
+    getDimrefs(seq,dimids);
+    group = NCD4_groupFor(seq);
+    NCCHECK((nc_def_var(group->meta.id,seq->name,seq->basetype->meta.id,rank,dimids,&seq->meta.id)));
+    savevarbyid(group,seq);
+
+    /* Build attributes and map attributes WRT the variable */
+    if((ret = buildMetaData(builder,seq))) goto done;    
+
+done:
+    return THROW(ret);
+}
+
+/***************************************************/
+/* Utilities */
+
+/* Insert a group into the groupbyid for a group */
+static void
+savegroupbyid(NCD4meta* meta, NCD4node* group)
+{
+    if(meta->groupbyid == NULL)
+        meta->groupbyid = nclistnew();
+    nclistsetalloc(meta->groupbyid,GROUPIDPART(group->meta.id));
+    nclistinsert(meta->groupbyid,GROUPIDPART(group->meta.id),group);
+}
+
+/* Insert a var into the varbyid for a group */
+static void
+savevarbyid(NCD4node* group, NCD4node* var)
+{
+    if(group->group.varbyid == NULL)
+        group->group.varbyid = nclistnew();
+    nclistsetalloc(group->group.varbyid,var->meta.id);
+    nclistinsert(group->group.varbyid,var->meta.id,var);
+}
+
+/* Collect FQN path from node upto (but not including)
+   the first enclosing group and create an name from it
+*/
+static char*
+getFieldFQN(NCD4node* field, const char* tail)
+{
+    int i;
+    NCD4node* x = NULL;
+    NClist* path = NULL;
+    NCbytes* fqn =  NULL;
+    char* result;
+
+    path = nclistnew();
+    for(x=field;!ISGROUP(x->sort);x=x->container) {
+	nclistinsert(path,0,x);
+    }
+    fqn = ncbytesnew();
+    for(i=0;i<nclistlength(path);i++) {
+	NCD4node* elem = (NCD4node*)nclistget(path,i);
+	char* escaped = backslashEscape(elem->name);
+	if(escaped == NULL) return NULL;
+	if(i > 0) ncbytesappend(fqn,'.');
+	ncbytescat(fqn,escaped);
+	free(escaped);
+    }
+    if(tail != NULL)
+        ncbytescat(fqn,tail);
+    result = ncbytesextract(fqn);
+    ncbytesfree(fqn);
+    return result;    
+}
+
+static size_t
+getDimrefs(NCD4node* var, int* dimids)
+{
+    int i;
+    int rank = nclistlength(var->dims);
+    for(i=0;i<rank;i++) {
+	NCD4node* dim = (NCD4node*)nclistget(var->dims,i);
+	dimids[i] = dim->meta.id;
+    }
+    return rank;
+}
+
+static size_t
+getDimsizes(NCD4node* var, size_t* dimsizes)
+{
+    int i;
+    int rank = nclistlength(var->dims);
+    for(i=0;i<rank;i++) {
+	NCD4node* dim = (NCD4node*)nclistget(var->dims,i);
+	dimsizes[i] = dim->dim.size;
+    }
+    return rank;
+}
+
+/**************************************************/
+/* Utilities */
+
+static void
+freeStringMemory(char** mem, int count)
+{
+    int i;
+    if(mem == NULL) return;
+    for(i=0;i<count;i++) {
+	char* p = mem[i];
+        if(p) free(p);
+    }
+    free(mem);
+}
+
+/**
+Convert a list of attribute value strings
+into a memory chunk capable of being passed
+to nc_put_att().
+*/
+static int
+compileAttrValues(NCD4meta* builder, NCD4node* basetype, NClist* values, void** memoryp)
+{
+    int i,ret = NC_NOERR;
+    int count = nclistlength(values);
+    unsigned char* memory = NULL;
+    unsigned char* p;
+    size_t size;
+    NCD4node* truebase = NULL;
+    union ATOMICS converter;
+    int isenum = 0;
+
+    isenum = (basetype->subsort == NC_ENUM);
+    truebase = (isenum ? basetype->basetype : basetype);
+    if(!ISTYPE(truebase->sort) || (truebase->meta.id > NC_MAX_ATOMIC_TYPE))
+        FAIL(NC_EBADTYPE,"Illegal attribute type: %s",basetype->name);
+    size = NCD4_typesize(truebase->meta.id);
+    if((memory = (char*)d4alloc(count*size))==NULL)
+        return THROW(NC_ENOMEM);
+    p = memory;
+    for(i=0;i<count;i++) {
+        char* s = (char*)nclistget(values,i);
+        if(isenum) {
+            if((ret=decodeEconst(builder,basetype,s,&converter)))
+                FAIL(ret,"Illegal enum const: ",s);
+        } else {
+            if((ret = convertString(&converter,basetype,s)))
+            FAIL(NC_EBADTYPE,"Illegal attribute type: ",basetype->name);
+        }
+        ret = downConvert(&converter,truebase);
+        p = copyAtomic(&converter,truebase->meta.id,NCD4_typesize(truebase->meta.id),p);
+    }
+    if(memoryp) *memoryp = memory;
+done:
+    return THROW(ret);
+}
+
+static void*
+copyAtomic(union ATOMICS* converter, nc_type type, size_t len, void* dst)
+{
+    switch (type) {
+    case NC_CHAR: case NC_BYTE: case NC_UBYTE:
+        memcpy(dst,&converter->u8[0],len); break;
+    case NC_SHORT: case NC_USHORT:
+        memcpy(dst,&converter->u16[0],len); break;
+    case NC_INT: case NC_UINT:
+        memcpy(dst,&converter->u32[0],len); break;
+    case NC_INT64: case NC_UINT64:
+        memcpy(dst,&converter->u64[0],len); break;
+    case NC_FLOAT:
+        memcpy(dst,&converter->f32[0],len); break;
+    case NC_DOUBLE:
+        memcpy(dst,&converter->f64[0],len); break;
+    case NC_STRING:
+        memcpy(dst,&converter->s[0],len); break;
+        converter->s[0] = NULL; /* avoid duplicate free */
+    }/*switch*/
+    return (((char*)dst)+len);
+}
+
+static int
+convertString(union ATOMICS* converter, NCD4node* type, const char* s)
+{
+    switch (type->subsort) {
+    case NC_BYTE:
+    case NC_SHORT:
+    case NC_INT:
+    case NC_INT64:
+	if(sscanf(s,"%lld",&converter->i64) != 1) return THROW(NC_ERANGE);
+	break;
+    case NC_UBYTE:
+    case NC_USHORT:
+    case NC_UINT:
+    case NC_UINT64:
+	if(sscanf(s,"%llu",&converter->u64) != 1) return THROW(NC_ERANGE);
+	break;
+    case NC_FLOAT:
+    case NC_DOUBLE:
+	if(sscanf(s,"%lf",&converter->f64) != 1) return THROW(NC_ERANGE);
+	break;
+    case NC_CHAR:
+	converter->i8[0] = s[0];
+	break;
+    case NC_STRING:
+	converter->s[0]= strdup(s);
+	break;
+    }/*switch*/
+    return downConvert(converter,type);
+}
+
+static int
+downConvert(union ATOMICS* converter, NCD4node* type)
+{
+    d4size_t u64 = converter->u64[0];
+    long long i64 = converter->i64[0];
+    double f64 = converter->f64[0];
+    char* s = converter->s[0];
+    switch (type->subsort) {
+    case NC_CHAR:
+    case NC_BYTE:
+	converter->i8[0] = (char)i64;
+	break;
+    case NC_UBYTE:
+	converter->u8[0] = (unsigned char)u64;
+	break;
+    case NC_SHORT:
+	converter->i16[0] = (short)i64;
+	break;
+    case NC_USHORT:
+	converter->u16[0] = (unsigned short)u64;
+	break;
+    case NC_INT:
+	converter->i32[0] = (int)i64;
+	break;
+    case NC_UINT:
+	converter->u32[0] = (unsigned int)u64;
+	break;
+    case NC_INT64:
+	converter->i64[0] = i64;
+	break;
+    case NC_UINT64:
+	converter->u64[0]= u64;
+	break;
+    case NC_FLOAT:
+	converter->f32[0] = (float)f64;
+	break;
+    case NC_DOUBLE:
+	converter->f64[0] = f64;
+	break;
+    case NC_STRING:
+	converter->s[0]= s;
+	break;
+    }/*switch*/
+    return THROW(NC_NOERR);
+}
+
+/*
+Given an enum type, and a string representing an econst,
+convert to integer.
+Note: this will work if the econst string is a number or a econst name
+*/
+static int
+decodeEconst(NCD4meta* builder, NCD4node* enumtype, const char* nameorval, union ATOMICS* converter)
+{
+    int i,ret=NC_NOERR;
+    union ATOMICS number;
+    NCD4node* match = NULL;
+
+    /* First, see if the value is an econst name */
+    for(i=0;i<nclistlength(enumtype->en.econsts);i++) {
+        NCD4node* ec = (NCD4node*)nclistget(enumtype->en.econsts,i);
+        if(strcmp(ec->name,nameorval)==0) {match = ec; break;}
+    }
+    /* If no match, try to invert as a number to see if there is a matching econst */
+    if(!match) {
+        /* get the incoming value as number */
+        if((ret=convertString(&number,enumtype->basetype,nameorval)))
+            goto done;
+        for(i=0;i<nclistlength(enumtype->en.econsts);i++) {
+            NCD4node* ec = (NCD4node*)nclistget(enumtype->en.econsts,i);
+            if(ec->en.ecvalue.u64[0] == number.u64[0]) {match = ec; break;}
+        }
+    }
+    if(match == NULL)
+        FAIL(NC_EINVAL,"No enum const matching value: %s",nameorval);
+    if(converter) *converter = match->en.ecvalue;
+done:
+    return THROW(ret);
+}
+
+static char*
+backslashEscape(const char* s)
+{
+    const char* p;
+    char* q;
+    size_t len;
+    char* escaped = NULL;
+
+    len = strlen(s);
+    escaped = (char*)d4alloc(1+(2*len)); /* max is everychar is escaped */
+    if(escaped == NULL) return NULL;
+    for(p=s,q=escaped;*p;p++) {
+        char c = *p;
+        switch (c) {
+        case '\\':
+        case '/':
+        case '.':
+        case '@':
+            *q++ = '\\'; *q++ = '\\';
+            break;
+        default: *q++ = c; break;
+        }
+    }
+    *q = '\0';
+    return escaped;
+}
+
+/* Tag each compound type as fixed size or not
+   Assumes:
+	- atomic types defined and marked
+	- topo sorted
+*/
+
+static int
+markfixedsize(NCD4meta* meta)
+{
+    int i,j;
+    for(i=0;i<nclistlength(meta->allnodes);i++) {
+	int fixed = 1;
+	NCD4node* n = (NCD4node*)nclistget(meta->allnodes,i);
+	if(n->sort != NCD4_TYPE) continue;
+	switch (n->subsort) {
+	case NC_STRUCT:
+            for(j=0;j<nclistlength(n->vars);j++) {  
+                NCD4node* field = (NCD4node*)nclistget(n->vars,j);
+	        if(!field->basetype->meta.isfixedsize) {
+		    fixed = 0;
+		    break;
+	        }
+	    }
+	    n->meta.isfixedsize = fixed;
+	    break;
+	case NC_ENUM:
+	    n->meta.isfixedsize = 1;
+	    break;	
+	default: /* leave as is */
+	    break;
+	}
+    }
+    return NC_NOERR;
+}
+
+/* Compute compound type field offsets and compound type total size */
+static void
+computeOffsets(NCD4meta* builder, NCD4node* cmpd)
+{
+    int i;
+    d4size_t offset = 0;
+    d4size_t largestalign = 1;
+    d4size_t size = 0;
+
+    for(i=0;i<nclistlength(cmpd->vars);i++) {
+	NCD4node* field = (NCD4node*)nclistget(cmpd->vars,i);
+	NCD4node* ftype = field->basetype;
+	size_t alignment;
+	if(ftype->subsort == NC_STRUCT) {
+	    /* Recurse */
+	    computeOffsets(builder, ftype);
+	    assert(ftype->meta.memsize > 0);
+	    size=ftype->meta.memsize;
+	    alignment = ftype->meta.alignment;
+	} else {/* Size and alignment will already have been set */
+	    assert(ftype->meta.memsize > 0);
+	    alignment = ftype->meta.alignment;
+            size=ftype->meta.memsize;
+	}
+#if 0
+	} else if(ftype->subsort == NC_SEQ) { /* VLEN */
+	    alignment = nctypealignment(NC_VLEN);
+	    assert(ftype->meta.memsize > 0); size=ftype->meta.memsize;
+	    //size = NCD4_computeTypeSize(builder,ftype);
+	} else if(ftype->subsort == NC_OPAQUE) {
+	    /* Either fixed or a vlen */
+	    assert(ftype->meta.memsize > 0); size=ftype->meta.memsize;
+	    if(ftype->opaque.size == 0) {/* treat like vlen */
+	        alignment = nctypealignment(NC_VLEN);
+	        //size = NCD4_computeTypeSize(builder,ftype);
+	    } else { /* fixed size */
+	        alignment = nctypealignment(NC_OPAQUE);
+	        //size = NCD4_computeTypeSize(builder,ftype);
+	    }
+	} else if(ftype->subsort == NC_ENUM) {
+	    NCD4node* truetype = ftype->basetype;
+	    alignment = nctypealignment(truetype->meta.id);
+	    assert(ftype->meta.memsize > 0); size=ftype->meta.memsize;
+	    //size = NCD4_computeTypeSize(builder,truetype);
+	} else { /* Basically a primitive */
+	    alignment = nctypealignment(ftype->meta.id);
+	    assert(ftype->meta.memsize > 0); size=ftype->meta.memsize;
+	    //size = NCD4_computeTypeSize(builder,ftype);
+	}
+#endif
+        if(alignment > largestalign)
+	    largestalign = alignment;
+	/* Add possible padding wrt to previous field */
+	offset += getpadding(offset,alignment);	
+	field->meta.offset = offset;
+	assert(ftype->meta.memsize > 0);
+	size = ftype->meta.memsize;
+	//field->meta.memsize = size;
+	/* Now ultiply by the field dimproduct*/
+	if(nclistlength(field->dims) > 0) {
+            d4size_t count = NCD4_dimproduct(field);
+	    size = (size * count);
+	}
+	offset += size;
+    }
+    /* Compute compound-level info */
+    /* A struct alignment is the same as largestalign */
+    cmpd->meta.alignment = largestalign;
+    offset += (offset % largestalign); /* round up compound size */
+    cmpd->meta.memsize = offset;
+}
+
+/*
+Compute the in-memory size of an instance of a type.
+Note that nc_inq_type is used, so that C struct field
+alignment is taken into account for compound types.
+The variables total size will be this * dimproduct.
+*/
+size_t
+NCD4_computeTypeSize(NCD4meta* builder, NCD4node* type)
+{
+    size_t size = 0;
+
+    switch (type->sort) {
+    case NCD4_TYPE:
+	switch (type->subsort) {
+	default: size = NCD4_typesize(type->meta.id); break;
+        case NC_OPAQUE:
+            size = (type->opaque.size == 0 ? sizeof(nc_vlen_t) : type->opaque.size);
+  	    break;
+        case NC_ENUM:
+   	    size = NCD4_computeTypeSize(builder,type->basetype);
+	    break;
+        case NC_SEQ:
+	    size = sizeof(nc_vlen_t);
+	    break;
+        case NC_STRUCT: {
+	    int ret;
+	    NCD4node* group = NCD4_groupFor(type);
+	    if((ret = nc_inq_type(group->meta.id,type->meta.id,/*name*/NULL,&size)))
+		return 0;
+	    }; break;
+        }
+        break;
+    default: break; /* ignore */
+    }        
+    type->meta.memsize = size;
+    return size;
+}
+
+static d4size_t
+getpadding(d4size_t offset, size_t alignment)
+{
+    d4size_t rem = (alignment==0?0:(offset % alignment));
+    d4size_t pad = (rem==0?0:(alignment - rem));
+    return pad;
+}
+
+/* Compute the dap data size for each type; note that this
+   is unlikely to be the same as the meta.memsize unless
+   the type is atomic and is <= NC_UINT64.
+*/
+
+static int
+markdapsize(NCD4meta* meta)
+{
+    int i,j;
+    for(i=0;i<nclistlength(meta->allnodes);i++) {
+	NCD4node* type = (NCD4node*)nclistget(meta->allnodes,i);
+	size_t totalsize;
+	if(type->sort != NCD4_TYPE) continue;
+	switch (type->subsort) {
+	case NC_STRUCT:
+	    totalsize = 0;
+            for(j=0;j<nclistlength(type->vars);j++) {  
+                NCD4node* field = (NCD4node*)nclistget(type->vars,j);
+		size_t size = field->basetype->meta.dapsize;
+	        if(size == 0) {
+		    totalsize = 0;
+		    break;
+	        } else
+		    totalsize += size;
+	    }
+	    type->meta.dapsize = totalsize;
+	    break;
+	case NC_SEQ:
+	    type->meta.dapsize = 0; /* has no fixed size */
+	    break;	
+	case NC_OPAQUE:
+	    type->meta.dapsize = type->opaque.size;
+	    break;	
+	case NC_ENUM:
+	    type->meta.dapsize = type->basetype->meta.dapsize;
+	    break;	
+	case NC_STRING:
+	    type->meta.dapsize = 0; /* has no fixed size */
+	    break;		
+	default: 
+	    assert(type->subsort <= NC_UINT64);
+	    /* Already assigned */
+	    break;
+	}
+    }
+    return NC_NOERR;
+}
+
diff --git a/libdap4/d4odom.c b/libdap4/d4odom.c
new file mode 100644
index 0000000..4975505
--- /dev/null
+++ b/libdap4/d4odom.c
@@ -0,0 +1,170 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "config.h"
+#include <stdlib.h>
+#include <assert.h>
+#include "netcdf.h"
+#include "d4util.h"
+#include "d4odom.h"
+
+/**********************************************/
+/* Define methods for a dimension dapodometer*/
+
+/* Build an odometer covering slices startslice upto,
+   but not including, stopslice
+*/
+
+/*
+Future optimization. It is sometimes the case that
+some suffix of the index set cover a contiguous chunk
+of the index space. This happens when the index positions
+starting at p upto rank have a start of zero, a count
+the same as the max index size, and a stride of one.
+Then we can effectively tread indices 0 thru p-1 as
+a short odometer that steps through the chunks.
+In practice, it is usually only ncdump that does this.
+A simpler optimization that is to see if the (start,count)
+covers the whole index space and has stride one.
+We can detect and use this optimization elsewhere to
+circumvent use of the odometer altogether.
+See d4odometer#NCD4_odomWhole().
+*/
+
+D4odometer*
+d4odom_new(size_t rank,
+	    const size_t* start, const size_t* count,
+	    const ptrdiff_t* stride, const size_t* size)
+{
+    int i;
+    D4odometer* odom = (D4odometer*)calloc(1,sizeof(D4odometer));
+    if(odom == NULL)
+	return NULL;
+    odom->rank = rank;
+    assert(odom->rank <= NC_MAX_VAR_DIMS);
+    for(i=0;i<odom->rank;i++) {
+	size_t istart,icount,istop,ideclsize;
+	ptrdiff_t istride;
+	istart = (start != NULL ? start[i] : 0);
+	icount = (count != NULL ? count[i] : (size != NULL ? size[i] : 1));
+	istride = (size_t)(stride != NULL ? stride[i] : 1);
+	istop = istart + icount*istride;
+	ideclsize = (size != NULL ? size[i]: (istop - istart));
+	odom->start[i] = istart;
+	odom->stop[i] = istop;
+	odom->stride[i] = istride;
+	odom->declsize[i] = ideclsize;
+	odom->index[i] = odom->start[i];
+    }    
+    return odom;
+}
+
+void
+d4odom_free(D4odometer* odom)
+{
+    if(odom) free(odom);
+}
+
+#if 0
+char*
+d4odom_print(D4odometer* odom)
+{
+    int i;
+    static char line[1024];
+    char tmp[64];
+    line[0] = '\0';
+    if(odom->rank == 0) {
+	strcat(line,"[]");
+    } else for(i=0;i<odom->rank;i++) {
+	sprintf(tmp,"[%lu/%lu:%lu:%lu]",
+		(size_t)odom->index[i],
+		(size_t)odom->start[i],
+		(size_t)odom->stride[i],
+		(size_t)odom->length[i]);
+	strcat(line,tmp);	
+    }
+    return line;
+}
+#endif
+
+int
+d4odom_more(D4odometer* odom)
+{
+    return (odom->index[0] < odom->stop[0]);
+}
+
+d4size_t
+d4odom_next(D4odometer* odom)
+{
+    int i; /* do not make unsigned */
+    d4size_t count;
+    if(odom->rank == 0) { /*scalar*/
+	odom->index[0]++;
+	return 0;
+    }
+    count = d4odom_offset(odom); /* convenience */
+    for(i=odom->rank-1;i>=0;i--) {
+        odom->index[i] += odom->stride[i];
+        if(odom->index[i] < odom->stop[i]) break;
+	if(i == 0) break; /* leave the 0th entry if it overflows*/
+	odom->index[i] = odom->start[i]; /* reset this position*/
+    }
+    return count;
+}
+
+/* Convert current d4odometer settings to a single integer offset*/
+d4size_t
+d4odom_offset(D4odometer* odom)
+{
+    int i;
+    d4size_t offset = 0;
+    for(i=0;i<odom->rank;i++) {
+	offset *= odom->declsize[i];
+	offset += odom->index[i];
+    } 
+    return offset;
+}
+
+/**************************************************/
+/*
+Given a d4odometer, compute the total
+number of elements in its space.
+*/
+
+d4size_t
+d4odom_nelements(D4odometer* odom)
+{
+    size_t i;
+    d4size_t count = 1;
+    for(i=0;i<odom->rank;i++) {
+	count *= odom->declsize[i];
+    }
+    return count;
+}
+
+int
+d4odom_isWhole(D4odometer* odom)
+{
+    int i;
+    for(i=0;i<odom->rank;i++) {
+	if(odom->start[i] != 0
+	   || odom->stride[i] != 1
+	   || odom->stop[i] != odom->declsize[i])
+	    return 0;
+    }
+    return 1;
+}
+
+/* Scalar Odometer support */
+D4odometer*
+d4scalarodom_new(void)
+{
+    D4odometer* odom = (D4odometer*)calloc(1,sizeof(D4odometer));
+    odom->rank = 0;
+    /* Fake things to execute exactly once */
+    odom->index[0] = 0;
+    odom->stop[0] = 1;
+    return odom;
+}
diff --git a/libdap4/d4odom.h b/libdap4/d4odom.h
new file mode 100644
index 0000000..385ebc9
--- /dev/null
+++ b/libdap4/d4odom.h
@@ -0,0 +1,38 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#ifndef D4ODOM_H
+#define D4ODOM_H 1
+
+typedef struct D4odometer {
+    int            rank;
+    size_t         index[NC_MAX_VAR_DIMS];
+    size_t         start[NC_MAX_VAR_DIMS];
+#if 0
+    size_t         count[NC_MAX_VAR_DIMS];
+#endif
+    size_t         stride[NC_MAX_VAR_DIMS];
+    size_t         stop[NC_MAX_VAR_DIMS];
+    size_t         declsize[NC_MAX_VAR_DIMS];
+} D4odometer;
+
+extern D4odometer* d4scalarodom_new(void);
+
+extern D4odometer* d4odom_new(size_t rank,
+                                const size_t* start, const size_t* count,
+				const ptrdiff_t* stride, const size_t* size);
+
+extern void d4odom_free(D4odometer*);
+
+extern int d4odom_more(D4odometer* odom);
+extern d4size_t d4odom_next(D4odometer* odom);
+
+extern d4size_t d4odom_offset(D4odometer* odom);
+
+extern d4size_t d4odom_nelements(D4odometer* odom);
+
+extern int d4odom_isWhole(D4odometer* odom);
+
+#endif /*D4ODOM_H*/
diff --git a/libdap4/d4parser.c b/libdap4/d4parser.c
new file mode 100644
index 0000000..67f2b8e
--- /dev/null
+++ b/libdap4/d4parser.c
@@ -0,0 +1,1515 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include <stdarg.h>
+#include <assert.h>
+#include "ezxml.h"
+
+/**
+ * Implement the Dap4 Parser Using a DOM Parser
+ * 
+ * This code creates in internal representation of the netcdf-4 metadata
+ * to avoid having to make so many calls into the netcdf library.
+ */
+
+/***************************************************/
+
+/*
+Map an xml node name to an interpretation.
+We use NCD4_NULL when we directly interpret
+the tag and do not need to search for it.
+E.g Dataset, Dim, econst, etc.
+If the sort is NCD4_NULL, then that means it is
+irrelevant because that keyword will never be
+searched for in this table.
+*/
+struct KEYWORDINFO {
+    char* tag; /* The xml tag e.g. <tag...> */
+    NCD4sort sort; /* What kind of node are we building */
+    nc_type subsort; /* discriminator */
+    char* aliasfor; /* Some names are aliases for others */
+} keywordmap[] = {
+{"Attribute", NCD4_ATTR,NC_NAT,NULL},
+{"Byte", NCD4_VAR,NC_BYTE,"Int8"},
+{"Char", NCD4_VAR,NC_CHAR,NULL},
+{"Dataset", NCD4_NULL,NC_NAT,NULL},
+{"Dim", NCD4_NULL,NC_NAT,NULL},
+{"Dimension", NCD4_DIM,NC_NAT,NULL},
+{"Enum", NCD4_VAR,NC_ENUM,NULL},
+{"Enumconst", NCD4_NULL,NC_NAT,NULL},
+{"Enumeration", NCD4_TYPE,NC_ENUM,NULL},
+{"Float32", NCD4_VAR,NC_FLOAT,NULL},
+{"Float64", NCD4_VAR,NC_DOUBLE,NULL},
+{"Group", NCD4_GROUP,NC_NAT,NULL},
+{"Int16", NCD4_VAR,NC_SHORT,NULL},
+{"Int32", NCD4_VAR,NC_INT,NULL},
+{"Int64", NCD4_VAR,NC_INT64,NULL},
+{"Int8", NCD4_VAR,NC_BYTE,NULL},
+{"Map", NCD4_NULL,NC_NAT,NULL},
+{"Opaque", NCD4_VAR,NC_OPAQUE,NULL},
+{"OtherXML", NCD4_XML,NC_NAT,NULL},
+{"Sequence", NCD4_VAR,NC_SEQ,NULL},
+{"String", NCD4_VAR,NC_STRING,NULL},
+{"Structure", NCD4_VAR,NC_STRUCT,NULL},
+{"UByte", NCD4_VAR,NC_UBYTE,"UInt8"},
+{"UInt16", NCD4_VAR,NC_USHORT,NULL},
+{"UInt32", NCD4_VAR,NC_UINT,NULL},
+{"UInt64", NCD4_VAR,NC_UINT64,NULL},
+{"UInt8", NCD4_VAR,NC_UBYTE,NULL},
+{"URL", NCD4_VAR,NC_STRING,"String"},
+};
+typedef struct KEYWORDINFO KEYWORDINFO;
+
+static struct ATOMICTYPEINFO {
+    char* name; nc_type type; size_t size;
+} atomictypeinfo[] = {
+/* Keep in sorted order for binary search */
+{"Byte",NC_BYTE,sizeof(char)},
+{"Char",NC_CHAR,sizeof(char)},
+{"Float32",NC_FLOAT,sizeof(float)},
+{"Float64",NC_DOUBLE,sizeof(double)},
+{"Int16",NC_SHORT,sizeof(short)},
+{"Int32",NC_INT,sizeof(int)},
+{"Int64",NC_INT64,sizeof(long long)},
+{"Int8",NC_BYTE,sizeof(char)},
+{"String",NC_STRING,sizeof(char*)},
+{"UByte",NC_UBYTE,sizeof(unsigned char)},
+{"UInt16",NC_USHORT,sizeof(unsigned short)},
+{"UInt32",NC_UINT,sizeof(unsigned int)},
+{"UInt64",NC_UINT64,sizeof(unsigned long long)},
+{"UInt8",NC_UBYTE,sizeof(unsigned char)},
+{NULL,NC_NAT,0}
+};
+
+/***************************************************/
+
+#ifdef D4DEBUG
+static void setname(NCD4node* node, const char* name)
+{
+    nullfree(node->name);
+    (node)->name = strdup(name); \
+    fprintf(stderr,"setname: node=%lx name=%s\n",(unsigned long)(node),(node)->name); \
+}
+#define SETNAME(node,src) setname((node),src)
+#else
+#define SETNAME(node,src) do {nullfree((node)->name); (node)->name = strdup(src);} while(0);
+#endif
+
+/***************************************************/
+
+extern const char** ezxml_all_attr(ezxml_t xml, int* countp);
+
+/* Forwards */
+
+static int addOrigType(NCD4parser*, NCD4node* src, NCD4node* dst, const char* tag);
+static int defineAtomicTypes(NCD4parser*);
+static int defineBytestringType(NCD4parser*);
+static void classify(NCD4node* container, NCD4node* node);
+static int convertString(union ATOMICS*, NCD4node* type, const char* s);
+static int downConvert(union ATOMICS*, NCD4node* type);
+static int fillgroup(NCD4parser*, NCD4node* group, ezxml_t xml);
+static NCD4node* getOpaque(NCD4parser*, ezxml_t varxml, NCD4node* group);
+static int getValueStrings(NCD4parser*, NCD4node*, ezxml_t xattr, NClist*);
+static int isReserved(const char* name);
+static KEYWORDINFO* keyword(const char* name);
+static NCD4node* lookupAtomictype(NCD4parser*, const char* name);
+static NCD4node* lookFor(NClist* elems, const char* name, NCD4sort sort);
+static NCD4node* lookupFQN(NCD4parser*, const char* sfqn, NCD4sort);
+static int lookupFQNList(NCD4parser*, NClist* fqn, NCD4sort sort, NCD4node** result);
+static NCD4node* makeAnonDim(NCD4parser*, const char* sizestr);
+static int makeNode(NCD4parser*, NCD4node* parent, ezxml_t, NCD4sort, nc_type, NCD4node**);
+static int parseAtomicVar(NCD4parser*, NCD4node* container, ezxml_t xml, NCD4node**);
+static int parseAttributes(NCD4parser*, NCD4node* container, ezxml_t xml);
+static int parseDimensions(NCD4parser*, NCD4node* group, ezxml_t xml);
+static int parseDimRefs(NCD4parser*, NCD4node* var, ezxml_t xml);
+static int parseEconsts(NCD4parser*, NCD4node* en, ezxml_t xml);
+static int parseEnumerations(NCD4parser*, NCD4node* group, ezxml_t dom);
+static int parseFields(NCD4parser*, NCD4node* container, ezxml_t xml);
+static int parseError(NCD4parser*, ezxml_t errxml);
+static int parseGroups(NCD4parser*, NCD4node* group, ezxml_t dom);
+static int parseMaps(NCD4parser*, NCD4node* var, ezxml_t xml);
+static int parseMetaData(NCD4parser*, NCD4node* node, ezxml_t xml);
+static int parseStructure(NCD4parser*, NCD4node* container, ezxml_t dom, NCD4node**);
+static int parseSequence(NCD4parser*, NCD4node* container, ezxml_t dom,NCD4node**);
+static int parseLL(const char* text, long long*);
+static int parseULL(const char* text, unsigned long long*);
+static int parseVariables(NCD4parser*, NCD4node* group, ezxml_t xml);
+static int parseVariable(NCD4parser*, NCD4node* group, ezxml_t xml, NCD4node**);
+static void reclaimParser(NCD4parser* parser);
+static void record(NCD4parser*, NCD4node* node);
+static int splitOrigType(NCD4parser*, const char* fqn, NCD4node* var);
+static void track(NCD4parser*, NCD4node* node);
+static int traverse(NCD4parser*, ezxml_t dom);
+
+/***************************************************/
+/* API */
+
+int
+NCD4_parse(NCD4meta* metadata)
+{
+    int ret = NC_NOERR;
+    NCD4parser* parser = NULL;
+    int ilen;
+    ezxml_t dom = NULL;
+
+    /* Create and fill in the parser state */
+    parser = (NCD4parser*)calloc(1,sizeof(NCD4parser));
+    if(parser == NULL) {ret=NC_ENOMEM; goto done;}
+    parser->metadata = metadata;
+    ilen = strlen(parser->metadata->serial.dmr);
+    dom = ezxml_parse_str(parser->metadata->serial.dmr,ilen);
+    if(dom == NULL) {ret=NC_ENOMEM; goto done;}
+    parser->types = nclistnew();
+    parser->dims = nclistnew();
+    parser->vars = nclistnew();
+#ifdef D4DEBUG
+    parser->debuglevel = 1;
+#endif    
+
+    /*Walk the DOM tree */
+    ret = traverse(parser,dom);
+
+done:
+    if(dom != NULL)
+	ezxml_free(dom);
+    reclaimParser(parser);
+    return THROW(ret);
+}
+
+static void
+reclaimParser(NCD4parser* parser)
+{
+    if(parser == NULL) return;
+    nclistfree(parser->atomictypes);
+    nclistfree(parser->types);
+    nclistfree(parser->dims);
+    nclistfree(parser->vars);
+    free (parser);
+}
+
+/**************************************************/
+
+/* Recursively walk the DOM tree to create the metadata */
+static int
+traverse(NCD4parser* parser, ezxml_t dom)
+{
+    int ret = NC_NOERR;
+
+    /* See if we have an <Error> or <Dataset> */
+    if(strcmp(dom->name,"Error")==0) {
+	ret=parseError(parser,dom);
+	ret=NC_EDMR;
+	goto done;
+    } else if(strcmp(dom->name,"Dataset")==0) {
+	const char* xattr = NULL;
+        if((ret=makeNode(parser,NULL,NULL,NCD4_GROUP,NC_NULL,&parser->metadata->root))) goto done;
+        parser->metadata->root->group.isdataset = 1;
+        parser->metadata->root->meta.id = parser->metadata->ncid;
+        parser->metadata->groupbyid = nclistnew();
+        SETNAME(parser->metadata->root,"/");
+	xattr = ezxml_attr(dom,"name");
+	if(xattr != NULL) parser->metadata->root->group.datasetname = strdup(xattr);
+	xattr = ezxml_attr(dom,"dapVersion");
+	if(xattr != NULL) parser->metadata->root->group.dapversion = strdup(xattr);
+	xattr = ezxml_attr(dom,"dmrVersion");
+	if(xattr != NULL) parser->metadata->root->group.dmrversion = strdup(xattr);
+        /* fill in the atomic types */
+        if((ret=defineAtomicTypes(parser))) goto done;
+        /* Recursively walk the tree */
+        if((ret = fillgroup(parser,parser->metadata->root,dom))) goto done;
+    } else
+	FAIL(NC_EINVAL,"Unexpected dom root name: %s",dom->name);
+done:
+    return THROW(ret);
+}
+
+static int
+fillgroup(NCD4parser* parser, NCD4node* group, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+
+    /* Extract Dimensions */
+    if((ret = parseDimensions(parser,group,xml))) goto done;
+    /* Extract Enum types */
+    if((ret = parseEnumerations(parser,group,xml))) goto done;
+    /* Extract variables */
+    if((ret = parseVariables(parser,group,xml))) goto done;
+    /* Extract subgroups*/
+    if((ret = parseGroups(parser,group,xml))) goto done;
+    /* Parse group level attributes */
+    if((ret = parseAttributes(parser,group,xml))) goto done;    
+done:
+    return THROW(ret);
+}
+
+static int
+parseDimensions(NCD4parser* parser, NCD4node* group, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+    for(x=ezxml_child(xml, "Dimension");x != NULL;x = ezxml_next(x)) {
+	NCD4node* dimnode = NULL;
+	unsigned long long size;
+	const char* sizestr;
+	const char* unlimstr;
+	sizestr = ezxml_attr(x,"size");
+	if(sizestr == NULL)
+	    FAIL(NC_EDIMSIZE,"Dimension has no size");
+	unlimstr = ezxml_attr(x,UCARTAGUNLIM);
+	if((ret = parseULL(sizestr,&size))) goto done;
+	if((ret=makeNode(parser,group,x,NCD4_DIM,NC_NULL,&dimnode))) goto done;
+	dimnode->dim.size = (long long)size;
+	dimnode->dim.isunlimited = (unlimstr != NULL);
+	/* Process attributes */
+	if((ret = parseAttributes(parser,dimnode,x))) goto done;    
+	classify(group,dimnode);
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+parseEnumerations(NCD4parser* parser, NCD4node* group, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+
+    for(x=ezxml_child(xml, "Enumeration");x != NULL;x = ezxml_next(x)) {
+	NCD4node* node = NULL;
+	NCD4node* basetype = NULL;
+	const char* fqn = ezxml_attr(x,"basetype");
+	basetype = lookupFQN(parser,fqn,NCD4_TYPE);
+	if(basetype == NULL) {
+	    FAIL(NC_EBADTYPE,"Enumeration has unknown type: ",fqn);
+	}
+	if((ret=makeNode(parser,group,x,NCD4_TYPE,NC_ENUM,&node))) goto done;
+	node->basetype = basetype;
+	if((ret=parseEconsts(parser,node,x))) goto done;
+	if(nclistlength(node->en.econsts) == 0)
+	    FAIL(NC_EINVAL,"Enumeration has no values");
+	classify(group,node);
+	/* Finally, see if this type has UCARTAGORIGTYPE xml attribute */
+	if(parser->metadata->controller->controls.translation == NCD4_TRANSNC4) {
+	    const char* typetag = ezxml_attr(x,UCARTAGORIGTYPE);
+	    if(typetag != NULL) {
+	    }
+	}
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+parseEconsts(NCD4parser* parser, NCD4node* en, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+    NClist* econsts = nclistnew();
+
+    for(x=ezxml_child(xml, "EnumConst");x != NULL;x = ezxml_next(x)) {
+        NCD4node* ec = NULL;
+	const char* name;
+	const char* svalue;
+	name = ezxml_attr(x,"name");
+	if(name == NULL) FAIL(NC_EBADNAME,"Enum const with no name");
+	if((ret=makeNode(parser,en,x,NCD4_ECONST,NC_NULL,&ec))) goto done	;
+	svalue = ezxml_attr(x,"value");
+	if(svalue == NULL)
+	    FAIL(NC_EINVAL,"Enumeration Constant has no value");
+	if((ret=convertString(&ec->en.ecvalue,en->basetype,svalue)))
+	    FAIL(NC_EINVAL,"Non-numeric Enumeration Constant: %s->%s",ec->name,svalue);
+	PUSH(econsts,ec);	
+    }
+    en->en.econsts = econsts;
+done:
+    return THROW(ret);
+}
+
+static int
+parseVariables(NCD4parser* parser, NCD4node* group, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+    for(x=xml->child;x != NULL;x=x->ordered) {
+	NCD4node* node = NULL;
+	KEYWORDINFO* info = keyword(x->name);
+	if(info == NULL)
+	    FAIL(NC_ETRANSLATION,"Unexpected node type: %s",x->name);
+	/* Check if we need to process this node */
+	if(!ISVAR(info->sort)) continue; /* Handle elsewhere */
+	node = NULL;
+	ret = parseVariable(parser,group,x,&node);
+        if(ret != NC_NOERR || node == NULL) break;
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+parseVariable(NCD4parser* parser, NCD4node* container, ezxml_t xml, NCD4node** nodep)
+{
+    int ret = NC_NOERR;
+    NCD4node* node = NULL;
+    KEYWORDINFO* info = keyword(xml->name);
+
+    switch (info->subsort) {
+    case NC_STRUCT:
+	ret = parseStructure(parser,container,xml,&node);
+	break;
+    case NC_SEQ:
+	ret = parseSequence(parser,container,xml,&node);
+	break;
+    default:
+	ret = parseAtomicVar(parser,container,xml,&node);
+    }
+    *nodep = node;
+
+    return THROW(ret);
+}
+
+static int
+parseMetaData(NCD4parser* parser, NCD4node* container, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    /* Process dimrefs */
+    if((ret=parseDimRefs(parser,container,xml))) goto done;
+    /* Process attributes */
+    if((ret = parseAttributes(parser,container,xml))) goto done;    
+    /* Process maps */
+    if((ret = parseMaps(parser,container,xml))) goto done;    
+done:
+    return THROW(ret);
+}
+
+static int
+parseStructure(NCD4parser* parser, NCD4node* container, ezxml_t xml, NCD4node** nodep)
+{
+    int ret = NC_NOERR;
+    NCD4node* var = NULL;
+    NCD4node* type = NULL;
+    NCD4node* group = NULL;
+    char* fqnname = NULL;
+
+    group = NCD4_groupFor(container); /* default: put type in the same group as var */
+
+    /* Make the structure as a variable with same name as structure; will be fixed later */
+    if((ret=makeNode(parser,container,xml,NCD4_VAR,NC_STRUCT,&var))) goto done;
+    classify(container,var);
+
+    /* Make the structure as a type with (for now) partial fqn name from the variable */
+    if((ret=makeNode(parser,group,xml,NCD4_TYPE,NC_STRUCT,&type))) goto done;
+    classify(group,type);
+    /* Set the basetype */
+    var->basetype = type;
+    /* Now change the struct typename */
+    fqnname = NCD4_makeName(var,"_");
+    if(fqnname == NULL)
+	FAIL(NC_ENOMEM,"Out of memory");
+    SETNAME(type,fqnname);
+
+    /* Parse Fields into the type */
+    if((ret = parseFields(parser,type,xml))) goto done;    
+
+    /* Parse attributes, dims, and maps into the var */
+    if((ret = parseMetaData(parser,var,xml))) goto done;
+
+    record(parser,var);
+
+    /* See if this var has UCARTAGORIGTYPE attribute */
+    if(parser->metadata->controller->controls.translation == NCD4_TRANSNC4) {
+	const char* typetag = ezxml_attr(xml,UCARTAGORIGTYPE);
+	if(typetag != NULL) {
+	    /* yes, place it on the type */
+	    if((ret=addOrigType(parser,var,type,typetag))) goto done;
+ 	}
+    }
+
+    if(nodep) *nodep = var;
+
+done:
+    nullfree(fqnname);
+    return THROW(ret);
+}
+
+static int
+parseFields(NCD4parser* parser, NCD4node* container, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+    for(x=xml->child;x != NULL;x=x->ordered) {
+	NCD4node* node = NULL;
+        KEYWORDINFO* info = keyword(x->name);
+	if(!ISVAR(info->sort)) continue; /* not a field */
+	ret = parseVariable(parser,container,x,&node);
+	if(ret) goto done;
+    }
+done:
+    return THROW(ret);
+}
+
+/*
+Specialized version of parseFields that is used
+to attach a singleton field to a vlentype
+*/
+static int
+parseVlenField(NCD4parser* parser, NCD4node* container, ezxml_t xml, NCD4node** fieldp)
+{
+    int ret = NC_NOERR;
+    NCD4node* field = NULL;
+    ezxml_t x;
+    for(x=xml->child;x != NULL;x=x->ordered) {
+        KEYWORDINFO* info = keyword(x->name);
+	if(!ISVAR(info->sort)) continue; /* not a field */
+	if(field != NULL)
+	    {ret = NC_EBADTYPE; goto done;}
+	if((ret = parseVariable(parser,container,x,&field)))
+	    goto done;
+    }
+    if(fieldp) *fieldp = field;
+done:
+    return THROW(ret);
+}
+
+static int
+parseSequence(NCD4parser* parser, NCD4node* container, ezxml_t xml, NCD4node** nodep)
+{
+    int ret = NC_NOERR;
+    NCD4node* var = NULL;
+    NCD4node* structtype = NULL;
+    NCD4node* vlentype = NULL;
+    NCD4node* group = NULL;
+    char name[NC_MAX_NAME];
+    char* fqnname = NULL;
+    int usevlen = 0;
+
+    group = NCD4_groupFor(container);
+
+    /* Convert a sequence variable into two or three things:
+	1. a compound type representing the fields of the sequence.
+	2. a vlen type whose basetype is #1
+	3. a variable whose basetype is #2.
+	If we can infer that the sequence was riginally produced
+	from a netcdf-4 vlen, then we can avoid createing #1.
+	Naming is as follows. Assume the var name is V
+	and the NCD4_makeName of the var is V1..._Vn.
+	1. var name is V.
+	2. vlen type is V1..._VN_t
+	3. compound type (if any) is V1..._VN_cmpd (Note, d4meta will append _t to this)
+     */
+
+    /* Determine if we need to build a structure type or can go straight to a vlen
+       Test:  UCARTAGVLEN xml attribute is set
+    */
+    if(parser->metadata->controller->controls.translation == NCD4_TRANSNC4) {
+	const char* vlentag = ezxml_attr(xml,UCARTAGVLEN);
+	if(vlentag != NULL) 
+	    usevlen = 1;
+    } else
+	usevlen = 0;
+
+    /* make secondary names from the var fqn name */
+    if(usevlen) {
+	/* Parse the singleton field and then use it to fix up the var */
+	if((ret=parseVlenField(parser,container,xml,&var)))
+	    goto done;
+	/* compute a partial fqn */
+        fqnname = NCD4_makeName(var,"_");
+        if(fqnname == NULL)
+	    {ret = NC_ENOMEM; goto done;}
+	/* Now, create the vlen type using the field's basetype */
+        if((ret=makeNode(parser,group,xml,NCD4_TYPE,NC_SEQ,&vlentype))) goto done;
+        classify(group,vlentype);
+	vlentype->basetype = var->basetype;
+	/* Use name <fqnname>_t */
+	strncpy(name,fqnname,sizeof(name));
+	strncat(name,"_t",sizeof(name));	
+        SETNAME(vlentype,name);
+        /* Set the basetype */
+        var->basetype = vlentype;
+    } else {
+	/* Start by creating the var node; will be fixed up later */
+	if((ret=makeNode(parser,container,xml,NCD4_VAR,NC_SEQ,&var))) goto done;
+	classify(container,var);
+        fqnname = NCD4_makeName(var,"_");
+        if(fqnname == NULL)
+	    {ret = NC_ENOMEM; goto done;}
+        if((ret=makeNode(parser,group,xml,NCD4_TYPE,NC_STRUCT,&structtype))) goto done;
+        classify(group,structtype);
+	/* Use name <fqnname>_base */
+	strncpy(name,fqnname,sizeof(name));
+	strncat(name,"_base",sizeof(name));	
+        SETNAME(structtype,name);
+        /* Parse Fields into type */
+        if((ret = parseFields(parser,structtype,xml))) goto done;    
+	/* Create a seq type whose basetype is the compound type */
+        if((ret=makeNode(parser,group,xml,NCD4_TYPE,NC_SEQ,&vlentype))) goto done;
+        classify(group,vlentype);
+	/* Use name <xname>_t */
+	strncpy(name,fqnname,sizeof(name));
+	strncat(name,"_t",sizeof(name));	
+        SETNAME(vlentype,name);
+	vlentype->basetype = structtype;
+        /* Set the basetype */
+        var->basetype = vlentype;
+    }
+
+    /* Parse attributes, dims, and maps into var*/
+    if((ret = parseMetaData(parser,var,xml))) goto done;
+
+    record(parser,var);
+
+    /* See if this var has UCARTAGORIGTYPE attribute */
+    if(parser->metadata->controller->controls.translation == NCD4_TRANSNC4) {
+	const char* typetag = ezxml_attr(xml,UCARTAGORIGTYPE);
+	if(typetag != NULL) {
+	    /* yes, place it on the type */
+	    if((ret=addOrigType(parser,var,vlentype,typetag))) goto done;
+ 	}
+    }
+    if(nodep) *nodep = var;
+
+done:
+    if(fqnname) free(fqnname);
+    return THROW(ret);
+}
+
+static int
+parseGroups(NCD4parser* parser, NCD4node* parent, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+    for(x=ezxml_child(xml, "Group");x != NULL;x = ezxml_next(x)) {
+	NCD4node* group = NULL;
+	const char* name = ezxml_attr(x,"name");
+	if(name == NULL) FAIL(NC_EBADNAME,"Group has no name");
+	if((ret=makeNode(parser,parent,x,NCD4_GROUP,NC_NULL,&group))) goto done;
+	group->group.varbyid = nclistnew();
+        if((ret = fillgroup(parser,group,x))) goto done;
+        /* Parse group attributes */
+        if((ret = parseAttributes(parser,group,x))) goto done;    
+	PUSH(parent->groups,group);
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+parseAtomicVar(NCD4parser* parser, NCD4node* container, ezxml_t xml, NCD4node** nodep)
+{
+    int ret = NC_NOERR;
+    NCD4node* node = NULL;
+    NCD4node* base = NULL;
+    const char* typename;
+    KEYWORDINFO* info;
+    NCD4node* group;
+   
+    /* Check for aliases */
+    for(typename=xml->name;;) {
+	info = keyword(typename);
+	if(info->aliasfor == NULL) break;
+	typename = info->aliasfor;
+    }	
+    group = NCD4_groupFor(container);
+    /* Locate its basetype; handle opaque and enum separately */
+    if(info->subsort == NC_ENUM) {
+        const char* enumfqn = ezxml_attr(xml,"enum");
+	if(enumfqn == NULL)
+	    base = NULL;
+	else
+	    base = lookupFQN(parser,enumfqn,NCD4_TYPE);
+    } else if(info->subsort == NC_OPAQUE) {
+	/* See if the xml references an opaque type name */
+	base = getOpaque(parser,xml,group);
+    } else {
+	base = lookupFQN(parser,info->tag,NCD4_TYPE);
+    }
+    if(base == NULL || !ISTYPE(base->sort)) {
+	FAIL(NC_EBADTYPE,"Unexpected variable type: %s",info->tag);
+    }
+    if((ret=makeNode(parser,container,xml,NCD4_VAR,base->subsort,&node))) goto done;
+    classify(container,node);
+    node->basetype = base;
+    /* Parse attributes, dims, and maps */
+    if((ret = parseMetaData(parser,node,xml))) goto done;    
+    /* See if this var has UCARTAGORIGTYPE attribute */
+    if(parser->metadata->controller->controls.translation == NCD4_TRANSNC4) {
+	const char* typetag = ezxml_attr(xml,UCARTAGORIGTYPE);
+	if(typetag != NULL) {
+	    /* yes, place it on the type */
+	    if((ret=addOrigType(parser,node,node,typetag))) goto done;
+ 	}
+    }
+    if(nodep) *nodep = node;
+done:
+    return THROW(ret);
+}
+
+static int
+parseDimRefs(NCD4parser* parser, NCD4node* var, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+    for(x=ezxml_child(xml, "Dim");x!= NULL;x=ezxml_next(x)) {
+	NCD4node* dim = NULL;
+	const char* fqn;
+
+	fqn = ezxml_attr(x,"name");
+	if(fqn != NULL) {
+   	    dim = lookupFQN(parser,fqn,NCD4_DIM);
+	    if(dim == NULL) {
+	        FAIL(NC_EBADDIM,"Cannot locate dim with name: %s",fqn);
+	    }
+	} else {
+	    const char* sizestr = ezxml_attr(x,"size");
+	    if(sizestr == NULL) {
+	        FAIL(NC_EBADDIM,"Dimension reference has no name and no size");
+	    }
+	    /* Make or reuse anonymous dimension in root group */
+	    dim = makeAnonDim(parser,sizestr);
+	    if(dim == NULL)
+		FAIL(NC_EBADDIM,"Cannot create anonymous dimension for size: %s",sizestr);
+	}
+	PUSH(var->dims,dim);
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+parseMaps(NCD4parser* parser, NCD4node* var, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+
+    for(x=ezxml_child(xml, "Map");x!= NULL;x=ezxml_next(x)) {
+	NCD4node* mapref = NULL;
+	const char* fqn;
+	fqn = ezxml_attr(x,"name");
+	if(fqn == NULL)
+	    FAIL(NC_ENOTVAR,"<Map> has no name attribute");
+        mapref = lookupFQN(parser,fqn,NCD4_VAR);
+	if(mapref == NULL)
+	    FAIL(NC_ENOTVAR,"<Map> name does not refer to a variable: %s",fqn);
+	PUSH(var->maps,mapref);
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+parseAttributes(NCD4parser* parser, NCD4node* container, ezxml_t xml)
+{
+    int ret = NC_NOERR;
+    ezxml_t x;
+    NClist* values = NULL;
+
+    /* First, transfer any reserved xml attributes */
+    {
+	int count = 0;
+	const char** all = NULL;
+	all = ezxml_all_attr(xml,&count);
+	if(all != NULL && count > 0) {
+	    const char** p;
+	    container->xmlattributes = nclistnew();
+	    for(p=all;*p;p+=2) {
+		if(isReserved(*p)) {
+		    nclistpush(container->xmlattributes,strdup(p[0]));
+		    nclistpush(container->xmlattributes,strdup(p[1]));
+		}
+	    }	
+	}
+    }
+
+    for(x=ezxml_child(xml, "Attribute");x!= NULL;x=ezxml_next(x)) {
+	const char* name = ezxml_attr(x,"name");
+	const char* type = ezxml_attr(x,"type");
+	NCD4node* attr = NULL;
+	NCD4node* basetype;
+
+	if(name == NULL) FAIL(NC_EBADNAME,"Missing <Attribute> name");
+#ifdef HYRAXHACK
+	/* Hyrax specifies type="container" for container types */
+	if(strcmp(type,"container")==0
+	   || strcmp(type,"Container")==0)
+	    type = NULL;
+#endif
+	if(type == NULL) {
+	    /* <Attribute> containers not supported; ignore */
+	    continue;
+	}
+
+	if((ret=makeNode(parser,container,x,NCD4_ATTR,NC_NULL,&attr))) goto done;
+	/* HACK: If the attribute is _FillValue, then force the use of the
+           container's type as the attribute type */
+	if(strcmp(attr->name,"_FillValue") == 0)
+	    basetype = container->basetype;
+	else
+	    basetype = lookupFQN(parser,type,NCD4_TYPE);
+	if(basetype == NULL)
+	    FAIL(NC_EBADTYPE,"Unknown <Attribute> type: ",type);
+	if(basetype->subsort == NC_NAT && basetype->subsort != NC_ENUM)
+	    FAIL(NC_EBADTYPE,"<Attribute> type must be atomic or enum: ",type);
+	attr->basetype = basetype;
+	values = nclistnew();
+	if((ret=getValueStrings(parser,basetype,x,values))) {
+	    FAIL(NC_EINVAL,"Malformed attribute: %s",name);
+	}
+	attr->attr.values = values; values = NULL;
+	PUSH(container->attributes,attr);
+    }
+done:
+    if(ret != NC_NOERR) {
+        nclistfreeall(values);
+    }
+    return THROW(ret);
+}
+
+static int
+parseError(NCD4parser* parser, ezxml_t errxml)
+{
+    const char* shttpcode = ezxml_attr(errxml,"httpcode");
+    ezxml_t x;
+    if(shttpcode == NULL) shttpcode = "400";
+    if(sscanf(shttpcode,"%d",&parser->metadata->error.httpcode) != 1)
+        nclog(NCLOGERR,"Malformed <ERROR> response");
+    x=ezxml_child(errxml, "Message");
+    if(x != NULL) {
+	const char* txt = ezxml_txt(x);
+	parser->metadata->error.message = (txt == NULL ? NULL : strdup(txt));
+    }
+    x=ezxml_child(errxml, "Context");
+    if(x != NULL) {
+	const char* txt = ezxml_txt(x);
+	parser->metadata->error.context = (txt == NULL ? NULL : strdup(txt));
+    }
+    x=ezxml_child(errxml, "OtherInformation");
+    if(x != NULL) {
+	const char* txt = ezxml_txt(x);
+	parser->metadata->error.otherinfo = (txt == NULL ? NULL : strdup(txt));
+    }
+    return THROW(NC_NOERR);
+}
+
+/*
+Find or create an opaque type
+*/
+static NCD4node*
+getOpaque(NCD4parser* parser, ezxml_t varxml, NCD4node* group)
+{
+    int i, ret = NC_NOERR;
+    long long len;
+    NCD4node* opaquetype = NULL;
+    const char* xattr;
+
+    if(parser->metadata->controller->controls.translation == NCD4_TRANSNC4) {
+        /* See if this var has UCARTAGOPAQUE attribute */
+        xattr = ezxml_attr(varxml,UCARTAGOPAQUE);
+        if(xattr != NULL) {
+            if((ret = parseLL(xattr,&len)) || (len < 0))
+	        FAIL(NC_EINVAL,"Illegal opaque len: %s",xattr);
+        } else
+	    len = 0;
+    } else
+	len = 0;
+    if(len == 0) { /* Need to use _bytestring */
+	if((ret=defineBytestringType(parser)))
+  	    goto done;
+	assert(parser->metadata->_bytestring != NULL);
+	opaquetype = parser->metadata->_bytestring;	
+    } else {//(len > 0)
+        /* Try to locate existing opaque type with this length */
+        for(i=0;i<nclistlength(parser->types); i++) {
+	    NCD4node* op = (NCD4node*)nclistget(parser->types,i);
+	    if(op->subsort != NC_OPAQUE) continue;
+	    if(op->opaque.size == len) {opaquetype = op; break;}
+	}
+        if(opaquetype == NULL) {/* create it */
+	    char name[NC_MAX_NAME+1];
+	    /* Make name be "opaqueN" */
+	    snprintf(name,NC_MAX_NAME,"opaque%lld_t",len);
+	    /* Opaque types are always created in the current group */
+	    if((ret=makeNode(parser,group,NULL,NCD4_TYPE,NC_OPAQUE,&opaquetype)))
+	        goto done;
+  	    SETNAME(opaquetype,name);
+	    opaquetype->opaque.size = len;
+	    if(opaquetype != NULL)
+	        record(parser,opaquetype);			
+	}
+    }
+done:
+    return opaquetype;
+}
+
+/* get all value strings */
+static int
+getValueStrings(NCD4parser* parser, NCD4node* type, ezxml_t xattr, NClist* svalues)
+{
+    const char* s;
+    /* See first if we have a "value" xml attribute */
+    s = ezxml_attr(xattr,"value");
+    if(s != NULL)
+	PUSH(svalues,strdup(s));
+    else {/* look for <Value> subnodes */
+	ezxml_t x;
+        for(x=ezxml_child(xattr, "Value");x != NULL;x = ezxml_next(x)) {
+	    char* es;
+	    char* ds;
+	    /* We assume that either their is a single xml attribute called "value",
+               or there is a single chunk of text containing possibly multiple values.
+	    */                       
+	    s = ezxml_attr(x,"value");
+	    if(s == NULL) {/* See if there is a text part. */
+		s = x->txt;
+		if(s == NULL) s = "";
+	    }
+	    /* Need to de-escape the string */
+	    es = NCD4_entityescape(s);
+	    ds = NCD4_deescape(es);
+	    nclistpush(svalues,ds);
+	    nullfree(es);
+	}
+    }
+    return THROW(NC_NOERR);
+}
+
+/***************************************************/
+/* Utilities */
+
+NCD4node*
+NCD4_groupFor(NCD4node* node)
+{
+    while(node->sort != NCD4_GROUP) node = node->container;
+    return node;
+}
+
+/* Determine is a name is reserved */
+static int
+isReserved(const char* name)
+{
+    if(name == NULL) return 0;
+    return (name[0] == RESERVECHAR);
+}
+
+/* If a node has the UCARTAGORIGTYPE attribute,
+   then capture that annotation. */
+static int
+addOrigType(NCD4parser* parser, NCD4node* src, NCD4node* dst, const char* oldname)
+{
+    int ret = NC_NOERR;
+
+    if(dst == NULL) dst = src;
+    /* Record the original type in the destination*/
+    if((ret=splitOrigType(parser,oldname,dst))) goto done;
+done:
+    return THROW(ret);
+}
+
+static int
+splitOrigType(NCD4parser* parser, const char* fqn, NCD4node* type)
+{
+    int ret = NC_NOERR;
+    NClist* pieces = nclistnew();
+    NCD4node* group = NULL;
+    char* name = NULL;
+
+    if((ret=NCD4_parseFQN(fqn,pieces))) goto done;
+    /* It should be the case that the pieces are {/group}+/name */
+    name = (char*)nclistpop(pieces);
+    if((ret = lookupFQNList(parser,pieces,NCD4_GROUP,&group))) goto done;
+    if(group == NULL) {
+	FAIL(NC_ENOGRP,"Non-existent group in FQN: ",fqn);    
+    }
+    type->nc4.orig.name = strdup(name+1); /* plus 1 to skip the leading separator */
+    type->nc4.orig.group = group;
+
+done:
+    return THROW(ret);
+}
+
+/* Locate an attribute.
+   If not found, then *attrp will be null
+*/
+NCD4node*
+NCD4_findAttr(NCD4node* container, const char* attrname)
+{
+    int i;
+    /* Look directly under this xml for <Attribute> */
+    for(i=0;i<nclistlength(container->attributes);i++) {
+	NCD4node* attr = (NCD4node*)nclistget(container->attributes,i);
+	if(strcmp(attr->name,attrname)!=0) continue;
+	return attr;
+    }    
+    return NULL;
+}
+
+/*
+Parse a simple string of digits into an unsigned long long
+Return the value.
+*/
+
+static int
+parseULL(const char* text, unsigned long long* ullp)
+{
+    extern int errno;
+    char* endptr;
+    unsigned long long uint64 = 0;
+
+    errno = 0; endptr = NULL;
+#ifdef HAVE_STRTOULL
+    uint64 = strtoull(text,&endptr,10);
+    if(errno == ERANGE)
+	return THROW(NC_ERANGE);
+#else /*!(defined HAVE_STRTOLL && defined HAVE_STRTOULL)*/
+    sscanf((char*)text, "%llu", &uint64);
+    /* Have no useful way to detect out of range */
+#endif /*!(defined HAVE_STRTOLL && defined HAVE_STRTOULL)*/
+    if(ullp) *ullp = uint64;
+    return THROW(NC_NOERR);
+}
+
+/*
+Parse a simple string of digits into an signed long long
+Return the value.
+*/
+
+static int
+parseLL(const char* text, long long* llp)
+{
+    extern int errno;
+    char* endptr;
+    long long int64 = 0;
+
+    errno = 0; endptr = NULL;
+#ifdef HAVE_STRTOLL
+    int64 = strtoll(text,&endptr,10);
+    if(errno == ERANGE)
+	return THROW(NC_ERANGE);
+#else /*!(defined HAVE_STRTOLL && defined HAVE_STRTOLL)*/
+    sscanf((char*)text, "%lld", &int64);
+    /* Have no useful way to detect out of range */
+#endif /*!(defined HAVE_STRTOLL && defined HAVE_STRTOLL)*/
+    if(llp) *llp = int64;
+    return THROW(NC_NOERR);
+}
+
+/*
+Convert a sequence of fqn names into a specific node.
+WARNING: This is highly specialized in that it assumes
+that the final object is one of: dimension, type, or var.
+This means that e.g. groups, attributes, econsts, cannot
+be found by this procedure.
+*/
+static int
+lookupFQNList(NCD4parser* parser, NClist* fqn, NCD4sort sort, NCD4node** result)
+{
+    int ret = NC_NOERR;
+    int i,nsteps;
+    NCD4node* current;
+    char* name = NULL;
+    NCD4node* node = NULL;
+
+    /* Step 1: walk thru groups until can go no further */
+    current = parser->metadata->root;
+    nsteps = nclistlength(fqn);
+    for(i=1;i<nsteps;i++) { /* start at 1 to side-step root name */
+	assert(ISGROUP(current->sort));
+	name = (char*)nclistget(fqn,i);	
+        /* See if we can find a matching subgroup */
+	node = lookFor(current->group.elements,name,NCD4_GROUP);
+	if(node == NULL)
+	    break; /* reached the end of the group part of the fqn */
+	current = node;
+    }	    
+    /* Invariant:
+	1. i == nsteps => node != null => last node was a group:
+                                          it must be our target
+	2. i == (nsteps-1) => non-group node at the end; disambiguate
+	3. i < (nsteps - 1) => need a compound var to continue
+    */
+    if(i == nsteps) {
+	if(sort != NCD4_GROUP) goto sortfail;
+	goto done;
+    }
+    if(i == (nsteps - 1)) {
+	assert (node == NULL);
+        node = lookFor(current->group.elements,name,sort);
+	if(node == NULL) goto sortfail;
+	goto done;
+    }
+    assert (i < (nsteps - 1)); /* case 3 */
+    /* We have steps to take, so node better be a compound var */
+    node = lookFor(current->group.elements,name,NCD4_VAR);
+    if(node == NULL || !ISCMPD(node->basetype->subsort))
+	goto fail;
+    /* So we are at a compound variable, so walk its fields recursively */
+    /* Use the type to do the walk */
+    current = node->basetype;
+    assert (i < (nsteps - 1));
+    i++; /* skip variable name */
+    for(;;i++) {
+	int j;
+	name = (char*)nclistget(fqn,i);
+	assert(ISTYPE(current->sort) && ISCMPD(current->subsort));
+	for(node=NULL,j=0;j<nclistlength(current->vars);j++) {
+	    NCD4node* field = (NCD4node*)nclistget(current->vars,j);
+	    if(strcmp(field->name,name)==0)
+		{node = field; break;}
+	}
+	if(node == NULL) 
+	    goto sortfail; /* no match, so failed */
+	if(i == (nsteps - 1))
+	    break;
+	if(!ISCMPD(node->basetype->subsort)) 
+	    goto fail; /* more steps, but no compound field, so failed */
+	current = node->basetype;
+    }
+done:
+    if(result) *result = node;
+    return THROW(ret);
+fail:
+    ret = NC_EINVAL;
+    goto done;
+sortfail:
+    ret = NC_EBADID;
+    goto done;
+}
+
+static NCD4node*
+lookFor(NClist* elems, const char* name, NCD4sort sort)
+{
+    int n,i;
+    if(elems == NULL || nclistlength(elems) == 0) return NULL;
+    n = nclistlength(elems);
+    for(i=0;i<n;i++) {
+	NCD4node* node = (NCD4node*)nclistget(elems,i);
+	if(strcmp(node->name,name) == 0 && (sort == node->sort))
+	    return node;
+    }	
+    return NULL;
+}
+
+void
+NCD4_printElems(NCD4node* group)
+{
+    int n,i;
+    NClist* elems;
+    elems = group->group.elements;
+    if(elems == NULL || nclistlength(elems) == 0) return;
+    n = nclistlength(elems);
+    for(i=0;i<n;i++) {
+	NCD4node* node = (NCD4node*)nclistget(elems,i);
+	fprintf(stderr,"name=%s sort=%d subsort=%d\n",
+		node->name,node->sort,node->subsort);
+    }	
+    fflush(stderr);
+}
+
+static NCD4node*
+lookupFQN(NCD4parser* parser, const char* sfqn, NCD4sort sort)
+{
+    int ret = NC_NOERR;
+    NClist* fqnlist = nclistnew();
+    NCD4node* match = NULL;
+
+    /* Short circuit atomic types */
+    if(NCD4_TYPE == sort) {
+        match = lookupAtomictype(parser,(sfqn[0]=='/'?sfqn+1:sfqn));
+        if(match != NULL)
+	    goto done;
+    }
+    if((ret=NCD4_parseFQN(sfqn,fqnlist))) goto done;
+    if((ret=lookupFQNList(parser,fqnlist,sort,&match))) goto done;
+done:
+    nclistfreeall(fqnlist);
+    return (ret == NC_NOERR ? match : NULL);
+}
+
+static KEYWORDINFO*
+keyword(const char* name)
+{
+    int n = sizeof(keywordmap)/sizeof(KEYWORDINFO);
+    int L = 0;
+    int R = (n - 1);
+    for(;;) {
+	if(L > R) break;
+        int m = (L + R) / 2;
+	struct KEYWORDINFO* p = &keywordmap[m];
+	int cmp = strcasecmp(p->tag,name);
+	if(cmp == 0) return p;
+	if(cmp < 0)
+	    L = (m + 1);
+	else /*cmp > 0*/
+	    R = (m - 1);
+    }
+    return NULL;
+}
+
+static int
+defineBytestringType(NCD4parser* parser)
+{
+    int ret = NC_NOERR;
+    NCD4node* bstring = NULL;
+    if(parser->metadata->_bytestring == NULL) {
+        /* Construct a single global opaque type for mapping DAP opaque type */
+        ret = makeNode(parser,parser->metadata->root,NULL,NCD4_TYPE,NC_OPAQUE,&bstring);
+        if(ret != NC_NOERR) goto done;
+        SETNAME(bstring,"_bytestring");
+	bstring->opaque.size = 0;
+	bstring->basetype = lookupAtomictype(parser,"UInt8");
+        PUSH(parser->metadata->root->types,bstring);
+	parser->metadata->_bytestring = bstring;
+    } else
+	bstring = parser->metadata->_bytestring;
+done:    
+    return THROW(ret);
+}
+
+static int
+defineAtomicTypes(NCD4parser* parser)
+{
+    int ret = NC_NOERR;
+    NCD4node* node;
+    struct ATOMICTYPEINFO* ati;
+    
+    parser->atomictypes = nclistnew();
+    if(parser->atomictypes == NULL)
+	return THROW(NC_ENOMEM);
+    for(ati=atomictypeinfo;ati->name;ati++) {
+        if((ret=makeNode(parser,parser->metadata->root,NULL,NCD4_TYPE,ati->type,&node))) goto done;
+	SETNAME(node,ati->name);
+        node->container = parser->metadata->root;
+	record(parser,node);
+	PUSH(parser->atomictypes,node);
+    }
+
+done:
+    return THROW(ret);
+}
+
+/* Binary search the set of set of atomictypes */
+static NCD4node*
+lookupAtomictype(NCD4parser* parser, const char* name)
+{
+    int n = nclistlength(parser->atomictypes);
+    int L = 0;
+    int R = (n - 1);
+    NCD4node* p;
+
+    for(;;) {
+	if(L > R) break;
+        int m = (L + R) / 2;
+	p = (NCD4node*)nclistget(parser->atomictypes,m);
+	int cmp = strcasecmp(p->name,name);
+	if(cmp == 0) return p;
+	if(cmp < 0)
+	    L = (m + 1);
+	else /*cmp > 0*/
+	    R = (m - 1);
+    }
+    return NULL;
+}
+
+/**************************************************/
+
+static int
+makeNode(NCD4parser* parser, NCD4node* parent, ezxml_t xml, NCD4sort sort, nc_type subsort, NCD4node** nodep)
+{
+    int ret = NC_NOERR;
+    NCD4node* node = (NCD4node*)calloc(1,sizeof(NCD4node));
+
+    if(node == NULL) return THROW(NC_ENOMEM);
+    node->sort = sort;
+    node->subsort = subsort;
+    node->container = parent;
+    /* Set node name, if it exists */
+    if(xml != NULL) {
+        const char* name = ezxml_attr(xml,"name");
+        if(name != NULL) {
+	    if(strlen(name) > NC_MAX_NAME) {
+	        nclog(NCLOGERR,"Name too long: %s",name);
+	    }
+	    SETNAME(node,name);
+	}
+    }
+    if(parent != NULL) {
+	if(parent->sort == NCD4_GROUP)
+	    PUSH(parent->group.elements,node);
+    }
+    track(parser,node);
+    if(nodep) *nodep = node;
+    return THROW(ret);
+}
+
+static NCD4node*
+makeAnonDim(NCD4parser* parser, const char* sizestr)
+{
+    long long size = 0;
+    int ret;
+    char name[NC_MAX_NAME+1];
+    NCD4node* dim = NULL;
+    NCD4node* root = parser->metadata->root;
+
+    ret = parseLL(sizestr,&size);
+    if(ret) return NULL;
+    snprintf(name,NC_MAX_NAME,"/_Anonymous%lld",size);
+    /* See if it exists already */
+    dim = lookupFQN(parser,name,NCD4_DIM);
+    if(dim == NULL) {/* create it */
+	if((ret=makeNode(parser,root,NULL,NCD4_DIM,NC_NULL,&dim))) goto done;
+	SETNAME(dim,name+1); /* leave out the '/' separator */
+	dim->dim.size = (long long)size;
+	dim->dim.isanonymous = 1;
+	PUSH(root->dims,dim);
+    }
+done:
+    return (ret?NULL:dim);
+}
+
+/*
+Classify inserts the node into the proper container list
+based on the node's sort.
+*/
+static void
+classify(NCD4node* container, NCD4node* node)
+{
+    if(ISGROUP(container->sort))
+	nclistpush(container->group.elements,node);
+    switch (node->sort) {
+    case NCD4_GROUP:
+	PUSH(container->groups,node);
+        break;
+    case NCD4_DIM:
+	PUSH(container->dims,node);
+        break;
+    case NCD4_TYPE:
+	PUSH(container->types,node);
+        break;
+    case NCD4_VAR:
+	PUSH(container->vars,node);
+        break;
+    case NCD4_ATTR: case NCD4_XML:
+	PUSH(container->attributes,node);
+        break;
+    default: break;
+    }
+}
+
+/*
+Classify inserts the node into the proper parser global list
+based on the node's sort.
+*/
+static void
+record(NCD4parser* parser, NCD4node* node)
+{
+    switch (node->sort) {
+    case NCD4_GROUP:
+	PUSH(parser->groups,node);
+        break;
+    case NCD4_DIM:
+	PUSH(parser->dims,node);
+        break;
+    case NCD4_TYPE:
+	PUSH(parser->types,node);
+        break;
+    case NCD4_VAR:
+	PUSH(parser->vars,node);
+        break;
+    default: break;
+    }
+}
+
+/*
+Undo a classify and record
+for a field node.
+Used by buildSequenceType.
+*/
+#if 0
+static void
+forget(NCD4parser* parser, NCD4node* var)
+{
+    int i;
+    NCD4node* container = var->container;
+    assert(ISVAR(var->sort) && ISTYPE(container->sort) && ISCMPD(container->subsort));
+    /* Unrecord: remove from the parser lists */
+    for(i=0;i<parser->vars;i++) {
+	NCD4node* test = nclistget(parser->vars,i);
+	if(test == var) {
+	    nclistremove(parser->vars,i);
+	    break;
+	}
+    }
+    /* Unclassify: remove from the container var list */
+    for(i=0;i<container->vars;i++) {
+	NCD4node* test = nclistget(container->vars,i);
+	if(test == var) {
+	    nclistremove(container->vars,i);
+	    break;
+	}
+    }
+}
+#endif
+
+static void
+track(NCD4parser* parser, NCD4node* node)
+{
+#ifdef D4DEBUG
+    fprintf(stderr,"track: node=%lx sort=%d subsort=%d",(unsigned long)node,node->sort,node->subsort);
+    if(node->name != NULL)
+        fprintf(stderr," name=%s\n",node->name);
+    fprintf(stderr,"\n");
+#endif
+    PUSH(parser->metadata->allnodes,node);
+#ifdef D4DEBUG
+    fprintf(stderr,"track: |allnodes|=%ld\n",nclistlength(parser->metadata->allnodes));
+    fflush(stderr);
+#endif
+}
+
+/**************************************************/
+
+static int
+convertString(union ATOMICS* converter, NCD4node* type, const char* s)
+{
+    switch (type->subsort) {
+    case NC_BYTE:
+    case NC_SHORT:
+    case NC_INT:
+    case NC_INT64:
+	if(sscanf(s,"%lld",converter->i64) != 1) return THROW(NC_ERANGE);
+	break;
+    case NC_UBYTE:
+    case NC_USHORT:
+    case NC_UINT:
+    case NC_UINT64:
+	if(sscanf(s,"%llu",converter->u64) != 1) return THROW(NC_ERANGE);
+	break;
+    case NC_FLOAT:
+    case NC_DOUBLE:
+	if(sscanf(s,"%lf",converter->f64) != 1) return THROW(NC_ERANGE);
+	break;
+    case NC_STRING:
+	converter->s[0]= strdup(s);
+	break;
+    }/*switch*/
+    return downConvert(converter,type);
+}
+
+static int
+downConvert(union ATOMICS* converter, NCD4node* type)
+{
+    unsigned long long u64 = converter->u64[0];
+    long long i64 = converter->i64[0];
+    double f64 = converter->f64[0];
+    char* s = converter->s[0];
+    switch (type->subsort) {
+    case NC_BYTE:
+	converter->i8[0] = (char)i64;
+	break;
+    case NC_UBYTE:
+	converter->u8[0] = (unsigned char)u64;
+	break;
+    case NC_SHORT:
+	converter->i16[0] = (short)i64;
+	break;
+    case NC_USHORT:
+	converter->u16[0] = (unsigned short)u64;
+	break;
+    case NC_INT:
+	converter->i32[0] = (int)i64;
+	break;
+    case NC_UINT:
+	converter->u32[0] = (unsigned int)u64;
+	break;
+    case NC_INT64:
+	converter->i64[0] = i64;
+	break;
+    case NC_UINT64:
+	converter->u64[0]= u64;
+	break;
+    case NC_FLOAT:
+	converter->f32[0] = (float)f64;
+	break;
+    case NC_DOUBLE:
+	converter->f64[0] = f64;
+	break;
+    case NC_STRING:
+	converter->s[0]= s;
+	break;
+    }/*switch*/
+    return THROW(NC_NOERR);
+}
+
+#if 0
+/* Try to remove excess text from a value set */
+static int
+valueParse(NCD4node* type, const char* values0, NClist* vlist)
+{
+    char* values;
+    char* p;
+    char* q;
+    char* s;
+    char* line;
+    ptrdiff_t len;
+
+    if(values0 == NULL || (len=strlen(values0)) == 0)
+	return THROW(NC_NOERR);
+    values = strdup(values0);
+    /* Compress the text by removing sequences of blanks and newlines:
+       note that this will fail for string typed values that might have
+       embedded blanks, so in that case, we assume each string is on a separate line.
+       For NC_CHAR, we treat like strings, except we use the last char in the line
+       as the value. This is all heuristic.
+    */
+    switch (type->subsort) {
+    case NC_STRING:
+	p = values;
+	for(;;) {
+	    if(*p == '\0') break;
+	    line = p;
+	    /* Start by looking for \n or \r\n */
+            for(;*p;p++) {if(*p == '\n') break;}
+	    q = p - 1;
+	    *p++ = '\0';
+	    if(*q == '\r') {*q = '\0';}
+            nclistpush(vlist,strdup(line));
+	}	
+	break;
+    case NC_CHAR:
+	p = values;
+	for(;*p;) {
+	    char c[2];
+	    line = p;
+	    /* Start by looking for \n or \r\n */
+            for(;*p;p++) {if(*p == '\n') break;}
+	    q = p;
+	    *p++ = '\0';
+	    q--;
+	    if(*q == '\r') {*q = '\0';}
+	    len = strlen(line);
+	    if(len > 0) {
+		c[0] = *q;
+		c[1] = '\0';
+		nclistpush(vlist,strdup(c));
+	    }
+	}	
+	break;
+    default:
+	p = values;
+        for(;*p;p++) {if(*p <= ' ') *p = '\n';}
+	line = values;
+	for(p=line;*p;p++) {if(*p == '\n') break;}
+	for(line=values;*line;) {
+	    size_t size = strlen(line);
+	    if(size > 0)
+	        nclistpush(vlist,strdup(line));
+	    line += (size+1); /* skip terminating nul */
+	}
+	break;
+    }
+    free(values);
+    return THROW(NC_NOERR);
+}
+#endif
diff --git a/libdap4/d4printer.c b/libdap4/d4printer.c
new file mode 100644
index 0000000..778f11c
--- /dev/null
+++ b/libdap4/d4printer.c
@@ -0,0 +1,591 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+
+/**
+This provides a simple dap4  metadata -> xml printer.
+Used to test the parser
+*/
+
+#define NCD4_parse t_parse /* to avoid dup defs */
+
+#include "ncd4types.h"
+#include "ncd4.h"
+
+/**************************************************/
+
+typedef struct D4printer {
+    NCbytes* out;
+    NCbytes* tmp;
+    NCD4meta* metadata;
+} D4printer;
+
+/**************************************************/
+
+#define CAT(x) ncbytescat(out->out,x)
+#define INDENT(x) indent(out,x)
+
+
+/**************************************************/
+/* Forwards */
+
+static void atomicsToString(D4printer*, union ATOMICS* value, nc_type type);
+static int hasMetaData(NCD4node* node);
+static void indent(D4printer*, int depth);
+static int printAttribute(D4printer*, NCD4node* attr, int depth);
+static int printDataset(D4printer* out, NCD4node* node, int depth);
+static int printDimref(D4printer*, NCD4node* d, int depth);
+static int printGroup(D4printer* out, NCD4node* node, int depth);
+static int printGroupBody(D4printer* out, NCD4node* node, int depth);
+static int printMap(D4printer* out, NCD4node* mapref, int depth);
+static int printMetaData(D4printer* out, NCD4node* node, int depth);
+static int printNode(D4printer*, NCD4node* node, int depth);
+static int printValue(D4printer*, const char* value, int depth);
+static int printVariable(D4printer*, NCD4node* var, int depth);
+static int printXMLAttributeAtomics(D4printer*, char* name, union ATOMICS* value, nc_type type);
+static int printXMLAttributeName(D4printer*, char* name, const char* value);
+static int printXMLAttributeSize(D4printer*, char* name, size_t value);
+static int printXMLAttributeString(D4printer*, char* name, const char* value);
+
+/**************************************************/
+
+int
+NCD4_print(NCD4meta* metadata, NCbytes* output)
+{
+    int ret = NC_NOERR;
+    D4printer out;
+    if(metadata == NULL || output == NULL) return THROW(NC_EINVAL);
+    out.out = output;
+    out.tmp = ncbytesnew();
+    out.metadata = metadata;
+    ret = printNode(&out,metadata->root,0);
+    ncbytesfree(out.tmp);
+    return THROW(ret);
+}
+
+/*************************************************/
+
+/**
+ * Print an arbitrary file and its subnodes in xml
+ * Handling newlines is a bit tricky because they may be
+ * embedded for e.g. groups, enums,
+ * etc.	 So the rule is that the
+ * last newline is elided and left
+ * for the caller to print.
+ * Exceptions: printMetadata
+ * printDimrefs.
+ *
+ * @param out - the output buffer
+ * @param node - the tree to print
+ * @param depth - the depth of our code
+ */
+
+static int
+printNode(D4printer* out, NCD4node* node, int depth)
+{
+    int ret = NC_NOERR;
+    int i;
+    char* fqn = NULL;
+
+    switch (node->sort) {
+    case NCD4_GROUP:
+	if(node->group.isdataset)
+	    printDataset(out,node,depth);
+	else
+	    printGroup(out,node,depth);
+	break;
+
+    case NCD4_DIM:
+	INDENT(depth);
+	CAT("<Dimension");
+	if(node->name != NULL)
+	    printXMLAttributeName(out, "name", node->name);
+	printXMLAttributeSize(out, "size", node->dim.size);
+	if(node->dim.isunlimited)
+	    printXMLAttributeString(out, UCARTAGUNLIM, "1");
+	CAT("/>");
+	break;
+
+    case NCD4_TYPE:
+	switch (node->subsort) {
+	default: break;
+	case NC_OPAQUE:
+	    INDENT(depth); CAT("<Opaque");
+	    ncbytesclear(out->tmp);
+	    printXMLAttributeName(out, "name", node->name);
+	    if(node->opaque.size > 0)
+	        printXMLAttributeSize(out, "size", node->opaque.size);
+	    CAT("/>");
+	    break;	    
+	case NC_ENUM:
+	    INDENT(depth); CAT("<Enumeration");
+	    printXMLAttributeName(out, "name", node->name);
+	    if(node->basetype->subsort <= NC_MAX_ATOMIC_TYPE)
+		printXMLAttributeName(out, "basetype", node->basetype->name);
+	    else {
+		char* fqn = NULL;
+		printXMLAttributeName(out, "basetype", (fqn = NCD4_makeFQN(node->basetype)));
+		nullfree(fqn);
+	    }
+	    CAT(">\n");
+	    depth++;
+	    for(i=0;i<nclistlength(node->en.econsts);i++) {
+		NCD4node* ec = (NCD4node*)nclistget(node->en.econsts,i);
+		INDENT(depth);
+		CAT("<EnumConst");
+		printXMLAttributeName(out, "name", ec->name);
+		printXMLAttributeAtomics(out, "value", &ec->en.ecvalue, node->basetype->subsort);
+		CAT("/>\n");
+	    }
+	    depth--;
+	    INDENT(depth); CAT("</Enumeration>");
+	    break;
+	case NC_STRUCT:
+	    INDENT(depth);
+	    CAT("<Structure");
+	    printXMLAttributeName(out, "name", node->name);
+	    CAT(">\n");
+	    depth++;
+	    for(i=0;i<nclistlength(node->vars);i++) {
+		NCD4node* field = (NCD4node*)nclistget(node->vars,i);
+		printVariable(out,field,depth);
+		CAT("\n");
+	    }
+	    if((ret=printMetaData(out,node,depth))) goto done;
+	    depth--;
+	    INDENT(depth);
+	    CAT("</Structure>");
+	    break;
+	case NC_SEQ:
+	    INDENT(depth);
+	    CAT("<Vlen");
+	    printXMLAttributeName(out, "name", node->name);
+	    printXMLAttributeName(out, "type", (fqn=NCD4_makeFQN(node->basetype)));
+	    if(hasMetaData(node)) {
+		CAT(">\n");
+		depth++;
+		if((ret=printMetaData(out,node,depth))) goto done;
+		depth--;
+		INDENT(depth);
+		CAT("</Vlen>");
+	    } else
+	        CAT("/>");
+  	    break;
+        } break;
+    case NCD4_VAR: /* Only top-level vars are printed here */
+	if(ISTOPLEVEL(node)) {
+  	    if((ret=printVariable(out,node,depth))) goto done;
+	    CAT("\n");
+	}
+	break;
+
+    default: abort(); break;
+    }
+done:
+    nullfree(fqn);
+    return THROW(ret);
+}
+
+static int
+printVariable(D4printer* out, NCD4node* var, int depth)
+{
+    int ret = NC_NOERR;
+    NCD4node* basetype = var->basetype;
+    char* fqn = NULL;
+
+    INDENT(depth); CAT("<");
+    switch (var->subsort) {
+    default:
+	CAT(basetype->name);
+	printXMLAttributeName(out, "name", var->name);
+	break;
+    case NC_ENUM:
+	CAT("Enum");
+	printXMLAttributeName(out, "name", var->name);
+	printXMLAttributeName(out, "enum", (fqn=NCD4_makeFQN(basetype)));
+	break;
+    case NC_OPAQUE:
+	CAT("Opaque");
+	printXMLAttributeName(out, "name", var->name);
+	printXMLAttributeName(out, "type", (fqn=NCD4_makeFQN(basetype)));
+	break;
+    case NC_SEQ:
+	CAT("Seq");
+	printXMLAttributeName(out, "name", var->name);
+	printXMLAttributeName(out, "type", (fqn=NCD4_makeFQN(basetype)));
+	break;
+    case NC_STRUCT:
+	CAT("Struct");
+	printXMLAttributeName(out, "name", var->name);
+	printXMLAttributeName(out, "type", (fqn=NCD4_makeFQN(basetype)));
+	break;
+    }
+    if(hasMetaData(var)) {
+	CAT(">\n");
+	depth++;
+	if((ret=printMetaData(out,var,depth))) goto done;
+	depth--;
+	INDENT(depth); CAT("</");
+	if(basetype->subsort == NC_ENUM)
+	    CAT("Enum");
+	else if(basetype->subsort == NC_OPAQUE)
+	    CAT("Opaque");
+	else if(basetype->subsort == NC_STRUCT)
+	    CAT("Struct");
+	else if(basetype->subsort == NC_SEQ)
+	    CAT("Sequence");
+	else
+	    CAT(basetype->name);
+	CAT(">");
+    } else
+	CAT("/>");
+done:
+    nullfree(fqn);
+    return THROW(ret);
+}
+
+static int
+printDataset(D4printer* out, NCD4node* node, int depth)
+{
+    int ret = NC_NOERR;
+    CAT("<Dataset\n");
+    depth++;
+    INDENT(depth);
+    printXMLAttributeName(out,"name",node->group.datasetname);
+    CAT("\n");
+    INDENT(depth);
+    printXMLAttributeName(out,"dapVersion",node->group.dapversion);
+    CAT("\n");
+    INDENT(depth);
+    printXMLAttributeName(out,"dmrVersion",node->group.dmrversion);
+    CAT("\n");
+    INDENT(depth);
+    printXMLAttributeName(out,"xmlns","http://xml.opendap.org/ns/DAP/4.0#");
+    CAT("\n");
+    INDENT(depth);
+    printXMLAttributeName(out,"xmlns:dap","http://xml.opendap.org/ns/DAP/4.0#");
+    depth--;
+    CAT(">\n");
+    depth++;
+    ret = printGroupBody(out,node,depth);
+    depth--;
+    INDENT(depth);
+    CAT("</Dataset>");
+    return THROW(ret);	   
+}
+
+static int
+printGroup(D4printer* out, NCD4node* node, int depth)
+{
+    int ret = NC_NOERR;
+    INDENT(depth);
+    CAT("<Group");
+    printXMLAttributeName(out,"name",node->name);
+    CAT(">\n");
+    depth++;
+    ret = printGroupBody(out,node,depth);
+    depth--;
+    INDENT(depth);
+    CAT("</Group>");
+    return THROW(ret);	   
+}	
+
+static int
+printGroupBody(D4printer* out, NCD4node* node, int depth)
+{
+    int ret = NC_NOERR;
+    int i,ngroups,nvars,ntypes,ndims,nattrs;
+
+    ngroups = nclistlength(node->groups);
+    nvars = nclistlength(node->vars);
+    ntypes = nclistlength(node->types);
+    ndims = nclistlength(node->dims);
+    nattrs = nclistlength(node->attributes);
+
+    if(ndims > 0) {
+	INDENT(depth);
+	CAT("<Dimensions>\n");
+	depth++;
+	for(i=0;i<nclistlength(node->dims);i++) {
+	    NCD4node* dim = (NCD4node*)nclistget(node->dims,i);
+	    printNode(out,dim,depth);
+	    CAT("\n");
+	}
+	depth--;
+	INDENT(depth);
+	CAT("</Dimensions>\n");
+    }
+    if(ntypes > 0) {
+	INDENT(depth);
+	CAT("<Types>\n");
+	depth++;
+	for(i=0;i<nclistlength(node->types);i++) {
+	    NCD4node* type = (NCD4node*)nclistget(node->types,i);
+	    if(type->subsort <= NC_MAX_ATOMIC_TYPE) continue;
+	    printNode(out,type,depth);
+	    CAT("\n");
+	}
+	depth--;
+	INDENT(depth);
+	CAT("</Types>\n");
+    }
+    if(nvars > 0) {
+	INDENT(depth);
+	CAT("<Variables>\n");
+	depth++;
+	for(i=0;i<nclistlength(node->vars);i++) {
+	    NCD4node* var = (NCD4node*)nclistget(node->vars,i);
+	    printNode(out,var,depth);
+	}
+	depth--;
+	INDENT(depth);
+	CAT("</Variables>\n");
+    }
+    if(nattrs > 0) {
+	for(i=0;i<nclistlength(node->attributes);i++) {
+	    NCD4node* attr = (NCD4node*)nclistget(node->attributes,i);
+	    printAttribute(out,attr,depth);
+	    CAT("\n");
+	}
+    }
+    if(ngroups > 0) {
+	INDENT(depth);
+	CAT("<Groups>\n");
+	depth++;
+	for(i=0;i<nclistlength(node->groups);i++) {
+	    NCD4node* g = (NCD4node*)nclistget(node->groups,i);
+	    printNode(out,g,depth);
+	    CAT("\n");
+	}
+	depth--;
+	INDENT(depth);
+	CAT("</Groups>\n");
+    }
+    return THROW(ret);
+}
+
+static int
+printMetaData(D4printer* out, NCD4node* node, int depth)
+{
+    int ret = NC_NOERR;
+    int i;
+
+    if(nclistlength(node->dims) > 0) {
+	for(i=0;i<nclistlength(node->dims);i++) {
+	    NCD4node* dim = (NCD4node*)nclistget(node->dims,i);
+	    printDimref(out,dim,depth);
+	    CAT("\n");
+	}
+    }
+    if(nclistlength(node->maps) > 0) {
+	for(i=0;i<nclistlength(node->maps);i++) {
+	    NCD4node* mapref = (NCD4node*)nclistget(node->maps,i);
+	    printMap(out,mapref,depth);
+	    CAT("\n");
+	}
+     }
+    if(nclistlength(node->attributes) > 0) {
+	for(i=0;i<nclistlength(node->attributes);i++) {
+	    NCD4node* attr = (NCD4node*)nclistget(node->attributes,i);
+	    printAttribute(out,attr,depth);
+	    CAT("\n");
+	}
+    }
+    return THROW(ret);
+}
+
+static int
+printXMLAttributeName(D4printer* out, char* name, const char* value)
+{
+    int ret = NC_NOERR;
+    char* escaped = NULL;
+
+    if(name == NULL) return THROW(ret);
+    if(value == NULL) value = "";
+    CAT(" "); CAT(name); CAT("=\"");
+    /* add xml entity escaping */
+    escaped = NCD4_entityescape(value);
+    CAT(escaped);
+    CAT("\"");
+    nullfree(escaped);
+    return THROW(ret);
+}
+
+
+static int
+printXMLAttributeString(D4printer* out, char* name, const char* value)
+{
+    int ret = NC_NOERR;
+    char* escaped = NULL;
+    if(name == NULL) return THROW(ret);
+    CAT(" "); CAT(name);
+    CAT("=");
+    CAT("\"");
+    if(value == NULL) value = "";
+    /* add xml entity escaping */
+    escaped = NCD4_entityescape(value);
+    CAT(escaped);
+    CAT("\"");
+    nullfree(escaped);
+    return THROW(ret);
+}
+
+static int
+printXMLAttributeSize(D4printer* out, char* name, size_t value)
+{
+    union ATOMICS atomics;
+    atomics.u64[0] = (unsigned long long)value;
+    return printXMLAttributeAtomics(out,name,&atomics,NC_UINT64);
+}
+
+static int
+printXMLAttributeAtomics(D4printer* out, char* name, union ATOMICS* value, nc_type type)
+{
+    int ret = NC_NOERR;
+    CAT(" "); CAT(name); CAT("=\"");
+    atomicsToString(out,value,type);	
+    CAT(ncbytescontents(out->tmp));
+    CAT("\"");
+    return THROW(ret);
+}
+
+static int
+printAttribute(D4printer* out, NCD4node* attr, int depth)
+{
+    int ret = NC_NOERR;
+    int i = 0;
+    char* fqn = NULL;
+
+    INDENT(depth); CAT("<Attribute");
+    printXMLAttributeName(out,"name",attr->name);
+    if(attr->basetype->subsort <=  NC_MAX_ATOMIC_TYPE)
+	printXMLAttributeName(out,"type",attr->basetype->name);
+    else {
+	printXMLAttributeName(out,"type",(fqn = NCD4_makeFQN(attr->basetype)));
+    }
+    CAT(">\n");
+    depth++;
+    for(i=0;i<nclistlength(attr->attr.values);i++) {
+	printValue(out,(const char*)nclistget(attr->attr.values,i),depth);
+	CAT("\n");
+    }
+    depth--;
+    INDENT(depth);
+    CAT("</Attribute>");
+
+    nullfree(fqn);
+    return THROW(ret);
+}
+
+/**
+ * Print the dimrefs for a variable's dimensions.
+ * If the variable has a non-whole projection, then use size
+ * else use the dimension name.
+ *
+ * @param var whole dimensions are to be printed
+ * @throws DapException
+ */
+static int
+printDimref(D4printer* out, NCD4node* d, int depth)
+{
+    char* fqn = NULL;
+    INDENT(depth);
+    CAT("<Dim");
+    printXMLAttributeName(out, "name", (fqn=NCD4_makeFQN(d)));
+    CAT("/>");
+    nullfree(fqn);
+    return THROW(NC_NOERR);
+}
+
+static int
+printValue(D4printer* out, const char* value, int depth)
+{
+    int ret = NC_NOERR;
+    INDENT(depth);
+    CAT("<Value");
+    printXMLAttributeString(out,"value",value);
+    CAT("/>");
+    return THROW(ret);
+}
+
+static int
+printMap(D4printer* out, NCD4node* mapref, int depth)
+{
+    char* fqn = NULL;
+    INDENT(depth);
+    CAT("<Map");
+    printXMLAttributeName(out, "name", (fqn=NCD4_makeFQN(mapref)));
+    CAT("/>");
+    nullfree(fqn);
+    return THROW(NC_NOERR);
+}
+
+/*************************************************/
+/* Misc. Static Utilities */
+
+static void
+indent(D4printer* out, int depth)
+{
+    while(depth-- > 0) ncbytescat(out->out,"  ");
+}
+
+static int
+hasMetaData(NCD4node* node)
+{
+    return (nclistlength(node->dims) > 0
+       || nclistlength(node->attributes) > 0
+       || nclistlength(node->maps) > 0);
+}
+
+static void
+atomicsToString(D4printer* out, union ATOMICS* value, nc_type type)
+{
+    char tmp[256];
+    ncbytesclear(out->tmp);
+    switch (type) {
+    case NC_CHAR:
+	snprintf(tmp,sizeof(tmp),"'%c'",value->i8[0]);
+	break;
+    case NC_BYTE:
+	snprintf(tmp,sizeof(tmp),"%d",value->i8[0]);
+	break;
+    case NC_UBYTE:
+	snprintf(tmp,sizeof(tmp),"%u",value->u8[0]);
+	break;
+    case NC_SHORT:
+	snprintf(tmp,sizeof(tmp),"%d",value->i16[0]);
+	break;
+    case NC_USHORT:
+	snprintf(tmp,sizeof(tmp),"%u",value->u16[0]);
+	break;
+    case NC_INT:
+	snprintf(tmp,sizeof(tmp),"%d",value->i32[0]);
+	break;
+    case NC_UINT:
+	snprintf(tmp,sizeof(tmp),"%u",value->u32[0]);
+	break;
+    case NC_INT64:
+	snprintf(tmp,sizeof(tmp),"%lld",value->i64[0]);
+	break;
+    case NC_UINT64:
+	snprintf(tmp,sizeof(tmp),"%llu",value->u64[0]);
+	break;
+    case NC_FLOAT:
+	snprintf(tmp,sizeof(tmp),"%g",value->f32[0]);
+	break;
+    case NC_DOUBLE:
+	snprintf(tmp,sizeof(tmp),"%g",value->f64[0]);
+	break;
+    case NC_STRING:
+	ncbytescat(out->tmp,"\"");
+	ncbytescat(out->tmp,value->s[0]);
+	ncbytescat(out->tmp,"\"");
+	break;
+    default: abort();
+    }
+    if(type != NC_STRING) ncbytescat(out->tmp,tmp);
+    ncbytesnull(out->tmp);
+}
diff --git a/libdap4/d4rc.c b/libdap4/d4rc.c
new file mode 100644
index 0000000..93a4443
--- /dev/null
+++ b/libdap4/d4rc.c
@@ -0,0 +1,621 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+
+#define D4RCFILEENV "DAPRCFILE"
+
+#define RTAG ']'
+#define LTAG '['
+
+#define TRIMCHARS " \t\r\n"
+
+#undef MEMCHECK
+#define MEMCHECK(x) if((x)==NULL) {goto nomem;} else {}
+
+/* Forward */
+static char* extract_credentials(NCURI*);
+static int rccompile(const char* path);
+static struct NCD4triple* rclocate(char* key, char* hostport);
+static void rcorder(NClist* rc);
+static char* rcreadline(char**);
+static int rcsearch(const char* prefix, const char* rcname, char** pathp);
+static void rctrim(char* text);
+static void storedump(char* msg, NClist* triples);
+static int rcsetinfocurlflag(NCD4INFO*, const char* flag, const char* value);
+
+/* Define default rc files and aliases, also defines search order*/
+static char* rcfilenames[] = {".daprc",".dodsrc",NULL};
+
+/* Define the curl flag defaults in envv style */
+static const char* RCDEFAULTFLAGS[] = {
+"HTTP.TIMEOUT","10", /*seconds */
+NULL
+};
+
+static char*
+rcreadline(char** nextlinep)
+{
+    char* line;
+    char* p;
+
+    line = (p = *nextlinep);
+    if(*p == '\0') return NULL; /*signal done*/
+    for(;*p;p++) {
+	if(*p == '\r' && p[1] == '\n') *p = '\0';
+	else if(*p == '\n') break;
+    }
+    *p++ = '\0'; /* null terminate line; overwrite newline */
+    *nextlinep = p;
+    return line;
+}
+
+/* Trim TRIMCHARS from both ends of text; */
+static void
+rctrim(char* text)
+{
+    char* p = text;
+    size_t len;
+    int i;
+
+    len = strlen(text);
+    /* locate first non-trimchar */
+    for(;*p;p++) {
+       if(strchr(TRIMCHARS,*p) == NULL) break; /* hit non-trim char */
+    }
+    d4memmove(text,p,strlen(p)+1);
+    len = strlen(text);
+    /* locate last non-trimchar */
+    if(len > 0) {
+        for(i=(len-1);i>=0;i--) {
+            if(strchr(TRIMCHARS,text[i]) == NULL) {
+                text[i+1] = '\0'; /* elide trailing trimchars */
+                break;
+            }
+        }
+    }
+}
+
+/* Order the triples: put all those with urls first */
+static void
+rcorder(NClist* rc)
+{
+    int i,j;
+    int len = nclistlength(rc);
+    if(rc == NULL || len == 0) return;
+    for(i=0;i<len;i++) {
+	NCD4triple* ti = nclistget(rc,i);
+	if(ti->host != NULL) continue;
+	for(j=i;j<len;j++) {
+	    NCD4triple* tj = nclistget(rc,j);
+	    if(tj->host != NULL) {/*swap*/
+		NCD4triple* t = ti;
+		nclistset(rc,i,tj);		
+		nclistset(rc,j,t);
+	    }
+	}
+    }
+    storedump("reorder:",rc);
+}
+
+
+/* Create a triple store from a file */
+static int
+rccompile(const char* path)
+{
+    int ret = NC_NOERR;
+    NClist* rc = NCD4_globalstate->rc.rc;
+    char* contents = NULL;
+    NCbytes* tmp = ncbytesnew();
+    NCURI* uri = NULL;
+    char* nextline = NULL;
+
+    if((ret=NCD4_readfile(path,tmp))) {
+        nclog(NCLOGERR, "Could not open configuration file: %s",path);	
+	goto done;    
+    }
+    contents = ncbytesextract(tmp);
+    if(contents == NULL) contents = strdup("");
+    NCD4_rcfree(rc); /* clear out any old data */
+    rc = nclistnew();
+    nextline = contents;
+    for(;;) {
+	char* line;
+	char* key;
+        char* value;
+	size_t llen;
+        NCD4triple* triple;
+
+	line = rcreadline(&nextline);
+	if(line == NULL) break; /* done */
+        rctrim(line);  /* trim leading and trailing blanks */
+        if(line[0] == '#') continue; /* comment */
+	if((llen=strlen(line)) == 0) continue; /* empty line */
+	triple = (NCD4triple*)calloc(1,sizeof(NCD4triple));
+	if(triple == NULL) {ret = NC_ENOMEM; goto done;}
+        if(line[0] == LTAG) {
+            char* url = ++line;
+            char* rtag = strchr(line,RTAG);
+            if(rtag == NULL) {
+                nclog(NCLOGERR, "Malformed [url] in %s entry: %s",path,line);
+                continue;
+            }
+            line = rtag + 1;
+            *rtag = '\0';
+            /* compile the url and pull out the host */
+	    if(uri) ncurifree(uri);
+	    if(ncuriparse(url,&uri) != NCU_OK) {
+                nclog(NCLOGERR, "Malformed [url] in %s entry: %s",path,line);
+		continue;
+	    }
+	    ncbytesclear(tmp);
+	    ncbytescat(tmp,uri->host);
+	    if(uri->port != NULL) {
+		ncbytesappend(tmp,':');
+	        ncbytescat(tmp,uri->port);	
+	    }
+	    ncbytesnull(tmp);
+	    triple->host = ncbytesextract(tmp);
+        }
+        /* split off key and value */
+        key=line;
+        value = strchr(line, '=');
+        if(value == NULL)
+            value = line + strlen(line);
+        else {
+            *value = '\0';
+            value++;
+        }
+	triple->key = strdup(key);
+        triple->value = strdup(value);
+        rctrim(triple->key);
+        rctrim(triple->value);
+#ifdef D4DEBUG
+	fprintf(stderr,"rc: host=%s key=%s value=%s\n",
+		triple->host,triple->key,triple->valu);
+#endif
+	nclistpush(rc,triple);
+	triple = NULL;
+    }
+    rcorder(rc);
+
+done:
+    ncurifree(uri);
+    ncbytesfree(tmp);
+    return THROW(ret);
+}
+
+/* locate, read and compile the rc file, if any */
+int
+NCD4_rcload(void)
+{
+    int ret = NC_NOERR;
+    char* path = NULL;
+
+    if(NCD4_globalstate->rc.ignore) {
+        nclog(NCLOGDBG,"No runtime configuration file specified; continuing");
+	return THROW(NC_NOERR);
+    }
+    if(NCD4_globalstate->rc.loaded) return THROW(NC_NOERR);
+
+    /* locate the configuration files in the following order:
+       1. specified by NCD4_set_rcfile
+       2. set by DAPRCFILE env variable
+       3. '.'
+       4. $HOME
+    */
+    if(NCD4_globalstate->rc.rcfile != NULL) { /* always use this */
+	path = strdup(NCD4_globalstate->rc.rcfile);
+    } else if(getenv(RCFILEENV) != NULL && strlen(getenv(RCFILEENV)) > 0) {
+        path = strdup(getenv(RCFILEENV));
+    } else {
+	char** rcname;
+	int found = 0;
+	for(rcname=rcfilenames;!found && *rcname;rcname++) {
+	    ret = rcsearch(".",*rcname,&path);
+    	    if(ret == NC_NOERR && path == NULL)  /* try $HOME */
+	        ret = rcsearch(NCD4_globalstate->home,*rcname,&path);
+	    if(ret != NC_NOERR)
+		goto done;
+	    if(path != NULL)
+		found = 1;
+	}
+    }
+    if(path == NULL) {
+        nclog(NCLOGDBG,"Cannot find runtime configuration file; continuing");
+    } else {
+#ifdef D4DEBUG
+        fprintf(stderr, "RC file: %s\n", path);
+#endif
+        if((ret=rccompile(path))) {
+	    nclog(NCLOGERR, "Error parsing %s\n",path);
+	    goto done;
+	}
+    }
+done:
+    NCD4_globalstate->rc.loaded = 1; /* even if not exists */
+    nullfree(path);
+    return THROW(ret);
+}
+
+static int
+rcsetinfocurlflag(NCD4INFO* info, const char* flag, const char* value)
+{
+    int ret = NC_NOERR;
+    if(value == NULL) goto done;
+    if(strcmp(flag,"HTTP.DEFLATE")==0) {
+        if(atoi(value)) info->curl->curlflags.compress = 1;
+#ifdef D4DEBUG
+        nclog(NCLOGNOTE,"HTTP.DEFLATE: %ld", info->curlflags.compress);
+#endif
+    }
+    if(strcmp(flag,"HTTP.VERBOSE")==0) {
+        if(atoi(value)) info->curl->curlflags.verbose = 1;
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.VERBOSE: %ld", info->curl->curlflags.verbose);
+#endif
+    }
+    if(strcmp(flag,"HTTP.TIMEOUT")==0) {
+        if(atoi(value)) info->curl->curlflags.timeout = atoi(value);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.TIMEOUT: %ld", info->curl->curlflags.timeout);
+#endif
+    }
+    if(strcmp(flag,"HTTP.USERAGENT")==0) {
+        if(atoi(value)) info->curl->curlflags.useragent = strdup(value);
+        MEMCHECK(info->curl->curlflags.useragent);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.USERAGENT: %s", info->curl->curlflags.useragent);
+#endif
+    }
+    if(
+	strcmp(flag,"HTTP.COOKIEFILE")==0
+        || strcmp(flag,"HTTP.COOKIE_FILE")==0
+        || strcmp(flag,"HTTP.COOKIEJAR")==0
+        || strcmp(flag,"HTTP.COOKIE_JAR")==0
+      ) {
+	nullfree(info->curl->curlflags.cookiejar);
+        info->curl->curlflags.cookiejar = strdup(value);
+        MEMCHECK(info->curl->curlflags.cookiejar);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.COOKIEJAR: %s", info->curl->curlflags.cookiejar);
+#endif
+    }
+    if(strcmp(flag,"HTTP.PROXY_SERVER")==0) {
+        ret = NCD4_parseproxy(info,value);
+        if(ret != NC_NOERR) goto done;
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.PROXY_SERVER: %s", value);
+#endif
+    }
+    if(strcmp(flag,"HTTP.SSL.VALIDATE")==0) {
+        if(atoi(value)) {
+	    info->curl->ssl.verifypeer = 1;
+	    info->curl->ssl.verifyhost = 1;
+#ifdef D4DEBUG
+                nclog(NCLOGNOTE,"HTTP.SSL.VALIDATE: %ld", 1);
+#endif
+	}
+    }
+
+    if(strcmp(flag,"HTTP.SSL.CERTIFICATE")==0) {
+	nullfree(info->curl->ssl.certificate);
+        info->curl->ssl.certificate = strdup(value);
+        MEMCHECK(info->curl->ssl.certificate);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.SSL.CERTIFICATE: %s", info->curl->ssl.certificate);
+#endif
+    }
+
+    if(strcmp(flag,"HTTP.SSL.KEY")==0) {
+	nullfree(info->curl->ssl.key);
+        info->curl->ssl.key = strdup(value);
+        MEMCHECK(info->curl->ssl.key);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.SSL.KEY: %s", info->curl->ssl.key);
+#endif
+    }
+
+    if(strcmp(flag,"HTTP.SSL.KEYPASSWORD")==0) {
+	nullfree(info->curl->ssl.keypasswd) ;
+        info->curl->ssl.keypasswd = strdup(value);
+        MEMCHECK(info->curl->ssl.keypasswd);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.SSL.KEYPASSWORD: %s", info->curl->ssl.keypasswd);
+#endif
+    }
+
+    if(strcmp(flag,"HTTP.SSL.CAINFO")==0) {
+	nullfree(info->curl->ssl.cainfo) ;
+        info->curl->ssl.cainfo = strdup(value);
+        MEMCHECK(info->curl->ssl.cainfo);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.SSL.CAINFO: %s", info->curl->ssl.cainfo);
+#endif
+    }
+
+    if(strcmp(flag,"HTTP.SSL.CAPATH")==0) {
+	nullfree(info->curl->ssl.capath) ;
+        info->curl->ssl.capath = strdup(value);
+        MEMCHECK(info->curl->ssl.capath);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.SSL.CAPATH: %s", info->curl->ssl.capath);
+#endif
+    }
+
+    if(strcmp(flag,"HTTP.SSL.VERIFYPEER")==0) {
+        const char* s = value;
+        int tf = 0;
+        if(s == NULL || strcmp(s,"0")==0 || strcasecmp(s,"false")==0)
+            tf = 0;
+        else if(strcmp(s,"1")==0 || strcasecmp(s,"true")==0)
+            tf = 1;
+        else
+            tf = 1; /* default if not null */
+        info->curl->ssl.verifypeer = tf;
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.SSL.VERIFYPEER: %d", info->curl->ssl.verifypeer);
+#endif
+    }
+
+    if(strcmp(flag,"HTTP.NETRC")==0) {
+        nullfree(info->curl->curlflags.netrc);
+        info->curl->curlflags.netrc = strdup(value);
+        MEMCHECK(info->curl->curlflags.netrc);
+#ifdef D4DEBUG
+            nclog(NCLOGNOTE,"HTTP.NETRC: %s", info->curl->curlflags.netrc);
+#endif
+    }
+
+    if(strcmp(flag,"HTTP.CREDENTIALS.USERPASSWORD")==0) {
+        nullfree(info->curl->creds.userpwd);
+        info->curl->creds.userpwd = strdup(value);
+        MEMCHECK(info->curl->creds.userpwd);
+    }
+
+done:
+    return THROW(ret);
+
+nomem:
+    return THROW(NC_ENOMEM);
+}
+
+int
+NCD4_rcprocess(NCD4INFO* info)
+{
+    int ret = NC_NOERR;
+    char userpwd[NC_MAX_PATH];
+    char hostport[NC_MAX_PATH];
+    char* url_userpwd = userpwd; /* WATCH OUT: points to previous variable */
+    char* url_hostport = hostport; /* WATCH OUT: points to previous variable */
+    NCURI* uri = info->uri;
+
+    assert (NCD4_globalstate != NULL);
+
+    if(!NCD4_globalstate->rc.loaded)
+	NCD4_rcload();
+
+    /* Note, we still must do this function even if
+       NCD4_globalstate->rc.ignore is set in order
+       to getinfo e.g. user:pwd from url
+    */
+
+    if(uri != NULL) {
+        NCD4_userpwd(uri,url_userpwd,sizeof(userpwd));
+        NCD4_hostport(uri,url_hostport,sizeof(hostport));
+    } else {
+	url_hostport = NULL;
+	url_userpwd = NULL;
+    }
+
+    rcsetinfocurlflag(info,"HTTP.DEFLATE",
+		      NCD4_rclookup("HTTP.DEFLATE",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.VERBOSE",
+			NCD4_rclookup("HTTP.VERBOSE",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.TIMEOUT",
+			NCD4_rclookup("HTTP.TIMEOUT",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.USERAGENT",
+			NCD4_rclookup("HTTP.USERAGENT",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.COOKIEFILE",
+			NCD4_rclookup("HTTP.COOKIEFILE",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.COOKIE_FILE",
+			NCD4_rclookup("HTTP.COOKIE_FILE",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.COOKIEJAR",
+			NCD4_rclookup("HTTP.COOKIEJAR",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.COOKIE_JAR",
+			NCD4_rclookup("HTTP.COOKIE_JAR",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.PROXY_SERVER",
+			NCD4_rclookup("HTTP.PROXY_SERVER",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.SSL.VALIDATE",
+			NCD4_rclookup("HTTP.SSL.VALIDATE",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.SSL.CERTIFICATE",
+			NCD4_rclookup("HTTP.SSL.CERTIFICATE",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.SSL.KEY",
+			NCD4_rclookup("HTTP.SSL.KEY",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.SSL.KEYPASSWORD",
+			NCD4_rclookup("HTTP.SSL.KEYPASSWORD",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.SSL.CAINFO",
+			NCD4_rclookup("HTTP.SSL.CAINFO",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.SSL.CAPATH",
+			NCD4_rclookup("HTTP.SSL.CAPATH",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.SSL.VERIFYPEER",
+			NCD4_rclookup("HTTP.SSL.VERIFYPEER",url_hostport));
+    rcsetinfocurlflag(info,"HTTP.NETRC",
+			NCD4_rclookup("HTTP.NETRC",url_hostport));
+    { /* Handle various cases for user + password */
+	/* First, see if the user+pwd was in the original url */
+	char* userpwd = NULL;
+	char* user = NULL;
+	char* pwd = NULL;
+	if(url_userpwd != NULL)
+	    userpwd = url_userpwd;
+	else {
+   	    user = NCD4_rclookup("HTTP.CREDENTIALS.USER",url_hostport);
+	    pwd = NCD4_rclookup("HTTP.CREDENTIALS.PASSWORD",url_hostport);
+	    userpwd = NCD4_rclookup("HTTP.CREDENTIALS.USERPASSWORD",url_hostport);
+	}
+	if(userpwd == NULL && user != NULL && pwd != NULL) {
+	    char creds[NC_MAX_PATH];
+	    strncpy(creds,user,sizeof(creds));
+	    strncat(creds,":",sizeof(creds));
+	    strncat(creds,pwd,sizeof(creds));	  
+            rcsetinfocurlflag(info,"HTTP.USERPASSWORD",creds);
+	} else if(userpwd != NULL)
+            rcsetinfocurlflag(info,"HTTP.USERPASSWORD",userpwd);
+    }
+
+    return THROW(ret);
+}
+
+static struct NCD4triple*
+rclocate(char* key, char* hostport)
+{
+    int i,found;
+    NClist* rc = NCD4_globalstate->rc.rc;
+    NCD4triple* triple = NULL;
+
+    if(NCD4_globalstate->rc.ignore)
+	return NULL;
+    if(!NCD4_globalstate->rc.loaded)
+	NCD4_rcload();
+
+    if(key == NULL || rc == NULL) return NULL;
+    if(hostport == NULL) hostport = "";
+
+    for(found=0,i=0;i<nclistlength(rc);i++) {
+	triple = (NCD4triple*)nclistget(rc,i);
+        size_t hplen = strlen(triple->host);
+        int t;
+        if(strcmp(key,triple->key) != 0) continue; /* keys do not match */
+        /* If the triple entry has no url, then use it
+           (because we have checked all other cases)*/
+        if(hplen == 0) {found=1;break;}
+        /* do hostport match */
+        t = strcmp(hostport,triple->host);
+        if(t ==  0) {found=1; break;}
+    }
+    return (found?triple:NULL);
+}
+
+char*
+NCD4_rclookup(char* key, char* hostport)
+{
+    struct NCD4triple* triple = rclocate(key,hostport);
+    return (triple == NULL ? NULL : triple->value);
+}
+
+static void
+storedump(char* msg, NClist* triples)
+{
+    int i;
+
+    if(msg != NULL) fprintf(stderr,"%s\n",msg);
+    if(triples == NULL || nclistlength(triples)==0) {
+        fprintf(stderr,"<EMPTY>\n");
+        return;
+    }
+    for(i=0;i<nclistlength(triples);i++) {
+	NCD4triple* t = (NCD4triple*)nclistget(triples,i);
+        fprintf(stderr,"\t%s\t%s\t%s\n",
+                (strlen(t->host)==0?"--":t->host),t->key,t->value);
+    }
+    fflush(stderr);
+}
+
+/**
+ * Prefix must end in '/'
+ */
+static
+int
+rcsearch(const char* prefix, const char* rcname, char** pathp)
+{
+    char* path = NULL;
+    FILE* f = NULL;
+    int plen = strlen(prefix);
+    int rclen = strlen(rcname);
+    int ret = NC_NOERR;
+
+    size_t pathlen = plen+rclen+1; /*+1 for '/' */
+    path = (char*)malloc(pathlen+1); /* +1 for nul*/
+    if(path == NULL) {ret = NC_ENOMEM;	goto done;}
+    strncpy(path,prefix,pathlen);
+    strncat(path,"/",pathlen);
+    strncat(path,rcname,pathlen);
+    /* see if file is readable */
+    f = fopen(path,"r");
+    if(f != NULL)
+        nclog(NCLOGDBG, "Found rc file=%s",path);
+done:
+    if(f == NULL || ret != NC_NOERR) {
+	nullfree(path);
+	path = NULL;
+    }
+    if(f != NULL)
+      fclose(f);
+    if(pathp != NULL)
+      *pathp = path;
+    else {
+      nullfree(path);
+      path = NULL;
+    }
+    return THROW(ret);
+}
+
+void
+NCD4_rcfree(NClist* rc)
+{
+    int i;
+    for(i=0;i<nclistlength(rc);i++) {
+	NCD4triple* t = (NCD4triple*)nclistget(rc,i);
+	nullfree(t->host);
+	nullfree(t->key);
+	nullfree(t->value);
+	free(t);
+    }
+    nclistfree(rc);
+}
+
+int
+NCD4_parseproxy(NCD4INFO* info, const char* surl)
+{
+    int ret = NC_NOERR;
+    NCURI* uri = NULL;
+    if(surl == NULL || strlen(surl) == 0)
+	return THROW(NC_NOERR); /* nothing there*/
+    if(ncuriparse(surl,&uri) != NCU_OK)
+	return THROW(NC_EURL);
+    info->curl->proxy.userpwd = extract_credentials(uri);
+    info->curl->proxy.host = strdup(uri->host);
+    if(uri->port != NULL)
+        info->curl->proxy.port = atoi(uri->port);
+    else
+        info->curl->proxy.port = 80;
+    return THROW(ret);
+}
+
+/* Caller must free result_url */
+static char*
+extract_credentials(NCURI* url)
+{
+    char tmp[NC_MAX_PATH];
+    if(url->user == NULL || url->password == NULL)
+	return NULL;
+    NCD4_userpwd(url,tmp,sizeof(tmp));
+    return strdup(tmp);
+}
+
+int
+NCD4_rcdefault(NCD4INFO* info)
+{
+    int ret = NC_NOERR;
+    const char** p;
+    for(p=RCDEFAULTFLAGS;*p;p+=2) {
+	ret = rcsetinfocurlflag(info,p[0],p[1]);
+	if(ret) {
+            nclog(NCLOGERR, "RC file defaulting failed for: %s=%s",p[0],p[1]);
+	}
+    }
+    return THROW(ret);
+}
diff --git a/libdap4/d4read.c b/libdap4/d4read.c
new file mode 100644
index 0000000..e3b02c5
--- /dev/null
+++ b/libdap4/d4read.c
@@ -0,0 +1,215 @@
+#include "d4includes.h"
+#include "d4curlfunctions.h"
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include "ncwinpath.h"
+
+/* Do conversion if this code was compiled via Vis. Studio or Mingw */
+
+/*Forward*/
+static int readpacket(NCD4INFO* state, NCURI*, NCbytes*, NCD4mode, long*);
+static int readfile(const NCURI*, const char* suffix, NCbytes* packet);
+static int readfiletofile(const NCURI*, const char* suffix, FILE* stream, d4size_t*);
+
+int
+NCD4_readDMR(NCD4INFO* state)
+{
+    int stat = NC_NOERR;
+    long lastmodified = -1;
+
+    stat = readpacket(state,state->uri,state->curl->packet,NCD4_DMR,&lastmodified);
+    if(stat == NC_NOERR)
+	state->data.dmrlastmodified = lastmodified;
+    return THROW(stat);
+}
+
+int
+NCD4_readDAP(NCD4INFO* state, int flags)
+{
+    int stat = NC_NOERR;
+    long lastmod = -1;
+
+    if((flags & NCF_ONDISK) == 0) {
+        stat = readpacket(state,state->uri,state->curl->packet,NCD4_DAP,&lastmod);
+        if(stat == NC_NOERR)
+            state->data.daplastmodified = lastmod;
+    } else { /*((flags & NCF_ONDISK) != 0) */
+        NCURI* url = state->uri;
+        int fileprotocol = (strcmp(url->protocol,"file")==0);
+        if(fileprotocol && !state->curl->curlflags.proto_file) {
+            stat = readfiletofile(url, ".dap", state->data.ondiskfile, &state->data.datasize);
+        } else {
+	    char* readurl = NULL;
+            int flags = 0;
+            if(!fileprotocol) flags |= NCURIQUERY;
+            flags |= NCURIENCODE;
+	    flags |= NCURIPWD;
+#ifdef FIX
+            ncurisetconstraints(url,state->constraint);
+#endif
+	    readurl = ncuribuild(url,NULL,".dods",NCURISVC);
+	    if(readurl == NULL) 
+		return THROW(NC_ENOMEM);
+            if (state->debug > 0) 
+                {fprintf(stderr, "fetch url=%s\n", readurl);fflush(stderr);}
+            stat = NCD4_fetchurl_file(state->curl, readurl, state->data.ondiskfile,
+                                   &state->data.datasize, &lastmod);
+            nullfree(readurl);
+            if(stat == NC_NOERR)
+                state->data.daplastmodified = lastmod;
+            if (state->debug > 0) 
+                {fprintf(stderr,"fetch complete\n"); fflush(stderr);}
+        }
+    }
+    return THROW(stat);
+}
+
+static const char*
+dxxextension(int dxx)
+{
+    switch(dxx) {
+    case NCD4_DMR: return ".dmr";
+    case NCD4_DAP: return ".dap";
+    default: break;
+    }
+    return NULL;
+}
+
+static int
+readpacket(NCD4INFO* state, NCURI* url, NCbytes* packet, NCD4mode dxx, long* lastmodified)
+{
+    int stat = NC_NOERR;
+    int fileprotocol = 0;
+    const char* suffix = dxxextension(dxx);
+    CURL* curl = state->curl->curl;
+
+    fileprotocol = (strcmp(url->protocol,"file")==0);
+
+    if(fileprotocol && !state->curl->curlflags.proto_file) {
+	/* Short circuit file://... urls*/
+	/* We do this because the test code always needs to read files*/
+	stat = readfile(url,suffix,packet);
+    } else {
+        char* fetchurl = NULL;
+	int flags = NCURIBASE;
+	if(!fileprotocol) flags |= NCURIQUERY;
+	flags |= NCURIENCODE;
+        fetchurl = ncuribuild(url,NULL,suffix,flags);
+	MEMCHECK(fetchurl);
+	if(state->debug > 0)
+            {fprintf(stderr,"fetch url=%s\n",fetchurl); fflush(stderr);}
+        stat = NCD4_fetchurl(curl,fetchurl,packet,lastmodified,&state->curl->creds);
+        nullfree(fetchurl);
+	if(stat) goto fail;
+	if(state->debug > 0)
+            {fprintf(stderr,"fetch complete\n"); fflush(stderr);}
+    }
+#ifdef D4DEBUG
+  {
+fprintf(stderr,"readpacket: packet.size=%lu\n",
+		(unsigned long)ncbyteslength(packet));
+  }
+#endif
+fail:
+    return THROW(stat);
+}
+
+static int
+readfiletofile(const NCURI* uri, const char* suffix, FILE* stream, d4size_t* sizep)
+{
+    int stat = NC_NOERR;
+    NCbytes* packet = ncbytesnew();
+    size_t len;
+    stat = readfile(uri,suffix,packet);
+#ifdef D4DEBUG
+fprintf(stderr,"readfiletofile: packet.size=%lu\n",
+		(unsigned long)ncbyteslength(packet));
+#endif
+    if(stat != NC_NOERR) goto unwind;
+    len = nclistlength(packet);
+    if(stat == NC_NOERR) {
+	size_t written;
+        fseek(stream,0,SEEK_SET);
+	written = fwrite(ncbytescontents(packet),1,len,stream);
+	if(written != len) {
+#ifdef D4DEBUG
+fprintf(stderr,"readfiletofile: written!=length: %lu :: %lu\n",
+	(unsigned long)written,(unsigned long)len);
+#endif
+	    stat = NC_EIO;
+	}
+    }
+    if(sizep != NULL) *sizep = len;
+unwind:
+    ncbytesfree(packet);
+    return THROW(stat);
+}
+
+static int
+readfile(const NCURI* uri, const char* suffix, NCbytes* packet)
+{
+    int stat = NC_NOERR;
+    char buf[1024];
+    int fd = -1;
+    int flags = 0;
+    d4size_t filesize = 0;
+    d4size_t totalread = 0;
+    NCbytes* tmp = ncbytesnew();
+    char* filename = NULL;
+
+    ncbytescat(tmp,uri->path);
+    if(suffix != NULL) ncbytescat(tmp,suffix);
+    ncbytesnull(tmp);
+    filename = ncbytesextract(tmp);
+    ncbytesfree(tmp);
+    flags = O_RDONLY;
+#ifdef O_BINARY
+    flags |= O_BINARY;
+#endif
+fprintf(stderr,"XXX: flags=0x%x file=%s\n",flags,filename);
+    fd = NCopen2(filename,flags);
+    if(fd < 0) {
+	nclog(NCLOGERR,"open failed:%s",filename);
+	fprintf(stderr,"XXX: open failed: flags=0x%x file=%s\n",flags,filename);
+        fflush(stderr);
+	stat = NC_ENOTFOUND;
+	goto done;
+    }
+    /* Get the file size */
+    filesize = lseek(fd,(d4size_t)0,SEEK_END);
+    if(filesize < 0) {
+	stat = NC_EIO;
+	nclog(NCLOGERR,"lseek failed: %s",filename);
+	goto done;
+    }
+    /* Move file pointer back to the beginning of the file */
+    (void)lseek(fd,(d4size_t)0,SEEK_SET);
+    stat = NC_NOERR;
+    for(totalread=0;;) {
+	d4size_t count = (d4size_t)read(fd,buf,sizeof(buf));
+	if(count == 0)
+	    break; /*eof*/
+	else if(count <  0) {
+	    stat = NC_EIO;
+	    nclog(NCLOGERR,"read failed: %s",filename);
+	    goto done;
+	}
+	ncbytesappendn(packet,buf,(unsigned long)count);
+	totalread += count;
+    }
+    if(totalread < filesize) {
+	stat = NC_EIO;
+	nclog(NCLOGERR,"short read: |%s|=%lu read=%lu\n",
+		filename,(unsigned long)filesize,(unsigned long)totalread);
+        goto done;
+    }
+
+done:
+#ifdef D4DEBUG
+fprintf(stderr,"readfile: filesize=%lu totalread=%lu\n",
+		(unsigned long)filesize,(unsigned long)totalread);
+#endif
+    if(fd >= 0) close(fd);
+    return THROW(stat);
+}
diff --git a/libdap4/d4read.h b/libdap4/d4read.h
new file mode 100644
index 0000000..a672e4b
--- /dev/null
+++ b/libdap4/d4read.h
@@ -0,0 +1,12 @@
+/*********************************************************************
+  *   Copyright 2016, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+
+#ifndef D4READ_H
+#define D4READ_H
+
+extern int NCD4_readDMR(NCD4INFO*);
+extern int NCD4_readDAP(NCD4INFO*, int inmemory);
+
+#endif /*READ_H*/
diff --git a/libdap4/d4swap.c b/libdap4/d4swap.c
new file mode 100644
index 0000000..daed375
--- /dev/null
+++ b/libdap4/d4swap.c
@@ -0,0 +1,260 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#include <stdarg.h>
+#include "d4includes.h"
+#include "ezxml.h"
+
+/*
+The primary purpose of this code is to recursivly traverse
+the incoming data to get the endianness correct.
+*/
+
+/* Forward */
+
+static int walkAtomicVar(NCD4meta*, NCD4node*, NCD4node*, void** offsetp);
+static int walkOpaqueVar(NCD4meta*,NCD4node*, NCD4node*, void** offsetp);
+static int walkStructArray(NCD4meta*,NCD4node*, NCD4node*, void** offsetp);
+static int walkStruct(NCD4meta*, NCD4node*, NCD4node*, void** offsetp);
+static int walkSeqArray(NCD4meta*, NCD4node*, NCD4node*, void** offsetp);
+static int walkSeq(NCD4meta*,NCD4node*, NCD4node*, void** offsetp);
+
+/**************************************************/
+
+/*
+Assumes that compiler->swap is true; does necessary
+byte swapping.
+*/
+int
+NCD4_swapdata(NCD4meta* compiler, NClist* topvars)
+{
+    int ret = NC_NOERR;
+    int i;
+    void* offset;
+
+    offset = compiler->serial.dap;
+    for(i=0;i<nclistlength(topvars);i++) {
+	NCD4node* var = (NCD4node*)nclistget(topvars,i);
+	var->data.dap4data.memory = offset;
+	switch (var->subsort) {
+	default:
+	    if((ret=walkAtomicVar(compiler,var,var,&offset))) goto done;
+	    break;
+	case NC_OPAQUE:
+	    /* The only thing we need to do is swap the counts */
+	    if((ret=walkOpaqueVar(compiler,var,var,&offset))) goto done;
+	    break;
+	case NC_STRUCT:
+	    if((ret=walkStructArray(compiler,var,var,&offset))) goto done;
+	    break;
+	case NC_SEQ:
+	    if((ret=walkSeqArray(compiler,var,var,&offset))) goto done;
+	    break;
+	}
+	var->data.dap4data.size = DELTA(offset,var->data.dap4data.memory);
+	/* skip checksum, if there is one */
+        if(compiler->serial.remotechecksumming)
+	    offset = INCR(offset,CHECKSUMSIZE);
+    }
+done:
+    return THROW(ret);
+}
+
+static int
+walkAtomicVar(NCD4meta* compiler, NCD4node* topvar, NCD4node* var, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t i;
+    nc_type subsort;
+    d4size_t dimproduct;
+    NCD4node* basetype;
+
+    basetype = (var->sort == NCD4_TYPE ? var : var->basetype);
+    subsort = basetype->subsort;
+    dimproduct = (var->sort == NCD4_TYPE ? 1 : NCD4_dimproduct(var));
+
+    offset = *offsetp;
+    if(subsort == NC_ENUM)
+	subsort = var->basetype->basetype->subsort;
+    /* Only need to swap multi-byte integers and floats */
+    if(subsort != NC_STRING) {
+        int typesize = NCD4_typesize(subsort);
+	d4size_t totalsize = typesize*dimproduct;
+	if(typesize == 1) {
+	    offset = INCR(offset,totalsize);
+	} else { /*(typesize > 1)*/
+	    for(i=0;i<dimproduct;i++) {
+	        char* sp = (char*)offset;
+	        if(compiler->swap) {
+	            switch (typesize) {
+	            case 2: swapinline16(sp); break;
+	            case 4: swapinline32(sp); break;
+	            case 8: swapinline64(sp); break;
+	            default: break;
+	            }
+		}
+	        offset = INCR(offset,typesize);
+	    }
+	}
+    } else if(subsort == NC_STRING) { /* remaining case; just convert the counts */
+	COUNTERTYPE count;
+	for(i=0;i<dimproduct;i++) {
+	    /* Get string count */
+	    if(compiler->swap)
+		swapinline64(offset);
+	    count = GETCOUNTER(offset);
+	    SKIPCOUNTER(offset);
+	    /* skip count bytes */
+	    offset = INCR(offset,count);
+	}
+    }
+    *offsetp = offset;
+    return THROW(ret);
+}
+
+static int
+walkOpaqueVar(NCD4meta* compiler, NCD4node* topvar, NCD4node* var, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t i;
+    unsigned long long count;
+    d4size_t dimproduct = NCD4_dimproduct(var);
+
+    dimproduct = (var->sort == NCD4_TYPE ? 1 : NCD4_dimproduct(var));
+
+    offset = *offsetp;
+    for(i=0;i<dimproduct;i++) {
+	/* Get and swap opaque count */
+	if(compiler->swap)
+	    swapinline64(offset);
+	count = GETCOUNTER(offset);
+	SKIPCOUNTER(offset);
+	offset = INCR(offset,count);
+    }
+    *offsetp = offset;
+    return THROW(ret);
+}
+
+static int
+walkStructArray(NCD4meta* compiler, NCD4node* topvar, NCD4node* var,  void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t i;
+    d4size_t dimproduct = NCD4_dimproduct(var);
+    NCD4node* basetype = var->basetype;
+
+    offset = *offsetp;
+    for(i=0;i<dimproduct;i++) {
+	/* Swap, possibly recursively, the single struct pointed to by offset*/
+	if((ret=walkStruct(compiler,topvar,basetype,&offset))) goto done;
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+walkStruct(NCD4meta* compiler, NCD4node* topvar, NCD4node* structtype, void** offsetp)
+{
+    int ret = NC_NOERR;
+    int i;
+    void* offset;
+
+    offset = *offsetp;
+    for(i=0;i<nclistlength(structtype->vars);i++) {
+	NCD4node* field = (NCD4node*)nclistget(structtype->vars,i);
+	NCD4node* fieldbase = field->basetype;
+        switch (fieldbase->subsort) {
+        default:
+	    if((ret=walkAtomicVar(compiler,topvar,field,&offset))) goto done;
+  	    break;
+	case NC_OPAQUE:
+	    /* The only thing we need to do is swap the counts */
+	    if((ret=walkOpaqueVar(compiler,topvar,field,&offset))) goto done;
+	    break;
+        case NC_STRUCT:
+	    if((ret=walkStructArray(compiler,topvar,field,&offset))) goto done;
+  	    break;
+        case NC_SEQ:
+	    if((ret=walkSeqArray(compiler,topvar,field,&offset))) goto done;
+	    break;
+        }
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+static int
+walkSeqArray(NCD4meta* compiler, NCD4node* topvar, NCD4node* var, void** offsetp)
+{
+    int ret = NC_NOERR;
+    void* offset;
+    d4size_t i;
+    d4size_t dimproduct;
+    NCD4node* seqtype;
+
+    assert(var->sort == NCD4_VAR);
+    dimproduct = NCD4_dimproduct(var);
+    seqtype = var->basetype;
+
+    offset = *offsetp;
+    for(i=0;i<dimproduct;i++) {
+	/* Swap, possibly recursively, the single seq pointed to by offset*/
+	if((ret=walkSeq(compiler,topvar,seqtype,&offset))) goto done;
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
+
+/*
+Remember that the base type of var is a vlen.
+*/
+static int
+walkSeq(NCD4meta* compiler, NCD4node* topvar, NCD4node* vlentype, void** offsetp)
+{
+    int ret = NC_NOERR;
+    int i;
+    void* offset;
+    d4size_t recordcount;
+    NCD4node* basetype;
+
+    offset = *offsetp;
+
+    /* process the record count */
+    recordcount = GETCOUNTER(offset);
+    SKIPCOUNTER(offset);
+    if(compiler->swap)
+        swapinline64(&recordcount);
+
+    basetype = vlentype->basetype; /* This may be of any type potentially */
+    assert(basetype->sort = NCD4_TYPE);
+
+    for(i=0;i<recordcount;i++) {
+        switch(basetype->subsort) {
+	default: /* atomic basetype */
+	    if((ret=walkAtomicVar(compiler,topvar,basetype,&offset))) goto done;
+	    break;
+	case NC_OPAQUE:
+	    if((ret=walkOpaqueVar(compiler,topvar,basetype,&offset))) goto done;
+	    break;
+	case NC_STRUCT:
+	    /* We can treat each record like a structure instance */
+	    if((ret=walkStruct(compiler,topvar,basetype,&offset))) goto done;
+	    break;
+	case NC_SEQ:
+	    if((ret=walkSeq(compiler,topvar,basetype,&offset))) goto done;
+	    break;
+	}
+    }
+    *offsetp = offset;
+done:
+    return THROW(ret);
+}
diff --git a/libdap4/d4util.c b/libdap4/d4util.c
new file mode 100644
index 0000000..4f8f694
--- /dev/null
+++ b/libdap4/d4util.c
@@ -0,0 +1,452 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "d4includes.h"
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef _MSC_VER
+#include <io.h>
+#endif
+
+#define LBRACKET '['
+#define RBRACKET ']'
+
+/**************************************************/
+/* Forward */
+
+static char* backslashEscape(const char* s);
+
+/**************************************************/
+/**
+ * Provide a hidden interface to allow utilities
+ * to check if a given path name is really an ncdap4 url.
+ * If no, return null, else return basename of the url
+ * minus any extension.
+ */
+
+int
+ncd4__testurl(const char* path, char** basenamep)
+{
+    NCURI* uri;
+    int ok = NC_NOERR;
+    if(ncuriparse(path,&uri) != NCU_OK)
+	ok = NC_EURL;
+    else {
+	char* slash = (uri->path == NULL ? NULL : strrchr(uri->path, '/'));
+	char* dot;
+	if(slash == NULL) slash = (char*)path; else slash++;
+        slash = nulldup(slash);
+        if(slash == NULL)
+            dot = NULL;
+        else
+            dot = strrchr(slash, '.');
+        if(dot != NULL &&  dot != slash) *dot = '\0';
+        if(basenamep)
+            *basenamep=slash;
+        else if(slash)
+            free(slash);
+    }
+    ncurifree(uri);
+    return ok;
+}
+
+/* Return 1 if this machine is little endian */
+int
+NCD4_isLittleEndian(void)
+{
+    union {
+        unsigned char bytes[SIZEOF_INT];
+	int i;
+    } u;
+    u.i = 1;
+    return (u.bytes[0] == 1 ? 1 : 0);
+}
+
+/* Compute the size of an atomic type, except opaque */
+size_t
+NCD4_typesize(nc_type tid)
+{
+    switch(tid) {
+    case NC_BYTE: case NC_UBYTE: case NC_CHAR: return 1;
+    case NC_SHORT: case NC_USHORT: return sizeof(short);
+    case NC_INT: case NC_UINT: return sizeof(int);
+    case NC_FLOAT: return  sizeof(float);
+    case NC_DOUBLE: return  sizeof(double);
+    case NC_INT64: case NC_UINT64: return sizeof(long long);
+    case NC_STRING: return sizeof(char*);
+    default: break;
+    }
+    return 0;
+}
+
+d4size_t
+NCD4_dimproduct(NCD4node* node)
+{
+    int i;
+    d4size_t product = 1;
+    for(i=0;i<nclistlength(node->dims);i++) {
+        NCD4node* dim = (NCD4node*)nclistget(node->dims,i);
+        product *= dim->dim.size;
+    }
+    return product;
+}
+
+/* Caller must free return value */
+char*
+NCD4_makeFQN(NCD4node* node)
+{
+    char* fqn = NULL;
+    int i;
+    NCD4node* g = node;
+    NClist* path = nclistnew();
+    size_t estimate;
+
+    for(estimate=0;g != NULL;g=g->container) {
+	estimate += strlen(g->name);		
+	nclistinsert(path,0,g);
+    }
+    estimate = (estimate*2) + 2*nclistlength(path);
+    /* start at 1 to avoid dataset */
+    fqn = (char*)malloc(estimate+1);
+    if(fqn == NULL) goto done;
+    fqn[0] = '\0';
+    /* Create the group-based fqn prefix */
+    for(i=1;i<nclistlength(path);i++) {
+	NCD4node* elem = (NCD4node*)nclistget(path,i);
+	if(elem->sort != NCD4_GROUP) break;
+	/* Add in the group name */
+	char* escaped = backslashEscape(elem->name);
+	if(escaped == NULL) {free(fqn); fqn = NULL; goto done;}
+	strcat(fqn,"/");
+	strcat(fqn,escaped);
+	free(escaped);
+    }
+    /* Add in the final name part (if not group) */
+    if(i < nclistlength(path)) {
+	int last = nclistlength(path)-1;
+	NCD4node* n = (NCD4node*)nclistget(path,last);
+	char* name = NCD4_makeName(n,".");
+	strcat(fqn,"/");	
+	strcat(fqn,name);
+	nullfree(name);
+    }
+
+done:
+    nclistfree(path);
+    return fqn;
+}
+
+/*
+create the last part of the fqn
+(post groups)
+*/
+char*
+NCD4_makeName(NCD4node* elem, const char* sep)
+{
+    int i;
+    size_t estimate = 0;
+    NCD4node* n;
+    NClist* path = nclistnew();
+    char* fqn = NULL;
+
+    /* Collect the path upto, but not including, the first containing group */
+    for(estimate=0,n=elem;n->sort != NCD4_GROUP;n=n->container) {
+	nclistinsert(path,0,n);
+	estimate += (1+(2*strlen(n->name)));
+    }
+
+    fqn = (char*)malloc(estimate+1);
+    if(fqn == NULL) goto done;    
+    fqn[0] = '\0';
+
+    for(i=0;i<nclistlength(path);i++) {
+	NCD4node* elem = (NCD4node*)nclistget(path,i);
+	char* escaped = backslashEscape(elem->name);
+	if(escaped == NULL) {free(fqn); fqn = NULL; goto done;}
+	if(i > 0)
+	    strcat(fqn,sep);
+	strcat(fqn,escaped);
+	free(escaped);
+    }
+done:
+    nclistfree(path);
+    return fqn;
+}
+
+static char*
+backslashEscape(const char* s)
+{
+    const char* p;
+    char* q;
+    size_t len;
+    char* escaped = NULL;
+
+    len = strlen(s);
+    escaped = (char*)malloc(1+(2*len)); /* max is everychar is escaped */
+    if(escaped == NULL) return NULL;
+    for(p=s,q=escaped;*p;p++) {
+        char c = *p;
+        switch (c) {
+	case '\\':
+	case '/':
+	case '.':
+	case '@':
+	    *q++ = '\\'; *q++ = '\\';
+	    break;
+	default: *q++ = c; break;
+        }
+    }
+    *q = '\0';
+    return escaped;
+}
+
+/* Parse an fqn into a sequence of names;
+   initially using '/', then '.' */
+int
+NCD4_parseFQN(const char* fqn0, NClist* pieces)
+{
+    int ret = NC_NOERR;
+    int count;
+    char* p;
+    char* start;
+    char* fqn = NULL;
+
+    if(fqn0 == NULL) fqn0 = "/";
+    fqn = strdup(fqn0[0] == '/' ? fqn0+1 : fqn0);
+    start = fqn;
+    /* Step 0: insert rootname */
+    nclistpush(pieces,strdup("/"));
+    /* Step 1: Break fqn into pieces at occurrences of '/' */
+    count = 0;
+    for(p=start;*p;) {
+	switch(*p) {
+	case '\\': /* leave the escapes in place */
+	    p+=2;
+	    break;
+	case '/': /*capture the piece name */
+	    *p++ = '\0';
+	    start = p; /* mark start of the next part */
+	    count++;
+	    break;
+	default: /* ordinary char */
+	    p++;
+	    break;
+	}
+    }
+    /* Step 2, walk the final piece to break up based on '.' */
+    for(p=start;*p;) {
+	switch(*p) {
+	case '\\': /* leave the escapes in place */
+	    p+=2;
+	    break;
+	case '.': /*capture the piece name */
+	    *p++ = '\0';	    
+	    start = p;
+	    count++;
+	    break;
+	default: /* ordinary char */
+	    p++;
+	    break;
+	}
+    }
+    count++; /* acct for last piece */
+    /* Step 3: capture and de-scape the pieces */
+    for(p=fqn;count > 0;count--) {
+	char* descaped = NCD4_deescape(p);
+	nclistpush(pieces,descaped);
+	p = p + strlen(p) + 1; /* skip past the terminating nul */
+    }        
+    if(fqn != NULL) free(fqn);
+    return THROW(ret);
+}
+
+char*
+NCD4_deescape(const char* esc)
+{
+    size_t len;
+    char* s;
+    const char* p;
+    char* q;
+
+    if(esc == NULL) return NULL;
+    len = strlen(esc);
+    s = (char*)malloc(len+1);
+    if(s == NULL) return NULL;
+    for(p=esc,q=s;*p;) {
+	switch (*p) {
+	case '\\':
+	     p++;
+	     /* fall thru */
+	default: *q++ = *p++; break;
+	}
+    }
+    *q = '\0';
+    return s;
+}
+
+char*
+NCD4_entityescape(const char* s)
+{
+    const char* p;
+    char* q;
+    size_t len;
+    char* escaped = NULL;
+    const char* entity;
+
+    len = strlen(s);
+    escaped = (char*)malloc(1+(6*len)); /* 6 = |'| */
+    if(escaped == NULL) return NULL;
+    for(p=s,q=escaped;*p;p++) {
+	char c = *p;
+	switch (c) {
+	case '&':  entity = "&"; break;
+	case '<':  entity = "<"; break;
+	case '>':  entity = ">"; break;
+	case '"':  entity = """; break;
+	case '\'': entity = "'"; break;
+	default	 : entity = NULL; break;
+	}
+	if(entity == NULL)
+	    *q++ = c;
+	else {
+	    len = strlen(entity);
+	    memcpy(q,entity,len);
+	    q+=len;
+	}
+    }
+    *q = '\0';
+    return escaped;
+}
+
+int
+NCD4_readfile(const char* filename, NCbytes* content)
+{
+    int ret = NC_NOERR;
+    FILE* stream = NULL;
+    char part[1024];
+
+    stream = fopen(filename,"r");
+    if(stream == NULL) {ret=errno; goto done;}
+    for(;;) {
+	size_t count = fread(part, 1, sizeof(part), stream);
+	if(count <= 0) break;
+	ncbytesappendn(content,part,count);
+	if(ferror(stream)) {ret = NC_EIO; goto done;}
+	if(feof(stream)) break;
+    }
+    ncbytesnull(content);
+done:
+    if(stream) fclose(stream);
+    return ret;
+}
+
+/**
+Wrap mktmp and return the generated name
+*/
+
+int
+NCD4_mktmp(const char* base, char** tmpnamep)
+{
+    int fd;
+    char tmp[NC_MAX_PATH];
+#ifdef HAVE_MKSTEMP
+    mode_t mask;
+#endif
+
+    strncpy(tmp,base,sizeof(tmp));
+#ifdef HAVE_MKSTEMP
+    strncat(tmp,"XXXXXX",sizeof(tmp));
+    /* Note Potential problem: old versions of this function
+       leave the file in mode 0666 instead of 0600 */
+    mask=umask(0077);
+    fd = mkstemp(tmp);
+    (void)umask(mask);
+#else /* !HAVE_MKSTEMP */
+    /* Need to simulate by using some kind of pseudo-random number */
+    {
+	int rno = rand();
+	char spid[7];
+	if(rno < 0) rno = -rno;
+        snprintf(spid,sizeof(spid),"%06d",rno);
+        strncat(tmp,spid,sizeof(tmp));	
+#if defined(_WIN32) || defined(_WIN64)
+        fd=open(tmp,O_RDWR|O_BINARY|O_CREAT, _S_IREAD|_S_IWRITE);
+#  else
+        fd=open(tmp,O_RDWR|O_CREAT|O_EXCL, S_IRWXU);
+#  endif
+    }
+#endif /* !HAVE_MKSTEMP */
+    if(fd < 0) {
+       nclog(NCLOGERR, "Could not create temp file: %s",tmp);	
+       return THROW(NC_EPERM);
+    } else
+	close(fd);
+    if(tmpnamep) *tmpnamep = strdup(tmp);
+    return THROW(NC_NOERR);
+}
+
+void
+NCD4_hostport(NCURI* uri, char* space, size_t len)
+{
+    if(space != NULL && len >  0) {
+	space[0] = '\0'; /* so we can use strncat */
+        if(uri->host != NULL) {
+	    strncat(space,uri->host,len);
+            if(uri->port != NULL) {
+	        strncat(space,":",len);
+	        strncat(space,uri->port,len);
+	    }
+	}
+    }
+}
+
+void
+NCD4_userpwd(NCURI* uri, char* space, size_t len)
+{
+    if(space != NULL && len > 0) {
+	space[0] = '\0'; /* so we can use strncat */
+        if(uri->user != NULL && uri->password != NULL) {
+            strncat(space,uri->user,len);
+            strncat(space,":",len);
+            strncat(space,uri->password,len);
+	}
+    }
+}
+
+#ifdef BLOB
+void
+NCD4_saveblob(NCD4meta* meta, void* mem)
+{
+    if(meta->blobs == NULL)
+        meta->blobs = nclistnew();
+    nclistpush(meta->blobs,mem);
+}
+#endif
+
+/**************************************************/
+/* Error reporting */
+
+int
+NCD4_error(int code, const int line, const char* file, const char* fmt, ...)
+{
+    fprintf(stderr,"(%s:%d) ",file,line);
+    va_list argv;
+    va_start(argv,fmt);
+    vfprintf(stderr,fmt,argv);
+    fprintf(stderr,"\n");
+    fflush(stderr);
+    return code;
+}
+
+int
+NCD4_errorNC(int code, const int line, const char* file)
+{
+    return NCD4_error(code,line,file,nc_strerror(code));
+}
+
diff --git a/libdap4/d4util.h b/libdap4/d4util.h
new file mode 100644
index 0000000..00f39eb
--- /dev/null
+++ b/libdap4/d4util.h
@@ -0,0 +1,77 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#ifndef D4UTIL_H
+#define D4UTIL_H 1
+
+#ifdef HAVE_MEMMOVE
+#define d4memmove(dst,src,n) memmove(dst,src,n)
+#else
+#define d4memmove(dst,src,n) localmemmove(dst,src,n)
+#endif
+
+/* This is intended to be big enough to work as
+   an offset/position/size for a file or a memory block.
+*/
+typedef unsigned long long d4size_t;
+
+/* Define an counted memory marker */
+typedef struct D4blob {d4size_t size; void* memory;} D4blob;
+
+/**************************************************/
+
+/* signature: void swapinline16(void* ip) */
+#define swapinline16(ip) \
+{ \
+    union {char b[2]; unsigned short i;} u; \
+    char* src = (char*)(ip); \
+    u.b[0] = src[1]; \
+    u.b[1] = src[0]; \
+    *((unsigned short*)ip) = u.i; \
+}
+
+/* signature: void swapinline32(void* ip) */
+#define swapinline32(ip) \
+{ \
+    union {char b[4]; unsigned int i;} u; \
+    char* src = (char*)(ip); \
+    u.b[0] = src[3]; \
+    u.b[1] = src[2]; \
+    u.b[2] = src[1]; \
+    u.b[3] = src[0]; \
+    *((unsigned int*)ip) = u.i; \
+}
+
+/* signature: void swapinline64(void* ip) */
+#define swapinline64(ip) \
+{ \
+    union {char b[8]; unsigned long long i;} u; \
+    char* src = (char*)(ip); \
+    u.b[0] = src[7]; \
+    u.b[1] = src[6]; \
+    u.b[2] = src[5]; \
+    u.b[3] = src[4]; \
+    u.b[4] = src[3]; \
+    u.b[5] = src[2]; \
+    u.b[6] = src[1]; \
+    u.b[7] = src[0]; \
+    *((unsigned long long*)ip) = u.i; \
+}
+
+/***************************************************/
+/* Define the NCD4node.data.flags */
+
+#define HASNIL   (0) /* no flags set */
+#define HASSEQ   (1) /* transitively contains sequence(s)*/
+#define HASSTR   (2) /* transitively contains strings */
+#define HASOPFIX (4) /* transitively contains fixed size opaques */
+#define HASOPVAR (8) /* transitively contains variable size opaques */
+#define LEAFSEQ (16) /* mark leaf sequences */
+#define HASANY   (HASNIL|HASSEQ|HASSTR|HASOPTFIX|HASOPVAR)
+/***************************************************/
+
+extern int ncd4__testurl(const char* parth, char** basename);
+
+#endif /*D4UTIL_H*/
diff --git a/libdap4/d4varx.c b/libdap4/d4varx.c
new file mode 100644
index 0000000..d944f7d
--- /dev/null
+++ b/libdap4/d4varx.c
@@ -0,0 +1,186 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include "config.h"
+#include "ncdispatch.h"
+#include "ncd4dispatch.h"
+#include "nc4internal.h"
+#include "d4includes.h"
+#include "d4odom.h"
+
+/* Forward */
+static int getvarx(int ncid, int varid, NCD4INFO**, NCD4node** varp, nc_type* xtypep, size_t*, nc_type* nc4typep, size_t*);
+
+int
+NCD4_get_vara(int ncid, int varid,
+	    const size_t *start, const size_t *edges,
+            void *value,
+	    nc_type memtype)
+{
+    int ret;
+    /* TODO: optimize since we know stride is 1 */
+    ret = NCD4_get_vars(ncid,varid,start,edges,nc_sizevector1,value,memtype);
+    return ret;
+}
+
+int
+NCD4_get_vars(int ncid, int varid,
+	    const size_t *start, const size_t *edges, const ptrdiff_t* stride,
+            void *memoryin, nc_type xtype)
+{
+    int i,ret;
+    NCD4INFO* info;
+    NCD4meta* meta;
+    NCD4node* ncvar;
+    NCD4node* nctype;
+    D4odometer* odom = NULL;
+    nc_type nc4type;
+    size_t nc4size, xsize;
+    void* instance = NULL; /* Staging area in case we have to convert */
+    NClist* blobs = NULL;
+    int rank;
+    size_t dimsizes[NC_MAX_VAR_DIMS];
+    d4size_t dimproduct;
+    size_t dstcount;
+    
+    if((ret=getvarx(ncid, varid, &info, &ncvar, &xtype, &xsize, &nc4type, &nc4size)))
+	{THROW(ret); goto done;}
+
+    meta = info->substrate.metadata;
+    nctype = ncvar->basetype;
+    rank = nclistlength(ncvar->dims);
+    blobs = nclistnew();
+
+    instance = malloc(nc4size);
+    if(instance == NULL)
+	{ret = THROW(NC_ENOMEM); goto done;}	
+
+    dimproduct = NCD4_dimproduct(ncvar);
+    /* build size vector */
+    for(i=0;i<rank;i++)  {
+	NCD4node* dim = nclistget(ncvar->dims,i);
+	dimsizes[i] = (size_t)dim->dim.size;
+    }
+	
+    /* Extract and desired subset of data */
+    if(rank > 0)
+        odom = d4odom_new(rank,start,edges,stride,dimsizes);
+    else
+        odom = d4scalarodom_new();
+    dstcount = 0; /* We always write into dst starting at position 0*/
+    for(;d4odom_more(odom);dstcount++) {
+	void* xpos;
+	void* offset;
+	void* dst;
+	d4size_t count;
+        count = d4odom_next(odom);
+	if(count >= dimproduct) {
+	    ret = THROW(NC_EINVALCOORDS);
+	    goto done;
+	}
+        xpos = INCR(memoryin,(xsize * dstcount)); /* ultimate destination */
+	/* We need to compute the offset in the dap4 data of this instance;
+	   for fixed size types, this is easy, otherwise we have to walk
+	   the variable size type
+	*/
+	if(nctype->meta.isfixedsize) {
+	    offset = INCR(ncvar->data.dap4data.memory,(nc4size * count));
+	} else {
+            offset = ncvar->data.dap4data.memory;
+	    /* We have to walk to the count'th location in the data */
+	    if((ret=NCD4_moveto(meta,ncvar,count,&offset)))
+	        {THROW(ret); goto done;}		    
+	}
+	dst = instance;
+	if((ret=NCD4_fillinstance(meta,nctype,&offset,&dst,blobs)))
+	    {THROW(ret); goto done;}
+	if(xtype == nc4type) {
+	    /* We can just copy out the data */
+	    memcpy(xpos,instance,nc4size);
+	} else { /* Need to convert */
+	    if((ret=NCD4_convert(nc4type,xtype,xpos,instance,1)))
+	        {THROW(ret); goto done;}
+	}
+    }
+
+done:
+    /* cleanup */
+    if(odom != NULL)
+	d4odom_free(odom);
+    if(instance != NULL)
+	free(instance);
+    if(ret != NC_NOERR) { /* reclaim all malloc'd data */
+	for(i=0;i<nclistlength(blobs);i++) {
+	    nullfree(nclistget(blobs,i));
+	}
+    }
+    if(blobs != NULL)
+	nclistfree(blobs);
+    return (ret);
+}
+
+static int
+getvarx(int ncid, int varid, NCD4INFO** infop, NCD4node** varp,
+	nc_type* xtypep, size_t* xsizep, nc_type* nc4typep, size_t* nc4sizep)
+{
+    int ret = NC_NOERR;
+    NC* ncp;
+    NCD4INFO* info;
+    NCD4meta* meta;
+    NCD4node* group;
+    NCD4node* var;
+    NCD4node* type;
+    nc_type xtype, actualtype;
+    size_t instancesize, xsize;
+    int grp_id;
+
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR)
+	{THROW(ret); goto done;}
+
+    info = getdap(ncp);
+    if(info == NULL)
+	{ret = THROW(NC_EBADID); goto done;}
+    meta = info->substrate.metadata;
+    if(meta == NULL)
+	{ret = THROW(NC_EBADID); goto done;}
+
+    /* Locate var node via (grpid,varid) */
+    grp_id = GROUPIDPART(ncid);
+        
+    group = nclistget(meta->groupbyid,grp_id);
+    if(group == NULL)
+	return THROW(NC_EBADID);
+    var = nclistget(group->group.varbyid,varid);
+    if(var == NULL)
+	return THROW(NC_EBADID);
+    type = var->basetype;
+    actualtype = type->meta.id;
+    instancesize = type->meta.memsize;
+
+    /* Figure out the type conversion, if any */
+    xtype = *xtypep;
+    if(xtype == NC_NAT)
+	xtype = actualtype;
+    if(xtype != actualtype && xtype > NC_MAX_ATOMIC_TYPE)
+	return THROW(NC_EBADTYPE);
+    if((xtype == NC_CHAR || xtype == NC_STRING)
+	&& (actualtype != NC_CHAR && actualtype != NC_STRING))
+	return THROW(NC_ECHAR);
+    if(xtype <= NC_MAX_ATOMIC_TYPE)
+        xsize = NCD4_typesize(xtype);
+    else
+	xsize = instancesize;
+
+    /* Return relevant info */
+    if(infop) *infop = info;
+    if(xtypep) *xtypep = xtype;
+    if(xsizep) *xsizep = xsize;
+    if(nc4typep) *nc4typep = actualtype;
+    if(nc4sizep) *nc4sizep = instancesize;
+    if(varp) *varp = var;
+done:
+    return THROW(ret);    
+}
+
diff --git a/libdap4/ezxml.c b/libdap4/ezxml.c
new file mode 100644
index 0000000..f11d97e
--- /dev/null
+++ b/libdap4/ezxml.c
@@ -0,0 +1,973 @@
+/* ezxml.c
+ *
+ * Copyright 2004-2006 Aaron Voisine <aaron at voisine.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include "ezxml.h"
+
+#define EZXML_WS   "\t\r\n "  /* whitespace*/
+#define EZXML_ERRL 128        /* maximum error string length*/
+
+typedef struct ezxml_root *ezxml_root_t;
+struct ezxml_root {       /* additional data for the root tag*/
+    struct ezxml xml;     /* is a super-struct built on top of ezxml struct*/
+    ezxml_t cur;          /* current xml tree insertion point*/
+    char *m;              /* original xml string*/
+    size_t len;           /* length of allocated memory for mmap, -1 for malloc*/
+    char *u;              /* UTF-8 conversion of string if original was UTF-16*/
+    char *s;              /* start of work area*/
+    char *e;              /* end of work area*/
+    char **ent;           /* general entities (ampersand sequences)*/
+    char ***attr;         /* default attributes*/
+    char ***pi;           /* processing instructions*/
+    short standalone;     /* non-zero if <?xml standalone="yes"?>*/
+    char err[EZXML_ERRL]; /* error string*/
+};
+
+char *EZXML_NIL[] = { NULL }; /* empty, null terminated array of strings*/
+
+/* returns the first child tag with the given name or NULL if not found*/
+ezxml_t ezxml_child(ezxml_t xml, const char *name)
+{
+    xml = (xml) ? xml->child : NULL;
+    while (xml && strcmp(name, xml->name)) xml = xml->sibling;
+    return xml;
+}
+
+/* returns the Nth tag with the same name in the same subsection or NULL if not*/
+/* found*/
+ezxml_t ezxml_idx(ezxml_t xml, int idx)
+{
+    for (; xml && idx; idx--) xml = xml->next;
+    return xml;
+}
+
+/* returns the value of the requested tag attribute or NULL if not found*/
+const char *ezxml_attr(ezxml_t xml, const char *attr)
+{
+    int i = 0, j = 1;
+    ezxml_root_t root = (ezxml_root_t)xml;
+
+    if (! xml || ! xml->attr) return NULL;
+    while (xml->attr[i] && strcmp(attr, xml->attr[i])) i += 2;
+    if (xml->attr[i]) return xml->attr[i + 1]; /* found attribute*/
+
+    while (root->xml.parent) root = (ezxml_root_t)root->xml.parent; /* root tag*/
+    for (i = 0; root->attr[i] && strcmp(xml->name, root->attr[i][0]); i++);
+    if (! root->attr[i]) return NULL; /* no matching default attributes*/
+    while (root->attr[i][j] && strcmp(attr, root->attr[i][j])) j += 3;
+    return (root->attr[i][j]) ? root->attr[i][j + 1] : NULL; /* found default*/
+}
+
+/* same as ezxml_get but takes an already initialized va_list*/
+ezxml_t ezxml_vget(ezxml_t xml, va_list ap)
+{
+    char *name = va_arg(ap, char *);
+    int idx = -1;
+
+    if (name && *name) {
+        idx = va_arg(ap, int);    
+        xml = ezxml_child(xml, name);
+    }
+    return (idx < 0) ? xml : ezxml_vget(ezxml_idx(xml, idx), ap);
+}
+
+/* Traverses the xml tree to retrieve a specific subtag. Takes a variable*/
+/* length list of tag names and indexes. The argument list must be terminated*/
+/* by either an index of -1 or an empty string tag name. Example: */
+/* title = ezxml_get(library, "shelf", 0, "book", 2, "title", -1);*/
+/* This retrieves the title of the 3rd book on the 1st shelf of library.*/
+/* Returns NULL if not found.*/
+ezxml_t ezxml_get(ezxml_t xml, ...)
+{
+    va_list ap;
+    ezxml_t r;
+
+    va_start(ap, xml);
+    r = ezxml_vget(xml, ap);
+    va_end(ap);
+    return r;
+}
+
+/* returns a null terminated array of processing instructions for the given*/
+/* target*/
+const char **ezxml_pi(ezxml_t xml, const char *target)
+{
+    ezxml_root_t root = (ezxml_root_t)xml;
+    int i = 0;
+
+    if (! root) return (const char **)EZXML_NIL;
+    while (root->xml.parent) root = (ezxml_root_t)root->xml.parent; /* root tag*/
+    while (root->pi[i] && strcmp(target, root->pi[i][0])) i++; /* find target*/
+    return (const char **)((root->pi[i]) ? root->pi[i] + 1 : EZXML_NIL);
+}
+
+/* set an error string and return root*/
+ezxml_t ezxml_err(ezxml_root_t root, char *s, const char *err, ...)
+{
+    va_list ap;
+    int line = 1;
+    char *t, fmt[EZXML_ERRL];
+    
+    for (t = root->s; t < s; t++) if (*t == '\n') line++;
+    snprintf(fmt, EZXML_ERRL, "[error near line %d]: %s", line, err);
+
+    va_start(ap, err);
+    vsnprintf(root->err, EZXML_ERRL, fmt, ap);
+    va_end(ap);
+
+    return &root->xml;
+}
+
+/* Recursively decodes entity and character references and normalizes new lines*/
+/* ent is a null terminated array of alternating entity names and values. set t*/
+/* to '&' for general entity decoding, '%' for parameter entity decoding, 'c'*/
+/* for cdata sections, ' ' for attribute normalization, or '*' for non-cdata*/
+/* attribute normalization. Returns s, or if the decoded string is longer than*/
+/* s, returns a malloced string that must be freed.*/
+char *ezxml_decode(char *s, char **ent, char t)
+{
+    char *e, *r = s, *m = s;
+    long b, c, d, l;
+
+    for (; *s; s++) { /* normalize line endings*/
+        while (*s == '\r') {
+            *(s++) = '\n';
+            if (*s == '\n') memmove(s, (s + 1), strlen(s));
+        }
+    }
+    
+    for (s = r; ; ) {
+        while (*s && *s != '&' && (*s != '%' || t != '%') && !isspace(*s)) s++;
+
+        if (! *s) break;
+        else if (t != 'c' && ! strncmp(s, "&#", 2)) { /* character reference*/
+            if (s[2] == 'x') c = strtol(s + 3, &e, 16); /* base 16*/
+            else c = strtol(s + 2, &e, 10); /* base 10*/
+            if (! c || *e != ';') { s++; continue; } /* not a character ref*/
+
+            if (c < 0x80) *(s++) = c; /* US-ASCII subset*/
+            else { /* multi-byte UTF-8 sequence*/
+                for (b = 0, d = c; d; d /= 2) b++; /* number of bits in c*/
+                b = (b - 2) / 5; /* number of bytes in payload*/
+                *(s++) = (0xFF << (7 - b)) | (c >> (6 * b)); /* head*/
+                while (b) *(s++) = 0x80 | ((c >> (6 * --b)) & 0x3F); /* payload*/
+            }
+
+            memmove(s, strchr(s, ';') + 1, strlen(strchr(s, ';')));
+        }
+        else if ((*s == '&' && (t == '&' || t == ' ' || t == '*')) ||
+                 (*s == '%' && t == '%')) { /* entity reference*/
+            for (b = 0; ent[b] && strncmp(s + 1, ent[b], strlen(ent[b]));
+                 b += 2); /* find entity in entity list*/
+
+            if (ent[b++]) { /* found a match*/
+                if ((c = strlen(ent[b])) - 1 > (e = strchr(s, ';')) - s) {
+                    l = (d = (s - r)) + c + strlen(e); /* new length*/
+                    r = (r == m) ? strcpy(malloc(l), r) : realloc(r, l);
+                    e = strchr((s = r + d), ';'); /* fix up pointers*/
+                }
+
+                memmove(s + c, e + 1, strlen(e)); /* shift rest of string*/
+                strncpy(s, ent[b], c); /* copy in replacement text*/
+            }
+            else s++; /* not a known entity*/
+        }
+        else if ((t == ' ' || t == '*') && isspace(*s)) *(s++) = ' ';
+        else s++; /* no decoding needed*/
+    }
+
+    if (t == '*') { /* normalize spaces for non-cdata attributes*/
+        for (s = r; *s; s++) {
+            if ((l = strspn(s, " "))) memmove(s, s + l, strlen(s + l) + 1);
+            while (*s && *s != ' ') s++;
+        }
+        if (--s >= r && *s == ' ') *s = '\0'; /* trim any trailing space*/
+    }
+    return r;
+}
+
+/* called when parser finds start of new tag*/
+void ezxml_open_tag(ezxml_root_t root, char *name, char **attr)
+{
+    ezxml_t xml = root->cur;
+    
+    if (xml->name) xml = ezxml_add_child(xml, name, strlen(xml->txt));
+    else xml->name = name; /* first open tag*/
+
+    xml->attr = attr;
+    root->cur = xml; /* update tag insertion point*/
+}
+
+/* called when parser finds character content between open and closing tag*/
+void ezxml_char_content(ezxml_root_t root, char *s, size_t len, char t)
+{
+    ezxml_t xml = root->cur;
+    char *m = s;
+    size_t l;
+
+    if (! xml || ! xml->name || ! len) return; /* sanity check*/
+
+    s[len] = '\0'; /* null terminate text (calling functions anticipate this)*/
+    len = strlen(s = ezxml_decode(s, root->ent, t)) + 1;
+
+    if (! *(xml->txt)) xml->txt = s; /* initial character content*/
+    else { /* allocate our own memory and make a copy*/
+        xml->txt = (xml->flags & EZXML_TXTM) /* allocate some space*/
+                   ? realloc(xml->txt, (l = strlen(xml->txt)) + len)
+                   : strcpy(malloc((l = strlen(xml->txt)) + len), xml->txt);
+        strcpy(xml->txt + l, s); /* add new char content*/
+        if (s != m) free(s); /* free s if it was malloced by ezxml_decode()*/
+    }
+
+    if (xml->txt != m) ezxml_set_flag(xml, EZXML_TXTM);
+}
+
+/* called when parser finds closing tag*/
+ezxml_t ezxml_close_tag(ezxml_root_t root, char *name, char *s)
+{
+    if (! root->cur || ! root->cur->name || strcmp(name, root->cur->name))
+        return ezxml_err(root, s, "unexpected closing tag </%s>", name);
+
+    root->cur = root->cur->parent;
+    return NULL;
+}
+
+/* checks for circular entity references, returns non-zero if no circular*/
+/* references are found, zero otherwise*/
+int ezxml_ent_ok(char *name, char *s, char **ent)
+{
+    int i;
+
+    for (; ; s++) {
+        while (*s && *s != '&') s++; /* find next entity reference*/
+        if (! *s) return 1;
+        if (! strncmp(s + 1, name, strlen(name))) return 0; /* circular ref.*/
+        for (i = 0; ent[i] && strncmp(ent[i], s + 1, strlen(ent[i])); i += 2);
+        if (ent[i] && ! ezxml_ent_ok(name, ent[i + 1], ent)) return 0;
+    }
+}
+
+/* called when the parser finds a processing instruction*/
+void ezxml_proc_inst(ezxml_root_t root, char *s, size_t len)
+{
+    int i = 0, j = 1;
+    char *target = s;
+
+    s[len] = '\0'; /* null terminate instruction*/
+    if (*(s += strcspn(s, EZXML_WS))) {
+        *s = '\0'; /* null terminate target*/
+        s += strspn(s + 1, EZXML_WS) + 1; /* skip whitespace after target*/
+    }
+
+    if (! strcmp(target, "xml")) { /* <?xml ... ?>*/
+        if ((s = strstr(s, "standalone")) && ! strncmp(s + strspn(s + 10,
+            EZXML_WS "='\"") + 10, "yes", 3)) root->standalone = 1;
+        return;
+    }
+
+    if (! root->pi[0]) *(root->pi = malloc(sizeof(char **))) = NULL; /*first pi*/
+
+    while (root->pi[i] && strcmp(target, root->pi[i][0])) i++; /* find target*/
+    if (! root->pi[i]) { /* new target*/
+        root->pi = realloc(root->pi, sizeof(char **) * (i + 2));
+        root->pi[i] = malloc(sizeof(char *) * 3);
+        root->pi[i][0] = target;
+        root->pi[i][1] = (char *)(root->pi[i + 1] = NULL); /* terminate pi list*/
+        root->pi[i][2] = strdup(""); /* empty document position list*/
+    }
+
+    while (root->pi[i][j]) j++; /* find end of instruction list for this target*/
+    root->pi[i] = realloc(root->pi[i], sizeof(char *) * (j + 3));
+    root->pi[i][j + 2] = realloc(root->pi[i][j + 1], j + 1);
+    strcpy(root->pi[i][j + 2] + j - 1, (root->xml.name) ? ">" : "<");
+    root->pi[i][j + 1] = NULL; /* null terminate pi list for this target*/
+    root->pi[i][j] = s; /* set instruction*/
+}
+
+/* called when the parser finds an internal doctype subset*/
+short ezxml_internal_dtd(ezxml_root_t root, char *s, size_t len)
+{
+    char q, *c, *t, *n = NULL, *v, **ent, **pe;
+    int i, j;
+    
+    pe = memcpy(malloc(sizeof(EZXML_NIL)), EZXML_NIL, sizeof(EZXML_NIL));
+
+    for (s[len] = '\0'; s; ) {
+        while (*s && *s != '<' && *s != '%') s++; /* find next declaration*/
+
+        if (! *s) break;
+        else if (! strncmp(s, "<!ENTITY", 8)) { /* parse entity definitions*/
+            c = s += strspn(s + 8, EZXML_WS) + 8; /* skip white space separator*/
+            n = s + strspn(s, EZXML_WS "%"); /* find name*/
+            *(s = n + strcspn(n, EZXML_WS)) = ';'; /* append ; to name*/
+
+            v = s + strspn(s + 1, EZXML_WS) + 1; /* find value*/
+            if ((q = *(v++)) != '"' && q != '\'') { /* skip externals*/
+                s = strchr(s, '>');
+                continue;
+            }
+
+            for (i = 0, ent = (*c == '%') ? pe : root->ent; ent[i]; i++);
+            ent = realloc(ent, (i + 3) * sizeof(char *)); /* space for next ent*/
+            if (*c == '%') pe = ent;
+            else root->ent = ent;
+
+            *(++s) = '\0'; /* null terminate name*/
+            if ((s = strchr(v, q))) *(s++) = '\0'; /* null terminate value*/
+            ent[i + 1] = ezxml_decode(v, pe, '%'); /* set value*/
+            ent[i + 2] = NULL; /* null terminate entity list*/
+            if (! ezxml_ent_ok(n, ent[i + 1], ent)) { /* circular reference*/
+                if (ent[i + 1] != v) free(ent[i + 1]);
+                ezxml_err(root, v, "circular entity declaration &%s", n);
+                break;
+            }
+            else ent[i] = n; /* set entity name*/
+        }
+        else if (! strncmp(s, "<!ATTLIST", 9)) { /* parse default attributes*/
+            t = s + strspn(s + 9, EZXML_WS) + 9; /* skip whitespace separator*/
+            if (! *t) { ezxml_err(root, t, "unclosed <!ATTLIST"); break; }
+            if (*(s = t + strcspn(t, EZXML_WS ">")) == '>') continue;
+            else *s = '\0'; /* null terminate tag name*/
+            for (i = 0; root->attr[i] && strcmp(n, root->attr[i][0]); i++);
+
+	    for(;;) {
+		s++;
+		if(!(*(n = s + strspn(s, EZXML_WS)) && *n != '>')) break;
+                if (*(s = n + strcspn(n, EZXML_WS))) *s = '\0'; /* attr name*/
+                else { ezxml_err(root, t, "malformed <!ATTLIST"); break; }
+
+                s += strspn(s + 1, EZXML_WS) + 1; /* find next token*/
+                c = (strncmp(s, "CDATA", 5)) ? "*" : " "; /* is it cdata?*/
+                if (! strncmp(s, "NOTATION", 8))
+                    s += strspn(s + 8, EZXML_WS) + 8;
+                s = (*s == '(') ? strchr(s, ')') : s + strcspn(s, EZXML_WS);
+                if (! s) { ezxml_err(root, t, "malformed <!ATTLIST"); break; }
+
+                s += strspn(s, EZXML_WS ")"); /* skip white space separator*/
+                if (! strncmp(s, "#FIXED", 6))
+                    s += strspn(s + 6, EZXML_WS) + 6;
+                if (*s == '#') { /* no default value*/
+                    s += strcspn(s, EZXML_WS ">") - 1;
+                    if (*c == ' ') continue; /* cdata is default, nothing to do*/
+                    v = NULL;
+                }
+                else if ((*s == '"' || *s == '\'')  &&  /* default value*/
+                         (s = strchr(v = s + 1, *s))) *s = '\0';
+                else { ezxml_err(root, t, "malformed <!ATTLIST"); break; }
+
+                if (! root->attr[i]) { /* new tag name*/
+                    root->attr = (! i) ? malloc(2 * sizeof(char **))
+                                       : realloc(root->attr,
+                                                 (i + 2) * sizeof(char **));
+                    root->attr[i] = malloc(2 * sizeof(char *));
+                    root->attr[i][0] = t; /* set tag name*/
+                    root->attr[i][1] = (char *)(root->attr[i + 1] = NULL);
+                }
+
+                for (j = 1; root->attr[i][j]; j += 3); /* find end of list*/
+                root->attr[i] = realloc(root->attr[i],
+                                        (j + 4) * sizeof(char *));
+
+                root->attr[i][j + 3] = NULL; /* null terminate list*/
+                root->attr[i][j + 2] = c; /* is it cdata?*/
+                root->attr[i][j + 1] = (v) ? ezxml_decode(v, root->ent, *c)
+                                           : NULL;
+                root->attr[i][j] = n; /* attribute name */
+            }
+        }
+        else if (! strncmp(s, "<!--", 4)) s = strstr(s + 4, "-->"); /* comments*/
+        else if (! strncmp(s, "<?", 2)) { /* processing instructions*/
+            if ((s = strstr(c = s + 2, "?>")))
+                ezxml_proc_inst(root, c, s++ - c);
+        }
+        else if (*s == '<') s = strchr(s, '>'); /* skip other declarations*/
+        else if (*(s++) == '%' && ! root->standalone) break;
+    }
+
+    free(pe);
+    return ! *root->err;
+}
+
+/* Converts a UTF-16 string to UTF-8. Returns a new string that must be freed*/
+/* or NULL if no conversion was needed.*/
+char *ezxml_str2utf8(char **s, size_t *len)
+{
+    char *u;
+    size_t l = 0, sl, max = *len;
+    long c, d;
+    int b, be = (**s == '\xFE') ? 1 : (**s == '\xFF') ? 0 : -1;
+
+    if (be == -1) return NULL; /* not UTF-16*/
+
+    u = malloc(max);
+    for (sl = 2; sl < *len - 1; sl += 2) {
+        c = (be) ? (((*s)[sl] & 0xFF) << 8) | ((*s)[sl + 1] & 0xFF)  /*UTF-16BE*/
+                 : (((*s)[sl + 1] & 0xFF) << 8) | ((*s)[sl] & 0xFF); /*UTF-16LE*/
+        if (c >= 0xD800 && c <= 0xDFFF && (sl += 2) < *len - 1) { /* high-half*/
+            d = (be) ? (((*s)[sl] & 0xFF) << 8) | ((*s)[sl + 1] & 0xFF)
+                     : (((*s)[sl + 1] & 0xFF) << 8) | ((*s)[sl] & 0xFF);
+            c = (((c & 0x3FF) << 10) | (d & 0x3FF)) + 0x10000;
+        }
+
+        while (l + 6 > max) u = realloc(u, max += EZXML_BUFSIZE);
+        if (c < 0x80) u[l++] = c; /* US-ASCII subset*/
+        else { /* multi-byte UTF-8 sequence*/
+            for (b = 0, d = c; d; d /= 2) b++; /* bits in c*/
+            b = (b - 2) / 5; /* bytes in payload*/
+            u[l++] = (0xFF << (7 - b)) | (c >> (6 * b)); /* head*/
+            while (b) u[l++] = 0x80 | ((c >> (6 * --b)) & 0x3F); /* payload*/
+        }
+    }
+    return *s = realloc(u, *len = l);
+}
+
+/* frees a tag attribute list*/
+void ezxml_free_attr(char **attr) {
+    int i = 0;
+    char *m;
+    
+    if (! attr || attr == EZXML_NIL) return; /* nothing to free*/
+    while (attr[i]) i += 2; /* find end of attribute list*/
+    m = attr[i + 1]; /* list of which names and values are malloced*/
+    for (i = 0; m[i]; i++) {
+        if (m[i] & EZXML_NAMEM) free(attr[i * 2]);
+        if (m[i] & EZXML_TXTM) free(attr[(i * 2) + 1]);
+    }
+    free(m);
+    free(attr);
+}
+
+/* parse the given xml string and return an ezxml structure*/
+ezxml_t ezxml_parse_str(char *s, size_t len)
+{
+    ezxml_root_t root = (ezxml_root_t)ezxml_new(NULL);
+    char q, e, *d, **attr, **a = NULL; /* initialize a to avoid compile warning*/
+    int l, i, j;
+
+    root->m = s;
+    if (! len) return ezxml_err(root, NULL, "root tag missing");
+    root->u = ezxml_str2utf8(&s, &len); /* convert utf-16 to utf-8*/
+    root->e = (root->s = s) + len; /* record start and end of work area*/
+    
+    e = s[len - 1]; /* save end char*/
+    s[len - 1] = '\0'; /* turn end char into null terminator*/
+
+    while (*s && *s != '<') s++; /* find first tag*/
+    if (! *s) return ezxml_err(root, s, "root tag missing");
+
+    for (; ; ) {
+        attr = (char **)EZXML_NIL;
+        d = ++s;
+        
+        if (isalpha(*s) || *s == '_' || *s == ':' || *s < '\0') { /* new tag*/
+            if (! root->cur)
+                return ezxml_err(root, d, "markup outside of root element");
+
+            s += strcspn(s, EZXML_WS "/>");
+            while (isspace(*s)) *(s++) = '\0'; /* null terminate tag name*/
+  
+            if (*s && *s != '/' && *s != '>') /* find tag in default attr list*/
+                for (i = 0; (a = root->attr[i]) && strcmp(a[0], d); i++);
+
+            for (l = 0; *s && *s != '/' && *s != '>'; l += 2) { /* new attrib*/
+                attr = (l) ? realloc(attr, (l + 4) * sizeof(char *))
+                           : malloc(4 * sizeof(char *)); /* allocate space*/
+                attr[l + 3] = (l) ? realloc(attr[l + 1], (l / 2) + 2)
+                                  : malloc(2); /* mem for list of maloced vals*/
+                strcpy(attr[l + 3] + (l / 2), " "); /* value is not malloced*/
+                attr[l + 2] = NULL; /* null terminate list*/
+                attr[l + 1] = ""; /* temporary attribute value*/
+                attr[l] = s; /* set attribute name*/
+
+                s += strcspn(s, EZXML_WS "=/>");
+                if (*s == '=' || isspace(*s)) { 
+                    *(s++) = '\0'; /* null terminate tag attribute name*/
+                    q = *(s += strspn(s, EZXML_WS "="));
+                    if (q == '"' || q == '\'') { /* attribute value*/
+                        attr[l + 1] = ++s;
+                        while (*s && *s != q) s++;
+                        if (*s) *(s++) = '\0'; /* null terminate attribute val*/
+                        else {
+                            ezxml_free_attr(attr);
+                            return ezxml_err(root, d, "missing %c", q);
+                        }
+
+                        for (j = 1; a && a[j] && strcmp(a[j], attr[l]); j +=3);
+                        attr[l + 1] = ezxml_decode(attr[l + 1], root->ent, (a
+                                                   && a[j]) ? *a[j + 2] : ' ');
+                        if (attr[l + 1] < d || attr[l + 1] > s)
+                            attr[l + 3][l / 2] = EZXML_TXTM; /* value malloced*/
+                    }
+                }
+                while (isspace(*s)) s++;
+            }
+
+            if (*s == '/') { /* self closing tag*/
+                *(s++) = '\0';
+                if ((*s && *s != '>') || (! *s && e != '>')) {
+                    if (l) ezxml_free_attr(attr);
+                    return ezxml_err(root, d, "missing >");
+                }
+                ezxml_open_tag(root, d, attr);
+                ezxml_close_tag(root, d, s);
+            }
+            else if ((q = *s) == '>' || (! *s && e == '>')) { /* open tag*/
+                *s = '\0'; /* temporarily null terminate tag name*/
+                ezxml_open_tag(root, d, attr);
+                *s = q;
+            }
+            else {
+                if (l) ezxml_free_attr(attr);
+                return ezxml_err(root, d, "missing >"); 
+            }
+        }
+        else if (*s == '/') { /* close tag*/
+            s += strcspn(d = s + 1, EZXML_WS ">") + 1;
+            if (! (q = *s) && e != '>') return ezxml_err(root, d, "missing >");
+            *s = '\0'; /* temporarily null terminate tag name*/
+            if (ezxml_close_tag(root, d, s)) return &root->xml;
+            if (isspace(*s = q)) s += strspn(s, EZXML_WS);
+        }
+        else if (! strncmp(s, "!--", 3)) { /* xml comment*/
+            if (! (s = strstr(s + 3, "--")) || (*(s += 2) != '>' && *s) ||
+                (! *s && e != '>')) return ezxml_err(root, d, "unclosed <!--");
+        }
+        else if (! strncmp(s, "![CDATA[", 8)) { /* cdata*/
+            if ((s = strstr(s, "]]>")))
+                ezxml_char_content(root, d + 8, (s += 2) - d - 10, 'c');
+            else return ezxml_err(root, d, "unclosed <![CDATA[");
+        }
+        else if (! strncmp(s, "!DOCTYPE", 8)) { /* dtd*/
+            for (l = 0; *s && ((! l && *s != '>') || (l && (*s != ']' || 
+                 *(s + strspn(s + 1, EZXML_WS) + 1) != '>')));
+                 l = (*s == '[') ? 1 : l) s += strcspn(s + 1, "[]>") + 1;
+            if (! *s && e != '>')
+                return ezxml_err(root, d, "unclosed <!DOCTYPE");
+            d = (l) ? strchr(d, '[') + 1 : d;
+            if (l && ! ezxml_internal_dtd(root, d, s++ - d)) return &root->xml;
+        }
+        else if (*s == '?') { /* <?...?> processing instructions*/
+            do { s = strchr(s, '?'); } while (s && *(++s) && *s != '>');
+            if (! s || (! *s && e != '>')) 
+                return ezxml_err(root, d, "unclosed <?");
+            else ezxml_proc_inst(root, d + 1, s - d - 2);
+        }
+        else return ezxml_err(root, d, "unexpected <");
+        
+        if (! s || ! *s) break;
+        *s = '\0';
+        d = ++s;
+        if (*s && *s != '<') { /* tag character content*/
+            while (*s && *s != '<') s++;
+            if (*s) ezxml_char_content(root, d, s - d, '&');
+            else break;
+        }
+        else if (! *s) break;
+    }
+
+    if (! root->cur) return &root->xml;
+    else if (! root->cur->name) return ezxml_err(root, d, "root tag missing");
+    else return ezxml_err(root, d, "unclosed tag <%s>", root->cur->name);
+}
+
+/* Wrapper for ezxml_parse_str() that accepts a file stream. Reads the entire*/
+/* stream into memory and then parses it. For xml files, use ezxml_parse_file()*/
+/* or ezxml_parse_fd()*/
+ezxml_t ezxml_parse_fp(FILE *fp)
+{
+    ezxml_root_t root;
+    size_t l, len = 0;
+    char *s;
+
+    if (! (s = malloc(EZXML_BUFSIZE))) return NULL;
+    do {
+        len += (l = fread((s + len), 1, EZXML_BUFSIZE, fp));
+        if (l == EZXML_BUFSIZE) s = realloc(s, len + EZXML_BUFSIZE);
+    } while (s && l == EZXML_BUFSIZE);
+
+    if (! s) return NULL;
+    root = (ezxml_root_t)ezxml_parse_str(s, len);
+    root->len = -1; /* so we know to free s in ezxml_free()*/
+    return &root->xml;
+}
+
+/* Encodes ampersand sequences appending the results to *dst, reallocating *dst*/
+/* if length excedes max. a is non-zero for attribute encoding. Returns *dst*/
+char *ezxml_ampencode(const char *s, size_t len, char **dst, size_t *dlen,
+                      size_t *max, short a)
+{
+    const char *e;
+    
+    for (e = s + len; s != e; s++) {
+        while (*dlen + 10 > *max) *dst = realloc(*dst, *max += EZXML_BUFSIZE);
+
+        switch (*s) {
+        case '\0': return *dst;
+        case '&': *dlen += sprintf(*dst + *dlen, "&"); break;
+        case '<': *dlen += sprintf(*dst + *dlen, "<"); break;
+        case '>': *dlen += sprintf(*dst + *dlen, ">"); break;
+        case '"': *dlen += sprintf(*dst + *dlen, (a) ? """ : "\""); break;
+        case '\n': *dlen += sprintf(*dst + *dlen, (a) ? "&#xA;" : "\n"); break;
+        case '\t': *dlen += sprintf(*dst + *dlen, (a) ? "&#x9;" : "\t"); break;
+        case '\r': *dlen += sprintf(*dst + *dlen, "&#xD;"); break;
+        default: (*dst)[(*dlen)++] = *s;
+        }
+    }
+    return *dst;
+}
+
+/* Recursively converts each tag to xml appending it to *s. Reallocates *s if*/
+/* its length excedes max. start is the location of the previous tag in the*/
+/* parent tag's character content. Returns *s.*/
+char *ezxml_toxml_r(ezxml_t xml, char **s, size_t *len, size_t *max,
+                    size_t start, char ***attr)
+{
+    int i, j;
+    char *txt = (xml->parent) ? xml->parent->txt : "";
+    size_t off = 0;
+
+    /* parent character content up to this tag*/
+    *s = ezxml_ampencode(txt + start, xml->off - start, s, len, max, 0);
+
+    while (*len + strlen(xml->name) + 4 > *max) /* reallocate s*/
+        *s = realloc(*s, *max += EZXML_BUFSIZE);
+
+    *len += sprintf(*s + *len, "<%s", xml->name); /* open tag*/
+    for (i = 0; xml->attr[i]; i += 2) { /* tag attributes*/
+        if (ezxml_attr(xml, xml->attr[i]) != xml->attr[i + 1]) continue;
+        while (*len + strlen(xml->attr[i]) + 7 > *max) /* reallocate s*/
+            *s = realloc(*s, *max += EZXML_BUFSIZE);
+
+        *len += sprintf(*s + *len, " %s=\"", xml->attr[i]);
+        ezxml_ampencode(xml->attr[i + 1], -1, s, len, max, 1);
+        *len += sprintf(*s + *len, "\"");
+    }
+
+    for (i = 0; attr[i] && strcmp(attr[i][0], xml->name); i++);
+    for (j = 1; attr[i] && attr[i][j]; j += 3) { /* default attributes*/
+        if (! attr[i][j + 1] || ezxml_attr(xml, attr[i][j]) != attr[i][j + 1])
+            continue; /* skip duplicates and non-values*/
+        while (*len + strlen(attr[i][j]) + 7 > *max) /* reallocate s*/
+            *s = realloc(*s, *max += EZXML_BUFSIZE);
+
+        *len += sprintf(*s + *len, " %s=\"", attr[i][j]);
+        ezxml_ampencode(attr[i][j + 1], -1, s, len, max, 1);
+        *len += sprintf(*s + *len, "\"");
+    }
+    *len += sprintf(*s + *len, ">");
+
+    *s = (xml->child) ? ezxml_toxml_r(xml->child, s, len, max, 0, attr) /*child*/
+                      : ezxml_ampencode(xml->txt, -1, s, len, max, 0);  /*data*/
+    
+    while (*len + strlen(xml->name) + 4 > *max) /* reallocate s*/
+        *s = realloc(*s, *max += EZXML_BUFSIZE);
+
+    *len += sprintf(*s + *len, "</%s>", xml->name); /* close tag*/
+
+    while (txt[off] && off < xml->off) off++; /* make sure off is within bounds*/
+    return (xml->ordered) ? ezxml_toxml_r(xml->ordered, s, len, max, off, attr)
+                          : ezxml_ampencode(txt + off, -1, s, len, max, 0);
+}
+
+/* Converts an ezxml structure back to xml. Returns a string of xml data that*/
+/* must be freed.*/
+char *ezxml_toxml(ezxml_t xml)
+{
+    ezxml_t p = (xml) ? xml->parent : NULL, o = (xml) ? xml->ordered : NULL;
+    ezxml_root_t root = (ezxml_root_t)xml;
+    size_t len = 0, max = EZXML_BUFSIZE;
+    char *s = strcpy(malloc(max), ""), *t, *n;
+    int i, j, k;
+
+    if (! xml || ! xml->name) return realloc(s, len + 1);
+    while (root->xml.parent) root = (ezxml_root_t)root->xml.parent; /* root tag*/
+
+    for (i = 0; ! p && root->pi[i]; i++) { /* pre-root processing instructions*/
+        for (k = 2; root->pi[i][k - 1]; k++);
+        for (j = 1; (n = root->pi[i][j]); j++) {
+            if (root->pi[i][k][j - 1] == '>') continue; /* not pre-root*/
+            while (len + strlen(t = root->pi[i][0]) + strlen(n) + 7 > max)
+                s = realloc(s, max += EZXML_BUFSIZE);
+            len += sprintf(s + len, "<?%s%s%s?>\n", t, *n ? " " : "", n);
+        }
+    }
+
+    xml->parent = xml->ordered = NULL;
+    s = ezxml_toxml_r(xml, &s, &len, &max, 0, root->attr);
+    xml->parent = p;
+    xml->ordered = o;
+
+    for (i = 0; ! p && root->pi[i]; i++) { /* post-root processing instructions*/
+        for (k = 2; root->pi[i][k - 1]; k++);
+        for (j = 1; (n = root->pi[i][j]); j++) {
+            if (root->pi[i][k][j - 1] == '<') continue; /* not post-root*/
+            while (len + strlen(t = root->pi[i][0]) + strlen(n) + 7 > max)
+                s = realloc(s, max += EZXML_BUFSIZE);
+            len += sprintf(s + len, "\n<?%s%s%s?>", t, *n ? " " : "", n);
+        }
+    }
+    return realloc(s, len + 1);
+}
+
+/* free the memory allocated for the ezxml structure*/
+void ezxml_free(ezxml_t xml)
+{
+    ezxml_root_t root = (ezxml_root_t)xml;
+    int i, j;
+    char **a, *s;
+
+    if (! xml) return;
+    ezxml_free(xml->child);
+    ezxml_free(xml->ordered);
+
+    if (! xml->parent) { /* free root tag allocations*/
+        for (i = 10; root->ent[i]; i += 2) /* 0 - 9 are default entites (<>&"')*/
+            if ((s = root->ent[i + 1]) < root->s || s > root->e) free(s);
+        free(root->ent); /* free list of general entities*/
+
+        for (i = 0; (a = root->attr[i]); i++) {
+            for (j = 1; a[j++]; j += 2) /* free malloced attribute values*/
+                if (a[j] && (a[j] < root->s || a[j] > root->e)) free(a[j]);
+            free(a);
+        }
+        if (root->attr[0]) free(root->attr); /* free default attribute list*/
+
+        for (i = 0; root->pi[i]; i++) {
+            for (j = 1; root->pi[i][j]; j++);
+            free(root->pi[i][j + 1]);
+            free(root->pi[i]);
+        }            
+        if (root->pi[0]) free(root->pi); /* free processing instructions*/
+
+        if (root->len == -1) free(root->m); /* malloced xml data*/
+#ifdef EZXML_MMAP
+        else if (root->len) munmap(root->m, root->len); /* mem mapped xml data*/
+#endif /* EZXML_MMAP*/
+        if (root->u) free(root->u); /* utf8 conversion*/
+    }
+
+    ezxml_free_attr(xml->attr); /* tag attributes*/
+    if ((xml->flags & EZXML_TXTM)) free(xml->txt); /* character content*/
+    if ((xml->flags & EZXML_NAMEM)) free(xml->name); /* tag name*/
+    free(xml);
+}
+
+/* return parser error message or empty string if none*/
+const char *ezxml_error(ezxml_t xml)
+{
+    while (xml && xml->parent) xml = xml->parent; /* find root tag*/
+    return (xml) ? ((ezxml_root_t)xml)->err : "";
+}
+
+/* returns a new empty ezxml structure with the given root tag name*/
+ezxml_t ezxml_new(const char *name)
+{
+    static char *ent[] = { "lt;", "<", "gt;", ">", "quot;", """,
+                           "apos;", "'", "amp;", "&", NULL };
+    ezxml_root_t root = (ezxml_root_t)memset(malloc(sizeof(struct ezxml_root)), 
+                                             '\0', sizeof(struct ezxml_root));
+    root->xml.name = (char *)name;
+    root->cur = &root->xml;
+    strcpy(root->err, root->xml.txt = "");
+    root->ent = memcpy(malloc(sizeof(ent)), ent, sizeof(ent));
+    root->attr = root->pi = (char ***)(root->xml.attr = EZXML_NIL);
+    return &root->xml;
+}
+
+/* inserts an existing tag into an ezxml structure*/
+ezxml_t ezxml_insert(ezxml_t xml, ezxml_t dest, size_t off)
+{
+    ezxml_t cur, prev, head;
+
+    xml->next = xml->sibling = xml->ordered = NULL;
+    xml->off = off;
+    xml->parent = dest;
+
+    if ((head = dest->child)) { /* already have sub tags*/
+        if (head->off <= off) { /* not first subtag*/
+            for (cur = head; cur->ordered && cur->ordered->off <= off;
+                 cur = cur->ordered);
+            xml->ordered = cur->ordered;
+            cur->ordered = xml;
+        }
+        else { /* first subtag*/
+            xml->ordered = head;
+            dest->child = xml;
+        }
+
+        for (cur = head, prev = NULL; cur && strcmp(cur->name, xml->name);
+             prev = cur, cur = cur->sibling); /* find tag type*/
+        if (cur && cur->off <= off) { /* not first of type*/
+            while (cur->next && cur->next->off <= off) cur = cur->next;
+            xml->next = cur->next;
+            cur->next = xml;
+        }
+        else { /* first tag of this type*/
+            if (prev && cur) prev->sibling = cur->sibling; /* remove old first*/
+            xml->next = cur; /* old first tag is now next*/
+            for (cur = head, prev = NULL; cur && cur->off <= off;
+                 prev = cur, cur = cur->sibling); /* new sibling insert point*/
+            xml->sibling = cur;
+            if (prev) prev->sibling = xml;
+        }
+    }
+    else dest->child = xml; /* only sub tag*/
+
+    return xml;
+}
+
+/* Adds a child tag. off is the offset of the child tag relative to the start*/
+/* of the parent tag's character content. Returns the child tag.*/
+ezxml_t ezxml_add_child(ezxml_t xml, const char *name, size_t off)
+{
+    ezxml_t child;
+
+    if (! xml) return NULL;
+    child = (ezxml_t)memset(malloc(sizeof(struct ezxml)), '\0',
+                            sizeof(struct ezxml));
+    child->name = (char *)name;
+    child->attr = EZXML_NIL;
+    child->txt = "";
+
+    return ezxml_insert(child, xml, off);
+}
+
+/* sets the character content for the given tag and returns the tag*/
+ezxml_t ezxml_set_txt(ezxml_t xml, const char *txt)
+{
+    if (! xml) return NULL;
+    if (xml->flags & EZXML_TXTM) free(xml->txt); /* existing txt was malloced*/
+    xml->flags &= ~EZXML_TXTM;
+    xml->txt = (char *)txt;
+    return xml;
+}
+
+/* Sets the given tag attribute or adds a new attribute if not found. A value*/
+/* of NULL will remove the specified attribute. Returns the tag given.*/
+ezxml_t ezxml_set_attr(ezxml_t xml, const char *name, const char *value)
+{
+    int l = 0, c;
+
+    if (! xml) return NULL;
+    while (xml->attr[l] && strcmp(xml->attr[l], name)) l += 2;
+    if (! xml->attr[l]) { /* not found, add as new attribute*/
+        if (! value) return xml; /* nothing to do*/
+        if (xml->attr == EZXML_NIL) { /* first attribute*/
+            xml->attr = malloc(4 * sizeof(char *));
+            xml->attr[1] = strdup(""); /* empty list of malloced names/vals*/
+        }
+        else xml->attr = realloc(xml->attr, (l + 4) * sizeof(char *));
+
+        xml->attr[l] = (char *)name; /* set attribute name*/
+        xml->attr[l + 2] = NULL; /* null terminate attribute list*/
+        xml->attr[l + 3] = realloc(xml->attr[l + 1],
+                                   (c = strlen(xml->attr[l + 1])) + 2);
+        strcpy(xml->attr[l + 3] + c, " "); /* set name/value as not malloced*/
+        if (xml->flags & EZXML_DUP) xml->attr[l + 3][c] = EZXML_NAMEM;
+    }
+    else if (xml->flags & EZXML_DUP) free((char *)name); /* name was strduped*/
+
+    for (c = l; xml->attr[c]; c += 2); /* find end of attribute list*/
+    if (xml->attr[c + 1][l / 2] & EZXML_TXTM) free(xml->attr[l + 1]); /*old val*/
+    if (xml->flags & EZXML_DUP) xml->attr[c + 1][l / 2] |= EZXML_TXTM;
+    else xml->attr[c + 1][l / 2] &= ~EZXML_TXTM;
+
+    if (value) xml->attr[l + 1] = (char *)value; /* set attribute value*/
+    else { /* remove attribute*/
+        if (xml->attr[c + 1][l / 2] & EZXML_NAMEM) free(xml->attr[l]);
+        memmove(xml->attr + l, xml->attr + l + 2, (c - l + 2) * sizeof(char*));
+        xml->attr = realloc(xml->attr, (c + 2) * sizeof(char *));
+        memmove(xml->attr[c + 1] + (l / 2), xml->attr[c + 1] + (l / 2) + 1,
+                (c / 2) - (l / 2)); /* fix list of which name/vals are malloced*/
+    }
+    xml->flags &= ~EZXML_DUP; /* clear strdup() flag*/
+    return xml;
+}
+
+/* sets a flag for the given tag and returns the tag*/
+ezxml_t ezxml_set_flag(ezxml_t xml, short flag)
+{
+    if (xml) xml->flags |= flag;
+    return xml;
+}
+
+/* removes a tag along with its subtags without freeing its memory*/
+ezxml_t ezxml_cut(ezxml_t xml)
+{
+    ezxml_t cur;
+
+    if (! xml) return NULL; /* nothing to do*/
+    if (xml->next) xml->next->sibling = xml->sibling; /* patch sibling list*/
+
+    if (xml->parent) { /* not root tag*/
+        cur = xml->parent->child; /* find head of subtag list*/
+        if (cur == xml) xml->parent->child = xml->ordered; /* first subtag*/
+        else { /* not first subtag*/
+            while (cur->ordered != xml) cur = cur->ordered;
+            cur->ordered = cur->ordered->ordered; /* patch ordered list*/
+
+            cur = xml->parent->child; /* go back to head of subtag list*/
+            if (strcmp(cur->name, xml->name)) { /* not in first sibling list*/
+                while (strcmp(cur->sibling->name, xml->name))
+                    cur = cur->sibling;
+                if (cur->sibling == xml) { /* first of a sibling list*/
+                    cur->sibling = (xml->next) ? xml->next
+                                               : cur->sibling->sibling;
+                }
+                else cur = cur->sibling; /* not first of a sibling list*/
+            }
+
+            while (cur->next && cur->next != xml) cur = cur->next;
+            if (cur->next) cur->next = cur->next->next; /* patch next list*/
+        }        
+    }
+    xml->ordered = xml->sibling = xml->next = NULL;
+    return xml;
+}
+
+#ifdef EZXML_TEST /* test harness*/
+int main(int argc, char **argv)
+{
+    ezxml_t xml;
+    char *s;
+    int i;
+
+    if (argc != 2) return fprintf(stderr, "usage: %s xmlfile\n", argv[0]);
+
+    xml = ezxml_parse_file(argv[1]);
+    printf("%s\n", (s = ezxml_toxml(xml)));
+    free(s);
+    i = fprintf(stderr, "%s", ezxml_error(xml));
+    ezxml_free(xml);
+    return (i) ? 1 : 0;
+}
+#endif /* EZXML_TEST*/
diff --git a/libdap4/ezxml.h b/libdap4/ezxml.h
new file mode 100644
index 0000000..be87cc9
--- /dev/null
+++ b/libdap4/ezxml.h
@@ -0,0 +1,167 @@
+/* ezxml.h
+ *
+ * Copyright 2004-2006 Aaron Voisine <aaron at voisine.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _EZXML_H
+#define _EZXML_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <fcntl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EZXML_BUFSIZE 1024 /* size of internal memory buffers*/
+#define EZXML_NAMEM   0x80 /* name is malloced*/
+#define EZXML_TXTM    0x40 /* txt is malloced*/
+#define EZXML_DUP     0x20 /* attribute name and value are strduped*/
+
+typedef struct ezxml *ezxml_t;
+struct ezxml {
+    char *name;      /* tag name*/
+    char **attr;     /* tag attributes { name, value, name, value, ... NULL }*/
+    char *txt;       /* tag character content, empty string if none*/
+    size_t off;      /* tag offset from start of parent tag character content*/
+    ezxml_t next;    /* next tag with same name in this section at this depth*/
+    ezxml_t sibling; /* next tag with different name in same section and depth*/
+    ezxml_t ordered; /* next tag, same section and depth, in original order*/
+    ezxml_t child;   /* head of sub tag list, NULL if none*/
+    ezxml_t parent;  /* parent tag, NULL if current tag is root tag*/
+    short flags;     /* additional information*/
+};
+
+/* Given a string of xml data and its length, parses it and creates an ezxml*/
+/* structure. For efficiency, modifies the data by adding null terminators*/
+/* and decoding ampersand sequences. If you don't want this, copy the data and*/
+/* pass in the copy. Returns NULL on failure.*/
+ezxml_t ezxml_parse_str(char *s, size_t len);
+
+/* A wrapper for ezxml_parse_str() that accepts a file descriptor. First*/
+/* attempts to mem map the file. Failing that, reads the file into memory.*/
+/* Returns NULL on failure.*/
+ezxml_t ezxml_parse_fd(int fd);
+
+/* a wrapper for ezxml_parse_fd() that accepts a file name*/
+ezxml_t ezxml_parse_file(const char *file);
+    
+/* Wrapper for ezxml_parse_str() that accepts a file stream. Reads the entire*/
+/* stream into memory and then parses it. For xml files, use ezxml_parse_file()*/
+/* or ezxml_parse_fd()*/
+ezxml_t ezxml_parse_fp(FILE *fp);
+
+/* returns the first child tag (one level deeper) with the given name or NULL*/
+/* if not found*/
+ezxml_t ezxml_child(ezxml_t xml, const char *name);
+
+/* returns the next tag of the same name in the same section and depth or NULL*/
+/* if not found*/
+#define ezxml_next(xml) ((xml) ? xml->next : NULL)
+
+/* Returns the Nth tag with the same name in the same section at the same depth*/
+/* or NULL if not found. An index of 0 returns the tag given.*/
+ezxml_t ezxml_idx(ezxml_t xml, int idx);
+
+/* returns the name of the given tag*/
+#define ezxml_name(xml) ((xml) ? xml->name : NULL)
+
+/* returns the given tag's character content or empty string if none*/
+#define ezxml_txt(xml) ((xml) ? xml->txt : "")
+
+/* returns the value of the requested tag attribute, or NULL if not found*/
+const char *ezxml_attr(ezxml_t xml, const char *attr);
+
+/* Traverses the ezxml sturcture to retrieve a specific subtag. Takes a*/
+/* variable length list of tag names and indexes. The argument list must be*/
+/* terminated by either an index of -1 or an empty string tag name. Example: */
+/* title = ezxml_get(library, "shelf", 0, "book", 2, "title", -1);*/
+/* This retrieves the title of the 3rd book on the 1st shelf of library.*/
+/* Returns NULL if not found.*/
+ezxml_t ezxml_get(ezxml_t xml, ...);
+
+/* Converts an ezxml structure back to xml. Returns a string of xml data that*/
+/* must be freed.*/
+char *ezxml_toxml(ezxml_t xml);
+
+/* returns a NULL terminated array of processing instructions for the given*/
+/* target*/
+const char **ezxml_pi(ezxml_t xml, const char *target);
+
+/* frees the memory allocated for an ezxml structure*/
+void ezxml_free(ezxml_t xml);
+    
+/* returns parser error message or empty string if none*/
+const char *ezxml_error(ezxml_t xml);
+
+/* returns a new empty ezxml structure with the given root tag name*/
+ezxml_t ezxml_new(const char *name);
+
+/* wrapper for ezxml_new() that strdup()s name*/
+#define ezxml_new_d(name) ezxml_set_flag(ezxml_new(strdup(name)), EZXML_NAMEM)
+
+/* Adds a child tag. off is the offset of the child tag relative to the start*/
+/* of the parent tag's character content. Returns the child tag.*/
+ezxml_t ezxml_add_child(ezxml_t xml, const char *name, size_t off);
+
+/* wrapper for ezxml_add_child() that strdup()s name*/
+#define ezxml_add_child_d(xml, name, off) \
+    ezxml_set_flag(ezxml_add_child(xml, strdup(name), off), EZXML_NAMEM)
+
+/* sets the character content for the given tag and returns the tag*/
+ezxml_t ezxml_set_txt(ezxml_t xml, const char *txt);
+
+/* wrapper for ezxml_set_txt() that strdup()s txt*/
+#define ezxml_set_txt_d(xml, txt) \
+    ezxml_set_flag(ezxml_set_txt(xml, strdup(txt)), EZXML_TXTM)
+
+/* Sets the given tag attribute or adds a new attribute if not found. A value*/
+/* of NULL will remove the specified attribute. Returns the tag given.*/
+ezxml_t ezxml_set_attr(ezxml_t xml, const char *name, const char *value);
+
+/* Wrapper for ezxml_set_attr() that strdup()s name/value. Value cannot be NULL*/
+#define ezxml_set_attr_d(xml, name, value) \
+    ezxml_set_attr(ezxml_set_flag(xml, EZXML_DUP), strdup(name), strdup(value))
+
+/* sets a flag for the given tag and returns the tag*/
+ezxml_t ezxml_set_flag(ezxml_t xml, short flag);
+
+/* removes a tag along with its subtags without freeing its memory*/
+ezxml_t ezxml_cut(ezxml_t xml);
+
+/* inserts an existing tag into an ezxml structure*/
+ezxml_t ezxml_insert(ezxml_t xml, ezxml_t dest, size_t off);
+
+/* Moves an existing tag to become a subtag of dest at the given offset from*/
+/* the start of dest's character content. Returns the moved tag.*/
+#define ezxml_move(xml, dest, off) ezxml_insert(ezxml_cut(xml), dest, off)
+
+/* removes a tag along with all its subtags*/
+#define ezxml_remove(xml) ezxml_free(ezxml_cut(xml))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _EZXML_H*/
diff --git a/libdap4/ezxml_extra.c b/libdap4/ezxml_extra.c
new file mode 100644
index 0000000..3e58bd5
--- /dev/null
+++ b/libdap4/ezxml_extra.c
@@ -0,0 +1,27 @@
+/*
+ * Copyright 1998-2015 University Corporation for Atmospheric Research/Unidata
+ *  See the LICENSE file for more information.
+ */
+
+/**
+Extra ezxml functionality
+*/
+
+#include "ezxml.h"
+
+/**
+Get list of all the xml attributes.
+Returns NULL, if none
+WARNING: returns actual list, so do not free
+*/
+const char**
+ezxml_all_attr(ezxml_t xml, int* countp)
+{
+    if(xml && xml->attr) {
+        char** p;
+        int count = 0;
+        for(p=xml->attr;*p;p+=2) count += 2; /* get number of attributes */
+	return (const char**)xml->attr;
+    }
+    return NULL;
+}
diff --git a/libdap4/ncd4.h b/libdap4/ncd4.h
new file mode 100644
index 0000000..92b680e
--- /dev/null
+++ b/libdap4/ncd4.h
@@ -0,0 +1,224 @@
+/*********************************************************************
+  *   Copyright 2016, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+
+/*
+External functions and state variables are
+defined here, including function-like #defines.
+*/
+
+#ifndef NCD4_H
+#define NCD4_H 1
+
+#include "d4includes.h"
+#include "d4util.h"
+#include "d4debug.h"
+#include "nc4internal.h"
+
+/**************************************************/
+/* Constants */
+
+#define RCFILEENV "DAPRCFILE"
+
+/* Figure out a usable max path name max */
+#ifdef PATH_MAX /* *nix* */
+#define NC_MAX_PATH PATH_MAX
+#else
+#  ifdef MAX_PATH /*windows*/
+#    define NC_MAX_PATH MAX_PATH
+#  else
+#    define NC_MAX_PATH 4096
+#  endif
+#endif
+
+#define COUNTERTYPE unsigned long long
+#define COUNTERSIZE sizeof(COUNTERTYPE)
+
+/* Clear allocated memory (see e.g. d4data.c); Potentially costly*/
+#undef CLEARMEM
+
+/* Clear empty structure alignment space; Potentially costly, but probably less than  CLEARMEM */
+#define CLEARSTRUCT
+
+/**************************************************/
+/* Global state */
+
+extern NCD4globalstate* NCD4_globalstate;
+
+/**************************************************/
+
+#undef nullfree
+#ifndef nullfree
+#define nullfree(m) ((m)==NULL?NULL:(free(m),NULL))
+#endif
+#define nulldup(s) ((s)==NULL?NULL:strdup(s))
+
+/**************************************************/
+/* DSP API wrappers */
+
+#ifdef FIX
+extern int dsp_getDMR(ND4dsp* dsp, DCR** dcrp);
+extern int dsp_getDAP(ND4dsp* dsp, DCR** dcrp);
+extern int dsp_close(ND4dsp* dsp);
+
+/* DSP API */
+extern int dsp_open(const char* path, ND4dsp** dspp);
+
+/*
+extern NCerror dapbuildvaraprojection(CDFnode*,
+		     const size_t* startp, const size_t* countp, const ptrdiff_t* stridep,
+		     struct DCEprojection** projectionlist);
+
+extern NCerror NCD4_getvarx(int ncid, int varid,
+	    const size_t *startp,
+	    const size_t *countp,
+	    const ptrdiff_t *stridep,
+	    void *data,
+	    nc_type dsttype0);
+*/
+#endif
+
+/**************************************************/
+
+/* From d4http.c */
+extern long NCD4_fetchhttpcode(CURL* curl);
+extern int NCD4_fetchurl_file(CURL* curl, const char* url, FILE* stream, d4size_t* sizep, long* filetime);
+extern int NCD4_fetchurl(CURL* curl, const char* url, NCbytes* buf, long* filetime, struct credentials* creds);
+extern int NCD4_curlopen(CURL** curlp);
+extern void NCD4_curlclose(CURL* curl);
+extern int NCD4_fetchlastmodified(CURL* curl, char* url, long* filetime);
+extern int NCD4_ping(const char* url);
+
+/* From d4read.c */
+extern int NCD4_readDMR(NCD4INFO* state);
+extern int NCD4_readDAP(NCD4INFO* state, int flags);
+
+/* From d4parser.c */
+extern int NCD4_parse(NCD4meta*);
+extern NCD4node* NCD4_findAttr(NCD4node* container, const char* attrname);
+extern NCD4node* NCD4_groupFor(NCD4node* node);
+
+/* From d4printer.c */
+extern int NCD4_print(NCD4meta*, NCbytes* output);
+
+/* From d4meta.c */
+extern NCD4meta* NCD4_newmeta(size_t size, void* rawdata);
+extern void NCD4_reclaimMeta(NCD4meta*);
+extern void NCD4_setdebuglevel(NCD4meta*,int);
+extern int NCD4_metabuild(NCD4meta*, int ncid);
+extern size_t NCD4_computeTypeSize(NCD4meta*, NCD4node* type);
+
+/* From d4chunk.c */
+extern int NCD4_dechunk(NCD4meta*);
+extern int NCD4_infermode(NCD4meta* meta);
+
+/* From d4swap.c */
+extern int NCD4_swapdata(NCD4meta*, NClist* topvars);
+
+/* From d4fix.c */
+extern int NCD4_delimit(NCD4meta*, NCD4node* var, void** offsetp);
+extern int NCD4_moveto(NCD4meta*, NCD4node* var, d4size_t count, void** offsetp);
+extern int NCD4_toposort(NCD4meta*);
+
+/* From d4data.c */
+extern int NCD4_processdata(NCD4meta*);
+extern int NCD4_fillinstance(NCD4meta*, NCD4node* type, void** offsetp, void** dstp, NClist* blobs);
+extern int NCD4_getToplevelVars(NCD4meta* meta, NCD4node* group, NClist* toplevel);
+
+/* From d4util.c */
+extern d4size_t NCD4_dimproduct(NCD4node* node);
+extern void NCD4_hostport(NCURI* uri, char* space, size_t len);
+extern void NCD4_userpwd(NCURI* uri, char* space, size_t len);
+extern size_t NCD4_typesize(nc_type tid);
+extern int NCD4_isLittleEndian(void);/* Return 1 if this machine is little endian */
+extern int NCD4_errorNC(int code, const int line, const char* file);
+extern int NCD4_error(int code, const int line, const char* file, const char* fmt, ...);
+extern char* NCD4_makeFQN(NCD4node* node);
+extern char* NCD4_makeName(NCD4node*,const char* sep);
+extern int NCD4_mktmp(const char* base, char** tmpnamep);
+extern int NCD4_parseFQN(const char* fqn0, NClist* pieces);
+extern int NCD4_readfile(const char* filename, NCbytes* content);
+extern char* NCD4_deescape(const char* esc);
+extern char* NCD4_entityescape(const char* s);
+
+/* From d4dump.c */
+extern void NCD4_dumpbytes(size_t size, const void* data0, int swap);
+extern void NCD4_tagdump(size_t size, const void* data0, int swap, const char* tag);
+extern void NCD4_dumpvars(NCD4node* group);
+extern union ATOMICS* NCD4_dumpatomic(NCD4node* var, void* data);
+
+/* From d4rc.c */
+extern int NCD4_rcload(void);
+extern int NCD4_rcprocess(NCD4INFO* info);
+extern void NCD4_rcfree(NClist* rc);
+extern char* NCD4_rclookup(char* key, char* hostport);
+extern int NCD4_parseproxy(NCD4INFO* info, const char* surl);
+extern int NCD4_rcdefault(NCD4INFO*);
+
+/* From d4cvt.c */
+extern int NCD4_convert(nc_type srctype, nc_type dsttype, char* memory0, char* value0, size_t count);
+
+/* From d4crc32.c */
+extern unsigned int NCD4_crc32(unsigned int crc, const void *buf, size_t size);
+
+
+/* Add an extra function whose sole purpose is to allow
+   configure(.ac) to test for the presence of this code.
+*/
+extern int nc__dap4(void);
+
+/**************************************************/
+/* Macro defined functions */
+
+#undef NCCHECK
+#undef FAIL
+#define NCCHECK(expr) if((ret=(expr))) {ret = NCD4_errorNC(ret,__LINE__,__FILE__); goto done;}else{}
+#define FAIL(code,fmt,...) do{ret=NCD4_error(code,__LINE__,__FILE__,fmt , ##__VA_ARGS__); goto done;}while(0)
+
+#undef INCR
+#undef DECR
+#undef DELTA
+#define INCR(offset,size) ((void*)(((char*)(offset))+(size)))
+#define DECR(offset,size) ((void*)(((char*)(offset))-(size)))
+#define DELTA(p1,p2) ((ptrdiff_t)(((char*)(p1))-((char*)(p2))))
+
+#undef GETCOUNTER
+#undef SKIPCOUNTER
+#define GETCOUNTER(p) ((d4size_t)*((COUNTERTYPE*)(p)))
+#define SKIPCOUNTER(p) {p=INCR(p,COUNTERSIZE);}
+
+#undef PUSH
+#define PUSH(list,value) do{if((list)==NULL) {(list)=nclistnew();} else{}; nclistpush((list),(value));}while(0)
+
+#define getnc3id(d4) (getdap(d4)->nc4id)
+
+#define ISTOPLEVEL(var) ((var)->container == NULL || (var)->container->sort == NCD4_GROUP)
+
+#define FILEIDPART(NCID) (((unsigned int) (NCID)) >> ID_SHIFT)
+#define GROUPIDPART(NCID) (((unsigned int) (NCID)) & GRP_ID_MASK)
+#define MAKENCID(grp,file) ((((unsigned int)(file)) << ID_SHIFT) | (grp))
+
+#define getdap(ncp) ((NCD4INFO*)((NC*)ncp)->dispatchdata)
+#define getnc4id(ncp) (getdap(ncp)->substrate.nc4id)
+
+/* Convert a dap4 grpid to a substrate id */
+#define makenc4id(ncp,dap4id) (((dap4id) & GRP_ID_MASK) | getdap(ncp)->substrate.nc4id)
+/* and the inverse */
+#define makedap4id(ncp,nc4id) (((nc4id) & GRP_ID_MASK) | (ncp)->ext_ncid)
+
+#ifdef CLEARMEM
+#define d4alloc(n) (calloc(1,(size_t)(n)))
+#else
+#define d4alloc(n) (malloc((size_t)(n)))
+#endif
+
+/* A number of hacks have been inserted
+   to deal with issues in accessing hyrax
+   using DAP4.
+*/
+#undef HYRAXHACK
+
+
+#endif /*NCD4_H*/
+
diff --git a/libdap4/ncd4dispatch.c b/libdap4/ncd4dispatch.c
new file mode 100644
index 0000000..df66fa5
--- /dev/null
+++ b/libdap4/ncd4dispatch.c
@@ -0,0 +1,972 @@
+/*********************************************************************
+ *   Copyright 1993, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#if defined(_WIN32) || defined(_WIN64)
+#include <crtdbg.h>
+#include <direct.h>
+#endif
+#include "ncd4dispatch.h"
+#include "d4includes.h"
+#include "d4curlfunctions.h"
+
+#ifdef HAVE_GETRLIMIT
+#  ifdef HAVE_SYS_RESOURCE_H
+#    include <sys/time.h>
+#  endif
+#  ifdef HAVE_SYS_RESOURCE_H
+#    include <sys/resource.h>
+#  endif
+#endif
+
+#if 0
+/* Define the set of protocols known to be constrainable */
+static char* constrainableprotocols[] = {"http", "https",NULL};
+#endif
+
+static int ncd4initialized = 0;
+
+static NC_Dispatch NCD4_dispatch_base;
+
+NC_Dispatch* NCD4_dispatch_table = NULL; /* moved here from ddispatch.c */
+
+/* Collect global state info in one place */
+NCD4globalstate* NCD4_globalstate = NULL;
+
+/* Forward */
+static int globalinit(void);
+
+/**************************************************/
+int
+NCD4_initialize(void)
+{
+    NCD4_dispatch_table = &NCD4_dispatch_base;
+    ncd4initialized = 1;
+    ncloginit();
+#ifdef D4DEBUG
+    /* force logging to go to stderr */
+    nclogclose();
+    if(nclogopen(NULL))
+        ncsetlogging(1); /* turn it on */
+#endif
+    /* Init global state */
+    globalinit();
+    /* Load rc file */
+    NCD4_rcload();    
+    return THROW(NC_NOERR);
+}
+
+int
+NCD4_finalize(void)
+{
+    if(NCD4_globalstate != NULL) {
+        nullfree(NCD4_globalstate->tempdir);
+        nullfree(NCD4_globalstate->home);
+	nclistfree(NCD4_globalstate->rc.rc);
+	nullfree(NCD4_globalstate->rc.rcfile);
+	free(NCD4_globalstate);
+	NCD4_globalstate = NULL;
+    }
+    return THROW(NC_NOERR);
+}
+
+static int
+NCD4_redef(int ncid)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4__enddef(int ncid, size_t h_minfree, size_t v_align, size_t v_minfree, size_t r_align)
+{
+    return (NC_NOERR); /* let it go */
+}
+
+static int
+NCD4_sync(int ncid)
+{
+    return (NC_NOERR); /* let it go */
+}
+
+static int
+NCD4_create(const char *path, int cmode,
+           size_t initialsz, int basepe, size_t *chunksizehintp,
+	   int use_parallel, void* mpidata,
+           NC_Dispatch* dispatch, NC* ncp)
+{
+   return THROW(NC_EPERM);
+}
+
+static int
+NCD4_put_vara(int ncid, int varid,
+	    const size_t *start, const size_t *edges,
+            const void *value,
+	    nc_type memtype)
+{
+    return THROW(NC_EPERM);
+}
+
+
+static int
+NCD4_put_vars(int ncid, int varid,
+	    const size_t *start, const size_t *edges, const ptrdiff_t* stride,
+            const void *value0, nc_type memtype)
+{
+    return THROW(NC_EPERM);
+}
+
+/*
+Force dap4 access to be read-only
+*/
+static int
+NCD4_set_fill(int ncid, int fillmode, int* old_modep)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_set_base_pe(int ncid, int pe)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_dim(int ncid, const char* name, size_t len, int* idp)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_put_att(int ncid, int varid, const char* name, nc_type datatype,
+	   size_t len, const void* value, nc_type t)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_var(int ncid, const char *name,
+  	     nc_type xtype, int ndims, const int *dimidsp, int *varidp)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_grp(int ncid, const char* p2, int* p3)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_rename_grp(int ncid, const char* p)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_compound(int ncid, size_t p2, const char* p3, nc_type* t)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_insert_compound(int ncid, nc_type t1, const char* p3, size_t p4, nc_type t2)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_insert_array_compound(int ncid, nc_type t1, const char* p3, size_t p4,
+			  nc_type t2, int p6, const int* p7)
+{
+    return (NC_EPERM);
+}
+
+
+static int
+NCD4_def_vlen(int ncid, const char* p2, nc_type base_typeid, nc_type* t)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_put_vlen_element(int ncid, int p2, void* p3, size_t p4, const void* p5)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_enum(int ncid, nc_type t1, const char* p3, nc_type* t)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_insert_enum(int ncid, nc_type t1, const char* p3, const void* p4)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_opaque(int ncid, size_t p2, const char* p3, nc_type* t)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_var_deflate(int ncid, int p2, int p3, int p4, int p5)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_var_fletcher32(int ncid, int p2, int p3)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_var_chunking(int ncid, int p2, int p3, const size_t* p4)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_var_fill(int ncid, int p2, int p3, const void* p4)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_def_var_endian(int ncid, int p2, int p3)
+{
+    return (NC_EPERM);
+}
+
+static int
+NCD4_set_var_chunk_cache(int ncid, int p2, size_t p3, size_t p4, float p5)
+{
+    return (NC_EPERM);
+}
+
+/**************************************************/
+/*
+Following functions basically return the netcdf-4 value WRT to the nc4id.
+However, it is necessary to modify the grpid(ncid) to point to the substrate.
+*/
+
+static int
+NCD4_inq_base_pe(int ncid, int* pe)
+{
+    NC* ncp;
+    int ret = NC_NOERR;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_base_pe(substrateid, pe);
+    return (ret);
+}
+
+static int
+NCD4_inq_format(int ncid, int* formatp)
+{
+    NC* ncp;
+    int ret = NC_NOERR;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_format(substrateid, formatp);
+    return (ret);
+}
+
+static int
+NCD4_inq(int ncid, int* ndimsp, int* nvarsp, int* nattsp, int* unlimdimidp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq(substrateid, ndimsp, nvarsp, nattsp, unlimdimidp);
+    return (ret);
+}
+
+static int
+NCD4_inq_type(int ncid, nc_type p2, char* p3, size_t* p4)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_type(substrateid, p2, p3, p4);
+    return (ret);
+}
+
+static int
+NCD4_inq_dimid(int ncid, const char* name, int* idp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_dimid(substrateid, name, idp);
+    return (ret);
+}
+
+static int
+NCD4_inq_unlimdim(int ncid, int* unlimdimidp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_unlimdim(substrateid, unlimdimidp);
+    return (ret);
+}
+
+static int
+NCD4_rename_dim(int ncid, int dimid, const char* name)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_rename_dim(substrateid, dimid, name);
+    return (ret);
+}
+
+static int
+NCD4_inq_att(int ncid, int varid, const char* name,
+	    nc_type* xtypep, size_t* lenp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_att(substrateid, varid, name, xtypep, lenp);
+    return (ret);
+}
+
+static int
+NCD4_inq_attid(int ncid, int varid, const char *name, int *idp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_attid(substrateid, varid, name, idp);
+    return (ret);
+}
+
+static int
+NCD4_inq_attname(int ncid, int varid, int attnum, char* name)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_attname(substrateid, varid, attnum, name);
+    return (ret);
+}
+
+static int
+NCD4_rename_att(int ncid, int varid, const char* name, const char* newname)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_rename_att(substrateid, varid, name, newname);
+    return (ret);
+}
+
+static int
+NCD4_del_att(int ncid, int varid, const char* p3)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_del_att(substrateid, varid, p3);
+    return (ret);
+}
+
+static int
+NCD4_get_att(int ncid, int varid, const char* name, void* value, nc_type t)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = NCDISPATCH_get_att(substrateid, varid, name, value, t);
+    return (ret);
+}
+
+static int
+NCD4_inq_var_all(int ncid, int varid, char *name, nc_type* xtypep,
+               int* ndimsp, int* dimidsp, int* nattsp,
+               int* shufflep, int* deflatep, int* deflate_levelp,
+               int* fletcher32p, int* contiguousp, size_t* chunksizesp,
+               int* no_fill, void* fill_valuep, int* endiannessp,
+	       int* options_maskp, int* pixels_per_blockp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = NCDISPATCH_inq_var_all(substrateid, varid, name, xtypep,
+               ndimsp, dimidsp, nattsp,
+               shufflep, deflatep, deflate_levelp,
+               fletcher32p, contiguousp, chunksizesp,
+               no_fill, fill_valuep, endiannessp,
+	       options_maskp, pixels_per_blockp);
+    return (ret);
+}
+
+static int
+NCD4_inq_varid(int ncid, const char *name, int *varidp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_varid(substrateid,name,varidp);
+    return (ret);
+}
+
+static int
+NCD4_rename_var(int ncid, int varid, const char* name)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_rename_var(substrateid, varid, name);
+    return (ret);
+}
+
+static int
+NCD4_var_par_access(int ncid, int p2, int p3)
+{
+    return (NC_ENOPAR);
+}
+
+
+#ifdef USE_NETCDF4
+
+static int
+NCD4_inq_ncid(int ncid, const char* name, int* grp_ncid)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_ncid(substrateid, name, grp_ncid);
+    return (ret);
+}
+
+static int
+NCD4_show_metadata(int ncid)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_show_metadata(substrateid);
+    return (ret);
+}
+
+static int
+NCD4_inq_grps(int ncid, int* ngrpsp, int* grpids)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    int ngrps;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    /* We always need to know |grpids| */
+    ret = nc_inq_grps(substrateid, &ngrps, grpids);
+    if(ret == NC_NOERR) {
+	if(ngrpsp != NULL)
+	    *ngrpsp = ngrps; /* return if caller want it */
+	if(grpids != NULL) {
+	    int i;
+	    /* We need to convert the substrate group ids to dap4 group ids */
+	    for(i=0;i<ngrps;i++)
+		grpids[i] = makedap4id(ncp,grpids[i]);
+	}
+    }
+    return (ret);
+}
+
+static int
+NCD4_inq_grpname(int ncid, char* p)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_grpname(substrateid, p);
+    return (ret);
+}
+
+
+static int
+NCD4_inq_unlimdims(int ncid, int* p2, int* p3)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_unlimdims(substrateid, p2, p3);
+    return (ret);
+}
+
+static int
+NCD4_inq_grpname_full(int ncid, size_t* p2, char* p3)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_grpname_full(substrateid, p2, p3);
+    return (ret);
+}
+
+static int
+NCD4_inq_grp_parent(int ncid, int* p)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_grp_parent(substrateid, p);
+    if(p != NULL)
+	*p = makedap4id(ncp,*p);
+    return (ret);
+}
+
+static int
+NCD4_inq_grp_full_ncid(int ncid, const char* fullname, int* grpidp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_grp_full_ncid(substrateid, fullname, grpidp);
+    if(grpidp != NULL)
+	*grpidp = makedap4id(ncp,*grpidp);
+    return (ret);
+}
+
+static int
+NCD4_inq_varids(int ncid, int* nvars, int* p)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_varids(substrateid, nvars, p);
+    return (ret);
+}
+
+static int
+NCD4_inq_dimids(int ncid, int* ndims, int* p3, int p4)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_dimids(substrateid, ndims, p3, p4);
+    return (ret);
+}
+
+static int
+NCD4_inq_typeids(int ncid, int*  ntypes, int* p)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_typeids(substrateid, ntypes, p);
+    return (ret);
+}
+
+static int
+NCD4_inq_type_equal(int ncid, nc_type t1, int p3, nc_type t2, int* p5)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_type_equal(substrateid, t1, p3, t2, p5);
+    return (ret);
+}
+
+static int
+NCD4_inq_user_type(int ncid, nc_type t, char* p3, size_t* p4, nc_type* p5,
+                   size_t* p6, int* p7)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_user_type(substrateid, t, p3, p4, p5, p6, p7);
+    return (ret);
+}
+
+static int
+NCD4_inq_typeid(int ncid, const char* name, nc_type* t)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_typeid(substrateid, name, t);
+    return (ret);
+}
+
+static int
+NCD4_inq_compound_field(int ncid, nc_type xtype, int fieldid, char *name,
+		      size_t *offsetp, nc_type* field_typeidp, int *ndimsp,
+		      int *dim_sizesp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_compound_field(substrateid, xtype, fieldid, name, offsetp, field_typeidp, ndimsp, dim_sizesp);
+    return (ret);
+}
+
+static int
+NCD4_inq_compound_fieldindex(int ncid, nc_type xtype, const char *name,
+			   int *fieldidp)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_compound_fieldindex(substrateid, xtype, name, fieldidp);
+    return (ret);
+}
+
+static int
+NCD4_get_vlen_element(int ncid, int p2, const void* p3, size_t* p4, void* p5)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_get_vlen_element(substrateid, p2, p3, p4, p5);
+    return (ret);
+}
+
+static int
+NCD4_inq_enum_member(int ncid, nc_type t1, int p3, char* p4, void* p5)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_enum_member(substrateid, t1, p3, p4, p5);
+    return (ret);
+}
+
+static int
+NCD4_inq_enum_ident(int ncid, nc_type t1, long long p3, char* p4)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_inq_enum_ident(substrateid, t1, p3, p4);
+    return (ret);
+}
+
+static int
+NCD4_get_var_chunk_cache(int ncid, int p2, size_t* p3, size_t* p4, float* p5)
+{
+    NC* ncp;
+    int ret;
+    int substrateid;
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR) return (ret);
+    substrateid = makenc4id(ncp,ncid);
+    ret = nc_get_var_chunk_cache(substrateid, p2, p3, p4, p5);
+    return (ret);
+}
+
+#endif // USE_NETCDF4
+
+/**************************************************/
+/*
+Following functions are overridden to handle 
+dap4 implementation specific issues.
+*/
+
+/* Force specific format */
+static int
+NCD4_inq_format_extended(int ncid, int* formatp, int* modep)
+{
+    NC* nc;
+    int ncstatus = NC_check_id(ncid, (NC**)&nc);
+    if(ncstatus != NC_NOERR) return (ncstatus);
+    if(modep) *modep = nc->mode;
+    if(formatp) *formatp = NC_FORMATX_DAP4;
+    return THROW(NC_NOERR);
+}
+
+/*
+Override nc_inq_dim to handle the fact
+that unlimited dimensions will not have
+a proper size because the substrate has
+never (not yet) been written.
+*/
+int
+NCD4_inq_dim(int ncid, int dimid, char* name, size_t* lenp)
+{
+    int ret = NC_NOERR;
+    NC* ncp;
+    NCD4INFO* info;
+    NCD4meta* meta;
+    int i;
+    NCD4node* dim = NULL;
+
+    if((ret = NC_check_id(ncid, (NC**)&ncp)) != NC_NOERR)
+	goto done;
+    info = (NCD4INFO*)ncp->dispatchdata;
+    meta = info->substrate.metadata;
+
+    /* Locate the dimension specified by dimid */
+    for(i=0;i<nclistlength(meta->allnodes);i++) {
+	NCD4node* n = (NCD4node*)nclistget(meta->allnodes,i);
+	if(n->sort == NCD4_DIM && n->meta.id == dimid) {
+	    dim = n;
+	    break;
+	}
+    }
+    if(dim == NULL)
+	{ret = NC_EBADDIM; goto done;}
+    if(name)
+	strncpy(name,dim->name,NC_MAX_NAME);
+    if(lenp)
+	*lenp = (size_t)dim->dim.size;
+done:
+    return (ret);
+}
+
+/**************************************************/
+
+static int
+globalinit(void)
+{
+    int stat = NC_NOERR;
+    if(NCD4_globalstate != NULL) return stat;
+    NCD4_globalstate = (NCD4globalstate*)calloc(1,sizeof(NCD4globalstate));
+    if(NCD4_globalstate == NULL) {
+	nclog(NCLOGERR, "Out of memory");
+	return stat;
+    }
+
+    /* Capture temp dir*/
+    {
+	char* tempdir;
+	char* p;
+	char* q;
+	char cwd[NC_MAX_PATH];
+#if defined(_WIN32) || defined(_WIN64)
+        tempdir = getenv("TEMP");
+#else
+	tempdir = "/tmp";
+#endif
+        if(tempdir == NULL) {
+	    fprintf(stderr,"Cannot find a temp dir; using ./\n");
+#if defined(_WIN32) || defined(_WIN64)
+	    tempdir = getcwd(cwd,sizeof(cwd));
+#else
+	    tempdir = getcwd(cwd,sizeof(cwd));
+#endif
+	    if(tempdir == NULL || *tempdir == '\0') tempdir = ".";
+	}
+        NCD4_globalstate->tempdir= (char*)malloc(strlen(tempdir) + 1);
+	for(p=tempdir,q=NCD4_globalstate->tempdir;*p;p++,q++) {
+	    if((*p == '/' && *(p+1) == '/')
+	       || (*p == '\\' && *(p+1) == '\\')) {p++;}
+	    *q = *p;
+	}
+	*q = '\0';
+#if defined(_WIN32) || defined(_WIN64)
+#else
+        /* Canonicalize */
+	for(p=NCD4_globalstate->tempdir;*p;p++) {
+	    if(*p == '\\') {*p = '/'; };
+	}
+	*q = '\0';
+#endif
+    }
+
+    /* Capture $HOME */
+    {
+	char* p;
+	char* q;
+        char* home = getenv("HOME");
+
+        if(home == NULL) {
+	    /* use tempdir */
+	    home = NCD4_globalstate->tempdir;
+	}
+        NCD4_globalstate->home = (char*)malloc(strlen(home) + 1);
+	for(p=home,q=NCD4_globalstate->home;*p;p++,q++) {
+	    if((*p == '/' && *(p+1) == '/')
+	       || (*p == '\\' && *(p+1) == '\\')) {p++;}
+	    *q = *p;
+	}
+	*q = '\0';
+#if defined(_WIN32) || defined(_WIN64)
+#else
+        /* Canonicalize */
+	for(p=home;*p;p++) {
+	    if(*p == '\\') {*p = '/'; };
+	}
+#endif
+    }
+
+    {
+	CURLcode cstat = curl_global_init(CURL_GLOBAL_DEFAULT);
+	if(cstat != CURLE_OK)
+	    fprintf(stderr,"curl_global_init failed!\n");
+    }
+    NCD4_curl_protocols(NCD4_globalstate); /* see what protocols are supported */
+    return stat;
+}
+
+/**************************************************/
+
+static NC_Dispatch NCD4_dispatch_base = {
+
+NC_FORMATX_DAP4,
+
+NCD4_create,
+NCD4_open,
+
+NCD4_redef,
+NCD4__enddef,
+NCD4_sync,
+NCD4_abort,
+NCD4_close,
+NCD4_set_fill,
+NCD4_inq_base_pe,
+NCD4_set_base_pe,
+NCD4_inq_format,
+NCD4_inq_format_extended, /*inq_format_extended*/
+
+NCD4_inq,
+NCD4_inq_type,
+
+NCD4_def_dim,
+NCD4_inq_dimid,
+NCD4_inq_dim,
+NCD4_inq_unlimdim,
+NCD4_rename_dim,
+
+NCD4_inq_att,
+NCD4_inq_attid,
+NCD4_inq_attname,
+NCD4_rename_att,
+NCD4_del_att,
+NCD4_get_att,
+NCD4_put_att,
+
+NCD4_def_var,
+NCD4_inq_varid,
+NCD4_rename_var,
+NCD4_get_vara,
+NCD4_put_vara,
+NCD4_get_vars,
+NCD4_put_vars,
+NCDEFAULT_get_varm,
+NCDEFAULT_put_varm,
+
+NCD4_inq_var_all,
+
+NCD4_var_par_access,
+
+#ifdef USE_NETCDF4
+NCD4_show_metadata,
+NCD4_inq_unlimdims,
+NCD4_inq_ncid,
+NCD4_inq_grps,
+NCD4_inq_grpname,
+NCD4_inq_grpname_full,
+NCD4_inq_grp_parent,
+NCD4_inq_grp_full_ncid,
+NCD4_inq_varids,
+NCD4_inq_dimids,
+NCD4_inq_typeids,
+NCD4_inq_type_equal,
+NCD4_def_grp,
+NCD4_rename_grp,
+NCD4_inq_user_type,
+NCD4_inq_typeid,
+
+NCD4_def_compound,
+NCD4_insert_compound,
+NCD4_insert_array_compound,
+NCD4_inq_compound_field,
+NCD4_inq_compound_fieldindex,
+NCD4_def_vlen,
+NCD4_put_vlen_element,
+NCD4_get_vlen_element,
+NCD4_def_enum,
+NCD4_insert_enum,
+NCD4_inq_enum_member,
+NCD4_inq_enum_ident,
+NCD4_def_opaque,
+NCD4_def_var_deflate,
+NCD4_def_var_fletcher32,
+NCD4_def_var_chunking,
+NCD4_def_var_fill,
+NCD4_def_var_endian,
+NCD4_set_var_chunk_cache,
+NCD4_get_var_chunk_cache,
+
+#endif /*USE_NETCDF4*/
+
+};
+
+
diff --git a/libdap4/ncd4dispatch.h b/libdap4/ncd4dispatch.h
new file mode 100644
index 0000000..d14071c
--- /dev/null
+++ b/libdap4/ncd4dispatch.h
@@ -0,0 +1,50 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#ifndef _NCD4DISPATCH_H
+#define _NCD4DISPATCH_H
+
+#include <stddef.h> /* size_t, ptrdiff_t */
+#include "netcdf.h"
+#include "ncdispatch.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern int
+NCD4_open(const char *path, int mode,
+         int basepe, size_t *chunksizehintp,
+         int use_parallel, void* mpidata,
+         struct NC_Dispatch* dispatch, NC* ncp);
+
+extern int
+NCD4_close(int ncid);
+
+extern int
+NCD4_abort(int ncid);
+
+extern int
+NCD4_inq_dim(int ncid, int dimid, char* name, size_t* lenp);
+
+extern int
+NCD4_get_vara(int ncid, int varid,
+	    const size_t *start, const size_t *edges,
+            void *value,
+	    nc_type memtype);
+
+extern int
+NCD4_get_vars(int ncid, int varid,
+	    const size_t *start, const size_t *edges, const ptrdiff_t* strides,
+            void *value,
+	    nc_type memtype);
+
+extern int NCD4_initialize(void);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /*_NCD4DISPATCH_H*/
diff --git a/libdap4/ncd4types.h b/libdap4/ncd4types.h
new file mode 100644
index 0000000..531f4e3
--- /dev/null
+++ b/libdap4/ncd4types.h
@@ -0,0 +1,360 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/*
+Type declarations and associated constants
+are defined here.	
+*/
+
+#ifndef D4TYPES_H
+#define D4TYPES_H 1
+
+#undef COMPILEBYDEFAULT
+
+#define long64 long long
+#define ncerror int
+
+/* Misc. code controls */
+#define FILLCONSTRAINT TRUE
+
+#define DEFAULTSTRINGLENGTH 64
+
+/* Size of the checksum */
+#define CHECKSUMSIZE 4
+
+/**************************************************/
+/* sigh, do the forwards */
+
+typedef struct NCD4INFO NCD4INFO;
+typedef enum NCD4CSUM NCD4CSUM;
+typedef enum NCD4mode NCD4mode;
+typedef enum NCD4translation NCD4translation;
+typedef struct NCD4curl NCD4curl;
+typedef struct NCD4meta NCD4meta;
+typedef struct NCD4globalstate NCD4globalstate;
+typedef struct NCD4node NCD4node;
+typedef struct NCD4params NCD4params;
+
+/**************************************************/
+/* DMR Tree node sorts */
+
+/* Concepts from netcdf-4 data model */
+/* Define as powers of 2 so we can create a set */
+typedef enum NCD4sort {
+    NCD4_NULL=0,
+    NCD4_ATTR=1,
+    NCD4_ATTRSET=2,
+    NCD4_XML=4, /* OtherXML */
+    NCD4_DIM=8,
+    NCD4_GROUP=16, /* Including Dataset */
+    NCD4_TYPE=32, /* atom types, opaque, enum, struct or seq */
+    NCD4_VAR=64, /* Variable or field */
+    NCD4_ECONST=128,
+} NCD4sort;
+
+#define ISA(sort,flags) ((sort) & (flags))
+
+#define ISATTR(sort) ISA((sort),(NCD4_ATTR))
+#define ISDIM(sort) ISA((sort),(NCD4_DIM))
+#define ISGROUP(sort) ISA((sort),(NCD4_GROUP))
+#define ISTYPE(sort) ISA((sort),(NCD4_TYPE))
+#define ISVAR(sort) ISA((sort),(NCD4_VAR))
+#define ISECONST(sort) ISA((sort),(NCD4_ECONST))
+
+/* Define some nc_type aliases */
+#define NC_NULL NC_NAT
+#define NC_SEQ NC_VLEN
+#define NC_STRUCT NC_COMPOUND
+
+#define ISCMPD(subsort) ((subsort) == NC_SEQ || (subsort) == NC_STRUCT)
+
+/**************************************************/
+/* Special attributes; When defining netcdf-4,
+   these are suppressed, except for UCARTAGMAPS
+*/
+
+#define RESERVECHAR '_'
+
+#define UCARTAG         "_edu.ucar."
+#define UCARTAGVLEN     "_edu.ucar.isvlen"
+#define UCARTAGOPAQUE   "_edu.ucar.opaque.size"
+#define UCARTAGORIGTYPE "_edu.ucar.orig.type"
+#define UCARTAGUNLIM    "_edu.ucar.isunlimited"
+
+/* These are attributes inserted into the netcdf-4 file */
+#define NC4TAGMAPS      "_edu.ucar.maps"
+
+/**************************************************/
+/* Misc.*/
+
+/* Define possible translation modes */
+enum NCD4translation {
+NCD4_NOTRANS = 0, /* Apply straight DAP4->NetCDF4 translation */
+NCD4_TRANSNC4 = 1, /* Use _edu.ucar flags to achieve better translation */
+};
+
+/* Define possible debug flags */
+#define NCF_DEBUG_NONE  0
+#define NCF_DEBUG_COPY  1 /* Dump data into the substrate and close it rather than abortiing it */
+
+/* Define possible retrieval modes */
+enum NCD4mode {
+NCD4_DMR = 1,
+NCD4_DAP = 2,
+NCD4_DSR = 4
+};
+
+
+/* Define storage for all the primitive types (plus vlen) */
+union ATOMICS {
+    char i8[8];
+    unsigned char u8[8];
+    short i16[4];
+    unsigned short u16[4];
+    int i32[2];
+    unsigned int u32[2];
+    long long i64[1];
+    unsigned long long u64[1];
+    float f32[2];
+    double f64[1];
+#if SIZEOF_VOIDP == 4
+    char* s[2];
+#elif SIZEOF_VOIDP == 8
+    char* s[1];
+#endif
+#if (SIZEOF_VOIDP + SIZEOF_SIZE_T) == 8
+    nc_vlen_t vl[1];
+#endif
+};
+
+/**************************************************/
+/* !Node type for the NetCDF-4 metadata produced from
+   parsing the DMR tree.
+   We only use a single node type tagged with the sort.
+   Some information is not kept (e.g. attributes).
+*/
+struct NCD4node {
+    NCD4sort sort; /* gross discriminator */
+    nc_type subsort; /* subcases of sort */
+    char* name; /* Raw unescaped */
+    NCD4node*  container; /* parent object: e.g. group, enum, compound...*/
+    int visited; /* for recursive walks of all nodes */
+    /* Sort specific fields */
+    NClist* groups;   /* NClist<NCD4node*> groups in group */
+    NClist* vars;   /* NClist<NCD4node*> vars in group, fields in struct/seq */
+    NClist* types;   /* NClist<NCD4node*> types in group */
+    NClist* dims;    /* NClist<NCD4node*>; dimdefs in group, dimrefs in vars */
+    NClist* attributes; /* NClist<NCD4node*> */
+    NClist* maps;       /* NClist<NCD4node*> */
+    NClist* xmlattributes; /* NClist<String> */
+    NCD4node* basetype;
+    struct { /* sort == NCD4_ATTRIBUTE */
+        NClist* values;
+    } attr;
+    struct { /* sort == NCD4_OPAQUE */
+	long long size; /* 0 => var length */
+    } opaque;
+    struct { /* sort == NCD4_DIMENSION */
+	long long size;
+	int isunlimited;
+	int isanonymous;
+    } dim;
+    struct { /* sort == NCD4_ECONST || sort == NCD4_ENUM */    
+        union ATOMICS ecvalue;
+        NClist* econsts; /* NClist<NCD4node*> */
+    } en;
+    struct { /* sort == NCD4_GROUP */
+	NClist* elements;   /* NClist<NCD4node*> everything at the top level in a group */
+        int isdataset;
+        char* dapversion;
+        char* dmrversion;
+        char* datasetname;
+        NClist* varbyid; /* NClist<NCD4node*> indexed by varid */
+    } group;
+    struct { /* Meta Info */
+        int id; /* Relevant netcdf id; interpretation depends on sort; */
+	int isfixedsize; /* sort == NCD4_TYPE; Is this a fixed size (recursively) type? */
+	d4size_t dapsize; /* size of the type as stored in the dap data; will, as a rule,
+                             be same as memsize only for types <= NC_UINT64 */
+        nc_type cmpdid; /*netcdf id for the compound type created for seq type */
+	size_t memsize; /* size of a memory instance without taking dimproduct into account,
+                           but taking compound alignment into account  */
+        d4size_t offset; /* computed structure field offset in memory */
+        size_t alignment; /* computed structure field alignment in memory */
+    } meta;
+    struct { /* Data compilation info */
+        int flags; /* See d4data for actual flags */
+	D4blob dap4data; /* offset and start pos for this var's data in serialization */
+        unsigned int remotechecksum; /* toplevel variable checksum as sent by server*/    
+        unsigned int localchecksum; /* toplevel variable checksum as computed by client */    
+    } data;
+    struct { /* Track netcdf-4 conversion info */
+	int isvlen;	/*  _edu.ucar.isvlen */
+	/* Split UCARTAGORIGTYPE into group plus name */
+	struct {
+  	    NCD4node* group;
+	    char* name;
+	} orig;
+	/* Represented elsewhare: _edu.ucar.opaque.size */ 
+    } nc4;
+};
+
+/* Tracking info about the serialized input before and after de-chunking */
+typedef struct NCD4serial {
+    size_t rawsize; /* |rawdata| */ 
+    void* rawdata;
+    size_t dapsize; /* |dapdata|; this is transient */
+    void* dap; /* pointer into rawdata where dap data starts */ 
+    char* dmr;/* copy of dmr */ 
+    char* errdata; /* null || error chunk (null terminated) */
+    int hostlittleendian; /* 1 if the host is little endian */
+    int remotelittleendian; /* 1 if the packet says data is little endian */
+    int remotechecksumming; /* 1 if the packet says checksums are included */
+} NCD4serial;
+
+/* This will be passed out of the parse */
+struct NCD4meta {
+    NCD4INFO* controller;
+    int ncid; /* root ncid of the substrate netcdf-4 file; copy of NCD4parse argument*/
+    NCD4node* root;
+    NCD4mode  mode; /* Are we reading DMR (only) or DAP (includes DMR) */
+    NClist* allnodes; /*list<NCD4node>*/
+    struct Error { /* Content of any error response */
+	char* parseerror;
+	int   httpcode;
+	char* message;
+	char* context;
+	char* otherinfo;
+    } error;
+    int debuglevel;
+    NCD4serial serial;
+    int ignorechecksums; /* 1=> compute but ignore */
+    int localchecksumming; /* 1=>compute local checksum */
+    int swap; /* 1 => swap data */
+    /* Define some "global" (to a DMR) data */
+    NClist* groupbyid; /* NClist<NCD4node*> indexed by groupid >> 16; this is global */
+    NCD4node* _bytestring; /* If needed */
+};
+
+typedef struct NCD4parser {
+    char* input;
+    int debuglevel;
+    NCD4meta* metadata;
+    /* Capture useful subsets of dataset->allnodes */
+    NClist* types; /*list<NCD4node>*/
+    NClist* dims; /*list<NCD4node>*/
+    NClist* vars; /*list<NCD4node>*/
+    NClist* groups; /*list<NCD4node>*/
+    /* Convenience for short cut fqn detection */
+    NClist* atomictypes; /*list<NCD4node>*/
+    NCD4node* dapopaque; /* Single non-fixed-size opaque type */
+} NCD4parser;
+
+/**************************************************/
+
+typedef struct NCD4triple {
+        char* host; /* includes port if specified */
+        char* key;
+        char* value;
+} NCD4triple;
+
+
+/**************************************************/
+
+/* Collect global state info in one place */
+struct NCD4globalstate {
+    struct {
+        int proto_file;
+        int proto_https;
+    } curl;
+    char* tempdir; /* track a usable temp dir */
+    char* home; /* track $HOME for use in creating $HOME/.oc dir */
+    struct {
+	int ignore; /* if 1, then do not use any rc file */
+	int loaded;
+        NClist* rc; /*NClist<NCD4triple>; the rc file triple store fields*/
+        char* rcfile; /* specified rcfile; overrides anything else */
+    } rc;
+};
+
+/* Curl info */
+struct NCD4curl {
+    CURL* curl; /* curl handle*/
+    NCbytes* packet; 
+    struct errdata {/* Hold info for an error return from server */
+	char* code;
+	char* message;
+	long  httpcode;
+	char  errorbuf[CURL_ERROR_SIZE]; /* CURLOPT_ERRORBUFFER*/
+    } errdata;
+    struct curlflags {
+        int proto_file; /* Is file: supported? */
+        int proto_https; /* is https: supported? */
+	int compress; /*CURLOPT_ENCODING*/
+	int verbose; /*CURLOPT_ENCODING*/
+	int timeout; /*CURLOPT_TIMEOUT*/
+	int maxredirs; /*CURLOPT_MAXREDIRS*/
+	char* useragent; /*CURLOPT_USERAGENT*/
+	/* track which of these are created by oc */
+#define COOKIECREATED 1
+#define NETRCCREATED 2
+	int createdflags;
+	char* cookiejar; /*CURLOPT_COOKIEJAR,CURLOPT_COOKIEFILE*/
+	char* netrc; /*CURLOPT_NETRC,CURLOPT_NETRC_FILE*/
+    } curlflags;
+    struct ssl {
+	int   verifypeer; /* CURLOPT_SSL_VERIFYPEER;
+                             do not do this when cert might be self-signed
+                             or temporarily incorrect */
+	int   verifyhost; /* CURLOPT_SSL_VERIFYHOST; for client-side verification */
+        char* certificate; /*CURLOPT_SSLCERT*/
+	char* key; /*CURLOPT_SSLKEY*/
+	char* keypasswd; /*CURLOPT_SSLKEYPASSWD*/
+        char* cainfo; /* CURLOPT_CAINFO; certificate authority */
+	char* capath;  /*CURLOPT_CAPATH*/
+    } ssl;
+    struct proxy {
+	char *host; /*CURLOPT_PROXY*/
+	int port; /*CURLOPT_PROXYPORT*/
+	char* userpwd; /*CURLOPT_PROXYUSERPWD*/
+    } proxy;
+    struct credentials {
+	char *userpwd; /*CURLOPT_USERPWD*/
+    } creds;
+};
+
+/**************************************************/
+/* Define a structure holding common info */
+
+struct NCD4INFO {
+    NC*   controller; /* Parent instance of NCD4INFO */
+    int debug;
+    char* rawurltext; /* as given to ncd4_open */
+    char* urltext;    /* as modified by ncd4_open */
+    NCURI* uri;      /* parse of rawuritext */
+    NCD4curl* curl;
+    int inmemory; /* store fetched data in memory? */
+    struct {
+	char*   memory;   /* allocated memory if ONDISK is not set */
+        char*   ondiskfilename; /* If ONDISK is set */
+        FILE*   ondiskfile;     /* ditto */
+        d4size_t   datasize; /* size on disk or in memory */
+        long dmrlastmodified;
+        long daplastmodified;
+    } data;
+    struct {
+	char* filename; /* of the substrate file */
+        int nc4id; /* substrate nc4 file ncid used to hold metadata; not same as external id  */
+	NCD4meta* metadata;
+    } substrate;
+    struct {
+        NCCONTROLS  flags;
+        NCCONTROLS  debugflags;
+	NCD4translation translation;
+	char substratename[NC_MAX_NAME];
+    } controls;
+};
+
+#endif /*D4TYPES_H*/
diff --git a/libdispatch/CMakeLists.txt b/libdispatch/CMakeLists.txt
index 05d96a3..4a2536e 100644
--- a/libdispatch/CMakeLists.txt
+++ b/libdispatch/CMakeLists.txt
@@ -1,4 +1,4 @@
-SET(libdispatch_SOURCES dparallel.c dcopy.c dfile.c ddim.c datt.c dattinq.c dattput.c dattget.c derror.c dvar.c dvarget.c dvarput.c dvarinq.c ddispatch.c nclog.c dstring.c dutf8proc.c ncuri.c nclist.c ncbytes.c nchashmap.c nctime.c dinternal.c nc.c nclistmgr.c)
+SET(libdispatch_SOURCES dparallel.c dcopy.c dfile.c ddim.c datt.c dattinq.c dattput.c dattget.c derror.c dvar.c dvarget.c dvarput.c dvarinq.c ddispatch.c nclog.c dstring.c dutf8.c dinternal.c doffsets.c ncuri.c nclist.c ncbytes.c nchashmap.c nctime.c nc.c nclistmgr.c utf8proc.h utf8proc.c dwinpath.c)
 
 IF(USE_NETCDF4)
   SET(libdispatch_SOURCES ${libdispatch_SOURCES} dgroup.c dvlen.c dcompound.c dtype.c denum.c dopaque.c ncaux.c)
@@ -6,9 +6,9 @@ ENDIF(USE_NETCDF4)
 
 IF(BUILD_V2)
   SET(libdispatch_SOURCES ${libdispatch_SOURCES} dv2i.c)
-ENDIF(BUILD_V2)	
+ENDIF(BUILD_V2)
 
-add_library(dispatch OBJECT ${libdispatch_SOURCES}) 
+add_library(dispatch OBJECT ${libdispatch_SOURCES})
 
 FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
 SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am)
diff --git a/libdispatch/Make0 b/libdispatch/Make0
old mode 100755
new mode 100644
diff --git a/libdispatch/Makefile.am b/libdispatch/Makefile.am
old mode 100755
new mode 100644
index aab3d9e..42d868c
--- a/libdispatch/Makefile.am
+++ b/libdispatch/Makefile.am
@@ -17,10 +17,13 @@ libdispatch_la_CPPFLAGS = ${AM_CPPFLAGS}
 # The source files.
 libdispatch_la_SOURCES = dparallel.c dcopy.c dfile.c ddim.c datt.c	\
 dattinq.c dattput.c dattget.c derror.c dvar.c dvarget.c dvarput.c	\
-dvarinq.c dinternal.c ddispatch.c                                                   \
-nclog.c dstring.c dutf8proc.c utf8proc_data.h                          \
+dvarinq.c dinternal.c ddispatch.c dutf8.c                               \
+nclog.c dstring.c                           \
 ncuri.c nclist.c ncbytes.c nchashmap.c nctime.c                        \
-nc.c nclistmgr.c
+nc.c nclistmgr.c drc.c doffsets.c dwinpath.c
+
+# Add the utf8 codebase
+libdispatch_la_SOURCES += utf8proc.c utf8proc.h
 
 # Add functions only found in netCDF-4.
 if USE_NETCDF4
@@ -40,7 +43,7 @@ libnetcdf2_la_SOURCES = dv2i.c
 libnetcdf2_la_CPPFLAGS = ${AM_CPPFLAGS} -DDLL_EXPORT
 endif # BUILD_V2
 
-EXTRA_DIST=CMakeLists.txt ncsettings.hdr
+EXTRA_DIST=CMakeLists.txt ncsettings.hdr utf8proc_data.c
 
 # Build ncsettings.c as follows:
 # 1. copy ncsettings.hdr to ncsettings.c
@@ -61,3 +64,10 @@ ncsettings.c: $(top_srcdir)/libnetcdf.settings ncsettings.hdr
 	sed -e 's/\(.*\)/\"\1\\n\"/' | \
 	cat >> ncsettings.c
 	echo ';' >> ncsettings.c
+
+# Unit tests
+test_ncuri_SOURCES = test_ncuri.c ncuri.c ncbytes.c nclist.c
+test_pathcvt_SOURCES = test_pathcvt.c dwinpath.c
+check_PROGRAMS = test_ncuri test_pathcvt
+TESTS = test_ncuri test_pathcvt
+
diff --git a/libdispatch/Makefile.in b/libdispatch/Makefile.in
index 223c413..b116b6e 100644
--- a/libdispatch/Makefile.in
+++ b/libdispatch/Makefile.in
@@ -120,6 +120,8 @@ target_triplet = @target@
 
 # Add V2 API convenience library if needed.
 @BUILD_V2_TRUE at am__append_5 = libnetcdf2.la 
+check_PROGRAMS = test_ncuri$(EXEEXT) test_pathcvt$(EXEEXT)
+TESTS = test_ncuri$(EXEEXT) test_pathcvt$(EXEEXT)
 subdir = libdispatch
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -137,10 +139,10 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
 libdispatch_la_LIBADD =
 am__libdispatch_la_SOURCES_DIST = dparallel.c dcopy.c dfile.c ddim.c \
 	datt.c dattinq.c dattput.c dattget.c derror.c dvar.c dvarget.c \
-	dvarput.c dvarinq.c dinternal.c ddispatch.c nclog.c dstring.c \
-	dutf8proc.c utf8proc_data.h ncuri.c nclist.c ncbytes.c \
-	nchashmap.c nctime.c nc.c nclistmgr.c dgroup.c dvlen.c \
-	dcompound.c dtype.c denum.c dopaque.c ncaux.c
+	dvarput.c dvarinq.c dinternal.c ddispatch.c dutf8.c nclog.c \
+	dstring.c ncuri.c nclist.c ncbytes.c nchashmap.c nctime.c nc.c \
+	nclistmgr.c drc.c doffsets.c dwinpath.c utf8proc.c utf8proc.h \
+	dgroup.c dvlen.c dcompound.c dtype.c denum.c dopaque.c ncaux.c
 @USE_NETCDF4_TRUE at am__objects_1 = libdispatch_la-dgroup.lo \
 @USE_NETCDF4_TRUE@	libdispatch_la-dvlen.lo \
 @USE_NETCDF4_TRUE@	libdispatch_la-dcompound.lo \
@@ -156,11 +158,13 @@ am_libdispatch_la_OBJECTS = libdispatch_la-dparallel.lo \
 	libdispatch_la-dvar.lo libdispatch_la-dvarget.lo \
 	libdispatch_la-dvarput.lo libdispatch_la-dvarinq.lo \
 	libdispatch_la-dinternal.lo libdispatch_la-ddispatch.lo \
-	libdispatch_la-nclog.lo libdispatch_la-dstring.lo \
-	libdispatch_la-dutf8proc.lo libdispatch_la-ncuri.lo \
+	libdispatch_la-dutf8.lo libdispatch_la-nclog.lo \
+	libdispatch_la-dstring.lo libdispatch_la-ncuri.lo \
 	libdispatch_la-nclist.lo libdispatch_la-ncbytes.lo \
 	libdispatch_la-nchashmap.lo libdispatch_la-nctime.lo \
 	libdispatch_la-nc.lo libdispatch_la-nclistmgr.lo \
+	libdispatch_la-drc.lo libdispatch_la-doffsets.lo \
+	libdispatch_la-dwinpath.lo libdispatch_la-utf8proc.lo \
 	$(am__objects_1)
 libdispatch_la_OBJECTS = $(am_libdispatch_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
@@ -172,6 +176,13 @@ am__libnetcdf2_la_SOURCES_DIST = dv2i.c
 @BUILD_V2_TRUE at am_libnetcdf2_la_OBJECTS = libnetcdf2_la-dv2i.lo
 libnetcdf2_la_OBJECTS = $(am_libnetcdf2_la_OBJECTS)
 @BUILD_V2_TRUE at am_libnetcdf2_la_rpath =
+am_test_ncuri_OBJECTS = test_ncuri.$(OBJEXT) ncuri.$(OBJEXT) \
+	ncbytes.$(OBJEXT) nclist.$(OBJEXT)
+test_ncuri_OBJECTS = $(am_test_ncuri_OBJECTS)
+test_ncuri_LDADD = $(LDADD)
+am_test_pathcvt_OBJECTS = test_pathcvt.$(OBJEXT) dwinpath.$(OBJEXT)
+test_pathcvt_OBJECTS = $(am_test_pathcvt_OBJECTS)
+test_pathcvt_LDADD = $(LDADD)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -206,9 +217,11 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(libdispatch_la_SOURCES) $(libnetcdf2_la_SOURCES)
+SOURCES = $(libdispatch_la_SOURCES) $(libnetcdf2_la_SOURCES) \
+	$(test_ncuri_SOURCES) $(test_pathcvt_SOURCES)
 DIST_SOURCES = $(am__libdispatch_la_SOURCES_DIST) \
-	$(am__libnetcdf2_la_SOURCES_DIST)
+	$(am__libnetcdf2_la_SOURCES_DIST) $(test_ncuri_SOURCES) \
+	$(test_pathcvt_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -233,8 +246,212 @@ am__define_uniq_tagged_files = \
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
-	$(top_srcdir)/lib_flags.am
+	$(top_srcdir)/lib_flags.am $(top_srcdir)/test-driver
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ALLOCA = @ALLOCA@
@@ -277,6 +494,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -304,12 +522,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -344,6 +564,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -408,6 +629,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 
@@ -416,18 +638,25 @@ noinst_LTLIBRARIES = libdispatch.la $(am__append_5)
 libdispatch_la_CPPFLAGS = ${AM_CPPFLAGS} $(am__append_4)
 
 # The source files.
+
+# Add the utf8 codebase
 libdispatch_la_SOURCES = dparallel.c dcopy.c dfile.c ddim.c datt.c \
 	dattinq.c dattput.c dattget.c derror.c dvar.c dvarget.c \
-	dvarput.c dvarinq.c dinternal.c ddispatch.c nclog.c dstring.c \
-	dutf8proc.c utf8proc_data.h ncuri.c nclist.c ncbytes.c \
-	nchashmap.c nctime.c nc.c nclistmgr.c $(am__append_3)
+	dvarput.c dvarinq.c dinternal.c ddispatch.c dutf8.c nclog.c \
+	dstring.c ncuri.c nclist.c ncbytes.c nchashmap.c nctime.c nc.c \
+	nclistmgr.c drc.c doffsets.c dwinpath.c utf8proc.c utf8proc.h \
+	$(am__append_3)
 @BUILD_V2_TRUE at libnetcdf2_la_SOURCES = dv2i.c
 @BUILD_V2_TRUE at libnetcdf2_la_CPPFLAGS = ${AM_CPPFLAGS} -DDLL_EXPORT
-EXTRA_DIST = CMakeLists.txt ncsettings.hdr
+EXTRA_DIST = CMakeLists.txt ncsettings.hdr utf8proc_data.c
+
+# Unit tests
+test_ncuri_SOURCES = test_ncuri.c ncuri.c ncbytes.c nclist.c
+test_pathcvt_SOURCES = test_pathcvt.c dwinpath.c
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/lib_flags.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -476,12 +705,30 @@ libdispatch.la: $(libdispatch_la_OBJECTS) $(libdispatch_la_DEPENDENCIES) $(EXTRA
 libnetcdf2.la: $(libnetcdf2_la_OBJECTS) $(libnetcdf2_la_DEPENDENCIES) $(EXTRA_libnetcdf2_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(LINK) $(am_libnetcdf2_la_rpath) $(libnetcdf2_la_OBJECTS) $(libnetcdf2_la_LIBADD) $(LIBS)
 
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+test_ncuri$(EXEEXT): $(test_ncuri_OBJECTS) $(test_ncuri_DEPENDENCIES) $(EXTRA_test_ncuri_DEPENDENCIES) 
+	@rm -f test_ncuri$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_ncuri_OBJECTS) $(test_ncuri_LDADD) $(LIBS)
+
+test_pathcvt$(EXEEXT): $(test_pathcvt_OBJECTS) $(test_pathcvt_DEPENDENCIES) $(EXTRA_test_pathcvt_DEPENDENCIES) 
+	@rm -f test_pathcvt$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_pathcvt_OBJECTS) $(test_pathcvt_LDADD) $(LIBS)
+
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
 
 distclean-compile:
 	-rm -f *.tab.c
 
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dwinpath.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-datt.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dattget.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dattinq.Plo at am__quote@
@@ -495,16 +742,19 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dfile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dgroup.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dinternal.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-doffsets.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dopaque.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dparallel.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-drc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dstring.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dtype.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dutf8proc.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dutf8.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dvar.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dvarget.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dvarinq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dvarput.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dvlen.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-dwinpath.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-nc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-ncaux.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-ncbytes.Plo at am__quote@
@@ -514,7 +764,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-nclog.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-nctime.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-ncuri.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libdispatch_la-utf8proc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf2_la-dv2i.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ncbytes.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nclist.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ncuri.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_ncuri.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_pathcvt.Po at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -645,6 +901,13 @@ libdispatch_la-ddispatch.lo: ddispatch.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-ddispatch.lo `test -f 'ddispatch.c' || echo '$(srcdir)/'`ddispatch.c
 
+libdispatch_la-dutf8.lo: dutf8.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-dutf8.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-dutf8.Tpo -c -o libdispatch_la-dutf8.lo `test -f 'dutf8.c' || echo '$(srcdir)/'`dutf8.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-dutf8.Tpo $(DEPDIR)/libdispatch_la-dutf8.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dutf8.c' object='libdispatch_la-dutf8.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-dutf8.lo `test -f 'dutf8.c' || echo '$(srcdir)/'`dutf8.c
+
 libdispatch_la-nclog.lo: nclog.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-nclog.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-nclog.Tpo -c -o libdispatch_la-nclog.lo `test -f 'nclog.c' || echo '$(srcdir)/'`nclog.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-nclog.Tpo $(DEPDIR)/libdispatch_la-nclog.Plo
@@ -659,13 +922,6 @@ libdispatch_la-dstring.lo: dstring.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-dstring.lo `test -f 'dstring.c' || echo '$(srcdir)/'`dstring.c
 
-libdispatch_la-dutf8proc.lo: dutf8proc.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-dutf8proc.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-dutf8proc.Tpo -c -o libdispatch_la-dutf8proc.lo `test -f 'dutf8proc.c' || echo '$(srcdir)/'`dutf8proc.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-dutf8proc.Tpo $(DEPDIR)/libdispatch_la-dutf8proc.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dutf8proc.c' object='libdispatch_la-dutf8proc.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-dutf8proc.lo `test -f 'dutf8proc.c' || echo '$(srcdir)/'`dutf8proc.c
-
 libdispatch_la-ncuri.lo: ncuri.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-ncuri.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-ncuri.Tpo -c -o libdispatch_la-ncuri.lo `test -f 'ncuri.c' || echo '$(srcdir)/'`ncuri.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-ncuri.Tpo $(DEPDIR)/libdispatch_la-ncuri.Plo
@@ -715,6 +971,34 @@ libdispatch_la-nclistmgr.lo: nclistmgr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-nclistmgr.lo `test -f 'nclistmgr.c' || echo '$(srcdir)/'`nclistmgr.c
 
+libdispatch_la-drc.lo: drc.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-drc.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-drc.Tpo -c -o libdispatch_la-drc.lo `test -f 'drc.c' || echo '$(srcdir)/'`drc.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-drc.Tpo $(DEPDIR)/libdispatch_la-drc.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='drc.c' object='libdispatch_la-drc.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-drc.lo `test -f 'drc.c' || echo '$(srcdir)/'`drc.c
+
+libdispatch_la-doffsets.lo: doffsets.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-doffsets.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-doffsets.Tpo -c -o libdispatch_la-doffsets.lo `test -f 'doffsets.c' || echo '$(srcdir)/'`doffsets.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-doffsets.Tpo $(DEPDIR)/libdispatch_la-doffsets.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='doffsets.c' object='libdispatch_la-doffsets.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-doffsets.lo `test -f 'doffsets.c' || echo '$(srcdir)/'`doffsets.c
+
+libdispatch_la-dwinpath.lo: dwinpath.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-dwinpath.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-dwinpath.Tpo -c -o libdispatch_la-dwinpath.lo `test -f 'dwinpath.c' || echo '$(srcdir)/'`dwinpath.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-dwinpath.Tpo $(DEPDIR)/libdispatch_la-dwinpath.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dwinpath.c' object='libdispatch_la-dwinpath.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-dwinpath.lo `test -f 'dwinpath.c' || echo '$(srcdir)/'`dwinpath.c
+
+libdispatch_la-utf8proc.lo: utf8proc.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-utf8proc.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-utf8proc.Tpo -c -o libdispatch_la-utf8proc.lo `test -f 'utf8proc.c' || echo '$(srcdir)/'`utf8proc.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-utf8proc.Tpo $(DEPDIR)/libdispatch_la-utf8proc.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='utf8proc.c' object='libdispatch_la-utf8proc.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libdispatch_la-utf8proc.lo `test -f 'utf8proc.c' || echo '$(srcdir)/'`utf8proc.c
+
 libdispatch_la-dgroup.lo: dgroup.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdispatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libdispatch_la-dgroup.lo -MD -MP -MF $(DEPDIR)/libdispatch_la-dgroup.Tpo -c -o libdispatch_la-dgroup.lo `test -f 'dgroup.c' || echo '$(srcdir)/'`dgroup.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libdispatch_la-dgroup.Tpo $(DEPDIR)/libdispatch_la-dgroup.Plo
@@ -829,6 +1113,176 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+test_ncuri.log: test_ncuri$(EXEEXT)
+	@p='test_ncuri$(EXEEXT)'; \
+	b='test_ncuri'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test_pathcvt.log: test_pathcvt$(EXEEXT)
+	@p='test_pathcvt$(EXEEXT)'; \
+	b='test_pathcvt'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -860,6 +1314,8 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
 all-am: Makefile $(LTLIBRARIES)
 installdirs:
@@ -883,6 +1339,9 @@ install-strip:
 	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
 	fi
 mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
 
 clean-generic:
 
@@ -895,8 +1354,8 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	clean-noinstLTLIBRARIES mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -964,21 +1423,22 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
-	ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-am uninstall uninstall-am
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool \
+	clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am recheck tags tags-am uninstall \
+	uninstall-am
 
 .PRECIOUS: Makefile
 
diff --git a/libdispatch/dattput.c b/libdispatch/dattput.c
index 712375d..a8a1fee 100644
--- a/libdispatch/dattput.c
+++ b/libdispatch/dattput.c
@@ -37,7 +37,8 @@ apply.
 \param value Pointer to one or more values.
 
 \returns ::NC_NOERR No error.
-\returns ::NC_EINVAL More than one value for _FillValue or trying to set global _FillValue.
+\returns ::NC_EINVAL More than one value for _FillValue.
+\returns ::NC_EGLOBAL Trying to set global _FillValue.
 \returns ::NC_ENOTVAR Couldn't find varid.
 \returns ::NC_EBADTYPE Fill value and var must be same type.
 \returns ::NC_ENOMEM Out of memory
@@ -53,6 +54,9 @@ nc_put_att_string(int ncid, int varid, const char *name,
     NC* ncp;
     int stat = NC_check_id(ncid, &ncp);
     if(stat != NC_NOERR) return stat;
+    /* set global _FillValue is not allowed */
+    if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+        return NC_EGLOBAL;
     return ncp->dispatch->put_att(ncid, varid, name, NC_STRING,
 				  len, (void*)value, NC_STRING);
 }
@@ -87,7 +91,8 @@ apply.
 \param value Pointer to one or more values.
 
 \returns ::NC_NOERR No error.
-\returns ::NC_EINVAL More than one value for _FillValue or trying to set global _FillValue.
+\returns ::NC_EINVAL More than one value for _FillValue.
+\returns ::NC_EGLOBAL Trying to set global _FillValue.
 \returns ::NC_ENOTVAR Couldn't find varid.
 \returns ::NC_EBADTYPE Fill value and var must be same type.
 \returns ::NC_ENOMEM Out of memory
@@ -141,6 +146,9 @@ int nc_put_att_text(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, NC_CHAR, len,
 				 (void *)value, NC_CHAR);
 }
@@ -182,7 +190,8 @@ apply.
 \param value Pointer to one or more values.
 
 \returns ::NC_NOERR No error.
-\returns ::NC_EINVAL More than one value for _FillValue or trying to set global _FillValue.
+\returns ::NC_EINVAL More than one value for _FillValue.
+\returns ::NC_EGLOBAL Trying to set global _FillValue.
 \returns ::NC_ENOTVAR Couldn't find varid.
 \returns ::NC_EBADTYPE Fill value and var must be same type.
 \returns ::NC_ENOMEM Out of memory
@@ -232,6 +241,9 @@ nc_put_att(int ncid, int varid, const char *name, nc_type xtype,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 value, xtype);
 }
@@ -243,6 +255,9 @@ nc_put_att_schar(int ncid, int varid, const char *name,
    NC *ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_BYTE);
 }
@@ -254,6 +269,9 @@ nc_put_att_uchar(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_UBYTE);
 }
@@ -265,6 +283,9 @@ nc_put_att_short(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_SHORT);
 }
@@ -276,6 +297,9 @@ nc_put_att_int(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_INT);
 }
@@ -287,6 +311,9 @@ nc_put_att_long(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, longtype);
 }
@@ -298,6 +325,9 @@ nc_put_att_float(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_FLOAT);
 }
@@ -309,6 +339,9 @@ nc_put_att_double(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_DOUBLE);
 }
@@ -320,6 +353,9 @@ nc_put_att_ubyte(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_UBYTE);
 }
@@ -331,6 +367,9 @@ nc_put_att_ushort(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_USHORT);
 }
@@ -342,6 +381,9 @@ nc_put_att_uint(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_UINT);
 }
@@ -354,6 +396,9 @@ nc_put_att_longlong(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_INT64);
 }
@@ -366,6 +411,9 @@ nc_put_att_ulonglong(int ncid, int varid, const char *name,
    NC* ncp;
    int stat = NC_check_id(ncid, &ncp);
    if(stat != NC_NOERR) return stat;
+   /* set global _FillValue is not allowed */
+   if (varid == NC_GLOBAL && name != NULL && !strcmp(name, _FillValue))
+       return NC_EGLOBAL;
    return ncp->dispatch->put_att(ncid, varid, name, xtype, len,
 				 (void *)value, NC_UINT64);
 }
diff --git a/libdispatch/ddispatch.c b/libdispatch/ddispatch.c
index 3383ee8..e089479 100644
--- a/libdispatch/ddispatch.c
+++ b/libdispatch/ddispatch.c
@@ -1,8 +1,6 @@
 #include "ncdispatch.h"
 #include "ncuri.h"
 
-#define MAXSERVERURL 4096
-
 /* Define vectors of zeros and ones for use with various nc_get_varX function*/
 size_t nc_sizevector0[NC_MAX_VAR_DIMS];
 size_t nc_sizevector1[NC_MAX_VAR_DIMS];
@@ -18,21 +16,14 @@ static struct NCPROTOCOLLIST {
 } ncprotolist[] = {
     {"http",NULL,0},
     {"https",NULL,0},
-    {"file",NULL,NC_FORMATX_DAP2},
+    {"file",NULL,0},
     {"dods","http",NC_FORMATX_DAP2},
     {"dodss","https",NC_FORMATX_DAP2},
+    {"dap4","http",NC_FORMATX_DAP4},
+    {"dap4s","https",NC_FORMATX_DAP4},
     {NULL,NULL,0} /* Terminate search */
 };
 
-/* Define the default servers to ping in order;
-   make the order attempt to optimize
-   against future changes.
-*/
-static const char* default_servers[] = {
-"http://remotetest.unidata.ucar.edu",
-NULL
-};
-
 /*
 static nc_type longtype = (sizeof(long) == sizeof(int)?NC_INT:NC_INT64);
 static nc_type ulongtype = (sizeof(unsigned long) == sizeof(unsigned int)?NC_UINT:NC_UINT64);
@@ -60,50 +51,9 @@ int
 NCDISPATCH_finalize(void)
 {
     int status = NC_NOERR;
-    int i;
     return status;
 }
 
-/* search list of servers and return first that succeeds when
-   concatenated with the specified path part.
-   Search list can be prefixed by the second argument.
-*/
-char*
-NC_findtestserver(const char* path, const char** servers)
-{
-#ifdef USE_DAP
-#ifdef ENABLE_DAP_REMOTE_TESTS
-    /* NCDAP_ping is defined in libdap2/ncdap.c */
-    const char** svc;
-    int stat;
-    char* url = (char*)malloc(MAXSERVERURL);
-
-    if(path == NULL) path = "";
-    if(strlen(path) > 0 && path[0] == '/')
-	path++;
-
-    if(servers != NULL) {
-        for(svc=servers;*svc != NULL;svc++) {
-            snprintf(url,MAXSERVERURL,"%s/%s",*svc,path);
-            stat = NCDAP_ping(url);
-            if(stat == NC_NOERR)
-                return url;
-        }
-    }
-    /* not found in user supplied list; try defaults */
-    for(svc=default_servers;*svc != NULL;svc++) {
-        snprintf(url,MAXSERVERURL,"%s/%s",*svc,path);
-        stat = NCDAP_ping(url);
-        if(stat == NC_NOERR)
-            return url;
-    }
-    if(url) free(url);
-#endif
-#endif
-    return NULL;
-}
-
-
 /* return 1 if path looks like a url; 0 otherwise */
 int
 NC_testurl(const char* path)
@@ -121,9 +71,9 @@ NC_testurl(const char* path)
     if(*p == '/') return 0; /* probably an absolute file path */
 
     /* Ok, try to parse as a url */
-    if(ncuriparse(path,&tmpurl)) {
+    if(ncuriparse(path,&tmpurl)==NCU_OK) {
 	/* Do some extra testing to make sure this really is a url */
-        /* Look for a knownprotocol */
+        /* Look for a known/accepted protocol */
         struct NCPROTOCOLLIST* protolist;
         for(protolist=ncprotolist;protolist->protocol;protolist++) {
 	    if(strcmp(tmpurl->protocol,protolist->protocol) == 0) {
@@ -143,15 +93,103 @@ Assumes that the path is known to be a url
 */
 
 int
-NC_urlmodel(const char* path)
+NC_urlmodel(const char* path, int mode, char** newurl)
 {
-    int model = 0;
-    NCURI* tmpurl = NULL;
+    int found, model = 0;
     struct NCPROTOCOLLIST* protolist;
+    NCURI* url = NULL;
+    char* p;
+
+    if(path == NULL) return 0;
 
-    model = NC_FORMATX_DAP2;
+    /* find leading non-blank */
+    for(p=(char*)path;*p;p++) {if(*p != ' ') break;}
+
+    /* Do some initial checking to see if this looks like a file path */
+    if(*p == '/') return 0; /* probably an absolute file path */
+
+    /* Parse the url */
+    if(ncuriparse(path,&url) != NCU_OK)
+	goto fail; /* Not parseable as url */
+
+    /* Look up the protocol */
+    for(found=0,protolist=ncprotolist;protolist->protocol;protolist++) {
+        if(strcmp(url->protocol,protolist->protocol) == 0) {
+	    found = 1;
+	    break;
+	}
+    }    
+    if(found) {
+	model = protolist->model;
+	/* Substitute the protocol in any case */
+	if(protolist->substitute) ncurisetprotocol(url,protolist->substitute);
+    } else
+	goto fail; /* Again, does not look like a url */
+
+    if(model != NC_FORMATX_DAP2 && model != NC_FORMATX_DAP4) {
+        /* Look for and of the following params:
+  	   "dap2", "protocol=dap2", "dap4", "protocol=dap4" */
+	const char* proto = NULL;
+	const char* match = NULL;
+	if((proto=ncurilookup(url,"protocol")) == NULL) proto = NULL;
+	if(proto == NULL) proto = "";
+	if((match=ncurilookup(url,"dap2")) != NULL || strcmp(proto,"dap2") == 0)
+            model = NC_FORMATX_DAP2;
+	else if((match=ncurilookup(url,"dap4")) != NULL || strcmp(proto,"dap4") == 0)
+            model = NC_FORMATX_DAP4;
+	else 
+	model = 0; /* Still don't know */
+    }
+    if(model == 0) {/* Last resort: use the mode */
+        /* If mode specifies netcdf-4, then this is assumed to be dap4 */
+        if(mode & NC_NETCDF4)
+	    model = NC_FORMATX_DAP4;
+        else
+            model = NC_FORMATX_DAP2; /* Default */
+    }
+    if(newurl)
+	*newurl = ncuribuild(url,NULL,NULL,NCURIALL);
     return model;
+fail:
+    if(url) ncurifree(url);
+    return 0;
+}
+
+/**************************************************/
+/**
+ * Provide a hidden interface to allow utilities
+ * to check if a given path name is really an ncdap3 url.
+ * If no, put null in basenamep, else put basename of the url
+ * minus any extension into basenamep; caller frees.
+ * Return 1 if it looks like a url, 0 otherwise.
+ */
+
+int
+nc__testurl(const char* path, char** basenamep)
+{
+    int stat = NC_NOERR;
+    NCURI* uri;
+    int ok = 0;
+    if(ncuriparse(path,&uri) == NCU_OK) {
+	char* slash = (uri->path == NULL ? NULL : strrchr(uri->path, '/'));
+	char* dot;
+	if(slash == NULL) slash = (char*)path; else slash++;
+        slash = nulldup(slash);
+        if(slash == NULL)
+            dot = NULL;
+        else
+            dot = strrchr(slash, '.');
+        if(dot != NULL &&  dot != slash) *dot = '\0';
+	if(basenamep)
+            *basenamep=slash;
+        else if(slash)
+            free(slash);
+        ncurifree(uri);
+	ok = 1;
+    }
+    return ok;
 }
+/**************************************************/
 
 #ifdef OBSOLETE
 /* Override dispatch table management */
diff --git a/libdispatch/derror.c b/libdispatch/derror.c
index be5b31d..39338ac 100644
--- a/libdispatch/derror.c
+++ b/libdispatch/derror.c
@@ -131,8 +131,7 @@ const char *nc_strerror(int ncerr1)
 	 return "NetCDF: Invalid dimension ID or name";
       case NC_EUNLIMPOS:
 	 return "NetCDF: NC_UNLIMITED in the wrong index";
-      case NC_EMAXVARS:
-	 return "NetCDF: NC_MAX_VARS exceeded";
+      case NC_EMAXVARS:	 return "NetCDF: NC_MAX_VARS exceeded";
       case NC_ENOTVAR:
 	 return "NetCDF: Variable not found";
       case NC_EGLOBAL:
diff --git a/libdispatch/dfile.c b/libdispatch/dfile.c
index cf39fd3..3e22ae5 100644
--- a/libdispatch/dfile.c
+++ b/libdispatch/dfile.c
@@ -20,15 +20,13 @@ Research/Unidata. See COPYRIGHT file for more info.
 #ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
 #include "ncdispatch.h"
+#include "netcdf_mem.h"
+#include "ncwinpath.h"
 
 extern int NC_initialized;
 extern int NC_finalized;
 
-
 /** \defgroup datasets NetCDF File and Data I/O
 
 NetCDF opens datasets as files or remote access URLs.
@@ -166,9 +164,12 @@ static int NC_check_file_type(const char *path, int flags, void *parameters,
 	{
 	    FILE *fp;
 	    size_t i;
-#ifdef HAVE_SYS_STAT_H
-	    struct stat st;
+#ifdef HAVE_FILE_LENGTH_I64
+          __int64 file_len = 0;
+#else
+          struct stat st;
 #endif
+
 	    if(path == NULL || strlen(path)==0)
 		{status = NC_EINVAL; goto done;}
 
@@ -182,34 +183,34 @@ static int NC_check_file_type(const char *path, int flags, void *parameters,
 
         /* Windows and fstat have some issues, this will work around that. */
 #ifdef HAVE_FILE_LENGTH_I64
-        __int64 file_len = 0;
-        if((file_len = _filelengthi64(fileno(fp))) < 0) {
-          fclose(fp);
-          status = errno;
-          goto done;
-        }
-
-        if(file_len < MAGIC_NUMBER_LEN) {
-          fclose(fp);
-          status = NC_ENOTNC;
-          goto done;
-        }
+          if((file_len = _filelengthi64(fileno(fp))) < 0) {
+            fclose(fp);
+            status = errno;
+            goto done;
+          }
+
+
+          if(file_len < MAGIC_NUMBER_LEN) {
+            fclose(fp);
+            status = NC_ENOTNC;
+            goto done;
+          }
 #else
-
-	    if(!(fstat(fileno(fp),&st) == 0)) {
+	  { int fno = fileno(fp);
+	    if(!(fstat(fno,&st) == 0)) {
 	        fclose(fp);
 	        status = errno;
 	        goto done;
 	    }
-
 	    if(st.st_size < MAGIC_NUMBER_LEN) {
-          fclose(fp);
-          status = NC_ENOTNC;
-          goto done;
+              fclose(fp);
+              status = NC_ENOTNC;
+              goto done;
 	    }
+	  }
 #endif //HAVE_FILE_LENGTH_I64
 
-#endif
+#endif //HAVE_SYS_STAT_H
 
 	    i = fread(magic, MAGIC_NUMBER_LEN, 1, fp);
 	    fclose(fp);
@@ -1582,33 +1583,20 @@ nc_inq_type(int ncid, nc_type xtype, char *name, size_t *size)
 
    /* Do a quick triage on xtype */
    if(xtype <= NC_NAT) return NC_EBADTYPE;
-   /* See if the ncid is valid */
-   stat = NC_check_id(ncid, &ncp);
-   if(stat != NC_NOERR) { /* bad ncid; do what we can */
-       /* For compatibility, we need to allow inq about
-          atomic types, even if ncid is ill-defined */
-	if(xtype <= ATOMICTYPEMAX4) {
-            if(name) strncpy(name,NC_atomictypename(xtype),NC_MAX_NAME);
-            if(size) *size = NC_atomictypelen(xtype);
-            return NC_NOERR;
-	} else
-	    return NC_EBADTYPE;
-   } else { /* have good ncid */
-      return ncp->dispatch->inq_type(ncid,xtype,name,size);
-   }
-#if 0
-       int maxtype;
-       int format;
-   nc_inq_format(ncid, &format);
-   switch (format) {
-   case NC_FORMAT_NETCDF4_CLASSIC: /*fall thru*/
-   case NC_FORMAT_64BIT_OFFSET: /*fall thru*/
-   case NC_FORMAT_CLASSIC: maxtype = ATOMICTYPEMAX3; break;
-   case NC_FORMAT_NETCDF4: maxtype = ATOMICTYPEMAX4; break;
-   case NC_FORMAT_CDF5: maxtype = ATOMICTYPEMAX5; break;
-   default: return NC_EINVAL;
+   /* For compatibility, we need to allow inq about
+      atomic types, even if ncid is ill-defined */
+   if(xtype <= ATOMICTYPEMAX4) {
+      if(name) strncpy(name,NC_atomictypename(xtype),NC_MAX_NAME);
+      if(size) *size = NC_atomictypelen(xtype);
+      return NC_NOERR;
    }
-#endif
+   /* Apparently asking about a user defined type, so we need
+      a valid ncid */
+   stat = NC_check_id(ncid, &ncp);
+   if(stat != NC_NOERR) /* bad ncid */
+      return NC_EBADTYPE;
+   /* have good ncid */
+   return ncp->dispatch->inq_type(ncid,xtype,name,size);
 }
 
 /**
@@ -1646,7 +1634,7 @@ stored.
 \returns ::NC_NOERR No error.
 */
 int
-NC_create(const char *path, int cmode, size_t initialsz,
+NC_create(const char *path0, int cmode, size_t initialsz,
 	  int basepe, size_t *chunksizehintp, int useparallel,
 	  void* parameters, int *ncidp)
 {
@@ -1657,8 +1645,11 @@ NC_create(const char *path, int cmode, size_t initialsz,
    int model = NC_FORMATX_UNDEFINED; /* one of the NC_FORMATX values */
    int isurl = 0;   /* dap or cdmremote or neither */
    int xcmode = 0; /* for implied cmode flags */
+   char* path = NULL;
 
    TRACE(nc_create);
+   if(path0 == NULL)
+	return NC_EINVAL;
    /* Initialize the dispatch table. The function pointers in the
     * dispatch table will depend on how netCDF was built
     * (with/without netCDF-4, DAP, CDMREMOTE). */
@@ -1668,15 +1659,32 @@ NC_create(const char *path, int cmode, size_t initialsz,
 	 return stat;
    }
 
+#ifdef WINPATH
+   /* Need to do path conversion */
+   path = NCpathcvt(path0);
+fprintf(stderr,"XXX: path0=%s path=%s\n",path0,path); fflush(stderr);
+#else
+   path = nulldup(path0);
+#endif
+
 #ifdef USE_REFCOUNT
    /* If this path is already open, then fail */
    ncp = find_in_NCList_by_name(path);
-   if(ncp != NULL)
+   if(ncp != NULL) {
+	nullfree(path);
 	return NC_ENFILE;
+   }
 #endif
 
-   if((isurl = NC_testurl(path)))
-	model = NC_urlmodel(path);
+    {
+	char* newpath = NULL;
+        model = NC_urlmodel(path,cmode,&newpath);
+        isurl = (model != 0);
+        if(isurl) {
+	    nullfree(path);
+	    path = newpath;
+	}
+    }
 
    /* Look to the incoming cmode for hints */
    if(model == NC_FORMATX_UNDEFINED) {
@@ -1734,9 +1742,6 @@ NC_create(const char *path, int cmode, size_t initialsz,
    if((cmode & NC_MPIIO) && (cmode & NC_MPIPOSIX))
       return  NC_EINVAL;
 
-#ifdef OBSOLETE
-   dispatcher = NC_get_dispatch_override();
-#endif
    if (dispatcher == NULL)
    {
 
@@ -1759,6 +1764,8 @@ NC_create(const char *path, int cmode, size_t initialsz,
 
    /* Create the NC* instance and insert its dispatcher */
    stat = new_NC(dispatcher,path,cmode,&ncp);
+   nullfree(path); path = NULL; /* no longer needed */
+
    if(stat) return stat;
 
    /* Add to list of known open files and define ext_ncid */
@@ -1770,7 +1777,7 @@ NC_create(const char *path, int cmode, size_t initialsz,
 #endif
 
    /* Assume create will fill in remaining ncp fields */
-   if ((stat = dispatcher->create(path, cmode, initialsz, basepe, chunksizehintp,
+   if ((stat = dispatcher->create(ncp->path, cmode, initialsz, basepe, chunksizehintp,
 				   useparallel, parameters, dispatcher, ncp))) {
 	del_from_NCList(ncp); /* oh well */
 	free_NC(ncp);
@@ -1796,7 +1803,7 @@ For open, we have the following pieces of information to use to determine the di
 \returns ::NC_NOERR No error.
 */
 int
-NC_open(const char *path, int cmode,
+NC_open(const char *path0, int cmode,
 	int basepe, size_t *chunksizehintp,
         int useparallel, void* parameters,
         int *ncidp)
@@ -1805,11 +1812,13 @@ NC_open(const char *path, int cmode,
    NC* ncp = NULL;
    NC_Dispatch* dispatcher = NULL;
    int inmemory = ((cmode & NC_INMEMORY) == NC_INMEMORY);
+   int diskless = ((cmode & NC_DISKLESS) == NC_DISKLESS);
    /* Need pieces of information for now to decide model*/
    int model = 0;
    int isurl = 0;
    int version = 0;
    int flags = 0;
+   char* path = NULL;
 
    TRACE(nc_open);
    if(!NC_initialized) {
@@ -1817,10 +1826,19 @@ NC_open(const char *path, int cmode,
       if(stat) return stat;
    }
 
+#ifdef WINPATH
+   /* Need to do path conversion */
+   path = NCpathcvt(path0);
+fprintf(stderr,"XXX: path0=%s path=%s\n",path0,path); fflush(stderr);
+#else
+   path = nulldup(path0);
+#endif
+
 #ifdef USE_REFCOUNT
    /* If this path is already open, then bump the refcount and return it */
    ncp = find_in_NCList_by_name(path);
    if(ncp != NULL) {
+	nullfree(path);
 	ncp->refcount++;
 	if(ncidp) *ncidp = ncp->ext_ncid;
 	return NC_NOERR;
@@ -1828,15 +1846,21 @@ NC_open(const char *path, int cmode,
 #endif
 
    if(!inmemory) {
-       isurl = NC_testurl(path);
-       if(isurl)
-           model = NC_urlmodel(path);
+	char* newpath = NULL;
+        model = NC_urlmodel(path,cmode,&newpath);
+        isurl = (model != 0);
+	if(isurl) {
+	    nullfree(path);
+	    path = newpath;
+	} else
+	    nullfree(newpath);
     }
     if(model == 0) {
 	version = 0;
 	/* Try to find dataset type */
 	if(useparallel) flags |= NC_MPIIO;
 	if(inmemory) flags |= NC_INMEMORY;
+	if(diskless) flags |= NC_DISKLESS;
 	stat = NC_check_file_type(path,flags,parameters,&model,&version);
         if(stat == NC_NOERR) {
    	if(model == 0)
@@ -1851,9 +1875,13 @@ NC_open(const char *path, int cmode,
    }
 
    /* Force flag consistentcy */
-   if(model == NC_FORMATX_NC4)
+   if(model == NC_FORMATX_NC4 || model == NC_FORMATX_DAP4)
       cmode |= NC_NETCDF4;
-   else if(model == NC_FORMATX_NC3) {
+   else if(model == NC_FORMATX_DAP2) {
+      cmode &= ~NC_NETCDF4;
+      cmode &= ~NC_PNETCDF;
+      cmode &= ~NC_64BIT_OFFSET;
+   } else if(model == NC_FORMATX_NC3) {
       cmode &= ~NC_NETCDF4; /* must be netcdf-3 (CDF-1, CDF-2, CDF-5) */
       /* User may want to open file using the pnetcdf library */
       if(cmode & NC_PNETCDF) {
@@ -1882,22 +1910,19 @@ NC_open(const char *path, int cmode,
      return  NC_EINVAL;
 
    /* override any other table choice */
-#ifdef OBSOLETE
-   dispatcher = NC_get_dispatch_override();
-#endif
    if(dispatcher != NULL) goto havetable;
 
    /* Figure out what dispatcher to use */
-#if  defined(USE_CDMREMOTE)
-   if(model == (NC_DISPATCH_NC4 | NC_DISPATCH_NCR))
-	dispatcher = NCCR_dispatch_table;
-   else
-#endif
-#if defined(USE_DAP)
+#if defined(ENABLE_DAP)
    if(model == (NC_FORMATX_DAP2))
 	dispatcher = NCD2_dispatch_table;
    else
 #endif
+#if defined(ENABLE_DAP4)
+   if(model == (NC_FORMATX_DAP4))
+	dispatcher = NCD4_dispatch_table;
+   else
+#endif
 #if  defined(USE_PNETCDF)
    if(model == (NC_FORMATX_PNETCDF))
 	dispatcher = NCP_dispatch_table;
@@ -1915,8 +1940,12 @@ NC_open(const char *path, int cmode,
 
 havetable:
 
+   if(dispatcher == NULL)
+	return NC_ENOTNC;
+
    /* Create the NC* instance and insert its dispatcher */
    stat = new_NC(dispatcher,path,cmode,&ncp);
+   nullfree(path); path = NULL; /* no longer need path */
    if(stat) return stat;
 
    /* Add to list of known open files */
@@ -1928,7 +1957,7 @@ havetable:
 #endif
 
    /* Assume open will fill in remaining ncp fields */
-   stat = dispatcher->open(path, cmode, basepe, chunksizehintp,
+   stat = dispatcher->open(ncp->path, cmode, basepe, chunksizehintp,
 			   useparallel, parameters, dispatcher, ncp);
    if(stat == NC_NOERR) {
      if(ncidp) *ncidp = ncp->ext_ncid;
diff --git a/libdispatch/doffsets.c b/libdispatch/doffsets.c
new file mode 100644
index 0000000..996b3c6
--- /dev/null
+++ b/libdispatch/doffsets.c
@@ -0,0 +1,344 @@
+/*********************************************************************
+ *   Copyright 1993, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *   $Header: /upc/share/CVS/netcdf-3/ncgen/offsets.c,v 1.1 2009/09/25 18:22:40 dmh Exp $
+ *********************************************************************/
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+This code is a variantion of the H5detect.c code from HDF5.
+Author: D. Heimbigner 10/7/2008
+*/
+
+#include "config.h"
+#include        <stdlib.h>
+#include        <stdio.h>
+#include        <string.h>
+#include        <assert.h>
+
+#ifdef OFFSETTEST
+
+static void* emalloc(size_t);
+
+typedef int nc_type;
+typedef struct nc_vlen_t {
+    size_t len;
+    void* p;
+} nc_vlen_t;
+
+#define	NC_NAT 	        0	/* NAT = 'Not A Type' (c.f. NaN) */
+#define	NC_BYTE         1	/* signed 1 byte integer */
+#define	NC_CHAR 	2	/* ISO/ASCII character */
+#define	NC_SHORT 	3	/* signed 2 byte integer */
+#define	NC_INT 	        4	/* signed 4 byte integer */
+#define	NC_FLOAT 	5	/* single precision floating point number */
+#define	NC_DOUBLE 	6	/* double precision floating point number */
+#define	NC_UBYTE 	7	/* unsigned 1 byte int */
+#define	NC_USHORT 	8	/* unsigned 2-byte int */
+#define	NC_UINT 	9	/* unsigned 4-byte int */
+#define	NC_INT64 	10	/* signed 8-byte int */
+#define	NC_UINT64 	11	/* unsigned 8-byte int */
+#define	NC_STRING 	12	/* string */
+#define	NC_STRING 	12	/* string */
+#define	NC_VLEN 	13	
+#define	NC_OPAQUE 	14	
+#define	NC_ENUM 	15	
+#define	NC_COMPOUND 	16	
+#endif
+
+#include        "netcdf.h"
+#include        "ncoffsets.h"
+
+
+/*
+The heart of this is the following macro,
+which computes the offset of a field x
+when preceded by a char field.
+The assumptions appear to be as follows:
+1. the offset produced in this situation indicates
+   the alignment for x relative in such a way that it
+   depends only on the types that precede it in the struct.
+2. the compiler does not reorder fields.
+3. arrays are tightly packed.
+4. nested structs are alignd according to their first member
+   (this actually follows from C language requirement that
+    a struct can legally be cast to an instance of its first member).
+Given the alignments for the various common primitive types,
+it is assumed that one can use them anywhere to construct
+the layout of a struct of such types.
+It seems to work for HDF5 for a wide variety of machines.
+Note that technically, this is compiler dependent, but in practice
+all compilers seem to mimic the gcc rules.
+*/
+
+#define COMP_ALIGNMENT(DST,TYPE)  {\
+    struct {char f1; TYPE x;} tmp; \
+    DST.typename = #TYPE ;        \
+    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
+
+#if 0
+char* ctypenames[NCTYPES] = {
+(char*)NULL,
+"char","unsigned char",
+"short","unsigned short",
+"int","unsigned int",
+"long long","unsigned long long",
+"float","double",
+"void*","nc_vlen_t"
+};
+#endif
+
+static Typealignvec vec[NCTYPES];
+static Typealignset set;
+static int computed = 0;
+
+/*Forward*/
+static void compute_alignments(void);
+
+unsigned int
+nctypealignment(nc_type nctype)
+{
+    Alignment* align = NULL;
+    int index = 0;
+    if(!computed) {
+	compute_alignments();
+	computed = 1;
+    }
+    switch (nctype) {
+      case NC_BYTE: index = UCHARINDEX; break;
+      case NC_CHAR: index = CHARINDEX; break;
+      case NC_SHORT: index = SHORTINDEX; break;
+      case NC_INT: index = INTINDEX; break;
+      case NC_FLOAT: index = FLOATINDEX; break;
+      case NC_DOUBLE: index = DOUBLEINDEX; break;
+      case NC_UBYTE: index = UCHARINDEX; break;
+      case NC_USHORT: index = USHORTINDEX; break;
+      case NC_UINT: index = UINTINDEX; break;
+      case NC_INT64: index = LONGLONGINDEX; break;
+      case NC_UINT64: index = ULONGLONGINDEX; break;
+      case NC_STRING: index = PTRINDEX; break;
+      case NC_VLEN: index = NCVLENINDEX; break;
+      case NC_OPAQUE: index = UCHARINDEX; break;
+      default:
+	fprintf(stderr,"nctypealignment: bad type code: %d",nctype);
+	exit(1);
+    }
+    align = &vec[index];
+    return align->alignment;
+}
+
+
+static void
+compute_alignments(void)
+{
+    /* Compute the alignments for all the common C data types*/
+    /* First for the struct*/
+    /* initialize*/
+    memset((void*)&set,0,sizeof(set));
+    memset((void*)vec,0,sizeof(vec));
+
+    COMP_ALIGNMENT(set.charalign,char);
+    COMP_ALIGNMENT(set.ucharalign,unsigned char);
+    COMP_ALIGNMENT(set.shortalign,short);
+    COMP_ALIGNMENT(set.ushortalign,unsigned short);
+    COMP_ALIGNMENT(set.intalign,int);
+    COMP_ALIGNMENT(set.uintalign,unsigned int);
+    COMP_ALIGNMENT(set.longlongalign,long long);
+    COMP_ALIGNMENT(set.ulonglongalign,unsigned long long);
+    COMP_ALIGNMENT(set.floatalign,float);
+    COMP_ALIGNMENT(set.doublealign,double);
+    COMP_ALIGNMENT(set.ptralign,void*);
+    COMP_ALIGNMENT(set.ncvlenalign,nc_vlen_t);
+
+    /* Then the vector*/
+    COMP_ALIGNMENT(vec[CHARINDEX],char);
+    COMP_ALIGNMENT(vec[UCHARINDEX],unsigned char); 
+    COMP_ALIGNMENT(vec[SHORTINDEX],short);
+    COMP_ALIGNMENT(vec[USHORTINDEX],unsigned short);
+    COMP_ALIGNMENT(vec[INTINDEX],int);
+    COMP_ALIGNMENT(vec[UINTINDEX],unsigned int);
+    COMP_ALIGNMENT(vec[LONGLONGINDEX],long long);
+    COMP_ALIGNMENT(vec[ULONGLONGINDEX],unsigned long long);
+    COMP_ALIGNMENT(vec[FLOATINDEX],float);
+    COMP_ALIGNMENT(vec[DOUBLEINDEX],double);
+    COMP_ALIGNMENT(vec[PTRINDEX],void*);
+    COMP_ALIGNMENT(vec[NCVLENINDEX],nc_vlen_t);
+}
+
+#ifdef OFFSETTEST
+
+/* Compute the alignment of TYPE when it is preceded
+   by a field of type TYPE1
+*/
+#define COMP_ALIGNMENT1(DST,TYPE1,TYPE)  {\
+    struct {TYPE1 f1; TYPE x;} tmp; \
+    DST.typename = #TYPE ;        \
+    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
+
+/* Compute the alignment of TYPE when it is preceded
+   by a field of type TYPE1 and a field of type TYPE2
+*/
+#define COMP_ALIGNMENT2(DST,TYPE1,TYPE2,TYPE)  {\
+    struct {TYPE1 f1, TYPE2 f2; TYPE x;} tmp;   \
+    DST.typename = #TYPE ;                      \
+    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
+
+/* Compute the alignment of TYPE when it is preceded
+   by a field of type TYPE1 and a field of type TYPE2
+*/
+#define COMP_SIZE0(DST,TYPE1,TYPE2)  {\
+    struct {TYPE1 c; TYPE2 x;} tmp; \
+    DST = sizeof(tmp); }
+
+static char*
+padname(char* name)
+{
+#define MAX 20
+    if(name == NULL) name = "null";
+    int len = strlen(name);
+    if(len > MAX) len = MAX;
+    char* s = (char*)emalloc(MAX+1);
+    memset(s,' ',MAX);
+    s[MAX+1] = '\0';
+    strncpy(s,name,len);
+    return s;
+}
+
+static void
+verify(Typealignvec* vec)
+{
+    int i,j;
+    Typealignvec* vec16;
+    Typealignvec* vec32;
+    int* sizes8;
+    int* sizes16;
+    int* sizes32;
+
+    vec16 = (Typealignvec*)emalloc(sizeof(Typealignvec)*NCTYPES);
+    vec32 = (Typealignvec*)emalloc(sizeof(Typealignvec)*NCTYPES);
+    sizes8 = (int*)emalloc(sizeof(int)*NCTYPES);
+    sizes16 = (int*)emalloc(sizeof(int)*NCTYPES);
+    sizes32 = (int*)emalloc(sizeof(int)*NCTYPES);
+
+    COMP_SIZE0(sizes8[1],char,char);
+    COMP_SIZE0(sizes8[2],unsigned char,char);
+    COMP_SIZE0(sizes8[3],short,char);
+    COMP_SIZE0(sizes8[4],unsigned short,char);
+    COMP_SIZE0(sizes8[5],int,char);
+    COMP_SIZE0(sizes8[6],unsigned int,char);
+    COMP_SIZE0(sizes8[7],long long,char);
+    COMP_SIZE0(sizes8[8],unsigned long long,char);
+    COMP_SIZE0(sizes8[9],float,char);
+    COMP_SIZE0(sizes8[10],double,char) ;
+    COMP_SIZE0(sizes8[11],void*,char);
+    COMP_SIZE0(sizes8[12],nc_vlen_t,char);
+
+    COMP_SIZE0(sizes16[1],char,short);
+    COMP_SIZE0(sizes16[2],unsigned char,short);
+    COMP_SIZE0(sizes16[3],short,short);
+    COMP_SIZE0(sizes16[4],unsigned short,short);
+    COMP_SIZE0(sizes16[5],int,short);
+    COMP_SIZE0(sizes16[6],unsigned int,short);
+    COMP_SIZE0(sizes16[7],long long,short);
+    COMP_SIZE0(sizes16[8],unsigned long long,short);
+    COMP_SIZE0(sizes16[9],float,short);
+    COMP_SIZE0(sizes16[10],double,short) ;
+    COMP_SIZE0(sizes16[11],void*,short);
+    COMP_SIZE0(sizes16[12],nc_vlen_t*,short);
+
+    COMP_SIZE0(sizes32[1],char,int);
+    COMP_SIZE0(sizes32[2],unsigned char,int);
+    COMP_SIZE0(sizes32[3],short,int);
+    COMP_SIZE0(sizes32[4],unsigned short,int);
+    COMP_SIZE0(sizes32[5],int,int);
+    COMP_SIZE0(sizes32[6],unsigned int,int);
+    COMP_SIZE0(sizes32[7],long long,int);
+    COMP_SIZE0(sizes32[8],unsigned long long,int);
+    COMP_SIZE0(sizes32[9],float,int);
+    COMP_SIZE0(sizes32[10],double,int) ;
+    COMP_SIZE0(sizes32[11],void*,int);
+    COMP_SIZE0(sizes32[12],nc_vlen_t*,int);
+
+    COMP_ALIGNMENT1(vec16[1],char,short);
+    COMP_ALIGNMENT1(vec16[2],unsigned char,short);
+    COMP_ALIGNMENT1(vec16[3],short,short);
+    COMP_ALIGNMENT1(vec16[4],unsigned short,short);
+    COMP_ALIGNMENT1(vec16[5],int,short);
+    COMP_ALIGNMENT1(vec16[6],unsigned int,short);
+    COMP_ALIGNMENT1(vec32[7],long long,short);
+    COMP_ALIGNMENT1(vec32[8],unsigned long long,short);
+    COMP_ALIGNMENT1(vec16[9],float,short);
+    COMP_ALIGNMENT1(vec16[10],double,short);
+    COMP_ALIGNMENT1(vec16[11],void*,short);
+    COMP_ALIGNMENT1(vec16[12],nc_vlen_t*,short);
+
+    COMP_ALIGNMENT1(vec32[1],char,short);
+    COMP_ALIGNMENT1(vec32[2],unsigned char,short);
+    COMP_ALIGNMENT1(vec32[3],char,short);
+    COMP_ALIGNMENT1(vec32[4],unsigned short,short);
+    COMP_ALIGNMENT1(vec32[5],int,int);
+    COMP_ALIGNMENT1(vec32[6],unsigned int,int);
+    COMP_ALIGNMENT1(vec32[7],long long,int);
+    COMP_ALIGNMENT1(vec32[8],unsigned long long,int);
+    COMP_ALIGNMENT1(vec32[9],float,int);
+    COMP_ALIGNMENT1(vec32[10],double,int);
+    COMP_ALIGNMENT1(vec32[11],void*,int);
+    COMP_ALIGNMENT1(vec32[12],nc_vlen_t*,int);
+
+    for(i=0;i<NCTYPES;i++) {
+	printf("%s: size=%2d  alignment=%2d\n",
+		padname(vec[i].typename),sizes8[i],vec[i].alignment);
+    }
+    for(i=0;i<NCTYPES;i++) {
+	printf("short vs %s: size=%2d  alignment=%2d\n",
+		padname(vec[i].typename),sizes16[i],vec16[i].alignment);
+    }
+    for(i=0;i<NCTYPES;i++) {
+	printf("int vs %s: size=%2d  alignment=%2d\n",
+		padname(vec[i].typename),sizes32[i],vec32[i].alignment);
+    }
+
+}
+
+void *
+emalloc(size_t bytes) {
+    size_t *memory;
+    memory = malloc(bytes);
+    if(memory == 0) {
+	printf("malloc failed\n");
+	exit(2);
+    }
+    return memory;
+}
+
+int
+main(int argc, char** argv)
+{
+    int i;
+
+    compute_alignments();
+
+    verify(vec);
+
+/*
+    for(i=0;i<NCTYPES;i++) {
+	printf("%s:\talignment=%d\n",vec[i].typename,vec[i].alignment);
+    }
+*/
+    exit(0);
+}
+#endif /*OFFSETTEST*/
diff --git a/libdispatch/drc.c b/libdispatch/drc.c
new file mode 100644
index 0000000..f47ef46
--- /dev/null
+++ b/libdispatch/drc.c
@@ -0,0 +1,424 @@
+/*********************************************************************
+  *   Copyright 2016, UCAR/Unidata
+  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+  *********************************************************************/
+
+#include "config.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "nc.h"
+#include "nclog.h"
+#include "ncbytes.h"
+#include "ncrc.h"
+
+#define RTAG ']'
+#define LTAG '['
+
+#define TRIMCHARS " \t\r\n"
+
+static char* ENVRCLIST[] = {"DAPRCFILE","NETCDFRCFILE",NULL};
+static char* RCFILELIST[] = {".netcdfrc",".daprc", ".dodsrc",NULL};
+
+/*Forward*/
+static int rcreadline(FILE* f, NCbytes*);
+static void rctrim(NCbytes* text);
+static void storedump(char* msg, NCTripleStore*);
+static int rc_compile(const char* path);
+static const NCTriple* rc_locate(NCTripleStore* rc, char* key, char* tag);
+static int rc_search(const char* prefix, const char* rcfile, char** pathp);
+static int copycat(char* dst, size_t size, size_t n, ...);
+
+/**************************************************/
+
+static int ncrc_ignore = 0;
+static int ncrc_loaded = 0;
+static char* ncrc_home = NULL;
+static NCTripleStore ncrc_store;
+
+/**************************************************/
+
+/* read and compile the rc file, if any */
+int
+ncrc_load(const char* filename)
+{
+    int stat = NC_NOERR;
+    char* path = NULL;
+
+    if(ncrc_ignore) {
+        nclog(NCLOGDBG,"No runtime configuration file specified; continuing");
+	goto done;
+    }
+    if(ncrc_loaded) return NC_NOERR;
+
+    /* locate the configuration files in the following order:
+       1. specified by argument
+       2. set by any ENVRCLIST env variable
+       3. '.'
+       4. $HOME
+    */
+    if(filename != NULL) /* always use this */
+	path = strdup(filename);
+    if(path == NULL) {
+	char** p;
+	for(p=ENVRCLIST;*p;p++) {
+	    const char* value = getenv(*p);
+            if(value != NULL && strlen(value) > 0) {
+		path = strdup(value);
+		break;
+	    }
+	}
+    }
+    if(path == NULL) {
+	char** rcname;
+	for(rcname=RCFILELIST;*rcname;rcname++) {
+	    stat = rc_search(".",*rcname,&path);
+    	    if(stat != NC_NOERR || path != NULL) break;
+	    stat = rc_search(ncrc_home,*rcname,&path);
+    	    if(stat != NC_NOERR || path != NULL) break;
+	}
+	if(stat != NC_NOERR) goto done;
+    }
+    if(path == NULL) {
+        nclog(NCLOGDBG,"Cannot find runtime configuration file; continuing");
+	goto done;
+    }
+    nclog(NCLOGDBG,"RC files: %s\n", path);
+    if(rc_compile(path) == 0) {
+	nclog(NCLOGERR, "Error parsing %s\n",path);
+	stat = NC_NOERR;
+    }
+done:
+    ncrc_loaded = 1; /* even if not exists */
+    if(path != NULL)
+	free(path);
+    return stat;
+}
+
+void
+ncrc_reset(NCTripleStore* store)
+{
+    int i;
+    if(store->triples == NULL) return;
+    for(i=0;i<nclistlength(store->triples);i++) {
+	NCTriple* triple = (NCTriple*)nclistget(store->triples,i);
+	if(triple == NULL) continue;
+	if(triple->tag != NULL) free(triple->tag);
+	if(triple->key != NULL) free(triple->key);
+	if(triple->value != NULL) free(triple->value);
+	free(triple);
+    }
+    nclistfree(store->triples);
+    store->triples = NULL;
+}
+
+char*
+ncrc_lookup(NCTripleStore* store, char* key, char* tag)
+{
+    const NCTriple* triple = rc_locate(store, key, tag);
+    if(triple != NULL && ncdebug > 2) {
+	fprintf(stderr,"lookup %s: [%s]%s = %s\n",tag,triple->tag,triple->key,triple->value);
+    }
+    return (triple == NULL ? NULL : triple->value);
+}
+
+static const NCTriple*
+rc_locate(NCTripleStore* rc, char* key, char* tag)
+{
+    int i,found;
+
+    if(ncrc_ignore || !ncrc_loaded || rc->triples == NULL)
+	return NULL;
+    if(key == NULL || rc == NULL) return NULL;
+
+    if(tag == NULL) tag = "";
+    /* Assume that the triple store has been properly sorted */
+    for(found=0,i=0;i<nclistlength(rc->triples);i++) {
+	NCTriple* triple = (NCTriple*)nclistget(rc->triples,i);
+        size_t taglen = strlen(triple->tag);
+        int t;
+        if(strcmp(key,triple->key) != 0) continue; /* keys do not match */
+        /* If the triple entry has no tag, then use it
+           (because we have checked all other cases)*/
+        if(taglen == 0) {found=1;break;}
+        /* do tag match */
+        t = strcmp(tag,triple->tag);
+        if(t ==  0) return triple;
+    }
+    return NULL;
+}
+
+static int
+rcreadline(FILE* f, NCbytes* buf)
+{
+    int c;
+    ncbytesclear(buf);
+    for(;;) {
+        c = getc(f);
+        if(c < 0) break; /* eof */
+        if(c == '\n') break; /* eol */
+	ncbytesappend(buf,c);
+    }
+    ncbytesnull(buf);
+    return 1;
+}
+
+/* Trim TRIMCHARS from both ends of text; */
+static void
+rctrim(NCbytes* buf)
+{
+    if(nclistlength(buf) == 0) return;
+    for(;;) {
+	int c = ncbytesget(buf,0);
+        if(strchr(TRIMCHARS,c) == NULL) break; /* hit non-trim char */
+	ncbytesremove(buf,0);
+    }
+    int pos = ncbyteslength(buf) - 1;
+    while(pos >= 0) {
+	int c = ncbytesget(buf,pos);
+        if(strchr(TRIMCHARS,c) == NULL) break; /* hit non-trim char */
+	ncbytesremove(buf,pos);
+	pos--;
+    }
+}
+
+/* insertion sort the triplestore based on tag */
+static void
+sorttriplestore(NCTripleStore* store)
+{
+    int i, nsorted, len;
+    NCTriple** content = NULL;
+
+    if(store == NULL) return; /* nothing to sort */
+    len = nclistlength(store->triples);
+    if(len <= 1) return; /* nothing to sort */
+    if(ncdebug > 2)
+        storedump("initial:",store);
+    content = (NCTriple**)nclistdup(store->triples);
+    nclistclear(store->triples);
+    nsorted = 0;
+    while(nsorted < len) {
+        int largest;
+        /* locate first non killed entry */
+        for(largest=0;largest<len;largest++) {
+            if(content[largest]->key[0] != '\0') break;
+        }
+        for(i=0;i<len;i++) {
+            if(content[i]->key[0] != '\0') { /* avoid empty slots */
+                int lexorder = strcmp(content[i]->tag,content[largest]->tag);
+                int leni = strlen(content[i]->tag);
+                int lenlarge = strlen(content[largest]->tag);
+                /* this defines the ordering */
+                if(leni == 0 && lenlarge == 0)
+		    continue; /* if no tags, then leave in order */
+                if(leni != 0 && lenlarge == 0)
+		    largest = i;
+                else if(lexorder > 0)
+		    largest = i;
+            }
+        }
+        /* Move the largest entry */
+	nclistpush(store->triples,content[largest]);
+        content[largest]->key[0] = '\0'; /* kill entry */
+        nsorted++;
+        if(ncdebug > 2)
+	    storedump("pass:",store);
+    }
+    free(content);
+    if(ncdebug > 1)
+        storedump("final .rc order:",store);
+}
+
+/* Create a triple store from a file */
+static int
+rc_compile(const char* path)
+{
+    FILE *in_file = NULL;
+    int linecount = 0;
+    NCbytes* buf;
+    NCTripleStore* rc;
+
+    rc = &ncrc_store;
+    memset(rc,0,sizeof(NCTripleStore));
+    rc->triples = nclistnew();
+
+    in_file = fopen(path, "r"); /* Open the file to read it */
+    if (in_file == NULL) {
+        nclog(NCLOGERR, "Could not open configuration file: %s",path);
+        return NC_EPERM;
+    }
+
+    buf =  ncbytesnew();
+    for(;;) {
+        int c;
+	int pos;
+	char* line;
+	size_t len,count;
+	char* value;
+
+        if(!rcreadline(in_file,buf)) break;
+        linecount++;
+        rctrim(buf);  /* trim leading and trailing blanks */
+        len = ncbyteslength(buf);
+	line = ncbytescontents(buf);
+
+	if(len == 0) continue;
+        if(line[0] == '#') continue; /* check for comment */
+
+        /* setup */
+	NCTriple* triple = (NCTriple*)calloc(1,sizeof(NCTriple));
+	if(triple == NULL) {
+            nclog(NCLOGERR, "Out of memory reading rc file: %s",path);
+	    goto done;
+	}	
+        nclistpush(rc->triples,triple);
+	c = line[0];
+        if(c == LTAG) {
+	    int i;
+	    for(i=0;i<len;i++) {
+		if(line[i] != RTAG) break;
+	    }
+	    if(i == len) {/* RTAG is missing */
+		nclog(NCLOGERR, "Line has missing %c: %s",RTAG,line);
+	        goto done;
+	    }
+	    count = (i - 1);
+	    if(count > 0) {
+		triple->tag = (char*)malloc(count+1);
+		if(triple->tag == NULL) {goto done;}
+		memcpy(triple->tag,&line[1],count);
+	    }
+	    memmove(line,&line[count]+1,count+2); /* remove [...] */
+	}
+        /* split off key and value */
+        value = strchr(line, '=');
+        if(value == NULL)
+            value = line + strlen(line);
+        else {
+            *value = '\0';
+            value++;
+        }
+	triple->key = strdup(line);
+	if(*value == '\0')
+	    triple->value = strdup("1");	    
+	else
+	    triple->value = strdup(value);
+    }
+done:
+    fclose(in_file);
+    sorttriplestore(rc);
+    return 1;
+}
+
+
+
+static void
+storedump(char* msg, NCTripleStore* rc)
+{
+    int i;
+
+    if(msg != NULL) fprintf(stderr,"%s\n",msg);
+    if(rc == NULL || nclistlength(rc->triples) == 0) {
+        fprintf(stderr,"<EMPTY>\n");
+        return;
+    }
+    for(i=0;i<nclistlength(rc->triples);i++) {
+	NCTriple* triple = (NCTriple*)nclistget(rc->triples,i);
+	if(triple->tag == NULL)
+	    fprintf(stderr,"[%s]",triple->tag);
+        fprintf(stderr,"%s=%s\n",triple->key,triple->value);
+    }
+    fflush(stderr);
+}
+
+static int
+rc_search(const char* prefix, const char* rcname, char** pathp)
+{
+    char* path = NULL;
+    FILE* f = NULL;
+    int plen = strlen(prefix);
+    int rclen = strlen(rcname);
+    int stat = NC_NOERR;
+
+    size_t pathlen = plen+rclen+1+1; /*+1 for '/' +1 for nul*/
+    path = (char*)malloc(pathlen);
+    if(path == NULL) {
+	stat = NC_ENOMEM;
+	goto done;
+    }
+    if(!copycat(path,pathlen,3,prefix,"/",rcname)) {
+        stat = NC_ENOMEM;
+	goto done;
+    }
+    /* see if file is readable */
+    f = fopen(path,"r");
+    if(f != NULL)
+        nclog(NCLOGDBG, "Found rc file=%s",path);
+done:
+    if(f == NULL || stat != NC_NOERR) {
+	if(path != NULL)
+	    free(path);
+	path = NULL;
+    }
+    if(f != NULL)
+	fclose(f);
+    if(pathp != NULL)
+	*pathp = path;
+    return stat;
+}
+
+/*
+Instead of using snprintf to concatenate
+multiple strings into a given target,
+provide a direct concatenator.
+So, this function concats the n argument strings
+and overwrites the contents of dst.
+Care is taken to never overrun the available
+space (the size parameter).
+Note that size is assumed to include the null
+terminator and that in the event of overrun,
+the string will have a null at dst[size-1].
+Return 0 if overrun, 1 otherwise.
+*/
+static int
+copycat(char* dst, size_t size, size_t n, ...)
+{
+    va_list args;
+    size_t avail = size - 1;
+    int i; 
+    int status = 1; /* assume ok */
+    char* p = dst;
+
+    if(n == 0) {
+	if(size > 0)
+	    dst[0] = '\0';
+	return (size > 0 ? 1: 0);
+    }
+	
+    va_start(args,n);
+    for(i=0;i<n;i++) {
+	char* q = va_arg(args, char*);
+	for(;;) {
+	    int c = *q++;
+	    if(c == '\0') break;
+	    if(avail == 0) {status = 0; goto done;}
+	    *p++ = c;
+	    avail--;
+	}
+    }
+    /* make sure we null terminate;
+       note that since avail was size-1, there
+       will always be room
+    */
+    *p = '\0';    
+
+done:
+    va_end(args);
+    return status;    
+}
diff --git a/libdispatch/dstring.c b/libdispatch/dstring.c
index d251fe4..3466e53 100644
--- a/libdispatch/dstring.c
+++ b/libdispatch/dstring.c
@@ -12,7 +12,7 @@
 #include <assert.h>
 #include "nc.h"
 #include "rnd.h"
-#include "utf8proc.h"
+#include "ncutf8.h"
 
 
 /* There are 3 levels of UTF8 checking: 1=> (exact)validating 2=>relaxed
@@ -171,7 +171,7 @@ NC_check_name(const char *name)
 	int skip;
 	int ch;
 	const char *cp = name;
-	ssize_t utf8_stat;
+	int stat;
 
 	assert(name != NULL);
 
@@ -180,8 +180,8 @@ NC_check_name(const char *name)
 		goto fail;
 
 	/* check validity of any UTF-8 */
-	utf8_stat = utf8proc_check((const unsigned char *)name);
-	if (utf8_stat < 0)
+	stat = nc_utf8_validate((const unsigned char *)name);
+	if (stat != NC_NOERR)
 	    goto fail;
 
 	/* First char must be [a-z][A-Z][0-9]_ | UTF8 */
@@ -228,13 +228,8 @@ fail:
 NC_new_string(count, str)
  */
 
-#ifdef __arm__
-NC_string *
-new_NC_string(size_t slen, const signed char *str)
-#else
 NC_string *
 new_NC_string(size_t slen, const char *str)
-#endif
 {
 	NC_string *ncstrp;
 	size_t sz = M_RNDUP(sizeof(NC_string)) + slen + 1;
@@ -269,13 +264,8 @@ new_NC_string(size_t slen, const char *str)
 NC_re_string()
  */
 
-#ifdef __arm__
- int
-   set_NC_string(NC_string *ncstrp, const signed char *str)
-#else
- int
+int
    set_NC_string(NC_string *ncstrp, const char *str)
-#endif
  {
 	size_t slen;
 
diff --git a/libdispatch/dutf8.c b/libdispatch/dutf8.c
new file mode 100644
index 0000000..0ff99de
--- /dev/null
+++ b/libdispatch/dutf8.c
@@ -0,0 +1,96 @@
+/*
+ *	Copyright 2017, University Corporation for Atmospheric Research
+ *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ */
+
+#include "config.h"
+#include "netcdf.h"
+#include "ncutf8.h"
+#include "utf8proc.h"
+
+/* Provide a wrapper around whatever utf8 library we use. */
+
+/*
+ * Check validity of a UTF8 encoded null-terminated byte string.
+ * Return codes:
+ * NC_NOERR -- string is valid utf8
+ * NC_ENOMEM -- out of memory
+ * NC_EINVAL -- invalid argument or internal error
+ * NC_EBADNAME-- not valid utf8
+ */
+
+int nc_utf8_validate(const unsigned char* name)
+{
+    int ncstat = NC_NOERR;
+    const nc_utf8proc_uint8_t *str;
+    nc_utf8proc_ssize_t strlen = -1;
+    nc_utf8proc_int32_t codepoint;
+    nc_utf8proc_ssize_t count;
+
+    str = (const nc_utf8proc_uint8_t*)name;
+    while(*str) {
+        count = nc_utf8proc_iterate(str,strlen,&codepoint);
+	if(count < 0) {
+	    switch (count) {
+	    case UTF8PROC_ERROR_NOMEM:
+	    case UTF8PROC_ERROR_OVERFLOW:
+		ncstat = NC_ENOMEM;
+		break;
+	    case UTF8PROC_ERROR_INVALIDOPTS:
+		ncstat = NC_EINVAL;
+		break;
+	    case UTF8PROC_ERROR_INVALIDUTF8:
+	    case UTF8PROC_ERROR_NOTASSIGNED:
+	    default:
+		ncstat = NC_EBADNAME;
+		break;
+	    }
+	    goto done;
+	} else { /* move to next char */
+	    str += count;
+	}
+    }
+done:
+    return ncstat;
+}
+
+/*
+ * Returns a pointer to newly allocated memory of a
+ * normalized version of the null-terminated string 'str'.
+ * Normalized string is returned in normalp argument;
+ * caller must free.
+ * Return codes:
+ * NC_NOERR -- success
+ * NC_ENOMEM -- out of memory
+ * NC_EINVAL -- illegal argument or internal error
+ * NC_EBADNAME -- other failure
+ */
+int
+nc_utf8_normalize(const unsigned char* utf8, unsigned char** normalp)
+{
+    int ncstat = NC_NOERR;
+    const nc_utf8proc_uint8_t* str = (const nc_utf8proc_uint8_t*)utf8;
+    nc_utf8proc_uint8_t* retval = NULL;
+    nc_utf8proc_ssize_t count;
+    count = nc_utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | UTF8PROC_COMPOSE);
+    if(count < 0) {/* error */
+	switch (count) {
+	case UTF8PROC_ERROR_NOMEM:
+	case UTF8PROC_ERROR_OVERFLOW:
+	ncstat = NC_ENOMEM;
+	    break;
+	case UTF8PROC_ERROR_INVALIDOPTS:
+	    ncstat = NC_EINVAL;
+	    break;
+	case UTF8PROC_ERROR_INVALIDUTF8:
+	case UTF8PROC_ERROR_NOTASSIGNED:
+	default:
+	    ncstat = NC_EBADNAME;
+	    break;
+	}
+	goto done;
+    } else
+	if(normalp) *normalp = (unsigned char*)retval;
+done:
+    return ncstat;
+}
diff --git a/libdispatch/dutf8proc.c b/libdispatch/dutf8proc.c
deleted file mode 100644
index f1e68a5..0000000
--- a/libdispatch/dutf8proc.c
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- *  Copyright (c) 2006-2007 Jan Behrens, FlexiGuided GmbH, Berlin
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),
- *  to deal in the Software without restriction, including without limitation
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- *  Software is furnished to do so, subject to the following conditions:
- *
- *  The above copyright notice and this permission notice shall be included in
- *  all copies or substantial portions of the Software.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *  DEALINGS IN THE SOFTWARE.
- */
-
-/*
- *  This library contains derived data from a modified version of the
- *  Unicode data files.
- *
- *  The original data files are available at
- *  http://www.unicode.org/Public/UNIDATA/
- *
- *  Please notice the copyright statement in the file "utf8proc_data.c".
- */
-
-
-/*
- *  File name:    utf8proc.c
- *  Version:      1.1.1
- *  Last changed: 2007-07-22
- *
- *  Description:
- *  Implementation of libutf8proc.
- */
-
-
-#include "utf8proc.h"
-#include "utf8proc_data.h"
-
-const int8_t utf8proc_utf8class[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,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
-  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-  4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 };
-
-#define UTF8PROC_HANGUL_SBASE 0xAC00
-#define UTF8PROC_HANGUL_LBASE 0x1100
-#define UTF8PROC_HANGUL_VBASE 0x1161
-#define UTF8PROC_HANGUL_TBASE 0x11A7
-#define UTF8PROC_HANGUL_LCOUNT 19
-#define UTF8PROC_HANGUL_VCOUNT 21
-#define UTF8PROC_HANGUL_TCOUNT 28
-#define UTF8PROC_HANGUL_NCOUNT 588
-#define UTF8PROC_HANGUL_SCOUNT 11172
-/*// END is exclusive*/
-#define UTF8PROC_HANGUL_L_START  0x1100
-#define UTF8PROC_HANGUL_L_END    0x115A
-#define UTF8PROC_HANGUL_L_FILLER 0x115F
-#define UTF8PROC_HANGUL_V_START  0x1160
-#define UTF8PROC_HANGUL_V_END    0x11A3
-#define UTF8PROC_HANGUL_T_START  0x11A8
-#define UTF8PROC_HANGUL_T_END    0x11FA
-#define UTF8PROC_HANGUL_S_START  0xAC00
-#define UTF8PROC_HANGUL_S_END    0xD7A4
-
-
-#define UTF8PROC_BOUNDCLASS_START    0
-#define UTF8PROC_BOUNDCLASS_OTHER    1
-#define UTF8PROC_BOUNDCLASS_CR       2
-#define UTF8PROC_BOUNDCLASS_LF       3
-#define UTF8PROC_BOUNDCLASS_CONTROL  4
-#define UTF8PROC_BOUNDCLASS_EXTEND   5
-#define UTF8PROC_BOUNDCLASS_L        6
-#define UTF8PROC_BOUNDCLASS_V        7
-#define UTF8PROC_BOUNDCLASS_T        8
-#define UTF8PROC_BOUNDCLASS_LV       9
-#define UTF8PROC_BOUNDCLASS_LVT     10
-
-
-const char *utf8proc_errmsg(ssize_t errcode) {
-  switch (errcode) {
-    case UTF8PROC_ERROR_NOMEM:
-    return "Memory for processing UTF-8 data could not be allocated.";
-    case UTF8PROC_ERROR_OVERFLOW:
-    return "UTF-8 string is too long to be processed.";
-    case UTF8PROC_ERROR_INVALIDUTF8:
-    return "Invalid UTF-8 string";
-    case UTF8PROC_ERROR_NOTASSIGNED:
-    return "Unassigned Unicode code point found in UTF-8 string.";
-    case UTF8PROC_ERROR_INVALIDOPTS:
-    return "Invalid options for UTF-8 processing chosen.";
-    default:
-    return "An unknown error occurred while processing UTF-8 data.";
-  }
-}
-
-ssize_t utf8proc_iterate(
-  const uint8_t *str, ssize_t slen, int32_t *dst
-) {
-  int length;
-  int i;
-  int32_t uc = -1;
-  *dst = -1;
-  if (!slen) return 0;
-  length = utf8proc_utf8class[str[0]];
-  if (!length) return UTF8PROC_ERROR_INVALIDUTF8;
-  if (slen >= 0 && length > slen) return UTF8PROC_ERROR_INVALIDUTF8;
-  for (i=1; i<length; i++) {
-    if ((str[i] & 0xC0) != 0x80) return UTF8PROC_ERROR_INVALIDUTF8;
-  }
-  switch (length) {
-    case 1:
-    uc = str[0];
-    break;
-    case 2:
-    uc = ((str[0] & 0x1F) <<  6) + (str[1] & 0x3F);
-    if (uc < 0x80) uc = -1;
-    break;
-    case 3:
-    uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) <<  6)
-      + (str[2] & 0x3F);
-    if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000) ||
-      (uc >= 0xFDD0 && uc < 0xFDF0)) uc = -1;
-    break;
-    case 4:
-    uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12)
-      + ((str[2] & 0x3F) <<  6) + (str[3] & 0x3F);
-    if (uc < 0x10000 || uc >= 0x110000) uc = -1;
-    break;
-  }
-  if (uc < 0 || ((uc & 0xFFFF) >= 0xFFFE))
-    return UTF8PROC_ERROR_INVALIDUTF8;
-  *dst = uc;
-  return length;
-}
-
-bool utf8proc_codepoint_valid(int32_t uc) {
-  if (uc < 0 || uc >= 0x110000 ||
-    ((uc & 0xFFFF) >= 0xFFFE) || (uc >= 0xD800 && uc < 0xE000) ||
-    (uc >= 0xFDD0 && uc < 0xFDF0)) return false;
-  else return true;
-}
-
-ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst) {
-  if (uc < 0x00) {
-    return 0;
-  } else if (uc < 0x80) {
-    dst[0] = (uint8_t)uc;
-    return 1;
-  } else if (uc < 0x800) {
-    dst[0] = (uint8_t)(0xC0 + (uc >> 6));
-    dst[1] = (uint8_t)(0x80 + (uc & 0x3F));
-    return 2;
-  } else if (uc == 0xFFFF) {
-    dst[0] = 0xFF;
-    return 1;
-  } else if (uc == 0xFFFE) {
-    dst[0] = 0xFE;
-    return 1;
-  } else if (uc < 0x10000) {
-    dst[0] = (uint8_t)(0xE0 + (uc >> 12));
-    dst[1] = (uint8_t)(0x80 + ((uc >> 6) & 0x3F));
-    dst[2] = (uint8_t)(0x80 + (uc & 0x3F));
-    return 3;
-  } else if (uc < 0x110000) {
-    dst[0] = (uint8_t)(0xF0 + (uc >> 18));
-    dst[1] = (uint8_t)(0x80 + ((uc >> 12) & 0x3F));
-    dst[2] = (uint8_t)(0x80 + ((uc >> 6) & 0x3F));
-    dst[3] = (uint8_t)(0x80 + (uc & 0x3F));
-    return 4;
-  } else return 0;
-}
-
-const utf8proc_property_t *utf8proc_get_property(int32_t uc) {
-  /*  // ASSERT: uc >= 0 && uc < 0x110000*/
-  return utf8proc_properties + (
-    utf8proc_stage2table[
-      utf8proc_stage1table[uc >> 8] + (uc & 0xFF)
-    ]
-  );
-}
-
-#define utf8proc_decompose_lump(replacement_uc) \
-  return utf8proc_decompose_char((replacement_uc), dst, bufsize, \
-  options & ~UTF8PROC_LUMP, last_boundclass)
-
-ssize_t utf8proc_decompose_char(int32_t uc, int32_t *dst, ssize_t bufsize,
-    int options, int *last_boundclass) {
-  /*// ASSERT: uc >= 0 && uc < 0x110000*/
-  const utf8proc_property_t *property;
-  utf8proc_propval_t category;
-  int32_t hangul_sindex;
-  property = utf8proc_get_property(uc);
-  category = property->category;
-  hangul_sindex = uc - UTF8PROC_HANGUL_SBASE;
-  if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
-    if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT) {
-      int32_t hangul_tindex;
-      if (bufsize >= 1) {
-        dst[0] = UTF8PROC_HANGUL_LBASE +
-          hangul_sindex / UTF8PROC_HANGUL_NCOUNT;
-        if (bufsize >= 2) dst[1] = UTF8PROC_HANGUL_VBASE +
-          (hangul_sindex % UTF8PROC_HANGUL_NCOUNT) / UTF8PROC_HANGUL_TCOUNT;
-      }
-      hangul_tindex = hangul_sindex % UTF8PROC_HANGUL_TCOUNT;
-      if (!hangul_tindex) return 2;
-      if (bufsize >= 3) dst[2] = UTF8PROC_HANGUL_TBASE + hangul_tindex;
-      return 3;
-    }
-  }
-  if (options & UTF8PROC_REJECTNA) {
-    if (!category) return UTF8PROC_ERROR_NOTASSIGNED;
-  }
-  if (options & UTF8PROC_IGNORE) {
-    if (property->ignorable) return 0;
-  }
-  if (options & UTF8PROC_LUMP) {
-    if (category == UTF8PROC_CATEGORY_ZS) utf8proc_decompose_lump(0x0020);
-    if (uc == 0x2018 || uc == 0x2019 || uc == 0x02BC || uc == 0x02C8)
-      utf8proc_decompose_lump(0x0027);
-    if (category == UTF8PROC_CATEGORY_PD || uc == 0x2212)
-      utf8proc_decompose_lump(0x002D);
-    if (uc == 0x2044 || uc == 0x2215) utf8proc_decompose_lump(0x002F);
-    if (uc == 0x2236) utf8proc_decompose_lump(0x003A);
-    if (uc == 0x2039 || uc == 0x2329 || uc == 0x3008)
-      utf8proc_decompose_lump(0x003C);
-    if (uc == 0x203A || uc == 0x232A || uc == 0x3009)
-      utf8proc_decompose_lump(0x003E);
-    if (uc == 0x2216) utf8proc_decompose_lump(0x005C);
-    if (uc == 0x02C4 || uc == 0x02C6 || uc == 0x2038 || uc == 0x2303)
-      utf8proc_decompose_lump(0x005E);
-    if (category == UTF8PROC_CATEGORY_PC || uc == 0x02CD)
-      utf8proc_decompose_lump(0x005F);
-    if (uc == 0x02CB) utf8proc_decompose_lump(0x0060);
-    if (uc == 0x2223) utf8proc_decompose_lump(0x007C);
-    if (uc == 0x223C) utf8proc_decompose_lump(0x007E);
-    if ((options & UTF8PROC_NLF2LS) && (options & UTF8PROC_NLF2PS)) {
-      if (category == UTF8PROC_CATEGORY_ZL ||
-          category == UTF8PROC_CATEGORY_ZP)
-        utf8proc_decompose_lump(0x000A);
-    }
-  }
-  if (options & UTF8PROC_STRIPMARK) {
-    if (category == UTF8PROC_CATEGORY_MN ||
-      category == UTF8PROC_CATEGORY_MC ||
-      category == UTF8PROC_CATEGORY_ME) return 0;
-  }
-  if (options & UTF8PROC_CASEFOLD) {
-    if (property->casefold_mapping) {
-      const int32_t *casefold_entry;
-      ssize_t written = 0;
-      for (casefold_entry = property->casefold_mapping;
-          *casefold_entry >= 0; casefold_entry++) {
-        written += utf8proc_decompose_char(*casefold_entry, dst+written,
-          (bufsize > written) ? (bufsize - written) : 0, options,
-          last_boundclass);
-        if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
-      }
-      return written;
-    }
-  }
-  if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
-    if (property->decomp_mapping &&
-        (!property->decomp_type || (options & UTF8PROC_COMPAT))) {
-      const int32_t *decomp_entry;
-      ssize_t written = 0;
-      for (decomp_entry = property->decomp_mapping;
-          *decomp_entry >= 0; decomp_entry++) {
-        written += utf8proc_decompose_char(*decomp_entry, dst+written,
-          (bufsize > written) ? (bufsize - written) : 0, options,
-        last_boundclass);
-        if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
-      }
-      return written;
-    }
-  }
-  if (options & UTF8PROC_CHARBOUND) {
-    bool boundary;
-    int tbc, lbc;
-    tbc =
-      (uc == 0x000D) ? UTF8PROC_BOUNDCLASS_CR :
-      (uc == 0x000A) ? UTF8PROC_BOUNDCLASS_LF :
-      ((category == UTF8PROC_CATEGORY_ZL ||
-        category == UTF8PROC_CATEGORY_ZP ||
-        category == UTF8PROC_CATEGORY_CC ||
-        category == UTF8PROC_CATEGORY_CF) &&
-        !(uc == 0x200C || uc == 0x200D)) ? UTF8PROC_BOUNDCLASS_CONTROL :
-      property->extend ? UTF8PROC_BOUNDCLASS_EXTEND :
-      ((uc >= UTF8PROC_HANGUL_L_START && uc < UTF8PROC_HANGUL_L_END) ||
-        uc == UTF8PROC_HANGUL_L_FILLER) ? UTF8PROC_BOUNDCLASS_L :
-      (uc >= UTF8PROC_HANGUL_V_START && uc < UTF8PROC_HANGUL_V_END) ?
-        UTF8PROC_BOUNDCLASS_V :
-      (uc >= UTF8PROC_HANGUL_T_START && uc < UTF8PROC_HANGUL_T_END) ?
-        UTF8PROC_BOUNDCLASS_T :
-      (uc >= UTF8PROC_HANGUL_S_START && uc < UTF8PROC_HANGUL_S_END) ? (
-        ((uc-UTF8PROC_HANGUL_SBASE) % UTF8PROC_HANGUL_TCOUNT == 0) ?
-          UTF8PROC_BOUNDCLASS_LV : UTF8PROC_BOUNDCLASS_LVT
-      ) :
-      UTF8PROC_BOUNDCLASS_OTHER;
-    lbc = *last_boundclass;
-    boundary =
-      (tbc == UTF8PROC_BOUNDCLASS_EXTEND) ? false :
-      (lbc == UTF8PROC_BOUNDCLASS_START) ? true :
-      (lbc == UTF8PROC_BOUNDCLASS_CR &&
-       tbc == UTF8PROC_BOUNDCLASS_LF) ? false :
-      (lbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true :
-      (tbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true :
-      (lbc == UTF8PROC_BOUNDCLASS_L &&
-       (tbc == UTF8PROC_BOUNDCLASS_L ||
-        tbc == UTF8PROC_BOUNDCLASS_V ||
-        tbc == UTF8PROC_BOUNDCLASS_LV ||
-        tbc == UTF8PROC_BOUNDCLASS_LVT)) ? false :
-      ((lbc == UTF8PROC_BOUNDCLASS_LV ||
-        lbc == UTF8PROC_BOUNDCLASS_V) &&
-       (tbc == UTF8PROC_BOUNDCLASS_V ||
-        tbc == UTF8PROC_BOUNDCLASS_T)) ? false :
-      ((lbc == UTF8PROC_BOUNDCLASS_LVT ||
-        lbc == UTF8PROC_BOUNDCLASS_T) &&
-       tbc == UTF8PROC_BOUNDCLASS_T) ? false :
-       true;
-    *last_boundclass = tbc;
-    if (boundary) {
-      if (bufsize >= 1) dst[0] = 0xFFFF;
-      if (bufsize >= 2) dst[1] = uc;
-      return 2;
-    }
-  }
-  if (bufsize >= 1) *dst = uc;
-  return 1;
-}
-
-ssize_t utf8proc_decompose(
-  const uint8_t *str, ssize_t slen,
-  int32_t *buffer, ssize_t bufsize, int options
-) {
-  /*// slen will be ignored, if UTF8PROC_NULLTERM is set in options*/
-  ssize_t wpos = 0;
-  if ((options & UTF8PROC_COMPOSE) && (options & UTF8PROC_DECOMPOSE))
-    return UTF8PROC_ERROR_INVALIDOPTS;
-  if ((options & UTF8PROC_STRIPMARK) &&
-      !(options & UTF8PROC_COMPOSE) && !(options & UTF8PROC_DECOMPOSE))
-    return UTF8PROC_ERROR_INVALIDOPTS;
-  {
-    int32_t uc;
-    ssize_t rpos = 0;
-    ssize_t decomp_result;
-    int boundclass = UTF8PROC_BOUNDCLASS_START;
-    while (1) {
-      if (options & UTF8PROC_NULLTERM) {
-        rpos += utf8proc_iterate(str + rpos, -1, &uc);
-        /* checking of return value is not necessary,
-	   as 'uc' is < 0 in case of error. */
-        if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
-        if (rpos < 0) return UTF8PROC_ERROR_OVERFLOW;
-        if (uc == 0) break;
-      } else {
-        if (rpos >= slen) break;
-        rpos += utf8proc_iterate(str + rpos, slen - rpos, &uc);
-        if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
-      }
-      decomp_result = utf8proc_decompose_char(
-        uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options,
-        &boundclass
-      );
-      if (decomp_result < 0) return decomp_result;
-      wpos += decomp_result;
-      /*      // prohibiting integer overflows due to too long strings:*/
-      if (wpos < 0 || wpos > SSIZE_MAX/sizeof(int32_t)/2)
-        return UTF8PROC_ERROR_OVERFLOW;
-    }
-  }
-  if ((options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) && bufsize >= wpos) {
-    ssize_t pos = 0;
-    while (pos < wpos-1) {
-      int32_t uc1, uc2;
-      const utf8proc_property_t *property1, *property2;
-      uc1 = buffer[pos];
-      uc2 = buffer[pos+1];
-      property1 = utf8proc_get_property(uc1);
-      property2 = utf8proc_get_property(uc2);
-      if (property1->combining_class > property2->combining_class &&
-          property2->combining_class > 0) {
-        buffer[pos] = uc2;
-        buffer[pos+1] = uc1;
-        if (pos > 0) pos--; else pos++;
-      } else {
-        pos++;
-      }
-    }
-  }
-  return wpos;
-}
-
-ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options) {
-  /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored
-     ASSERT: 'buffer' has one spare byte of free space at the end! */
-  if (options & (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS | UTF8PROC_STRIPCC)) {
-    ssize_t rpos;
-    ssize_t wpos = 0;
-    int32_t uc;
-    for (rpos = 0; rpos < length; rpos++) {
-      uc = buffer[rpos];
-      if (uc == 0x000D && rpos < length-1 && buffer[rpos+1] == 0x000A) rpos++;
-      if (uc == 0x000A || uc == 0x000D || uc == 0x0085 ||
-          ((options & UTF8PROC_STRIPCC) && (uc == 0x000B || uc == 0x000C))) {
-        if (options & UTF8PROC_NLF2LS) {
-          if (options & UTF8PROC_NLF2PS) {
-            buffer[wpos++] = 0x000A;
-          } else {
-            buffer[wpos++] = 0x2028;
-          }
-        } else {
-          if (options & UTF8PROC_NLF2PS) {
-            buffer[wpos++] = 0x2029;
-          } else {
-            buffer[wpos++] = 0x0020;
-          }
-        }
-      } else if ((options & UTF8PROC_STRIPCC) &&
-          (uc < 0x0020 || (uc >= 0x007F && uc < 0x00A0))) {
-        if (uc == 0x0009) buffer[wpos++] = 0x0020;
-      } else {
-        buffer[wpos++] = uc;
-      }
-    }
-    length = wpos;
-  }
-  if (options & UTF8PROC_COMPOSE) {
-    int32_t *starter = NULL;
-    int32_t current_char;
-    const utf8proc_property_t *starter_property = NULL, *current_property;
-    utf8proc_propval_t max_combining_class = -1;
-    ssize_t rpos;
-    ssize_t wpos = 0;
-    int32_t composition;
-    for (rpos = 0; rpos < length; rpos++) {
-      current_char = buffer[rpos];
-      current_property = utf8proc_get_property(current_char);
-      if (starter && current_property->combining_class > max_combining_class) {
-	/*        // combination perhaps possible*/
-        int32_t hangul_lindex;
-        int32_t hangul_sindex;
-        hangul_lindex = *starter - UTF8PROC_HANGUL_LBASE;
-        if (hangul_lindex >= 0 && hangul_lindex < UTF8PROC_HANGUL_LCOUNT) {
-          int32_t hangul_vindex;
-          hangul_vindex = current_char - UTF8PROC_HANGUL_VBASE;
-          if (hangul_vindex >= 0 && hangul_vindex < UTF8PROC_HANGUL_VCOUNT) {
-            *starter = UTF8PROC_HANGUL_SBASE +
-              (hangul_lindex * UTF8PROC_HANGUL_VCOUNT + hangul_vindex) *
-              UTF8PROC_HANGUL_TCOUNT;
-            starter_property = NULL;
-            continue;
-          }
-        }
-        hangul_sindex = *starter - UTF8PROC_HANGUL_SBASE;
-        if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT &&
-            (hangul_sindex % UTF8PROC_HANGUL_TCOUNT) == 0) {
-          int32_t hangul_tindex;
-          hangul_tindex = current_char - UTF8PROC_HANGUL_TBASE;
-          if (hangul_tindex >= 0 && hangul_tindex < UTF8PROC_HANGUL_TCOUNT) {
-            *starter += hangul_tindex;
-            starter_property = NULL;
-            continue;
-          }
-        }
-        if (!starter_property) {
-          starter_property = utf8proc_get_property(*starter);
-        }
-        if (starter_property->comb1st_index >= 0 &&
-            current_property->comb2nd_index >= 0) {
-          composition = utf8proc_combinations[
-            starter_property->comb1st_index +
-            current_property->comb2nd_index
-          ];
-          if (composition >= 0 && (!(options & UTF8PROC_STABLE) ||
-              !(utf8proc_get_property(composition)->comp_exclusion))) {
-            *starter = composition;
-            starter_property = NULL;
-            continue;
-          }
-        }
-      }
-      buffer[wpos] = current_char;
-      if (current_property->combining_class) {
-        if (current_property->combining_class > max_combining_class) {
-          max_combining_class = current_property->combining_class;
-        }
-      } else {
-        starter = buffer + wpos;
-        starter_property = NULL;
-        max_combining_class = -1;
-      }
-      wpos++;
-    }
-    length = wpos;
-  }
-  {
-    ssize_t rpos, wpos = 0;
-    int32_t uc;
-    for (rpos = 0; rpos < length; rpos++) {
-      uc = buffer[rpos];
-      wpos += utf8proc_encode_char(uc, ((uint8_t *)buffer) + wpos);
-    }
-    ((uint8_t *)buffer)[wpos] = 0;
-    return wpos;
-  }
-}
-
-ssize_t utf8proc_map(
-  const uint8_t *str, ssize_t slen, uint8_t **dstptr, int options
-) {
-  int32_t *buffer;
-  ssize_t result;
-  *dstptr = NULL;
-  result = utf8proc_decompose(str, slen, NULL, 0, options);
-  if (result < 0) return result;
-  buffer = (int32_t*)malloc(((size_t)result) * sizeof(int32_t) + 1);
-  if (!buffer) return UTF8PROC_ERROR_NOMEM;
-  result = utf8proc_decompose(str, slen, buffer, result, options);
-  if (result < 0) {
-    free(buffer);
-    return result;
-  }
-  result = utf8proc_reencode(buffer, result, options);
-  if (result < 0) {
-    free(buffer);
-    return result;
-  }
-  {
-    int32_t *newptr;
-    newptr = realloc(buffer, result+1);
-    if (newptr) buffer = newptr;
-  }
-  *dstptr = (uint8_t *)buffer;
-  return result;
-}
-
-uint8_t *utf8proc_NFD(const uint8_t *str) {
-  uint8_t *retval;
-  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
-    UTF8PROC_DECOMPOSE);
-  return retval;
-}
-
-uint8_t *utf8proc_NFC(const uint8_t *str) {
-  uint8_t *retval;
-  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
-    UTF8PROC_COMPOSE);
-  return retval;
-}
-
-uint8_t *utf8proc_NFKD(const uint8_t *str) {
-  uint8_t *retval;
-  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
-    UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT);
-  return retval;
-}
-
-uint8_t *utf8proc_NFKC(const uint8_t *str) {
-  uint8_t *retval;
-  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
-    UTF8PROC_COMPOSE | UTF8PROC_COMPAT);
-  return retval;
-}
-
-ssize_t utf8proc_check(const uint8_t *str) {
-  ssize_t result;
-  result = utf8proc_decompose(str, 0, NULL, 0, 
-			      UTF8PROC_NULLTERM | UTF8PROC_STABLE);
-  return result;
-}
diff --git a/libdispatch/dv2i.c b/libdispatch/dv2i.c
index 925e81e..0110d35 100644
--- a/libdispatch/dv2i.c
+++ b/libdispatch/dv2i.c
@@ -7,7 +7,7 @@ See \ref copyright file for copying and redistribution conditions.
 
 #ifndef NO_NETCDF_2
 
-#include <config.h>
+#include "config.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
@@ -73,8 +73,9 @@ static void* nvmalloc(off_t size) {
   type *const name = (type*) nvmalloc((ndims) * sizeof(type))
 
 
-//  ALLOC_ONSTACK(name, type, ndims)		
-
+#if 0
+  ALLOC_ONSTACK(name, type, ndims)		
+#endif
 
 # define A_FREE(name) \
 	FREE_ONSTACK(name)
diff --git a/libdispatch/dvarget.c b/libdispatch/dvarget.c
index 6db4149..30291d7 100644
--- a/libdispatch/dvarget.c
+++ b/libdispatch/dvarget.c
@@ -143,6 +143,7 @@ NCDEFAULT_get_vars(int ncid, int varid, const size_t * start,
    NC* ncp;
    int memtypelen;
    size_t vartypelen;
+   size_t nels;
    char* value = (char*)value0;
    size_t numrecs;
    size_t varshape[NC_MAX_VAR_DIMS];
@@ -200,9 +201,18 @@ NCDEFAULT_get_vars(int ncid, int varid, const size_t * start,
 
    /* Do various checks and fixups on start/edges/stride */
    simplestride = 1; /* assume so */
+   nels = 1;
    for(i=0;i<rank;i++) {
 	size_t dimlen;
 	mystart[i] = (start == NULL ? 0 : start[i]);
+        /* illegal value checks */
+	dimlen = (i == 0 && isrecvar ? numrecs : varshape[i]);
+        /* mystart is unsigned, never < 0 */
+#ifdef RELAX_COORD_BOUND
+	if (mystart[i] > dimlen) return NC_EINVALCOORDS;
+#else
+	if (mystart[i] >= dimlen) return NC_EINVALCOORDS;
+#endif
 	if(edges == NULL) {
 	   if(i == 0 && isrecvar)
   	      myedges[i] = numrecs - start[i];
@@ -210,23 +220,23 @@ NCDEFAULT_get_vars(int ncid, int varid, const size_t * start,
 	      myedges[i] = varshape[i] - mystart[i];
 	} else
 	    myedges[i] = edges[i];
-	if(myedges[i] == 0)
-	    return NC_NOERR; /* cannot read anything */
+#ifdef RELAX_COORD_BOUND
+	if (mystart[i] == dimlen && myedges[i] > 0) return NC_EINVALCOORDS;
+#endif
+        /* myedges is unsigned, never < 0 */
+	if(mystart[i] + myedges[i] > dimlen)
+	  return NC_EEDGE;
 	mystride[i] = (stride == NULL ? 1 : stride[i]);
 	if(mystride[i] <= 0
 	   /* cast needed for braindead systems with signed size_t */
            || ((unsigned long) mystride[i] >= X_INT_MAX))
            return NC_ESTRIDE;
   	if(mystride[i] != 1) simplestride = 0;
-        /* illegal value checks */
-	dimlen = (i == 0 && isrecvar ? numrecs : varshape[i]);
-        /* mystart is unsigned, never < 0 */
-	if(mystart[i] >= dimlen)
-	  return NC_EINVALCOORDS;
-        /* myedges is unsigned, never < 0 */
-	if(mystart[i] + myedges[i] > dimlen)
-	  return NC_EEDGE;
+        if(myedges[i] == 0)
+          nels = 0;
    }
+   if(nels == 0)
+      return NC_NOERR; /* cannot read anything */
    if(simplestride) {
       return NC_get_vara(ncid, varid, mystart, myedges, value, memtype);
    }
@@ -376,17 +386,26 @@ NCDEFAULT_get_varm(int ncid, int varid, const size_t *start,
       mymap = mystride + varndims;
 
       /*
-       * Initialize I/O parameters.
+       * Check start, edges
        */
       for (idim = maxidim; idim >= 0; --idim)
       {
+	 size_t dimlen =
+	    idim == 0 && isrecvar
+	    ? numrecs
+	    : varshape[idim];
+
 	 mystart[idim] = start != NULL
 	    ? start[idim]
 	    : 0;
 
-	 if (edges != NULL && edges[idim] == 0)
+#ifdef RELAX_COORD_BOUND
+	 if (mystart[idim] > dimlen)
+#else
+	 if (mystart[idim] >= dimlen)
+#endif
 	 {
-	    status = NC_NOERR;    /* read/write no data */
+	    status = NC_EINVALCOORDS;
 	    goto done;
 	 }
 
@@ -405,6 +424,33 @@ NCDEFAULT_get_varm(int ncid, int varid, const size_t *start,
 	    myedges[idim] = varshape[idim] - mystart[idim];
 #endif
 
+#ifdef RELAX_COORD_BOUND
+	 if (mystart[idim] == dimlen && myedges[idim] > 0)
+	 {
+	    status = NC_EINVALCOORDS;
+	    goto done;
+	 }
+#endif
+
+	 if (mystart[idim] + myedges[idim] > dimlen)
+	 {
+	    status = NC_EEDGE;
+	    goto done;
+	 }
+      }
+
+
+      /*
+       * Initialize I/O parameters.
+       */
+      for (idim = maxidim; idim >= 0; --idim)
+      {
+	 if (edges != NULL && edges[idim] == 0)
+	 {
+	    status = NC_NOERR;    /* read/write no data */
+	    goto done;
+	 }
+
 	 mystride[idim] = stride != NULL
 	    ? stride[idim]
 	    : 1;
@@ -430,30 +476,6 @@ NCDEFAULT_get_varm(int ncid, int varid, const size_t *start,
 	 stop[idim] = (mystart[idim] + myedges[idim] * (size_t)mystride[idim]);
       }
 
-      /*
-       * Check start, edges
-       */
-      for (idim = maxidim; idim >= 0; --idim)
-      {
-	 size_t dimlen =
-	    idim == 0 && isrecvar
-	    ? numrecs
-	    : varshape[idim];
-	 if (mystart[idim] >= dimlen)
-	 {
-	    status = NC_EINVALCOORDS;
-	    goto done;
-	 }
-
-	 if (mystart[idim] + myedges[idim] > dimlen)
-	 {
-	    status = NC_EEDGE;
-	    goto done;
-	 }
-
-      }
-
-
       /* Lower body */
       /*
        * As an optimization, adjust I/O parameters when the fastest
diff --git a/libdispatch/dvarput.c b/libdispatch/dvarput.c
index 59e071b..cad940f 100644
--- a/libdispatch/dvarput.c
+++ b/libdispatch/dvarput.c
@@ -128,9 +128,9 @@ NCDEFAULT_put_vars(int ncid, int varid, const size_t * start,
    nc_type vartype = NC_NAT;
    NC* ncp;
    size_t vartypelen;
+   size_t nels;
    int memtypelen;
    const char* value = (const char*)value0;
-   size_t numrecs;
    int nrecdims;                /* number of record dims for a variable */
    int is_recdim[NC_MAX_VAR_DIMS]; /* for variable's dimensions */
    size_t varshape[NC_MAX_VAR_DIMS];
@@ -172,9 +172,6 @@ NCDEFAULT_put_vars(int ncid, int varid, const size_t * start,
    if(status != NC_NOERR) return status;
 
    /* Get variable dimension sizes */
-#if 0
-   isrecvar = NC_is_recvar(ncid,varid,&numrecs);
-#endif
    status = NC_inq_recvar(ncid,varid,&nrecdims,is_recdim);
    if(status != NC_NOERR) return status;
    isrecvar = (nrecdims > 0);
@@ -193,9 +190,26 @@ NCDEFAULT_put_vars(int ncid, int varid, const size_t * start,
 
    /* Do various checks and fixups on start/edges/stride */
    isstride1 = 1; /* assume so */
+   nels = 1;
    for(i=0;i<rank;i++) {
 	size_t dimlen;
 	mystart[i] = (start == NULL ? 0 : start[i]);
+#if 0
+	dimlen = (i == 0 && isrecvar ? numrecs : varshape[i]);
+	if(i == 0 && isrecvar) {/*do nothing*/}
+#else
+        /* illegal value checks */
+	dimlen = varshape[i];
+	if(is_recdim[i]) {/*do nothing*/}
+#endif
+        else {
+	  /* mystart is unsigned, will never be < 0 */
+#ifdef RELAX_COORD_BOUND
+	  if (mystart[i] > dimlen) return NC_EINVALCOORDS;
+#else
+          if (mystart[i] >= dimlen) return NC_EINVALCOORDS;
+#endif
+       }
 	if(edges == NULL) {
 #if 0
 	   if(i == 0 && isrecvar)
@@ -208,31 +222,27 @@ NCDEFAULT_put_vars(int ncid, int varid, const size_t * start,
 	      myedges[i] = varshape[i] - mystart[i];
 	} else
 	    myedges[i] = edges[i];
-	if(myedges[i] == 0)
-	    return NC_NOERR; /* cannot write anything */
+#ifdef RELAX_COORD_BOUND
+	if(!is_recdim[i]) {
+	  if (mystart[i] == dimlen && myedges[i] > 0)
+              return NC_EINVALCOORDS;
+        }
+#endif
+	if(!is_recdim[i]) {
+          /* myediges is unsigned, will never be < 0 */
+	  if(mystart[i] + myedges[i] > dimlen)
+	    return NC_EEDGE;
+        }
 	mystride[i] = (stride == NULL ? 1 : stride[i]);
 	if(mystride[i] <= 0
 	   /* cast needed for braindead systems with signed size_t */
            || ((unsigned long) mystride[i] >= X_INT_MAX))
            return NC_ESTRIDE;
   	if(mystride[i] != 1) isstride1 = 0;
-        /* illegal value checks */
-#if 0
-	dimlen = (i == 0 && isrecvar ? numrecs : varshape[i]);
-	if(i == 0 && isrecvar) {/*do nothing*/}
-#else
-	dimlen = varshape[i];
-	if(is_recdim[i]) {/*do nothing*/}
-#endif
-        else {
-	  /* mystart is unsigned, will never be < 0 */
-	  if(mystart[i] > dimlen)
-	    return NC_EINVALCOORDS;
-          /* myediges is unsigned, will never be < 0 */
-	  if(mystart[i] + myedges[i] > dimlen)
-	    return NC_EEDGE;
-       }
+        nels *= myedges[i];
    }
+   if(nels == 0)
+      return NC_NOERR; /* cannot write anything */
    if(isstride1) {
       return NC_put_vara(ncid, varid, mystart, myedges, value, memtype);
    }
@@ -384,7 +394,7 @@ NCDEFAULT_put_varm(
       mymap = mystride + varndims;
 
       /*
-       * Initialize I/O parameters.
+       * Check start, edges
        */
       for (idim = maxidim; idim >= 0; --idim)
       {
@@ -392,17 +402,44 @@ NCDEFAULT_put_varm(
 	    ? start[idim]
 	    : 0;
 
+	 myedges[idim] = edges != NULL
+	    ? edges[idim]
+	    : idim == 0 && isrecvar
+    	        ? numrecs - mystart[idim]
+	        : varshape[idim] - mystart[idim];
+      }
+
+      for (idim = isrecvar; idim <= maxidim; ++idim)
+      {
+#ifdef RELAX_COORD_BOUND
+	 if (mystart[idim] > varshape[idim] ||
+	    (mystart[idim] == varshape[idim] && myedges[idim] > 0))
+#else
+         if (mystart[idim] >= varshape[idim])
+#endif
+	 {
+	    status = NC_EINVALCOORDS;
+	    goto done;
+	 }
+
+	 if (mystart[idim] + myedges[idim] > varshape[idim])
+	 {
+	    status = NC_EEDGE;
+	    goto done;
+	 }
+      }
+
+      /*
+       * Initialize I/O parameters.
+       */
+      for (idim = maxidim; idim >= 0; --idim)
+      {
 	 if (edges != NULL && edges[idim] == 0)
 	 {
 	    status = NC_NOERR;    /* read/write no data */
 	    goto done;
 	 }
 
-	 myedges[idim] = edges != NULL
-	    ? edges[idim]
-	    : idim == 0 && isrecvar
-    	        ? numrecs - mystart[idim]
-	        : varshape[idim] - mystart[idim];
 	 mystride[idim] = stride != NULL
 	    ? stride[idim]
 	    : 1;
@@ -417,23 +454,6 @@ NCDEFAULT_put_varm(
 	 stop[idim] = mystart[idim] + myedges[idim] * (size_t)mystride[idim];
       }
 
-      /*
-       * Check start, edges
-       */
-      for (idim = isrecvar; idim < maxidim; ++idim)
-      {
-	 if (mystart[idim] > varshape[idim])
-	 {
-	    status = NC_EINVALCOORDS;
-	    goto done;
-	 }
-	 if (mystart[idim] + myedges[idim] > varshape[idim])
-	 {
-	    status = NC_EEDGE;
-	    goto done;
-	 }
-      }
-
       /* Lower body */
       /*
        * As an optimization, adjust I/O parameters when the fastest
diff --git a/libdispatch/dwinpath.c b/libdispatch/dwinpath.c
new file mode 100644
index 0000000..6595336
--- /dev/null
+++ b/libdispatch/dwinpath.c
@@ -0,0 +1,154 @@
+/*
+ * Copyright 1996, University Corporation for Atmospheric Research
+ * See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef _MSC_VER
+#include <io.h>
+#endif
+
+#include "ncexternl.h"
+#include "ncwinpath.h"
+
+/*
+Code to provide some path conversion code so that
+cygwin and (some) mingw paths can be passed to open/fopen
+for Windows. Other cases will be added as needed.
+Rules:
+1. a leading single alpha-character path element (e.g. /D/...)
+   will be interpreted as a windows drive letter.
+2. a leading '/cygdrive/X' will be converted to
+   a drive letter X if X is alpha-char.
+3. a leading D:/... is treated as a windows drive letter
+4. If #1, #2, or #3 is encounterd, then forward slashes
+   will be converted to backslashes.
+5. All other cases are passed thru unchanged
+*/
+
+/* Define legal windows drive letters */
+static char* windrive = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+static size_t cdlen = 10; /* strlen("/cygdrive/") */
+
+EXTERNL
+char* /* caller frees */
+NCpathcvt(const char* path)
+{
+    char* outpath = NULL; 
+    char* p;
+    char* q;
+    size_t pathlen;
+
+    if(path == NULL) return NULL; /* defensive driving */
+    pathlen = strlen(path);
+
+    /* 1. look for MSYS path /D/... */
+    if(pathlen >= 2
+	&& (path[0] == '/' || path[0] == '\\')
+	&& strchr(windrive,path[1]) != NULL
+	&& (path[2] == '/' || path[2] == '\\' || path[2] == '\0')) {
+	/* Assume this is a mingw path */
+	outpath = (char*)malloc(pathlen+3); /* conservative */
+	if(outpath == NULL) return NULL;
+	q = outpath;
+	*q++ = path[1];
+	*q++ = ':';
+	strncpy(q,&path[2],pathlen);
+	if(strlen(outpath) == 2)
+	    strcat(outpath,"/");
+	goto slashtrans;
+    }
+
+    /* 2. Look for leading /cygdrive/D where D is a single-char drive letter */
+    if(pathlen >= (cdlen+1)
+	&& memcmp(path,"/cygdrive/",cdlen)==0
+	&& strchr(windrive,path[cdlen]) != NULL
+	&& (path[cdlen+1] == '/'
+	    || path[cdlen+1] == '\\'
+	    || path[cdlen+1] == '\0')) {
+	/* Assume this is a cygwin path */
+	outpath = (char*)malloc(pathlen+1); /* conservative */
+	if(outpath == NULL) return NULL;
+	outpath[0] = path[cdlen];
+	outpath[1] = ':';
+	strcpy(&outpath[2],&path[cdlen+1]);
+	if(strlen(outpath) == 2)
+	    strcat(outpath,"/");
+	goto slashtrans;
+    }
+
+    /* 3. Look for leading D: where D is a single-char drive letter */
+    if(pathlen >= 2
+	&& strchr(windrive,path[0]) != NULL
+	&& path[1] == ':'
+	&& (path[2] == '\0' || path[2] == '/'  || path[2] == '\\')) {
+	outpath = strdup(path);
+	goto slashtrans;
+    }
+
+    /* 4. Other: just pass thru */
+    outpath = strdup(path);
+    goto done;
+
+slashtrans:
+    /* In all #1 or #2 cases, translate '/' -> '\\' */
+    p = outpath;
+    for(;*p;p++) {
+	if(*p == '/') {*p = '\\';}
+    }
+done:
+    return outpath;
+}
+
+#ifdef WINPATH
+
+/*
+Provide wrappers for open and fopen.
+*/
+
+EXTERNL
+FILE*
+NCfopen(const char* path, const char* flags)
+{
+    FILE* f = NULL;
+    char* cvtname = NCpathcvt(path);
+fprintf(stderr,"XXXX: path=|%s| cvtpath=|%s|\n",path,cvtname?cvtname:"null");
+fflush(stderr);
+    if(cvtname == NULL) return NULL;
+    f = fopen(cvtname,flags);
+    free(cvtname);    
+    return f;
+}
+
+EXTERNL
+int
+NCopen3(const char* path, int flags, int mode)
+{
+    int fd = -1;
+    fprintf(stderr,"XXXX: path=|%s|\n",path);
+    fflush(stderr);
+    char* cvtname = NCpathcvt(path);
+    fprintf(stderr,"XXXX: path=|%s| cvtpath=|%s|\n",path,cvtname?cvtname:"null");
+    fflush(stderr);
+    if(cvtname == NULL) return -1;
+    fd = open(cvtname,flags,mode);
+    free(cvtname);    
+    return fd;
+}
+
+EXTERNL
+int
+NCopen2(const char *path, int flags)
+{
+    return NCopen3(path,flags,0);
+}
+
+#endif /*WINPATH*/
diff --git a/m4/empty b/libdispatch/heap
similarity index 100%
rename from m4/empty
rename to libdispatch/heap
diff --git a/libdispatch/json.c b/libdispatch/json.c
new file mode 100644
index 0000000..4196885
--- /dev/null
+++ b/libdispatch/json.c
@@ -0,0 +1,372 @@
+/* Copyright 2016, UCAR/Unidata.
+   See the LICENSE file for more information.
+*/
+
+#ifndef NCJSON_INC
+#define NCJSON_INC 1
+
+#define NCJ_DICT     1 
+#define NCJ_LIST     2
+#define NCJ_WORD     3
+#define NCJ_NUMBER   4
+#define NCJ_BOOLEAN  5
+
+/* Don't bother with unions */
+typedef struct NCjson {
+    long sort;
+    char* word; /* string or (!boolean && !number) */
+    long long num; /* number || boolean (0=>false; !0=>true)*/
+    NCjson* list;
+} NCjson;
+
+#define NCJ_LBRACKET '['
+#define NCJ_RBRACKET ']'
+#define NCJ_LBRACE '{'
+#define NCJ_RBRACE '}'
+#define NCJ_COLON ':'
+#define NCJ_COMMA ','
+#define NCJ_QUOTE '"'
+#define NCJ_TRUE "true"
+#define NCJ_FALSE "false"
+
+#define NCJ_WORD "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-$"
+
+/*//////////////////////////////////////////////////*/
+
+typedef struct NCJparser {
+    char* text;
+    char* pos;
+    char* yytext;
+    int errno;
+    struct {
+        char* yytext;
+	int token;
+    } pushback;
+} NCJparser;
+
+static int
+NCjsonparse(char* text, NCjson** treep)
+{
+    int status = NCJ_OK;
+    size_t len;
+    NCJparser parser = NULL;
+    NCjson* tree = NULL;
+    if(text == NULL) {status = NCJ_EINVAL; goto done;}
+    parser = calloc(1,sizeof(NCJparser));
+    if(parser == NULL) {status = NCJ_ENOMEM; goto done;}
+    len = strlen(text);
+    parser->text = (char*)malloc(len+1+1);
+    if(parser->text == NULL) {status = NCJ_ENOMEM; goto done;}
+    strcpy(parser->text,text);
+    parser->text[len] = '\0';
+    parser->text[len+1] = '\0';
+    tree = NCJparseR(parser);
+done:
+    if(parser != NULL) {
+	nullfree(parser->text);
+	nullfree(parser->yytext);
+	free(parser);
+    }
+    if(status != NCJ_OK) {
+	if(tree != NULL) NCjsonfree(tree);
+    } else
+	if(treep) *treep = tree;
+    return status;
+}
+
+static int
+NCJyytext(NCJparser* parser, char* start, ptrdiff_t pdlen)
+{
+    size_t len = (size_t)pdlen;    
+    if(parser->yytext == NULL)
+	parser->yytext = (char*)malloc(len+1);
+    else
+	parser->yytext = (char*) realloc(parser->yytext,len+1);
+    if(parser->yytext == NULL) return NCJ_ENOMEM;
+    memcpy(parser->yytext,start,len);
+    parser->yytext[len] = NCJ_NUL;
+    return NCJ_OK;
+}
+
+static void
+NCJpushback(NCJparser* parser, int token)
+{
+    parser->pushback.token = token;
+    parser->pushback.yytext = strdup(parser->yytext);
+}
+
+static int
+NCJlex(NCJparser* parser)
+{
+    int c;
+    int token = NCJ_NUL;
+    char* start;
+    char* next;
+
+    if(parser->pushback.token != NCJ_NOTOKEN) {
+	token = parser->pushback.token;
+	NCJyytext(parser,parser->pushback.yytext,strlen(parser->pushback.yytext));
+	nullfree(parser->pushback.yytext);
+	parser->pushback.yytext = NULL;
+	parser->pushback.token = NCJ_NOTOKEN;
+	return token;
+    }
+
+    c = *parser->pos;
+    if(c == NCJ_NUL) {
+	token = NCJ_NUL;
+    } else if(strchr(NCJ_WORD, c) != NULL) {
+	size_t len;
+        start = parser->pos;
+        next = start + 1;
+	for(;;) {
+	    c = *parser->pos++;
+	    if(strchr(NCJ_WHITESPACE,c) != NULL || c == NCJ_NUL) break;
+	    last++;
+	}
+	if(!NCJyytext(parser,start,(next - start))) goto done;
+	token = NCJ_WORD;
+    } else if(c == NCJ_QUOTE) {
+	parser->pos++;
+	start = parser->pos;
+	next = start+1;
+	for(;;) {
+	    c = *parser->pos++;
+	    if(c == NCJ_QUOTE || c == NCJ_NUL) break;
+	    last++;	    
+	}
+	if(c == NCJ_NUL) {
+	    parser->errno = NCJ_ESTRING;
+	    token = NCJ_ERR;
+	    goto done;
+	}	    
+	if(!NCJyytext(parser,start,(next - start))) goto done;
+	token = NCJ_STRING;
+    } else { /* single char token */
+	token = *parser->pos++;
+    }
+done:
+    if(parser->errno) token = NCJ_ERR;
+    return token;    
+}
+
+/* Simple recursive descent */
+
+static int
+NCJparseR(NCJparser* parser, NCjson** listp)
+{
+    int token = NCJ_ERR;
+    NCjson* list = NULL;
+    if((token = NCJlex(parser)) == NCJ_ERR) goto done;
+    switch (token) {
+    case NCJ_NUL;
+	break;
+    case NCJ_WORD:
+        NCJappend(NCJparseAtomic(parser,token),listp);
+	break;
+    case NCJ_LBRACE:
+	NCJappend(NCJparseMap(parser,locallist),listp);
+	break;
+    case NCJ_LBRACKET:
+        NCJappend(NCJparseArray(parser,NULL),)
+    case NCJ_STRING:
+        return NCJparseAtomic(parser,token);
+    default:
+	parser->errno = NCJ_EBADTOKEN;
+    }
+    return NULL;	
+}
+
+static NCjson*
+NCJparseAtomic(NCJparser* parser, int kind)
+{
+    /* assert (kind == NCJ_WORD || kind = NCJ_QUOTE) */
+    NCjson* node;
+    if((node = NCJmakenode(parser)) == NULL)
+	{parser->errno = NCJ_ENOMEM; goto done;}
+    if(kind == NCJ_STRING)
+        node->sort = NCJ_WORD;
+        node->word = strdup(parser->yytext);
+    } else {
+	/* Try to convert to number or boolean; last resort is word */
+        size_t count = (last - start) + 1;
+	int nread = 0;
+	int ncvt = sscan(parser->yytext,
+			 "%L",&node->num,&nread);
+	if(ncvt == 1 && nread == count) {
+	    node->sort = NCJ_NUMBER;
+	} else if(strcasecmp(parser->yytext,NCJ_TRUE)==0) {
+	    node->sort = NCJ_BOOLEAN;
+	    node->num = 1;
+	} else if(strcasecmp(parser->yytext,NCJ_FALSE)==0) {
+	    node->sort = NCJ_BOOLEAN;
+	    node->num = 0;
+	} else {
+	    node->word = strdup(parser->yytext);
+	    node->sort = NCJ_WORD;
+        }
+    }
+done:
+    return node;
+}
+
+static NCjson*
+NCJparseArray(NCJparser* parser)
+{
+    NCjson* head = NULL;
+    NCjson* last = NULL;
+    int token = NCJ_ERR;
+#if 0
+    if((node = NCJmakenode(parser)) == NULL) goto done;
+#endif
+    loop:
+    for(;;) {
+        if((token = NCJlex(parser)) == NCJ_ERR) goto done;
+        switch (token) {
+        case NCJ_NUL;
+            break;
+        case NCJ_RBRACKET:
+	    break loop;
+        default:
+	    NCJpushback(parser,token);
+            NCjson* o = NCJparseR(parser);
+            tokens.nextToken();
+            if(tokens.ttype == NCJ_EOF) break;
+            else if(tokens.ttype == RBRACKET) tokens.pushBack();
+            else if(tokens.ttype != COMMA)
+                throw new IOException("Missing comma in list");
+            array.add(o);
+        }
+    }
+    return array;
+}
+
+static NCjson parseMap(StreamTokenizer tokens)
+{
+    assert (tokens.ttype == LBRACE);
+    Map<char*, Object> map = new LinkedHashMap<>();  /* Keep insertion order */
+    loop:
+    for(; ; ) {
+        int token = tokens.nextToken();
+        switch (token) {
+        case NCJ_NCJ_EOL:
+            break; /* ignore */
+        case NCJ_NCJ_EOF:
+            throw new IOException("Unexpected eof");
+        case NCJ_RBRACE:
+            break loop;
+        default:
+            tokens.pushBack();
+            NCjson name = parseR(tokens);
+            if(tokens.ttype == NCJ_EOF) break;
+            if(name instanceof char*
+                    || name instanceof Long
+                    || name instanceof Boolean) {
+                  /*ok*/
+            } else
+                throw new IOException("Unexpected map name type: " + name);
+            if(tokens.nextToken() != COLON)
+                throw new IOException("Expected ':'; found: " + tokens.ttype);
+            NCjson o = parseR(tokens);
+            tokens.nextToken();
+            if(tokens.ttype == NCJ_EOF) break;
+            else if(tokens.ttype == RBRACE) tokens.pushBack();
+            else if(tokens.ttype != COMMA)
+                throw new IOException("Missing comma in list");
+            map.put(name.tochar*(), o);
+        }
+    }
+    return map;
+}
+}
+
+static char* tochar*(Object o) {return tochar*(o,"");}
+
+static char* tochar*(Object o, char* demark)
+{
+char*Builder buf = new char*Builder();
+tochar*R(o, buf, demark, 0);
+return buf.tochar*();
+}
+
+static static void tochar*R(Object o, char*Builder buf, char* demark, int indent)
+{
+boolean first = true;
+if(o instanceof List) {
+    List<Object> list = (List<Object>) o;
+    if(list.size()== 0) {
+        buf.append(LBRACKET);
+        buf.append(RBRACKET);
+    } else {
+        buf.append(LBRACKET);
+        buf.append('\n');
+        for(int i=0;i<list.size();i++) {
+            NCjson e = list.get(i);
+            buf.append(indent(indent));
+            tochar*R(e, buf, demark, indent + 2);
+            if(i < list.size()-1) buf.append(",");
+            buf.append("\n");
+        }
+        buf.append(indent(indent));
+        buf.append(RBRACKET);
+    }
+} else if(o instanceof Map) {
+    Map<char*, Object> map = (Map<char*, Object>) o;
+    if(map.size() == 0) {
+        buf.append(LBRACE);
+        buf.append(RBRACE);
+    } else {
+        buf.append(LBRACE);
+        buf.append('\n');
+        int i = 0;
+        for(Map.Entry<char*, Object> e : map.entrySet()) {
+            buf.append(indent(indent + 2));
+            buf.append(QUOTE);
+            buf.append(e.getKey().replace("\"","\\\""));
+            buf.append(QUOTE);
+            buf.append(' ');
+            buf.append(COLON);
+            buf.append(' ');
+            tochar*R(e.getValue(), buf, demark, indent + 2);
+            if(i < map.size() - 1) buf.append(",");
+            buf.append("\n");
+            i++;
+        }
+        buf.append(indent(indent));
+        buf.append(RBRACE);
+    }
+} else if((o instanceof Long) || (o instanceof Boolean)) {
+    buf.append(demark);
+    buf.append(o.tochar*());
+    buf.append(demark);
+} else {
+    buf.append(QUOTE);
+    buf.append(o.tochar*().replace("\"","\\\""));
+    buf.append(QUOTE);
+}
+}
+
+static char* blanks = "                                                  ";
+
+static static char* indent(int n)
+{
+while(n > blanks.length()) {
+    blanks = blanks + blanks;
+}
+return blanks.substring(0, n);
+}
+
+}
+
+static NCjson*
+NCJmakenode(NCjsonparser* parser)
+{
+    NCjson* node = NULL;
+    parser->errno = NCJ_OK;
+    node = (NCjson*)calloc(1,sizeof(NCjson));
+    if(node == null) parser->errno = NCJ_ENOMEM;
+    return node;
+}
+
+
+#endif /*NCJSON_INC*/
diff --git a/libdispatch/nc.c b/libdispatch/nc.c
index a8c8ab5..f19b99f 100644
--- a/libdispatch/nc.c
+++ b/libdispatch/nc.c
@@ -3,7 +3,7 @@
  *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 
-#include <config.h>
+#include "config.h"
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
@@ -18,6 +18,8 @@
 #include "nc.h"
 #include "ncdispatch.h"
 
+int ncdebug = 0;
+
 /* This is the default create format for nc_create and nc__create. */
 static int default_create_format = NC_FORMAT_CLASSIC;
 
diff --git a/libdispatch/ncbytes.c b/libdispatch/ncbytes.c
index 76ceced..6618986 100644
--- a/libdispatch/ncbytes.c
+++ b/libdispatch/ncbytes.c
@@ -193,7 +193,6 @@ ncbytessetcontents(NCbytes* bb, char* contents, unsigned long alloc)
 }
 
 /* Null terminate the byte string without extending its length */
-/* For debugging */
 int
 ncbytesnull(NCbytes* bb)
 {
@@ -202,3 +201,16 @@ ncbytesnull(NCbytes* bb)
     return 1;
 }
 
+/* Remove char at position i */
+int
+ncbytesremove(NCbytes* bb, unsigned long pos)
+{
+    if(bb == NULL) return ncbytesfail();
+    if(bb->length <= pos) return ncbytesfail();
+    if(pos < (bb->length - 1)) {
+	int copylen = (bb->length - pos) - 1;
+        memmove(bb->content+pos,bb->content+pos+1,copylen);
+    }
+    bb->length--;
+    return TRUE;
+}
diff --git a/libdispatch/nclist.c b/libdispatch/nclist.c
index 9bcd9a0..15142c4 100644
--- a/libdispatch/nclist.c
+++ b/libdispatch/nclist.c
@@ -47,6 +47,21 @@ nclistfree(NClist* l)
   return TRUE;
 }
 
+/*
+Free a list and its contents
+*/
+int
+nclistfreeall(NClist* l)
+{
+  unsigned long i;
+  if(l == NULL) return TRUE;
+  for(i=0;i<l->length;i++) {
+      void* value = l->content[i];
+      if(value != NULL) free(value);
+  }
+  return nclistfree(l);
+}
+
 int
 nclistsetalloc(NClist* l, unsigned long sz)
 {
@@ -81,6 +96,7 @@ nclistget(NClist* l, unsigned long index)
   return l->content[index];
 }
 
+/* Insert at position i of l; will overwrite previous value */
 int
 nclistset(NClist* l, unsigned long index, void* elem)
 {
@@ -94,11 +110,11 @@ nclistset(NClist* l, unsigned long index, void* elem)
 int
 nclistinsert(NClist* l, unsigned long index, void* elem)
 {
-  int i; /* do not make unsigned */
+  long i; /* do not make unsigned */
   if(l == NULL) return FALSE;
   if(index > l->length) return FALSE;
   nclistsetalloc(l,0);
-  for(i=(int)l->length;i>index;i--) l->content[i] = l->content[i-1];
+  for(i=(long)l->length;i>index;i--) l->content[i] = l->content[i-1];
   l->content[index] = elem;
   l->length++;
   return TRUE;
@@ -183,8 +199,6 @@ nclistelemremove(NClist* l, void* elem)
 }
 
 
-
-
 /* Extends nclist to include a unique operator 
    which remove duplicate values; NULL values removed
    return value is always 1.
@@ -219,3 +233,13 @@ nclistclone(NClist* l)
     clone->content = nclistdup(l);
     return clone;
 }
+
+void*
+nclistextract(NClist* l)
+{
+    void* result = l->content;
+    l->alloc = 0;
+    l->length = 0;
+    l->content = NULL;
+    return result;
+}
diff --git a/libdispatch/nclistmgr.c b/libdispatch/nclistmgr.c
index d804835..13679f0 100644
--- a/libdispatch/nclistmgr.c
+++ b/libdispatch/nclistmgr.c
@@ -3,7 +3,7 @@
    copying and redistribution conditions.
  *********************************************************************/
 
-#include <config.h>
+#include "config.h"
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
diff --git a/libdispatch/nclog.c b/libdispatch/nclog.c
index 6bb5f21..d06d0ba 100644
--- a/libdispatch/nclog.c
+++ b/libdispatch/nclog.c
@@ -12,9 +12,11 @@
 
 #include <stdlib.h>
 #include <stdio.h>
-#include <fcntl.h>
 #include <stdarg.h>
 #include <string.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
 
 #include "nclog.h"
 
diff --git a/libdispatch/ncuri.c b/libdispatch/ncuri.c
index b29b106..2d922ce 100644
--- a/libdispatch/ncuri.c
+++ b/libdispatch/ncuri.c
@@ -10,6 +10,8 @@
 #include <assert.h>
 
 #include "ncuri.h"
+#include "ncbytes.h"
+#include "nclist.h"
 
 /* Include netcdf.h to allow access to
    NC_ error return codes. */
@@ -18,18 +20,19 @@
 #define NCURIDEBUG
 
 #ifdef NCURIDEBUG
-static int failpoint = 0;
-#define THROW(n) {failpoint=(n); goto fail;}
+#define THROW(n) {ret=(n); goto done;}
 #else
-#define THROW(n) {goto fail;}
+#define THROW(n) {goto done;}
 #endif
 
-
 #define PADDING 8
 
 #define LBRACKET '['
 #define RBRACKET ']'
 #define EOFCHAR '\0'
+#define RBRACKETSTR "]"
+
+#define DRIVELETTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
 #ifndef FIX
 #define FIX(s) ((s)==NULL?"NULL":(s))
@@ -47,18 +50,11 @@ static int failpoint = 0;
 
 #define endof(p) ((p)+strlen(p))
 
-static struct NC_ProtocolInfo {
-char* name;
-int   filelike; /* 1=>this protocol has no host, user+pwd, or port */
-} legalprotocols[] = {
-{"file",1},
-{"http",0},
-{"https",0},
-{"ftp",0},
-};
+#define lshift(buf,buflen) {memmove(buf,buf+1,buflen+1);}
+#define rshift(buf,buflen) {memmove(buf+1,buf,buflen+1);}
 
 /* Allowable character sets for encode */
-static char* fileallow =
+static char* pathallow =
 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$&'()*+,-./:;=?@_~";
 
 static char* queryallow =
@@ -80,319 +76,393 @@ ncstrndup(const char* s, size_t len)
 }
 #endif
 /* Forward */
-static void ncparamfree(char** params);
+static int collectprefixparams(char* text, char** nextp);
+static void freestringlist(NClist* list);
+static void freestringvec(char** list);
 static int ncfind(char** params, const char* key);
-static void nclshift1(char* p);
-static void ncrshift1(char* p);
 static char* nclocate(char* p, const char* charlist);
-static void ncappendparams(char* newuri, char** p);
+static int parselist(char* ptext, NClist* list);
+
+/**************************************************/
+/*
+A note about parameter support:
+In the original url format for opendap (dap2), client parameters were
+assumed to be one or more instances of bracketed pairs: e.g
+    "[...][...]...".
+These were assumed to be placed at the front of the url.  In this newer
+version, the parameters may be encoded after a trailing # character each
+separated by ampersand (&).  For back compatibility, the bracketed
+parameter form is supported. However, if ncuribuild is used, all
+parameters will be converted to the
+    #...&...& format.
+In any case, each parameter in turn is assumed to be a of the form
+<name>=<value> or <name>; e.g. #x=y&z&a=b&w.
+If the same parameter is specified more than once, then the first
+occurrence is used; this is so that is possible to forcibly override
+user specified parameters by prefixing.
+IMPORTANT: the client parameter string is assumed to have blanks compressed out.
+*/
+
+/**************************************************/
 
-/* Do a simple uri parse: return 0 if fail, 1 otherwise*/
+/* Do a simple uri parse: return NCU_OK if success, NCU_XXX if failed */
 int
 ncuriparse(const char* uri0, NCURI** durip)
 {
-    NCURI* duri = NULL;
-    char* uri = NULL;
+    int ret = NCU_OK;
+    NCURI tmp;
     char* p;
-    struct NC_ProtocolInfo* proto;
-    int i,nprotos;
-
-    /* accumulate parse points*/
-    char* protocol = NULL;
-    char* host = NULL;
-    char* port = NULL;
-    char* constraint = NULL;
-    char* user = NULL;
-    char* pwd = NULL;
-    char* file = NULL;
-    char* prefixparams = NULL;
-    char* suffixparams = NULL;
-
-    if(uri0 == NULL || strlen(uri0) == 0)
-	{THROW(1);}
-
-    duri = (NCURI*)calloc(1,sizeof(NCURI));
-    if(duri == NULL)
-      {THROW(2);}
-
-    /* save original uri */
-    duri->uri = nulldup(uri0);
+    char* q;
+    int isfile;
+    int hashost;
+    char* uri = NULL;
+    NCURI* duri = NULL;
+    char* prefix = NULL;
+    char* next = NULL;
+    NClist* params = nclistnew();
+    NClist* querylist = nclistnew();
+    size_t len0;
+    int pathchar;
+
+    if(uri0 == NULL)
+	{THROW(NCU_EBADURL);}
+
+    len0 = strlen(uri0);
+    if(len0 == 0)
+	{THROW(NCU_EBADURL);}
+
+    /* Create a local NCURI instance to hold
+       pointers into the parsed string
+    */
+    memset(&tmp,0,sizeof(tmp));
 
-    /* make local copy of uri */
-    uri = (char*)malloc(strlen(uri0)+1+PADDING); /* +1 for trailing null,
-                                                    +PADDING for shifting */
+    /* make mutable copy. Add some extra space
+       because we will need to null terminate the host section
+       without losing the first character of the path section.
+    */
+    uri = (char*)malloc(len0+1+1); /* +2 for nul term and for host section terminator */
     if(uri == NULL)
-	{THROW(3);}
-
-    /* strings will be broken into pieces with intermixed '\0; characters;
-       first char is guaranteed to be '\0' */
-
-    duri->strings = uri;
-    uri++;
-
-    /* dup the incoming url */
-    strcpy(uri,uri0);
+	{THROW(NCU_ENOMEM);}
+    strncpy(uri,uri0,len0+1);
 
     /* Walk the uri and do the following:
-	1. remove all whitespace
-	2. remove all '\\' (Temp hack to remove escape characters
-                            inserted by Windows or MinGW)
+	1. remove leading and trailing whitespace
+	2. convert all '\\' -> '\' (Temp hack to remove escape characters
+                                    inserted by Windows or MinGW)
     */
-    for(p=uri;*p;p++) {
-	if(*p == '\\' || *p < ' ')
-	    nclshift1(p); /* compress out */
-    }
+    for(q=uri,p=uri;*p;p++) {if((*p == '\\' && p[1] == '\\') || *p < ' ') {continue;} else {*q++ = *p;}}
+    *q = '\0';
 
     p = uri;
 
-    /* break up the uri string into big chunks: prefixparams, protocol,
-       host section, and the file section (i.e. remainder)
-    */
-
-    /* collect any prefix bracketed parameters */
+    /* break up the url into coarse pieces */
     if(*p == LBRACKET) {
-	prefixparams = p+1;
-	/* find end of the clientparams; convert LB,RB to '&' */
-        for(;*p;p++) {
-	    if(p[0] == RBRACKET && p[1] == LBRACKET) {
-		p[0] = '&';
-		nclshift1(p+1);
-	    } else if(p[0] == RBRACKET && p[1] != LBRACKET)
-		break;
+        prefix = p;
+        ret = collectprefixparams(p,&next); /* collect the prefix */
+        if(ret != NCU_OK)
+            {THROW(NCU_EBADURL);}
+         p = next;
+    } else {
+	prefix = NULL;
+    }
+    tmp.uri = p; /* will be the core */
+    /* Skip past the core of the url */
+    next = nclocate(p,"?#");
+    if(next != NULL) {
+	int c = *next;
+	terminate(next);
+	next++;
+	if(c == '?') {
+	    tmp.query = next;
+	    next = nclocate(next,"#");
+	    if(next == NULL)
+		tmp.fragment = NULL;
+	    else {
+		terminate(next);
+		next++;
+	        tmp.fragment = next;
+	    }
+	} else { /*c == '#'*/
+	    tmp.fragment = next;
+	}	    
+    }
+
+    /* Parse the prefix parameters */
+    if(prefix != NULL) {
+        if(parselist(prefix,params) != NCU_OK)
+            {THROW(NCU_EBADURL);}
+    }
+    /* Parse the fragment parameters */
+    if(tmp.fragment != NULL) {
+        if(parselist(tmp.fragment,params) != NCU_OK)
+            {THROW(NCU_EBADURL);}
+    }
+    if(nclistlength(params) > 0) {
+	nclistpush(params,NULL);
+        tmp.fraglist = nclistextract(params);
+    } else
+	tmp.fraglist = NULL;
+    /* Parse the query */
+    if(tmp.query != NULL) {
+        if(parselist(tmp.query,querylist) != NCU_OK)
+            {THROW(NCU_EBADURL);}
+        if(nclistlength(querylist) > 0) {
+	    nclistpush(querylist,NULL);
+            tmp.querylist = nclistextract(querylist);
 	}
-	if(*p == 0)
-	    {THROW(4); /* malformed client params*/}
-        terminate(p); /* nul term the prefixparams (overwrites
-                         the final RBRACKET) */
-	p++; /* move past the final RBRACKET */
-    }
+    }    
+
+    /* Now parse the core of the url */
+    p = tmp.uri;
 
-    /* Tag the protocol */
-    protocol = p;
+    /* Mark the protocol */
+    tmp.protocol = p;
     p = strchr(p,':');
     if(!p)
-	{THROW(5);}
+	{THROW(NCU_EBADURL);}
     terminate(p); /*overwrite colon*/
     p++; /* skip the colon */
+    if(strlen(tmp.protocol)==0)
+	{THROW(NCU_EBADURL);}
+    /*
+       The legal formats for file: urls are a problem since
+       many variants are often accepted.
+       By RFC, the proper general format is: file://host/path,
+       where the 'host' can be omitted and defaults to 'localhost'.
+       and the path includes the leading '/'.
+       So, assuming no host, the format is: "file:///path".
+       Some implementations, however, ignore the host, and allow
+       the format: file:/path.
+       We also simplify things by assuming the host part is always empty.
+       which means we can have file:///path, but not file://..../path.
+       Note in all cases, the leading '/' is considered part of the path,
+       which is then assumed to be an absolute path. But also note that
+       the windows drive letter has to be taken into account. Our rule is that
+       if the path looks like D:..., 
+       where D is a single alphabetic letter (a-z or A-Z),
+       then it is a windows path and can be use in place of a /path.
+       The rules implemented here (for file:) are then as follows
+       1. file:D:... : assume D: is a windows drive letter and treat D:... as the path
+       2. file:/X, where X does not start with a slash: treat /X as the path.
+       3. file://D:... : assume D: is a windows drive letter and treat as the path
+       4. file:///X, where X does not start with a slash: treat /X as the path.
+       All other cases are disallowed: specifically including file://X.
+    */
 
-    /* verify that the uri starts with an acceptable protocol*/
-    nprotos = (sizeof(legalprotocols)/sizeof(struct NC_ProtocolInfo));
-    proto = NULL;
-    for(i=0;i<nprotos;i++) {
-        if(strcmp(protocol,legalprotocols[i].name)==0) {
-	    proto = &legalprotocols[i];
-	    break;
-	}
-    }
-    if(proto == NULL)
-	{THROW(6); /* illegal protocol*/}
-
-    /* skip // */
-    if(p[0] != '/' || p[1] != '/')
-	{THROW(7);}
-    p += 2;
-
-    /* If this is all we have (proto://) then fail */
-    if(*p == EOFCHAR)
-	{THROW(8);}
-
-    /* establish the start of the file section */
-    if(proto->filelike) {/* everything after proto:// */
-	file = p;
-	host = NULL; /* and no host section */
-    } else { /*!proto->filelike => This means there should be a host section */
-        /* locate the end of the host section and therefore the start
-           of the file section */
-	host = p;
-        p  = nclocate(p,"/?#");
-	if(p == NULL) {
-	    file = endof(host); /* there is no file section */
+    isfile = (strcmp(tmp.protocol,"file")==0);
+    if(isfile) {
+	int l = strlen(p); /* to test if we have enough characters */
+	hashost = 0; /* always */
+	if(l >= 2 && p[1] == ':' && strchr(DRIVELETTERS,p[0]) != NULL) { /* case 1 */
+	    p = p; /* p points to the start of the path */
+        } else if(l >= 2 && p[0] == '/' && p[1] != '/') { /* case 2 */
+	    p = p; /* p points to the start of the path */
+	} else if(l >= 4 && p[0] == '/' && p[1] == '/'
+		&& p[3] == ':' && strchr(DRIVELETTERS,p[2]) != NULL) { /* case 3 */
+	    p = p+2; /* points to the start of the windows path */
+        } else if(l >= 4 && p[0] == '/' && p[1] == '/' && p[2] == '/' && p[3] != '/') { /* case 4 */
+	    p += 2; /* points to the start of the path */
+        } else /* everything else is illegal */
+	    {THROW(NCU_EPATH);}
+    } else {
+        if(p[0] != '/' || p[1] != '/') /* must be proto:// */
+	    {THROW(NCU_EPATH);}
+	p += 2;
+        hashost = 1; /* Assume we have a hostname */
+    }
+    if(!hashost) {
+        tmp.path = p;
+	pathchar = EOFCHAR;
+    } else { /* assume there should be a host section */
+	/* We already extracted the query and/or fragment sections above,
+           splocate the end of the host section and therefore the start
+           of the path.
+        */
+	tmp.host = p;
+        p  = nclocate(p,"/");
+	if(p == NULL) { /* no path */
+	    tmp.path = NULL; /* default */
+	    pathchar = EOFCHAR;
 	} else {
-	    ncrshift1(p); /* make room to terminate the host section
-                             without overwriting the leading character */
-	    terminate(p); /* terminate the host section */
-	    file = p+1; /* +1 becauseof the shift */
+	    tmp.path = p; /* save ptr to rest of the path */
+	    pathchar = *p; /* save leading char of the path */
+	    terminate(p); /* overwrite the leading char of the path; restored below */
 	}
     }
+    /* Nullify tmp.host for consistency */
+    if(tmp.host != NULL && strlen(tmp.host)==0) {tmp.host = NULL;}
 
-    /* If you shift in the code below, you must reset file beginning */
-
-    if(host != NULL) {/* Parse the host section */
+    if(tmp.host != NULL) {/* Parse the host section */
+        char* pp;
 	/* Check for leading user:pwd@ */
-        p = strchr(host,'@');
-        if(p) {
-	    if(p == host)
-		{THROW(9); /* we have proto://@ */}
-	    user = host;
-	    terminate(p); /* overwrite '@' */
-	    host = p+1; /* start of host ip name */
-	    p = strchr(user,':');
- 	    if(p == NULL)
-		{THROW(10); /* malformed */}
-	    terminate(p); /*overwrite colon */
-	    pwd = p+1;
+        char* newhost = strchr(tmp.host,'@');
+        if(newhost != NULL) {
+	    size_t rem;
+	    if(newhost == tmp.host)
+		{THROW(NCU_EUSRPWD);} /* we have proto://@ */
+	    terminate(newhost); /* overwrite '@' */
+	    newhost++; /* should point past usr+pwd */
+	    tmp.user = tmp.host;
+	    /* Break user+pwd into two pieces */
+	    pp = strchr(tmp.user,':');
+	    if(pp == NULL)
+		{THROW(NCU_EUSRPWD);} /* we have user only */
+	    terminate(pp); /* overwrite ':' */
+	    pp++;
+	    if(strlen(tmp.user)==0)
+		{THROW(NCU_EUSRPWD);} /* we have empty user */
+	    if(strlen(pp)==0)
+		{THROW(NCU_EUSRPWD);} /* we have empty password */
+	    tmp.password = pp;	    
+	    /* compress usr+pwd out of tmp.host */
+	    rem = strlen(newhost);
+	    memmove(tmp.host,newhost,rem);
+	    tmp.host[rem] = EOFCHAR;
 	}
-
-        /* extract host and port */
-	p = host;
-        p = strchr(p,':');
-        if(p != NULL) {
-	    terminate(p);
-	    p++;
-	    port = p;
-	    if(*port == EOFCHAR)
-		{THROW(11); /* we have proto://...:/ */}
+	/* Breakup host into host + port */
+	pp = tmp.host;
+        pp = strchr(pp,':');
+        if(pp != NULL) { /* there is a port */
+	    terminate(pp); /* overwrite ':' */
+	    pp++; /* skip colon */
+	    if(strlen(tmp.host) == 0)
+		{THROW(NCU_EBADURL);} /* empty host */
+	    if(strlen(pp)==0)
+		{THROW(NCU_EBADURL);} /* empty port */
+	    tmp.port = pp;
 	    /* The port must look something like a number */
-	    for(;*p;p++) {
-	        if(strchr("0123456789-",*p) == NULL)
-		    {THROW(12);  /* probably not a real port, fail */}
+	    for(pp=tmp.port;*pp;pp++) {
+	        if(strchr("0123456789-",*pp) == NULL)
+		    {THROW(NCU_EPORT);}  /* probably not a real port, fail */
 	    }
-	} /* else *p == NULL */
-
-
-        /* check for empty host section */
-	if(*host == EOFCHAR)
-	    {THROW(13);}
-
-    }
-
-    assert(file != NULL);
-    p = file;
-
-    /* find the end of the file section and the start of the
-       constraints and/or suffixparams
-    */
-    p = nclocate(p,"?#");
-    if(p != NULL) { /* we have constraint and/or suffixparams */
-	char* fileend = p; /* save the end of the file section */
-	char* constraintend = NULL;
-	if(*p == '?')
-            constraint = p+1;
-	else
-	    constraint = NULL;
-	p = strchr(p,'#'); /* may repeat effect of nclocate above */
-	if(p != NULL) {
-	    constraintend = p;
-	    suffixparams = p+1;
-	} else
-	    suffixparams = NULL;
-	/* Ok, terminate the pieces */
-	terminate(fileend); /* terminate file section */
-	if(constraint != NULL && constraintend != NULL)
-	    terminate(constraintend);
-	/* Suffix params are already terminated
-           since they should be the last section
-           of the original url
-        */
+	} /* else no port */
     }
 
-    /* check for empty sections */
-    if(file != NULL && *file == EOFCHAR)
-	file = NULL; /* empty file section */
-    if(constraint != NULL && *constraint == EOFCHAR)
-	constraint = NULL; /* empty constraint section */
-    if(suffixparams != NULL && *suffixparams == EOFCHAR)
-	suffixparams = NULL; /* empty suffixparams section */
-
-    if(suffixparams != NULL) {
-	/* there really are suffix params; so rebuild the suffix params */
-	if(*suffixparams == LBRACKET) suffixparams++;
-        p = suffixparams;
-	/* convert RBRACKET LBRACKET to '&' */
-        for(;*p;p++) {
-	    if(p[0] == RBRACKET && p[1] == LBRACKET) {
-	        p[0] = '&';
-		nclshift1(p+1);
-	    } else if(p[0] == RBRACKET && p[1] != LBRACKET) {
-		/* terminate suffixparams */
-		*p = EOFCHAR;
-		break;
-	    }
-	}
-	if(*suffixparams == EOFCHAR)
-	    suffixparams = NULL; /* suffixparams are empty */
-    }
-
-    /* do last minute empty check */
-
-    if(*protocol == EOFCHAR) protocol = NULL;
-    if(user != NULL && *user == EOFCHAR) user = NULL;
-    if(pwd != NULL && *pwd == EOFCHAR) pwd = NULL;
-    if(host != NULL && *host == EOFCHAR) host = NULL;
-    if(port != NULL && *port == EOFCHAR) port = NULL;
-    if(file != NULL && *file == EOFCHAR) file = NULL;
-    if(constraint != NULL && *constraint == EOFCHAR) constraint = NULL;
-
-    /* assemble the component pieces */
-    duri->protocol = protocol;
-    duri->user = user;
-    duri->password = pwd;
-    duri->host = host;
-    duri->port = port;
-    duri->file = file;
-
-    ncurisetconstraints(duri,constraint);
-
-    /* concat suffix and prefix params */
-    if(prefixparams != NULL || suffixparams != NULL) {
-	int plen = prefixparams ? strlen(prefixparams) : 0;
-	int slen = suffixparams ? strlen(suffixparams) : 0;
-	int space = plen + slen + 1;
-	/* add 1 for an extra ampersand if both are defined */
-        space++;
-        duri->params = (char*)malloc(space);
-	duri->params[0] = EOFCHAR; /* so we can use strcat */
-	if(plen > 0) {
-            strcat(duri->params,prefixparams);
-	    if(slen > 0)
-		strcat(duri->params,"&");
-	}
-	if(slen > 0)
-            strcat(duri->params,suffixparams);
-    }
+    /* Fill in duri from tmp */
+    duri = (NCURI*)calloc(1,sizeof(NCURI));
+    if(duri == NULL)
+      {THROW(NCU_ENOMEM);}
+    /* save original uri */
+    duri->uri = strdup(uri0);
+    duri->protocol = nulldup(tmp.protocol);
+    duri->user = nulldup(tmp.user);
+    duri->password = nulldup(tmp.password);
+    duri->host = nulldup(tmp.host);
+    duri->port = nulldup(tmp.port);
+    if(tmp.path != NULL) {
+	/* We need to add back the previously overwritten path lead char (if necessary);
+           this must be done after all host section related pieces have been captured */
+	if(pathchar != EOFCHAR)
+	    *tmp.path = pathchar;
+        duri->path = nulldup(tmp.path);
+    }
+    duri->query = nulldup(tmp.query);
+    duri->fragment = nulldup(tmp.fragment);
+    duri->fraglist = tmp.fraglist; tmp.fraglist = NULL;
+    duri->querylist = tmp.querylist; tmp.querylist = NULL;
+    if(durip) *durip = duri;
 
 #ifdef NCXDEBUG
 	{
         fprintf(stderr,"duri:");
-        fprintf(stderr," params=|%s|",FIX(duri->params));
-        fprintf(stderr," protocol=|%s|",FIX(duri->protocol));
-        fprintf(stderr," host=|%s|",FIX(duri->host));
-        fprintf(stderr," port=|%s|",FIX(duri->port));
-        fprintf(stderr," file=|%s|",FIX(duri->file));
-        fprintf(stderr," constraint=|%s|",FIX(duri->constraint));
+	fprintf(stderr," protocol=|%s|",FIX(duri->protocol));
+	fprintf(stderr," user=|%s|",FIX(duri->user));
+	fprintf(stderr," password=|%s|",FIX(duri->password));
+	fprintf(stderr," host=|%s|",FIX(duri->host));
+	fprintf(stderr," port=|%s|",FIX(duri->port));
+	fprintf(stderr," path=|%s|",FIX(duri->path));
+	fprintf(stderr," query=|%s|",FIX(duri->query));
+	fprintf(stderr," fragment=|%s|",FIX(duri->fragment));
         fprintf(stderr,"\n");
     }
 #endif
-    if(durip != NULL)
-      *durip = duri;
-    else
-      ncurifree(duri);
 
-    return 1;
+done:
+    if(uri != NULL)
+	free(uri);
+    freestringlist(params);
+    freestringlist(querylist);
+    freestringvec(tmp.fraglist);
+    freestringvec(tmp.querylist);
+    return ret;
+}
 
-fail:
-    if(duri != NULL) {
-	ncurifree(duri);
+static void
+freestringlist(NClist* list)
+{
+    if(list != NULL) {
+	int i;
+	for(i=0;i<nclistlength(list);i++) {
+	    void* p = nclistget(list,i);
+	    nullfree(p);
+	}
+        nclistfree(list);
     }
-    return 0;
+}
+
+static void
+freestringvec(char** list)
+{
+    if(list != NULL) {
+	char** p;	
+        for(p=list;*p;p++) {nullfree(*p);}
+	nullfree(list);
+    }    
 }
 
 void
 ncurifree(NCURI* duri)
 {
     if(duri == NULL) return;
-    if(duri->uri != NULL) {free(duri->uri);}
-    if(duri->params != NULL) {free(duri->params);}
-    if(duri->paramlist != NULL) ncparamfree(duri->paramlist);
-    if(duri->strings != NULL) {free(duri->strings);}
-    if(duri->constraint != NULL) {free(duri->constraint);}
-    if(duri->projection != NULL) {free(duri->projection);}
-    if(duri->selection != NULL) {free(duri->selection);}
+    nullfree(duri->uri);
+    nullfree(duri->protocol);
+    nullfree(duri->user);
+    nullfree(duri->password);
+    nullfree(duri->host);
+    nullfree(duri->port);
+    nullfree(duri->path);
+    nullfree(duri->query);
+    nullfree(duri->fragment);
+    freestringvec(duri->querylist);
+    freestringvec(duri->fraglist);
     free(duri);
 }
 
+/* Replace the protocol */
+int
+ncurisetprotocol(NCURI* duri,const char* protocol)
+{
+    nullfree(duri->protocol);
+    duri->protocol = strdup(protocol);
+    return (NCU_OK);
+}
+
+/* Replace the query */
+int
+ncurisetquery(NCURI* duri,const char* query)
+{
+    int ret = NCU_OK;
+    freestringvec(duri->querylist);    
+    nullfree(duri->query);
+    duri->query = NULL;
+    duri->querylist = NULL;
+    if(query != NULL && strlen(query) > 0) {
+	NClist* params = nclistnew();
+	duri->query = strdup(query);
+	ret = parselist(duri->query,params);
+	if(ret != NCU_OK)
+	    {THROW(NC_EURL);}
+	nclistpush(params,NULL);
+	duri->querylist = nclistextract(params);
+	nclistfree(params);
+    }
+done:
+    return ret;
+}
+
+#if 0
 /* Replace the constraints */
-void
+int
 ncurisetconstraints(NCURI* duri,const char* constraints)
 {
     char* proj = NULL;
@@ -406,7 +476,7 @@ ncurisetconstraints(NCURI* duri,const char* constraints)
     duri->projection = NULL;
     duri->selection = NULL;
 
-    if(constraints == NULL || strlen(constraints)==0) return;
+    if(constraints == NULL || strlen(constraints)==0) return (NCU_ECONSTRAINTS);
 
     duri->constraint = nulldup(constraints);
     if(*duri->constraint == '?')
@@ -431,8 +501,9 @@ ncurisetconstraints(NCURI* duri,const char* constraints)
     }
     duri->projection = proj;
     duri->selection = select;
+    return NCU_OK;
 }
-
+#endif
 
 /* Construct a complete NC URI.
    Optionally with the constraints.
@@ -444,242 +515,135 @@ ncurisetconstraints(NCURI* duri,const char* constraints)
 char*
 ncuribuild(NCURI* duri, const char* prefix, const char* suffix, int flags)
 {
-    size_t len = 0;
-    char* newuri;
-    char* tmpfile;
-    char* tmpsuffix;
-    char* tmpquery;
-    size_t nparams = 0;
-    size_t paramslen = 0;
-
-    /* if both are specified, prefix has priority */
-    int withsuffixparams = ((flags&NCURISUFFIXPARAMS)!=0
-				&& duri->params != NULL);
-    int withprefixparams = ((flags&NCURIPREFIXPARAMS)!=0
-				&& duri->params != NULL);
-    int withuserpwd = ((flags&NCURIUSERPWD)!=0
-	               && duri->user != NULL && duri->password != NULL);
-    int withconstraints = ((flags&NCURICONSTRAINTS)!=0
-	                   && duri->constraint != NULL);
+    char* newuri = NULL;
+    NCbytes* buf = ncbytesnew();
 #ifdef NEWESCAPE
-    const int encode = (flags&NCURIENCODE);
+    const int encode = (flags&NCURIENCODE ? 1 : 0);
 #else
     const int encode = 0;
 #endif
 
-    if(prefix != NULL) len += NILLEN(prefix);
-    len += (NILLEN(duri->protocol)+NILLEN("://"));
-    if(withuserpwd) {
-	len += (NILLEN(duri->user)+NILLEN(duri->password)+NILLEN(":@"));
-    }
-    len += (NILLEN(duri->host));
-    if(duri->port != NULL) {
-	len += (NILLEN(":")+NILLEN(duri->port));
-    }
-
-    tmpfile = duri->file;
-    if(encode)
-	tmpfile = ncuriencode(tmpfile,fileallow);
-    len += (NILLEN(tmpfile));
-
-    if(suffix != NULL) {
-        tmpsuffix = (char*)suffix;
-        if(encode)
-	    tmpsuffix = ncuriencode(tmpsuffix,fileallow);
-        len += (NILLEN(tmpsuffix));
-    }
+    if(prefix != NULL)
+	ncbytescat(buf,prefix);
 
-    if(withconstraints) {
-	tmpquery = duri->constraint;
-        if(encode)
-	    tmpquery = ncuriencode(tmpquery,queryallow);
-        len += (NILLEN("?")+NILLEN(tmpquery));
-    }
+    ncbytescat(buf,duri->protocol);
+    ncbytescat(buf,"://"); /* this will produce file:///... */
 
-    if(withprefixparams || withsuffixparams) {
-	char** p;
-	if(duri->paramlist == NULL)
-	    if(!ncuridecodeparams(duri))
-		return NULL;
-	for(paramslen=0,nparams=0,p=duri->paramlist;*p;p++) {
-	    nparams++;
-	    paramslen += NILLEN(*p);
-	}
-	if(nparams % 2 == 1)
-	    return NULL; /* malformed */
-	nparams = (nparams / 2);
-	len += paramslen;
-	len += 3*nparams; /* for brackets for every param plus possible = */
-	if(withsuffixparams)
-	    len += strlen("#");
-    }
-
-    len += 1; /* null terminator */
-
-    newuri = (char*)malloc(len);
-    if(newuri == NULL) return NULL;
-
-    newuri[0] = EOFCHAR;
-    if(prefix != NULL) strcat(newuri,prefix);
-    if(withprefixparams) {
-	ncappendparams(newuri,duri->paramlist);
-    }
-    if(duri->protocol != NULL)
-	strcat(newuri,duri->protocol);
-    strcat(newuri,"://");
-    if(withuserpwd) {
-        strcat(newuri,duri->user);
-        strcat(newuri,":");
-        strcat(newuri,duri->password);
-        strcat(newuri,"@");
-    }
-    if(duri->host != NULL) { /* may be null if using file: protocol */
-        strcat(newuri,duri->host);
+    if((flags & NCURIPWD) && duri->user != NULL && duri->password != NULL) {
+	ncbytescat(buf,duri->user);
+	ncbytescat(buf,":");
+	ncbytescat(buf,duri->password);
+	ncbytescat(buf,"@");
     }
+    if(duri->host != NULL) ncbytescat(buf,duri->host);
     if(duri->port != NULL) {
-        strcat(newuri,":");
-        strcat(newuri,duri->port);
-    }
+	ncbytescat(buf,":");
+	ncbytescat(buf,duri->port);
+    }
+    if((flags & NCURIPATH)) {
+	if(duri->path == NULL)
+	    ncbytescat(buf,"/");
+	else if(encode) {
+	    char* encoded = ncuriencode(duri->path,pathallow);
+	    ncbytescat(buf,encoded);
+	    nullfree(encoded);
+	} else 	
+	    ncbytescat(buf,duri->path);
+    }
+
+    /* The suffix is intended to some kind of path extension (e.g. .dds)
+       so insert here
+    */
+    if(suffix != NULL)
+	ncbytescat(buf,suffix);
 
-    if(tmpfile != NULL) {
-        strcat(newuri,tmpfile);
-        if(suffix != NULL) strcat(newuri,tmpsuffix);
-    }
-    if(withconstraints) {
-	strcat(newuri,"?");
-	strcat(newuri,tmpquery);
+    if((flags & NCURIQUERY) && duri->querylist != NULL) {
+	char** p;
+	int first = 1;
+	for(p=duri->querylist;*p;p+=2,first=0) {
+	    ncbytescat(buf,(first?"?":"&"));
+	    ncbytescat(buf,p[0]);
+	    if(p[1] != NULL && strlen(p[1]) > 0) {
+		ncbytescat(buf,"=");
+		if(encode) {
+		    char* encoded = ncuriencode(p[1],queryallow);
+		    ncbytescat(buf,encoded);
+	            nullfree(encoded);
+		} else 	
+		    ncbytescat(buf,p[1]);
+	    }
+	}	
     }
-    if(withsuffixparams & !withprefixparams) {
-	strcat(newuri,"#");
-	ncappendparams(newuri,duri->paramlist);
+    if((flags & NCURIFRAG) && duri->fraglist != NULL) {
+	char** p;
+	int first = 1;
+	for(p=duri->fraglist;*p;p+=2,first=0) {
+	    ncbytescat(buf,(first?"#":"&"));
+	    ncbytescat(buf,p[0]);
+	    if(p[1] != NULL && strlen(p[1]) > 0) {
+		ncbytescat(buf,"=");
+		if(encode) {
+		    char* encoded = ncuriencode(p[1],queryallow);
+		    ncbytescat(buf,encoded);
+	            nullfree(encoded);
+		} else 	
+		    ncbytescat(buf,p[1]);
+	    }
+	}	
     }
+    ncbytesnull(buf);
+    newuri = ncbytesextract(buf);
+    ncbytesfree(buf);
     return newuri;
 }
 
-static void
-ncappendparams(char* newuri, char** p)
-{
-	while(*p) {
-	    strcat(newuri,"[");
-	    strcat(newuri,*p++);
-	    if(strlen(*p) > 0) {
-	        strcat(newuri,"=");
-	        strcat(newuri,*p);
-	    }
-	    p++;
-	    strcat(newuri,"]");
-	}
-}
-
-/**************************************************/
-/* Parameter support */
-
-/*
-In the original url, client parameters are assumed to be one
-or more instances of bracketed pairs: e.g "[...][...]...".
-They may occur either at the front, or suffixed after
-a trailing # character. After processing, the list is
-converted to an ampersand separated list of the combination
-of prefix and suffix parameters.
-
-After the url is parsed, the parameter list
-is converted to an ampersand separated list with all
-whitespace removed.
-In any case, each parameter in turn is assumed to be a
-of the form <name>=<value> or [<name>].
-e.g. [x=y][z][a=b][w].  If the same parameter is specified more
-than once, then the first occurrence is used; this is so
-that is possible to forcibly override user specified
-parameters by prefixing.  IMPORTANT: client parameter string
-is assumed to have blanks compressed out.  Returns 1 if parse
-succeeded, 0 otherwise; */
 
-int
-ncuridecodeparams(NCURI* ncuri)
+const char*
+ncurilookup(NCURI* uri, const char* key)
 {
-    char* cp = NULL;
-    int i,c;
-    size_t nparams;
-    char* params = NULL;
-    char** plist;
-
-    if(ncuri == NULL) return 0;
-    if(ncuri->params == NULL) return 1;
-
-    params = strndup(ncuri->params,
-		     (strlen(ncuri->params)+1)); /* so we can modify */
-    if(!params)
-      return NC_ENOMEM;
-
-    /* Pass 1 to break string into pieces at the ampersands
-       and count # of pairs */
-    nparams=0;
-    for(cp=params;(c=*cp);cp++) {
-	if(c == '&') {*cp = EOFCHAR; nparams++;}
-    }
-    nparams++; /* for last one */
-
-    /* plist is an env style list */
-    plist = (char**)calloc(1,sizeof(char*)*(2*nparams+1)); /* +1 for null termination */
-    if(plist == NULL) {
-      if(params) free(params);
-      return 0;
-    }
-
-    /* Break up each param into a (name,value) pair*/
-    /* and insert into the param list */
-    /* parameters of the form name name= are converted to name=""*/
-    for(cp=params,i=0;i<nparams;i++) {
-	char* next = cp+strlen(cp)+1; /* save ptr to next pair*/
-	char* vp;
-	/*break up the ith param*/
-	vp = strchr(cp,'=');
-	if(vp != NULL) {*vp = EOFCHAR; vp++;} else {vp = "";}
-	plist[2*i] = nulldup(cp);
-	plist[2*i+1] = nulldup(vp);
-	cp = next;
-    }
-    plist[2*nparams] = NULL;
-    free(params);
-    if(ncuri->paramlist != NULL)
-	ncparamfree(ncuri->paramlist);
-    ncuri->paramlist = plist;
-    return 1;
+  int i;
+  char* value = NULL;
+  if(uri == NULL || key == NULL || uri->fraglist == NULL) return NULL;
+  i = ncfind(uri->fraglist,key);
+  if(i < 0)
+    return NULL;
+  value = uri->fraglist[(2*i)+1];
+  return value;
 }
 
-int
-ncurilookup(NCURI* uri, const char* key, const char** resultp)
+const char*
+ncuriquerylookup(NCURI* uri, const char* key)
 {
   int i;
   char* value = NULL;
-  if(uri == NULL || key == NULL || uri->params == NULL) return 0;
-  if(uri->paramlist == NULL) {
-	i = ncuridecodeparams(uri);
-	if(!i) return 0;
-  }
-  /* Coverity[FORWARD_NULL] */
-  i = ncfind(uri->paramlist,key);
+  if(uri == NULL || key == NULL || uri->querylist == NULL) return NULL;
+  i = ncfind(uri->querylist,key);
   if(i < 0)
-	return 0;
-
-  if(uri->paramlist) {
-    value = uri->paramlist[(2*i)+1];
-    if(resultp) *resultp = value;
-  }
-
-  return 1;
+    return NULL;
+  value = uri->querylist[(2*i)+1];
+  return value;
 }
 
+#if 0
 int
-ncurisetparams(NCURI* uri, const char* newparams)
+ncuriremoveparam(NCURI* uri, const char* key)
 {
-    if(uri == NULL) return 0;
-    if(uri->paramlist != NULL) ncparamfree(uri->paramlist);
-    uri->paramlist = NULL;
-    if(uri->params != NULL) free(uri->params);
-    uri->params = nulldup(newparams);
-    return 1;
+    char** p;
+    char** q = NULL;
+
+    if(uri->fraglist == NULL) return NCU_OK;
+    for(q=uri->fraglist,p=uri->fraglist;*p;) {
+        if(strcmp(key,*p)==0) {
+	    p += 2; /* skip this entry */	
+	} else {
+	    *q++ = *p++; /* move key */
+	    *q++ = *p++; /* move value */
+	}
+    }
+    return NCU_OK;
 }
+#endif
+
 
 /* Internal version of lookup; returns the paired index of the key */
 static int
@@ -693,6 +657,8 @@ ncfind(char** params, const char* key)
     return -1;
 }
 
+
+#if 0
 static void
 ncparamfree(char** params)
 {
@@ -704,7 +670,7 @@ ncparamfree(char** params)
     }
     free(params);
 }
-
+#endif
 
 /* Return the ptr to the first occurrence of
    any char in the list. Return NULL if no
@@ -714,13 +680,14 @@ static char*
 nclocate(char* p, const char* charlist)
 {
     for(;*p;p++) {
-	if(strchr(charlist,*p) != NULL)
+	if(*p == '\\') p++;
+	else if(strchr(charlist,*p) != NULL)
 	    return p;
     }
     return NULL;
 }
 
-
+#if 0
 /* Shift every char starting at p 1 place to the left */
 static void
 nclshift1(char* p)
@@ -744,11 +711,10 @@ ncrshift1(char* p)
     } while(cur != 0);
     *p = 0; /* make sure we are still null terminated */
 }
-
+#endif
 
 /* Provide % encoders and decoders */
 
-
 static char* hexchars = "0123456789abcdefABCDEF";
 
 static void
@@ -859,3 +825,90 @@ ncuridecodeonly(char* s, char* only)
     *outptr = EOFCHAR;
     return decoded;
 }
+
+static int
+collectprefixparams(char* text, char** nextp)
+{
+    int ret = NCU_OK;
+    char* sp;
+    char* ep;
+    char* last;
+
+    if(text == NULL) return NCU_EBADURL;
+    if(strlen(text) == 0) {
+	if(nextp) *nextp = text;
+	return NCU_OK;
+    }
+    /* pass 1: locate last rbracket and nul term the prefix */
+    sp = text;
+    last = NULL;
+    for(;;) {
+	if(*sp != LBRACKET) {
+	    if(nextp) *nextp = sp;
+	    break;
+	}
+        /* use nclocate because \\ escapes might be present */
+        ep = nclocate(sp,RBRACKETSTR);
+	if(ep == NULL) {ret = NCU_EPARAMS; goto done;} /* malformed */
+	last = ep; /* save this position  */
+	ep++; /* move past rbracket */
+	sp = ep;
+    }	
+    /* nul terminate */
+    if(last != NULL)
+	terminate(last);
+
+    /* pass 2: convert [] to & */
+    sp = text;
+    for(;;) {
+	char* p; char* q;
+	/* by construction, here we are at an LBRACKET: compress it out */
+	for(p=sp,q=sp+1;(*p++=*q++););	
+        /* locate the next RRACKET */
+        ep = nclocate(sp,RBRACKETSTR);
+	if(ep == NULL) break;/* we are done */
+	/* convert the BRACKET to '&' */
+	*ep = '&';
+	ep++; /* move past rbracket */
+	sp = ep;
+    }	
+done:
+    return ret;    
+}
+
+static int
+parselist(char* ptext, NClist* list)
+{
+    int ret = NCU_OK;
+    char* p;
+    p = ptext; /* start of next parameter */
+    for(;;) {
+	char* sp = p;
+	char* eq;
+	char* ep;
+	char* key;
+	char* value;
+	if(*p == EOFCHAR) break; /* we are done */
+        /* use nclocate because \\ escapes might be present */
+	ep = nclocate(sp,"&");
+	if(ep != NULL) {
+	    terminate(ep); /* overwrite the trailing ampersand */
+	    p = ep+1; /* next param */
+	}	
+	/* split into key + value */
+        eq = strchr(sp,'=');
+        if(eq != NULL) { /* value is present */	    
+	    terminate(eq); eq++;
+	    key = strdup(sp);
+	    value = strdup(eq);
+	} else {/* there is no value */
+	    key = strdup(sp);
+	    value = strdup("");
+	}
+        nclistpush(list,key);
+	nclistpush(list,value);
+	if(ep == NULL)
+	    break;
+    }
+    return ret;
+}
diff --git a/libdispatch/test_ncuri.c b/libdispatch/test_ncuri.c
new file mode 100644
index 0000000..dcf9ad3
--- /dev/null
+++ b/libdispatch/test_ncuri.c
@@ -0,0 +1,95 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/**
+Test the ncuri parsing
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "ncuri.h"
+
+typedef struct Test {
+    char* url;
+    char* expected;
+} Test;
+
+static Test TESTS[] = {
+/* file: tests */
+{"file:d:/x/y","file://d:/x/y"},
+{"file://d:/x/y","file://d:/x/y"},
+{"file:/x/y","file:///x/y"},
+{"file:///x/y","file:///x/y"},
+/* prefix param tests */
+{"[dap4]http://localhost:8081/x","http://localhost:8081/x#dap4"},
+{"[show=fetch]http://localhost:8081/x","http://localhost:8081/x#show=fetch"},
+{"[dap4][show=fetch][log]http://localhost:8081/x","http://localhost:8081/x#dap4&show=fetch&log"},
+/* suffix param tests */
+{"http://localhost:8081/x#dap4","http://localhost:8081/x#dap4"},
+{"http://localhost:8081/x#show=fetch","http://localhost:8081/x#show=fetch"},
+{"http://localhost:8081/x#dap4&show=fetch&log","http://localhost:8081/x#dap4&show=fetch&log"},
+/* prefix+suffix param tests */
+{"[dap4]http://localhost:8081/x#show=fetch&log","http://localhost:8081/x#dap4&show=fetch&log"},
+/* suffix param tests with constraint*/
+{"http://localhost:8081/x?dap4.ce=x#dap4&show=fetch&log","http://localhost:8081/x?dap4.ce=x#dap4&show=fetch&log"},
+/* Misc. */
+{"http://localhost","http://localhost/"},
+{"http:///x","http:///x"},
+{"file:///home/osboxes/git/dap4/dap4_test/daptestfiles/test_anon_dim.2.syn#dap4&debug=copy&substratename=./results/test_anon_dim.2.syn.nc","file:///home/osboxes/git/dap4/dap4_test/daptestfiles/test_anon_dim.2.syn#dap4&debug=copy&substratename=./results/test_anon_dim.2.syn.nc"},
+
+{NULL,NULL}
+};
+
+/* Tests that should fail */
+static char* XTESTS[] = {
+"file://x/y",
+"[dap4http://localhost:8081/x",
+NULL
+};
+
+int
+main(int argc, char** argv)
+{
+    Test* test;
+    char** xtest;
+    int failcount = 0;
+
+    for(test=TESTS;test->url;test++) {
+	int ret = 0;
+	NCURI* uri = NULL;
+	ret = ncuriparse(test->url,&uri);
+	if(ret != NCU_OK) {
+	    fprintf(stderr,"Parse fail: %s\n",test->url);
+	    failcount++;
+	} else {
+	    char* built = ncuribuild(uri,NULL,NULL,NCURIALL);
+	    if(built == NULL) {
+	        fprintf(stderr,"Build fail: %s\n",test->url);
+		failcount++;
+	    } else {
+		if(strcmp(test->expected,built) != 0) {
+	            fprintf(stderr,"Mismatch: expected=|%s| actual=|%s|\n",test->expected,built);
+		    failcount++;
+		}
+		free(built);
+	    }
+	    ncurifree(uri);
+	}
+    }
+
+    for(xtest=XTESTS;*xtest;xtest++) {
+	int ret = 0;
+	NCURI* uri = NULL;
+	ret = ncuriparse(*xtest,&uri);
+	if(ret == NCU_OK) {
+	    fprintf(stderr,"XTEST succeeded: %s\n",*xtest);
+	    failcount++;
+	}
+    }
+
+    fprintf(stderr,"%s test_ncuri\n",failcount > 0 ? "***FAIL":"***PASS");
+    return (failcount > 0 ? 1 : 0);
+}
diff --git a/libdispatch/test_pathcvt.c b/libdispatch/test_pathcvt.c
new file mode 100644
index 0000000..14959d6
--- /dev/null
+++ b/libdispatch/test_pathcvt.c
@@ -0,0 +1,61 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/**
+Test the NCpathcvt
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "ncwinpath.h"
+
+#undef WINDEBUG
+#undef VERBOSE
+
+typedef struct Test {
+    char* path;
+    char* expected;
+} Test;
+
+/* Path conversion tests */
+static Test PATHTESTS[] = {
+{"/xxx/a/b","/xxx/a/b"},
+{"d:/x/y","d:\\x\\y"},
+{"/cygdrive/d/x/y","d:\\x\\y"},
+{"/d/x/y","d:\\x\\y"},
+{"/cygdrive/d","d:\\"},
+{"/d","d:\\"},
+{"/cygdrive/d/git/netcdf-c/dap4_test/daptestfiles/test_anon_dim.2.syn","d:\\git\\netcdf-c\\dap4_test\\daptestfiles\\test_anon_dim.2.syn"},
+{"[dap4]file:///cygdrive/d/git/netcdf-c/dap4_test/daptestfiles/test_anon_dim.2.syn","[dap4]file:///cygdrive/d/git/netcdf-c/dap4_test/daptestfiles/test_anon_dim.2.syn"},
+{NULL,NULL}
+};
+
+int
+main(int argc, char** argv)
+{
+    Test* test;
+    int failcount = 0;
+
+    for(test=PATHTESTS;test->path;test++) {
+	int ret = 0;
+	char* cvt = NCpathcvt(test->path);
+	if(cvt == NULL) {
+	    fprintf(stderr,"TEST returned NULL: %s\n",test->path);
+	    exit(1);
+	}
+	if(strcmp(cvt,test->expected) != 0) {
+	    fprintf(stderr,"NCpathcvt failed:: input: |%s| expected=|%s| actual=|%s|\n",test->path,test->expected,cvt);
+	    failcount++;
+	}
+#ifdef VERBOSE
+	fprintf(stderr,"NCpathcvt:: input: |%s| actual=|%s|\n",test->path,cvt);
+#endif	
+	free(cvt);
+    }
+
+    fprintf(stderr,"%s test_ncuri\n",failcount > 0 ? "***FAIL":"***PASS");
+    return (failcount > 0 ? 1 : 0);
+}
diff --git a/libdispatch/u/utf8proc.c b/libdispatch/u/utf8proc.c
new file mode 100644
index 0000000..c14bbe1
--- /dev/null
+++ b/libdispatch/u/utf8proc.c
@@ -0,0 +1,755 @@
+/* -*- mode: c; c-basic-offset: 2; tab-width: 2; indent-tabs-mode: nil -*- */
+/*
+ *  Copyright (c) 2015 Steven G. Johnson, Jiahao Chen, Peter Colberg, Tony Kelman, Scott P. Jones, and other contributors.
+ *  Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice shall be included in
+ *  all copies or substantial portions of the Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ *  This library contains derived data from a modified version of the
+ *  Unicode data files.
+ *
+ *  The original data files are available at
+ *  http://www.unicode.org/Public/UNIDATA/
+ *
+ *  Please notice the copyright statement in the file "utf8proc_data.c".
+ */
+
+
+/*
+ *  File name:    utf8proc.c
+ *
+ *  Description:
+ *  Implementation of libutf8proc.
+ */
+
+
+#include "utf8proc.h"
+#include "utf8proc_data.c"
+
+
+UTF8PROC_DLLEXPORT const utf8proc_int8_t utf8proc_utf8class[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,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+  4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+#define UTF8PROC_HANGUL_SBASE 0xAC00
+#define UTF8PROC_HANGUL_LBASE 0x1100
+#define UTF8PROC_HANGUL_VBASE 0x1161
+#define UTF8PROC_HANGUL_TBASE 0x11A7
+#define UTF8PROC_HANGUL_LCOUNT 19
+#define UTF8PROC_HANGUL_VCOUNT 21
+#define UTF8PROC_HANGUL_TCOUNT 28
+#define UTF8PROC_HANGUL_NCOUNT 588
+#define UTF8PROC_HANGUL_SCOUNT 11172
+/* END is exclusive */
+#define UTF8PROC_HANGUL_L_START  0x1100
+#define UTF8PROC_HANGUL_L_END    0x115A
+#define UTF8PROC_HANGUL_L_FILLER 0x115F
+#define UTF8PROC_HANGUL_V_START  0x1160
+#define UTF8PROC_HANGUL_V_END    0x11A3
+#define UTF8PROC_HANGUL_T_START  0x11A8
+#define UTF8PROC_HANGUL_T_END    0x11FA
+#define UTF8PROC_HANGUL_S_START  0xAC00
+#define UTF8PROC_HANGUL_S_END    0xD7A4
+
+/* Should follow semantic-versioning rules (semver.org) based on API
+   compatibility.  (Note that the shared-library version number will
+   be different, being based on ABI compatibility.): */
+#define STRINGIZEx(x) #x
+#define STRINGIZE(x) STRINGIZEx(x)
+UTF8PROC_DLLEXPORT const char *utf8proc_version(void) {
+  return STRINGIZE(UTF8PROC_VERSION_MAJOR) "." STRINGIZE(UTF8PROC_VERSION_MINOR) "." STRINGIZE(UTF8PROC_VERSION_PATCH) "";
+}
+
+UTF8PROC_DLLEXPORT const char *utf8proc_errmsg(utf8proc_ssize_t errcode) {
+  switch (errcode) {
+    case UTF8PROC_ERROR_NOMEM:
+    return "Memory for processing UTF-8 data could not be allocated.";
+    case UTF8PROC_ERROR_OVERFLOW:
+    return "UTF-8 string is too long to be processed.";
+    case UTF8PROC_ERROR_INVALIDUTF8:
+    return "Invalid UTF-8 string";
+    case UTF8PROC_ERROR_NOTASSIGNED:
+    return "Unassigned Unicode code point found in UTF-8 string.";
+    case UTF8PROC_ERROR_INVALIDOPTS:
+    return "Invalid options for UTF-8 processing chosen.";
+    default:
+    return "An unknown error occurred while processing UTF-8 data.";
+  }
+}
+
+#define utf_cont(ch)  (((ch) & 0xc0) == 0x80)
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_iterate(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen, utf8proc_int32_t *dst
+) {
+  utf8proc_uint32_t uc;
+  const utf8proc_uint8_t *end;
+
+  *dst = -1;
+  if (!strlen) return 0;
+  end = str + ((strlen < 0) ? 4 : strlen);
+  uc = *str++;
+  if (uc < 0x80) {
+    *dst = uc;
+    return 1;
+  }
+  // Must be between 0xc2 and 0xf4 inclusive to be valid
+  if ((uc - 0xc2) > (0xf4-0xc2)) return UTF8PROC_ERROR_INVALIDUTF8;
+  if (uc < 0xe0) {         // 2-byte sequence
+     // Must have valid continuation character
+     if (str >= end || !utf_cont(*str)) return UTF8PROC_ERROR_INVALIDUTF8;
+     *dst = ((uc & 0x1f)<<6) | (*str & 0x3f);
+     return 2;
+  }
+  if (uc < 0xf0) {        // 3-byte sequence
+     if ((str + 1 >= end) || !utf_cont(*str) || !utf_cont(str[1]))
+        return UTF8PROC_ERROR_INVALIDUTF8;
+     // Check for surrogate chars
+     if (uc == 0xed && *str > 0x9f)
+         return UTF8PROC_ERROR_INVALIDUTF8;
+     uc = ((uc & 0xf)<<12) | ((*str & 0x3f)<<6) | (str[1] & 0x3f);
+     if (uc < 0x800)
+         return UTF8PROC_ERROR_INVALIDUTF8;
+     *dst = uc;
+     return 3;
+  }
+  // 4-byte sequence
+  // Must have 3 valid continuation characters
+  if ((str + 2 >= end) || !utf_cont(*str) || !utf_cont(str[1]) || !utf_cont(str[2]))
+     return UTF8PROC_ERROR_INVALIDUTF8;
+  // Make sure in correct range (0x10000 - 0x10ffff)
+  if (uc == 0xf0) {
+    if (*str < 0x90) return UTF8PROC_ERROR_INVALIDUTF8;
+  } else if (uc == 0xf4) {
+    if (*str > 0x8f) return UTF8PROC_ERROR_INVALIDUTF8;
+  }
+  *dst = ((uc & 7)<<18) | ((*str & 0x3f)<<12) | ((str[1] & 0x3f)<<6) | (str[2] & 0x3f);
+  return 4;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_bool utf8proc_codepoint_valid(utf8proc_int32_t uc) {
+    return (((utf8proc_uint32_t)uc)-0xd800 > 0x07ff) && ((utf8proc_uint32_t)uc < 0x110000);
+}
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_encode_char(utf8proc_int32_t uc, utf8proc_uint8_t *dst) {
+  if (uc < 0x00) {
+    return 0;
+  } else if (uc < 0x80) {
+    dst[0] = (utf8proc_uint8_t) uc;
+    return 1;
+  } else if (uc < 0x800) {
+    dst[0] = (utf8proc_uint8_t)(0xC0 + (uc >> 6));
+    dst[1] = (utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+    return 2;
+  // Note: we allow encoding 0xd800-0xdfff here, so as not to change
+  // the API, however, these are actually invalid in UTF-8
+  } else if (uc < 0x10000) {
+    dst[0] = (utf8proc_uint8_t)(0xE0 + (uc >> 12));
+    dst[1] = (utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+    dst[2] = (utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+    return 3;
+  } else if (uc < 0x110000) {
+    dst[0] = (utf8proc_uint8_t)(0xF0 + (uc >> 18));
+    dst[1] = (utf8proc_uint8_t)(0x80 + ((uc >> 12) & 0x3F));
+    dst[2] = (utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+    dst[3] = (utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+    return 4;
+  } else return 0;
+}
+
+/* internal "unsafe" version that does not check whether uc is in range */
+static utf8proc_ssize_t unsafe_encode_char(utf8proc_int32_t uc, utf8proc_uint8_t *dst) {
+   if (uc < 0x00) {
+      return 0;
+   } else if (uc < 0x80) {
+      dst[0] = (utf8proc_uint8_t)uc;
+      return 1;
+   } else if (uc < 0x800) {
+      dst[0] = (utf8proc_uint8_t)(0xC0 + (uc >> 6));
+      dst[1] = (utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+      return 2;
+   } else if (uc == 0xFFFF) {
+       dst[0] = (utf8proc_uint8_t)0xFF;
+       return 1;
+   } else if (uc == 0xFFFE) {
+       dst[0] = (utf8proc_uint8_t)0xFE;
+       return 1;
+   } else if (uc < 0x10000) {
+      dst[0] = (utf8proc_uint8_t)(0xE0 + (uc >> 12));
+      dst[1] = (utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+      dst[2] = (utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+      return 3;
+   } else if (uc < 0x110000) {
+      dst[0] = (utf8proc_uint8_t)(0xF0 + (uc >> 18));
+      dst[1] = (utf8proc_uint8_t)(0x80 + ((uc >> 12) & 0x3F));
+      dst[2] = (utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+      dst[3] = (utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+      return 4;
+   } else return 0;
+}
+
+/* internal "unsafe" version that does not check whether uc is in range */
+static const utf8proc_property_t *unsafe_get_property(utf8proc_int32_t uc) {
+  /* ASSERT: uc >= 0 && uc < 0x110000 */
+  return utf8proc_properties + (
+    utf8proc_stage2table[
+      utf8proc_stage1table[uc >> 8] + (uc & 0xFF)
+    ]
+  );
+}
+
+UTF8PROC_DLLEXPORT const utf8proc_property_t *utf8proc_get_property(utf8proc_int32_t uc) {
+  return uc < 0 || uc >= 0x110000 ? utf8proc_properties : unsafe_get_property(uc);
+}
+
+/* return whether there is a grapheme break between boundclasses lbc and tbc
+   (according to the definition of extended grapheme clusters)
+
+  Rule numbering refers to TR29 Version 29 (Unicode 9.0.0):
+  http://www.unicode.org/reports/tr29/tr29-29.html
+
+  CAVEATS:
+   Please note that evaluation of GB10 (grapheme breaks between emoji zwj sequences)
+   and GB 12/13 (regional indicator code points) require knowledge of previous characters
+   and are thus not handled by this function. This may result in an incorrect break before
+   an E_Modifier class codepoint and an incorrectly missing break between two
+   REGIONAL_INDICATOR class code points if such support does not exist in the caller.
+
+   See the special support in grapheme_break_extended, for required bookkeeping by the caller.
+*/
+static utf8proc_bool grapheme_break_simple(int lbc, int tbc) {
+  return
+    (lbc == UTF8PROC_BOUNDCLASS_START) ? true :       // GB1
+    (lbc == UTF8PROC_BOUNDCLASS_CR &&                 // GB3
+     tbc == UTF8PROC_BOUNDCLASS_LF) ? false :         // ---
+    (lbc >= UTF8PROC_BOUNDCLASS_CR && lbc <= UTF8PROC_BOUNDCLASS_CONTROL) ? true :  // GB4
+    (tbc >= UTF8PROC_BOUNDCLASS_CR && tbc <= UTF8PROC_BOUNDCLASS_CONTROL) ? true :  // GB5
+    (lbc == UTF8PROC_BOUNDCLASS_L &&                  // GB6
+     (tbc == UTF8PROC_BOUNDCLASS_L ||                 // ---
+      tbc == UTF8PROC_BOUNDCLASS_V ||                 // ---
+      tbc == UTF8PROC_BOUNDCLASS_LV ||                // ---
+      tbc == UTF8PROC_BOUNDCLASS_LVT)) ? false :      // ---
+    ((lbc == UTF8PROC_BOUNDCLASS_LV ||                // GB7
+      lbc == UTF8PROC_BOUNDCLASS_V) &&                // ---
+     (tbc == UTF8PROC_BOUNDCLASS_V ||                 // ---
+      tbc == UTF8PROC_BOUNDCLASS_T)) ? false :        // ---
+    ((lbc == UTF8PROC_BOUNDCLASS_LVT ||               // GB8
+      lbc == UTF8PROC_BOUNDCLASS_T) &&                // ---
+     tbc == UTF8PROC_BOUNDCLASS_T) ? false :          // ---
+    (tbc == UTF8PROC_BOUNDCLASS_EXTEND ||             // GB9
+     tbc == UTF8PROC_BOUNDCLASS_ZWJ ||                // ---
+     tbc == UTF8PROC_BOUNDCLASS_SPACINGMARK ||        // GB9a
+     lbc == UTF8PROC_BOUNDCLASS_PREPEND) ? false :    // GB9b
+    ((lbc == UTF8PROC_BOUNDCLASS_E_BASE ||            // GB10 (requires additional handling below)
+      lbc == UTF8PROC_BOUNDCLASS_E_BASE_GAZ) &&       // ----
+     tbc == UTF8PROC_BOUNDCLASS_E_MODIFIER) ? false : // ----
+    (lbc == UTF8PROC_BOUNDCLASS_ZWJ &&                         // GB11
+     (tbc == UTF8PROC_BOUNDCLASS_GLUE_AFTER_ZWJ ||             // ----
+      tbc == UTF8PROC_BOUNDCLASS_E_BASE_GAZ)) ? false :        // ----
+    (lbc == UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR &&          // GB12/13 (requires additional handling below)
+     tbc == UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR) ? false :  // ----
+    true; // GB999
+}
+
+static utf8proc_bool grapheme_break_extended(int lbc, int tbc, utf8proc_int32_t *state)
+{
+  int lbc_override = lbc;
+  if (state && *state != UTF8PROC_BOUNDCLASS_START)
+    lbc_override = *state;
+  utf8proc_bool break_permitted = grapheme_break_simple(lbc_override, tbc);
+  if (state) {
+    // Special support for GB 12/13 made possible by GB999. After two RI
+    // class codepoints we want to force a break. Do this by resetting the
+    // second RI's bound class to UTF8PROC_BOUNDCLASS_OTHER, to force a break
+    // after that character according to GB999 (unless of course such a break is
+    // forbidden by a different rule such as GB9).
+    if (*state == tbc && tbc == UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR)
+      *state = UTF8PROC_BOUNDCLASS_OTHER;
+    // Special support for GB10. Fold any EXTEND codepoints into the previous
+    // boundclass if we're dealing with an emoji base boundclass.
+    else if ((*state == UTF8PROC_BOUNDCLASS_E_BASE      ||
+              *state == UTF8PROC_BOUNDCLASS_E_BASE_GAZ) &&
+             tbc == UTF8PROC_BOUNDCLASS_EXTEND)
+      *state = UTF8PROC_BOUNDCLASS_E_BASE;
+    else
+      *state = tbc;
+  }
+  return break_permitted;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_bool utf8proc_grapheme_break_stateful(
+    utf8proc_int32_t c1, utf8proc_int32_t c2, utf8proc_int32_t *state) {
+
+  return grapheme_break_extended(utf8proc_get_property(c1)->boundclass,
+                                 utf8proc_get_property(c2)->boundclass,
+                                 state);
+}
+
+
+UTF8PROC_DLLEXPORT utf8proc_bool utf8proc_grapheme_break(
+    utf8proc_int32_t c1, utf8proc_int32_t c2) {
+  return utf8proc_grapheme_break_stateful(c1, c2, NULL);
+}
+
+static utf8proc_int32_t seqindex_decode_entry(const utf8proc_uint16_t **entry)
+{
+  utf8proc_int32_t entry_cp = **entry;
+  if ((entry_cp & 0xF800) == 0xD800) {
+    *entry = *entry + 1;
+    entry_cp = ((entry_cp & 0x03FF) << 10) | (**entry & 0x03FF);
+    entry_cp += 0x10000;
+  }
+  return entry_cp;
+}
+
+static utf8proc_int32_t seqindex_decode_index(const utf8proc_uint32_t seqindex)
+{
+  const utf8proc_uint16_t *entry = &utf8proc_sequences[seqindex];
+  return seqindex_decode_entry(&entry);
+}
+
+static utf8proc_ssize_t seqindex_write_char_decomposed(utf8proc_uint16_t seqindex, utf8proc_int32_t *dst, utf8proc_ssize_t bufsize, utf8proc_option_t options, int *last_boundclass) {
+  utf8proc_ssize_t written = 0;
+  const utf8proc_uint16_t *entry = &utf8proc_sequences[seqindex & 0x1FFF];
+  int len = seqindex >> 13;
+  if (len >= 7) {
+    len = *entry;
+    entry++;
+  }
+  for (; len >= 0; entry++, len--) {
+    utf8proc_int32_t entry_cp = seqindex_decode_entry(&entry);
+
+    written += utf8proc_decompose_char(entry_cp, dst+written,
+      (bufsize > written) ? (bufsize - written) : 0, options,
+    last_boundclass);
+    if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
+  }
+  return written;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_int32_t utf8proc_tolower(utf8proc_int32_t c)
+{
+  utf8proc_int32_t cl = utf8proc_get_property(c)->lowercase_seqindex;
+  return cl != UINT16_MAX ? seqindex_decode_index(cl) : c;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_int32_t utf8proc_toupper(utf8proc_int32_t c)
+{
+  utf8proc_int32_t cu = utf8proc_get_property(c)->uppercase_seqindex;
+  return cu != UINT16_MAX ? seqindex_decode_index(cu) : c;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_int32_t utf8proc_totitle(utf8proc_int32_t c)
+{
+  utf8proc_int32_t cu = utf8proc_get_property(c)->titlecase_seqindex;
+  return cu != UINT16_MAX ? seqindex_decode_index(cu) : c;
+}
+
+/* return a character width analogous to wcwidth (except portable and
+   hopefully less buggy than most system wcwidth functions). */
+UTF8PROC_DLLEXPORT int utf8proc_charwidth(utf8proc_int32_t c) {
+  return utf8proc_get_property(c)->charwidth;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_category_t utf8proc_category(utf8proc_int32_t c) {
+  return utf8proc_get_property(c)->category;
+}
+
+UTF8PROC_DLLEXPORT const char *utf8proc_category_string(utf8proc_int32_t c) {
+  static const char s[][3] = {"Cn","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"};
+  return s[utf8proc_category(c)];
+}
+
+#define utf8proc_decompose_lump(replacement_uc) \
+  return utf8proc_decompose_char((replacement_uc), dst, bufsize, \
+  options & ~UTF8PROC_LUMP, last_boundclass)
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_decompose_char(utf8proc_int32_t uc, utf8proc_int32_t *dst, utf8proc_ssize_t bufsize, utf8proc_option_t options, int *last_boundclass) {
+  const utf8proc_property_t *property;
+  utf8proc_propval_t category;
+  utf8proc_int32_t hangul_sindex;
+  if (uc < 0 || uc >= 0x110000) return UTF8PROC_ERROR_NOTASSIGNED;
+  property = unsafe_get_property(uc);
+  category = property->category;
+  hangul_sindex = uc - UTF8PROC_HANGUL_SBASE;
+  if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+    if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT) {
+      utf8proc_int32_t hangul_tindex;
+      if (bufsize >= 1) {
+        dst[0] = UTF8PROC_HANGUL_LBASE +
+          hangul_sindex / UTF8PROC_HANGUL_NCOUNT;
+        if (bufsize >= 2) dst[1] = UTF8PROC_HANGUL_VBASE +
+          (hangul_sindex % UTF8PROC_HANGUL_NCOUNT) / UTF8PROC_HANGUL_TCOUNT;
+      }
+      hangul_tindex = hangul_sindex % UTF8PROC_HANGUL_TCOUNT;
+      if (!hangul_tindex) return 2;
+      if (bufsize >= 3) dst[2] = UTF8PROC_HANGUL_TBASE + hangul_tindex;
+      return 3;
+    }
+  }
+  if (options & UTF8PROC_REJECTNA) {
+    if (!category) return UTF8PROC_ERROR_NOTASSIGNED;
+  }
+  if (options & UTF8PROC_IGNORE) {
+    if (property->ignorable) return 0;
+  }
+  if (options & UTF8PROC_LUMP) {
+    if (category == UTF8PROC_CATEGORY_ZS) utf8proc_decompose_lump(0x0020);
+    if (uc == 0x2018 || uc == 0x2019 || uc == 0x02BC || uc == 0x02C8)
+      utf8proc_decompose_lump(0x0027);
+    if (category == UTF8PROC_CATEGORY_PD || uc == 0x2212)
+      utf8proc_decompose_lump(0x002D);
+    if (uc == 0x2044 || uc == 0x2215) utf8proc_decompose_lump(0x002F);
+    if (uc == 0x2236) utf8proc_decompose_lump(0x003A);
+    if (uc == 0x2039 || uc == 0x2329 || uc == 0x3008)
+      utf8proc_decompose_lump(0x003C);
+    if (uc == 0x203A || uc == 0x232A || uc == 0x3009)
+      utf8proc_decompose_lump(0x003E);
+    if (uc == 0x2216) utf8proc_decompose_lump(0x005C);
+    if (uc == 0x02C4 || uc == 0x02C6 || uc == 0x2038 || uc == 0x2303)
+      utf8proc_decompose_lump(0x005E);
+    if (category == UTF8PROC_CATEGORY_PC || uc == 0x02CD)
+      utf8proc_decompose_lump(0x005F);
+    if (uc == 0x02CB) utf8proc_decompose_lump(0x0060);
+    if (uc == 0x2223) utf8proc_decompose_lump(0x007C);
+    if (uc == 0x223C) utf8proc_decompose_lump(0x007E);
+    if ((options & UTF8PROC_NLF2LS) && (options & UTF8PROC_NLF2PS)) {
+      if (category == UTF8PROC_CATEGORY_ZL ||
+          category == UTF8PROC_CATEGORY_ZP)
+        utf8proc_decompose_lump(0x000A);
+    }
+  }
+  if (options & UTF8PROC_STRIPMARK) {
+    if (category == UTF8PROC_CATEGORY_MN ||
+      category == UTF8PROC_CATEGORY_MC ||
+      category == UTF8PROC_CATEGORY_ME) return 0;
+  }
+  if (options & UTF8PROC_CASEFOLD) {
+    if (property->casefold_seqindex != UINT16_MAX) {
+      return seqindex_write_char_decomposed(property->casefold_seqindex, dst, bufsize, options, last_boundclass);
+    }
+  }
+  if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+    if (property->decomp_seqindex != UINT16_MAX &&
+        (!property->decomp_type || (options & UTF8PROC_COMPAT))) {
+      return seqindex_write_char_decomposed(property->decomp_seqindex, dst, bufsize, options, last_boundclass);
+    }
+  }
+  if (options & UTF8PROC_CHARBOUND) {
+    utf8proc_bool boundary;
+    int tbc = property->boundclass;
+    boundary = grapheme_break_extended(*last_boundclass, tbc, last_boundclass);
+    if (boundary) {
+      if (bufsize >= 1) dst[0] = 0xFFFF;
+      if (bufsize >= 2) dst[1] = uc;
+      return 2;
+    }
+  }
+  if (bufsize >= 1) *dst = uc;
+  return 1;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_decompose(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen,
+  utf8proc_int32_t *buffer, utf8proc_ssize_t bufsize, utf8proc_option_t options
+) {
+    return utf8proc_decompose_custom(str, strlen, buffer, bufsize, options, NULL, NULL);
+}
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_decompose_custom(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen,
+  utf8proc_int32_t *buffer, utf8proc_ssize_t bufsize, utf8proc_option_t options,
+  utf8proc_custom_func custom_func, void *custom_data
+) {
+  /* strlen will be ignored, if UTF8PROC_NULLTERM is set in options */
+  utf8proc_ssize_t wpos = 0;
+  if ((options & UTF8PROC_COMPOSE) && (options & UTF8PROC_DECOMPOSE))
+    return UTF8PROC_ERROR_INVALIDOPTS;
+  if ((options & UTF8PROC_STRIPMARK) &&
+      !(options & UTF8PROC_COMPOSE) && !(options & UTF8PROC_DECOMPOSE))
+    return UTF8PROC_ERROR_INVALIDOPTS;
+  {
+    utf8proc_int32_t uc;
+    utf8proc_ssize_t rpos = 0;
+    utf8proc_ssize_t decomp_result;
+    int boundclass = UTF8PROC_BOUNDCLASS_START;
+    while (1) {
+      if (options & UTF8PROC_NULLTERM) {
+        rpos += utf8proc_iterate(str + rpos, -1, &uc);
+        /* checking of return value is not necessary,
+           as 'uc' is < 0 in case of error */
+        if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+        if (rpos < 0) return UTF8PROC_ERROR_OVERFLOW;
+        if (uc == 0) break;
+      } else {
+        if (rpos >= strlen) break;
+        rpos += utf8proc_iterate(str + rpos, strlen - rpos, &uc);
+        if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+      }
+      if (custom_func != NULL) {
+        uc = custom_func(uc, custom_data);   /* user-specified custom mapping */
+      }
+      decomp_result = utf8proc_decompose_char(
+        uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options,
+        &boundclass
+      );
+      if (decomp_result < 0) return decomp_result;
+      wpos += decomp_result;
+      /* prohibiting integer overflows due to too long strings: */
+      if (wpos < 0 ||
+          wpos > (utf8proc_ssize_t)(SSIZE_MAX/sizeof(utf8proc_int32_t)/2))
+        return UTF8PROC_ERROR_OVERFLOW;
+    }
+  }
+  if ((options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) && bufsize >= wpos) {
+    utf8proc_ssize_t pos = 0;
+    while (pos < wpos-1) {
+      utf8proc_int32_t uc1, uc2;
+      const utf8proc_property_t *property1, *property2;
+      uc1 = buffer[pos];
+      uc2 = buffer[pos+1];
+      property1 = unsafe_get_property(uc1);
+      property2 = unsafe_get_property(uc2);
+      if (property1->combining_class > property2->combining_class &&
+          property2->combining_class > 0) {
+        buffer[pos] = uc2;
+        buffer[pos+1] = uc1;
+        if (pos > 0) pos--; else pos++;
+      } else {
+        pos++;
+      }
+    }
+  }
+  return wpos;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_normalize_utf32(utf8proc_int32_t *buffer, utf8proc_ssize_t length, utf8proc_option_t options) {
+  /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored */
+  if (options & (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS | UTF8PROC_STRIPCC)) {
+    utf8proc_ssize_t rpos;
+    utf8proc_ssize_t wpos = 0;
+    utf8proc_int32_t uc;
+    for (rpos = 0; rpos < length; rpos++) {
+      uc = buffer[rpos];
+      if (uc == 0x000D && rpos < length-1 && buffer[rpos+1] == 0x000A) rpos++;
+      if (uc == 0x000A || uc == 0x000D || uc == 0x0085 ||
+          ((options & UTF8PROC_STRIPCC) && (uc == 0x000B || uc == 0x000C))) {
+        if (options & UTF8PROC_NLF2LS) {
+          if (options & UTF8PROC_NLF2PS) {
+            buffer[wpos++] = 0x000A;
+          } else {
+            buffer[wpos++] = 0x2028;
+          }
+        } else {
+          if (options & UTF8PROC_NLF2PS) {
+            buffer[wpos++] = 0x2029;
+          } else {
+            buffer[wpos++] = 0x0020;
+          }
+        }
+      } else if ((options & UTF8PROC_STRIPCC) &&
+          (uc < 0x0020 || (uc >= 0x007F && uc < 0x00A0))) {
+        if (uc == 0x0009) buffer[wpos++] = 0x0020;
+      } else {
+        buffer[wpos++] = uc;
+      }
+    }
+    length = wpos;
+  }
+  if (options & UTF8PROC_COMPOSE) {
+    utf8proc_int32_t *starter = NULL;
+    utf8proc_int32_t current_char;
+    const utf8proc_property_t *starter_property = NULL, *current_property;
+    utf8proc_propval_t max_combining_class = -1;
+    utf8proc_ssize_t rpos;
+    utf8proc_ssize_t wpos = 0;
+    utf8proc_int32_t composition;
+    for (rpos = 0; rpos < length; rpos++) {
+      current_char = buffer[rpos];
+      current_property = unsafe_get_property(current_char);
+      if (starter && current_property->combining_class > max_combining_class) {
+        /* combination perhaps possible */
+        utf8proc_int32_t hangul_lindex;
+        utf8proc_int32_t hangul_sindex;
+        hangul_lindex = *starter - UTF8PROC_HANGUL_LBASE;
+        if (hangul_lindex >= 0 && hangul_lindex < UTF8PROC_HANGUL_LCOUNT) {
+          utf8proc_int32_t hangul_vindex;
+          hangul_vindex = current_char - UTF8PROC_HANGUL_VBASE;
+          if (hangul_vindex >= 0 && hangul_vindex < UTF8PROC_HANGUL_VCOUNT) {
+            *starter = UTF8PROC_HANGUL_SBASE +
+              (hangul_lindex * UTF8PROC_HANGUL_VCOUNT + hangul_vindex) *
+              UTF8PROC_HANGUL_TCOUNT;
+            starter_property = NULL;
+            continue;
+          }
+        }
+        hangul_sindex = *starter - UTF8PROC_HANGUL_SBASE;
+        if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT &&
+            (hangul_sindex % UTF8PROC_HANGUL_TCOUNT) == 0) {
+          utf8proc_int32_t hangul_tindex;
+          hangul_tindex = current_char - UTF8PROC_HANGUL_TBASE;
+          if (hangul_tindex >= 0 && hangul_tindex < UTF8PROC_HANGUL_TCOUNT) {
+            *starter += hangul_tindex;
+            starter_property = NULL;
+            continue;
+          }
+        }
+        if (!starter_property) {
+          starter_property = unsafe_get_property(*starter);
+        }
+        if (starter_property->comb_index < 0x8000 &&
+            current_property->comb_index != UINT16_MAX &&
+            current_property->comb_index >= 0x8000) {
+          int sidx = starter_property->comb_index;
+          int idx = (current_property->comb_index & 0x3FFF) - utf8proc_combinations[sidx];
+          if (idx >= 0 && idx <= utf8proc_combinations[sidx + 1] ) {
+            idx += sidx + 2;
+            if (current_property->comb_index & 0x4000) {
+              composition = (utf8proc_combinations[idx] << 16) | utf8proc_combinations[idx+1];
+            } else
+              composition = utf8proc_combinations[idx];
+
+            if (composition > 0 && (!(options & UTF8PROC_STABLE) ||
+                !(unsafe_get_property(composition)->comp_exclusion))) {
+              *starter = composition;
+              starter_property = NULL;
+              continue;
+            }
+          }
+        }
+      }
+      buffer[wpos] = current_char;
+      if (current_property->combining_class) {
+        if (current_property->combining_class > max_combining_class) {
+          max_combining_class = current_property->combining_class;
+        }
+      } else {
+        starter = buffer + wpos;
+        starter_property = NULL;
+        max_combining_class = -1;
+      }
+      wpos++;
+    }
+    length = wpos;
+  }
+  return length;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_reencode(utf8proc_int32_t *buffer, utf8proc_ssize_t length, utf8proc_option_t options) {
+  /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored
+     ASSERT: 'buffer' has one spare byte of free space at the end! */
+  length = utf8proc_normalize_utf32(buffer, length, options);
+  if (length < 0) return length;
+  {
+    utf8proc_ssize_t rpos, wpos = 0;
+    utf8proc_int32_t uc;
+    if (options & UTF8PROC_CHARBOUND) {
+        for (rpos = 0; rpos < length; rpos++) {
+            uc = buffer[rpos];
+            wpos += unsafe_encode_char(uc, ((utf8proc_uint8_t *)buffer) + wpos);
+        }
+    } else {
+        for (rpos = 0; rpos < length; rpos++) {
+            uc = buffer[rpos];
+            wpos += utf8proc_encode_char(uc, ((utf8proc_uint8_t *)buffer) + wpos);
+        }
+    }
+    ((utf8proc_uint8_t *)buffer)[wpos] = 0;
+    return wpos;
+  }
+}
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_map(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen, utf8proc_uint8_t **dstptr, utf8proc_option_t options
+) {
+    return utf8proc_map_custom(str, strlen, dstptr, options, NULL, NULL);
+}
+
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_map_custom(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen, utf8proc_uint8_t **dstptr, utf8proc_option_t options,
+  utf8proc_custom_func custom_func, void *custom_data
+) {
+  utf8proc_int32_t *buffer;
+  utf8proc_ssize_t result;
+  *dstptr = NULL;
+  result = utf8proc_decompose_custom(str, strlen, NULL, 0, options, custom_func, custom_data);
+  if (result < 0) return result;
+  buffer = (utf8proc_int32_t *) malloc(result * sizeof(utf8proc_int32_t) + 1);
+  if (!buffer) return UTF8PROC_ERROR_NOMEM;
+  result = utf8proc_decompose_custom(str, strlen, buffer, result, options, custom_func, custom_data);
+  if (result < 0) {
+    free(buffer);
+    return result;
+  }
+  result = utf8proc_reencode(buffer, result, options);
+  if (result < 0) {
+    free(buffer);
+    return result;
+  }
+  {
+    utf8proc_int32_t *newptr;
+    newptr = (utf8proc_int32_t *) realloc(buffer, (size_t)result+1);
+    if (newptr) buffer = newptr;
+  }
+  *dstptr = (utf8proc_uint8_t *)buffer;
+  return result;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFD(const utf8proc_uint8_t *str) {
+  utf8proc_uint8_t *retval;
+  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_DECOMPOSE);
+  return retval;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFC(const utf8proc_uint8_t *str) {
+  utf8proc_uint8_t *retval;
+  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_COMPOSE);
+  return retval;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFKD(const utf8proc_uint8_t *str) {
+  utf8proc_uint8_t *retval;
+  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT);
+  return retval;
+}
+
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFKC(const utf8proc_uint8_t *str) {
+  utf8proc_uint8_t *retval;
+  utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_COMPOSE | UTF8PROC_COMPAT);
+  return retval;
+}
diff --git a/libdispatch/u/utf8proc.h b/libdispatch/u/utf8proc.h
new file mode 100644
index 0000000..495cd96
--- /dev/null
+++ b/libdispatch/u/utf8proc.h
@@ -0,0 +1,699 @@
+/*
+ * Copyright (c) 2015 Steven G. Johnson, Jiahao Chen, Peter Colberg, Tony Kelman, Scott P. Jones, and other contributors.
+ * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * @mainpage
+ *
+ * utf8proc is a free/open-source (MIT/expat licensed) C library
+ * providing Unicode normalization, case-folding, and other operations
+ * for strings in the UTF-8 encoding, supporting Unicode version
+ * 8.0.0.  See the utf8proc home page (http://julialang.org/utf8proc/)
+ * for downloads and other information, or the source code on github
+ * (https://github.com/JuliaLang/utf8proc).
+ *
+ * For the utf8proc API documentation, see: @ref utf8proc.h
+ *
+ * The features of utf8proc include:
+ *
+ * - Transformation of strings (@ref utf8proc_map) to:
+ *    - decompose (@ref UTF8PROC_DECOMPOSE) or compose (@ref UTF8PROC_COMPOSE) Unicode combining characters (http://en.wikipedia.org/wiki/Combining_character)
+ *    - canonicalize Unicode compatibility characters (@ref UTF8PROC_COMPAT)
+ *    - strip "ignorable" (@ref UTF8PROC_IGNORE) characters, control characters (@ref UTF8PROC_STRIPCC), or combining characters such as accents (@ref UTF8PROC_STRIPMARK)
+ *    - case-folding (@ref UTF8PROC_CASEFOLD)
+ * - Unicode normalization: @ref utf8proc_NFD, @ref utf8proc_NFC, @ref utf8proc_NFKD, @ref utf8proc_NFKC
+ * - Detecting grapheme boundaries (@ref utf8proc_grapheme_break and @ref UTF8PROC_CHARBOUND)
+ * - Character-width computation: @ref utf8proc_charwidth
+ * - Classification of characters by Unicode category: @ref utf8proc_category and @ref utf8proc_category_string
+ * - Encode (@ref utf8proc_encode_char) and decode (@ref utf8proc_iterate) Unicode codepoints to/from UTF-8.
+ */
+
+/** @file */
+
+#ifndef UTF8PROC_H
+#define UTF8PROC_H
+
+/** @name API version
+ *
+ * The utf8proc API version MAJOR.MINOR.PATCH, following
+ * semantic-versioning rules (http://semver.org) based on API
+ * compatibility.
+ *
+ * This is also returned at runtime by @ref utf8proc_version; however, the
+ * runtime version may append a string like "-dev" to the version number
+ * for prerelease versions.
+ *
+ * @note The shared-library version number in the Makefile
+ *       (and CMakeLists.txt, and MANIFEST) may be different,
+ *       being based on ABI compatibility rather than API compatibility.
+ */
+/** @{ */
+/** The MAJOR version number (increased when backwards API compatibility is broken). */
+#define UTF8PROC_VERSION_MAJOR 2
+/** The MINOR version number (increased when new functionality is added in a backwards-compatible manner). */
+#define UTF8PROC_VERSION_MINOR 1
+/** The PATCH version (increased for fixes that do not change the API). */
+#define UTF8PROC_VERSION_PATCH 0
+/** @} */
+
+#include <stdlib.h>
+
+#if defined(_MSC_VER) && _MSC_VER < 1800
+// MSVC prior to 2013 lacked stdbool.h and inttypes.h
+typedef signed char utf8proc_int8_t;
+typedef unsigned char utf8proc_uint8_t;
+typedef short utf8proc_int16_t;
+typedef unsigned short utf8proc_uint16_t;
+typedef int utf8proc_int32_t;
+typedef unsigned int utf8proc_uint32_t;
+#  ifdef _WIN64
+typedef __int64 utf8proc_ssize_t;
+typedef unsigned __int64 utf8proc_size_t;
+#  else
+typedef int utf8proc_ssize_t;
+typedef unsigned int utf8proc_size_t;
+#  endif
+#  ifndef __cplusplus
+// emulate C99 bool
+typedef unsigned char utf8proc_bool;
+#    ifndef __bool_true_false_are_defined
+#      define false 0
+#      define true 1
+#      define __bool_true_false_are_defined 1
+#    endif
+#  else
+typedef bool utf8proc_bool;
+#  endif
+#else
+#  include <stddef.h>
+#  include <stdbool.h>
+#  include <inttypes.h>
+typedef int8_t utf8proc_int8_t;
+typedef uint8_t utf8proc_uint8_t;
+typedef int16_t utf8proc_int16_t;
+typedef uint16_t utf8proc_uint16_t;
+typedef int32_t utf8proc_int32_t;
+typedef uint32_t utf8proc_uint32_t;
+typedef size_t utf8proc_size_t;
+typedef ptrdiff_t utf8proc_ssize_t;
+typedef bool utf8proc_bool;
+#endif
+#include <limits.h>
+
+#ifdef _WIN32
+#  ifdef UTF8PROC_EXPORTS
+#    define UTF8PROC_DLLEXPORT __declspec(dllexport)
+#  else
+#    define UTF8PROC_DLLEXPORT __declspec(dllimport)
+#  endif
+#elif __GNUC__ >= 4
+#  define UTF8PROC_DLLEXPORT __attribute__ ((visibility("default")))
+#else
+#  define UTF8PROC_DLLEXPORT
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SSIZE_MAX
+#define SSIZE_MAX ((size_t)SIZE_MAX/2)
+#endif
+
+#ifndef UINT16_MAX
+#  define UINT16_MAX 65535U
+#endif
+
+/**
+ * Option flags used by several functions in the library.
+ */
+typedef enum {
+  /** The given UTF-8 input is NULL terminated. */
+  UTF8PROC_NULLTERM  = (1<<0),
+  /** Unicode Versioning Stability has to be respected. */
+  UTF8PROC_STABLE    = (1<<1),
+  /** Compatibility decomposition (i.e. formatting information is lost). */
+  UTF8PROC_COMPAT    = (1<<2),
+  /** Return a result with decomposed characters. */
+  UTF8PROC_COMPOSE   = (1<<3),
+  /** Return a result with decomposed characters. */
+  UTF8PROC_DECOMPOSE = (1<<4),
+  /** Strip "default ignorable characters" such as SOFT-HYPHEN or ZERO-WIDTH-SPACE. */
+  UTF8PROC_IGNORE    = (1<<5),
+  /** Return an error, if the input contains unassigned codepoints. */
+  UTF8PROC_REJECTNA  = (1<<6),
+  /**
+   * Indicating that NLF-sequences (LF, CRLF, CR, NEL) are representing a
+   * line break, and should be converted to the codepoint for line
+   * separation (LS).
+   */
+  UTF8PROC_NLF2LS    = (1<<7),
+  /**
+   * Indicating that NLF-sequences are representing a paragraph break, and
+   * should be converted to the codepoint for paragraph separation
+   * (PS).
+   */
+  UTF8PROC_NLF2PS    = (1<<8),
+  /** Indicating that the meaning of NLF-sequences is unknown. */
+  UTF8PROC_NLF2LF    = (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS),
+  /** Strips and/or convers control characters.
+   *
+   * NLF-sequences are transformed into space, except if one of the
+   * NLF2LS/PS/LF options is given. HorizontalTab (HT) and FormFeed (FF)
+   * are treated as a NLF-sequence in this case.  All other control
+   * characters are simply removed.
+   */
+  UTF8PROC_STRIPCC   = (1<<9),
+  /**
+   * Performs unicode case folding, to be able to do a case-insensitive
+   * string comparison.
+   */
+  UTF8PROC_CASEFOLD  = (1<<10),
+  /**
+   * Inserts 0xFF bytes at the beginning of each sequence which is
+   * representing a single grapheme cluster (see UAX#29).
+   */
+  UTF8PROC_CHARBOUND = (1<<11),
+  /** Lumps certain characters together.
+   *
+   * E.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-". See lump.md for details.
+   *
+   * If NLF2LF is set, this includes a transformation of paragraph and
+   * line separators to ASCII line-feed (LF).
+   */
+  UTF8PROC_LUMP      = (1<<12),
+  /** Strips all character markings.
+   *
+   * This includes non-spacing, spacing and enclosing (i.e. accents).
+   * @note This option works only with @ref UTF8PROC_COMPOSE or
+   *       @ref UTF8PROC_DECOMPOSE
+   */
+  UTF8PROC_STRIPMARK = (1<<13),
+} utf8proc_option_t;
+
+/** @name Error codes
+ * Error codes being returned by almost all functions.
+ */
+/** @{ */
+/** Memory could not be allocated. */
+#define UTF8PROC_ERROR_NOMEM -1
+/** The given string is too long to be processed. */
+#define UTF8PROC_ERROR_OVERFLOW -2
+/** The given string is not a legal UTF-8 string. */
+#define UTF8PROC_ERROR_INVALIDUTF8 -3
+/** The @ref UTF8PROC_REJECTNA flag was set and an unassigned codepoint was found. */
+#define UTF8PROC_ERROR_NOTASSIGNED -4
+/** Invalid options have been used. */
+#define UTF8PROC_ERROR_INVALIDOPTS -5
+/** @} */
+
+/* @name Types */
+
+/** Holds the value of a property. */
+typedef utf8proc_int16_t utf8proc_propval_t;
+
+/** Struct containing information about a codepoint. */
+typedef struct utf8proc_property_struct {
+  /**
+   * Unicode category.
+   * @see utf8proc_category_t.
+   */
+  utf8proc_propval_t category;
+  utf8proc_propval_t combining_class;
+  /**
+   * Bidirectional class.
+   * @see utf8proc_bidi_class_t.
+   */
+  utf8proc_propval_t bidi_class;
+  /**
+   * @anchor Decomposition type.
+   * @see utf8proc_decomp_type_t.
+   */
+  utf8proc_propval_t decomp_type;
+  utf8proc_uint16_t decomp_seqindex;
+  utf8proc_uint16_t casefold_seqindex;
+  utf8proc_uint16_t uppercase_seqindex;
+  utf8proc_uint16_t lowercase_seqindex;
+  utf8proc_uint16_t titlecase_seqindex;
+  utf8proc_uint16_t comb_index;
+  unsigned bidi_mirrored:1;
+  unsigned comp_exclusion:1;
+  /**
+   * Can this codepoint be ignored?
+   *
+   * Used by @ref utf8proc_decompose_char when @ref UTF8PROC_IGNORE is
+   * passed as an option.
+   */
+  unsigned ignorable:1;
+  unsigned control_boundary:1;
+  /** The width of the codepoint. */
+  unsigned charwidth:2;
+  unsigned pad:2;
+  /**
+   * Boundclass.
+   * @see utf8proc_boundclass_t.
+   */
+  unsigned boundclass:8;
+} utf8proc_property_t;
+
+/** Unicode categories. */
+typedef enum {
+  UTF8PROC_CATEGORY_CN  = 0, /**< Other, not assigned */
+  UTF8PROC_CATEGORY_LU  = 1, /**< Letter, uppercase */
+  UTF8PROC_CATEGORY_LL  = 2, /**< Letter, lowercase */
+  UTF8PROC_CATEGORY_LT  = 3, /**< Letter, titlecase */
+  UTF8PROC_CATEGORY_LM  = 4, /**< Letter, modifier */
+  UTF8PROC_CATEGORY_LO  = 5, /**< Letter, other */
+  UTF8PROC_CATEGORY_MN  = 6, /**< Mark, nonspacing */
+  UTF8PROC_CATEGORY_MC  = 7, /**< Mark, spacing combining */
+  UTF8PROC_CATEGORY_ME  = 8, /**< Mark, enclosing */
+  UTF8PROC_CATEGORY_ND  = 9, /**< Number, decimal digit */
+  UTF8PROC_CATEGORY_NL = 10, /**< Number, letter */
+  UTF8PROC_CATEGORY_NO = 11, /**< Number, other */
+  UTF8PROC_CATEGORY_PC = 12, /**< Punctuation, connector */
+  UTF8PROC_CATEGORY_PD = 13, /**< Punctuation, dash */
+  UTF8PROC_CATEGORY_PS = 14, /**< Punctuation, open */
+  UTF8PROC_CATEGORY_PE = 15, /**< Punctuation, close */
+  UTF8PROC_CATEGORY_PI = 16, /**< Punctuation, initial quote */
+  UTF8PROC_CATEGORY_PF = 17, /**< Punctuation, final quote */
+  UTF8PROC_CATEGORY_PO = 18, /**< Punctuation, other */
+  UTF8PROC_CATEGORY_SM = 19, /**< Symbol, math */
+  UTF8PROC_CATEGORY_SC = 20, /**< Symbol, currency */
+  UTF8PROC_CATEGORY_SK = 21, /**< Symbol, modifier */
+  UTF8PROC_CATEGORY_SO = 22, /**< Symbol, other */
+  UTF8PROC_CATEGORY_ZS = 23, /**< Separator, space */
+  UTF8PROC_CATEGORY_ZL = 24, /**< Separator, line */
+  UTF8PROC_CATEGORY_ZP = 25, /**< Separator, paragraph */
+  UTF8PROC_CATEGORY_CC = 26, /**< Other, control */
+  UTF8PROC_CATEGORY_CF = 27, /**< Other, format */
+  UTF8PROC_CATEGORY_CS = 28, /**< Other, surrogate */
+  UTF8PROC_CATEGORY_CO = 29, /**< Other, private use */
+} utf8proc_category_t;
+
+/** Bidirectional character classes. */
+typedef enum {
+  UTF8PROC_BIDI_CLASS_L     = 1, /**< Left-to-Right */
+  UTF8PROC_BIDI_CLASS_LRE   = 2, /**< Left-to-Right Embedding */
+  UTF8PROC_BIDI_CLASS_LRO   = 3, /**< Left-to-Right Override */
+  UTF8PROC_BIDI_CLASS_R     = 4, /**< Right-to-Left */
+  UTF8PROC_BIDI_CLASS_AL    = 5, /**< Right-to-Left Arabic */
+  UTF8PROC_BIDI_CLASS_RLE   = 6, /**< Right-to-Left Embedding */
+  UTF8PROC_BIDI_CLASS_RLO   = 7, /**< Right-to-Left Override */
+  UTF8PROC_BIDI_CLASS_PDF   = 8, /**< Pop Directional Format */
+  UTF8PROC_BIDI_CLASS_EN    = 9, /**< European Number */
+  UTF8PROC_BIDI_CLASS_ES   = 10, /**< European Separator */
+  UTF8PROC_BIDI_CLASS_ET   = 11, /**< European Number Terminator */
+  UTF8PROC_BIDI_CLASS_AN   = 12, /**< Arabic Number */
+  UTF8PROC_BIDI_CLASS_CS   = 13, /**< Common Number Separator */
+  UTF8PROC_BIDI_CLASS_NSM  = 14, /**< Nonspacing Mark */
+  UTF8PROC_BIDI_CLASS_BN   = 15, /**< Boundary Neutral */
+  UTF8PROC_BIDI_CLASS_B    = 16, /**< Paragraph Separator */
+  UTF8PROC_BIDI_CLASS_S    = 17, /**< Segment Separator */
+  UTF8PROC_BIDI_CLASS_WS   = 18, /**< Whitespace */
+  UTF8PROC_BIDI_CLASS_ON   = 19, /**< Other Neutrals */
+  UTF8PROC_BIDI_CLASS_LRI  = 20, /**< Left-to-Right Isolate */
+  UTF8PROC_BIDI_CLASS_RLI  = 21, /**< Right-to-Left Isolate */
+  UTF8PROC_BIDI_CLASS_FSI  = 22, /**< First Strong Isolate */
+  UTF8PROC_BIDI_CLASS_PDI  = 23, /**< Pop Directional Isolate */
+} utf8proc_bidi_class_t;
+
+/** Decomposition type. */
+typedef enum {
+  UTF8PROC_DECOMP_TYPE_FONT      = 1, /**< Font */
+  UTF8PROC_DECOMP_TYPE_NOBREAK   = 2, /**< Nobreak */
+  UTF8PROC_DECOMP_TYPE_INITIAL   = 3, /**< Initial */
+  UTF8PROC_DECOMP_TYPE_MEDIAL    = 4, /**< Medial */
+  UTF8PROC_DECOMP_TYPE_FINAL     = 5, /**< Final */
+  UTF8PROC_DECOMP_TYPE_ISOLATED  = 6, /**< Isolated */
+  UTF8PROC_DECOMP_TYPE_CIRCLE    = 7, /**< Circle */
+  UTF8PROC_DECOMP_TYPE_SUPER     = 8, /**< Super */
+  UTF8PROC_DECOMP_TYPE_SUB       = 9, /**< Sub */
+  UTF8PROC_DECOMP_TYPE_VERTICAL = 10, /**< Vertical */
+  UTF8PROC_DECOMP_TYPE_WIDE     = 11, /**< Wide */
+  UTF8PROC_DECOMP_TYPE_NARROW   = 12, /**< Narrow */
+  UTF8PROC_DECOMP_TYPE_SMALL    = 13, /**< Small */
+  UTF8PROC_DECOMP_TYPE_SQUARE   = 14, /**< Square */
+  UTF8PROC_DECOMP_TYPE_FRACTION = 15, /**< Fraction */
+  UTF8PROC_DECOMP_TYPE_COMPAT   = 16, /**< Compat */
+} utf8proc_decomp_type_t;
+
+/** Boundclass property. (TR29) */
+typedef enum {
+  UTF8PROC_BOUNDCLASS_START              =  0, /**< Start */
+  UTF8PROC_BOUNDCLASS_OTHER              =  1, /**< Other */
+  UTF8PROC_BOUNDCLASS_CR                 =  2, /**< Cr */
+  UTF8PROC_BOUNDCLASS_LF                 =  3, /**< Lf */
+  UTF8PROC_BOUNDCLASS_CONTROL            =  4, /**< Control */
+  UTF8PROC_BOUNDCLASS_EXTEND             =  5, /**< Extend */
+  UTF8PROC_BOUNDCLASS_L                  =  6, /**< L */
+  UTF8PROC_BOUNDCLASS_V                  =  7, /**< V */
+  UTF8PROC_BOUNDCLASS_T                  =  8, /**< T */
+  UTF8PROC_BOUNDCLASS_LV                 =  9, /**< Lv */
+  UTF8PROC_BOUNDCLASS_LVT                = 10, /**< Lvt */
+  UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR = 11, /**< Regional indicator */
+  UTF8PROC_BOUNDCLASS_SPACINGMARK        = 12, /**< Spacingmark */
+  UTF8PROC_BOUNDCLASS_PREPEND            = 13, /**< Prepend */
+  UTF8PROC_BOUNDCLASS_ZWJ                = 14, /**< Zero Width Joiner */
+  UTF8PROC_BOUNDCLASS_E_BASE             = 15, /**< Emoji Base */
+  UTF8PROC_BOUNDCLASS_E_MODIFIER         = 16, /**< Emoji Modifier */
+  UTF8PROC_BOUNDCLASS_GLUE_AFTER_ZWJ     = 17, /**< Glue_After_ZWJ */
+  UTF8PROC_BOUNDCLASS_E_BASE_GAZ         = 18, /**< E_BASE + GLUE_AFTER_ZJW */
+} utf8proc_boundclass_t;
+
+/**
+ * Function pointer type passed to @ref utf8proc_map_custom and
+ * @ref utf8proc_decompose_custom, which is used to specify a user-defined
+ * mapping of codepoints to be applied in conjunction with other mappings.
+ */
+typedef utf8proc_int32_t (*utf8proc_custom_func)(utf8proc_int32_t codepoint, void *data);
+
+/**
+ * Array containing the byte lengths of a UTF-8 encoded codepoint based
+ * on the first byte.
+ */
+UTF8PROC_DLLEXPORT extern const utf8proc_int8_t utf8proc_utf8class[256];
+
+/**
+ * Returns the utf8proc API version as a string MAJOR.MINOR.PATCH
+ * (http://semver.org format), possibly with a "-dev" suffix for
+ * development versions.
+ */
+UTF8PROC_DLLEXPORT const char *utf8proc_version(void);
+
+/**
+ * Returns an informative error string for the given utf8proc error code
+ * (e.g. the error codes returned by @ref utf8proc_map).
+ */
+UTF8PROC_DLLEXPORT const char *utf8proc_errmsg(utf8proc_ssize_t errcode);
+
+/**
+ * Reads a single codepoint from the UTF-8 sequence being pointed to by `str`.
+ * The maximum number of bytes read is `strlen`, unless `strlen` is
+ * negative (in which case up to 4 bytes are read).
+ *
+ * If a valid codepoint could be read, it is stored in the variable
+ * pointed to by `codepoint_ref`, otherwise that variable will be set to -1.
+ * In case of success, the number of bytes read is returned; otherwise, a
+ * negative error code is returned.
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_iterate(const utf8proc_uint8_t *str, utf8proc_ssize_t strlen, utf8proc_int32_t *codepoint_ref);
+
+/**
+ * Check if a codepoint is valid (regardless of whether it has been
+ * assigned a value by the current Unicode standard).
+ *
+ * @return 1 if the given `codepoint` is valid and otherwise return 0.
+ */
+UTF8PROC_DLLEXPORT utf8proc_bool utf8proc_codepoint_valid(utf8proc_int32_t codepoint);
+
+/**
+ * Encodes the codepoint as an UTF-8 string in the byte array pointed
+ * to by `dst`. This array must be at least 4 bytes long.
+ *
+ * In case of success the number of bytes written is returned, and
+ * otherwise 0 is returned.
+ *
+ * This function does not check whether `codepoint` is valid Unicode.
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_encode_char(utf8proc_int32_t codepoint, utf8proc_uint8_t *dst);
+
+/**
+ * Look up the properties for a given codepoint.
+ *
+ * @param codepoint The Unicode codepoint.
+ *
+ * @returns
+ * A pointer to a (constant) struct containing information about
+ * the codepoint.
+ * @par
+ * If the codepoint is unassigned or invalid, a pointer to a special struct is
+ * returned in which `category` is 0 (@ref UTF8PROC_CATEGORY_CN).
+ */
+UTF8PROC_DLLEXPORT const utf8proc_property_t *utf8proc_get_property(utf8proc_int32_t codepoint);
+
+/** Decompose a codepoint into an array of codepoints.
+ *
+ * @param codepoint the codepoint.
+ * @param dst the destination buffer.
+ * @param bufsize the size of the destination buffer.
+ * @param options one or more of the following flags:
+ * - @ref UTF8PROC_REJECTNA  - return an error `codepoint` is unassigned
+ * - @ref UTF8PROC_IGNORE    - strip "default ignorable" codepoints
+ * - @ref UTF8PROC_CASEFOLD  - apply Unicode casefolding
+ * - @ref UTF8PROC_COMPAT    - replace certain codepoints with their
+ *                             compatibility decomposition
+ * - @ref UTF8PROC_CHARBOUND - insert 0xFF bytes before each grapheme cluster
+ * - @ref UTF8PROC_LUMP      - lump certain different codepoints together
+ * - @ref UTF8PROC_STRIPMARK - remove all character marks
+ * @param last_boundclass
+ * Pointer to an integer variable containing
+ * the previous codepoint's boundary class if the @ref UTF8PROC_CHARBOUND
+ * option is used.  Otherwise, this parameter is ignored.
+ *
+ * @return
+ * In case of success, the number of codepoints written is returned; in case
+ * of an error, a negative error code is returned (@ref utf8proc_errmsg).
+ * @par
+ * If the number of written codepoints would be bigger than `bufsize`, the
+ * required buffer size is returned, while the buffer will be overwritten with
+ * undefined data.
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_decompose_char(
+  utf8proc_int32_t codepoint, utf8proc_int32_t *dst, utf8proc_ssize_t bufsize,
+  utf8proc_option_t options, int *last_boundclass
+);
+
+/**
+ * The same as @ref utf8proc_decompose_char, but acts on a whole UTF-8
+ * string and orders the decomposed sequences correctly.
+ *
+ * If the @ref UTF8PROC_NULLTERM flag in `options` is set, processing
+ * will be stopped, when a NULL byte is encounted, otherwise `strlen`
+ * bytes are processed.  The result (in the form of 32-bit unicode
+ * codepoints) is written into the buffer being pointed to by
+ * `buffer` (which must contain at least `bufsize` entries).  In case of
+ * success, the number of codepoints written is returned; in case of an
+ * error, a negative error code is returned (@ref utf8proc_errmsg).
+ * See @ref utf8proc_decompose_custom to supply additional transformations.
+ *
+ * If the number of written codepoints would be bigger than `bufsize`, the
+ * required buffer size is returned, while the buffer will be overwritten with
+ * undefined data.
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_decompose(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen,
+  utf8proc_int32_t *buffer, utf8proc_ssize_t bufsize, utf8proc_option_t options
+);
+
+/**
+ * The same as @ref utf8proc_decompose, but also takes a `custom_func` mapping function
+ * that is called on each codepoint in `str` before any other transformations
+ * (along with a `custom_data` pointer that is passed through to `custom_func`).
+ * The `custom_func` argument is ignored if it is `NULL`.  See also @ref utf8proc_map_custom.
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_decompose_custom(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen,
+  utf8proc_int32_t *buffer, utf8proc_ssize_t bufsize, utf8proc_option_t options,
+  utf8proc_custom_func custom_func, void *custom_data
+);
+
+/**
+ * Normalizes the sequence of `length` codepoints pointed to by `buffer`
+ * in-place (i.e., the result is also stored in `buffer`).
+ *
+ * @param buffer the (native-endian UTF-32) unicode codepoints to re-encode.
+ * @param length the length (in codepoints) of the buffer.
+ * @param options a bitwise or (`|`) of one or more of the following flags:
+ * - @ref UTF8PROC_NLF2LS  - convert LF, CRLF, CR and NEL into LS
+ * - @ref UTF8PROC_NLF2PS  - convert LF, CRLF, CR and NEL into PS
+ * - @ref UTF8PROC_NLF2LF  - convert LF, CRLF, CR and NEL into LF
+ * - @ref UTF8PROC_STRIPCC - strip or convert all non-affected control characters
+ * - @ref UTF8PROC_COMPOSE - try to combine decomposed codepoints into composite
+ *                           codepoints
+ * - @ref UTF8PROC_STABLE  - prohibit combining characters that would violate
+ *                           the unicode versioning stability
+ *
+ * @return
+ * In case of success, the length (in codepoints) of the normalized UTF-32 string is
+ * returned; otherwise, a negative error code is returned (@ref utf8proc_errmsg).
+ *
+ * @warning The entries of the array pointed to by `str` have to be in the
+ *          range `0x0000` to `0x10FFFF`. Otherwise, the program might crash!
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_normalize_utf32(utf8proc_int32_t *buffer, utf8proc_ssize_t length, utf8proc_option_t options);
+
+/**
+ * Reencodes the sequence of `length` codepoints pointed to by `buffer`
+ * UTF-8 data in-place (i.e., the result is also stored in `buffer`).
+ * Can optionally normalize the UTF-32 sequence prior to UTF-8 conversion.
+ *
+ * @param buffer the (native-endian UTF-32) unicode codepoints to re-encode.
+ * @param length the length (in codepoints) of the buffer.
+ * @param options a bitwise or (`|`) of one or more of the following flags:
+ * - @ref UTF8PROC_NLF2LS  - convert LF, CRLF, CR and NEL into LS
+ * - @ref UTF8PROC_NLF2PS  - convert LF, CRLF, CR and NEL into PS
+ * - @ref UTF8PROC_NLF2LF  - convert LF, CRLF, CR and NEL into LF
+ * - @ref UTF8PROC_STRIPCC - strip or convert all non-affected control characters
+ * - @ref UTF8PROC_COMPOSE - try to combine decomposed codepoints into composite
+ *                           codepoints
+ * - @ref UTF8PROC_STABLE  - prohibit combining characters that would violate
+ *                           the unicode versioning stability
+ * - @ref UTF8PROC_CHARBOUND - insert 0xFF bytes before each grapheme cluster
+ *
+ * @return
+ * In case of success, the length (in bytes) of the resulting nul-terminated
+ * UTF-8 string is returned; otherwise, a negative error code is returned
+ * (@ref utf8proc_errmsg).
+ *
+ * @warning The amount of free space pointed to by `buffer` must
+ *          exceed the amount of the input data by one byte, and the
+ *          entries of the array pointed to by `str` have to be in the
+ *          range `0x0000` to `0x10FFFF`. Otherwise, the program might crash!
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_reencode(utf8proc_int32_t *buffer, utf8proc_ssize_t length, utf8proc_option_t options);
+
+/**
+ * Given a pair of consecutive codepoints, return whether a grapheme break is
+ * permitted between them (as defined by the extended grapheme clusters in UAX#29).
+ *
+ * @param state Beginning with Version 29 (Unicode 9.0.0), this algorithm requires
+ *              state to break graphemes. This state can be passed in as a pointer
+ *              in the `state` argument and should initially be set to 0. If the
+ *              state is not passed in (i.e. a null pointer is passed), UAX#29 rules
+ *              GB10/12/13 which require this state will not be applied, essentially
+ *              matching the rules in Unicode 8.0.0.
+ *
+ * @warning If the state parameter is used, `utf8proc_grapheme_break_stateful` must
+ *          be called IN ORDER on ALL potential breaks in a string.
+ */
+UTF8PROC_DLLEXPORT utf8proc_bool utf8proc_grapheme_break_stateful(
+    utf8proc_int32_t codepoint1, utf8proc_int32_t codepoint2, utf8proc_int32_t *state);
+
+/**
+ * Same as @ref utf8proc_grapheme_break_stateful, except without support for the
+ * Unicode 9 additions to the algorithm. Supported for legacy reasons.
+ */
+UTF8PROC_DLLEXPORT utf8proc_bool utf8proc_grapheme_break(
+    utf8proc_int32_t codepoint1, utf8proc_int32_t codepoint2);
+
+
+/**
+ * Given a codepoint `c`, return the codepoint of the corresponding
+ * lower-case character, if any; otherwise (if there is no lower-case
+ * variant, or if `c` is not a valid codepoint) return `c`.
+ */
+UTF8PROC_DLLEXPORT utf8proc_int32_t utf8proc_tolower(utf8proc_int32_t c);
+
+/**
+ * Given a codepoint `c`, return the codepoint of the corresponding
+ * upper-case character, if any; otherwise (if there is no upper-case
+ * variant, or if `c` is not a valid codepoint) return `c`.
+ */
+UTF8PROC_DLLEXPORT utf8proc_int32_t utf8proc_toupper(utf8proc_int32_t c);
+
+/**
+ * Given a codepoint `c`, return the codepoint of the corresponding
+ * title-case character, if any; otherwise (if there is no title-case
+ * variant, or if `c` is not a valid codepoint) return `c`.
+ */
+UTF8PROC_DLLEXPORT utf8proc_int32_t utf8proc_totitle(utf8proc_int32_t c);
+
+/**
+ * Given a codepoint, return a character width analogous to `wcwidth(codepoint)`,
+ * except that a width of 0 is returned for non-printable codepoints
+ * instead of -1 as in `wcwidth`.
+ *
+ * @note
+ * If you want to check for particular types of non-printable characters,
+ * (analogous to `isprint` or `iscntrl`), use @ref utf8proc_category. */
+UTF8PROC_DLLEXPORT int utf8proc_charwidth(utf8proc_int32_t codepoint);
+
+/**
+ * Return the Unicode category for the codepoint (one of the
+ * @ref utf8proc_category_t constants.)
+ */
+UTF8PROC_DLLEXPORT utf8proc_category_t utf8proc_category(utf8proc_int32_t codepoint);
+
+/**
+ * Return the two-letter (nul-terminated) Unicode category string for
+ * the codepoint (e.g. `"Lu"` or `"Co"`).
+ */
+UTF8PROC_DLLEXPORT const char *utf8proc_category_string(utf8proc_int32_t codepoint);
+
+/**
+ * Maps the given UTF-8 string pointed to by `str` to a new UTF-8
+ * string, allocated dynamically by `malloc` and returned via `dstptr`.
+ *
+ * If the @ref UTF8PROC_NULLTERM flag in the `options` field is set,
+ * the length is determined by a NULL terminator, otherwise the
+ * parameter `strlen` is evaluated to determine the string length, but
+ * in any case the result will be NULL terminated (though it might
+ * contain NULL characters with the string if `str` contained NULL
+ * characters). Other flags in the `options` field are passed to the
+ * functions defined above, and regarded as described.  See also
+ * @ref utfproc_map_custom to supply a custom codepoint transformation.
+ *
+ * In case of success the length of the new string is returned,
+ * otherwise a negative error code is returned.
+ *
+ * @note The memory of the new UTF-8 string will have been allocated
+ * with `malloc`, and should therefore be deallocated with `free`.
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_map(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen, utf8proc_uint8_t **dstptr, utf8proc_option_t options
+);
+
+/**
+ * Like @ref utf8proc_map, but also takes a `custom_func` mapping function
+ * that is called on each codepoint in `str` before any other transformations
+ * (along with a `custom_data` pointer that is passed through to `custom_func`).
+ * The `custom_func` argument is ignored if it is `NULL`.
+ */
+UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_map_custom(
+  const utf8proc_uint8_t *str, utf8proc_ssize_t strlen, utf8proc_uint8_t **dstptr, utf8proc_option_t options,
+  utf8proc_custom_func custom_func, void *custom_data
+);
+
+/** @name Unicode normalization
+ *
+ * Returns a pointer to newly allocated memory of a NFD, NFC, NFKD or NFKC
+ * normalized version of the null-terminated string `str`.  These
+ * are shortcuts to calling @ref utf8proc_map with @ref UTF8PROC_NULLTERM
+ * combined with @ref UTF8PROC_STABLE and flags indicating the normalization.
+ */
+/** @{ */
+/** NFD normalization (@ref UTF8PROC_DECOMPOSE). */
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFD(const utf8proc_uint8_t *str);
+/** NFC normalization (@ref UTF8PROC_COMPOSE). */
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFC(const utf8proc_uint8_t *str);
+/** NFKD normalization (@ref UTF8PROC_DECOMPOSE and @ref UTF8PROC_COMPAT). */
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFKD(const utf8proc_uint8_t *str);
+/** NFKC normalization (@ref UTF8PROC_COMPOSE and @ref UTF8PROC_COMPAT). */
+UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFKC(const utf8proc_uint8_t *str);
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libdispatch/u8.c b/libdispatch/u8.c
new file mode 100644
index 0000000..d5b7e2b
--- /dev/null
+++ b/libdispatch/u8.c
@@ -0,0 +1,13048 @@
+/*
+	Copyright (C) 2014-2016 Quinten Lansu
+
+	Permission is hereby granted, free of charge, to any person
+	obtaining a copy of this software and associated documentation
+	files (the "Software"), to deal in the Software without
+	restriction, including without limitation the rights to use,
+	copy, modify, merge, publish, distribute, sublicense, and/or
+	sell copies of the Software, and to permit persons to whom the
+	Software is furnished to do so, subject to the following
+	conditions:
+
+	The above copyright notice and this permission notice shall be
+	included in all copies or substantial portions of the Software.
+
+	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+	OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+	NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+	HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+	WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+	OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* This is the concatenation of
+
+unicodedatabase.c codepoint.c database.c streaming.c
+composition.c decomposition.c utf8rewind.c 
+(order is important)
+
+with some modifications to simplify
+All functions are made static except nc_utf8normalize.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#if 0
+#include <locale.h>
+#include <stddef.h>
+#include <wchar.h>
+#endif
+#include "u8.h"
+
+/*
+	DO NOT MODIFY, AUTO-GENERATED
+
+	Generated on:
+		2016-02-01T14:10:25
+
+	Command line:
+		tools\converter\unicodedata.py
+*/
+
+
+const size_t GeneralCategoryIndex[34816] = {
+	0, 32, 64, 96, 0, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 224, 480, 512, 544, 576, 608, 640, 672, 704, 704, 704, 736, 768, 800, 832, 864,
+	896, 928, 527, 224, 960, 224, 992, 224, 224, 1024, 1056, 1088, 1120, 1152, 1184, 1216, 1248, 1280, 1312, 1344, 1280, 1280, 1376, 1408, 1440, 1472, 1504, 1280, 1280, 1536, 1568, 1600,
+	1632, 1664, 1696, 1728, 1727, 1760, 1727, 1792, 1824, 1856, 1888, 1920, 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176, 2208, 2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528, 2560,
+	2592, 2624, 2656, 2688, 2720, 2752, 2784, 2816, 2720, 2848, 2880, 2912, 2944, 2976, 3008, 3040, 3072, 3104, 3136, 1727, 3168, 3200, 3232, 1727, 3264, 3296, 3328, 3360, 3392, 3424, 3456, 1727,
+	1280, 3488, 3520, 3552, 3584, 893, 3616, 3648, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 3680, 1280, 3712, 3744, 3776, 1280, 3808, 1280, 3840, 3872, 3904, 1280, 1280, 3936,
+	3968, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 4000, 4032, 1280, 1280, 4064, 4096, 4128, 4160, 4192, 1280, 4224, 4256, 4288,
+	4320, 1280, 4352, 4384, 1280, 4416, 1280, 4448, 4480, 4512, 4544, 4576, 1280, 4608, 4640, 4672, 4704, 1280, 4736, 4768, 4800, 4832, 1727, 1727, 4864, 4896, 4928, 4960, 4992, 5024, 1280, 5056,
+	1280, 5088, 5120, 5152, 1727, 1727, 5184, 5216, 527, 5248, 5280, 5312, 597, 5260, 704, 5344, 224, 224, 224, 224, 5376, 224, 224, 224, 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, 6164, 6164, 6164, 6164, 6164, 6164, 6164, 6208, 6240, 4670, 6272, 6304, 6336, 6368, 6400,
+	4670, 6432, 6464, 6496, 6528, 4670, 4670, 6560, 4670, 4670, 4670, 4670, 4670, 6592, 6093, 6624, 4670, 4670, 4670, 6656, 4670, 4670, 4670, 4670, 4670, 4670, 4670, 6688, 6720, 4670, 6752, 6784,
+	4670, 4670, 4670, 4670, 4670, 4670, 4670, 4670, 6164, 6164, 6164, 6164, 6816, 6164, 6848, 6880, 6164, 6164, 6164, 6164, 6164, 6164, 6164, 6164, 4670, 6912, 6944, 6976, 7008, 7040, 7072, 1727,
+	893, 7104, 7136, 7168, 224, 224, 224, 7200, 527, 7232, 1280, 7264, 7296, 7328, 7328, 704, 7360, 7392, 7424, 1727, 7456, 4670, 4670, 7488, 4670, 4670, 4670, 4670, 4670, 4670, 7520, 7552,
+	7584, 7616, 3336, 1280, 7648, 3968, 1280, 7680, 4427, 7712, 1280, 1280, 7744, 1200, 4670, 7776, 7808, 7840, 7872, 4670, 7840, 7904, 4670, 7808, 4670, 4670, 4670, 4670, 4670, 4670, 4670, 4670,
+	7936, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 7968, 4670, 4670, 7936, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 8000, 1727,
+	8032, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280,
+	1280, 1280, 1280, 1280, 8064, 4670, 8096, 8128, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 8160, 8192, 224, 8224, 8256, 1280, 1280, 8288, 8320, 8352, 224, 8384, 8416, 8448, 1727, 8480,
+	8512, 8544, 1280, 8576, 8608, 8640, 8672, 8704, 1568, 8736, 8768, 8800, 1824, 8832, 8864, 8896, 1280, 8928, 8960, 8992, 1280, 9024, 9056, 9088, 9120, 9152, 9184, 9216, 1727, 1727, 1280, 9248,
+	7936, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 9280, 9312, 9344,
+	9376, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 9408, 9376, 1727, 1727, 9440,
+	9376, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 9440,
+	9472, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 9504, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 9536, 1280, 1280, 9568, 1727, 9600, 9632, 9664, 1280, 1280, 9696, 9728, 1280,
+	1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 9760, 1744, 1280, 9792, 1280, 9824, 9856, 9888, 9920, 9952, 9984, 1280, 1280, 1280, 10016, 10048, 10080, 10112, 10144, 5146, 4480, 10176, 10208,
+	10240, 10272, 10304, 1727, 1280, 1280, 1280, 1200, 10336, 10368, 6016, 10400, 10432, 10464, 10496, 10528, 1727, 1727, 1727, 1727, 8800, 1280, 10560, 10592, 1280, 10624, 10656, 10688, 10720, 1280, 10752, 1727,
+	893, 10784, 10816, 1280, 4560, 10848, 1727, 1727, 1280, 10880, 1280, 10912, 1727, 1727, 1727, 1727, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 7296, 9810, 10944, 1727, 1727, 1727, 1727,
+	10976, 11008, 11040, 11072, 4480, 11104, 1727, 1727, 11136, 11168, 1727, 1727, 1280, 11200, 1727, 1727, 11232, 11264, 11296, 11328, 11360, 1727, 11392, 11424, 1280, 11456, 11488, 11520, 11552, 11584, 1727, 1727,
+	1280, 1280, 11616, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 11648, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	11680, 11712, 11744, 11776, 4992, 11808, 11840, 11872, 11904, 11936, 11968, 12000, 4992, 12032, 12064, 12096, 12128, 12160, 1727, 1727, 1727, 1744, 12192, 12224, 2336, 12256, 12288, 12320, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1280, 12352, 12384, 1727, 1727, 1727, 1727, 1727, 1280, 12416, 12448, 1727, 1280, 12480, 12512, 1727, 1280, 12544, 10848, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 893, 527, 12576, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1280, 11856, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 11856, 1727, 1727, 1727,
+	6016, 6016, 6016, 12608, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280,
+	1280, 12640, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 11856, 4480, 12672, 1727, 1727, 1744, 12704, 1280, 12736, 12768, 12800, 12832, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1280, 1280, 12864, 12896, 12928, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	12960, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1280, 1280, 1280, 12992, 13024, 13056, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	4670, 4670, 4670, 4670, 4670, 4670, 4670, 7520, 4670, 6989, 4670, 13088, 13120, 13152, 13184, 1727, 4670, 4670, 13216, 1727, 1727, 1727, 1727, 1727, 4670, 4670, 8080, 13248, 1727, 1727, 1727, 1727,
+	13280, 13312, 13344, 13324, 13376, 13408, 13440, 13472, 13504, 13536, 13568, 13600, 13632, 13280, 13664, 13696, 13324, 13304, 13728, 13760, 13792, 13824, 13856, 13888, 13920, 13952, 13984, 14016, 14048, 14080, 14112, 14144,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1280, 1280, 1280, 1280, 1280, 1280, 14176, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 14208, 14240, 14272, 14304, 14336, 14368, 1727, 14400, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	4670, 14432, 4670, 4670, 14464, 14496, 14528, 7520, 14560, 14592, 4670, 14432, 14624, 1727, 1727, 14656, 14688, 14720, 14752, 1727, 1727, 1727, 1727, 1727, 4670, 14784, 4670, 14816, 4670, 4670, 14848, 14880,
+	4670, 4670, 4670, 4670, 4670, 4670, 4670, 7808, 4670, 4670, 14912, 7456, 4670, 14944, 4670, 4670, 4670, 4670, 6993, 4670, 4670, 4670, 14976, 15008, 4670, 4670, 4670, 15040, 4670, 4670, 14630, 1727,
+	14432, 4670, 15072, 4670, 15104, 15136, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	7936, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 7990, 1727, 7936, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 15168, 7936, 1727, 1727, 1727, 1727, 1727,
+	15200, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 4560, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	15232, 15264, 15264, 15264, 1727, 1727, 1727, 1727, 704, 704, 704, 704, 704, 704, 704, 15296, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	9472, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 15328,
+	9472, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+	1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 15360,
+};
+const size_t* GeneralCategoryIndexPtr = GeneralCategoryIndex;
+
+const uint32_t GeneralCategoryData[15392] = {
+	0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000, 0x2000000,
+	0x400000, 0x20000, 0x20000, 0x20000, 0x80000, 0x20000, 0x20000, 0x20000, 0x2000, 0x4000, 0x20000, 0x40000, 0x20000, 0x1000, 0x20000, 0x20000, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x20000, 0x40000, 0x40000, 0x40000, 0x20000,
+	0x20000, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2000, 0x20000, 0x4000, 0x100000, 0x800,
+	0x100000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x2000, 0x40000, 0x4000, 0x40000, 0x2000000,
+	0x400000, 0x20000, 0x80000, 0x80000, 0x80000, 0x80000, 0x200000, 0x20000, 0x100000, 0x200000, 0x10, 0x8000, 0x40000, 0x4000000, 0x200000, 0x100000, 0x200000, 0x40000, 0x400, 0x400, 0x100000, 0x02, 0x20000, 0x20000, 0x100000, 0x400, 0x10, 0x10000, 0x400, 0x400, 0x400, 0x20000,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40000, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+	0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02,
+	0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x01,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x10, 0x01, 0x02, 0x02, 0x02,
+	0x10, 0x10, 0x10, 0x10, 0x01, 0x04, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02,
+	0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+	0x08, 0x08, 0x100000, 0x100000, 0x100000, 0x100000, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000,
+	0x08, 0x08, 0x08, 0x08, 0x08, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x08, 0x100000, 0x08, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x02, 0x01, 0x02, 0x08, 0x100000, 0x01, 0x02, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x20000, 0x01,
+	0x00, 0x00, 0x00, 0x00, 0x100000, 0x100000, 0x01, 0x20000, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x40000, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x01, 0x02, 0x200000, 0x20, 0x20, 0x20, 0x20, 0x20, 0x80, 0x80, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x08, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000,
+	0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x20000, 0x1000, 0x00, 0x00, 0x200000, 0x200000, 0x80000, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1000, 0x20,
+	0x20000, 0x20, 0x20, 0x20000, 0x20, 0x20, 0x20000, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x40000, 0x40000, 0x40000, 0x20000, 0x20000, 0x80000, 0x20000, 0x20000, 0x200000, 0x200000, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x4000000, 0x00, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x20000, 0x20000, 0x20000, 0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4000000, 0x200000, 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x08, 0x08, 0x20, 0x20, 0x200000, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x10, 0x200000, 0x200000, 0x10,
+	0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x4000000, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x08, 0x08, 0x200000, 0x20000, 0x20000, 0x20000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x08, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x08, 0x20, 0x20, 0x20, 0x08, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20000, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x40, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x40, 0x20, 0x10, 0x40, 0x40,
+	0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x20, 0x40, 0x40, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x20, 0x20, 0x20000, 0x20000, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x20, 0x40, 0x40, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x10, 0x40, 0x40,
+	0x40, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10,
+	0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x80000, 0x80000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x80000, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x20, 0x20, 0x40, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x00, 0x40, 0x40,
+	0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20, 0x20, 0x10, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x20, 0x20, 0x40, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x10, 0x40, 0x40,
+	0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x80000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x20, 0x40, 0x40, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x10, 0x40, 0x20,
+	0x40, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10,
+	0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x200000, 0x10, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10,
+	0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
+	0x20, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x400, 0x400, 0x400, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x80000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x20, 0x40, 0x40, 0x40, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20,
+	0x20, 0x40, 0x40, 0x40, 0x40, 0x00, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000,
+	0x00, 0x20, 0x40, 0x40, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x10, 0x40, 0x20,
+	0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x20, 0x40, 0x40, 0x00, 0x40, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+	0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x40, 0x40,
+	0x40, 0x20, 0x20, 0x20, 0x20, 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x200000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x00, 0x00, 0x40, 0x40, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x40, 0x40, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x10, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x08, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x200000, 0x200000, 0x200000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x200000, 0x20000, 0x200000, 0x200000, 0x200000, 0x20, 0x20, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x20, 0x200000, 0x20, 0x200000, 0x20, 0x2000, 0x4000, 0x2000, 0x4000, 0x40, 0x40,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x20, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x200000, 0x200000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x200000, 0x200000, 0x200000, 0x200000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x10,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20,
+	0x20, 0x10, 0x40, 0x40, 0x40, 0x10, 0x10, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x20, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x10, 0x40, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x40, 0x40, 0x40, 0x20, 0x200000, 0x200000,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x08, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
+	0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x20,
+	0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x1000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x20000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x400000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x2000, 0x4000, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x20000, 0x20000, 0x200, 0x200, 0x200, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40,
+	0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x20000, 0x20000, 0x08, 0x20000, 0x20000, 0x20000, 0x80000, 0x10, 0x20, 0x00, 0x00,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x1000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20, 0x20, 0x20, 0x4000000, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
+	0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+	0x40, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x400, 0x00, 0x00, 0x00, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x20, 0x00, 0x00, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
+	0x20, 0x40, 0x20, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x08, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x80, 0x00,
+	0x20, 0x20, 0x20, 0x20, 0x40, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x40, 0x40, 0x40,
+	0x40, 0x40, 0x20, 0x40, 0x40, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000,
+	0x20000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00,
+	0x20, 0x20, 0x40, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x40, 0x20, 0x20, 0x40, 0x40, 0x40, 0x20, 0x40, 0x20, 0x20, 0x20, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x20000, 0x20000,
+	0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20000, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x20, 0x10, 0x10, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x100000, 0x02, 0x100000,
+	0x100000, 0x100000, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x100000, 0x100000, 0x100000, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x100000, 0x100000, 0x100000,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x100000, 0x100000, 0x100000, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x100000, 0x100000, 0x00,
+	0x400000, 0x400000, 0x400000, 0x400000, 0x400000, 0x400000, 0x400000, 0x400000, 0x400000, 0x400000, 0x400000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x20000, 0x20000, 0x8000, 0x10000, 0x2000, 0x8000, 0x8000, 0x10000, 0x2000, 0x8000,
+	0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x800000, 0x1000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x400000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x8000, 0x10000, 0x20000, 0x20000, 0x20000, 0x20000, 0x800,
+	0x800, 0x20000, 0x20000, 0x20000, 0x40000, 0x2000, 0x4000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x40000, 0x20000, 0x800, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x400000,
+	0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x00, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x400, 0x08, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x40000, 0x40000, 0x40000, 0x2000, 0x4000, 0x08,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x40000, 0x40000, 0x40000, 0x2000, 0x4000, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00,
+	0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x80000, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x80, 0x80, 0x80,
+	0x80, 0x20, 0x80, 0x80, 0x80, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x01, 0x200000, 0x200000, 0x200000, 0x200000, 0x01, 0x200000, 0x200000, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x200000, 0x01, 0x200000, 0x200000, 0x40000, 0x01, 0x01, 0x01, 0x01, 0x01, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x01, 0x200000, 0x01, 0x200000, 0x01, 0x200000, 0x01, 0x01, 0x01, 0x01, 0x200000, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x10, 0x10, 0x10, 0x10, 0x02, 0x200000, 0x200000, 0x02, 0x02, 0x01, 0x01,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x01, 0x02, 0x02, 0x02, 0x02, 0x200000, 0x40000, 0x200000, 0x200000, 0x02, 0x200000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200,
+	0x200, 0x200, 0x200, 0x01, 0x02, 0x200, 0x200, 0x200, 0x200, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x40000, 0x200000, 0x200000, 0x40000, 0x200000, 0x200000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x40000, 0x200000, 0x200000, 0x40000, 0x200000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x2000, 0x4000, 0x2000, 0x4000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x40000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x2000, 0x4000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x2000, 0x4000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x40000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x2000, 0x4000, 0x2000, 0x4000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x2000, 0x4000, 0x40000, 0x40000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000,
+	0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x200000, 0x200000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x40000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x08, 0x01, 0x01,
+	0x01, 0x02, 0x01, 0x02, 0x02, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x01, 0x02, 0x01, 0x02, 0x20, 0x20, 0x20, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x400, 0x20000, 0x20000,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
+	0x20000, 0x20000, 0x8000, 0x10000, 0x8000, 0x10000, 0x20000, 0x20000, 0x20000, 0x8000, 0x10000, 0x20000, 0x8000, 0x10000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x1000, 0x20000, 0x20000, 0x1000, 0x20000, 0x8000, 0x10000, 0x20000, 0x20000,
+	0x8000, 0x10000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x08, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x1000, 0x1000, 0x20000, 0x20000, 0x20000, 0x20000,
+	0x1000, 0x20000, 0x2000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00,
+	0x400000, 0x20000, 0x20000, 0x20000, 0x200000, 0x08, 0x10, 0x200, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x200000, 0x200000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x1000, 0x2000, 0x4000, 0x4000,
+	0x200000, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x1000, 0x08, 0x08, 0x08, 0x08, 0x08, 0x200000, 0x200000, 0x200, 0x200, 0x200, 0x08, 0x10, 0x20000, 0x200000, 0x200000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x100000, 0x100000, 0x08, 0x08, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x08, 0x08, 0x08, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x200000, 0x200000, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	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, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x20000, 0x20000, 0x20000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x10, 0x20, 0x80, 0x80, 0x80, 0x20000, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x08,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x08, 0x08, 0x00, 0x20,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x20, 0x20, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+	0x100000, 0x100000, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x08, 0x100000, 0x100000, 0x01, 0x02, 0x01, 0x02, 0x00, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02,
+	0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x08, 0x02, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x40, 0x40, 0x20, 0x20, 0x40, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x200000, 0x80000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x40, 0x40, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+	0x40, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x20000, 0x20000, 0x10, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x20000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x40, 0x40, 0x40,
+	0x40, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x08, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x40, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x200000, 0x200000, 0x200000, 0x10, 0x40, 0x20, 0x40, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x20, 0x20, 0x20, 0x10, 0x10, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20,
+	0x10, 0x20, 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, 0x10, 0x10, 0x08, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x20, 0x20, 0x40, 0x40, 0x20000, 0x20000, 0x10, 0x08, 0x08, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x100000, 0x08, 0x08, 0x08, 0x08,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x40, 0x40, 0x20, 0x40, 0x40, 0x20, 0x40, 0x40, 0x20000, 0x40, 0x20, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
+	0x8000000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8000000,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8000000,
+	0x10000000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10000000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00,
+	0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000, 0x100000,
+	0x100000, 0x100000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x4000, 0x2000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 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, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x80000, 0x200000, 0x00, 0x00,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x2000, 0x4000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20000, 0x1000, 0x1000, 0x800, 0x800, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000,
+	0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x20000, 0x20000, 0x2000, 0x4000, 0x20000, 0x20000, 0x20000, 0x20000, 0x800, 0x800, 0x800, 0x20000, 0x20000, 0x20000, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x1000, 0x2000, 0x4000, 0x2000, 0x4000, 0x2000, 0x4000, 0x20000,
+	0x20000, 0x20000, 0x40000, 0x1000, 0x40000, 0x40000, 0x40000, 0x00, 0x20000, 0x80000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x4000000,
+	0x00, 0x20000, 0x20000, 0x20000, 0x80000, 0x20000, 0x20000, 0x20000, 0x2000, 0x4000, 0x20000, 0x40000, 0x20000, 0x1000, 0x20000, 0x20000, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x20000, 0x20000, 0x40000, 0x40000, 0x40000, 0x20000,
+	0x20000, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2000, 0x20000, 0x4000, 0x100000, 0x800,
+	0x100000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x2000, 0x40000, 0x4000, 0x40000, 0x2000,
+	0x4000, 0x20000, 0x2000, 0x4000, 0x20000, 0x20000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,
+	0x80000, 0x80000, 0x40000, 0x100000, 0x200000, 0x80000, 0x80000, 0x00, 0x200000, 0x40000, 0x40000, 0x40000, 0x40000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4000000, 0x4000000, 0x4000000, 0x200000, 0x200000, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
+	0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x400, 0x400, 0x400, 0x400, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x400, 0x400, 0x200000, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x20, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x20, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00,
+	0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x200, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x200, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x200, 0x200, 0x200, 0x200, 0x200, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 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,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x20000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x200000, 0x200000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
+	0x10, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x400, 0x400, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x400, 0x400, 0x400,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x200000, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00,
+	0x40, 0x20, 0x40, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x20000, 0x20000, 0x4000000, 0x20000, 0x20000,
+	0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100,
+	0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20000, 0x20000, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40,
+	0x40, 0x10, 0x10, 0x10, 0x10, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x40, 0x20, 0x20, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20,
+	0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x10, 0x40, 0x40,
+	0x20, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x40, 0x40, 0x40, 0x40, 0x20,
+	0x20, 0x40, 0x20, 0x20, 0x10, 0x10, 0x20000, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x40, 0x20,
+	0x20, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x40, 0x20,
+	0x20, 0x20000, 0x20000, 0x20000, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x40, 0x20, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+	0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x200, 0x00, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x00, 0x00, 0x00, 0x20000, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20000, 0x20000, 0x20000, 0x20000, 0x20000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x08, 0x08, 0x08, 0x08, 0x20000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400,
+	0x400, 0x400, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+	0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+	0x10, 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,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x200000, 0x20, 0x20, 0x20000,
+	0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x40, 0x40, 0x20, 0x20, 0x20, 0x200000, 0x200000, 0x200000, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x20, 0x20, 0x20, 0x20, 0x20,
+	0x20, 0x20, 0x20, 0x200000, 0x200000, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x20, 0x20, 0x20, 0x20, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00,
+	0x200000, 0x200000, 0x20, 0x20, 0x20, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01,
+	0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x40000, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40000, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x40000, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x00, 0x00, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100,
+	0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+	0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
+	0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00,
+	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40000, 0x40000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000,
+	0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x200000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x10, 0x00, 0x00,
+	0x00, 0x4000000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000, 0x4000000,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 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, 0x10000000, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10000000, 0x00, 0x00,
+};
+const uint32_t* GeneralCategoryDataPtr = GeneralCategoryData;
+
+const size_t CanonicalCombiningClassIndex[34816] = {
+	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, 64, 96, 128, 0, 0, 0, 0,
+	0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 192, 224, 256, 0, 288, 0, 320, 352, 0, 0, 384, 416, 448, 480, 512, 0, 0, 0, 0, 544,
+	576, 608, 640, 0, 0, 0, 0, 672, 0, 704, 736, 0, 0, 704, 768, 0, 0, 704, 800, 0, 0, 704, 832, 0, 0, 704, 864, 0, 0, 0, 896, 0,
+	0, 0, 928, 0, 0, 704, 960, 0, 0, 0, 992, 0, 0, 0, 1024, 0, 0, 1056, 1088, 0, 0, 1120, 1152, 0, 1184, 1216, 0, 1248, 1280, 0, 1312, 0,
+	0, 1344, 0, 0, 1376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1408, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1440, 1440, 0, 0, 0, 0, 1472, 0,
+	0, 0, 0, 0, 0, 1504, 0, 0, 0, 1536, 0, 0, 0, 0, 0, 0, 1568, 0, 0, 1600, 0, 1632, 0, 0, 0, 1664, 777, 1696, 0, 1728, 0, 1760,
+	0, 1792, 0, 0, 0, 0, 1824, 1856, 0, 0, 0, 0, 0, 0, 1888, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 1952, 1984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 1422, 0, 0, 0, 782, 0, 0, 0, 1905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 2016, 0, 0, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2080, 2112, 0, 0, 2144, 0, 0, 0, 0, 0, 0, 0, 0,
+	1454, 0, 0, 0, 0, 0, 777, 2176, 0, 2208, 2240, 0, 0, 2272, 781, 0, 0, 0, 0, 0, 0, 2304, 2336, 951, 0, 0, 0, 0, 0, 0, 0, 2368,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2400, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2464, 0, 0, 0, 0, 0, 0, 0, 429, 0, 0, 0, 2496, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2528, 2560, 0, 0, 0, 0, 0, 2592, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 1454, 782, 0, 2624, 0, 0, 2656, 2688, 0, 2720, 0, 0, 781, 0, 0, 2752, 0, 0, 0, 0, 0, 2784, 0, 704, 2816, 2848, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 2880, 0, 0, 0, 0, 0, 0, 782, 2739, 0, 0, 782, 0, 0, 0, 2912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2944, 0, 2976, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 3008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3040, 3072, 3104, 0, 0, 0, 0, 2654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 3136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+const size_t* CanonicalCombiningClassIndexPtr = CanonicalCombiningClassIndex;
+
+const uint8_t CanonicalCombiningClassData[3168] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE8, 0xDC, 0xDC, 0xDC, 0xDC, 0xE8, 0xD8, 0xDC, 0xDC, 0xDC, 0xDC,
+	0xDC, 0xCA, 0xCA, 0xDC, 0xDC, 0xDC, 0xDC, 0xCA, 0xCA, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0x01, 0x01, 0x01, 0x01, 0x01, 0xDC, 0xDC, 0xDC, 0xDC, 0xE6, 0xE6, 0xE6,
+	0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xF0, 0xE6, 0xDC, 0xDC, 0xDC, 0xE6, 0xE6, 0xE6, 0xDC, 0xDC, 0x00, 0xE6, 0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0xDC, 0xE6, 0xE8, 0xDC, 0xDC, 0xE6, 0xE9, 0xEA, 0xEA, 0xE9,
+	0xEA, 0xEA, 0xE9, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xE6, 0xE6, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xE6, 0xDE, 0xDC, 0xE6, 0xE6, 0xE6, 0xE6,
+	0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xDE, 0xE4, 0xE6, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x00, 0x17,
+	0x00, 0x18, 0x19, 0x00, 0xE6, 0xDC, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x1E, 0x1F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0xE6, 0xE6, 0xDC, 0xDC, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xDC,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0xE6,
+	0xE6, 0xE6, 0xE6, 0xDC, 0xE6, 0x00, 0x00, 0xE6, 0xE6, 0x00, 0xDC, 0xE6, 0xE6, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xDC, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0xE6, 0xDC, 0xDC, 0xE6, 0xDC, 0xE6,
+	0xE6, 0xE6, 0xDC, 0xE6, 0xDC, 0xE6, 0xDC, 0xE6, 0xDC, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xDC, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
+	0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0xE6, 0xE6, 0xE6, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xDC, 0xDC, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0x1B, 0x1C, 0x1D, 0xE6, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xDC, 0xDC, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xE6, 0xDC, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x67, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x6B, 0x6B, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0xDC, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x82, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00,
+	0x82, 0x00, 0xE6, 0xE6, 0x09, 0x00, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xE6, 0xDC, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0xDC,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xE6, 0xE6, 0xDC, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xDC, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0x00, 0x01, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0xDC,
+	0xE6, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xDC, 0xE6, 0xE6, 0xEA, 0xD6, 0xDC, 0xCA, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6,
+	0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xDC, 0xE6, 0xDC,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0x01, 0x01, 0xE6, 0xE6, 0xE6, 0xE6, 0x01, 0x01, 0x01, 0xE6, 0xE6, 0x00, 0x00, 0x00,
+	0x00, 0xE6, 0x00, 0x00, 0x00, 0x01, 0x01, 0xE6, 0xDC, 0xE6, 0x01, 0x01, 0xDC, 0xDC, 0xDC, 0xDC, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xE4, 0xE8, 0xDE, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xDC, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x00, 0xE6, 0xE6, 0xDC, 0x00, 0x00, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6,
+	0x00, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00,
+	0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x01, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x09,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 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, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0xD8, 0xD8, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xE2, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC,
+	0xDC, 0xDC, 0xDC, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0xE6, 0xDC, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE6, 0xE6, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+const uint8_t* CanonicalCombiningClassDataPtr = CanonicalCombiningClassData;
+
+const size_t QuickCheckCaseMappedIndex[34816] = {
+	0, 0, 32, 64, 0, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 192, 448, 480, 512, 544, 0, 0, 0, 0, 0, 576, 608, 640, 672, 704, 736,
+	768, 800, 832, 192, 864, 192, 896, 192, 192, 928, 960, 992, 1024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 765, 1056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1088, 0, 0, 0, 0, 192, 192, 192, 192, 1120, 192, 192, 192, 1152, 1184, 1216, 1248, 1280, 1312, 1344, 1376,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 1408, 1440, 1472, 1504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 1536, 1472, 1568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	765, 1600, 1632, 1664, 192, 192, 192, 1696, 816, 1728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 1760, 1792, 0, 0, 0, 0, 1824, 192, 1856, 1888, 1920, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1952, 0, 0, 0, 0, 0, 0, 0,
+	0, 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, 1984, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	765, 2016, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 765, 816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+const size_t* QuickCheckCaseMappedIndexPtr = QuickCheckCaseMappedIndex;
+
+const uint8_t QuickCheckCaseMappedData[2080] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0D,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A,
+	0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0D, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0D,
+	0x05, 0x0A, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x05, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x0A, 0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x00, 0x0A, 0x0A, 0x05, 0x0A,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x05, 0x0A, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x05, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x05,
+	0x00, 0x00, 0x00, 0x00, 0x0E, 0x0B, 0x05, 0x0E, 0x0B, 0x05, 0x0E, 0x0B, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x05, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0D, 0x0E, 0x0B, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x05, 0x0A, 0x0A, 0x05,
+	0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x05, 0x05, 0x00, 0x05, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00,
+	0x05, 0x05, 0x00, 0x05, 0x00, 0x05, 0x05, 0x00, 0x05, 0x05, 0x00, 0x05, 0x05, 0x00, 0x00, 0x05, 0x00, 0x05, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+	0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x00, 0x0A,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x0A, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x0A, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+	0x0A, 0x0A, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x0D, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x05, 0x05, 0x0D, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0D, 0x0D, 0x05, 0x05, 0x0A, 0x0D, 0x00, 0x0A, 0x05, 0x0A, 0x0A, 0x05, 0x00, 0x0A, 0x0A, 0x0A,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x0A, 0x00,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x0D, 0x05, 0x0D, 0x05, 0x0D, 0x05, 0x0D, 0x05, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00,
+	0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
+	0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x05, 0x05, 0x0D, 0x0D, 0x0D, 0x00, 0x0D, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x00, 0x0D, 0x00,
+	0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x0D, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x05, 0x05, 0x0D, 0x0D, 0x00, 0x00, 0x0D, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00,
+	0x05, 0x05, 0x0D, 0x0D, 0x0D, 0x05, 0x0D, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x00, 0x0D, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00,
+	0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x0A, 0x05, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A,
+	0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x00, 0x00, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05,
+	0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+const uint8_t* QuickCheckCaseMappedDataPtr = QuickCheckCaseMappedData;
+
+const size_t QuickCheckNFCIndex[34816] = {
+	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, 64, 96, 128, 160, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 256, 0, 0, 288, 320, 0, 0, 352, 384, 0, 0, 0, 0, 0, 0, 288, 416, 0, 0, 288, 448, 0,
+	0, 0, 480, 0, 0, 0, 512, 0, 0, 288, 544, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 640, 672, 704, 0, 0,
+	0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 768, 0, 800, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 832, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 864, 0, 896, 928, 960,
+	286, 0, 0, 0, 0, 0, 0, 0, 0, 992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1056, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 1088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1152, 1184, 1120, 1216, 1120, 1120, 1248, 0, 1280, 1312, 1344, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 1376, 0, 0, 0, 1408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 1440, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 1472, 0, 0, 0, 0, 0, 0, 0, 1448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1504, 1536, 0, 253, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+const size_t* QuickCheckNFCIndexPtr = QuickCheckNFCIndex;
+
+const uint8_t QuickCheckNFCData[1600] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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, 0x02, 0x02, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 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, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 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, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 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, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+};
+const uint8_t* QuickCheckNFCDataPtr = QuickCheckNFCData;
+
+const size_t QuickCheckNFDIndex[34816] = {
+	0, 0, 0, 0, 0, 0, 32, 64, 96, 128, 160, 192, 0, 224, 256, 288, 320, 352, 0, 0, 0, 0, 0, 0, 0, 0, 384, 416, 448, 480, 512, 0,
+	544, 576, 608, 640, 0, 0, 672, 704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, 0, 0, 768, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 832, 0, 0, 0, 864, 0, 0, 896, 928, 0, 0, 0, 0, 0, 0, 0, 960, 0, 992, 0, 1024, 0,
+	0, 0, 1056, 0, 0, 0, 1088, 0, 0, 0, 1024, 0, 0, 0, 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1152, 1184, 1216, 1248, 0, 0,
+	0, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, 1344, 1376, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 312, 312, 312, 1408, 312, 312, 1440, 1472, 312, 1504, 1536, 312, 1568, 1600, 1632,
+	1664, 0, 0, 0, 0, 0, 0, 0, 0, 1696, 0, 0, 1728, 1760, 1792, 0, 1824, 1856, 1888, 1920, 1952, 1984, 0, 2016, 0, 2048, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2080, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 2112, 2144, 2176, 2208, 2240, 2272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 2304, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 312, 312, 312, 312, 312, 312, 312, 312, 2336, 2368, 312, 2400, 312, 312, 1440, 0, 2432, 2464, 2496, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 2528, 2560, 0, 0, 0, 2592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2624, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 2656, 0, 0, 0, 0, 0, 0, 0, 2688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1775, 2720, 0, 2752, 820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 2784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+const size_t* QuickCheckNFDIndexPtr = QuickCheckNFDIndex;
+
+const uint8_t QuickCheckNFDData[2816] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+};
+const uint8_t* QuickCheckNFDDataPtr = QuickCheckNFDData;
+
+const size_t QuickCheckNFKCIndex[34816] = {
+	0, 0, 0, 0, 0, 32, 0, 0, 0, 64, 96, 128, 0, 0, 160, 192, 0, 0, 0, 0, 0, 224, 256, 288, 320, 352, 384, 416, 448, 0, 480, 512,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 576, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 640, 672, 0, 0, 704, 736, 0, 0, 768, 800, 0, 0, 0, 0, 0, 0, 704, 832, 0, 0, 704, 864, 0,
+	0, 0, 896, 0, 0, 0, 928, 0, 0, 704, 960, 0, 0, 0, 992, 0, 0, 1024, 0, 0, 0, 1024, 1056, 0, 1088, 0, 1120, 1152, 1184, 1216, 0, 0,
+	0, 1248, 0, 0, 0, 0, 0, 1280, 0, 0, 0, 1312, 0, 1344, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1376, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 1408, 1440, 1472, 669, 1504, 0, 0, 0, 0, 0, 0, 1536, 0, 0, 0, 0, 0, 0, 1568, 0, 1600, 1632, 1664,
+	1696, 1728, 1760, 1792, 1824, 97, 0, 0, 1856, 1888, 1920, 1504, 1034, 0, 0, 0, 0, 1952, 0, 0, 0, 0, 0, 0, 0, 1984, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 1504, 1504, 1504, 1504, 2016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1229, 0, 0, 2048, 0, 0, 2080, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 2112, 0, 0, 0, 0, 0, 0, 0, 2144, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 1024, 1504, 1504, 1504, 1504, 1504, 1504, 2176, 0,
+	105, 2208, 0, 0, 2240, 0, 0, 249, 0, 2272, 1504, 1504, 2304, 0, 0, 0, 2336, 1504, 2368, 2400, 1504, 1504, 1504, 2432, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2464, 0, 0, 0, 0, 0, 0, 2496, 0, 0, 0, 1969,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 2528, 2560, 1504, 2592, 1504, 1504, 2624, 0, 2656, 2688, 2720, 1504, 1504, 2752, 2784, 1504,
+	1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 2289, 2160, 1504, 2816, 1504, 696, 2848, 2880, 2160, 2912, 2944, 1504, 1504, 1504, 2976, 1503, 1504, 1504, 1504, 1504, 2432, 3008, 3040,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 3072, 0, 0, 0, 3104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 704, 3136, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 3168, 0, 0, 0, 0, 0, 0, 0, 1008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3200, 288, 0, 669, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	1504, 1504, 3232, 1504, 3264, 3296, 3328, 1504, 3360, 3392, 3424, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 3456, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 3488, 1504,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3520, 3552, 3584, 3616, 3648, 3680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 3712, 2416, 3744, 3776, 3808, 0, 0, 0, 3840, 3872, 3904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 2289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+const size_t* QuickCheckNFKCIndexPtr = QuickCheckNFKCIndex;
+
+const uint8_t QuickCheckNFKCData[3936] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 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, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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, 0x02, 0x02, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 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, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 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, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 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, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
+	0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+const uint8_t* QuickCheckNFKCDataPtr = QuickCheckNFKCData;
+
+const size_t QuickCheckNFKDIndex[34816] = {
+	0, 0, 0, 0, 0, 32, 64, 96, 128, 160, 192, 224, 0, 256, 288, 320, 352, 384, 0, 0, 0, 416, 448, 480, 0, 0, 512, 544, 576, 608, 640, 672,
+	704, 736, 768, 800, 0, 0, 832, 864, 0, 0, 0, 0, 896, 0, 0, 0, 0, 478, 0, 928, 0, 0, 960, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 992, 1024, 0, 0, 0, 1056, 0, 0, 1088, 1120, 0, 0, 0, 0, 0, 0, 0, 1152, 0, 1184, 0, 1216, 0,
+	0, 0, 1248, 0, 0, 0, 1280, 0, 0, 0, 1216, 0, 0, 0, 1312, 0, 0, 1344, 0, 0, 0, 1376, 1408, 0, 1440, 0, 1472, 1504, 1536, 1568, 0, 0,
+	0, 897, 0, 0, 0, 0, 0, 1600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, 1664, 1696, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 1728, 1760, 1792, 1824, 344, 0, 0, 344, 344, 344, 344, 1775, 344, 344, 232, 1856, 344, 1888, 1920, 344, 1952, 1984, 2016,
+	2048, 2080, 2112, 2144, 2176, 2208, 0, 0, 2240, 2272, 2304, 344, 2336, 1438, 2368, 0, 2400, 2432, 2464, 2496, 2528, 2560, 0, 2592, 0, 2624, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 344, 344, 344, 344, 2656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1581, 0, 0, 2688, 0, 0, 2720, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 2752, 0, 0, 0, 0, 0, 0, 0, 746, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 2784, 344, 344, 344, 344, 344, 344, 2816, 0,
+	440, 2848, 2880, 2912, 2944, 2976, 3008, 3040, 0, 3072, 344, 344, 3104, 0, 0, 0, 1919, 344, 3136, 1919, 344, 344, 344, 1919, 344, 344, 344, 344, 344, 344, 344, 344,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3168, 0, 0, 0, 0, 0, 0, 963, 0, 0, 0, 3200,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 400, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 344, 344, 344, 344, 344, 344, 344, 344, 3232, 3264, 344, 3296, 344, 344, 232, 0, 3328, 3360, 3392, 344, 344, 3424, 273, 344,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 3089, 3456, 344, 326, 344, 3434, 3488, 3520, 3552, 3584, 3616, 344, 344, 344, 3648, 3397, 344, 344, 344, 344, 1919, 3680, 3712,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 3744, 2205, 0, 0, 0, 3776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3808, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 3840, 0, 0, 0, 0, 0, 0, 0, 3198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3442, 480, 0, 3872, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	344, 344, 1952, 344, 3904, 3936, 3968, 344, 4000, 4032, 4064, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 4096, 344, 344, 344, 344, 344, 344, 344, 344, 4128, 344,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4160, 4192, 4224, 4256, 4288, 4320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 4352, 4384, 3152, 4416, 963, 0, 0, 0, 4448, 4480, 4512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 3089, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+const size_t* QuickCheckNFKDIndexPtr = QuickCheckNFKDIndex;
+
+const uint8_t QuickCheckNFKDData[4544] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
+	0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+const uint8_t* QuickCheckNFKDDataPtr = QuickCheckNFKDData;
+
+const uint32_t NFDIndex1[272] = {
+	0, 128, 256, 384, 512, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 640,
+	392, 768, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 896, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 1024,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+	392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
+};
+const uint32_t* NFDIndex1Ptr = NFDIndex1;
+
+const uint32_t NFDIndex2[1152] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0x0, 0xE0, 0x100, 0x120,
+	0x140, 0x160, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x180, 0x1A0, 0x1C0, 0x1E0, 0x200, 0x0,
+	0x220, 0x240, 0x260, 0x280, 0x0, 0x0, 0x2A0, 0x2C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x2E0, 0x0, 0x0, 0x0, 0x0, 0x300, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x320, 0x340, 0x0, 0x0, 0x0, 0x360, 0x0,
+	0x0, 0x380, 0x3A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C0, 0x0, 0x3E0, 0x0, 0x400, 0x0,
+	0x0, 0x0, 0x420, 0x0, 0x0, 0x0, 0x440, 0x0, 0x0, 0x0, 0x460, 0x0, 0x0, 0x0, 0x480, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4A0, 0x4C0, 0x4E0, 0x500, 0x0, 0x0,
+	0x0, 0x520, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x540, 0x560, 0x580, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x5A0, 0x5C0, 0x5E0, 0x600, 0x620, 0x640, 0x660, 0x680, 0x6A0, 0x6C0, 0x6E0, 0x700, 0x720, 0x740, 0x760, 0x780,
+	0x7A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7C0, 0x0, 0x0, 0x7E0, 0x800, 0x820, 0x0,
+	0x840, 0x860, 0x880, 0x8A0, 0x8C0, 0x8E0, 0x0, 0x900, 0x0, 0x920, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x940, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x960, 0x980, 0x9A0, 0x9C0, 0x9E0, 0xA00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xA20, 0xA40, 0xA60, 0xA80, 0xAA0, 0xAC0, 0xAE0, 0xB00,
+	0xB20, 0xB40, 0xB60, 0xB80, 0xBA0, 0xBC0, 0xBE0, 0x0, 0xC00, 0xC20, 0xC40, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0xC60, 0xC80, 0x0, 0x0, 0x0, 0xCA0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xCC0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0xCE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xD00, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xD20, 0xD40, 0x0, 0xD60, 0xD80, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0xDA0, 0xDC0, 0xDE0, 0xE00, 0xE20, 0xE40, 0xE60, 0xE80, 0xEA0, 0xEC0, 0xEE0, 0xF00, 0xF20, 0xF40, 0xF60, 0xF80,
+	0xFA0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+const uint32_t* NFDIndex2Ptr = NFDIndex2;
+
+const uint32_t NFDData[4032] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3000000, 0x3000003, 0x3000006, 0x3000009, 0x300000C, 0x300000F, 0x0, 0x3000012, 0x3000015, 0x3000018, 0x300001B, 0x300001E, 0x3000021, 0x3000024, 0x3000027, 0x300002A,
+	0x0, 0x300002D, 0x3000030, 0x3000033, 0x3000036, 0x3000039, 0x300003C, 0x0, 0x0, 0x300003F, 0x3000042, 0x3000045, 0x3000048, 0x300004B, 0x0, 0x0,
+	0x300004E, 0x3000051, 0x3000054, 0x3000057, 0x300005A, 0x300005D, 0x0, 0x3000060, 0x3000063, 0x3000066, 0x3000069, 0x300006C, 0x300006F, 0x3000072, 0x3000075, 0x3000078,
+	0x0, 0x300007B, 0x300007E, 0x3000081, 0x3000084, 0x3000087, 0x300008A, 0x0, 0x0, 0x300008D, 0x3000090, 0x3000093, 0x3000096, 0x3000099, 0x0, 0x300009C,
+	0x300009F, 0x30000A2, 0x30000A5, 0x30000A8, 0x30000AB, 0x30000AE, 0x30000B1, 0x30000B4, 0x30000B7, 0x30000BA, 0x30000BD, 0x30000C0, 0x30000C3, 0x30000C6, 0x30000C9, 0x30000CC,
+	0x0, 0x0, 0x30000CF, 0x30000D2, 0x30000D5, 0x30000D8, 0x30000DB, 0x30000DE, 0x30000E1, 0x30000E4, 0x30000E7, 0x30000EA, 0x30000ED, 0x30000F0, 0x30000F3, 0x30000F6,
+	0x30000F9, 0x30000FC, 0x30000FF, 0x3000102, 0x3000105, 0x3000108, 0x0, 0x0, 0x300010B, 0x300010E, 0x3000111, 0x3000114, 0x3000117, 0x300011A, 0x300011D, 0x3000120,
+	0x3000123, 0x0, 0x0, 0x0, 0x3000126, 0x3000129, 0x300012C, 0x300012F, 0x0, 0x3000132, 0x3000135, 0x3000138, 0x300013B, 0x300013E, 0x3000141, 0x0,
+	0x0, 0x0, 0x0, 0x3000144, 0x3000147, 0x300014A, 0x300014D, 0x3000150, 0x3000153, 0x0, 0x0, 0x0, 0x3000156, 0x3000159, 0x300015C, 0x300015F,
+	0x3000162, 0x3000165, 0x0, 0x0, 0x3000168, 0x300016B, 0x300016E, 0x3000171, 0x3000174, 0x3000177, 0x300017A, 0x300017D, 0x3000180, 0x3000183, 0x3000186, 0x3000189,
+	0x300018C, 0x300018F, 0x3000192, 0x3000195, 0x3000198, 0x300019B, 0x0, 0x0, 0x300019E, 0x30001A1, 0x30001A4, 0x30001A7, 0x30001AA, 0x30001AD, 0x30001B0, 0x30001B3,
+	0x30001B6, 0x30001B9, 0x30001BC, 0x30001BF, 0x30001C2, 0x30001C5, 0x30001C8, 0x30001CB, 0x30001CE, 0x30001D1, 0x30001D4, 0x30001D7, 0x30001DA, 0x30001DD, 0x30001E0, 0x0,
+	0x30001E3, 0x30001E6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30001E9,
+	0x30001EC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30001EF, 0x30001F2, 0x30001F5,
+	0x30001F8, 0x30001FB, 0x30001FE, 0x3000201, 0x3000204, 0x5000207, 0x500020C, 0x5000211, 0x5000216, 0x500021B, 0x5000220, 0x5000225, 0x500022A, 0x0, 0x500022F, 0x5000234,
+	0x5000239, 0x500023E, 0x4000243, 0x4000247, 0x0, 0x0, 0x300024B, 0x300024E, 0x3000251, 0x3000254, 0x3000257, 0x300025A, 0x500025D, 0x5000262, 0x4000267, 0x400026B,
+	0x300026F, 0x0, 0x0, 0x0, 0x3000272, 0x3000275, 0x0, 0x0, 0x3000278, 0x300027B, 0x500027E, 0x5000283, 0x4000288, 0x400028C, 0x4000290, 0x4000294,
+	0x3000298, 0x300029B, 0x300029E, 0x30002A1, 0x30002A4, 0x30002A7, 0x30002AA, 0x30002AD, 0x30002B0, 0x30002B3, 0x30002B6, 0x30002B9, 0x30002BC, 0x30002BF, 0x30002C2, 0x30002C5,
+	0x30002C8, 0x30002CB, 0x30002CE, 0x30002D1, 0x30002D4, 0x30002D7, 0x30002DA, 0x30002DD, 0x30002E0, 0x30002E3, 0x30002E6, 0x30002E9, 0x0, 0x0, 0x30002EC, 0x30002EF,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3000239, 0x300023E, 0x30002F2, 0x30002F5, 0x50002F8, 0x50002FD, 0x5000302, 0x5000307, 0x300030C, 0x300030F,
+	0x5000312, 0x5000317, 0x300031C, 0x300031F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2000001, 0x2000004, 0x0, 0x2000322, 0x4000212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x2000324, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000326, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x4000327, 0x400032B, 0x200032F, 0x4000331, 0x4000335, 0x4000339, 0x0, 0x400033D, 0x0, 0x4000341, 0x4000345,
+	0x6000349, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400034F, 0x4000353, 0x4000357, 0x400035B, 0x400035F, 0x4000363,
+	0x6000367, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4000349, 0x4000367, 0x400036D, 0x4000371, 0x4000375, 0x0,
+	0x0, 0x0, 0x0, 0x4000379, 0x400037D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4000381, 0x4000385, 0x0, 0x4000389, 0x0, 0x0, 0x0, 0x400038D, 0x0, 0x0, 0x0, 0x0, 0x4000391, 0x4000395, 0x4000399, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400039D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40003A1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40003A5, 0x40003A9, 0x0, 0x40003AD, 0x0, 0x0, 0x0, 0x40003B1, 0x0, 0x0, 0x0, 0x0, 0x40003B5, 0x40003B9, 0x40003BD, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40003C1, 0x40003C5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x40003C9, 0x40003CD, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40003D1, 0x40003D5, 0x40003D9, 0x40003DD, 0x0, 0x0, 0x40003E1, 0x40003E5, 0x0, 0x0, 0x40003E9, 0x40003ED, 0x40003F1, 0x40003F5, 0x40003F9, 0x40003FD,
+	0x0, 0x0, 0x4000401, 0x4000405, 0x4000409, 0x400040D, 0x4000411, 0x4000415, 0x0, 0x0, 0x4000419, 0x400041D, 0x4000421, 0x4000425, 0x4000429, 0x400042D,
+	0x4000431, 0x4000435, 0x4000439, 0x400043D, 0x4000441, 0x4000445, 0x0, 0x0, 0x4000449, 0x400044D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x4000451, 0x4000455, 0x4000459, 0x400045D, 0x4000461, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4000465, 0x0, 0x4000469, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x400046D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000471, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x6000477, 0x0, 0x0, 0x600047D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000483, 0x6000489, 0x600048F, 0x6000495, 0x600049B, 0x60004A1, 0x60004A7, 0x60004AD,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004B3, 0x60004B9, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004BF, 0x60004C5, 0x0, 0x60004CB,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x60004D1, 0x0, 0x0, 0x60004D7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004DD, 0x60004E3, 0x60004E9, 0x0, 0x0, 0x60004EF, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004F5, 0x0, 0x0, 0x60004FB, 0x6000501, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000507, 0x600050D, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x6000513, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000519, 0x600051F, 0x6000525, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x600052B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6000531, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000537, 0x600053D, 0x0, 0x6000543, 0x9000549, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000552, 0x6000558, 0x600055E, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000564, 0x0, 0x600056A, 0x9000570, 0x6000579, 0x0,
+	0x0, 0x0, 0x0, 0x600057F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000585, 0x0, 0x0,
+	0x0, 0x0, 0x600058B, 0x0, 0x0, 0x0, 0x0, 0x6000591, 0x0, 0x0, 0x0, 0x0, 0x6000597, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x600059D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x60005A3, 0x0, 0x60005A9, 0x60005AF, 0x0, 0x60005B5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x60005BB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x60005C1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005C7, 0x0, 0x0,
+	0x0, 0x0, 0x60005CD, 0x0, 0x0, 0x0, 0x0, 0x60005D3, 0x0, 0x0, 0x0, 0x0, 0x60005D9, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005DF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005E5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005EB, 0x0, 0x60005F1, 0x0, 0x60005F7, 0x0, 0x60005FD, 0x0, 0x6000603, 0x0,
+	0x0, 0x0, 0x6000609, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x600060F, 0x0, 0x6000615, 0x0, 0x0,
+	0x600061B, 0x6000621, 0x0, 0x6000627, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300062D, 0x3000630, 0x3000633, 0x3000636, 0x3000639, 0x300063C, 0x300063F, 0x3000642, 0x5000645, 0x500064A, 0x300064F, 0x3000652, 0x3000655, 0x3000658, 0x300065B, 0x300065E,
+	0x3000661, 0x3000664, 0x3000667, 0x300066A, 0x500066D, 0x5000672, 0x5000677, 0x500067C, 0x3000681, 0x3000684, 0x3000687, 0x300068A, 0x500068D, 0x5000692, 0x3000697, 0x300069A,
+	0x300069D, 0x30006A0, 0x30006A3, 0x30006A6, 0x30006A9, 0x30006AC, 0x30006AF, 0x30006B2, 0x30006B5, 0x30006B8, 0x30006BB, 0x30006BE, 0x30006C1, 0x30006C4, 0x50006C7, 0x50006CC,
+	0x30006D1, 0x30006D4, 0x30006D7, 0x30006DA, 0x30006DD, 0x30006E0, 0x30006E3, 0x30006E6, 0x50006E9, 0x50006EE, 0x30006F3, 0x30006F6, 0x30006F9, 0x30006FC, 0x30006FF, 0x3000702,
+	0x3000705, 0x3000708, 0x300070B, 0x300070E, 0x3000711, 0x3000714, 0x3000717, 0x300071A, 0x300071D, 0x3000720, 0x3000723, 0x3000726, 0x5000729, 0x500072E, 0x5000733, 0x5000738,
+	0x500073D, 0x5000742, 0x5000747, 0x500074C, 0x3000751, 0x3000754, 0x3000757, 0x300075A, 0x300075D, 0x3000760, 0x3000763, 0x3000766, 0x5000769, 0x500076E, 0x3000773, 0x3000776,
+	0x3000779, 0x300077C, 0x300077F, 0x3000782, 0x5000785, 0x500078A, 0x500078F, 0x5000794, 0x5000799, 0x500079E, 0x30007A3, 0x30007A6, 0x30007A9, 0x30007AC, 0x30007AF, 0x30007B2,
+	0x30007B5, 0x30007B8, 0x30007BB, 0x30007BE, 0x30007C1, 0x30007C4, 0x30007C7, 0x30007CA, 0x50007CD, 0x50007D2, 0x50007D7, 0x50007DC, 0x30007E1, 0x30007E4, 0x30007E7, 0x30007EA,
+	0x30007ED, 0x30007F0, 0x30007F3, 0x30007F6, 0x30007F9, 0x30007FC, 0x30007FF, 0x3000802, 0x3000805, 0x3000808, 0x300080B, 0x300080E, 0x3000811, 0x3000814, 0x3000817, 0x300081A,
+	0x300081D, 0x3000820, 0x3000823, 0x3000826, 0x3000829, 0x300082C, 0x300082F, 0x3000832, 0x3000835, 0x3000838, 0x0, 0x400083B, 0x0, 0x0, 0x0, 0x0,
+	0x300083F, 0x3000842, 0x3000845, 0x3000848, 0x500084B, 0x5000850, 0x5000855, 0x500085A, 0x500085F, 0x5000864, 0x5000869, 0x500086E, 0x5000873, 0x5000878, 0x500087D, 0x5000882,
+	0x5000887, 0x500088C, 0x5000891, 0x5000896, 0x500089B, 0x50008A0, 0x50008A5, 0x50008AA, 0x30008AF, 0x30008B2, 0x30008B5, 0x30008B8, 0x30008BB, 0x30008BE, 0x50008C1, 0x50008C6,
+	0x50008CB, 0x50008D0, 0x50008D5, 0x50008DA, 0x50008DF, 0x50008E4, 0x50008E9, 0x50008EE, 0x30008F3, 0x30008F6, 0x30008F9, 0x30008FC, 0x30008FF, 0x3000902, 0x3000905, 0x3000908,
+	0x500090B, 0x5000910, 0x5000915, 0x500091A, 0x500091F, 0x5000924, 0x5000929, 0x500092E, 0x5000933, 0x5000938, 0x500093D, 0x5000942, 0x5000947, 0x500094C, 0x5000951, 0x5000956,
+	0x500095B, 0x5000960, 0x5000965, 0x500096A, 0x300096F, 0x3000972, 0x3000975, 0x3000978, 0x500097B, 0x5000980, 0x5000985, 0x500098A, 0x500098F, 0x5000994, 0x5000999, 0x500099E,
+	0x50009A3, 0x50009A8, 0x30009AD, 0x30009B0, 0x30009B3, 0x30009B6, 0x30009B9, 0x30009BC, 0x30009BF, 0x30009C2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40009C5, 0x40009C9, 0x60009CD, 0x60009D3, 0x60009D9, 0x60009DF, 0x60009E5, 0x60009EB, 0x40009F1, 0x40009F5, 0x60009F9, 0x60009FF, 0x6000A05, 0x6000A0B, 0x6000A11, 0x6000A17,
+	0x4000A1D, 0x4000A21, 0x6000A25, 0x6000A2B, 0x6000A31, 0x6000A37, 0x0, 0x0, 0x4000A3D, 0x4000A41, 0x6000A45, 0x6000A4B, 0x6000A51, 0x6000A57, 0x0, 0x0,
+	0x4000A5D, 0x4000A61, 0x6000A65, 0x6000A6B, 0x6000A71, 0x6000A77, 0x6000A7D, 0x6000A83, 0x4000A89, 0x4000A8D, 0x6000A91, 0x6000A97, 0x6000A9D, 0x6000AA3, 0x6000AA9, 0x6000AAF,
+	0x4000AB5, 0x4000AB9, 0x6000ABD, 0x6000AC3, 0x6000AC9, 0x6000ACF, 0x6000AD5, 0x6000ADB, 0x4000AE1, 0x4000AE5, 0x6000AE9, 0x6000AEF, 0x6000AF5, 0x6000AFB, 0x6000B01, 0x6000B07,
+	0x4000B0D, 0x4000B11, 0x6000B15, 0x6000B1B, 0x6000B21, 0x6000B27, 0x0, 0x0, 0x4000B2D, 0x4000B31, 0x6000B35, 0x6000B3B, 0x6000B41, 0x6000B47, 0x0, 0x0,
+	0x4000B4D, 0x4000B51, 0x6000B55, 0x6000B5B, 0x6000B61, 0x6000B67, 0x6000B6D, 0x6000B73, 0x0, 0x4000B79, 0x0, 0x6000B7D, 0x0, 0x6000B83, 0x0, 0x6000B89,
+	0x4000B8F, 0x4000B93, 0x6000B97, 0x6000B9D, 0x6000BA3, 0x6000BA9, 0x6000BAF, 0x6000BB5, 0x4000BBB, 0x4000BBF, 0x6000BC3, 0x6000BC9, 0x6000BCF, 0x6000BD5, 0x6000BDB, 0x6000BE1,
+	0x4000BE7, 0x4000357, 0x4000BEB, 0x400035B, 0x4000BEF, 0x400035F, 0x4000BF3, 0x4000363, 0x4000BF7, 0x400036D, 0x4000BFB, 0x4000371, 0x4000BFF, 0x4000375, 0x0, 0x0,
+	0x6000C03, 0x6000C09, 0x8000C0F, 0x8000C17, 0x8000C1F, 0x8000C27, 0x8000C2F, 0x8000C37, 0x6000C3F, 0x6000C45, 0x8000C4B, 0x8000C53, 0x8000C5B, 0x8000C63, 0x8000C6B, 0x8000C73,
+	0x6000C7B, 0x6000C81, 0x8000C87, 0x8000C8F, 0x8000C97, 0x8000C9F, 0x8000CA7, 0x8000CAF, 0x6000CB7, 0x6000CBD, 0x8000CC3, 0x8000CCB, 0x8000CD3, 0x8000CDB, 0x8000CE3, 0x8000CEB,
+	0x6000CF3, 0x6000CF9, 0x8000CFF, 0x8000D07, 0x8000D0F, 0x8000D17, 0x8000D1F, 0x8000D27, 0x6000D2F, 0x6000D35, 0x8000D3B, 0x8000D43, 0x8000D4B, 0x8000D53, 0x8000D5B, 0x8000D63,
+	0x4000D6B, 0x4000D6F, 0x6000D73, 0x4000D79, 0x6000D7D, 0x0, 0x4000D83, 0x6000D87, 0x4000D8D, 0x4000D91, 0x4000D95, 0x400032B, 0x4000D99, 0x0, 0x2000349, 0x0,
+	0x0, 0x4000D9D, 0x6000DA1, 0x4000DA7, 0x6000DAB, 0x0, 0x4000DB1, 0x6000DB5, 0x4000DBB, 0x4000331, 0x4000DBF, 0x4000335, 0x4000DC3, 0x5000DC7, 0x5000DCC, 0x5000DD1,
+	0x4000DD6, 0x4000DDA, 0x6000DDE, 0x6000349, 0x0, 0x0, 0x4000DE4, 0x6000DE8, 0x4000DEE, 0x4000DF2, 0x4000DF6, 0x4000339, 0x0, 0x5000DFA, 0x5000DFF, 0x5000E04,
+	0x4000E09, 0x4000E0D, 0x6000E11, 0x6000367, 0x4000E17, 0x4000E1B, 0x4000E1F, 0x6000E23, 0x4000E29, 0x4000E2D, 0x4000E31, 0x4000341, 0x4000E35, 0x4000E39, 0x4000327, 0x1000E3D,
+	0x0, 0x0, 0x6000E3E, 0x4000E44, 0x6000E48, 0x0, 0x4000E4E, 0x6000E52, 0x4000E58, 0x400033D, 0x4000E5C, 0x4000345, 0x4000E60, 0x2000E64, 0x0, 0x0,
+	0x3000E66, 0x3000E69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2000345, 0x0, 0x0, 0x0, 0x100012C, 0x300000F, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000E6C, 0x5000E71, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000E76, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000E7B, 0x5000E80, 0x5000E85,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x5000E8A, 0x0, 0x0, 0x0, 0x0, 0x5000E8F, 0x0, 0x0, 0x5000E94, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x5000E99, 0x0, 0x5000E9E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x5000EA3, 0x0, 0x0, 0x5000EA8, 0x0, 0x0, 0x5000EAD, 0x0, 0x5000EB2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3000EB7, 0x0, 0x5000EBA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000EBF, 0x3000EC4, 0x3000EC7,
+	0x5000ECA, 0x5000ECF, 0x0, 0x0, 0x5000ED4, 0x5000ED9, 0x0, 0x0, 0x5000EDE, 0x5000EE3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x5000EE8, 0x5000EED, 0x0, 0x0, 0x5000EF2, 0x5000EF7, 0x0, 0x0, 0x5000EFC, 0x5000F01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000F06, 0x5000F0B, 0x5000F10, 0x5000F15,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x5000F1A, 0x5000F1F, 0x5000F24, 0x5000F29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000F2E, 0x5000F33, 0x5000F38, 0x5000F3D, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3000F42, 0x3000F45, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000F48, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000F4D, 0x0, 0x6000F53, 0x0,
+	0x6000F59, 0x0, 0x6000F5F, 0x0, 0x6000F65, 0x0, 0x6000F6B, 0x0, 0x6000F71, 0x0, 0x6000F77, 0x0, 0x6000F7D, 0x0, 0x6000F83, 0x0,
+	0x6000F89, 0x0, 0x6000F8F, 0x0, 0x0, 0x6000F95, 0x0, 0x6000F9B, 0x0, 0x6000FA1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6000FA7, 0x6000FAD, 0x0, 0x6000FB3, 0x6000FB9, 0x0, 0x6000FBF, 0x6000FC5, 0x0, 0x6000FCB, 0x6000FD1, 0x0, 0x6000FD7, 0x6000FDD, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x6000FE3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000FE9, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000FEF, 0x0, 0x6000FF5, 0x0,
+	0x6000FFB, 0x0, 0x6001001, 0x0, 0x6001007, 0x0, 0x600100D, 0x0, 0x6001013, 0x0, 0x6001019, 0x0, 0x600101F, 0x0, 0x6001025, 0x0,
+	0x600102B, 0x0, 0x6001031, 0x0, 0x0, 0x6001037, 0x0, 0x600103D, 0x0, 0x6001043, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6001049, 0x600104F, 0x0, 0x6001055, 0x600105B, 0x0, 0x6001061, 0x6001067, 0x0, 0x600106D, 0x6001073, 0x0, 0x6001079, 0x600107F, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x6001085, 0x0, 0x0, 0x600108B, 0x6001091, 0x6001097, 0x600109D, 0x0, 0x0, 0x0, 0x60010A3, 0x0,
+	0x30010A9, 0x30010AC, 0x30010AF, 0x30010B2, 0x30010B5, 0x30010B8, 0x30010BB, 0x30010BE, 0x30010BE, 0x30010C1, 0x30010C4, 0x30010C7, 0x30010CA, 0x30010CD, 0x30010D0, 0x30010D3,
+	0x30010D6, 0x30010D9, 0x30010DC, 0x30010DF, 0x30010E2, 0x30010E5, 0x30010E8, 0x30010EB, 0x30010EE, 0x30010F1, 0x30010F4, 0x30010F7, 0x30010FA, 0x30010FD, 0x3001100, 0x3001103,
+	0x3001106, 0x3001109, 0x300110C, 0x300110F, 0x3001112, 0x3001115, 0x3001118, 0x300111B, 0x300111E, 0x3001121, 0x3001124, 0x3001127, 0x300112A, 0x300112D, 0x3001130, 0x3001133,
+	0x3001136, 0x3001139, 0x300113C, 0x300113F, 0x3001142, 0x3001145, 0x3001148, 0x300114B, 0x300114E, 0x3001151, 0x3001154, 0x3001157, 0x300115A, 0x300115D, 0x3001160, 0x3001163,
+	0x3001166, 0x3001169, 0x300116C, 0x300116F, 0x3001172, 0x3001175, 0x3001178, 0x300117B, 0x300117E, 0x3001181, 0x3001184, 0x3001187, 0x300118A, 0x300118D, 0x3001190, 0x3001193,
+	0x3001196, 0x3001199, 0x300119C, 0x300119F, 0x30011A2, 0x30011A5, 0x30011A8, 0x30011AB, 0x30011AE, 0x30011B1, 0x30011B4, 0x30011B7, 0x30010E2, 0x30011BA, 0x30011BD, 0x30011C0,
+	0x30011C3, 0x30011C6, 0x30011C9, 0x30011CC, 0x30011CF, 0x30011D2, 0x30011D5, 0x30011D8, 0x30011DB, 0x30011DE, 0x30011E1, 0x30011E4, 0x30011E7, 0x30011EA, 0x30011ED, 0x30011F0,
+	0x30011F3, 0x30011F6, 0x30011F9, 0x30011FC, 0x30011FF, 0x3001202, 0x3001205, 0x3001208, 0x300120B, 0x300120E, 0x3001211, 0x3001214, 0x3001217, 0x300121A, 0x300121D, 0x3001220,
+	0x3001223, 0x3001226, 0x3001229, 0x300122C, 0x300122F, 0x3001232, 0x3001235, 0x3001238, 0x300123B, 0x300123E, 0x3001241, 0x3001244, 0x3001247, 0x300124A, 0x300124D, 0x3001250,
+	0x3001253, 0x3001256, 0x3001259, 0x300125C, 0x300125F, 0x3001262, 0x3001265, 0x3001268, 0x300126B, 0x300126E, 0x3001271, 0x3001274, 0x3001277, 0x300127A, 0x300127D, 0x3001280,
+	0x3001283, 0x30011F0, 0x3001286, 0x3001289, 0x300128C, 0x300128F, 0x3001292, 0x3001295, 0x3001298, 0x300129B, 0x30011C0, 0x300129E, 0x30012A1, 0x30012A4, 0x30012A7, 0x30012AA,
+	0x30012AD, 0x30012B0, 0x30012B3, 0x30012B6, 0x30012B9, 0x30012BC, 0x30012BF, 0x30012C2, 0x30012C5, 0x30012C8, 0x30012CB, 0x30012CE, 0x30012D1, 0x30012D4, 0x30012D7, 0x30010E2,
+	0x30012DA, 0x30012DD, 0x30012E0, 0x30012E3, 0x30012E6, 0x30012E9, 0x30012EC, 0x30012EF, 0x30012F2, 0x30012F5, 0x30012F8, 0x30012FB, 0x30012FE, 0x3001301, 0x3001304, 0x3001307,
+	0x300130A, 0x300130D, 0x3001310, 0x3001313, 0x3001316, 0x3001319, 0x300131C, 0x300131F, 0x3001322, 0x3001325, 0x3001328, 0x30011C6, 0x300132B, 0x300132E, 0x3001331, 0x3001334,
+	0x3001337, 0x300133A, 0x300133D, 0x3001340, 0x3001343, 0x3001346, 0x3001349, 0x300134C, 0x300134F, 0x3001352, 0x3001355, 0x3001358, 0x300135B, 0x300135E, 0x3001361, 0x3001364,
+	0x3001367, 0x300136A, 0x300136D, 0x3001370, 0x3001373, 0x3001376, 0x3001379, 0x300137C, 0x300137F, 0x3001382, 0x3001385, 0x3001388, 0x300138B, 0x300138E, 0x3001391, 0x3001394,
+	0x3001397, 0x300139A, 0x300139D, 0x30013A0, 0x30013A3, 0x30013A6, 0x30013A9, 0x30013AC, 0x30013AF, 0x30013B2, 0x30013B5, 0x30013B8, 0x30013BB, 0x30013BE, 0x0, 0x0,
+	0x30013C1, 0x0, 0x30013C4, 0x0, 0x0, 0x30013C7, 0x30013CA, 0x30013CD, 0x30013D0, 0x30013D3, 0x30013D6, 0x30013D9, 0x30013DC, 0x30013DF, 0x30013E2, 0x0,
+	0x30013E5, 0x0, 0x30013E8, 0x0, 0x0, 0x30013EB, 0x30013EE, 0x0, 0x0, 0x0, 0x30013F1, 0x30013F4, 0x30013F7, 0x30013FA, 0x30013FD, 0x3001400,
+	0x3001403, 0x3001406, 0x3001409, 0x300140C, 0x300140F, 0x3001412, 0x3001415, 0x3001418, 0x300141B, 0x300141E, 0x3001421, 0x3001424, 0x3001427, 0x300142A, 0x300142D, 0x3001430,
+	0x3001433, 0x3001436, 0x3001439, 0x300143C, 0x300143F, 0x3001442, 0x3001445, 0x3001448, 0x300144B, 0x300144E, 0x3001451, 0x3001454, 0x3001457, 0x300145A, 0x300145D, 0x3001460,
+	0x3001463, 0x3001466, 0x3001469, 0x300146C, 0x300146F, 0x3001472, 0x3001475, 0x3001265, 0x3001478, 0x300147B, 0x300147E, 0x3001481, 0x3001484, 0x3001487, 0x3001487, 0x300148A,
+	0x300148D, 0x3001490, 0x3001493, 0x3001496, 0x3001499, 0x300149C, 0x300149F, 0x30013EB, 0x30014A2, 0x30014A5, 0x30014A8, 0x30014AB, 0x40014AE, 0x30014B2, 0x0, 0x0,
+	0x30014B5, 0x30014B8, 0x30014BB, 0x30014BE, 0x30014C1, 0x30014C4, 0x30014C7, 0x30014CA, 0x3001415, 0x30014CD, 0x30014D0, 0x30014D3, 0x30013C1, 0x30014D6, 0x30014D9, 0x30014DC,
+	0x30014DF, 0x30014E2, 0x30014E5, 0x30014E8, 0x30014EB, 0x30014EE, 0x30014F1, 0x30014F4, 0x30014F7, 0x3001430, 0x30014FA, 0x3001433, 0x30014FD, 0x3001500, 0x3001503, 0x3001506,
+	0x3001509, 0x30013C4, 0x3001121, 0x300150C, 0x300150F, 0x3001512, 0x30011F3, 0x30012F8, 0x3001515, 0x3001518, 0x3001448, 0x300151B, 0x300144B, 0x300151E, 0x3001521, 0x3001524,
+	0x30013CA, 0x3001527, 0x300152A, 0x300152D, 0x3001530, 0x3001533, 0x30013CD, 0x3001536, 0x3001539, 0x300153C, 0x300153F, 0x3001542, 0x3001545, 0x3001475, 0x3001548, 0x300154B,
+	0x3001265, 0x300154E, 0x3001481, 0x3001551, 0x3001554, 0x3001557, 0x300155A, 0x300155D, 0x3001490, 0x3001560, 0x30013E8, 0x3001563, 0x3001493, 0x30011BA, 0x3001566, 0x3001496,
+	0x3001569, 0x300149C, 0x300156C, 0x300156F, 0x3001572, 0x3001575, 0x3001578, 0x30014A2, 0x30013DC, 0x300157B, 0x30014A5, 0x300157E, 0x30014A8, 0x3001581, 0x30010BE, 0x4001584,
+	0x4001588, 0x400158C, 0x3001590, 0x3001593, 0x3001596, 0x4001599, 0x400159D, 0x40015A1, 0x30015A5, 0x30015A8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40015AB, 0x0, 0x40015AF,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40015B3, 0x40015B7, 0x60015BB, 0x60015C1, 0x40015C7, 0x40015CB,
+	0x40015CF, 0x40015D3, 0x40015D7, 0x40015DB, 0x40015DF, 0x40015E3, 0x40015E7, 0x0, 0x40015EB, 0x40015EF, 0x40015F3, 0x40015F7, 0x40015FB, 0x0, 0x40015FF, 0x0,
+	0x4001603, 0x4001607, 0x0, 0x400160B, 0x400160F, 0x0, 0x4001613, 0x4001617, 0x400161B, 0x40015BB, 0x400161F, 0x4001623, 0x4001627, 0x400162B, 0x400162F, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001633, 0x0, 0x800163B, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001643, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800164B, 0x8001653,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800165B, 0x8001663, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800166B, 0x8001673, 0x0, 0x800167B, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001683, 0x800168B, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001693, 0x800169B,
+	0xC0016A3, 0xC0016AF, 0xC0016BB, 0xC0016C7, 0xC0016D3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80016DF, 0x80016E7, 0xC0016EF, 0xC0016FB, 0xC001707,
+	0xC001713, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300171F, 0x3001722, 0x3001725, 0x4001728, 0x300172C, 0x3001403, 0x300172F, 0x3001732, 0x3001735, 0x3001738, 0x3001406, 0x300173B, 0x300173E, 0x4001741, 0x3001409, 0x3001745,
+	0x3001748, 0x300174B, 0x400174E, 0x3001752, 0x3001755, 0x3001758, 0x400175B, 0x300175F, 0x3001762, 0x3001765, 0x3001768, 0x30014B8, 0x400176B, 0x300176F, 0x3001772, 0x3001775,
+	0x3001778, 0x300177B, 0x300177E, 0x3001781, 0x3001784, 0x30014C7, 0x300140C, 0x300140F, 0x30014CA, 0x3001787, 0x300178A, 0x30011CC, 0x300178D, 0x3001412, 0x3001790, 0x3001793,
+	0x3001796, 0x3001799, 0x3001799, 0x3001799, 0x400179C, 0x30017A0, 0x30017A3, 0x30017A6, 0x40017A9, 0x30017AD, 0x30017B0, 0x30017B3, 0x30017B6, 0x30017B9, 0x30017BC, 0x30017BF,
+	0x30017C2, 0x30017C5, 0x30017C8, 0x30017CB, 0x30017CE, 0x30017D1, 0x30017D1, 0x30014D0, 0x30017D4, 0x30017D7, 0x30017DA, 0x30017DD, 0x3001418, 0x30017E0, 0x30017E3, 0x30017E6,
+	0x3001397, 0x30017E9, 0x30017EC, 0x30017EF, 0x30017F2, 0x30017F5, 0x30017F8, 0x30017FB, 0x30017FE, 0x4001801, 0x3001805, 0x3001808, 0x300180B, 0x300180E, 0x3001811, 0x3001814,
+	0x4001817, 0x400181B, 0x300181F, 0x3001822, 0x3001825, 0x3001828, 0x300182B, 0x300182E, 0x3001831, 0x3001834, 0x3001837, 0x3001837, 0x400183A, 0x300183E, 0x3001841, 0x30011C0,
+	0x3001844, 0x4001847, 0x300184B, 0x300184E, 0x3001851, 0x3001854, 0x3001857, 0x300185A, 0x3001427, 0x300185D, 0x3001860, 0x4001863, 0x3001867, 0x400186A, 0x300186E, 0x3001871,
+	0x3001874, 0x3001877, 0x300187A, 0x300187D, 0x3001880, 0x3001883, 0x3001886, 0x3001889, 0x300188C, 0x400188F, 0x3001893, 0x3001896, 0x3001899, 0x300189C, 0x300111E, 0x400189F,
+	0x30018A3, 0x40018A6, 0x40018A6, 0x30018AA, 0x30018AD, 0x30018AD, 0x30018B0, 0x40018B3, 0x40018B7, 0x30018BB, 0x30018BE, 0x30018C1, 0x30018C4, 0x30018C7, 0x30018CA, 0x30018CD,
+	0x30018D0, 0x30018D3, 0x30018D6, 0x300142A, 0x40018D9, 0x30018DD, 0x30018E0, 0x30018E3, 0x30014F4, 0x30018E3, 0x30018E6, 0x3001430, 0x30018E9, 0x30018EC, 0x30018EF, 0x30018F2,
+	0x3001433, 0x30010CD, 0x30018F5, 0x30018F8, 0x30018FB, 0x30018FE, 0x3001901, 0x3001904, 0x4001907, 0x300190B, 0x300190E, 0x3001911, 0x3001914, 0x3001917, 0x400191A, 0x300191E,
+	0x3001921, 0x3001924, 0x3001927, 0x300192A, 0x300192D, 0x3001930, 0x3001933, 0x3001936, 0x3001436, 0x3001939, 0x400193C, 0x3001940, 0x3001943, 0x3001946, 0x3001949, 0x300143C,
+	0x300194C, 0x300194F, 0x3001952, 0x3001955, 0x3001958, 0x300195B, 0x300195E, 0x3001961, 0x3001121, 0x300150C, 0x3001964, 0x3001967, 0x300196A, 0x400196D, 0x3001971, 0x3001974,
+	0x3001977, 0x300197A, 0x300143F, 0x400197D, 0x3001981, 0x3001984, 0x3001987, 0x3001590, 0x300198A, 0x300198D, 0x3001990, 0x3001993, 0x4001996, 0x300199A, 0x300199D, 0x30019A0,
+	0x40019A3, 0x30019A7, 0x30019AA, 0x30019AD, 0x30019B0, 0x30011F3, 0x30019B3, 0x40019B6, 0x40019BA, 0x40019BE, 0x30019C2, 0x40019C5, 0x30019C9, 0x30019CC, 0x30019CF, 0x30019D2,
+	0x30019D5, 0x3001442, 0x30012F8, 0x30019D8, 0x30019DB, 0x30019DE, 0x40019E1, 0x30019E5, 0x30019E8, 0x30019EB, 0x30019EE, 0x3001518, 0x30019F1, 0x40019F4, 0x30019F8, 0x30019FB,
+	0x40019FE, 0x4001A02, 0x3001A06, 0x3001A09, 0x300151B, 0x3001A0C, 0x3001A0F, 0x3001A12, 0x3001A15, 0x3001A18, 0x3001A1B, 0x4001A1E, 0x3001A22, 0x4001A25, 0x3001A29, 0x4001A2C,
+	0x3001A30, 0x3001521, 0x3001A33, 0x4001A36, 0x3001A3A, 0x3001A3D, 0x4001A40, 0x4001A44, 0x3001A48, 0x3001A4B, 0x3001A4E, 0x3001A51, 0x3001A54, 0x3001A54, 0x3001A57, 0x3001A5A,
+	0x3001527, 0x3001A5D, 0x3001A60, 0x3001A63, 0x3001A66, 0x4001A69, 0x3001A6D, 0x4001A70, 0x30011C9, 0x4001A74, 0x3001A78, 0x4001A7B, 0x4001A7F, 0x4001A83, 0x3001A87, 0x3001A8A,
+	0x3001539, 0x4001A8D, 0x4001A91, 0x4001A95, 0x4001A99, 0x3001A9D, 0x3001AA0, 0x3001AA0, 0x300153C, 0x3001596, 0x3001AA3, 0x3001AA6, 0x3001AA9, 0x4001AAC, 0x3001AB0, 0x3001157,
+	0x3001542, 0x3001AB3, 0x4001AB6, 0x3001463, 0x4001ABA, 0x4001ABE, 0x30013D9, 0x3001AC2, 0x3001AC5, 0x300146F, 0x3001AC8, 0x3001ACB, 0x4001ACE, 0x4001AD2, 0x4001AD2, 0x3001AD6,
+	0x3001AD9, 0x4001ADC, 0x3001AE0, 0x3001AE3, 0x3001AE6, 0x4001AE9, 0x3001AED, 0x3001AF0, 0x3001AF3, 0x3001AF6, 0x3001AF9, 0x4001AFC, 0x3001B00, 0x3001B03, 0x3001B06, 0x3001B09,
+	0x3001B0C, 0x3001B0F, 0x4001B12, 0x4001B16, 0x3001B1A, 0x4001B1D, 0x3001B21, 0x4001B24, 0x3001B28, 0x3001B2B, 0x3001481, 0x4001B2E, 0x4001B32, 0x3001B36, 0x4001B39, 0x3001B3D,
+	0x4001B40, 0x3001B44, 0x3001B47, 0x3001B4A, 0x3001B4D, 0x3001B50, 0x3001B53, 0x4001B56, 0x4001B5A, 0x4001B5E, 0x4001B62, 0x30018AA, 0x3001B66, 0x3001B69, 0x3001B6C, 0x3001B6F,
+	0x3001B72, 0x3001B75, 0x3001B78, 0x3001B7B, 0x3001B7E, 0x3001B81, 0x3001B84, 0x4001B87, 0x30011FF, 0x3001B8B, 0x3001B8E, 0x3001B91, 0x3001B94, 0x3001B97, 0x3001B9A, 0x300148A,
+	0x3001B9D, 0x3001BA0, 0x3001BA3, 0x3001BA6, 0x4001BA9, 0x4001BAD, 0x4001BB1, 0x3001BB5, 0x3001BB8, 0x3001BBB, 0x3001BBE, 0x4001BC1, 0x3001BC5, 0x4001BC8, 0x3001BCC, 0x3001BCF,
+	0x4001BD2, 0x4001BD6, 0x3001BDA, 0x3001BDD, 0x3001148, 0x3001BE0, 0x3001BE3, 0x3001BE6, 0x3001BE9, 0x3001BEC, 0x3001BEF, 0x3001557, 0x3001BF2, 0x3001BF5, 0x3001BF8, 0x3001BFB,
+	0x3001BFE, 0x3001C01, 0x3001C04, 0x3001C07, 0x3001C0A, 0x4001C0D, 0x3001C11, 0x3001C14, 0x3001C17, 0x3001C1A, 0x3001C1D, 0x4001C20, 0x4001C24, 0x3001C28, 0x3001C2B, 0x3001C2E,
+	0x3001566, 0x3001569, 0x3001C31, 0x4001C34, 0x3001C38, 0x3001C3B, 0x3001C3E, 0x3001C41, 0x4001C44, 0x4001C48, 0x3001C4C, 0x3001C4F, 0x3001C52, 0x4001C55, 0x3001C59, 0x300156C,
+	0x4001C5C, 0x4001C60, 0x3001C64, 0x3001C67, 0x3001C6A, 0x4001C6D, 0x3001C71, 0x3001C74, 0x3001C77, 0x3001C7A, 0x3001C7D, 0x3001C80, 0x3001C83, 0x4001C86, 0x3001C8A, 0x3001C8D,
+	0x3001C90, 0x4001C93, 0x3001C97, 0x3001C9A, 0x3001C9D, 0x3001CA0, 0x4001CA3, 0x4001CA7, 0x3001CAB, 0x3001CAE, 0x3001CB1, 0x4001CB4, 0x3001CB8, 0x4001CBB, 0x300157E, 0x300157E,
+	0x3001CBF, 0x4001CC2, 0x3001CC6, 0x3001CC9, 0x3001CCC, 0x3001CCF, 0x3001CD2, 0x3001CD5, 0x3001CD8, 0x4001CDB, 0x3001581, 0x3001CDF, 0x3001CE2, 0x3001CE5, 0x3001CE8, 0x3001CEB,
+	0x4001CEE, 0x3001CF2, 0x4001CF5, 0x4001CF9, 0x4001CFD, 0x3001D01, 0x3001D04, 0x3001D07, 0x3001D0A, 0x3001D0D, 0x3001D10, 0x3001D13, 0x3001D16, 0x4001D19, 0x0, 0x0,
+};
+const uint32_t* NFDDataPtr = NFDData;
+
+const uint32_t NFKDIndex1[272] = {
+	0, 128, 256, 384, 512, 416, 416, 416, 416, 416, 640, 416, 416, 416, 416, 768,
+	416, 896, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 1024, 1152, 1280,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 1408,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+	416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+};
+const uint32_t* NFKDIndex1Ptr = NFKDIndex1;
+
+const uint32_t NFKDIndex2[1536] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0x0, 0x100, 0x120, 0x140,
+	0x160, 0x180, 0x0, 0x0, 0x0, 0x1A0, 0x1C0, 0x1E0, 0x0, 0x0, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0,
+	0x2C0, 0x2E0, 0x300, 0x320, 0x0, 0x0, 0x340, 0x360, 0x0, 0x0, 0x0, 0x0, 0x380, 0x0, 0x0, 0x0,
+	0x0, 0x3A0, 0x0, 0x3C0, 0x0, 0x0, 0x3E0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400, 0x420, 0x0, 0x0, 0x0, 0x440, 0x0,
+	0x0, 0x460, 0x480, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4A0, 0x0, 0x4C0, 0x0, 0x4E0, 0x0,
+	0x0, 0x0, 0x500, 0x0, 0x0, 0x0, 0x520, 0x0, 0x0, 0x0, 0x540, 0x0, 0x0, 0x0, 0x560, 0x0,
+	0x0, 0x580, 0x0, 0x0, 0x0, 0x5A0, 0x5C0, 0x0, 0x5E0, 0x0, 0x600, 0x620, 0x640, 0x660, 0x0, 0x0,
+	0x0, 0x680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6C0, 0x6E0, 0x700, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x720, 0x740, 0x760, 0x780, 0x7A0, 0x0, 0x0,
+	0x7C0, 0x7E0, 0x800, 0x820, 0x840, 0x860, 0x880, 0x8A0, 0x8C0, 0x8E0, 0x900, 0x920, 0x940, 0x960, 0x980, 0x9A0,
+	0x9C0, 0x9E0, 0xA00, 0xA20, 0xA40, 0xA60, 0x0, 0x0, 0xA80, 0xAA0, 0xAC0, 0xAE0, 0xB00, 0xB20, 0xB40, 0x0,
+	0xB60, 0xB80, 0xBA0, 0xBC0, 0xBE0, 0xC00, 0x0, 0xC20, 0x0, 0xC40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0xC60, 0xC80, 0xCA0, 0xCC0, 0xCE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0xD00, 0x0, 0x0, 0xD20, 0x0, 0x0, 0xD40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0xD60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xD80, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0xDA0, 0x0, 0x0, 0xDC0, 0xDE0, 0xE00, 0xE20, 0xE40, 0xE60, 0xE80, 0xEA0, 0x0,
+	0xEC0, 0xEE0, 0xF00, 0xF20, 0xF40, 0xF60, 0xF80, 0xFA0, 0x0, 0xFC0, 0xFE0, 0x1000, 0x1020, 0x0, 0x0, 0x0,
+	0x1040, 0x1060, 0x1080, 0x10A0, 0x10C0, 0x10E0, 0x1100, 0x1120, 0x1140, 0x1160, 0x1180, 0x11A0, 0x11C0, 0x11E0, 0x1200, 0x1220,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x1240, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1260, 0x0, 0x0, 0x0, 0x1280,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12A0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12C0, 0x12E0, 0x1300, 0x1320, 0x1340, 0x1360, 0x1380, 0x13A0,
+	0x13C0, 0x13E0, 0x1400, 0x1420, 0x1440, 0x1460, 0x1480, 0x0, 0x14A0, 0x14C0, 0x14E0, 0x1500, 0x1520, 0x1540, 0x1560, 0x1580,
+	0x15A0, 0x15C0, 0x15E0, 0x1600, 0x1620, 0x1640, 0x1660, 0x1680, 0x16A0, 0x16C0, 0x16E0, 0x1700, 0x1720, 0x1740, 0x1760, 0x1780,
+	0x17A0, 0x17C0, 0x17E0, 0x1800, 0x1820, 0x1840, 0x1860, 0x1880, 0x18A0, 0x18C0, 0x18E0, 0x1900, 0x1920, 0x1940, 0x1960, 0x1980,
+	0x0, 0x0, 0x0, 0x0, 0x19A0, 0x19C0, 0x0, 0x0, 0x0, 0x19E0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1A00, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x1A20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1A40, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1A60, 0x1A80, 0x0, 0x1AA0, 0x1AC0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0xCB6, 0x1AE0, 0x1B00, 0x1AEC, 0x1B20, 0x1B40, 0x1B60, 0xCC6, 0x1B80, 0x1BA0, 0x1BC0, 0x1AE8, 0xCCA, 0xCB6, 0x1AE0, 0xCC2,
+	0x1AEC, 0x1BE0, 0xCBA, 0x1AE4, 0xCC6, 0x1C00, 0x1C20, 0x1C40, 0x1C26, 0x1C0C, 0x1C2C, 0x1C12, 0x1C32, 0x1C18, 0x1C60, 0x1C80,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x1CA0, 0x1CC0, 0x1CE0, 0x1D00, 0x1D20, 0x1D40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1D60, 0x1D80, 0x1DA0, 0x1DC0, 0x1DE0, 0x0, 0x0, 0x0,
+	0x1E00, 0x1E20, 0x1E40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x1E60, 0x1E80, 0x1EA0, 0x1EC0, 0x1EE0, 0x1F00, 0x1F20, 0x1F40, 0x1F60, 0x1F80, 0x1FA0, 0x1FC0, 0x1FE0, 0x2000, 0x2020, 0x2040,
+	0x2060, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+const uint32_t* NFKDIndex2Ptr = NFKDIndex2;
+
+const uint32_t NFKDData[8320] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x1001D1D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3001D1E, 0x0, 0x100004E, 0x0, 0x0, 0x0, 0x0, 0x3001D21,
+	0x0, 0x0, 0x1001D24, 0x1001D25, 0x3001D26, 0x2001D29, 0x0, 0x0, 0x3001D2B, 0x1001D2E, 0x100007E, 0x0, 0x5001D2F, 0x5001D34, 0x5001D39, 0x0,
+	0x3000000, 0x3000003, 0x3000006, 0x3000009, 0x300000C, 0x300000F, 0x0, 0x3000012, 0x3000015, 0x3000018, 0x300001B, 0x300001E, 0x3000021, 0x3000024, 0x3000027, 0x300002A,
+	0x0, 0x300002D, 0x3000030, 0x3000033, 0x3000036, 0x3000039, 0x300003C, 0x0, 0x0, 0x300003F, 0x3000042, 0x3000045, 0x3000048, 0x300004B, 0x0, 0x0,
+	0x300004E, 0x3000051, 0x3000054, 0x3000057, 0x300005A, 0x300005D, 0x0, 0x3000060, 0x3000063, 0x3000066, 0x3000069, 0x300006C, 0x300006F, 0x3000072, 0x3000075, 0x3000078,
+	0x0, 0x300007B, 0x300007E, 0x3000081, 0x3000084, 0x3000087, 0x300008A, 0x0, 0x0, 0x300008D, 0x3000090, 0x3000093, 0x3000096, 0x3000099, 0x0, 0x300009C,
+	0x300009F, 0x30000A2, 0x30000A5, 0x30000A8, 0x30000AB, 0x30000AE, 0x30000B1, 0x30000B4, 0x30000B7, 0x30000BA, 0x30000BD, 0x30000C0, 0x30000C3, 0x30000C6, 0x30000C9, 0x30000CC,
+	0x0, 0x0, 0x30000CF, 0x30000D2, 0x30000D5, 0x30000D8, 0x30000DB, 0x30000DE, 0x30000E1, 0x30000E4, 0x30000E7, 0x30000EA, 0x30000ED, 0x30000F0, 0x30000F3, 0x30000F6,
+	0x30000F9, 0x30000FC, 0x30000FF, 0x3000102, 0x3000105, 0x3000108, 0x0, 0x0, 0x300010B, 0x300010E, 0x3000111, 0x3000114, 0x3000117, 0x300011A, 0x300011D, 0x3000120,
+	0x3000123, 0x0, 0x2001D3E, 0x2001D40, 0x3000126, 0x3000129, 0x300012C, 0x300012F, 0x0, 0x3000132, 0x3000135, 0x3000138, 0x300013B, 0x300013E, 0x3000141, 0x3001D42,
+	0x3001D45, 0x0, 0x0, 0x3000144, 0x3000147, 0x300014A, 0x300014D, 0x3000150, 0x3000153, 0x3001D48, 0x0, 0x0, 0x3000156, 0x3000159, 0x300015C, 0x300015F,
+	0x3000162, 0x3000165, 0x0, 0x0, 0x3000168, 0x300016B, 0x300016E, 0x3000171, 0x3000174, 0x3000177, 0x300017A, 0x300017D, 0x3000180, 0x3000183, 0x3000186, 0x3000189,
+	0x300018C, 0x300018F, 0x3000192, 0x3000195, 0x3000198, 0x300019B, 0x0, 0x0, 0x300019E, 0x30001A1, 0x30001A4, 0x30001A7, 0x30001AA, 0x30001AD, 0x30001B0, 0x30001B3,
+	0x30001B6, 0x30001B9, 0x30001BC, 0x30001BF, 0x30001C2, 0x30001C5, 0x30001C8, 0x30001CB, 0x30001CE, 0x30001D1, 0x30001D4, 0x30001D7, 0x30001DA, 0x30001DD, 0x30001E0, 0x100017D,
+	0x30001E3, 0x30001E6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30001E9,
+	0x30001EC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x4001D4B, 0x4001D4F, 0x4001D53, 0x2001D57, 0x2001D59, 0x2001D5B, 0x2001D5D, 0x2001D5F, 0x2001D61, 0x30001EF, 0x30001F2, 0x30001F5,
+	0x30001F8, 0x30001FB, 0x30001FE, 0x3000201, 0x3000204, 0x5000207, 0x500020C, 0x5000211, 0x5000216, 0x500021B, 0x5000220, 0x5000225, 0x500022A, 0x0, 0x500022F, 0x5000234,
+	0x5000239, 0x500023E, 0x4000243, 0x4000247, 0x0, 0x0, 0x300024B, 0x300024E, 0x3000251, 0x3000254, 0x3000257, 0x300025A, 0x500025D, 0x5000262, 0x4000267, 0x400026B,
+	0x300026F, 0x2001D4B, 0x2001D4F, 0x2001D53, 0x3000272, 0x3000275, 0x0, 0x0, 0x3000278, 0x300027B, 0x500027E, 0x5000283, 0x4000288, 0x400028C, 0x4000290, 0x4000294,
+	0x3000298, 0x300029B, 0x300029E, 0x30002A1, 0x30002A4, 0x30002A7, 0x30002AA, 0x30002AD, 0x30002B0, 0x30002B3, 0x30002B6, 0x30002B9, 0x30002BC, 0x30002BF, 0x30002C2, 0x30002C5,
+	0x30002C8, 0x30002CB, 0x30002CE, 0x30002D1, 0x30002D4, 0x30002D7, 0x30002DA, 0x30002DD, 0x30002E0, 0x30002E3, 0x30002E6, 0x30002E9, 0x0, 0x0, 0x30002EC, 0x30002EF,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3000239, 0x300023E, 0x30002F2, 0x30002F5, 0x50002F8, 0x50002FD, 0x5000302, 0x5000307, 0x300030C, 0x300030F,
+	0x5000312, 0x5000317, 0x300031C, 0x300031F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x1000108, 0x2001D63, 0x1000129, 0x100016B, 0x2001D65, 0x2001D67, 0x2001D69, 0x10001C5, 0x1000099, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3001D6B, 0x3001D6E, 0x3001D71, 0x3001D74, 0x3001D77, 0x3001D7A, 0x0, 0x0,
+	0x2001D7D, 0x1000135, 0x100017D, 0x100080E, 0x2001D7F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2000001, 0x2000004, 0x0, 0x2000322, 0x4000212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x2000324, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3001D81, 0x0, 0x0, 0x0, 0x1000326, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x3001D26, 0x5001D84, 0x400032B, 0x200032F, 0x4000331, 0x4000335, 0x4000339, 0x0, 0x400033D, 0x0, 0x4000341, 0x4000345,
+	0x6000349, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400034F, 0x4000353, 0x4000357, 0x400035B, 0x400035F, 0x4000363,
+	0x6000367, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4000349, 0x4000367, 0x400036D, 0x4000371, 0x4000375, 0x0,
+	0x2001D89, 0x2001D8B, 0x2000341, 0x4000341, 0x4000353, 0x2001D8D, 0x2001D8F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2001D91, 0x2000E17, 0x2001D93, 0x0, 0x2001D95, 0x200035B, 0x0, 0x0, 0x0, 0x2001D97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4000381, 0x4000385, 0x0, 0x4000389, 0x0, 0x0, 0x0, 0x400038D, 0x0, 0x0, 0x0, 0x0, 0x4000391, 0x4000395, 0x4000399, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400039D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40003A1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40003A5, 0x40003A9, 0x0, 0x40003AD, 0x0, 0x0, 0x0, 0x40003B1, 0x0, 0x0, 0x0, 0x0, 0x40003B5, 0x40003B9, 0x40003BD, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40003C1, 0x40003C5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x40003C9, 0x40003CD, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40003D1, 0x40003D5, 0x40003D9, 0x40003DD, 0x0, 0x0, 0x40003E1, 0x40003E5, 0x0, 0x0, 0x40003E9, 0x40003ED, 0x40003F1, 0x40003F5, 0x40003F9, 0x40003FD,
+	0x0, 0x0, 0x4000401, 0x4000405, 0x4000409, 0x400040D, 0x4000411, 0x4000415, 0x0, 0x0, 0x4000419, 0x400041D, 0x4000421, 0x4000425, 0x4000429, 0x400042D,
+	0x4000431, 0x4000435, 0x4000439, 0x400043D, 0x4000441, 0x4000445, 0x0, 0x0, 0x4000449, 0x400044D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4001D99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x4000451, 0x4000455, 0x4000459, 0x400045D, 0x4000461, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x4001D9D, 0x4001DA1, 0x4001DA5, 0x4001DA9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4000465, 0x0, 0x4000469, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x400046D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000471, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x6000477, 0x0, 0x0, 0x600047D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000483, 0x6000489, 0x600048F, 0x6000495, 0x600049B, 0x60004A1, 0x60004A7, 0x60004AD,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004B3, 0x60004B9, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004BF, 0x60004C5, 0x0, 0x60004CB,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x60004D1, 0x0, 0x0, 0x60004D7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004DD, 0x60004E3, 0x60004E9, 0x0, 0x0, 0x60004EF, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60004F5, 0x0, 0x0, 0x60004FB, 0x6000501, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000507, 0x600050D, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x6000513, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000519, 0x600051F, 0x6000525, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x600052B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6000531, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000537, 0x600053D, 0x0, 0x6000543, 0x9001DAD, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000552, 0x6000558, 0x600055E, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000564, 0x0, 0x600056A, 0x9001DB6, 0x6000579, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x6001DBF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x6001DC5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6001DCB, 0x6001DD1, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3001DD7, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x600057F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000585, 0x0, 0x0,
+	0x0, 0x0, 0x600058B, 0x0, 0x0, 0x0, 0x0, 0x6000591, 0x0, 0x0, 0x0, 0x0, 0x6000597, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x600059D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x60005A3, 0x0, 0x60005A9, 0x60005AF, 0x9001DDA, 0x60005B5, 0x9001DE3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x60005BB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x60005C1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005C7, 0x0, 0x0,
+	0x0, 0x0, 0x60005CD, 0x0, 0x0, 0x0, 0x0, 0x60005D3, 0x0, 0x0, 0x0, 0x0, 0x60005D9, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005DF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005E5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3001DEC, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60005EB, 0x0, 0x60005F1, 0x0, 0x60005F7, 0x0, 0x60005FD, 0x0, 0x6000603, 0x0,
+	0x0, 0x0, 0x6000609, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x600060F, 0x0, 0x6000615, 0x0, 0x0,
+	0x600061B, 0x6000621, 0x0, 0x6000627, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000000, 0x2000243, 0x1000633, 0x0,
+	0x10000C9, 0x1000015, 0x2001DEF, 0x10000ED, 0x1000105, 0x1000021, 0x1000126, 0x100012C, 0x1000132, 0x10006FF, 0x100002D, 0x0, 0x1000030, 0x2001DF1, 0x1000751, 0x1000168,
+	0x1000192, 0x100003F, 0x10001C2, 0x100004E, 0x2001DF3, 0x2001DF5, 0x3001DF7, 0x1000636, 0x10000CC, 0x1000063, 0x2001DFA, 0x2001DFC, 0x2001DFE, 0x10000F0, 0x0, 0x100012F,
+	0x1000702, 0x2001E00, 0x100007E, 0x2001E02, 0x3001E04, 0x3001E07, 0x1000754, 0x1000195, 0x100008D, 0x3001E0A, 0x2001E0D, 0x10007E4, 0x3001E0F, 0x2001D89, 0x2001E12, 0x2001E14,
+	0x2001D8D, 0x2001E16, 0x100006F, 0x100016B, 0x100008D, 0x10007E4, 0x2001D89, 0x2001E12, 0x2000E17, 0x2001D8D, 0x2001E16, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2001E18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2001E1A, 0x1000060, 0x2001E1C, 0x2001E1E, 0x2001DFE,
+	0x100069A, 0x2001E20, 0x2001E22, 0x2001E24, 0x2001E26, 0x2001E28, 0x2001E2A, 0x3001E2C, 0x2001E2F, 0x2001E31, 0x3001E33, 0x2001E36, 0x2001E38, 0x2001E3A, 0x2001E3C, 0x2001E3E,
+	0x2001E40, 0x2001E42, 0x2001E44, 0x2001E46, 0x2001E48, 0x2001E4A, 0x2001E4C, 0x2001E4E, 0x3001E50, 0x2001E53, 0x2001E55, 0x10001D4, 0x2001E57, 0x2001E59, 0x200026B, 0x2001D8B,
+	0x300062D, 0x3000630, 0x3000633, 0x3000636, 0x3000639, 0x300063C, 0x300063F, 0x3000642, 0x5000645, 0x500064A, 0x300064F, 0x3000652, 0x3000655, 0x3000658, 0x300065B, 0x300065E,
+	0x3000661, 0x3000664, 0x3000667, 0x300066A, 0x500066D, 0x5000672, 0x5000677, 0x500067C, 0x3000681, 0x3000684, 0x3000687, 0x300068A, 0x500068D, 0x5000692, 0x3000697, 0x300069A,
+	0x300069D, 0x30006A0, 0x30006A3, 0x30006A6, 0x30006A9, 0x30006AC, 0x30006AF, 0x30006B2, 0x30006B5, 0x30006B8, 0x30006BB, 0x30006BE, 0x30006C1, 0x30006C4, 0x50006C7, 0x50006CC,
+	0x30006D1, 0x30006D4, 0x30006D7, 0x30006DA, 0x30006DD, 0x30006E0, 0x30006E3, 0x30006E6, 0x50006E9, 0x50006EE, 0x30006F3, 0x30006F6, 0x30006F9, 0x30006FC, 0x30006FF, 0x3000702,
+	0x3000705, 0x3000708, 0x300070B, 0x300070E, 0x3000711, 0x3000714, 0x3000717, 0x300071A, 0x300071D, 0x3000720, 0x3000723, 0x3000726, 0x5000729, 0x500072E, 0x5000733, 0x5000738,
+	0x500073D, 0x5000742, 0x5000747, 0x500074C, 0x3000751, 0x3000754, 0x3000757, 0x300075A, 0x300075D, 0x3000760, 0x3000763, 0x3000766, 0x5000769, 0x500076E, 0x3000773, 0x3000776,
+	0x3000779, 0x300077C, 0x300077F, 0x3000782, 0x5000785, 0x500078A, 0x500078F, 0x5000794, 0x5000799, 0x500079E, 0x30007A3, 0x30007A6, 0x30007A9, 0x30007AC, 0x30007AF, 0x30007B2,
+	0x30007B5, 0x30007B8, 0x30007BB, 0x30007BE, 0x30007C1, 0x30007C4, 0x30007C7, 0x30007CA, 0x50007CD, 0x50007D2, 0x50007D7, 0x50007DC, 0x30007E1, 0x30007E4, 0x30007E7, 0x30007EA,
+	0x30007ED, 0x30007F0, 0x30007F3, 0x30007F6, 0x30007F9, 0x30007FC, 0x30007FF, 0x3000802, 0x3000805, 0x3000808, 0x300080B, 0x300080E, 0x3000811, 0x3000814, 0x3000817, 0x300081A,
+	0x300081D, 0x3000820, 0x3000823, 0x3000826, 0x3000829, 0x300082C, 0x300082F, 0x3000832, 0x3000835, 0x3000838, 0x3001E5B, 0x300077C, 0x0, 0x0, 0x0, 0x0,
+	0x300083F, 0x3000842, 0x3000845, 0x3000848, 0x500084B, 0x5000850, 0x5000855, 0x500085A, 0x500085F, 0x5000864, 0x5000869, 0x500086E, 0x5000873, 0x5000878, 0x500087D, 0x5000882,
+	0x5000887, 0x500088C, 0x5000891, 0x5000896, 0x500089B, 0x50008A0, 0x50008A5, 0x50008AA, 0x30008AF, 0x30008B2, 0x30008B5, 0x30008B8, 0x30008BB, 0x30008BE, 0x50008C1, 0x50008C6,
+	0x50008CB, 0x50008D0, 0x50008D5, 0x50008DA, 0x50008DF, 0x50008E4, 0x50008E9, 0x50008EE, 0x30008F3, 0x30008F6, 0x30008F9, 0x30008FC, 0x30008FF, 0x3000902, 0x3000905, 0x3000908,
+	0x500090B, 0x5000910, 0x5000915, 0x500091A, 0x500091F, 0x5000924, 0x5000929, 0x500092E, 0x5000933, 0x5000938, 0x500093D, 0x5000942, 0x5000947, 0x500094C, 0x5000951, 0x5000956,
+	0x500095B, 0x5000960, 0x5000965, 0x500096A, 0x300096F, 0x3000972, 0x3000975, 0x3000978, 0x500097B, 0x5000980, 0x5000985, 0x500098A, 0x500098F, 0x5000994, 0x5000999, 0x500099E,
+	0x50009A3, 0x50009A8, 0x30009AD, 0x30009B0, 0x30009B3, 0x30009B6, 0x30009B9, 0x30009BC, 0x30009BF, 0x30009C2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40009C5, 0x40009C9, 0x60009CD, 0x60009D3, 0x60009D9, 0x60009DF, 0x60009E5, 0x60009EB, 0x40009F1, 0x40009F5, 0x60009F9, 0x60009FF, 0x6000A05, 0x6000A0B, 0x6000A11, 0x6000A17,
+	0x4000A1D, 0x4000A21, 0x6000A25, 0x6000A2B, 0x6000A31, 0x6000A37, 0x0, 0x0, 0x4000A3D, 0x4000A41, 0x6000A45, 0x6000A4B, 0x6000A51, 0x6000A57, 0x0, 0x0,
+	0x4000A5D, 0x4000A61, 0x6000A65, 0x6000A6B, 0x6000A71, 0x6000A77, 0x6000A7D, 0x6000A83, 0x4000A89, 0x4000A8D, 0x6000A91, 0x6000A97, 0x6000A9D, 0x6000AA3, 0x6000AA9, 0x6000AAF,
+	0x4000AB5, 0x4000AB9, 0x6000ABD, 0x6000AC3, 0x6000AC9, 0x6000ACF, 0x6000AD5, 0x6000ADB, 0x4000AE1, 0x4000AE5, 0x6000AE9, 0x6000AEF, 0x6000AF5, 0x6000AFB, 0x6000B01, 0x6000B07,
+	0x4000B0D, 0x4000B11, 0x6000B15, 0x6000B1B, 0x6000B21, 0x6000B27, 0x0, 0x0, 0x4000B2D, 0x4000B31, 0x6000B35, 0x6000B3B, 0x6000B41, 0x6000B47, 0x0, 0x0,
+	0x4000B4D, 0x4000B51, 0x6000B55, 0x6000B5B, 0x6000B61, 0x6000B67, 0x6000B6D, 0x6000B73, 0x0, 0x4000B79, 0x0, 0x6001E5E, 0x0, 0x6000B83, 0x0, 0x6000B89,
+	0x4000B8F, 0x4000B93, 0x6000B97, 0x6000B9D, 0x6000BA3, 0x6000BA9, 0x6000BAF, 0x6000BB5, 0x4000BBB, 0x4000BBF, 0x6000BC3, 0x6000BC9, 0x6000BCF, 0x6000BD5, 0x6000BDB, 0x6000BE1,
+	0x4000BE7, 0x4000357, 0x4000BEB, 0x400035B, 0x4000BEF, 0x400035F, 0x4000BF3, 0x4000363, 0x4000BF7, 0x400036D, 0x4000BFB, 0x4000371, 0x4000BFF, 0x4000375, 0x0, 0x0,
+	0x6000C03, 0x6000C09, 0x8000C0F, 0x8000C17, 0x8000C1F, 0x8000C27, 0x8000C2F, 0x8000C37, 0x6000C3F, 0x6000C45, 0x8000C4B, 0x8000C53, 0x8000C5B, 0x8000C63, 0x8000C6B, 0x8000C73,
+	0x6000C7B, 0x6000C81, 0x8000C87, 0x8000C8F, 0x8000C97, 0x8000C9F, 0x8000CA7, 0x8000CAF, 0x6000CB7, 0x6000CBD, 0x8000CC3, 0x8000CCB, 0x8000CD3, 0x8000CDB, 0x8000CE3, 0x8000CEB,
+	0x6000CF3, 0x6000CF9, 0x8000CFF, 0x8000D07, 0x8000D0F, 0x8000D17, 0x8000D1F, 0x8000D27, 0x6000D2F, 0x6000D35, 0x8000D3B, 0x8000D43, 0x8000D4B, 0x8000D53, 0x8000D5B, 0x8000D63,
+	0x4000D6B, 0x4000D6F, 0x6000D73, 0x4000D79, 0x6000D7D, 0x0, 0x4000D83, 0x6001E64, 0x4000D8D, 0x4000D91, 0x4000D95, 0x400032B, 0x4000D99, 0x3001E6A, 0x2000349, 0x3001E6A,
+	0x3001E6D, 0x5001E70, 0x6000DA1, 0x4000DA7, 0x6000DAB, 0x0, 0x4000DB1, 0x6001E75, 0x4000DBB, 0x4000331, 0x4000DBF, 0x4000335, 0x4000DC3, 0x5001E7B, 0x5001E80, 0x5001E85,
+	0x4000DD6, 0x4000DDA, 0x6000DDE, 0x6000349, 0x0, 0x0, 0x4000DE4, 0x6000DE8, 0x4000DEE, 0x4000DF2, 0x4000DF6, 0x4000339, 0x0, 0x5001E8A, 0x5001E8F, 0x5001E94,
+	0x4000E09, 0x4000E0D, 0x6000E11, 0x6000367, 0x4000E17, 0x4000E1B, 0x4000E1F, 0x6000E23, 0x4000E29, 0x4000E2D, 0x4000E31, 0x4000341, 0x4000E35, 0x5001E99, 0x5001D84, 0x1000E3D,
+	0x0, 0x0, 0x6000E3E, 0x4000E44, 0x6000E48, 0x0, 0x4000E4E, 0x6001E9E, 0x4000E58, 0x400033D, 0x4000E5C, 0x4000345, 0x4000E60, 0x3001D26, 0x3001E8A, 0x0,
+	0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x1001D1D, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3001EA4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3001EA7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x1001EAA, 0x2001EAB, 0x3001EAA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1001D1D,
+	0x0, 0x0, 0x0, 0x6001EAD, 0x9001EB3, 0x0, 0x6001EBC, 0x9001EC2, 0x0, 0x0, 0x0, 0x0, 0x2001ECB, 0x0, 0x3001ECD, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2001ED0, 0x2001ED2, 0x2001ED4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xC001EAD, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1001D1D,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x1001ED6, 0x100006F, 0x0, 0x0, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB, 0x1001EDC, 0x3001EDD, 0x1000EB7, 0x1001EE0, 0x1001EE1, 0x100007B,
+	0x1001ED6, 0x1001D2E, 0x1001D24, 0x1001D25, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB, 0x1001EDC, 0x3001EDD, 0x1000EB7, 0x1001EE0, 0x1001EE1, 0x0,
+	0x100004E, 0x1000063, 0x100007E, 0x100080E, 0x2001DFA, 0x1000108, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x1000754, 0x100017D, 0x1000195, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2001EE2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3001EE4, 0x3001EE7, 0x1000012, 0x3001EEA, 0x0, 0x3001EED, 0x3001EF0, 0x2001EF3, 0x0, 0x3001EF5, 0x10000F0, 0x1000105, 0x1000105, 0x1000105, 0x1000108, 0x2001EF8,
+	0x1000021, 0x1000021, 0x1000132, 0x1000135, 0x0, 0x100002D, 0x2001EFA, 0x0, 0x0, 0x1000751, 0x1001EFC, 0x1000168, 0x1000168, 0x1000168, 0x0, 0x0,
+	0x2001EFD, 0x3001EFF, 0x2001F02, 0x0, 0x10001D1, 0x0, 0x2000345, 0x0, 0x10001D1, 0x0, 0x100012C, 0x300000F, 0x1000633, 0x1000012, 0x0, 0x1000063,
+	0x1000015, 0x1000697, 0x0, 0x10006FF, 0x100007E, 0x20015C7, 0x20015D3, 0x20015D7, 0x20015DB, 0x100006F, 0x0, 0x3001F04, 0x2001D8F, 0x2001E12, 0x2001F07, 0x2001F09,
+	0x3001F0B, 0x0, 0x0, 0x0, 0x0, 0x10000C9, 0x10000CC, 0x1000063, 0x100006F, 0x1000129, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x5001F0E, 0x5001F13, 0x6001F18, 0x5001F1E, 0x5001F23, 0x5001F28, 0x5001F2D, 0x5001F32, 0x5001F37, 0x5001F3C, 0x5001F41, 0x5001F46, 0x5001F4B, 0x5001F50, 0x5001F55, 0x4001D34,
+	0x1000021, 0x2001F5A, 0x3001F5C, 0x2001F5F, 0x10007E1, 0x2001F61, 0x3001F63, 0x4001F66, 0x2001F6A, 0x100080B, 0x2001F6C, 0x3001F6E, 0x1000132, 0x1000012, 0x10000C9, 0x10006FF,
+	0x100006F, 0x2001F71, 0x3001F73, 0x2001F76, 0x10007E4, 0x2001F78, 0x3001F7A, 0x4001F7D, 0x2001F81, 0x100080E, 0x2001F83, 0x3001F85, 0x1000135, 0x1000060, 0x10000CC, 0x1000702,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5001F88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000E6C, 0x5000E71, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000E76, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000E7B, 0x5000E80, 0x5000E85,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x5000E8A, 0x0, 0x0, 0x0, 0x0, 0x5000E8F, 0x0, 0x0, 0x5000E94, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x5000E99, 0x0, 0x5000E9E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6001F8D, 0x9001F93, 0x0, 0x6001F9C,
+	0x9001FA2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x5000EA3, 0x0, 0x0, 0x5000EA8, 0x0, 0x0, 0x5000EAD, 0x0, 0x5000EB2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3000EB7, 0x0, 0x5000EBA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000EBF, 0x3000EC4, 0x3000EC7,
+	0x5000ECA, 0x5000ECF, 0x0, 0x0, 0x5000ED4, 0x5000ED9, 0x0, 0x0, 0x5000EDE, 0x5000EE3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x5000EE8, 0x5000EED, 0x0, 0x0, 0x5000EF2, 0x5000EF7, 0x0, 0x0, 0x5000EFC, 0x5000F01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000F06, 0x5000F0B, 0x5000F10, 0x5000F15,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x5000F1A, 0x5000F1F, 0x5000F24, 0x5000F29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000F2E, 0x5000F33, 0x5000F38, 0x5000F3D, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3000F42, 0x3000F45, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x1001D2E, 0x1001D24, 0x1001D25, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB, 0x2001F1C, 0x2001D2E, 0x2001FAB, 0x2001FAD, 0x2001FAF, 0x2001FB1, 0x2001FB3,
+	0x2001FB5, 0x2001FB7, 0x2001FB9, 0x2001FBB, 0x3001FBD, 0x3001FC0, 0x3001FC3, 0x3001FC6, 0x3001FC9, 0x3001FCC, 0x3001FCF, 0x3001FD2, 0x3001FD5, 0x4001FD8, 0x4001FDC, 0x4001FE0,
+	0x4001FE4, 0x4001FE8, 0x4001FEC, 0x4001FF0, 0x4001FF4, 0x4001FF8, 0x4001FFC, 0x4002000, 0x2002004, 0x2002006, 0x2002008, 0x200200A, 0x200200C, 0x200200E, 0x2002010, 0x2002012,
+	0x2002014, 0x3002016, 0x3002019, 0x300201C, 0x300201F, 0x3002022, 0x3002025, 0x3002028, 0x300202B, 0x300202E, 0x3002031, 0x3002034, 0x3002037, 0x300203A, 0x300203D, 0x3002040,
+	0x3002043, 0x3002046, 0x3002049, 0x300204C, 0x300204F, 0x3002052, 0x3002055, 0x3002058, 0x300205B, 0x300205E, 0x3002061, 0x3002064, 0x3002067, 0x300206A, 0x300206D, 0x3002070,
+	0x3002073, 0x3002076, 0x3002079, 0x300207C, 0x300207F, 0x3002082, 0x1000000, 0x1000633, 0x1000012, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x1000105, 0x1000021, 0x1000126,
+	0x100012C, 0x1000132, 0x10006FF, 0x100002D, 0x1000030, 0x1000751, 0x1001EFC, 0x1000168, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x10001D1,
+	0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x100007E, 0x1000754,
+	0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x1001ED6, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xC001F8D, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x3002085, 0x2002088, 0x3002087, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5000F48, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000129, 0x10007E1, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300208A,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300208D,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x3002090, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3002093, 0x3002096, 0x3002099, 0x300209C, 0x300209F, 0x30020A2, 0x30020A5, 0x30020A8, 0x30020AB, 0x30020AE, 0x30020B1, 0x30020B4, 0x30020B7, 0x30020BA, 0x30020BD, 0x30020C0,
+	0x300176F, 0x30020C3, 0x3001241, 0x30020C6, 0x30020C9, 0x30020CC, 0x30020CF, 0x30020D2, 0x30020D5, 0x30020D8, 0x30020DB, 0x30020DE, 0x30020E1, 0x30020E4, 0x30020E7, 0x30020EA,
+	0x30020ED, 0x30020F0, 0x30020F3, 0x30020F6, 0x30020F9, 0x3001226, 0x30020FC, 0x30020FF, 0x3002102, 0x3002105, 0x3001854, 0x3002108, 0x3001427, 0x300210B, 0x300210E, 0x3002111,
+	0x3002114, 0x3002117, 0x300211A, 0x300211D, 0x3002120, 0x3002123, 0x30018A3, 0x3002126, 0x3002129, 0x300212C, 0x300212F, 0x3002132, 0x3002135, 0x3002138, 0x300213B, 0x300213E,
+	0x3002141, 0x3002144, 0x3002147, 0x300214A, 0x300214D, 0x3002150, 0x3002153, 0x3002156, 0x3002159, 0x300215C, 0x300215F, 0x3002162, 0x3002165, 0x3001512, 0x3002168, 0x300216B,
+	0x300216E, 0x3002171, 0x3002174, 0x3002177, 0x300217A, 0x300217D, 0x3002180, 0x3002183, 0x3002186, 0x3002189, 0x300218C, 0x300218F, 0x3002192, 0x3002195, 0x3002198, 0x300219B,
+	0x300219E, 0x30021A1, 0x30021A4, 0x30021A7, 0x30021AA, 0x30021AD, 0x30021B0, 0x30021B3, 0x30021B6, 0x30021B9, 0x30021BC, 0x30021BF, 0x30021C2, 0x30021C5, 0x30021C8, 0x30021CB,
+	0x30021CE, 0x30021D1, 0x30021D4, 0x30021D7, 0x300137C, 0x30021DA, 0x30021DD, 0x30021E0, 0x30021E3, 0x30021E6, 0x30021E9, 0x30013E2, 0x3001142, 0x30021EC, 0x30021EF, 0x30021F2,
+	0x30021F5, 0x30021F8, 0x30021FB, 0x30021FE, 0x3002201, 0x3002204, 0x3002207, 0x300220A, 0x300220D, 0x3002210, 0x3002213, 0x3002216, 0x3002219, 0x300221C, 0x300221F, 0x30013AF,
+	0x3001C0A, 0x3002222, 0x30013B5, 0x3002225, 0x3002228, 0x300222B, 0x300222E, 0x3001C31, 0x3002231, 0x3002234, 0x3002237, 0x300223A, 0x300223D, 0x3002240, 0x30010AF, 0x3002243,
+	0x30011F6, 0x3002246, 0x3002249, 0x300224C, 0x300224F, 0x3001352, 0x30010C4, 0x3002252, 0x3002255, 0x3002258, 0x300225B, 0x300225E, 0x3002261, 0x3002264, 0x3002267, 0x300226A,
+	0x300226D, 0x3002270, 0x3002273, 0x3002276, 0x3002279, 0x300227C, 0x300227F, 0x3002282, 0x3002285, 0x3002288, 0x300228B, 0x300228E, 0x3002291, 0x3002294, 0x3002297, 0x300229A,
+	0x300229D, 0x30022A0, 0x30022A3, 0x30022A6, 0x30022A9, 0x3001166, 0x30022AC, 0x3001D01, 0x30022AF, 0x30022B2, 0x30022B5, 0x3001D07, 0x30022B8, 0x30022BB, 0x30022BE, 0x30022C1,
+	0x3001D16, 0x30022C4, 0x30022C7, 0x30012E6, 0x30010BE, 0x30022CA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x1001D1D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30022CD, 0x0, 0x30020D2, 0x30022D0, 0x30022D3, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000F4D, 0x0, 0x6000F53, 0x0,
+	0x6000F59, 0x0, 0x6000F5F, 0x0, 0x6000F65, 0x0, 0x6000F6B, 0x0, 0x6000F71, 0x0, 0x6000F77, 0x0, 0x6000F7D, 0x0, 0x6000F83, 0x0,
+	0x6000F89, 0x0, 0x6000F8F, 0x0, 0x0, 0x6000F95, 0x0, 0x6000F9B, 0x0, 0x6000FA1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6000FA7, 0x6000FAD, 0x0, 0x6000FB3, 0x6000FB9, 0x0, 0x6000FBF, 0x6000FC5, 0x0, 0x6000FCB, 0x6000FD1, 0x0, 0x6000FD7, 0x6000FDD, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x6000FE3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40022D6, 0x40022DA, 0x0, 0x6000FE9, 0x60022DE,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000FEF, 0x0, 0x6000FF5, 0x0,
+	0x6000FFB, 0x0, 0x6001001, 0x0, 0x6001007, 0x0, 0x600100D, 0x0, 0x6001013, 0x0, 0x6001019, 0x0, 0x600101F, 0x0, 0x6001025, 0x0,
+	0x600102B, 0x0, 0x6001031, 0x0, 0x0, 0x6001037, 0x0, 0x600103D, 0x0, 0x6001043, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6001049, 0x600104F, 0x0, 0x6001055, 0x600105B, 0x0, 0x6001061, 0x6001067, 0x0, 0x600106D, 0x6001073, 0x0, 0x6001079, 0x600107F, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x6001085, 0x0, 0x0, 0x600108B, 0x6001091, 0x6001097, 0x600109D, 0x0, 0x0, 0x0, 0x60010A3, 0x60022E4,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x30022EA, 0x30022ED, 0x30022F0, 0x30022F3, 0x30022F6, 0x30022F9, 0x30022FC, 0x30022FF, 0x3002302, 0x3002305, 0x3002308, 0x300230B, 0x300230E, 0x3002311, 0x3002314,
+	0x3002317, 0x300231A, 0x300231D, 0x3002320, 0x3002323, 0x3002326, 0x3002329, 0x300232C, 0x300232F, 0x3002332, 0x3002335, 0x3002338, 0x300233B, 0x300233E, 0x3002341, 0x3002344,
+	0x3002347, 0x300234A, 0x300234D, 0x3002350, 0x3002353, 0x3002356, 0x3002359, 0x300235C, 0x300235F, 0x3002362, 0x3002365, 0x3002368, 0x300236B, 0x300236E, 0x3002371, 0x3002374,
+	0x3002377, 0x300237A, 0x300237D, 0x3002380, 0x3002383, 0x3002386, 0x3002389, 0x300238C, 0x300238F, 0x3002392, 0x3002395, 0x3002398, 0x300239B, 0x300239E, 0x30023A1, 0x30023A4,
+	0x30023A7, 0x30023AA, 0x30023AD, 0x30023B0, 0x30023B3, 0x30023B6, 0x30023B9, 0x30023BC, 0x30023BF, 0x30023C2, 0x30023C5, 0x30023C8, 0x30023CB, 0x30023CE, 0x30023D1, 0x30023D4,
+	0x30023D7, 0x30023DA, 0x30023DD, 0x30023E0, 0x30023E3, 0x30023E6, 0x30023E9, 0x30023EC, 0x30023EF, 0x30023F2, 0x30023F5, 0x30023F8, 0x30023FB, 0x30023FE, 0x3002401, 0x0,
+	0x0, 0x0, 0x3002093, 0x30020A5, 0x3002404, 0x3002407, 0x300240A, 0x300240D, 0x3002410, 0x3002413, 0x300209F, 0x3002416, 0x3002419, 0x300241C, 0x300241F, 0x30020AB,
+	0x5002422, 0x5002427, 0x500242C, 0x5002431, 0x5002436, 0x500243B, 0x5002440, 0x5002445, 0x500244A, 0x500244F, 0x5002454, 0x5002459, 0x500245E, 0x5002463, 0x8002468, 0x8002470,
+	0x8002478, 0x8002480, 0x8002488, 0x8002490, 0x8002498, 0x80024A0, 0x80024A8, 0x80024B0, 0x80024B8, 0x80024C0, 0x80024C8, 0x80024D0, 0x80024D8, 0x110024E0, 0xE0024F1, 0x0,
+	0x50024FF, 0x5002504, 0x5002509, 0x500250E, 0x5002513, 0x5002518, 0x500251D, 0x5002522, 0x5002527, 0x500252C, 0x5002531, 0x5002536, 0x500253B, 0x5002540, 0x5002545, 0x500254A,
+	0x500254F, 0x5002554, 0x5002559, 0x500255E, 0x5002563, 0x5002568, 0x500256D, 0x5002572, 0x5002577, 0x500257C, 0x5002581, 0x5002586, 0x500258B, 0x5002590, 0x5002595, 0x500259A,
+	0x500259F, 0x50025A4, 0x50025A9, 0x50025AE, 0x30025B3, 0x30025B6, 0x3002147, 0x30025B9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30025BC, 0x2001FAC, 0x20025BF, 0x2001D24, 0x20025C1, 0x20025C3, 0x20025C5, 0x20025C7, 0x20025C9, 0x20025CB, 0x20025CD, 0x2001F27, 0x2001F22, 0x20025CF, 0x20025D1, 0x20025D3,
+	0x30022EA, 0x30022F3, 0x30022FC, 0x3002302, 0x300231A, 0x300231D, 0x3002326, 0x300232C, 0x300232F, 0x3002335, 0x3002338, 0x300233B, 0x300233E, 0x3002341, 0x6002469, 0x6002471,
+	0x6002479, 0x6002481, 0x6002489, 0x6002491, 0x6002499, 0x60024A1, 0x60024A9, 0x60024B1, 0x60024B9, 0x60024C1, 0x60024C9, 0x6002341, 0xF0025D5, 0xC0025E4, 0x60025F0, 0x0,
+	0x3002093, 0x30020A5, 0x3002404, 0x3002407, 0x3002514, 0x300130D, 0x300251E, 0x30020B4, 0x3002528, 0x30020D2, 0x300215C, 0x300217D, 0x300217A, 0x300215F, 0x30010C4, 0x30020EA,
+	0x3002156, 0x3002555, 0x300255A, 0x3001457, 0x3002564, 0x3002569, 0x300256E, 0x3001466, 0x3002578, 0x30025F6, 0x30025F9, 0x3001226, 0x30025FC, 0x30025FF, 0x3002602, 0x3002605,
+	0x3002608, 0x30025A5, 0x300260B, 0x300260E, 0x300240A, 0x300240D, 0x3002410, 0x3002611, 0x3002614, 0x3002617, 0x300261A, 0x3002587, 0x300258C, 0x3002591, 0x3002596, 0x300259B,
+	0x300261D, 0x2002620, 0x2002622, 0x2002624, 0x2002626, 0x2002628, 0x2001D33, 0x20025C2, 0x20025D2, 0x200262A, 0x200262C, 0x200262E, 0x2002630, 0x2002632, 0x2002634, 0x2002636,
+	0x4002638, 0x400263C, 0x4002640, 0x4002644, 0x4002648, 0x400264C, 0x4002650, 0x4002654, 0x4002658, 0x500265C, 0x5002661, 0x5002666, 0x200266B, 0x300266D, 0x2002670, 0x3002672,
+	0x3002675, 0x3002678, 0x3001085, 0x300267B, 0x300267E, 0x3000FEF, 0x3000FF5, 0x3000FFB, 0x3001001, 0x3001007, 0x300100D, 0x3001013, 0x3001019, 0x300101F, 0x3001025, 0x300102B,
+	0x3001031, 0x3001037, 0x300103D, 0x3001043, 0x3002681, 0x3002684, 0x3002687, 0x300268A, 0x300268D, 0x3001049, 0x3001055, 0x3001061, 0x300106D, 0x3001079, 0x3002690, 0x3002693,
+	0x3002696, 0x3002699, 0x300269C, 0x300269F, 0x30026A2, 0x30026A5, 0x30026A8, 0x30026AB, 0x30026AE, 0x30026B1, 0x30026B4, 0x300108B, 0x3001091, 0x3001097, 0x300109D, 0x0,
+	0xF0026B7, 0xC0026C6, 0xF0026D2, 0x90026E1, 0xF0026EA, 0x90026F9, 0x9002702, 0x1200270B, 0xC00271D, 0x9002729, 0x9002732, 0x900273B, 0xC002744, 0xC002750, 0xC00275C, 0xC002768,
+	0xC002774, 0xC002780, 0xC00278C, 0x12002798, 0x60027AA, 0x120027B0, 0x120027C2, 0xF0027D4, 0xC0027B6, 0x120027E3, 0x120027F5, 0xC002807, 0x9002813, 0x900281C, 0xC002825, 0xC002831,
+	0xF00283D, 0xF00284C, 0x900285B, 0x9002864, 0xC00286D, 0x9002879, 0x9002882, 0x60027EF, 0x600288B, 0x9002891, 0x900289A, 0x120028A3, 0xC0028B5, 0xF0028C1, 0x120028D0, 0xC0028E2,
+	0x90028EE, 0x90028F7, 0x12002900, 0xC002912, 0x1200291E, 0x9002930, 0xF002939, 0x9002948, 0xC002951, 0x900295D, 0xC002966, 0xF002972, 0xC002981, 0xF00298D, 0xC00299C, 0x60029A8,
+	0xF0029AE, 0x90029BD, 0x90029C6, 0xC0029CF, 0x90029DB, 0x90029E4, 0x90029ED, 0xF0029F6, 0xC002A05, 0x6002A11, 0x12002A17, 0x9002A29, 0xF002A32, 0xC0027C8, 0xC002A41, 0x9002A4D,
+	0x9002A56, 0xC002A5F, 0x6002A6B, 0xC002A71, 0xF002A7D, 0x6002A8C, 0x12002A92, 0x90027DA, 0x4002AA4, 0x4002AA8, 0x4002AAC, 0x4002AB0, 0x4002AB4, 0x4002AB8, 0x4002ABC, 0x4002AC0,
+	0x4002AC4, 0x4002AC8, 0x5002ACC, 0x5002AD1, 0x5002AD6, 0x5002ADB, 0x5002AE0, 0x5002AE5, 0x5002AEA, 0x5002AEF, 0x5002AF4, 0x5002AF9, 0x5002AFE, 0x5002B03, 0x5002B08, 0x5002B0D,
+	0x5002B12, 0x3002B17, 0x2002B1A, 0x2002B1C, 0x3002B1E, 0x2002B21, 0x2002B23, 0x2002B25, 0x3002B27, 0x3002B2A, 0x2002B2D, 0x6002B2F, 0x6002B35, 0x6002B3B, 0x6002B41, 0xC002B47,
+	0x2002B53, 0x2002B55, 0x3002B57, 0x2002B5A, 0x2002B5C, 0x2002B5E, 0x2002B60, 0x2002B62, 0x3002B64, 0x4002B67, 0x2002B6B, 0x2002B6D, 0x3002B6F, 0x3002B72, 0x2002B75, 0x2002B77,
+	0x2002B79, 0x3002B7B, 0x3002B7E, 0x3002B81, 0x3002B84, 0x3002B87, 0x2002B8A, 0x2002B8C, 0x2002B8E, 0x2002B90, 0x2002B92, 0x3002B94, 0x2002B97, 0x2002B99, 0x2002B9B, 0x3002B9D,
+	0x3002BA0, 0x2002B28, 0x3002BA3, 0x3002BA6, 0x3002BA9, 0x2002B2B, 0x3002BAC, 0x5002BAF, 0x6002BB4, 0x2002B18, 0x3002BBA, 0x3002BBD, 0x3002BC0, 0x3002BC3, 0x7002BC6, 0x8002BCD,
+	0x2002BD5, 0x2002BD7, 0x3002BD9, 0x2002BDC, 0x2002BDE, 0x2002BE0, 0x3002BE2, 0x2002BE5, 0x2002BE7, 0x2002BE9, 0x2002BEB, 0x2002BED, 0x3002BEF, 0x2002BF2, 0x2002BF4, 0x2002BF6,
+	0x3002BF8, 0x3002BFB, 0x4002BFE, 0x2002C02, 0x2002C04, 0x2002B24, 0x6002C06, 0x3002C0C, 0x2002C0F, 0x2002C11, 0x2002C13, 0x2002C15, 0x2002C17, 0x2002C19, 0x2002C1B, 0x2002C1D,
+	0x2002B89, 0x2002C1F, 0x3002C21, 0x2002C24, 0x2002C26, 0x3002C28, 0x3002C2B, 0x2002C2E, 0x4002C30, 0x3002C34, 0x2002C37, 0x2002BCC, 0x2002C39, 0x2002C3B, 0x5002C3D, 0x5002C42,
+	0x4002C47, 0x4002C4B, 0x4002C4F, 0x4002C53, 0x4002C57, 0x4002C5B, 0x4002C5F, 0x4002C63, 0x4002C67, 0x5002C6B, 0x5002C70, 0x5002C75, 0x5002C7A, 0x5002C7F, 0x5002C84, 0x5002C89,
+	0x5002C8E, 0x5002C93, 0x5002C98, 0x5002C9D, 0x5002CA2, 0x5002CA7, 0x5002CAC, 0x5002CB1, 0x5002CB6, 0x5002CBB, 0x5002CC0, 0x5002CC5, 0x5002CCA, 0x5002CCF, 0x5002CD4, 0x3002CD9,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2002CDC, 0x2002CDE, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3002CE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2002CE3, 0x2002CE5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3002CE7, 0x3002CEA, 0x2002CED, 0x3002CEF,
+	0x30010A9, 0x30010AC, 0x30010AF, 0x30010B2, 0x30010B5, 0x30010B8, 0x30010BB, 0x30010BE, 0x30010BE, 0x30010C1, 0x30010C4, 0x30010C7, 0x30010CA, 0x30010CD, 0x30010D0, 0x30010D3,
+	0x30010D6, 0x30010D9, 0x30010DC, 0x30010DF, 0x30010E2, 0x30010E5, 0x30010E8, 0x30010EB, 0x30010EE, 0x30010F1, 0x30010F4, 0x30010F7, 0x30010FA, 0x30010FD, 0x3001100, 0x3001103,
+	0x3001106, 0x3001109, 0x300110C, 0x300110F, 0x3001112, 0x3001115, 0x3001118, 0x300111B, 0x300111E, 0x3001121, 0x3001124, 0x3001127, 0x300112A, 0x300112D, 0x3001130, 0x3001133,
+	0x3001136, 0x3001139, 0x300113C, 0x300113F, 0x3001142, 0x3001145, 0x3001148, 0x300114B, 0x300114E, 0x3001151, 0x3001154, 0x3001157, 0x300115A, 0x300115D, 0x3001160, 0x3001163,
+	0x3001166, 0x3001169, 0x300116C, 0x300116F, 0x3001172, 0x3001175, 0x3001178, 0x300117B, 0x300117E, 0x3001181, 0x3001184, 0x3001187, 0x300118A, 0x300118D, 0x3001190, 0x3001193,
+	0x3001196, 0x3001199, 0x300119C, 0x300119F, 0x30011A2, 0x30011A5, 0x30011A8, 0x30011AB, 0x30011AE, 0x30011B1, 0x30011B4, 0x30011B7, 0x30010E2, 0x30011BA, 0x30011BD, 0x30011C0,
+	0x30011C3, 0x30011C6, 0x30011C9, 0x30011CC, 0x30011CF, 0x30011D2, 0x30011D5, 0x30011D8, 0x30011DB, 0x30011DE, 0x30011E1, 0x30011E4, 0x30011E7, 0x30011EA, 0x30011ED, 0x30011F0,
+	0x30011F3, 0x30011F6, 0x30011F9, 0x30011FC, 0x30011FF, 0x3001202, 0x3001205, 0x3001208, 0x300120B, 0x300120E, 0x3001211, 0x3001214, 0x3001217, 0x300121A, 0x300121D, 0x3001220,
+	0x3001223, 0x3001226, 0x3001229, 0x300122C, 0x300122F, 0x3001232, 0x3001235, 0x3001238, 0x300123B, 0x300123E, 0x3001241, 0x3001244, 0x3001247, 0x300124A, 0x300124D, 0x3001250,
+	0x3001253, 0x3001256, 0x3001259, 0x300125C, 0x300125F, 0x3001262, 0x3001265, 0x3001268, 0x300126B, 0x300126E, 0x3001271, 0x3001274, 0x3001277, 0x300127A, 0x300127D, 0x3001280,
+	0x3001283, 0x30011F0, 0x3001286, 0x3001289, 0x300128C, 0x300128F, 0x3001292, 0x3001295, 0x3001298, 0x300129B, 0x30011C0, 0x300129E, 0x30012A1, 0x30012A4, 0x30012A7, 0x30012AA,
+	0x30012AD, 0x30012B0, 0x30012B3, 0x30012B6, 0x30012B9, 0x30012BC, 0x30012BF, 0x30012C2, 0x30012C5, 0x30012C8, 0x30012CB, 0x30012CE, 0x30012D1, 0x30012D4, 0x30012D7, 0x30010E2,
+	0x30012DA, 0x30012DD, 0x30012E0, 0x30012E3, 0x30012E6, 0x30012E9, 0x30012EC, 0x30012EF, 0x30012F2, 0x30012F5, 0x30012F8, 0x30012FB, 0x30012FE, 0x3001301, 0x3001304, 0x3001307,
+	0x300130A, 0x300130D, 0x3001310, 0x3001313, 0x3001316, 0x3001319, 0x300131C, 0x300131F, 0x3001322, 0x3001325, 0x3001328, 0x30011C6, 0x300132B, 0x300132E, 0x3001331, 0x3001334,
+	0x3001337, 0x300133A, 0x300133D, 0x3001340, 0x3001343, 0x3001346, 0x3001349, 0x300134C, 0x300134F, 0x3001352, 0x3001355, 0x3001358, 0x300135B, 0x300135E, 0x3001361, 0x3001364,
+	0x3001367, 0x300136A, 0x300136D, 0x3001370, 0x3001373, 0x3001376, 0x3001379, 0x300137C, 0x300137F, 0x3001382, 0x3001385, 0x3001388, 0x300138B, 0x300138E, 0x3001391, 0x3001394,
+	0x3001397, 0x300139A, 0x300139D, 0x30013A0, 0x30013A3, 0x30013A6, 0x30013A9, 0x30013AC, 0x30013AF, 0x30013B2, 0x30013B5, 0x30013B8, 0x30013BB, 0x30013BE, 0x0, 0x0,
+	0x30013C1, 0x0, 0x30013C4, 0x0, 0x0, 0x30013C7, 0x30013CA, 0x30013CD, 0x30013D0, 0x30013D3, 0x30013D6, 0x30013D9, 0x30013DC, 0x30013DF, 0x30013E2, 0x0,
+	0x30013E5, 0x0, 0x30013E8, 0x0, 0x0, 0x30013EB, 0x30013EE, 0x0, 0x0, 0x0, 0x30013F1, 0x30013F4, 0x30013F7, 0x30013FA, 0x30013FD, 0x3001400,
+	0x3001403, 0x3001406, 0x3001409, 0x300140C, 0x300140F, 0x3001412, 0x3001415, 0x3001418, 0x300141B, 0x300141E, 0x3001421, 0x3001424, 0x3001427, 0x300142A, 0x300142D, 0x3001430,
+	0x3001433, 0x3001436, 0x3001439, 0x300143C, 0x300143F, 0x3001442, 0x3001445, 0x3001448, 0x300144B, 0x300144E, 0x3001451, 0x3001454, 0x3001457, 0x300145A, 0x300145D, 0x3001460,
+	0x3001463, 0x3001466, 0x3001469, 0x300146C, 0x300146F, 0x3001472, 0x3001475, 0x3001265, 0x3001478, 0x300147B, 0x300147E, 0x3001481, 0x3001484, 0x3001487, 0x3001487, 0x300148A,
+	0x300148D, 0x3001490, 0x3001493, 0x3001496, 0x3001499, 0x300149C, 0x300149F, 0x30013EB, 0x30014A2, 0x30014A5, 0x30014A8, 0x30014AB, 0x40014AE, 0x30014B2, 0x0, 0x0,
+	0x30014B5, 0x30014B8, 0x30014BB, 0x30014BE, 0x30014C1, 0x30014C4, 0x30014C7, 0x30014CA, 0x3001415, 0x30014CD, 0x30014D0, 0x30014D3, 0x30013C1, 0x30014D6, 0x30014D9, 0x30014DC,
+	0x30014DF, 0x30014E2, 0x30014E5, 0x30014E8, 0x30014EB, 0x30014EE, 0x30014F1, 0x30014F4, 0x30014F7, 0x3001430, 0x30014FA, 0x3001433, 0x30014FD, 0x3001500, 0x3001503, 0x3001506,
+	0x3001509, 0x30013C4, 0x3001121, 0x300150C, 0x300150F, 0x3001512, 0x30011F3, 0x30012F8, 0x3001515, 0x3001518, 0x3001448, 0x300151B, 0x300144B, 0x300151E, 0x3001521, 0x3001524,
+	0x30013CA, 0x3001527, 0x300152A, 0x300152D, 0x3001530, 0x3001533, 0x30013CD, 0x3001536, 0x3001539, 0x300153C, 0x300153F, 0x3001542, 0x3001545, 0x3001475, 0x3001548, 0x300154B,
+	0x3001265, 0x300154E, 0x3001481, 0x3001551, 0x3001554, 0x3001557, 0x300155A, 0x300155D, 0x3001490, 0x3001560, 0x30013E8, 0x3001563, 0x3001493, 0x30011BA, 0x3001566, 0x3001496,
+	0x3001569, 0x300149C, 0x300156C, 0x300156F, 0x3001572, 0x3001575, 0x3001578, 0x30014A2, 0x30013DC, 0x300157B, 0x30014A5, 0x300157E, 0x30014A8, 0x3001581, 0x30010BE, 0x4001584,
+	0x4001588, 0x400158C, 0x3001590, 0x3001593, 0x3001596, 0x4001599, 0x400159D, 0x40015A1, 0x30015A5, 0x30015A8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2002CF2, 0x2002CF4, 0x2002CF6, 0x3002CF8, 0x3002CFB, 0x2002CFE, 0x2002CFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x4002D00, 0x4002D04, 0x4002D08, 0x4002D0C, 0x4002D10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40015AB, 0x0, 0x40015AF,
+	0x2002D14, 0x20015C7, 0x20015DB, 0x20015DF, 0x20015F7, 0x20015FB, 0x2002D16, 0x200161B, 0x200161F, 0x1001EDC, 0x40015B3, 0x40015B7, 0x60015BB, 0x60015C1, 0x40015C7, 0x40015CB,
+	0x40015CF, 0x40015D3, 0x40015D7, 0x40015DB, 0x40015DF, 0x40015E3, 0x40015E7, 0x0, 0x40015EB, 0x40015EF, 0x40015F3, 0x40015F7, 0x40015FB, 0x0, 0x40015FF, 0x0,
+	0x4001603, 0x4001607, 0x0, 0x400160B, 0x400160F, 0x0, 0x4001613, 0x4001617, 0x400161B, 0x40015BB, 0x400161F, 0x4001623, 0x4001627, 0x400162B, 0x400162F, 0x4002D18,
+	0x2002D1C, 0x2002D1C, 0x2002D1E, 0x2002D1E, 0x2002D1E, 0x2002D1E, 0x2002D20, 0x2002D20, 0x2002D20, 0x2002D20, 0x2002D22, 0x2002D22, 0x2002D22, 0x2002D22, 0x2002D24, 0x2002D24,
+	0x2002D24, 0x2002D24, 0x2002D26, 0x2002D26, 0x2002D26, 0x2002D26, 0x2002D28, 0x2002D28, 0x2002D28, 0x2002D28, 0x2002D2A, 0x2002D2A, 0x2002D2A, 0x2002D2A, 0x2002D2C, 0x2002D2C,
+	0x2002D2C, 0x2002D2C, 0x2002D2E, 0x2002D2E, 0x2002D2E, 0x2002D2E, 0x2002D30, 0x2002D30, 0x2002D30, 0x2002D30, 0x2002D32, 0x2002D32, 0x2002D32, 0x2002D32, 0x2002D34, 0x2002D34,
+	0x2002D34, 0x2002D34, 0x2002D36, 0x2002D36, 0x2002D38, 0x2002D38, 0x2002D3A, 0x2002D3A, 0x2002D3C, 0x2002D3C, 0x2002D3E, 0x2002D3E, 0x2002D40, 0x2002D40, 0x2002D42, 0x2002D42,
+	0x2002D42, 0x2002D42, 0x2002D44, 0x2002D44, 0x2002D44, 0x2002D44, 0x2002D46, 0x2002D46, 0x2002D46, 0x2002D46, 0x2002D48, 0x2002D48, 0x2002D48, 0x2002D48, 0x2002D4A, 0x2002D4A,
+	0x2002D4C, 0x2002D4C, 0x2002D4C, 0x2002D4C, 0x4000465, 0x4000465, 0x2000469, 0x2000469, 0x2000469, 0x2000469, 0x2002D4E, 0x2002D4E, 0x2002D4E, 0x2002D4E, 0x200046D, 0x200046D,
+	0x400046D, 0x400046D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x2002D50, 0x2002D50, 0x2002D50, 0x2002D50, 0x2001DA5, 0x2001DA5, 0x2002D52, 0x2002D52, 0x2002D54, 0x2002D54, 0x4001DA5, 0x2002D56, 0x2002D56,
+	0x2002D58, 0x2002D58, 0x2002D5A, 0x2002D5A, 0x2002D5C, 0x2002D5C, 0x2002D5C, 0x2002D5C, 0x2002D5E, 0x2002D5E, 0x6002D60, 0x6002D60, 0x6000461, 0x6000461, 0x6002D66, 0x6002D66,
+	0x6002D6C, 0x6002D6C, 0x6002D72, 0x6002D72, 0x6002D78, 0x6002D78, 0x6002D7E, 0x6002D7E, 0x6002D7E, 0x6002D84, 0x6002D84, 0x6002D84, 0x2002D8A, 0x2002D8A, 0x2002D8A, 0x2002D8A,
+	0x6002D8C, 0x6002D92, 0x6002D98, 0x6002D84, 0x6002D9E, 0x4002DA4, 0x4002DA8, 0x4002DAC, 0x4002DB0, 0x4002DB4, 0x4002DB8, 0x4002DBC, 0x4002DC0, 0x4002DC4, 0x4002DC8, 0x4002DCC,
+	0x4002DD0, 0x4002DD4, 0x4002DD8, 0x4002DDC, 0x4002DE0, 0x4002DE4, 0x4002DE8, 0x4002DE6, 0x4002DEC, 0x4002DF0, 0x4002DF4, 0x4002DF8, 0x4002DFC, 0x4002E00, 0x4002E04, 0x4002E08,
+	0x4002E0C, 0x4002E10, 0x4002E14, 0x4002E18, 0x4002E1C, 0x4002E20, 0x4002E24, 0x4002E28, 0x4002E2C, 0x4002E30, 0x4002E34, 0x4002E38, 0x4002E3C, 0x4002E40, 0x4002E44, 0x4002E48,
+	0x4002E4C, 0x4002E50, 0x4002E54, 0x4002E58, 0x4002E5C, 0x4002E60, 0x4002E64, 0x4002E68, 0x4002E6C, 0x4002E70, 0x4002E74, 0x4002E78, 0x4002E7C, 0x4002E80, 0x4002E84, 0x4002E88,
+	0x4002E8C, 0x4002E90, 0x4002E94, 0x4002E98, 0x4002E9C, 0x4002EA0, 0x4002DEA, 0x4002DEE, 0x4002EA4, 0x4002EA8, 0x4002D9C, 0x4002EAC, 0x4002EB0, 0x4002EB4, 0x4002EB8, 0x4002EBC,
+	0x4002EC0, 0x4002EC4, 0x4002EC8, 0x4002ECC, 0x4002ED0, 0x4002DE2, 0x4002ED4, 0x4002ED8, 0x4002E9E, 0x4002EDC, 0x4002ED2, 0x4002EE0, 0x4002EE4, 0x4002EE8, 0x5002EEC, 0x5002EF1,
+	0x5002EF6, 0x5002EFB, 0x5002F00, 0x5002F05, 0x6002F0A, 0x6002F10, 0x6002D98, 0x6002F16, 0x6002D84, 0x6002D9E, 0x4002F1C, 0x4002F20, 0x4002DB0, 0x4002F24, 0x4002DB4, 0x4002DB8,
+	0x4002F28, 0x4002F2C, 0x4002DC8, 0x4002F30, 0x4002DCC, 0x4002DD0, 0x4002F34, 0x4002F38, 0x4002DD8, 0x4002F3C, 0x4002DDC, 0x4002DE0, 0x4002E50, 0x4002E54, 0x4002E60, 0x4002E64,
+	0x4002E68, 0x4002E78, 0x4002E7C, 0x4002E80, 0x4002E84, 0x4002E94, 0x4002E98, 0x4002E9C, 0x4002F40, 0x4002EA4, 0x4002F44, 0x4002F48, 0x4002EB8, 0x4002F4C, 0x4002EBC, 0x4002EC0,
+	0x4002EE8, 0x4002F50, 0x4002F54, 0x4002E9E, 0x4002F58, 0x4002EDC, 0x4002ED2, 0x6002D8C, 0x6002D92, 0x6002F5C, 0x6002D98, 0x6002F62, 0x4002DA4, 0x4002DA8, 0x4002DAC, 0x4002DB0,
+	0x4002F68, 0x4002DBC, 0x4002DC0, 0x4002DC4, 0x4002DC8, 0x4002F6C, 0x4002DD8, 0x4002DE4, 0x4002DE8, 0x4002DE6, 0x4002DEC, 0x4002DF0, 0x4002DF8, 0x4002DFC, 0x4002E00, 0x4002E04,
+	0x4002E08, 0x4002E0C, 0x4002F70, 0x4002E10, 0x4002E14, 0x4002E18, 0x4002E1C, 0x4002E20, 0x4002E24, 0x4002E2C, 0x4002E30, 0x4002E34, 0x4002E38, 0x4002E3C, 0x4002E40, 0x4002E44,
+	0x4002E48, 0x4002E4C, 0x4002E58, 0x4002E5C, 0x4002E6C, 0x4002E70, 0x4002E74, 0x4002E78, 0x4002E7C, 0x4002E88, 0x4002E8C, 0x4002E90, 0x4002E94, 0x4002F74, 0x4002EA0, 0x4002DEA,
+	0x4002DEE, 0x4002EA4, 0x4002EAC, 0x4002EB0, 0x4002EB4, 0x4002EB8, 0x4002F78, 0x4002EC4, 0x4002EC8, 0x4002F7C, 0x4002DE2, 0x4002F80, 0x4002ED8, 0x4002E9E, 0x4002EC2, 0x6002D98,
+	0x6002F62, 0x4002DB0, 0x4002F68, 0x4002DC8, 0x4002F6C, 0x4002DD8, 0x4002F84, 0x4002E08, 0x4002F88, 0x4002F8C, 0x4002F90, 0x4002E78, 0x4002E7C, 0x4002E94, 0x4002EB8, 0x4002F78,
+	0x4002E9E, 0x4002EC2, 0x6002F94, 0x6002F9A, 0x6002FA0, 0x4002FA6, 0x4002FAA, 0x4002FAE, 0x4002FB2, 0x4002FB6, 0x4002FBA, 0x4002FBE, 0x4002FC2, 0x4002FC6, 0x4002FCA, 0x4002FCE,
+	0x4002D96, 0x4002FD2, 0x4002D90, 0x4002FD6, 0x4002EDA, 0x4002FDA, 0x4002FDE, 0x4002FE2, 0x4002FE6, 0x4002FEA, 0x4002FEE, 0x4002FF2, 0x4002F8C, 0x4002FF6, 0x4002FFA, 0x4002FFE,
+	0x4003002, 0x4002FA6, 0x4002FAA, 0x4002FAE, 0x4002FB2, 0x4002FB6, 0x4002FBA, 0x4002FBE, 0x4002FC2, 0x4002FC6, 0x4002FCA, 0x4002FCE, 0x4002D96, 0x4002FD2, 0x4002D90, 0x4002FD6,
+	0x4002EDA, 0x4002FDA, 0x4002FDE, 0x4002FE2, 0x4002FE6, 0x4002FEA, 0x4002FEE, 0x4002FF2, 0x4002F8C, 0x4002FF6, 0x4002FFA, 0x4002FFE, 0x4003002, 0x4002FEA, 0x4002FEE, 0x4002FF2,
+	0x4002F8C, 0x4002F88, 0x4002F90, 0x4002E28, 0x4002DFC, 0x4002E00, 0x4002E04, 0x4002FEA, 0x4002FEE, 0x4002FF2, 0x4002E28, 0x4002E2C, 0x4003006, 0x4003006, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x600300A, 0x6003010, 0x6003010, 0x6003016, 0x600301C, 0x6003022, 0x6003028, 0x600302E, 0x6002DE8, 0x6002DE8, 0x6003034, 0x600303A, 0x6003040, 0x6003046, 0x600304C, 0x6003052,
+	0x6003052, 0x6003058, 0x600305E, 0x600305E, 0x6003064, 0x6003064, 0x600306A, 0x6003070, 0x6003070, 0x6003076, 0x600307C, 0x600307C, 0x6003082, 0x6003082, 0x6003088, 0x600308E,
+	0x600308E, 0x6003094, 0x6003094, 0x600309A, 0x60030A0, 0x60030A6, 0x60030AC, 0x60030AC, 0x60030B2, 0x60030B8, 0x60030BE, 0x60030C4, 0x60030CA, 0x60030CA, 0x60030D0, 0x60030D6,
+	0x60030DC, 0x60030E2, 0x60030E8, 0x60030EE, 0x60030EE, 0x60030F4, 0x60030F4, 0x60030FA, 0x60030FA, 0x6003100, 0x6002DEA, 0x6003106, 0x600310C, 0x6002EA0, 0x6002DEE, 0x6003112,
+	0x0, 0x0, 0x6003118, 0x600311E, 0x6003124, 0x600312A, 0x6003130, 0x6003136, 0x6003136, 0x600313C, 0x6003142, 0x6003148, 0x600314E, 0x600314E, 0x6003154, 0x600315A,
+	0x6003160, 0x6003166, 0x600316C, 0x6003172, 0x6003178, 0x600317E, 0x6003184, 0x600318A, 0x6003190, 0x6003196, 0x600319C, 0x60031A2, 0x60031A8, 0x60031AE, 0x60031B4, 0x60031BA,
+	0x60031C0, 0x60031C6, 0x60031CC, 0x60031D2, 0x60030D0, 0x60030DC, 0x60031D8, 0x60031DE, 0x60031E4, 0x60031EA, 0x60031F0, 0x60031F6, 0x60031F0, 0x60031E4, 0x60031FC, 0x6003202,
+	0x6003208, 0x600320E, 0x6003214, 0x60031F6, 0x60030A6, 0x600306A, 0x600321A, 0x6003220, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6003226, 0x600322C, 0x8003232, 0x800323A, 0x8003242, 0x800324A, 0x8003252, 0x800325A, 0x8003262, 0x600326A, 0x21003270, 0xF003291, 0x80032A0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x10032A8, 0x30032A9, 0x30032AC, 0x1002085, 0x1000326, 0x1001ECB, 0x1001ED0, 0x30032AF, 0x30032B2, 0x3001EAA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2001EAA, 0x30032B5, 0x30032B8, 0x10032BB, 0x10032BB, 0x1001EE0, 0x1001EE1, 0x10032BC, 0x10032BD, 0x30032BE, 0x30032C1, 0x30032C4, 0x30032C7, 0x30032CA, 0x30032CD, 0x3000F42,
+	0x3000F45, 0x30032D0, 0x30032D3, 0x30032D6, 0x30032D9, 0x0, 0x0, 0x10032DC, 0x10032DD, 0x3001ECD, 0x3001ECD, 0x3001ECD, 0x3001ECD, 0x10032BB, 0x10032BB, 0x10032BB,
+	0x10032A8, 0x30032A9, 0x1001EAA, 0x0, 0x1000326, 0x1002085, 0x1001ED0, 0x1001ECB, 0x30032B5, 0x1001EE0, 0x1001EE1, 0x10032BC, 0x10032BD, 0x30032BE, 0x30032C1, 0x10032DE,
+	0x10032DF, 0x10032E0, 0x1001EDC, 0x10032E1, 0x1000EC4, 0x1000EC7, 0x1000EB7, 0x0, 0x10032E2, 0x10032E3, 0x10032E4, 0x10032E5, 0x0, 0x0, 0x0, 0x0,
+	0x30032E6, 0x40032E9, 0x3002EEC, 0x0, 0x3002EF1, 0x0, 0x3002EF6, 0x4002F94, 0x3002EFB, 0x4002F9A, 0x3002F00, 0x4002FA0, 0x3002F05, 0x40032ED, 0x30032F1, 0x40032F4,
+	0x20032F8, 0x4000451, 0x4000451, 0x4000455, 0x4000455, 0x4000459, 0x4000459, 0x400045D, 0x400045D, 0x4000461, 0x4000461, 0x4000461, 0x4000461, 0x2000451, 0x2000451, 0x2002DA4,
+	0x2002DA4, 0x2002DA4, 0x2002DA4, 0x20032FA, 0x20032FA, 0x2002DBC, 0x2002DBC, 0x2002DBC, 0x2002DBC, 0x2002DD4, 0x2002DD4, 0x2002DD4, 0x2002DD4, 0x2002D90, 0x2002D90, 0x2002D90,
+	0x2002D90, 0x2002D96, 0x2002D96, 0x2002D96, 0x2002D96, 0x2002DAE, 0x2002DAE, 0x2002DAE, 0x2002DAE, 0x2003248, 0x2003248, 0x2002EE0, 0x2002EE0, 0x2002EE4, 0x2002EE4, 0x2002F14,
+	0x2002F14, 0x2002DFC, 0x2002DFC, 0x2002DFC, 0x2002DFC, 0x2002F8C, 0x2002F8C, 0x2002F8C, 0x2002F8C, 0x2002E0C, 0x2002E0C, 0x2002E0C, 0x2002E0C, 0x2002E14, 0x2002E14, 0x2002E14,
+	0x2002E14, 0x2002E24, 0x2002E24, 0x2002E24, 0x2002E24, 0x2002E2C, 0x2002E2C, 0x2002E2C, 0x2002E2C, 0x2002E30, 0x2002E30, 0x2002E30, 0x2002E30, 0x2002E38, 0x2002E38, 0x2002E38,
+	0x2002E38, 0x2002E40, 0x2002E40, 0x2002E40, 0x2002E40, 0x2002E58, 0x2002E58, 0x2002E58, 0x2002E58, 0x2002E68, 0x2002E68, 0x2002E68, 0x2002E68, 0x2002E7A, 0x2002E7A, 0x2002E7A,
+	0x2002E7A, 0x2002D9C, 0x2002D9C, 0x2002D9C, 0x2002D9C, 0x2002EAC, 0x2002EAC, 0x2002EAC, 0x2002EAC, 0x2002EC4, 0x2002EC4, 0x2002EC4, 0x2002EC4, 0x2000459, 0x2000459, 0x2002D5E,
+	0x2002D5E, 0x2000461, 0x2000461, 0x2000461, 0x2000461, 0x60032FC, 0x60032FC, 0x6003302, 0x6003302, 0x6003308, 0x6003308, 0x4003298, 0x4003298, 0x0, 0x0, 0x0,
+	0x0, 0x1001ECB, 0x100330E, 0x10032DE, 0x10032E3, 0x10032E4, 0x10032DF, 0x100330F, 0x1001EE0, 0x1001EE1, 0x10032E0, 0x1001EDC, 0x10032A8, 0x10032E1, 0x1001EAA, 0x1001EE5,
+	0x1001ED6, 0x1001D2E, 0x1001D24, 0x1001D25, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB, 0x1002085, 0x1000326, 0x1000EC4, 0x1000EB7, 0x1000EC7, 0x1001ED0,
+	0x10032E5, 0x1000000, 0x1000633, 0x1000012, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x1000105, 0x1000021, 0x1000126, 0x100012C, 0x1000132, 0x10006FF, 0x100002D, 0x1000030,
+	0x1000751, 0x1001EFC, 0x1000168, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x10001D1, 0x10032DC, 0x10032E2, 0x10032DD, 0x1003310, 0x10032BB,
+	0x1000E3D, 0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x100007E,
+	0x1000754, 0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x10032BC, 0x1003311, 0x10032BD, 0x1003312, 0x3003313,
+	0x3003316, 0x30032AC, 0x30032D0, 0x30032D3, 0x30032A9, 0x3003319, 0x300109D, 0x30026CF, 0x3002915, 0x300331C, 0x300292A, 0x3002705, 0x300331F, 0x300278F, 0x30029FF, 0x300274A,
+	0x30026C0, 0x3002675, 0x3002678, 0x3001085, 0x300267B, 0x300267E, 0x3000FEF, 0x3000FF5, 0x3000FFB, 0x3001001, 0x3001007, 0x300100D, 0x3001013, 0x3001019, 0x300101F, 0x3001025,
+	0x300102B, 0x3001031, 0x3001037, 0x300103D, 0x3001043, 0x3002681, 0x3002684, 0x3002687, 0x300268A, 0x300268D, 0x3001049, 0x3001055, 0x3001061, 0x300106D, 0x3001079, 0x3002690,
+	0x3002693, 0x3002696, 0x3002699, 0x300269C, 0x300269F, 0x30026A2, 0x30026A5, 0x30026A8, 0x30026AB, 0x30026AE, 0x30026B1, 0x30026B4, 0x300108B, 0x30026D5, 0x3000F50, 0x3000FB0,
+	0x3002383, 0x30022EA, 0x30022ED, 0x30022F0, 0x30022F3, 0x30022F6, 0x30022F9, 0x30022FC, 0x30022FF, 0x3002302, 0x3002305, 0x3002308, 0x300230B, 0x300230E, 0x3002311, 0x3002314,
+	0x3002317, 0x300231A, 0x300231D, 0x3002320, 0x3002323, 0x3002326, 0x3002329, 0x300232C, 0x300232F, 0x3002332, 0x3002335, 0x3002338, 0x300233B, 0x300233E, 0x3002341, 0x0,
+	0x0, 0x0, 0x3002344, 0x3002347, 0x300234A, 0x300234D, 0x3002350, 0x3002353, 0x0, 0x0, 0x3002356, 0x3002359, 0x300235C, 0x300235F, 0x3002362, 0x3002365,
+	0x0, 0x0, 0x3002368, 0x300236B, 0x300236E, 0x3002371, 0x3002374, 0x3002377, 0x0, 0x0, 0x300237A, 0x300237D, 0x3002380, 0x0, 0x0, 0x0,
+	0x2003322, 0x2003324, 0x2003326, 0x3001D21, 0x2003328, 0x200332A, 0x300332C, 0x0, 0x300332F, 0x3000E6C, 0x3003332, 0x3000E71, 0x3003335, 0x3003338, 0x300333B, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001633, 0x0, 0x800163B, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001643, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800164B, 0x8001653,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800165B, 0x8001663, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800166B, 0x8001673, 0x0, 0x800167B, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001683, 0x800168B, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8001693, 0x800169B,
+	0xC00333E, 0xC0016AF, 0xC0016BB, 0xC0016C7, 0xC0016D3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80016DF, 0x80016E7, 0xC0016EF, 0xC0016FB, 0xC001707,
+	0xC001713, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x100007E, 0x1000754, 0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4,
+	0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x1000000, 0x1000633, 0x1000012, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x1000105, 0x1000021, 0x1000126, 0x100012C, 0x1000132,
+	0x10006FF, 0x100002D, 0x1000030, 0x1000751, 0x1001EFC, 0x1000168, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x10001D1, 0x100004E, 0x1000636,
+	0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x0, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x100007E, 0x1000754, 0x1002068, 0x100016B,
+	0x100004B, 0x10001D1, 0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B,
+	0x100007E, 0x1000754, 0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x1000000, 0x0, 0x1000012, 0x10000C9,
+	0x0, 0x0, 0x10000ED, 0x0, 0x0, 0x1000126, 0x100012C, 0x0, 0x0, 0x100002D, 0x1000030, 0x1000751, 0x1001EFC, 0x0, 0x100017A, 0x1000192,
+	0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x10001D1, 0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x0, 0x100069A, 0x0, 0x1000108, 0x100006F, 0x1000129,
+	0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x0, 0x1000754, 0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4,
+	0x1000000, 0x1000633, 0x1000012, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x1000105, 0x1000021, 0x1000126, 0x100012C, 0x1000132, 0x10006FF, 0x100002D, 0x1000030, 0x1000751,
+	0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x1000000, 0x1000633, 0x0, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x0, 0x0, 0x1000126, 0x100012C, 0x1000132,
+	0x10006FF, 0x100002D, 0x1000030, 0x1000751, 0x1001EFC, 0x0, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x0, 0x100004E, 0x1000636,
+	0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x100007E, 0x1000754, 0x1002068, 0x100016B,
+	0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x1000000, 0x1000633, 0x0, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x0,
+	0x1000021, 0x1000126, 0x100012C, 0x1000132, 0x10006FF, 0x0, 0x1000030, 0x0, 0x0, 0x0, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B,
+	0x100004B, 0x0, 0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B,
+	0x100004B, 0x10001D1, 0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B,
+	0x100007E, 0x1000754, 0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x1000000, 0x1000633, 0x1000012, 0x10000C9,
+	0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x200334A, 0x200334C, 0x0, 0x0, 0x200032B, 0x200334E, 0x2001F07, 0x2003350, 0x2000331, 0x2003352, 0x2000335, 0x2001D95,
+	0x2000339, 0x2003354, 0x2003356, 0x2003358, 0x200335A, 0x200335C, 0x200033D, 0x2001F09, 0x2000E35, 0x2001D95, 0x2001D97, 0x200335E, 0x2000341, 0x2003360, 0x2003362, 0x2003364,
+	0x2000345, 0x3003366, 0x2000357, 0x2001D89, 0x2001E12, 0x2001E14, 0x200035B, 0x2003369, 0x200035F, 0x2001D8B, 0x2000349, 0x2001D91, 0x200336B, 0x2001D29, 0x200336D, 0x200336F,
+	0x200036D, 0x2001D8F, 0x2000E17, 0x2001D93, 0x2003371, 0x2003373, 0x2000367, 0x2001D8D, 0x2001E16, 0x2003375, 0x2000375, 0x3003377, 0x200035B, 0x2001D8B, 0x2001D91, 0x2001D8D,
+	0x2000E17, 0x2001D8F, 0x200032B, 0x200334E, 0x2001F07, 0x2003350, 0x2000331, 0x2003352, 0x2000335, 0x2001D95, 0x2000339, 0x2003354, 0x2003356, 0x2003358, 0x200335A, 0x200335C,
+	0x200033D, 0x2001F09, 0x2000E35, 0x2001D95, 0x2001D97, 0x200335E, 0x2000341, 0x2003360, 0x2003362, 0x2003364, 0x2000345, 0x3003366, 0x2000357, 0x2001D89, 0x2001E12, 0x2001E14,
+	0x2001E16, 0x2003375, 0x2000375, 0x3003377, 0x200035B, 0x2001D8B, 0x2001D91, 0x2001D8D, 0x2000E17, 0x2001D8F, 0x200337A, 0x200337C, 0x0, 0x0, 0x1001ED6, 0x1001D2E,
+	0x1001D24, 0x1001D25, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB, 0x1001ED6, 0x1001D2E, 0x1001D24, 0x1001D25, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9,
+	0x1001EDA, 0x1001EDB, 0x1001ED6, 0x1001D2E, 0x1001D24, 0x1001D25, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB, 0x1001ED6, 0x1001D2E, 0x1001D24, 0x1001D25,
+	0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB, 0x1001ED6, 0x1001D2E, 0x1001D24, 0x1001D25, 0x1001D33, 0x1001ED7, 0x1001ED8, 0x1001ED9, 0x1001EDA, 0x1001EDB,
+	0x2000451, 0x2002DA4, 0x2002D90, 0x2003248, 0x0, 0x2000459, 0x2002F14, 0x2002D96, 0x2002E24, 0x2000461, 0x2002E68, 0x2002E7A, 0x2002D9C, 0x2002EAC, 0x2002DFC, 0x2002E30,
+	0x2002E40, 0x2002E0C, 0x2002E58, 0x2002EE4, 0x2002F8C, 0x2002DBC, 0x2002DD4, 0x2002DAE, 0x2002EE0, 0x2002E14, 0x2002E2C, 0x2002E38, 0x200337E, 0x2002D4A, 0x2003380, 0x2003382,
+	0x0, 0x2002DA4, 0x2002D90, 0x0, 0x2002EC4, 0x0, 0x0, 0x2002D96, 0x0, 0x2000461, 0x2002E68, 0x2002E7A, 0x2002D9C, 0x2002EAC, 0x2002DFC, 0x2002E30,
+	0x2002E40, 0x2002E0C, 0x2002E58, 0x0, 0x2002F8C, 0x2002DBC, 0x2002DD4, 0x2002DAE, 0x0, 0x2002E14, 0x0, 0x2002E38, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x2002D90, 0x0, 0x0, 0x0, 0x0, 0x2002D96, 0x0, 0x2000461, 0x0, 0x2002E7A, 0x0, 0x2002EAC, 0x2002DFC, 0x2002E30,
+	0x0, 0x2002E0C, 0x2002E58, 0x0, 0x2002F8C, 0x0, 0x0, 0x2002DAE, 0x0, 0x2002E14, 0x0, 0x2002E38, 0x0, 0x2002D4A, 0x0, 0x2003382,
+	0x0, 0x2002DA4, 0x2002D90, 0x0, 0x2002EC4, 0x0, 0x0, 0x2002D96, 0x2002E24, 0x2000461, 0x2002E68, 0x0, 0x2002D9C, 0x2002EAC, 0x2002DFC, 0x2002E30,
+	0x2002E40, 0x2002E0C, 0x2002E58, 0x0, 0x2002F8C, 0x2002DBC, 0x2002DD4, 0x2002DAE, 0x0, 0x2002E14, 0x2002E2C, 0x2002E38, 0x200337E, 0x0, 0x2003380, 0x0,
+	0x2000451, 0x2002DA4, 0x2002D90, 0x2003248, 0x2002EC4, 0x2000459, 0x2002F14, 0x2002D96, 0x2002E24, 0x2000461, 0x0, 0x2002E7A, 0x2002D9C, 0x2002EAC, 0x2002DFC, 0x2002E30,
+	0x2002E40, 0x2002E0C, 0x2002E58, 0x2002EE4, 0x2002F8C, 0x2002DBC, 0x2002DD4, 0x2002DAE, 0x2002EE0, 0x2002E14, 0x2002E2C, 0x2002E38, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x2002DA4, 0x2002D90, 0x2003248, 0x0, 0x2000459, 0x2002F14, 0x2002D96, 0x2002E24, 0x2000461, 0x0, 0x2002E7A, 0x2002D9C, 0x2002EAC, 0x2002DFC, 0x2002E30,
+	0x2002E40, 0x2002E0C, 0x2002E58, 0x2002EE4, 0x2002F8C, 0x2002DBC, 0x2002DD4, 0x2002DAE, 0x2002EE0, 0x2002E14, 0x2002E2C, 0x2002E38, 0x0, 0x0, 0x0, 0x0,
+	0x2002017, 0x2003384, 0x2003386, 0x2003388, 0x200338A, 0x200338C, 0x200338E, 0x2003390, 0x2003392, 0x2003394, 0x2003396, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003398, 0x300339B, 0x300339E, 0x30033A1, 0x30033A4, 0x30033A7, 0x30033AA, 0x30033AD, 0x30033B0, 0x30033B3, 0x30033B6, 0x30033B9, 0x30033BC, 0x30033BF, 0x30033C2, 0x30033C5,
+	0x30033C8, 0x30033CB, 0x30033CE, 0x30033D1, 0x30033D4, 0x30033D7, 0x30033DA, 0x30033DD, 0x30033E0, 0x30033E3, 0x70033E6, 0x1000012, 0x1000168, 0x20033ED, 0x20033EF, 0x0,
+	0x1000000, 0x1000633, 0x1000012, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x1000105, 0x1000021, 0x1000126, 0x100012C, 0x1000132, 0x10006FF, 0x100002D, 0x1000030, 0x1000751,
+	0x1001EFC, 0x1000168, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x10001D1, 0x20033F1, 0x2002BE9, 0x20033F3, 0x20033F5, 0x30033F7, 0x20033FA,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20033FC, 0x20033FE, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2003400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6003402, 0x6003408, 0x300100D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300213E, 0x300340E, 0x3003411, 0x600103D, 0x30020A5, 0x300180E, 0x3003414, 0x300241C, 0x3003417, 0x300341A, 0x300341D, 0x30012D7, 0x3003420, 0x3003423, 0x3001758, 0x3003426,
+	0x3003429, 0x300342C, 0x30021A7, 0x300342F, 0x3003432, 0x3003435, 0x3003438, 0x300343B, 0x300343E, 0x3002093, 0x3002404, 0x3003441, 0x3002611, 0x300240D, 0x3002614, 0x3003444,
+	0x300223A, 0x3003447, 0x300344A, 0x300344D, 0x3003450, 0x3003453, 0x300255A, 0x300215C, 0x3003456, 0x300177E, 0x3003459, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x900345C, 0x9003465, 0x900346E, 0x9003477, 0x9003480, 0x9003489, 0x9003492, 0x900349B, 0x90034A4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30034AD, 0x30034B0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300171F, 0x3001722, 0x3001725, 0x4001728, 0x300172C, 0x3001403, 0x300172F, 0x3001732, 0x3001735, 0x3001738, 0x3001406, 0x300173B, 0x300173E, 0x4001741, 0x3001409, 0x3001745,
+	0x3001748, 0x300174B, 0x400174E, 0x3001752, 0x3001755, 0x3001758, 0x400175B, 0x300175F, 0x3001762, 0x3001765, 0x3001768, 0x30014B8, 0x400176B, 0x300176F, 0x3001772, 0x3001775,
+	0x3001778, 0x300177B, 0x300177E, 0x3001781, 0x3001784, 0x30014C7, 0x300140C, 0x300140F, 0x30014CA, 0x3001787, 0x300178A, 0x30011CC, 0x300178D, 0x3001412, 0x3001790, 0x3001793,
+	0x3001796, 0x3001799, 0x3001799, 0x3001799, 0x400179C, 0x30017A0, 0x30017A3, 0x30017A6, 0x40017A9, 0x30017AD, 0x30017B0, 0x30017B3, 0x30017B6, 0x30017B9, 0x30017BC, 0x30017BF,
+	0x30017C2, 0x30017C5, 0x30017C8, 0x30017CB, 0x30017CE, 0x30017D1, 0x30017D1, 0x30014D0, 0x30017D4, 0x30017D7, 0x30017DA, 0x30017DD, 0x3001418, 0x30017E0, 0x30017E3, 0x30017E6,
+	0x3001397, 0x30017E9, 0x30017EC, 0x30017EF, 0x30017F2, 0x30017F5, 0x30017F8, 0x30017FB, 0x30017FE, 0x4001801, 0x3001805, 0x3001808, 0x300180B, 0x300180E, 0x3001811, 0x3001814,
+	0x4001817, 0x400181B, 0x300181F, 0x3001822, 0x3001825, 0x3001828, 0x300182B, 0x300182E, 0x3001831, 0x3001834, 0x3001837, 0x3001837, 0x400183A, 0x300183E, 0x3001841, 0x30011C0,
+	0x3001844, 0x4001847, 0x300184B, 0x300184E, 0x3001851, 0x3001854, 0x3001857, 0x300185A, 0x3001427, 0x300185D, 0x3001860, 0x4001863, 0x3001867, 0x400186A, 0x300186E, 0x3001871,
+	0x3001874, 0x3001877, 0x300187A, 0x300187D, 0x3001880, 0x3001883, 0x3001886, 0x3001889, 0x300188C, 0x400188F, 0x3001893, 0x3001896, 0x3001899, 0x300189C, 0x300111E, 0x400189F,
+	0x30018A3, 0x40018A6, 0x40018A6, 0x30018AA, 0x30018AD, 0x30018AD, 0x30018B0, 0x40018B3, 0x40018B7, 0x30018BB, 0x30018BE, 0x30018C1, 0x30018C4, 0x30018C7, 0x30018CA, 0x30018CD,
+	0x30018D0, 0x30018D3, 0x30018D6, 0x300142A, 0x40018D9, 0x30018DD, 0x30018E0, 0x30018E3, 0x30014F4, 0x30018E3, 0x30018E6, 0x3001430, 0x30018E9, 0x30018EC, 0x30018EF, 0x30018F2,
+	0x3001433, 0x30010CD, 0x30018F5, 0x30018F8, 0x30018FB, 0x30018FE, 0x3001901, 0x3001904, 0x4001907, 0x300190B, 0x300190E, 0x3001911, 0x3001914, 0x3001917, 0x400191A, 0x300191E,
+	0x3001921, 0x3001924, 0x3001927, 0x300192A, 0x300192D, 0x3001930, 0x3001933, 0x3001936, 0x3001436, 0x3001939, 0x400193C, 0x3001940, 0x3001943, 0x3001946, 0x3001949, 0x300143C,
+	0x300194C, 0x300194F, 0x3001952, 0x3001955, 0x3001958, 0x300195B, 0x300195E, 0x3001961, 0x3001121, 0x300150C, 0x3001964, 0x3001967, 0x300196A, 0x400196D, 0x3001971, 0x3001974,
+	0x3001977, 0x300197A, 0x300143F, 0x400197D, 0x3001981, 0x3001984, 0x3001987, 0x3001590, 0x300198A, 0x300198D, 0x3001990, 0x3001993, 0x4001996, 0x300199A, 0x300199D, 0x30019A0,
+	0x40019A3, 0x30019A7, 0x30019AA, 0x30019AD, 0x30019B0, 0x30011F3, 0x30019B3, 0x40019B6, 0x40019BA, 0x40019BE, 0x30019C2, 0x40019C5, 0x30019C9, 0x30019CC, 0x30019CF, 0x30019D2,
+	0x30019D5, 0x3001442, 0x30012F8, 0x30019D8, 0x30019DB, 0x30019DE, 0x40019E1, 0x30019E5, 0x30019E8, 0x30019EB, 0x30019EE, 0x3001518, 0x30019F1, 0x40019F4, 0x30019F8, 0x30019FB,
+	0x40019FE, 0x4001A02, 0x3001A06, 0x3001A09, 0x300151B, 0x3001A0C, 0x3001A0F, 0x3001A12, 0x3001A15, 0x3001A18, 0x3001A1B, 0x4001A1E, 0x3001A22, 0x4001A25, 0x3001A29, 0x4001A2C,
+	0x3001A30, 0x3001521, 0x3001A33, 0x4001A36, 0x3001A3A, 0x3001A3D, 0x4001A40, 0x4001A44, 0x3001A48, 0x3001A4B, 0x3001A4E, 0x3001A51, 0x3001A54, 0x3001A54, 0x3001A57, 0x3001A5A,
+	0x3001527, 0x3001A5D, 0x3001A60, 0x3001A63, 0x3001A66, 0x4001A69, 0x3001A6D, 0x4001A70, 0x30011C9, 0x4001A74, 0x3001A78, 0x4001A7B, 0x4001A7F, 0x4001A83, 0x3001A87, 0x3001A8A,
+	0x3001539, 0x4001A8D, 0x4001A91, 0x4001A95, 0x4001A99, 0x3001A9D, 0x3001AA0, 0x3001AA0, 0x300153C, 0x3001596, 0x3001AA3, 0x3001AA6, 0x3001AA9, 0x4001AAC, 0x3001AB0, 0x3001157,
+	0x3001542, 0x3001AB3, 0x4001AB6, 0x3001463, 0x4001ABA, 0x4001ABE, 0x30013D9, 0x3001AC2, 0x3001AC5, 0x300146F, 0x3001AC8, 0x3001ACB, 0x4001ACE, 0x4001AD2, 0x4001AD2, 0x3001AD6,
+	0x3001AD9, 0x4001ADC, 0x3001AE0, 0x3001AE3, 0x3001AE6, 0x4001AE9, 0x3001AED, 0x3001AF0, 0x3001AF3, 0x3001AF6, 0x3001AF9, 0x4001AFC, 0x3001B00, 0x3001B03, 0x3001B06, 0x3001B09,
+	0x3001B0C, 0x3001B0F, 0x4001B12, 0x4001B16, 0x3001B1A, 0x4001B1D, 0x3001B21, 0x4001B24, 0x3001B28, 0x3001B2B, 0x3001481, 0x4001B2E, 0x4001B32, 0x3001B36, 0x4001B39, 0x3001B3D,
+	0x4001B40, 0x3001B44, 0x3001B47, 0x3001B4A, 0x3001B4D, 0x3001B50, 0x3001B53, 0x4001B56, 0x4001B5A, 0x4001B5E, 0x4001B62, 0x30018AA, 0x3001B66, 0x3001B69, 0x3001B6C, 0x3001B6F,
+	0x3001B72, 0x3001B75, 0x3001B78, 0x3001B7B, 0x3001B7E, 0x3001B81, 0x3001B84, 0x4001B87, 0x30011FF, 0x3001B8B, 0x3001B8E, 0x3001B91, 0x3001B94, 0x3001B97, 0x3001B9A, 0x300148A,
+	0x3001B9D, 0x3001BA0, 0x3001BA3, 0x3001BA6, 0x4001BA9, 0x4001BAD, 0x4001BB1, 0x3001BB5, 0x3001BB8, 0x3001BBB, 0x3001BBE, 0x4001BC1, 0x3001BC5, 0x4001BC8, 0x3001BCC, 0x3001BCF,
+	0x4001BD2, 0x4001BD6, 0x3001BDA, 0x3001BDD, 0x3001148, 0x3001BE0, 0x3001BE3, 0x3001BE6, 0x3001BE9, 0x3001BEC, 0x3001BEF, 0x3001557, 0x3001BF2, 0x3001BF5, 0x3001BF8, 0x3001BFB,
+	0x3001BFE, 0x3001C01, 0x3001C04, 0x3001C07, 0x3001C0A, 0x4001C0D, 0x3001C11, 0x3001C14, 0x3001C17, 0x3001C1A, 0x3001C1D, 0x4001C20, 0x4001C24, 0x3001C28, 0x3001C2B, 0x3001C2E,
+	0x3001566, 0x3001569, 0x3001C31, 0x4001C34, 0x3001C38, 0x3001C3B, 0x3001C3E, 0x3001C41, 0x4001C44, 0x4001C48, 0x3001C4C, 0x3001C4F, 0x3001C52, 0x4001C55, 0x3001C59, 0x300156C,
+	0x4001C5C, 0x4001C60, 0x3001C64, 0x3001C67, 0x3001C6A, 0x4001C6D, 0x3001C71, 0x3001C74, 0x3001C77, 0x3001C7A, 0x3001C7D, 0x3001C80, 0x3001C83, 0x4001C86, 0x3001C8A, 0x3001C8D,
+	0x3001C90, 0x4001C93, 0x3001C97, 0x3001C9A, 0x3001C9D, 0x3001CA0, 0x4001CA3, 0x4001CA7, 0x3001CAB, 0x3001CAE, 0x3001CB1, 0x4001CB4, 0x3001CB8, 0x4001CBB, 0x300157E, 0x300157E,
+	0x3001CBF, 0x4001CC2, 0x3001CC6, 0x3001CC9, 0x3001CCC, 0x3001CCF, 0x3001CD2, 0x3001CD5, 0x3001CD8, 0x4001CDB, 0x3001581, 0x3001CDF, 0x3001CE2, 0x3001CE5, 0x3001CE8, 0x3001CEB,
+	0x4001CEE, 0x3001CF2, 0x4001CF5, 0x4001CF9, 0x4001CFD, 0x3001D01, 0x3001D04, 0x3001D07, 0x3001D0A, 0x3001D0D, 0x3001D10, 0x3001D13, 0x3001D16, 0x4001D19, 0x0, 0x0,
+};
+const uint32_t* NFKDDataPtr = NFKDData;
+
+const uint32_t UppercaseIndex1[272] = {
+	0, 128, 256, 45, 45, 45, 45, 45, 45, 45, 384, 45, 45, 45, 45, 512,
+	640, 768, 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, 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, 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, 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, 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, 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,
+	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, 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, 45, 45, 45, 45, 45, 45,
+	45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+};
+const uint32_t* UppercaseIndex1Ptr = UppercaseIndex1;
+
+const uint32_t UppercaseIndex2[896] = {
+	0x0, 0x0, 0x0, 0x20, 0x0, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0x100, 0x120, 0x140, 0x160, 0x180,
+	0x1A0, 0x1C0, 0x1E0, 0x200, 0x220, 0x0, 0x0, 0x0, 0x0, 0x0, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0,
+	0x0, 0x300, 0x320, 0x340, 0x360, 0x380, 0x3A0, 0x3C0, 0x3E0, 0x400, 0x0, 0x420, 0x440, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x460, 0x0, 0x0, 0x0, 0x0,
+	0x480, 0x4A0, 0x4C0, 0x4E0, 0x500, 0x520, 0x540, 0x560, 0x580, 0x5A0, 0x5C0, 0x5E0, 0x600, 0x620, 0x640, 0x660,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x680, 0x6A0, 0x6C0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6E0, 0x700, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x720, 0x740, 0x760, 0x780, 0x7A0, 0x7C0, 0x7E0, 0x800, 0x820, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x840, 0x860, 0x880, 0x0, 0x0, 0x0, 0x0, 0x8A0, 0x8C0, 0x8E0, 0x900, 0x920, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x940, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x960, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x980, 0x9A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+const uint32_t* UppercaseIndex2Ptr = UppercaseIndex2;
+
+const uint32_t UppercaseData[2528] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x1000000, 0x1000633, 0x1000012, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x1000105, 0x1000021, 0x1000126, 0x100012C, 0x1000132, 0x10006FF, 0x100002D, 0x1000030,
+	0x1000751, 0x1001EFC, 0x1000168, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x10001D1, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x2003358, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20033F5,
+	0x20034B3, 0x20034B5, 0x20034B7, 0x20034B9, 0x20034BB, 0x20034BD, 0x2000243, 0x20034BF, 0x20034C1, 0x20034C3, 0x20034C5, 0x20034C7, 0x20034C9, 0x20034CB, 0x20034CD, 0x20034CF,
+	0x20034D1, 0x20034D3, 0x20034D5, 0x20034D7, 0x20034D9, 0x20034DB, 0x20034DD, 0x0, 0x2000290, 0x20034DF, 0x20034E1, 0x20034E3, 0x20034E5, 0x20034E7, 0x20034E9, 0x20034EB,
+	0x0, 0x20034ED, 0x0, 0x20034EF, 0x0, 0x20034F1, 0x0, 0x20034F3, 0x0, 0x20034F5, 0x0, 0x20034F7, 0x0, 0x20034F9, 0x0, 0x20034FB,
+	0x0, 0x20034FD, 0x0, 0x20034FF, 0x0, 0x2003501, 0x0, 0x2003503, 0x0, 0x2003505, 0x0, 0x2003507, 0x0, 0x2003509, 0x0, 0x200350B,
+	0x0, 0x200350D, 0x0, 0x200350F, 0x0, 0x2003511, 0x0, 0x2002CE3, 0x0, 0x2003513, 0x0, 0x2003515, 0x0, 0x2003517, 0x0, 0x2003519,
+	0x0, 0x1000021, 0x0, 0x200351B, 0x0, 0x200351D, 0x0, 0x200351F, 0x0, 0x0, 0x2003521, 0x0, 0x2003523, 0x0, 0x2003525, 0x0,
+	0x2003527, 0x0, 0x2003529, 0x0, 0x200352B, 0x0, 0x200352D, 0x0, 0x200352F, 0x3003531, 0x0, 0x2003534, 0x0, 0x2003536, 0x0, 0x2003538,
+	0x0, 0x200353A, 0x0, 0x200353C, 0x0, 0x200353E, 0x0, 0x2003540, 0x0, 0x2003542, 0x0, 0x2003544, 0x0, 0x2003546, 0x0, 0x2003548,
+	0x0, 0x200354A, 0x0, 0x200354C, 0x0, 0x200354E, 0x0, 0x2003550, 0x0, 0x2003552, 0x0, 0x2003554, 0x0, 0x2003556, 0x0, 0x2003558,
+	0x0, 0x200355A, 0x0, 0x200355C, 0x0, 0x200355E, 0x0, 0x2003560, 0x0, 0x0, 0x2003562, 0x0, 0x2003564, 0x0, 0x2003566, 0x100017A,
+	0x2003568, 0x0, 0x0, 0x200356A, 0x0, 0x200356C, 0x0, 0x0, 0x200356E, 0x0, 0x0, 0x0, 0x2003570, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x2003572, 0x0, 0x0, 0x2003574, 0x0, 0x0, 0x0, 0x2003576, 0x2003578, 0x0, 0x0, 0x0, 0x200357A, 0x0,
+	0x0, 0x200357C, 0x0, 0x200357E, 0x0, 0x2003580, 0x0, 0x0, 0x2003582, 0x0, 0x0, 0x0, 0x0, 0x2003584, 0x0, 0x0,
+	0x2003586, 0x0, 0x0, 0x0, 0x2003588, 0x0, 0x200358A, 0x0, 0x0, 0x200358C, 0x0, 0x0, 0x0, 0x200358E, 0x0, 0x2003590,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x2003592, 0x2003592, 0x0, 0x2003594, 0x2003594, 0x0, 0x2003596, 0x2003596, 0x0, 0x2003598, 0x0,
+	0x200359A, 0x0, 0x200359C, 0x0, 0x200359E, 0x0, 0x20035A0, 0x0, 0x20035A2, 0x0, 0x20035A4, 0x0, 0x20035A6, 0x2001DEF, 0x0, 0x20035A8,
+	0x0, 0x20035AA, 0x0, 0x20035AC, 0x0, 0x20035AE, 0x0, 0x20035B0, 0x0, 0x20035B2, 0x0, 0x20035B4, 0x0, 0x20035B6, 0x0, 0x20035B8,
+	0x30035BA, 0x0, 0x20035BD, 0x20035BD, 0x0, 0x20035BF, 0x0, 0x0, 0x0, 0x20035C1, 0x0, 0x20035C3, 0x0, 0x20035C5, 0x0, 0x20035C7,
+	0x0, 0x20035C9, 0x0, 0x20035CB, 0x0, 0x20035CD, 0x0, 0x20035CF, 0x0, 0x20035D1, 0x0, 0x20035D3, 0x0, 0x20035D5, 0x0, 0x20035D7,
+	0x0, 0x20035D9, 0x0, 0x20035DB, 0x0, 0x20035DD, 0x0, 0x20035DF, 0x0, 0x20035E1, 0x0, 0x20035E3, 0x0, 0x20035E5, 0x0, 0x20035E7,
+	0x0, 0x0, 0x0, 0x2001DF1, 0x0, 0x20035E9, 0x0, 0x20035EB, 0x0, 0x20035ED, 0x0, 0x20035EF, 0x0, 0x20035F1, 0x0, 0x20035F3,
+	0x0, 0x20035F5, 0x0, 0x20035F7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20035F9, 0x0, 0x0, 0x30035FB,
+	0x30035FE, 0x0, 0x2003601, 0x0, 0x0, 0x0, 0x0, 0x2003603, 0x0, 0x2003605, 0x0, 0x2003607, 0x0, 0x2003609, 0x0, 0x200360B,
+	0x300360D, 0x3003610, 0x3003613, 0x2003616, 0x2003618, 0x0, 0x200361A, 0x200361C, 0x0, 0x200361E, 0x0, 0x2001EF3, 0x3003620, 0x0, 0x0, 0x0,
+	0x2003623, 0x3003625, 0x0, 0x2003628, 0x0, 0x300362A, 0x300362D, 0x0, 0x2003630, 0x2003632, 0x0, 0x3003634, 0x3003637, 0x0, 0x0, 0x200363A,
+	0x0, 0x300363C, 0x200363F, 0x0, 0x0, 0x2003641, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003643, 0x0, 0x0,
+	0x2003646, 0x0, 0x0, 0x2003648, 0x0, 0x0, 0x0, 0x300364A, 0x200364D, 0x200364F, 0x2003651, 0x2003653, 0x2003655, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x2000267, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003657, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x2000339, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x200365A, 0x0, 0x200365C, 0x0, 0x0, 0x0, 0x200365E, 0x0, 0x0, 0x0, 0x2003660, 0x2003662, 0x2003664, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6003666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200366C, 0x200366E, 0x2003670, 0x2003672,
+	0x6003674, 0x200032B, 0x200334E, 0x2001F07, 0x2003350, 0x2000331, 0x2003352, 0x2000335, 0x2001D95, 0x2000339, 0x2003354, 0x2003356, 0x2003358, 0x200335A, 0x200335C, 0x200033D,
+	0x2001F09, 0x2000E35, 0x2001D97, 0x2001D97, 0x200335E, 0x2000341, 0x2003360, 0x2003362, 0x2003364, 0x2000345, 0x200367A, 0x200367C, 0x200367E, 0x2003680, 0x2003682, 0x0,
+	0x200334E, 0x2001D95, 0x0, 0x0, 0x0, 0x2003360, 0x2001F09, 0x2003684, 0x0, 0x2003686, 0x0, 0x2003688, 0x0, 0x200337A, 0x0, 0x200368A,
+	0x0, 0x200368C, 0x0, 0x200368E, 0x0, 0x2003690, 0x0, 0x2003692, 0x0, 0x2003694, 0x0, 0x2003696, 0x0, 0x2003698, 0x0, 0x200369A,
+	0x2003354, 0x2000E35, 0x200369C, 0x200369E, 0x0, 0x2000331, 0x0, 0x0, 0x20036A0, 0x0, 0x0, 0x20036A2, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x20003D1, 0x20036A4, 0x20036A6, 0x2000389, 0x20036A8, 0x2000381, 0x20003C9, 0x20003F9, 0x2000395, 0x20036AA, 0x2000391, 0x20036AC, 0x20036AE, 0x20036B0, 0x2000411, 0x20036B2,
+	0x20036B4, 0x20036B6, 0x20036B8, 0x2000399, 0x20036BA, 0x20036BC, 0x20036BE, 0x2000441, 0x20036C0, 0x20036C2, 0x20036C4, 0x2000449, 0x20036C6, 0x2000421, 0x20036C8, 0x20036CA,
+	0x20036CC, 0x20036CE, 0x20036D0, 0x20036D2, 0x20036D4, 0x20036D6, 0x200038D, 0x20036D8, 0x20036DA, 0x20036DC, 0x20036DE, 0x20036E0, 0x20036E2, 0x20036E4, 0x20036E6, 0x20036E8,
+	0x0, 0x20036EA, 0x0, 0x20036EC, 0x0, 0x20036EE, 0x0, 0x20036F0, 0x0, 0x20036F2, 0x0, 0x20036F4, 0x0, 0x20036F6, 0x0, 0x20036F8,
+	0x0, 0x20036FA, 0x0, 0x20036FC, 0x0, 0x20003C1, 0x0, 0x20036FE, 0x0, 0x2003700, 0x0, 0x2003702, 0x0, 0x2003704, 0x0, 0x2003706,
+	0x0, 0x2003708, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200370A, 0x0, 0x200370C, 0x0, 0x200370E,
+	0x0, 0x2003710, 0x0, 0x2003712, 0x0, 0x2003714, 0x0, 0x2003716, 0x0, 0x2003718, 0x0, 0x200371A, 0x0, 0x200371C, 0x0, 0x200371E,
+	0x0, 0x2003720, 0x0, 0x2003722, 0x0, 0x2003724, 0x0, 0x2003726, 0x0, 0x2003728, 0x0, 0x200372A, 0x0, 0x200372C, 0x0, 0x200372E,
+	0x0, 0x2003730, 0x0, 0x2003732, 0x0, 0x2003734, 0x0, 0x2003736, 0x0, 0x2003738, 0x0, 0x200373A, 0x0, 0x200373C, 0x0, 0x200373E,
+	0x0, 0x0, 0x2003740, 0x0, 0x2003742, 0x0, 0x2003744, 0x0, 0x2003746, 0x0, 0x2003748, 0x0, 0x200374A, 0x0, 0x200374C, 0x200374E,
+	0x0, 0x2003750, 0x0, 0x2003752, 0x0, 0x2003754, 0x0, 0x2003756, 0x0, 0x20003E9, 0x0, 0x2003758, 0x0, 0x200375A, 0x0, 0x200375C,
+	0x0, 0x200375E, 0x0, 0x2003760, 0x0, 0x2003762, 0x0, 0x2003764, 0x0, 0x2000419, 0x0, 0x2003766, 0x0, 0x2003768, 0x0, 0x200376A,
+	0x0, 0x200376C, 0x0, 0x200376E, 0x0, 0x2003770, 0x0, 0x2003772, 0x0, 0x2003774, 0x0, 0x2003776, 0x0, 0x2003778, 0x0, 0x200377A,
+	0x0, 0x200377C, 0x0, 0x200377E, 0x0, 0x2003780, 0x0, 0x2003782, 0x0, 0x2003784, 0x0, 0x2003786, 0x0, 0x2003788, 0x0, 0x200378A,
+	0x0, 0x200378C, 0x0, 0x200378E, 0x0, 0x2003790, 0x0, 0x2003792, 0x0, 0x2003794, 0x0, 0x2003796, 0x0, 0x2003798, 0x0, 0x200379A,
+	0x0, 0x200379C, 0x0, 0x200379E, 0x0, 0x20037A0, 0x0, 0x20037A2, 0x0, 0x20037A4, 0x0, 0x20037A6, 0x0, 0x20037A8, 0x0, 0x20037AA,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x20037AC, 0x20037AE, 0x20037B0, 0x20037B2, 0x20037B4, 0x20037B6, 0x20037B8, 0x20037BA, 0x20037BC, 0x20037BE, 0x20037C0, 0x20037C2, 0x20037C4, 0x20037C6, 0x20037C8,
+	0x20037CA, 0x20037CC, 0x20037CE, 0x20037D0, 0x20037D2, 0x20037D4, 0x20037D6, 0x20037D8, 0x20037DA, 0x20037DC, 0x20037DE, 0x20037E0, 0x20037E2, 0x20037E4, 0x20037E6, 0x20037E8,
+	0x20037EA, 0x20037EC, 0x20037EE, 0x20037F0, 0x20037F2, 0x20037F4, 0x20037F6, 0x40037F8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30037FC, 0x0, 0x0, 0x0, 0x30037FF, 0x0, 0x0,
+	0x0, 0x3003802, 0x0, 0x3003805, 0x0, 0x3003808, 0x0, 0x300380B, 0x0, 0x300380E, 0x0, 0x3003811, 0x0, 0x3003814, 0x0, 0x3003817,
+	0x0, 0x300381A, 0x0, 0x300381D, 0x0, 0x3003820, 0x0, 0x3003823, 0x0, 0x3003826, 0x0, 0x3003829, 0x0, 0x300382C, 0x0, 0x300382F,
+	0x0, 0x3003832, 0x0, 0x3003835, 0x0, 0x3003838, 0x0, 0x300383B, 0x0, 0x300383E, 0x0, 0x3003841, 0x0, 0x3003844, 0x0, 0x3003847,
+	0x0, 0x300384A, 0x0, 0x300384D, 0x0, 0x3003850, 0x0, 0x3003853, 0x0, 0x3003856, 0x0, 0x3003859, 0x0, 0x300385C, 0x0, 0x300385F,
+	0x0, 0x3003862, 0x0, 0x3003865, 0x0, 0x3003868, 0x0, 0x300386B, 0x0, 0x300386E, 0x0, 0x3003871, 0x0, 0x3003874, 0x0, 0x3003877,
+	0x0, 0x300387A, 0x0, 0x300387D, 0x0, 0x3003880, 0x0, 0x3003883, 0x0, 0x3003886, 0x0, 0x3003889, 0x0, 0x300388C, 0x0, 0x300388F,
+	0x0, 0x3003892, 0x0, 0x3003895, 0x0, 0x3003898, 0x0, 0x300389B, 0x0, 0x300389E, 0x0, 0x30038A1, 0x0, 0x30038A4, 0x0, 0x30038A7,
+	0x0, 0x30038AA, 0x0, 0x30038AD, 0x0, 0x30038B0, 0x0, 0x30038B3, 0x0, 0x30038B6, 0x0, 0x30038B9, 0x0, 0x30038BC, 0x0, 0x30038BF,
+	0x0, 0x30038C2, 0x0, 0x30038C5, 0x0, 0x30038C8, 0x0, 0x30038CB, 0x0, 0x30038CE, 0x0, 0x30038D1, 0x0, 0x30038D4, 0x0, 0x30038D7,
+	0x0, 0x30038DA, 0x0, 0x30038DD, 0x0, 0x30038E0, 0x30038E3, 0x30038E6, 0x30038E9, 0x30038EC, 0x30038EF, 0x3003892, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x30038F2, 0x0, 0x30038F5, 0x0, 0x30038F8, 0x0, 0x30038FB, 0x0, 0x30038FE, 0x0, 0x3003901, 0x0, 0x3003904, 0x0, 0x3003907,
+	0x0, 0x300390A, 0x0, 0x300390D, 0x0, 0x3003910, 0x0, 0x3003913, 0x0, 0x3003916, 0x0, 0x3003919, 0x0, 0x300391C, 0x0, 0x300391F,
+	0x0, 0x3003922, 0x0, 0x3003925, 0x0, 0x3003928, 0x0, 0x300392B, 0x0, 0x300392E, 0x0, 0x3003931, 0x0, 0x3003934, 0x0, 0x3003937,
+	0x0, 0x300393A, 0x0, 0x300393D, 0x0, 0x3003940, 0x0, 0x3003943, 0x0, 0x3003946, 0x0, 0x3003949, 0x0, 0x300394C, 0x0, 0x300394F,
+	0x0, 0x3003952, 0x0, 0x3003955, 0x0, 0x3003958, 0x0, 0x300395B, 0x0, 0x300395E, 0x0, 0x3003961, 0x0, 0x3003964, 0x0, 0x3003967,
+	0x0, 0x300396A, 0x0, 0x300396D, 0x0, 0x3003970, 0x0, 0x3003973, 0x0, 0x3003976, 0x0, 0x3003979, 0x0, 0x300397C, 0x0, 0x300397F,
+	0x3003982, 0x3003985, 0x3003988, 0x300398B, 0x300398E, 0x3003991, 0x3003994, 0x3003997, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300399A, 0x300399D, 0x30039A0, 0x30039A3, 0x30039A6, 0x30039A9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30039AC, 0x30039AF, 0x30039B2, 0x30039B5, 0x30039B8, 0x30039BB, 0x30039BE, 0x30039C1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30039C4, 0x30039C7, 0x30039CA, 0x30039CD, 0x30039D0, 0x30039D3, 0x30039D6, 0x30039D9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30039DC, 0x30039DF, 0x30039E2, 0x30039E5, 0x30039E8, 0x30039EB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40039EE, 0x30039F2, 0x60039F5, 0x30039FB, 0x60039FE, 0x3003A04, 0x6003A07, 0x3003A0D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003A10, 0x3003A13, 0x3003A16, 0x3003A19, 0x3003A1C, 0x3003A1F, 0x3003A22, 0x3003A25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003A28, 0x3003A2B, 0x3003A2E, 0x3003A31, 0x3003A34, 0x3003A37, 0x3003A3A, 0x3003A3D, 0x3003A40, 0x3003A43, 0x3003A46, 0x3003A49, 0x3003A4C, 0x3003A4F, 0x0, 0x0,
+	0x5003A52, 0x5003A57, 0x5003A5C, 0x5003A61, 0x5003A66, 0x5003A6B, 0x5003A70, 0x5003A75, 0x5003A52, 0x5003A57, 0x5003A5C, 0x5003A61, 0x5003A66, 0x5003A6B, 0x5003A70, 0x5003A75,
+	0x5003A7A, 0x5003A7F, 0x5003A84, 0x5003A89, 0x5003A8E, 0x5003A93, 0x5003A98, 0x5003A9D, 0x5003A7A, 0x5003A7F, 0x5003A84, 0x5003A89, 0x5003A8E, 0x5003A93, 0x5003A98, 0x5003A9D,
+	0x5003AA2, 0x5003AA7, 0x5003AAC, 0x5003AB1, 0x5003AB6, 0x5003ABB, 0x5003AC0, 0x5003AC5, 0x5003AA2, 0x5003AA7, 0x5003AAC, 0x5003AB1, 0x5003AB6, 0x5003ABB, 0x5003AC0, 0x5003AC5,
+	0x3003ACA, 0x3003ACD, 0x5003AD0, 0x4003AD5, 0x4003AD9, 0x0, 0x4003ADD, 0x6003AE1, 0x0, 0x0, 0x0, 0x0, 0x4003AD5, 0x0, 0x2000339, 0x0,
+	0x0, 0x0, 0x5003AE7, 0x4003AEC, 0x4003AF0, 0x0, 0x4003AF4, 0x6003AF8, 0x0, 0x0, 0x0, 0x0, 0x4003AEC, 0x0, 0x0, 0x0,
+	0x3003AFE, 0x3003B01, 0x6003B04, 0x6003666, 0x0, 0x0, 0x4003B0A, 0x6003B0E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003B14, 0x3003B17, 0x6003B1A, 0x6003674, 0x4003B20, 0x3003B24, 0x4003B27, 0x6003B2B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x5003B31, 0x4003B36, 0x4003B3A, 0x0, 0x4003B3E, 0x6003B42, 0x0, 0x0, 0x0, 0x0, 0x4003B36, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003B48, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003B4B, 0x3003B4E, 0x3003B51, 0x3003B54, 0x3003B57, 0x3003B5A, 0x3003B5D, 0x3003B60, 0x3003B63, 0x3003B66, 0x3003B69, 0x3003B6C, 0x3003B6F, 0x3003B72, 0x3003B75, 0x3003B78,
+	0x0, 0x0, 0x0, 0x0, 0x3003B7B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003B7E, 0x3003B81, 0x3003B84, 0x3003B87, 0x3003B8A, 0x3003B8D, 0x3003B90, 0x3003B93, 0x3003B96, 0x3003B99, 0x3003B9C, 0x3003B9F, 0x3003BA2, 0x3003BA5, 0x3003BA8, 0x3003BAB,
+	0x3003BAE, 0x3003BB1, 0x3003BB4, 0x3003BB7, 0x3003BBA, 0x3003BBD, 0x3003BC0, 0x3003BC3, 0x3003BC6, 0x3003BC9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003BCC, 0x3003BCF, 0x3003BD2, 0x3003BD5, 0x3003BD8, 0x3003BDB, 0x3003BDE, 0x3003BE1, 0x3003BE4, 0x3003BE7, 0x3003BEA, 0x3003BED, 0x3003BF0, 0x3003BF3, 0x3003BF6, 0x3003BF9,
+	0x3003BFC, 0x3003BFF, 0x3003C02, 0x3003C05, 0x3003C08, 0x3003C0B, 0x3003C0E, 0x3003C11, 0x3003C14, 0x3003C17, 0x3003C1A, 0x3003C1D, 0x3003C20, 0x3003C23, 0x3003C26, 0x3003C29,
+	0x3003C2C, 0x3003C2F, 0x3003C32, 0x3003C35, 0x3003C38, 0x3003C3B, 0x3003C3E, 0x3003C41, 0x3003C44, 0x3003C47, 0x3003C4A, 0x3003C4D, 0x3003C50, 0x3003C53, 0x3003C56, 0x0,
+	0x0, 0x3003C59, 0x0, 0x0, 0x0, 0x2003C5C, 0x2003C5E, 0x0, 0x3003C60, 0x0, 0x3003C63, 0x0, 0x3003C66, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x3003C69, 0x0, 0x0, 0x3003C6C, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003C6F, 0x0, 0x3003C72, 0x0, 0x3003C75, 0x0, 0x3003C78, 0x0, 0x3003C7B, 0x0, 0x3003C7E, 0x0, 0x3003C81, 0x0, 0x3003C84,
+	0x0, 0x3003C87, 0x0, 0x3003C8A, 0x0, 0x3003C8D, 0x0, 0x3003C90, 0x0, 0x3003C93, 0x0, 0x3003C96, 0x0, 0x3003C99, 0x0, 0x3003C9C,
+	0x0, 0x3003C9F, 0x0, 0x3003CA2, 0x0, 0x3003CA5, 0x0, 0x3003CA8, 0x0, 0x3003CAB, 0x0, 0x3003CAE, 0x0, 0x3003CB1, 0x0, 0x3003CB4,
+	0x0, 0x3003CB7, 0x0, 0x3003CBA, 0x0, 0x3003CBD, 0x0, 0x3003CC0, 0x0, 0x3003CC3, 0x0, 0x3003CC6, 0x0, 0x3003CC9, 0x0, 0x3003CCC,
+	0x0, 0x3003CCF, 0x0, 0x3003CD2, 0x0, 0x3003CD5, 0x0, 0x3003CD8, 0x0, 0x3003CDB, 0x0, 0x3003CDE, 0x0, 0x3003CE1, 0x0, 0x3003CE4,
+	0x0, 0x3003CE7, 0x0, 0x3003CEA, 0x0, 0x3003CED, 0x0, 0x3003CF0, 0x0, 0x3003CF3, 0x0, 0x3003CF6, 0x0, 0x3003CF9, 0x0, 0x3003CFC,
+	0x0, 0x3003CFF, 0x0, 0x3003D02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003D05, 0x0, 0x3003D08, 0x0,
+	0x0, 0x0, 0x0, 0x3003D0B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003D0E, 0x3003D11, 0x3003D14, 0x3003D17, 0x3003D1A, 0x3003D1D, 0x3003D20, 0x3003D23, 0x3003D26, 0x3003D29, 0x3003D2C, 0x3003D2F, 0x3003D32, 0x3003D35, 0x3003D38, 0x3003D3B,
+	0x3003D3E, 0x3003D41, 0x3003D44, 0x3003D47, 0x3003D4A, 0x3003D4D, 0x3003D50, 0x3003D53, 0x3003D56, 0x3003D59, 0x3003D5C, 0x3003D5F, 0x3003D62, 0x3003D65, 0x3003D68, 0x3003D6B,
+	0x3003D6E, 0x3003D71, 0x3003D74, 0x3003D77, 0x3003D7A, 0x3003D7D, 0x0, 0x3003D80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003D83, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003D86, 0x0, 0x3003D89, 0x0, 0x3003D8C, 0x0, 0x3003D8F, 0x0, 0x3003D92, 0x0, 0x3003D95, 0x0, 0x3003D98, 0x0, 0x3003D9B,
+	0x0, 0x3003D9E, 0x0, 0x3003DA1, 0x0, 0x3003DA4, 0x0, 0x3003DA7, 0x0, 0x3003DAA, 0x0, 0x3003DAD, 0x0, 0x3003DB0, 0x0, 0x3003DB3,
+	0x0, 0x3003DB6, 0x0, 0x3003DB9, 0x0, 0x3003DBC, 0x0, 0x3003DBF, 0x0, 0x3003DC2, 0x0, 0x3003DC5, 0x0, 0x3003DC8, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003DCB, 0x0, 0x3003DCE, 0x0, 0x3003DD1, 0x0, 0x3003DD4, 0x0, 0x3003DD7, 0x0, 0x3003DDA, 0x0, 0x3003DDD, 0x0, 0x3003DE0,
+	0x0, 0x3003DE3, 0x0, 0x3003DE6, 0x0, 0x3003DE9, 0x0, 0x3003DEC, 0x0, 0x3003DEF, 0x0, 0x3003DF2, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x3003DF5, 0x0, 0x3003DF8, 0x0, 0x3003DFB, 0x0, 0x3003DFE, 0x0, 0x3003E01, 0x0, 0x3003E04, 0x0, 0x3003E07,
+	0x0, 0x0, 0x0, 0x3003E0A, 0x0, 0x3003E0D, 0x0, 0x3003E10, 0x0, 0x3003E13, 0x0, 0x3003E16, 0x0, 0x3003E19, 0x0, 0x3003E1C,
+	0x0, 0x3003E1F, 0x0, 0x3003E22, 0x0, 0x3003E25, 0x0, 0x3003E28, 0x0, 0x3003E2B, 0x0, 0x3003E2E, 0x0, 0x3003E31, 0x0, 0x3003E34,
+	0x0, 0x3003E37, 0x0, 0x3003E3A, 0x0, 0x3003E3D, 0x0, 0x3003E40, 0x0, 0x3003E43, 0x0, 0x3003E46, 0x0, 0x3003E49, 0x0, 0x3003E4C,
+	0x0, 0x3003E4F, 0x0, 0x3003E52, 0x0, 0x3003E55, 0x0, 0x3003E58, 0x0, 0x3003E5B, 0x0, 0x3003E5E, 0x0, 0x3003E61, 0x0, 0x3003E64,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003E67, 0x0, 0x3003E6A, 0x0, 0x0, 0x3003E6D,
+	0x0, 0x3003E70, 0x0, 0x3003E73, 0x0, 0x3003E76, 0x0, 0x3003E79, 0x0, 0x0, 0x0, 0x0, 0x3003E7C, 0x0, 0x0, 0x0,
+	0x0, 0x3003E7F, 0x0, 0x3003E82, 0x0, 0x0, 0x0, 0x3003E85, 0x0, 0x3003E88, 0x0, 0x3003E8B, 0x0, 0x3003E8E, 0x0, 0x3003E91,
+	0x0, 0x3003E94, 0x0, 0x3003E97, 0x0, 0x3003E9A, 0x0, 0x3003E9D, 0x0, 0x3003EA0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2003EA3, 0x2003EA5, 0x2003EA7, 0x3003EA9, 0x3003EAC, 0x2003EAF, 0x2003EAF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x4003EB1, 0x4003EB5, 0x4003EB9, 0x4003EBD, 0x4003EC1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003EC5, 0x3003EC8, 0x3003ECB, 0x3003ECE, 0x3003ED1, 0x3003ED4, 0x3003ED7, 0x3003EDA, 0x3003EDD, 0x3003EE0, 0x3003EE3, 0x3003EE6, 0x3003EE9, 0x3003EEC, 0x3003EEF,
+	0x3003EF2, 0x3003EF5, 0x3003EF8, 0x3003EFB, 0x3003EFE, 0x3003F01, 0x3003F04, 0x3003F07, 0x3003F0A, 0x3003F0D, 0x3003F10, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4003F13, 0x4003F17, 0x4003F1B, 0x4003F1F, 0x4003F23, 0x4003F27, 0x4003F2B, 0x4003F2F,
+	0x4003F33, 0x4003F37, 0x4003F3B, 0x4003F3F, 0x4003F43, 0x4003F47, 0x4003F4B, 0x4003F4F, 0x4003F53, 0x4003F57, 0x4003F5B, 0x4003F5F, 0x4003F63, 0x4003F67, 0x4003F6B, 0x4003F6F,
+	0x4003F73, 0x4003F77, 0x4003F7B, 0x4003F7F, 0x4003F83, 0x4003F87, 0x4003F8B, 0x4003F8F, 0x4003F93, 0x4003F97, 0x4003F9B, 0x4003F9F, 0x4003FA3, 0x4003FA7, 0x4003FAB, 0x4003FAF,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4003FB3, 0x4003FB7, 0x4003FBB, 0x4003FBF, 0x4003FC3, 0x4003FC7, 0x4003FCB, 0x4003FCF, 0x4003FD3, 0x4003FD7, 0x4003FDB, 0x4003FDF, 0x4003FE3, 0x4003FE7, 0x4003FEB, 0x4003FEF,
+	0x4003FF3, 0x4003FF7, 0x4003FFB, 0x4003FFF, 0x4004003, 0x4004007, 0x400400B, 0x400400F, 0x4004013, 0x4004017, 0x400401B, 0x400401F, 0x4004023, 0x4004027, 0x400402B, 0x400402F,
+};
+const uint32_t* UppercaseDataPtr = UppercaseData;
+
+const uint32_t LowercaseIndex1[272] = {
+	0, 128, 256, 384, 360, 360, 360, 360, 360, 360, 512, 360, 360, 360, 360, 640,
+	768, 896, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+};
+const uint32_t* LowercaseIndex1Ptr = LowercaseIndex1;
+
+const uint32_t LowercaseIndex2[1024] = {
+	0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x40, 0x0, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0x100, 0x120, 0x140,
+	0x160, 0x180, 0x1A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C0, 0x1E0, 0x200, 0x220, 0x240,
+	0x260, 0x280, 0x0, 0x2A0, 0x2C0, 0x2E0, 0x300, 0x320, 0x340, 0x360, 0x380, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x3A0, 0x3C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3E0, 0x400, 0x420, 0x440, 0x460, 0x480, 0x4A0, 0x4C0, 0x4E0, 0x500, 0x520, 0x540, 0x560, 0x580, 0x5A0, 0x5C0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5E0, 0x0, 0x600, 0x620, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x640, 0x660, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x680, 0x6A0, 0x0, 0x6C0, 0x6E0, 0x700, 0x720, 0x740, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x760, 0x780, 0x7A0, 0x0, 0x0, 0x0, 0x0, 0x7C0, 0x7E0, 0x800, 0x820, 0x840, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x860, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x880, 0x8A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x8C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+const uint32_t* LowercaseIndex2Ptr = LowercaseIndex2;
+
+const uint32_t LowercaseData[2272] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x100007E,
+	0x1000754, 0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2004033, 0x2004035, 0x2004037, 0x2004039, 0x200403B, 0x200403D, 0x2000247, 0x200403F, 0x2004041, 0x2004043, 0x2004045, 0x2004047, 0x2004049, 0x200404B, 0x200404D, 0x200404F,
+	0x2001E1E, 0x2004051, 0x2004053, 0x2004055, 0x2004057, 0x2004059, 0x200405B, 0x0, 0x2000294, 0x200405D, 0x200405F, 0x2004061, 0x2004063, 0x2004065, 0x2004067, 0x0,
+	0x2004069, 0x0, 0x200406B, 0x0, 0x200406D, 0x0, 0x200406F, 0x0, 0x2004071, 0x0, 0x2004073, 0x0, 0x2004075, 0x0, 0x2004077, 0x0,
+	0x2004079, 0x0, 0x200407B, 0x0, 0x200407D, 0x0, 0x200407F, 0x0, 0x2004081, 0x0, 0x2004083, 0x0, 0x2004085, 0x0, 0x2004087, 0x0,
+	0x2004089, 0x0, 0x200408B, 0x0, 0x200408D, 0x0, 0x2001EF8, 0x0, 0x200408F, 0x0, 0x2004091, 0x0, 0x2004093, 0x0, 0x2004095, 0x0,
+	0x3004097, 0x0, 0x200409A, 0x0, 0x200409C, 0x0, 0x200409E, 0x0, 0x0, 0x20040A0, 0x0, 0x20040A2, 0x0, 0x20040A4, 0x0, 0x20040A6,
+	0x0, 0x20040A8, 0x0, 0x20040AA, 0x0, 0x20040AC, 0x0, 0x20040AE, 0x0, 0x0, 0x2001E00, 0x0, 0x20040B0, 0x0, 0x20040B2, 0x0,
+	0x20040B4, 0x0, 0x2002CE5, 0x0, 0x20040B6, 0x0, 0x20040B8, 0x0, 0x20040BA, 0x0, 0x20040BC, 0x0, 0x20040BE, 0x0, 0x20040C0, 0x0,
+	0x20040C2, 0x0, 0x20040C4, 0x0, 0x20040C6, 0x0, 0x20040C8, 0x0, 0x20040CA, 0x0, 0x20040CC, 0x0, 0x20040CE, 0x0, 0x20040D0, 0x0,
+	0x20040D2, 0x0, 0x20040D4, 0x0, 0x20040D6, 0x0, 0x20040D8, 0x0, 0x20040DA, 0x20040DC, 0x0, 0x20040DE, 0x0, 0x20040E0, 0x0, 0x0,
+	0x0, 0x20040E2, 0x20040E4, 0x0, 0x20040E6, 0x0, 0x2001E02, 0x20040E8, 0x0, 0x20040EA, 0x20040EC, 0x20040EE, 0x0, 0x0, 0x20040F0, 0x2001DFA,
+	0x2001DFC, 0x20040F2, 0x0, 0x20040F4, 0x2001D7D, 0x0, 0x2001E28, 0x2001E26, 0x20040F6, 0x0, 0x0, 0x0, 0x2001E0D, 0x2001E3C, 0x0, 0x2001E42,
+	0x20040F8, 0x0, 0x20040FA, 0x0, 0x20040FC, 0x0, 0x20040FE, 0x2004100, 0x0, 0x2001E48, 0x0, 0x0, 0x2004102, 0x0, 0x2004104, 0x2004106,
+	0x0, 0x2001E4E, 0x2001E53, 0x2004108, 0x0, 0x200410A, 0x0, 0x200026B, 0x200410C, 0x0, 0x0, 0x0, 0x200410E, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x2004110, 0x2004110, 0x0, 0x2004112, 0x2004112, 0x0, 0x2004114, 0x2004114, 0x0, 0x2004116, 0x0, 0x2004118,
+	0x0, 0x200411A, 0x0, 0x200411C, 0x0, 0x200411E, 0x0, 0x2004120, 0x0, 0x2004122, 0x0, 0x2004124, 0x0, 0x0, 0x2004126, 0x0,
+	0x2004128, 0x0, 0x200412A, 0x0, 0x200412C, 0x0, 0x200412E, 0x0, 0x2004130, 0x0, 0x2004132, 0x0, 0x2004134, 0x0, 0x2004136, 0x0,
+	0x0, 0x2004138, 0x2004138, 0x0, 0x200413A, 0x0, 0x200413C, 0x200413E, 0x2004140, 0x0, 0x2004142, 0x0, 0x2004144, 0x0, 0x2004146, 0x0,
+	0x2004148, 0x0, 0x200414A, 0x0, 0x200414C, 0x0, 0x200414E, 0x0, 0x2004150, 0x0, 0x2004152, 0x0, 0x2004154, 0x0, 0x2004156, 0x0,
+	0x2004158, 0x0, 0x200415A, 0x0, 0x200415C, 0x0, 0x200415E, 0x0, 0x2004160, 0x0, 0x2004162, 0x0, 0x2004164, 0x0, 0x2004166, 0x0,
+	0x2004168, 0x0, 0x200416A, 0x0, 0x200416C, 0x0, 0x200416E, 0x0, 0x2004170, 0x0, 0x2004172, 0x0, 0x2004174, 0x0, 0x2004176, 0x0,
+	0x2004178, 0x0, 0x200417A, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300417C, 0x200417F, 0x0, 0x2004181, 0x3004183, 0x0,
+	0x0, 0x2004186, 0x0, 0x2004188, 0x2001E4C, 0x2001E55, 0x200418A, 0x0, 0x200418C, 0x0, 0x200418E, 0x0, 0x2004190, 0x0, 0x2004192, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2004194, 0x0, 0x2004196, 0x0, 0x0, 0x0, 0x2004198, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200419A,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200419C, 0x0, 0x200419E, 0x20041A0, 0x20041A2, 0x0, 0x20041A4, 0x0, 0x20041A6, 0x20041A8,
+	0x0, 0x2000357, 0x2001D89, 0x2001E12, 0x2001E14, 0x200035B, 0x2003369, 0x200035F, 0x2001D8B, 0x2000349, 0x2001D91, 0x200336B, 0x2001D29, 0x200336D, 0x200336F, 0x200036D,
+	0x2001D8F, 0x2000E17, 0x0, 0x2003371, 0x2003373, 0x2000367, 0x2001D8D, 0x2001E16, 0x2003375, 0x2000375, 0x20041AA, 0x20041AC, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20041AE,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20041B0, 0x0, 0x20041B2, 0x0, 0x200337C, 0x0, 0x20041B4, 0x0,
+	0x20041B6, 0x0, 0x20041B8, 0x0, 0x20041BA, 0x0, 0x20041BC, 0x0, 0x20041BE, 0x0, 0x20041C0, 0x0, 0x20041C2, 0x0, 0x20041C4, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x2001D8B, 0x0, 0x0, 0x20041C6, 0x0, 0x20041C8, 0x20041CA, 0x0, 0x0, 0x20041CC, 0x20041CE, 0x20041D0,
+	0x20041D2, 0x20041D4, 0x20041D6, 0x20041D8, 0x20041DA, 0x20041DC, 0x20003B1, 0x20041DE, 0x20041E0, 0x20041E2, 0x20041E4, 0x20041E6, 0x20041E8, 0x20041EA, 0x20041EC, 0x20041EE,
+	0x20003D5, 0x20041F0, 0x20041F2, 0x20003AD, 0x20041F4, 0x20003A5, 0x20003CD, 0x20003FD, 0x20003A1, 0x20041F6, 0x20003B5, 0x20041F8, 0x20041FA, 0x2001E18, 0x2000415, 0x20041FC,
+	0x20041FE, 0x2004200, 0x2004202, 0x20003BD, 0x2004204, 0x2004206, 0x2004208, 0x2000445, 0x200420A, 0x200420C, 0x2002CDC, 0x200044D, 0x2002CDE, 0x2000425, 0x200420E, 0x2004210,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2004212, 0x0, 0x2004214, 0x0, 0x2004216, 0x0, 0x2004218, 0x0, 0x200421A, 0x0, 0x200421C, 0x0, 0x200421E, 0x0, 0x2004220, 0x0,
+	0x2004222, 0x0, 0x2004224, 0x0, 0x20003C5, 0x0, 0x2004226, 0x0, 0x2004228, 0x0, 0x200422A, 0x0, 0x200422C, 0x0, 0x200422E, 0x0,
+	0x2004230, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2004232, 0x0, 0x2004234, 0x0, 0x2004236, 0x0,
+	0x2004238, 0x0, 0x200423A, 0x0, 0x200423C, 0x0, 0x200423E, 0x0, 0x2004240, 0x0, 0x2004242, 0x0, 0x2004244, 0x0, 0x2004246, 0x0,
+	0x2004248, 0x0, 0x200424A, 0x0, 0x200424C, 0x0, 0x200424E, 0x0, 0x2004250, 0x0, 0x2004252, 0x0, 0x2004254, 0x0, 0x2004256, 0x0,
+	0x2004258, 0x0, 0x200425A, 0x0, 0x200425C, 0x0, 0x200425E, 0x0, 0x2004260, 0x0, 0x2004262, 0x0, 0x2004264, 0x0, 0x2004266, 0x0,
+	0x2004268, 0x200426A, 0x0, 0x200426C, 0x0, 0x200426E, 0x0, 0x2004270, 0x0, 0x2004272, 0x0, 0x2004274, 0x0, 0x2004276, 0x0, 0x0,
+	0x2004278, 0x0, 0x200427A, 0x0, 0x200427C, 0x0, 0x200427E, 0x0, 0x20003ED, 0x0, 0x2004280, 0x0, 0x2004282, 0x0, 0x2004284, 0x0,
+	0x2004286, 0x0, 0x2004288, 0x0, 0x200428A, 0x0, 0x200428C, 0x0, 0x200041D, 0x0, 0x200428E, 0x0, 0x2004290, 0x0, 0x2004292, 0x0,
+	0x2004294, 0x0, 0x2004296, 0x0, 0x2004298, 0x0, 0x200429A, 0x0, 0x200429C, 0x0, 0x200429E, 0x0, 0x20042A0, 0x0, 0x20042A2, 0x0,
+	0x20042A4, 0x0, 0x20042A6, 0x0, 0x20042A8, 0x0, 0x20042AA, 0x0, 0x20042AC, 0x0, 0x20042AE, 0x0, 0x20042B0, 0x0, 0x20042B2, 0x0,
+	0x20042B4, 0x0, 0x20042B6, 0x0, 0x20042B8, 0x0, 0x20042BA, 0x0, 0x20042BC, 0x0, 0x20042BE, 0x0, 0x20042C0, 0x0, 0x20042C2, 0x0,
+	0x20042C4, 0x0, 0x20042C6, 0x0, 0x20042C8, 0x0, 0x20042CA, 0x0, 0x20042CC, 0x0, 0x20042CE, 0x0, 0x20042D0, 0x0, 0x20042D2, 0x0,
+	0x0, 0x20042D4, 0x20042D6, 0x20042D8, 0x20042DA, 0x2001D99, 0x20042DC, 0x20042DE, 0x20042E0, 0x20042E2, 0x20042E4, 0x2002D0A, 0x20042E6, 0x2002D12, 0x20042E8, 0x20042EA,
+	0x20042EC, 0x20042EE, 0x20042F0, 0x20042F2, 0x2002D00, 0x20042F4, 0x2002D02, 0x20042F6, 0x20042F8, 0x20042FA, 0x20042FC, 0x20042FE, 0x2004300, 0x2004302, 0x2002D0C, 0x2004304,
+	0x2004306, 0x2004308, 0x2001D9B, 0x200430A, 0x200430C, 0x200430E, 0x2004310, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3004312, 0x3004315, 0x3004318, 0x300431B, 0x300431E, 0x3004321, 0x3004324, 0x3004327, 0x300432A, 0x300432D, 0x3004330, 0x3004333, 0x3004336, 0x3004339, 0x300433C, 0x300433F,
+	0x3004342, 0x3004345, 0x3004348, 0x300434B, 0x300434E, 0x3004351, 0x3004354, 0x3004357, 0x300435A, 0x300435D, 0x3004360, 0x3004363, 0x3004366, 0x3004369, 0x300436C, 0x300436F,
+	0x3004372, 0x3004375, 0x3004378, 0x300437B, 0x300437E, 0x3004381, 0x0, 0x3004384, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004387, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300438A, 0x0, 0x300438D, 0x0, 0x3004390, 0x0, 0x3004393, 0x0, 0x3004396, 0x0, 0x3004399, 0x0, 0x300439C, 0x0, 0x300439F, 0x0,
+	0x30043A2, 0x0, 0x30043A5, 0x0, 0x30043A8, 0x0, 0x30043AB, 0x0, 0x30043AE, 0x0, 0x30043B1, 0x0, 0x30043B4, 0x0, 0x30043B7, 0x0,
+	0x30043BA, 0x0, 0x30043BD, 0x0, 0x30043C0, 0x0, 0x30043C3, 0x0, 0x30043C6, 0x0, 0x30043C9, 0x0, 0x30043CC, 0x0, 0x30043CF, 0x0,
+	0x30043D2, 0x0, 0x30043D5, 0x0, 0x30043D8, 0x0, 0x30043DB, 0x0, 0x30043DE, 0x0, 0x30043E1, 0x0, 0x30043E4, 0x0, 0x30043E7, 0x0,
+	0x30043EA, 0x0, 0x30043ED, 0x0, 0x30043F0, 0x0, 0x30043F3, 0x0, 0x30043F6, 0x0, 0x30043F9, 0x0, 0x30043FC, 0x0, 0x30043FF, 0x0,
+	0x3004402, 0x0, 0x3004405, 0x0, 0x3004408, 0x0, 0x300440B, 0x0, 0x300440E, 0x0, 0x3004411, 0x0, 0x3004414, 0x0, 0x3004417, 0x0,
+	0x300441A, 0x0, 0x300441D, 0x0, 0x3004420, 0x0, 0x3004423, 0x0, 0x3004426, 0x0, 0x3004429, 0x0, 0x300442C, 0x0, 0x300442F, 0x0,
+	0x3004432, 0x0, 0x3004435, 0x0, 0x3004438, 0x0, 0x300443B, 0x0, 0x300443E, 0x0, 0x3004441, 0x0, 0x3004444, 0x0, 0x3004447, 0x0,
+	0x300444A, 0x0, 0x300444D, 0x0, 0x3004450, 0x0, 0x3004453, 0x0, 0x3004456, 0x0, 0x3004459, 0x0, 0x300445C, 0x0, 0x300445F, 0x0,
+	0x3004462, 0x0, 0x3004465, 0x0, 0x3004468, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200446B, 0x0,
+	0x300446D, 0x0, 0x3004470, 0x0, 0x3004473, 0x0, 0x3004476, 0x0, 0x3004479, 0x0, 0x300447C, 0x0, 0x300447F, 0x0, 0x3004482, 0x0,
+	0x3004485, 0x0, 0x3004488, 0x0, 0x300448B, 0x0, 0x300448E, 0x0, 0x3004491, 0x0, 0x3004494, 0x0, 0x3004497, 0x0, 0x300449A, 0x0,
+	0x300449D, 0x0, 0x30044A0, 0x0, 0x30044A3, 0x0, 0x30044A6, 0x0, 0x30044A9, 0x0, 0x30044AC, 0x0, 0x30044AF, 0x0, 0x30044B2, 0x0,
+	0x30044B5, 0x0, 0x30044B8, 0x0, 0x30044BB, 0x0, 0x30044BE, 0x0, 0x30044C1, 0x0, 0x30044C4, 0x0, 0x30044C7, 0x0, 0x30044CA, 0x0,
+	0x30044CD, 0x0, 0x30044D0, 0x0, 0x30044D3, 0x0, 0x30044D6, 0x0, 0x30044D9, 0x0, 0x30044DC, 0x0, 0x30044DF, 0x0, 0x30044E2, 0x0,
+	0x30044E5, 0x0, 0x30044E8, 0x0, 0x30044EB, 0x0, 0x30044EE, 0x0, 0x30044F1, 0x0, 0x30044F4, 0x0, 0x30044F7, 0x0, 0x30044FA, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30044FD, 0x3004500, 0x3004503, 0x3004506, 0x3004509, 0x300450C, 0x300450F, 0x3004512,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004515, 0x3004518, 0x300451B, 0x300451E, 0x3004521, 0x3004524, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004527, 0x300452A, 0x300452D, 0x3004530, 0x3004533, 0x3004536, 0x3004539, 0x300453C,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300453F, 0x3004542, 0x3004545, 0x3004548, 0x300454B, 0x300454E, 0x3004551, 0x3004554,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004557, 0x300455A, 0x300455D, 0x3004560, 0x3004563, 0x3004566, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004569, 0x0, 0x300456C, 0x0, 0x300456F, 0x0, 0x3004572,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004575, 0x3004578, 0x300457B, 0x300457E, 0x3004581, 0x3004584, 0x3004587, 0x300458A,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300458D, 0x3004590, 0x3004593, 0x3004596, 0x3004599, 0x300459C, 0x300459F, 0x30045A2,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30045A5, 0x30045A8, 0x30045AB, 0x30045AE, 0x30045B1, 0x30045B4, 0x30045B7, 0x30045BA,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30045BD, 0x30045C0, 0x30045C3, 0x30045C6, 0x30045C9, 0x30045CC, 0x30045CF, 0x30045D2,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30045D5, 0x30045D8, 0x30045DB, 0x30045DE, 0x30045E1, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30045E4, 0x30045E7, 0x30045EA, 0x30045ED, 0x30045F0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30045F3, 0x30045F6, 0x30045F9, 0x30045FC, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30045FF, 0x3004602, 0x3004605, 0x3004608, 0x300460B, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300460E, 0x3004611, 0x3004614, 0x3004617, 0x300461A, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2000375, 0x0, 0x0, 0x0, 0x100012F, 0x200403D, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x300461D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3004620, 0x3004623, 0x3004626, 0x3004629, 0x300462C, 0x300462F, 0x3004632, 0x3004635, 0x3004638, 0x300463B, 0x300463E, 0x3004641, 0x3004644, 0x3004647, 0x300464A, 0x300464D,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x3004650, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004653, 0x3004656, 0x3004659, 0x300465C, 0x300465F, 0x3004662, 0x3004665, 0x3004668, 0x300466B, 0x300466E,
+	0x3004671, 0x3004674, 0x3004677, 0x300467A, 0x300467D, 0x3004680, 0x3004683, 0x3004686, 0x3004689, 0x300468C, 0x300468F, 0x3004692, 0x3004695, 0x3004698, 0x300469B, 0x300469E,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30046A1, 0x30046A4, 0x30046A7, 0x30046AA, 0x30046AD, 0x30046B0, 0x30046B3, 0x30046B6, 0x30046B9, 0x30046BC, 0x30046BF, 0x30046C2, 0x30046C5, 0x30046C8, 0x30046CB, 0x30046CE,
+	0x30046D1, 0x30046D4, 0x30046D7, 0x30046DA, 0x30046DD, 0x30046E0, 0x30046E3, 0x30046E6, 0x30046E9, 0x30046EC, 0x30046EF, 0x30046F2, 0x30046F5, 0x30046F8, 0x30046FB, 0x30046FE,
+	0x3004701, 0x3004704, 0x3004707, 0x300470A, 0x300470D, 0x3004710, 0x3004713, 0x3004716, 0x3004719, 0x300471C, 0x300471F, 0x3004722, 0x3004725, 0x3004728, 0x300472B, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300472E, 0x0, 0x2002CED, 0x3004731, 0x2004734, 0x0, 0x0, 0x3004736, 0x0, 0x3004739, 0x0, 0x300473C, 0x0, 0x2001DF5, 0x2001E38, 0x2001DF3,
+	0x2001E1A, 0x0, 0x300473F, 0x0, 0x0, 0x3004742, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2004745, 0x2004747,
+	0x3004749, 0x0, 0x300474C, 0x0, 0x300474F, 0x0, 0x3004752, 0x0, 0x3004755, 0x0, 0x3004758, 0x0, 0x300475B, 0x0, 0x300475E, 0x0,
+	0x3004761, 0x0, 0x3004764, 0x0, 0x3004767, 0x0, 0x300476A, 0x0, 0x300476D, 0x0, 0x3004770, 0x0, 0x3004773, 0x0, 0x3004776, 0x0,
+	0x3004779, 0x0, 0x300477C, 0x0, 0x300477F, 0x0, 0x3004782, 0x0, 0x3004785, 0x0, 0x3004788, 0x0, 0x300478B, 0x0, 0x300478E, 0x0,
+	0x3004791, 0x0, 0x3004794, 0x0, 0x3004797, 0x0, 0x300479A, 0x0, 0x300479D, 0x0, 0x30047A0, 0x0, 0x30047A3, 0x0, 0x30047A6, 0x0,
+	0x30047A9, 0x0, 0x30047AC, 0x0, 0x30047AF, 0x0, 0x30047B2, 0x0, 0x30047B5, 0x0, 0x30047B8, 0x0, 0x30047BB, 0x0, 0x30047BE, 0x0,
+	0x30047C1, 0x0, 0x30047C4, 0x0, 0x30047C7, 0x0, 0x30047CA, 0x0, 0x30047CD, 0x0, 0x30047D0, 0x0, 0x30047D3, 0x0, 0x30047D6, 0x0,
+	0x30047D9, 0x0, 0x30047DC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30047DF, 0x0, 0x30047E2, 0x0, 0x0,
+	0x0, 0x0, 0x30047E5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30047E8, 0x0, 0x30047EB, 0x0, 0x30047EE, 0x0, 0x30047F1, 0x0, 0x30047F4, 0x0, 0x30047F7, 0x0, 0x30047FA, 0x0, 0x30047FD, 0x0,
+	0x3004800, 0x0, 0x3004803, 0x0, 0x3004806, 0x0, 0x3004809, 0x0, 0x300480C, 0x0, 0x300480F, 0x0, 0x3004812, 0x0, 0x3004815, 0x0,
+	0x3004818, 0x0, 0x300481B, 0x0, 0x300481E, 0x0, 0x3004821, 0x0, 0x3004824, 0x0, 0x3004827, 0x0, 0x300482A, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300482D, 0x0, 0x3004830, 0x0, 0x3004833, 0x0, 0x3004836, 0x0, 0x3004839, 0x0, 0x300483C, 0x0, 0x300483F, 0x0, 0x3004842, 0x0,
+	0x3004845, 0x0, 0x3004848, 0x0, 0x300484B, 0x0, 0x300484E, 0x0, 0x3004851, 0x0, 0x3004854, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x3004857, 0x0, 0x300485A, 0x0, 0x3002CE7, 0x0, 0x300485D, 0x0, 0x3004860, 0x0, 0x3004863, 0x0, 0x3004866, 0x0,
+	0x0, 0x0, 0x3004869, 0x0, 0x300486C, 0x0, 0x300486F, 0x0, 0x3004872, 0x0, 0x3004875, 0x0, 0x3004878, 0x0, 0x300487B, 0x0,
+	0x300487E, 0x0, 0x3004881, 0x0, 0x3004884, 0x0, 0x3004887, 0x0, 0x300488A, 0x0, 0x300488D, 0x0, 0x3004890, 0x0, 0x3004893, 0x0,
+	0x3004896, 0x0, 0x3004899, 0x0, 0x300489C, 0x0, 0x300489F, 0x0, 0x30048A2, 0x0, 0x30048A5, 0x0, 0x30048A8, 0x0, 0x30048AB, 0x0,
+	0x30048AE, 0x0, 0x30048B1, 0x0, 0x30048B4, 0x0, 0x30048B7, 0x0, 0x30048BA, 0x0, 0x30048BD, 0x0, 0x30048C0, 0x0, 0x3002CE0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30048C3, 0x0, 0x30048C6, 0x0, 0x30048C9, 0x30048CC, 0x0,
+	0x30048CF, 0x0, 0x30048D2, 0x0, 0x30048D5, 0x0, 0x30048D8, 0x0, 0x0, 0x0, 0x0, 0x30048DB, 0x0, 0x2001E24, 0x0, 0x0,
+	0x30048DE, 0x0, 0x30048E1, 0x0, 0x0, 0x0, 0x30048E4, 0x0, 0x30048E7, 0x0, 0x30048EA, 0x0, 0x30048ED, 0x0, 0x30048F0, 0x0,
+	0x30048F3, 0x0, 0x30048F6, 0x0, 0x30048F9, 0x0, 0x30048FC, 0x0, 0x30048FF, 0x0, 0x2001D63, 0x2001DFE, 0x2001E22, 0x2004902, 0x0, 0x0,
+	0x2004904, 0x2004906, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3004908, 0x300490B, 0x300490E, 0x3004911, 0x3004914, 0x3004917, 0x300491A, 0x300491D, 0x3004920, 0x3004923, 0x3004926, 0x3004929, 0x300492C, 0x300492F, 0x3004932,
+	0x3004935, 0x3004938, 0x300493B, 0x300493E, 0x3004941, 0x3004944, 0x3004947, 0x300494A, 0x300494D, 0x3004950, 0x3004953, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4004956, 0x400495A, 0x400495E, 0x4004962, 0x4004966, 0x400496A, 0x400496E, 0x4004972, 0x4004976, 0x400497A, 0x400497E, 0x4004982, 0x4004986, 0x400498A, 0x400498E, 0x4004992,
+	0x4004996, 0x400499A, 0x400499E, 0x40049A2, 0x40049A6, 0x40049AA, 0x40049AE, 0x40049B2, 0x40049B6, 0x40049BA, 0x40049BE, 0x40049C2, 0x40049C6, 0x40049CA, 0x40049CE, 0x40049D2,
+	0x40049D6, 0x40049DA, 0x40049DE, 0x40049E2, 0x40049E6, 0x40049EA, 0x40049EE, 0x40049F2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40049F6, 0x40049FA, 0x40049FE, 0x4004A02, 0x4004A06, 0x4004A0A, 0x4004A0E, 0x4004A12, 0x4004A16, 0x4004A1A, 0x4004A1E, 0x4004A22, 0x4004A26, 0x4004A2A, 0x4004A2E, 0x4004A32,
+	0x4004A36, 0x4004A3A, 0x4004A3E, 0x4004A42, 0x4004A46, 0x4004A4A, 0x4004A4E, 0x4004A52, 0x4004A56, 0x4004A5A, 0x4004A5E, 0x4004A62, 0x4004A66, 0x4004A6A, 0x4004A6E, 0x4004A72,
+};
+const uint32_t* LowercaseDataPtr = LowercaseData;
+
+const uint32_t TitlecaseIndex1[272] = {
+	0, 128, 256, 45, 45, 45, 45, 45, 45, 45, 384, 45, 45, 45, 45, 512,
+	640, 768, 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, 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, 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, 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, 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, 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,
+	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, 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, 45, 45, 45, 45, 45, 45,
+	45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+};
+const uint32_t* TitlecaseIndex1Ptr = TitlecaseIndex1;
+
+const uint32_t TitlecaseIndex2[896] = {
+	0x0, 0x0, 0x0, 0x20, 0x0, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0x100, 0x120, 0x140, 0x160, 0x180,
+	0x1A0, 0x1C0, 0x1E0, 0x200, 0x220, 0x0, 0x0, 0x0, 0x0, 0x0, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0,
+	0x0, 0x300, 0x320, 0x340, 0x360, 0x380, 0x3A0, 0x3C0, 0x3E0, 0x400, 0x0, 0x420, 0x440, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x460, 0x0, 0x0, 0x0, 0x0,
+	0x480, 0x4A0, 0x4C0, 0x4E0, 0x500, 0x520, 0x540, 0x560, 0x580, 0x5A0, 0x5C0, 0x5E0, 0x600, 0x620, 0x640, 0x660,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x680, 0x6A0, 0x6C0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6E0, 0x700, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x720, 0x740, 0x760, 0x780, 0x7A0, 0x7C0, 0x7E0, 0x800, 0x820, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x840, 0x860, 0x880, 0x0, 0x0, 0x0, 0x0, 0x8A0, 0x8C0, 0x8E0, 0x900, 0x920, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x940, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x960, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x980, 0x9A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+const uint32_t* TitlecaseIndex2Ptr = TitlecaseIndex2;
+
+const uint32_t TitlecaseData[2528] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x1000000, 0x1000633, 0x1000012, 0x10000C9, 0x1000015, 0x1000697, 0x10000ED, 0x1000105, 0x1000021, 0x1000126, 0x100012C, 0x1000132, 0x10006FF, 0x100002D, 0x1000030,
+	0x1000751, 0x1001EFC, 0x1000168, 0x100017A, 0x1000192, 0x100003F, 0x10007E1, 0x10001C2, 0x100080B, 0x100004B, 0x10001D1, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x2003358, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2004A76,
+	0x20034B3, 0x20034B5, 0x20034B7, 0x20034B9, 0x20034BB, 0x20034BD, 0x2000243, 0x20034BF, 0x20034C1, 0x20034C3, 0x20034C5, 0x20034C7, 0x20034C9, 0x20034CB, 0x20034CD, 0x20034CF,
+	0x20034D1, 0x20034D3, 0x20034D5, 0x20034D7, 0x20034D9, 0x20034DB, 0x20034DD, 0x0, 0x2000290, 0x20034DF, 0x20034E1, 0x20034E3, 0x20034E5, 0x20034E7, 0x20034E9, 0x20034EB,
+	0x0, 0x20034ED, 0x0, 0x20034EF, 0x0, 0x20034F1, 0x0, 0x20034F3, 0x0, 0x20034F5, 0x0, 0x20034F7, 0x0, 0x20034F9, 0x0, 0x20034FB,
+	0x0, 0x20034FD, 0x0, 0x20034FF, 0x0, 0x2003501, 0x0, 0x2003503, 0x0, 0x2003505, 0x0, 0x2003507, 0x0, 0x2003509, 0x0, 0x200350B,
+	0x0, 0x200350D, 0x0, 0x200350F, 0x0, 0x2003511, 0x0, 0x2002CE3, 0x0, 0x2003513, 0x0, 0x2003515, 0x0, 0x2003517, 0x0, 0x2003519,
+	0x0, 0x1000021, 0x0, 0x200351B, 0x0, 0x200351D, 0x0, 0x200351F, 0x0, 0x0, 0x2003521, 0x0, 0x2003523, 0x0, 0x2003525, 0x0,
+	0x2003527, 0x0, 0x2003529, 0x0, 0x200352B, 0x0, 0x200352D, 0x0, 0x200352F, 0x3003531, 0x0, 0x2003534, 0x0, 0x2003536, 0x0, 0x2003538,
+	0x0, 0x200353A, 0x0, 0x200353C, 0x0, 0x200353E, 0x0, 0x2003540, 0x0, 0x2003542, 0x0, 0x2003544, 0x0, 0x2003546, 0x0, 0x2003548,
+	0x0, 0x200354A, 0x0, 0x200354C, 0x0, 0x200354E, 0x0, 0x2003550, 0x0, 0x2003552, 0x0, 0x2003554, 0x0, 0x2003556, 0x0, 0x2003558,
+	0x0, 0x200355A, 0x0, 0x200355C, 0x0, 0x200355E, 0x0, 0x2003560, 0x0, 0x0, 0x2003562, 0x0, 0x2003564, 0x0, 0x2003566, 0x100017A,
+	0x2003568, 0x0, 0x0, 0x200356A, 0x0, 0x200356C, 0x0, 0x0, 0x200356E, 0x0, 0x0, 0x0, 0x2003570, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x2003572, 0x0, 0x0, 0x2003574, 0x0, 0x0, 0x0, 0x2003576, 0x2003578, 0x0, 0x0, 0x0, 0x200357A, 0x0,
+	0x0, 0x200357C, 0x0, 0x200357E, 0x0, 0x2003580, 0x0, 0x0, 0x2003582, 0x0, 0x0, 0x0, 0x0, 0x2003584, 0x0, 0x0,
+	0x2003586, 0x0, 0x0, 0x0, 0x2003588, 0x0, 0x200358A, 0x0, 0x0, 0x200358C, 0x0, 0x0, 0x0, 0x200358E, 0x0, 0x2003590,
+	0x0, 0x0, 0x0, 0x0, 0x2004A78, 0x0, 0x2004A78, 0x2004A7A, 0x0, 0x2004A7A, 0x2004A7C, 0x0, 0x2004A7C, 0x0, 0x2003598, 0x0,
+	0x200359A, 0x0, 0x200359C, 0x0, 0x200359E, 0x0, 0x20035A0, 0x0, 0x20035A2, 0x0, 0x20035A4, 0x0, 0x20035A6, 0x2001DEF, 0x0, 0x20035A8,
+	0x0, 0x20035AA, 0x0, 0x20035AC, 0x0, 0x20035AE, 0x0, 0x20035B0, 0x0, 0x20035B2, 0x0, 0x20035B4, 0x0, 0x20035B6, 0x0, 0x20035B8,
+	0x30035BA, 0x2004A7E, 0x0, 0x2004A7E, 0x0, 0x20035BF, 0x0, 0x0, 0x0, 0x20035C1, 0x0, 0x20035C3, 0x0, 0x20035C5, 0x0, 0x20035C7,
+	0x0, 0x20035C9, 0x0, 0x20035CB, 0x0, 0x20035CD, 0x0, 0x20035CF, 0x0, 0x20035D1, 0x0, 0x20035D3, 0x0, 0x20035D5, 0x0, 0x20035D7,
+	0x0, 0x20035D9, 0x0, 0x20035DB, 0x0, 0x20035DD, 0x0, 0x20035DF, 0x0, 0x20035E1, 0x0, 0x20035E3, 0x0, 0x20035E5, 0x0, 0x20035E7,
+	0x0, 0x0, 0x0, 0x2001DF1, 0x0, 0x20035E9, 0x0, 0x20035EB, 0x0, 0x20035ED, 0x0, 0x20035EF, 0x0, 0x20035F1, 0x0, 0x20035F3,
+	0x0, 0x20035F5, 0x0, 0x20035F7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20035F9, 0x0, 0x0, 0x30035FB,
+	0x30035FE, 0x0, 0x2003601, 0x0, 0x0, 0x0, 0x0, 0x2003603, 0x0, 0x2003605, 0x0, 0x2003607, 0x0, 0x2003609, 0x0, 0x200360B,
+	0x300360D, 0x3003610, 0x3003613, 0x2003616, 0x2003618, 0x0, 0x200361A, 0x200361C, 0x0, 0x200361E, 0x0, 0x2001EF3, 0x3003620, 0x0, 0x0, 0x0,
+	0x2003623, 0x3003625, 0x0, 0x2003628, 0x0, 0x300362A, 0x300362D, 0x0, 0x2003630, 0x2003632, 0x0, 0x3003634, 0x3003637, 0x0, 0x0, 0x200363A,
+	0x0, 0x300363C, 0x200363F, 0x0, 0x0, 0x2003641, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003643, 0x0, 0x0,
+	0x2003646, 0x0, 0x0, 0x2003648, 0x0, 0x0, 0x0, 0x300364A, 0x200364D, 0x200364F, 0x2003651, 0x2003653, 0x2003655, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x2000267, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003657, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x2000339, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x200365A, 0x0, 0x200365C, 0x0, 0x0, 0x0, 0x200365E, 0x0, 0x0, 0x0, 0x2003660, 0x2003662, 0x2003664, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6003666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200366C, 0x200366E, 0x2003670, 0x2003672,
+	0x6003674, 0x200032B, 0x200334E, 0x2001F07, 0x2003350, 0x2000331, 0x2003352, 0x2000335, 0x2001D95, 0x2000339, 0x2003354, 0x2003356, 0x2003358, 0x200335A, 0x200335C, 0x200033D,
+	0x2001F09, 0x2000E35, 0x2001D97, 0x2001D97, 0x200335E, 0x2000341, 0x2003360, 0x2003362, 0x2003364, 0x2000345, 0x200367A, 0x200367C, 0x200367E, 0x2003680, 0x2003682, 0x0,
+	0x200334E, 0x2001D95, 0x0, 0x0, 0x0, 0x2003360, 0x2001F09, 0x2003684, 0x0, 0x2003686, 0x0, 0x2003688, 0x0, 0x200337A, 0x0, 0x200368A,
+	0x0, 0x200368C, 0x0, 0x200368E, 0x0, 0x2003690, 0x0, 0x2003692, 0x0, 0x2003694, 0x0, 0x2003696, 0x0, 0x2003698, 0x0, 0x200369A,
+	0x2003354, 0x2000E35, 0x200369C, 0x200369E, 0x0, 0x2000331, 0x0, 0x0, 0x20036A0, 0x0, 0x0, 0x20036A2, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x20003D1, 0x20036A4, 0x20036A6, 0x2000389, 0x20036A8, 0x2000381, 0x20003C9, 0x20003F9, 0x2000395, 0x20036AA, 0x2000391, 0x20036AC, 0x20036AE, 0x20036B0, 0x2000411, 0x20036B2,
+	0x20036B4, 0x20036B6, 0x20036B8, 0x2000399, 0x20036BA, 0x20036BC, 0x20036BE, 0x2000441, 0x20036C0, 0x20036C2, 0x20036C4, 0x2000449, 0x20036C6, 0x2000421, 0x20036C8, 0x20036CA,
+	0x20036CC, 0x20036CE, 0x20036D0, 0x20036D2, 0x20036D4, 0x20036D6, 0x200038D, 0x20036D8, 0x20036DA, 0x20036DC, 0x20036DE, 0x20036E0, 0x20036E2, 0x20036E4, 0x20036E6, 0x20036E8,
+	0x0, 0x20036EA, 0x0, 0x20036EC, 0x0, 0x20036EE, 0x0, 0x20036F0, 0x0, 0x20036F2, 0x0, 0x20036F4, 0x0, 0x20036F6, 0x0, 0x20036F8,
+	0x0, 0x20036FA, 0x0, 0x20036FC, 0x0, 0x20003C1, 0x0, 0x20036FE, 0x0, 0x2003700, 0x0, 0x2003702, 0x0, 0x2003704, 0x0, 0x2003706,
+	0x0, 0x2003708, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200370A, 0x0, 0x200370C, 0x0, 0x200370E,
+	0x0, 0x2003710, 0x0, 0x2003712, 0x0, 0x2003714, 0x0, 0x2003716, 0x0, 0x2003718, 0x0, 0x200371A, 0x0, 0x200371C, 0x0, 0x200371E,
+	0x0, 0x2003720, 0x0, 0x2003722, 0x0, 0x2003724, 0x0, 0x2003726, 0x0, 0x2003728, 0x0, 0x200372A, 0x0, 0x200372C, 0x0, 0x200372E,
+	0x0, 0x2003730, 0x0, 0x2003732, 0x0, 0x2003734, 0x0, 0x2003736, 0x0, 0x2003738, 0x0, 0x200373A, 0x0, 0x200373C, 0x0, 0x200373E,
+	0x0, 0x0, 0x2003740, 0x0, 0x2003742, 0x0, 0x2003744, 0x0, 0x2003746, 0x0, 0x2003748, 0x0, 0x200374A, 0x0, 0x200374C, 0x200374E,
+	0x0, 0x2003750, 0x0, 0x2003752, 0x0, 0x2003754, 0x0, 0x2003756, 0x0, 0x20003E9, 0x0, 0x2003758, 0x0, 0x200375A, 0x0, 0x200375C,
+	0x0, 0x200375E, 0x0, 0x2003760, 0x0, 0x2003762, 0x0, 0x2003764, 0x0, 0x2000419, 0x0, 0x2003766, 0x0, 0x2003768, 0x0, 0x200376A,
+	0x0, 0x200376C, 0x0, 0x200376E, 0x0, 0x2003770, 0x0, 0x2003772, 0x0, 0x2003774, 0x0, 0x2003776, 0x0, 0x2003778, 0x0, 0x200377A,
+	0x0, 0x200377C, 0x0, 0x200377E, 0x0, 0x2003780, 0x0, 0x2003782, 0x0, 0x2003784, 0x0, 0x2003786, 0x0, 0x2003788, 0x0, 0x200378A,
+	0x0, 0x200378C, 0x0, 0x200378E, 0x0, 0x2003790, 0x0, 0x2003792, 0x0, 0x2003794, 0x0, 0x2003796, 0x0, 0x2003798, 0x0, 0x200379A,
+	0x0, 0x200379C, 0x0, 0x200379E, 0x0, 0x20037A0, 0x0, 0x20037A2, 0x0, 0x20037A4, 0x0, 0x20037A6, 0x0, 0x20037A8, 0x0, 0x20037AA,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x20037AC, 0x20037AE, 0x20037B0, 0x20037B2, 0x20037B4, 0x20037B6, 0x20037B8, 0x20037BA, 0x20037BC, 0x20037BE, 0x20037C0, 0x20037C2, 0x20037C4, 0x20037C6, 0x20037C8,
+	0x20037CA, 0x20037CC, 0x20037CE, 0x20037D0, 0x20037D2, 0x20037D4, 0x20037D6, 0x20037D8, 0x20037DA, 0x20037DC, 0x20037DE, 0x20037E0, 0x20037E2, 0x20037E4, 0x20037E6, 0x20037E8,
+	0x20037EA, 0x20037EC, 0x20037EE, 0x20037F0, 0x20037F2, 0x20037F4, 0x20037F6, 0x4004A80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30037FC, 0x0, 0x0, 0x0, 0x30037FF, 0x0, 0x0,
+	0x0, 0x3003802, 0x0, 0x3003805, 0x0, 0x3003808, 0x0, 0x300380B, 0x0, 0x300380E, 0x0, 0x3003811, 0x0, 0x3003814, 0x0, 0x3003817,
+	0x0, 0x300381A, 0x0, 0x300381D, 0x0, 0x3003820, 0x0, 0x3003823, 0x0, 0x3003826, 0x0, 0x3003829, 0x0, 0x300382C, 0x0, 0x300382F,
+	0x0, 0x3003832, 0x0, 0x3003835, 0x0, 0x3003838, 0x0, 0x300383B, 0x0, 0x300383E, 0x0, 0x3003841, 0x0, 0x3003844, 0x0, 0x3003847,
+	0x0, 0x300384A, 0x0, 0x300384D, 0x0, 0x3003850, 0x0, 0x3003853, 0x0, 0x3003856, 0x0, 0x3003859, 0x0, 0x300385C, 0x0, 0x300385F,
+	0x0, 0x3003862, 0x0, 0x3003865, 0x0, 0x3003868, 0x0, 0x300386B, 0x0, 0x300386E, 0x0, 0x3003871, 0x0, 0x3003874, 0x0, 0x3003877,
+	0x0, 0x300387A, 0x0, 0x300387D, 0x0, 0x3003880, 0x0, 0x3003883, 0x0, 0x3003886, 0x0, 0x3003889, 0x0, 0x300388C, 0x0, 0x300388F,
+	0x0, 0x3003892, 0x0, 0x3003895, 0x0, 0x3003898, 0x0, 0x300389B, 0x0, 0x300389E, 0x0, 0x30038A1, 0x0, 0x30038A4, 0x0, 0x30038A7,
+	0x0, 0x30038AA, 0x0, 0x30038AD, 0x0, 0x30038B0, 0x0, 0x30038B3, 0x0, 0x30038B6, 0x0, 0x30038B9, 0x0, 0x30038BC, 0x0, 0x30038BF,
+	0x0, 0x30038C2, 0x0, 0x30038C5, 0x0, 0x30038C8, 0x0, 0x30038CB, 0x0, 0x30038CE, 0x0, 0x30038D1, 0x0, 0x30038D4, 0x0, 0x30038D7,
+	0x0, 0x30038DA, 0x0, 0x30038DD, 0x0, 0x30038E0, 0x30038E3, 0x30038E6, 0x30038E9, 0x30038EC, 0x30038EF, 0x3003892, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x30038F2, 0x0, 0x30038F5, 0x0, 0x30038F8, 0x0, 0x30038FB, 0x0, 0x30038FE, 0x0, 0x3003901, 0x0, 0x3003904, 0x0, 0x3003907,
+	0x0, 0x300390A, 0x0, 0x300390D, 0x0, 0x3003910, 0x0, 0x3003913, 0x0, 0x3003916, 0x0, 0x3003919, 0x0, 0x300391C, 0x0, 0x300391F,
+	0x0, 0x3003922, 0x0, 0x3003925, 0x0, 0x3003928, 0x0, 0x300392B, 0x0, 0x300392E, 0x0, 0x3003931, 0x0, 0x3003934, 0x0, 0x3003937,
+	0x0, 0x300393A, 0x0, 0x300393D, 0x0, 0x3003940, 0x0, 0x3003943, 0x0, 0x3003946, 0x0, 0x3003949, 0x0, 0x300394C, 0x0, 0x300394F,
+	0x0, 0x3003952, 0x0, 0x3003955, 0x0, 0x3003958, 0x0, 0x300395B, 0x0, 0x300395E, 0x0, 0x3003961, 0x0, 0x3003964, 0x0, 0x3003967,
+	0x0, 0x300396A, 0x0, 0x300396D, 0x0, 0x3003970, 0x0, 0x3003973, 0x0, 0x3003976, 0x0, 0x3003979, 0x0, 0x300397C, 0x0, 0x300397F,
+	0x3003982, 0x3003985, 0x3003988, 0x300398B, 0x300398E, 0x3003991, 0x3003994, 0x3003997, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300399A, 0x300399D, 0x30039A0, 0x30039A3, 0x30039A6, 0x30039A9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30039AC, 0x30039AF, 0x30039B2, 0x30039B5, 0x30039B8, 0x30039BB, 0x30039BE, 0x30039C1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30039C4, 0x30039C7, 0x30039CA, 0x30039CD, 0x30039D0, 0x30039D3, 0x30039D6, 0x30039D9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30039DC, 0x30039DF, 0x30039E2, 0x30039E5, 0x30039E8, 0x30039EB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40039EE, 0x30039F2, 0x60039F5, 0x30039FB, 0x60039FE, 0x3003A04, 0x6003A07, 0x3003A0D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003A10, 0x3003A13, 0x3003A16, 0x3003A19, 0x3003A1C, 0x3003A1F, 0x3003A22, 0x3003A25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003A28, 0x3003A2B, 0x3003A2E, 0x3003A31, 0x3003A34, 0x3003A37, 0x3003A3A, 0x3003A3D, 0x3003A40, 0x3003A43, 0x3003A46, 0x3003A49, 0x3003A4C, 0x3003A4F, 0x0, 0x0,
+	0x3004A84, 0x3004A87, 0x3004A8A, 0x3004A8D, 0x3004A90, 0x3004A93, 0x3004A96, 0x3004A99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3004A9C, 0x3004A9F, 0x3004AA2, 0x3004AA5, 0x3004AA8, 0x3004AAB, 0x3004AAE, 0x3004AB1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3004AB4, 0x3004AB7, 0x3004ABA, 0x3004ABD, 0x3004AC0, 0x3004AC3, 0x3004AC6, 0x3004AC9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003ACA, 0x3003ACD, 0x5004ACC, 0x3004AD1, 0x4004AD4, 0x0, 0x4003ADD, 0x6004AD8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2000339, 0x0,
+	0x0, 0x0, 0x5004ADE, 0x3004AE3, 0x4004AE6, 0x0, 0x4003AF4, 0x6004AEA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003AFE, 0x3003B01, 0x6003B04, 0x6003666, 0x0, 0x0, 0x4003B0A, 0x6003B0E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003B14, 0x3003B17, 0x6003B1A, 0x6003674, 0x4003B20, 0x3003B24, 0x4003B27, 0x6003B2B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x5004AF0, 0x3004AF5, 0x4004AF8, 0x0, 0x4003B3E, 0x6004AFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003B48, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003B4B, 0x3003B4E, 0x3003B51, 0x3003B54, 0x3003B57, 0x3003B5A, 0x3003B5D, 0x3003B60, 0x3003B63, 0x3003B66, 0x3003B69, 0x3003B6C, 0x3003B6F, 0x3003B72, 0x3003B75, 0x3003B78,
+	0x0, 0x0, 0x0, 0x0, 0x3003B7B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003B7E, 0x3003B81, 0x3003B84, 0x3003B87, 0x3003B8A, 0x3003B8D, 0x3003B90, 0x3003B93, 0x3003B96, 0x3003B99, 0x3003B9C, 0x3003B9F, 0x3003BA2, 0x3003BA5, 0x3003BA8, 0x3003BAB,
+	0x3003BAE, 0x3003BB1, 0x3003BB4, 0x3003BB7, 0x3003BBA, 0x3003BBD, 0x3003BC0, 0x3003BC3, 0x3003BC6, 0x3003BC9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003BCC, 0x3003BCF, 0x3003BD2, 0x3003BD5, 0x3003BD8, 0x3003BDB, 0x3003BDE, 0x3003BE1, 0x3003BE4, 0x3003BE7, 0x3003BEA, 0x3003BED, 0x3003BF0, 0x3003BF3, 0x3003BF6, 0x3003BF9,
+	0x3003BFC, 0x3003BFF, 0x3003C02, 0x3003C05, 0x3003C08, 0x3003C0B, 0x3003C0E, 0x3003C11, 0x3003C14, 0x3003C17, 0x3003C1A, 0x3003C1D, 0x3003C20, 0x3003C23, 0x3003C26, 0x3003C29,
+	0x3003C2C, 0x3003C2F, 0x3003C32, 0x3003C35, 0x3003C38, 0x3003C3B, 0x3003C3E, 0x3003C41, 0x3003C44, 0x3003C47, 0x3003C4A, 0x3003C4D, 0x3003C50, 0x3003C53, 0x3003C56, 0x0,
+	0x0, 0x3003C59, 0x0, 0x0, 0x0, 0x2003C5C, 0x2003C5E, 0x0, 0x3003C60, 0x0, 0x3003C63, 0x0, 0x3003C66, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x3003C69, 0x0, 0x0, 0x3003C6C, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003C6F, 0x0, 0x3003C72, 0x0, 0x3003C75, 0x0, 0x3003C78, 0x0, 0x3003C7B, 0x0, 0x3003C7E, 0x0, 0x3003C81, 0x0, 0x3003C84,
+	0x0, 0x3003C87, 0x0, 0x3003C8A, 0x0, 0x3003C8D, 0x0, 0x3003C90, 0x0, 0x3003C93, 0x0, 0x3003C96, 0x0, 0x3003C99, 0x0, 0x3003C9C,
+	0x0, 0x3003C9F, 0x0, 0x3003CA2, 0x0, 0x3003CA5, 0x0, 0x3003CA8, 0x0, 0x3003CAB, 0x0, 0x3003CAE, 0x0, 0x3003CB1, 0x0, 0x3003CB4,
+	0x0, 0x3003CB7, 0x0, 0x3003CBA, 0x0, 0x3003CBD, 0x0, 0x3003CC0, 0x0, 0x3003CC3, 0x0, 0x3003CC6, 0x0, 0x3003CC9, 0x0, 0x3003CCC,
+	0x0, 0x3003CCF, 0x0, 0x3003CD2, 0x0, 0x3003CD5, 0x0, 0x3003CD8, 0x0, 0x3003CDB, 0x0, 0x3003CDE, 0x0, 0x3003CE1, 0x0, 0x3003CE4,
+	0x0, 0x3003CE7, 0x0, 0x3003CEA, 0x0, 0x3003CED, 0x0, 0x3003CF0, 0x0, 0x3003CF3, 0x0, 0x3003CF6, 0x0, 0x3003CF9, 0x0, 0x3003CFC,
+	0x0, 0x3003CFF, 0x0, 0x3003D02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003D05, 0x0, 0x3003D08, 0x0,
+	0x0, 0x0, 0x0, 0x3003D0B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3003D0E, 0x3003D11, 0x3003D14, 0x3003D17, 0x3003D1A, 0x3003D1D, 0x3003D20, 0x3003D23, 0x3003D26, 0x3003D29, 0x3003D2C, 0x3003D2F, 0x3003D32, 0x3003D35, 0x3003D38, 0x3003D3B,
+	0x3003D3E, 0x3003D41, 0x3003D44, 0x3003D47, 0x3003D4A, 0x3003D4D, 0x3003D50, 0x3003D53, 0x3003D56, 0x3003D59, 0x3003D5C, 0x3003D5F, 0x3003D62, 0x3003D65, 0x3003D68, 0x3003D6B,
+	0x3003D6E, 0x3003D71, 0x3003D74, 0x3003D77, 0x3003D7A, 0x3003D7D, 0x0, 0x3003D80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003D83, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003D86, 0x0, 0x3003D89, 0x0, 0x3003D8C, 0x0, 0x3003D8F, 0x0, 0x3003D92, 0x0, 0x3003D95, 0x0, 0x3003D98, 0x0, 0x3003D9B,
+	0x0, 0x3003D9E, 0x0, 0x3003DA1, 0x0, 0x3003DA4, 0x0, 0x3003DA7, 0x0, 0x3003DAA, 0x0, 0x3003DAD, 0x0, 0x3003DB0, 0x0, 0x3003DB3,
+	0x0, 0x3003DB6, 0x0, 0x3003DB9, 0x0, 0x3003DBC, 0x0, 0x3003DBF, 0x0, 0x3003DC2, 0x0, 0x3003DC5, 0x0, 0x3003DC8, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003DCB, 0x0, 0x3003DCE, 0x0, 0x3003DD1, 0x0, 0x3003DD4, 0x0, 0x3003DD7, 0x0, 0x3003DDA, 0x0, 0x3003DDD, 0x0, 0x3003DE0,
+	0x0, 0x3003DE3, 0x0, 0x3003DE6, 0x0, 0x3003DE9, 0x0, 0x3003DEC, 0x0, 0x3003DEF, 0x0, 0x3003DF2, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x3003DF5, 0x0, 0x3003DF8, 0x0, 0x3003DFB, 0x0, 0x3003DFE, 0x0, 0x3003E01, 0x0, 0x3003E04, 0x0, 0x3003E07,
+	0x0, 0x0, 0x0, 0x3003E0A, 0x0, 0x3003E0D, 0x0, 0x3003E10, 0x0, 0x3003E13, 0x0, 0x3003E16, 0x0, 0x3003E19, 0x0, 0x3003E1C,
+	0x0, 0x3003E1F, 0x0, 0x3003E22, 0x0, 0x3003E25, 0x0, 0x3003E28, 0x0, 0x3003E2B, 0x0, 0x3003E2E, 0x0, 0x3003E31, 0x0, 0x3003E34,
+	0x0, 0x3003E37, 0x0, 0x3003E3A, 0x0, 0x3003E3D, 0x0, 0x3003E40, 0x0, 0x3003E43, 0x0, 0x3003E46, 0x0, 0x3003E49, 0x0, 0x3003E4C,
+	0x0, 0x3003E4F, 0x0, 0x3003E52, 0x0, 0x3003E55, 0x0, 0x3003E58, 0x0, 0x3003E5B, 0x0, 0x3003E5E, 0x0, 0x3003E61, 0x0, 0x3003E64,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3003E67, 0x0, 0x3003E6A, 0x0, 0x0, 0x3003E6D,
+	0x0, 0x3003E70, 0x0, 0x3003E73, 0x0, 0x3003E76, 0x0, 0x3003E79, 0x0, 0x0, 0x0, 0x0, 0x3003E7C, 0x0, 0x0, 0x0,
+	0x0, 0x3003E7F, 0x0, 0x3003E82, 0x0, 0x0, 0x0, 0x3003E85, 0x0, 0x3003E88, 0x0, 0x3003E8B, 0x0, 0x3003E8E, 0x0, 0x3003E91,
+	0x0, 0x3003E94, 0x0, 0x3003E97, 0x0, 0x3003E9A, 0x0, 0x3003E9D, 0x0, 0x3003EA0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2004B02, 0x2004B04, 0x2004B06, 0x3004B08, 0x3004B0B, 0x2004B0E, 0x2004B0E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x4004B10, 0x4004B14, 0x4004B18, 0x4004B1C, 0x4004B20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3003EC5, 0x3003EC8, 0x3003ECB, 0x3003ECE, 0x3003ED1, 0x3003ED4, 0x3003ED7, 0x3003EDA, 0x3003EDD, 0x3003EE0, 0x3003EE3, 0x3003EE6, 0x3003EE9, 0x3003EEC, 0x3003EEF,
+	0x3003EF2, 0x3003EF5, 0x3003EF8, 0x3003EFB, 0x3003EFE, 0x3003F01, 0x3003F04, 0x3003F07, 0x3003F0A, 0x3003F0D, 0x3003F10, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4003F13, 0x4003F17, 0x4003F1B, 0x4003F1F, 0x4003F23, 0x4003F27, 0x4003F2B, 0x4003F2F,
+	0x4003F33, 0x4003F37, 0x4003F3B, 0x4003F3F, 0x4003F43, 0x4003F47, 0x4003F4B, 0x4003F4F, 0x4003F53, 0x4003F57, 0x4003F5B, 0x4003F5F, 0x4003F63, 0x4003F67, 0x4003F6B, 0x4003F6F,
+	0x4003F73, 0x4003F77, 0x4003F7B, 0x4003F7F, 0x4003F83, 0x4003F87, 0x4003F8B, 0x4003F8F, 0x4003F93, 0x4003F97, 0x4003F9B, 0x4003F9F, 0x4003FA3, 0x4003FA7, 0x4003FAB, 0x4003FAF,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4003FB3, 0x4003FB7, 0x4003FBB, 0x4003FBF, 0x4003FC3, 0x4003FC7, 0x4003FCB, 0x4003FCF, 0x4003FD3, 0x4003FD7, 0x4003FDB, 0x4003FDF, 0x4003FE3, 0x4003FE7, 0x4003FEB, 0x4003FEF,
+	0x4003FF3, 0x4003FF7, 0x4003FFB, 0x4003FFF, 0x4004003, 0x4004007, 0x400400B, 0x400400F, 0x4004013, 0x4004017, 0x400401B, 0x400401F, 0x4004023, 0x4004027, 0x400402B, 0x400402F,
+};
+const uint32_t* TitlecaseDataPtr = TitlecaseData;
+
+const uint32_t CaseFoldingIndex1[272] = {
+	0, 128, 256, 384, 360, 360, 360, 360, 360, 360, 512, 360, 360, 360, 360, 640,
+	768, 896, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+	360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+};
+const uint32_t* CaseFoldingIndex1Ptr = CaseFoldingIndex1;
+
+const uint32_t CaseFoldingIndex2[1024] = {
+	0x0, 0x0, 0x20, 0x0, 0x0, 0x40, 0x60, 0x0, 0x80, 0xA0, 0xC0, 0xE0, 0x100, 0x120, 0x140, 0x160,
+	0x180, 0x1A0, 0x1C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1E0, 0x200, 0x220, 0x240, 0x260, 0x280,
+	0x2A0, 0x2C0, 0x0, 0x2E0, 0x300, 0x320, 0x340, 0x360, 0x380, 0x3A0, 0x3C0, 0x0, 0x3E0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x400, 0x420, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x440, 0x460, 0x480, 0x4A0, 0x4C0, 0x4E0, 0x500, 0x520, 0x540, 0x560, 0x580, 0x5A0, 0x5C0, 0x5E0, 0x600, 0x620,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x640, 0x0, 0x660, 0x680, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x6A0, 0x6C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x6E0, 0x700, 0x0, 0x720, 0x740, 0x760, 0x780, 0x7A0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x7C0, 0x7E0, 0x800, 0x0, 0x0, 0x0, 0x0, 0x820, 0x840, 0x860, 0x880, 0x8A0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8C0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8E0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x900, 0x920, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x940, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+const uint32_t* CaseFoldingIndex2Ptr = CaseFoldingIndex2;
+
+const uint32_t CaseFoldingData[2400] = {
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x100004E, 0x1000636, 0x1000060, 0x10000CC, 0x1000063, 0x100069A, 0x10000F0, 0x1000108, 0x100006F, 0x1000129, 0x100012F, 0x1000135, 0x1000702, 0x100007B, 0x100007E,
+	0x1000754, 0x1002068, 0x100016B, 0x100017D, 0x1000195, 0x100008D, 0x10007E4, 0x10001C5, 0x100080E, 0x1000099, 0x10001D4, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x2001D29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2004033, 0x2004035, 0x2004037, 0x2004039, 0x200403B, 0x200403D, 0x2000247, 0x200403F, 0x2004041, 0x2004043, 0x2004045, 0x2004047, 0x2004049, 0x200404B, 0x200404D, 0x200404F,
+	0x2001E1E, 0x2004051, 0x2004053, 0x2004055, 0x2004057, 0x2004059, 0x200405B, 0x0, 0x2000294, 0x200405D, 0x200405F, 0x2004061, 0x2004063, 0x2004065, 0x2004067, 0x2004B24,
+	0x2004069, 0x0, 0x200406B, 0x0, 0x200406D, 0x0, 0x200406F, 0x0, 0x2004071, 0x0, 0x2004073, 0x0, 0x2004075, 0x0, 0x2004077, 0x0,
+	0x2004079, 0x0, 0x200407B, 0x0, 0x200407D, 0x0, 0x200407F, 0x0, 0x2004081, 0x0, 0x2004083, 0x0, 0x2004085, 0x0, 0x2004087, 0x0,
+	0x2004089, 0x0, 0x200408B, 0x0, 0x200408D, 0x0, 0x2001EF8, 0x0, 0x200408F, 0x0, 0x2004091, 0x0, 0x2004093, 0x0, 0x2004095, 0x0,
+	0x3004097, 0x0, 0x200409A, 0x0, 0x200409C, 0x0, 0x200409E, 0x0, 0x0, 0x20040A0, 0x0, 0x20040A2, 0x0, 0x20040A4, 0x0, 0x20040A6,
+	0x0, 0x20040A8, 0x0, 0x20040AA, 0x0, 0x20040AC, 0x0, 0x20040AE, 0x0, 0x3001D48, 0x2001E00, 0x0, 0x20040B0, 0x0, 0x20040B2, 0x0,
+	0x20040B4, 0x0, 0x2002CE5, 0x0, 0x20040B6, 0x0, 0x20040B8, 0x0, 0x20040BA, 0x0, 0x20040BC, 0x0, 0x20040BE, 0x0, 0x20040C0, 0x0,
+	0x20040C2, 0x0, 0x20040C4, 0x0, 0x20040C6, 0x0, 0x20040C8, 0x0, 0x20040CA, 0x0, 0x20040CC, 0x0, 0x20040CE, 0x0, 0x20040D0, 0x0,
+	0x20040D2, 0x0, 0x20040D4, 0x0, 0x20040D6, 0x0, 0x20040D8, 0x0, 0x20040DA, 0x20040DC, 0x0, 0x20040DE, 0x0, 0x20040E0, 0x0, 0x100017D,
+	0x0, 0x20040E2, 0x20040E4, 0x0, 0x20040E6, 0x0, 0x2001E02, 0x20040E8, 0x0, 0x20040EA, 0x20040EC, 0x20040EE, 0x0, 0x0, 0x20040F0, 0x2001DFA,
+	0x2001DFC, 0x20040F2, 0x0, 0x20040F4, 0x2001D7D, 0x0, 0x2001E28, 0x2001E26, 0x20040F6, 0x0, 0x0, 0x0, 0x2001E0D, 0x2001E3C, 0x0, 0x2001E42,
+	0x20040F8, 0x0, 0x20040FA, 0x0, 0x20040FC, 0x0, 0x20040FE, 0x2004100, 0x0, 0x2001E48, 0x0, 0x0, 0x2004102, 0x0, 0x2004104, 0x2004106,
+	0x0, 0x2001E4E, 0x2001E53, 0x2004108, 0x0, 0x200410A, 0x0, 0x200026B, 0x200410C, 0x0, 0x0, 0x0, 0x200410E, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x2004110, 0x2004110, 0x0, 0x2004112, 0x2004112, 0x0, 0x2004114, 0x2004114, 0x0, 0x2004116, 0x0, 0x2004118,
+	0x0, 0x200411A, 0x0, 0x200411C, 0x0, 0x200411E, 0x0, 0x2004120, 0x0, 0x2004122, 0x0, 0x2004124, 0x0, 0x0, 0x2004126, 0x0,
+	0x2004128, 0x0, 0x200412A, 0x0, 0x200412C, 0x0, 0x200412E, 0x0, 0x2004130, 0x0, 0x2004132, 0x0, 0x2004134, 0x0, 0x2004136, 0x0,
+	0x300026F, 0x2004138, 0x2004138, 0x0, 0x200413A, 0x0, 0x200413C, 0x200413E, 0x2004140, 0x0, 0x2004142, 0x0, 0x2004144, 0x0, 0x2004146, 0x0,
+	0x2004148, 0x0, 0x200414A, 0x0, 0x200414C, 0x0, 0x200414E, 0x0, 0x2004150, 0x0, 0x2004152, 0x0, 0x2004154, 0x0, 0x2004156, 0x0,
+	0x2004158, 0x0, 0x200415A, 0x0, 0x200415C, 0x0, 0x200415E, 0x0, 0x2004160, 0x0, 0x2004162, 0x0, 0x2004164, 0x0, 0x2004166, 0x0,
+	0x2004168, 0x0, 0x200416A, 0x0, 0x200416C, 0x0, 0x200416E, 0x0, 0x2004170, 0x0, 0x2004172, 0x0, 0x2004174, 0x0, 0x2004176, 0x0,
+	0x2004178, 0x0, 0x200417A, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300417C, 0x200417F, 0x0, 0x2004181, 0x3004183, 0x0,
+	0x0, 0x2004186, 0x0, 0x2004188, 0x2001E4C, 0x2001E55, 0x200418A, 0x0, 0x200418C, 0x0, 0x200418E, 0x0, 0x2004190, 0x0, 0x2004192, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x2000349, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2004194, 0x0, 0x2004196, 0x0, 0x0, 0x0, 0x2004198, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200419A,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200419C, 0x0, 0x200419E, 0x20041A0, 0x20041A2, 0x0, 0x20041A4, 0x0, 0x20041A6, 0x20041A8,
+	0x6000349, 0x2000357, 0x2001D89, 0x2001E12, 0x2001E14, 0x200035B, 0x2003369, 0x200035F, 0x2001D8B, 0x2000349, 0x2001D91, 0x200336B, 0x2001D29, 0x200336D, 0x200336F, 0x200036D,
+	0x2001D8F, 0x2000E17, 0x0, 0x2003371, 0x2003373, 0x2000367, 0x2001D8D, 0x2001E16, 0x2003375, 0x2000375, 0x20041AA, 0x20041AC, 0x0, 0x0, 0x0, 0x0,
+	0x6000367, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x2003371, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20041AE,
+	0x2001D89, 0x2001D8B, 0x0, 0x0, 0x0, 0x2001D8D, 0x2001D8F, 0x0, 0x20041B0, 0x0, 0x20041B2, 0x0, 0x200337C, 0x0, 0x20041B4, 0x0,
+	0x20041B6, 0x0, 0x20041B8, 0x0, 0x20041BA, 0x0, 0x20041BC, 0x0, 0x20041BE, 0x0, 0x20041C0, 0x0, 0x20041C2, 0x0, 0x20041C4, 0x0,
+	0x2001D91, 0x2000E17, 0x0, 0x0, 0x2001D8B, 0x200035B, 0x0, 0x20041C6, 0x0, 0x20041C8, 0x20041CA, 0x0, 0x0, 0x20041CC, 0x20041CE, 0x20041D0,
+	0x20041D2, 0x20041D4, 0x20041D6, 0x20041D8, 0x20041DA, 0x20041DC, 0x20003B1, 0x20041DE, 0x20041E0, 0x20041E2, 0x20041E4, 0x20041E6, 0x20041E8, 0x20041EA, 0x20041EC, 0x20041EE,
+	0x20003D5, 0x20041F0, 0x20041F2, 0x20003AD, 0x20041F4, 0x20003A5, 0x20003CD, 0x20003FD, 0x20003A1, 0x20041F6, 0x20003B5, 0x20041F8, 0x20041FA, 0x2001E18, 0x2000415, 0x20041FC,
+	0x20041FE, 0x2004200, 0x2004202, 0x20003BD, 0x2004204, 0x2004206, 0x2004208, 0x2000445, 0x200420A, 0x200420C, 0x2002CDC, 0x200044D, 0x2002CDE, 0x2000425, 0x200420E, 0x2004210,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2004212, 0x0, 0x2004214, 0x0, 0x2004216, 0x0, 0x2004218, 0x0, 0x200421A, 0x0, 0x200421C, 0x0, 0x200421E, 0x0, 0x2004220, 0x0,
+	0x2004222, 0x0, 0x2004224, 0x0, 0x20003C5, 0x0, 0x2004226, 0x0, 0x2004228, 0x0, 0x200422A, 0x0, 0x200422C, 0x0, 0x200422E, 0x0,
+	0x2004230, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2004232, 0x0, 0x2004234, 0x0, 0x2004236, 0x0,
+	0x2004238, 0x0, 0x200423A, 0x0, 0x200423C, 0x0, 0x200423E, 0x0, 0x2004240, 0x0, 0x2004242, 0x0, 0x2004244, 0x0, 0x2004246, 0x0,
+	0x2004248, 0x0, 0x200424A, 0x0, 0x200424C, 0x0, 0x200424E, 0x0, 0x2004250, 0x0, 0x2004252, 0x0, 0x2004254, 0x0, 0x2004256, 0x0,
+	0x2004258, 0x0, 0x200425A, 0x0, 0x200425C, 0x0, 0x200425E, 0x0, 0x2004260, 0x0, 0x2004262, 0x0, 0x2004264, 0x0, 0x2004266, 0x0,
+	0x2004268, 0x200426A, 0x0, 0x200426C, 0x0, 0x200426E, 0x0, 0x2004270, 0x0, 0x2004272, 0x0, 0x2004274, 0x0, 0x2004276, 0x0, 0x0,
+	0x2004278, 0x0, 0x200427A, 0x0, 0x200427C, 0x0, 0x200427E, 0x0, 0x20003ED, 0x0, 0x2004280, 0x0, 0x2004282, 0x0, 0x2004284, 0x0,
+	0x2004286, 0x0, 0x2004288, 0x0, 0x200428A, 0x0, 0x200428C, 0x0, 0x200041D, 0x0, 0x200428E, 0x0, 0x2004290, 0x0, 0x2004292, 0x0,
+	0x2004294, 0x0, 0x2004296, 0x0, 0x2004298, 0x0, 0x200429A, 0x0, 0x200429C, 0x0, 0x200429E, 0x0, 0x20042A0, 0x0, 0x20042A2, 0x0,
+	0x20042A4, 0x0, 0x20042A6, 0x0, 0x20042A8, 0x0, 0x20042AA, 0x0, 0x20042AC, 0x0, 0x20042AE, 0x0, 0x20042B0, 0x0, 0x20042B2, 0x0,
+	0x20042B4, 0x0, 0x20042B6, 0x0, 0x20042B8, 0x0, 0x20042BA, 0x0, 0x20042BC, 0x0, 0x20042BE, 0x0, 0x20042C0, 0x0, 0x20042C2, 0x0,
+	0x20042C4, 0x0, 0x20042C6, 0x0, 0x20042C8, 0x0, 0x20042CA, 0x0, 0x20042CC, 0x0, 0x20042CE, 0x0, 0x20042D0, 0x0, 0x20042D2, 0x0,
+	0x0, 0x20042D4, 0x20042D6, 0x20042D8, 0x20042DA, 0x2001D99, 0x20042DC, 0x20042DE, 0x20042E0, 0x20042E2, 0x20042E4, 0x2002D0A, 0x20042E6, 0x2002D12, 0x20042E8, 0x20042EA,
+	0x20042EC, 0x20042EE, 0x20042F0, 0x20042F2, 0x2002D00, 0x20042F4, 0x2002D02, 0x20042F6, 0x20042F8, 0x20042FA, 0x20042FC, 0x20042FE, 0x2004300, 0x2004302, 0x2002D0C, 0x2004304,
+	0x2004306, 0x2004308, 0x2001D9B, 0x200430A, 0x200430C, 0x200430E, 0x2004310, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4001D99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3004312, 0x3004315, 0x3004318, 0x300431B, 0x300431E, 0x3004321, 0x3004324, 0x3004327, 0x300432A, 0x300432D, 0x3004330, 0x3004333, 0x3004336, 0x3004339, 0x300433C, 0x300433F,
+	0x3004342, 0x3004345, 0x3004348, 0x300434B, 0x300434E, 0x3004351, 0x3004354, 0x3004357, 0x300435A, 0x300435D, 0x3004360, 0x3004363, 0x3004366, 0x3004369, 0x300436C, 0x300436F,
+	0x3004372, 0x3004375, 0x3004378, 0x300437B, 0x300437E, 0x3004381, 0x0, 0x3004384, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004387, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300438A, 0x0, 0x300438D, 0x0, 0x3004390, 0x0, 0x3004393, 0x0, 0x3004396, 0x0, 0x3004399, 0x0, 0x300439C, 0x0, 0x300439F, 0x0,
+	0x30043A2, 0x0, 0x30043A5, 0x0, 0x30043A8, 0x0, 0x30043AB, 0x0, 0x30043AE, 0x0, 0x30043B1, 0x0, 0x30043B4, 0x0, 0x30043B7, 0x0,
+	0x30043BA, 0x0, 0x30043BD, 0x0, 0x30043C0, 0x0, 0x30043C3, 0x0, 0x30043C6, 0x0, 0x30043C9, 0x0, 0x30043CC, 0x0, 0x30043CF, 0x0,
+	0x30043D2, 0x0, 0x30043D5, 0x0, 0x30043D8, 0x0, 0x30043DB, 0x0, 0x30043DE, 0x0, 0x30043E1, 0x0, 0x30043E4, 0x0, 0x30043E7, 0x0,
+	0x30043EA, 0x0, 0x30043ED, 0x0, 0x30043F0, 0x0, 0x30043F3, 0x0, 0x30043F6, 0x0, 0x30043F9, 0x0, 0x30043FC, 0x0, 0x30043FF, 0x0,
+	0x3004402, 0x0, 0x3004405, 0x0, 0x3004408, 0x0, 0x300440B, 0x0, 0x300440E, 0x0, 0x3004411, 0x0, 0x3004414, 0x0, 0x3004417, 0x0,
+	0x300441A, 0x0, 0x300441D, 0x0, 0x3004420, 0x0, 0x3004423, 0x0, 0x3004426, 0x0, 0x3004429, 0x0, 0x300442C, 0x0, 0x300442F, 0x0,
+	0x3004432, 0x0, 0x3004435, 0x0, 0x3004438, 0x0, 0x300443B, 0x0, 0x300443E, 0x0, 0x3004441, 0x0, 0x3004444, 0x0, 0x3004447, 0x0,
+	0x300444A, 0x0, 0x300444D, 0x0, 0x3004450, 0x0, 0x3004453, 0x0, 0x3004456, 0x0, 0x3004459, 0x0, 0x300445C, 0x0, 0x300445F, 0x0,
+	0x3004462, 0x0, 0x3004465, 0x0, 0x3004468, 0x0, 0x300082F, 0x3000832, 0x3000835, 0x3000838, 0x3001E5B, 0x300441A, 0x0, 0x0, 0x2004B24, 0x0,
+	0x300446D, 0x0, 0x3004470, 0x0, 0x3004473, 0x0, 0x3004476, 0x0, 0x3004479, 0x0, 0x300447C, 0x0, 0x300447F, 0x0, 0x3004482, 0x0,
+	0x3004485, 0x0, 0x3004488, 0x0, 0x300448B, 0x0, 0x300448E, 0x0, 0x3004491, 0x0, 0x3004494, 0x0, 0x3004497, 0x0, 0x300449A, 0x0,
+	0x300449D, 0x0, 0x30044A0, 0x0, 0x30044A3, 0x0, 0x30044A6, 0x0, 0x30044A9, 0x0, 0x30044AC, 0x0, 0x30044AF, 0x0, 0x30044B2, 0x0,
+	0x30044B5, 0x0, 0x30044B8, 0x0, 0x30044BB, 0x0, 0x30044BE, 0x0, 0x30044C1, 0x0, 0x30044C4, 0x0, 0x30044C7, 0x0, 0x30044CA, 0x0,
+	0x30044CD, 0x0, 0x30044D0, 0x0, 0x30044D3, 0x0, 0x30044D6, 0x0, 0x30044D9, 0x0, 0x30044DC, 0x0, 0x30044DF, 0x0, 0x30044E2, 0x0,
+	0x30044E5, 0x0, 0x30044E8, 0x0, 0x30044EB, 0x0, 0x30044EE, 0x0, 0x30044F1, 0x0, 0x30044F4, 0x0, 0x30044F7, 0x0, 0x30044FA, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30044FD, 0x3004500, 0x3004503, 0x3004506, 0x3004509, 0x300450C, 0x300450F, 0x3004512,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004515, 0x3004518, 0x300451B, 0x300451E, 0x3004521, 0x3004524, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004527, 0x300452A, 0x300452D, 0x3004530, 0x3004533, 0x3004536, 0x3004539, 0x300453C,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x300453F, 0x3004542, 0x3004545, 0x3004548, 0x300454B, 0x300454E, 0x3004551, 0x3004554,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004557, 0x300455A, 0x300455D, 0x3004560, 0x3004563, 0x3004566, 0x0, 0x0,
+	0x4000B4D, 0x0, 0x6000B55, 0x0, 0x6000B61, 0x0, 0x6000B6D, 0x0, 0x0, 0x3004569, 0x0, 0x300456C, 0x0, 0x300456F, 0x0, 0x3004572,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004575, 0x3004578, 0x300457B, 0x300457E, 0x3004581, 0x3004584, 0x3004587, 0x300458A,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x5004B26, 0x5004B2B, 0x5004B30, 0x5004B35, 0x5004B3A, 0x5004B3F, 0x5004B44, 0x5004B49, 0x5004B26, 0x5004B2B, 0x5004B30, 0x5004B35, 0x5004B3A, 0x5004B3F, 0x5004B44, 0x5004B49,
+	0x5004B4E, 0x5004B53, 0x5004B58, 0x5004B5D, 0x5004B62, 0x5004B67, 0x5004B6C, 0x5004B71, 0x5004B4E, 0x5004B53, 0x5004B58, 0x5004B5D, 0x5004B62, 0x5004B67, 0x5004B6C, 0x5004B71,
+	0x5004B76, 0x5004B7B, 0x5004B80, 0x5004B85, 0x5004B8A, 0x5004B8F, 0x5004B94, 0x5004B99, 0x5004B76, 0x5004B7B, 0x5004B80, 0x5004B85, 0x5004B8A, 0x5004B8F, 0x5004B94, 0x5004B99,
+	0x0, 0x0, 0x5004B9E, 0x4004BA3, 0x4004BA7, 0x0, 0x4000D83, 0x6004BAB, 0x30045D5, 0x30045D8, 0x30045DB, 0x30045DE, 0x4004BA3, 0x0, 0x2000349, 0x0,
+	0x0, 0x0, 0x5004BB1, 0x4004BB6, 0x4004BBA, 0x0, 0x4000DB1, 0x6004BBE, 0x30045E4, 0x30045E7, 0x30045EA, 0x30045ED, 0x4004BB6, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x6000DDE, 0x6000349, 0x0, 0x0, 0x4000DE4, 0x6000DE8, 0x30045F3, 0x30045F6, 0x30045F9, 0x30045FC, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x6000E11, 0x6000367, 0x4000E17, 0x0, 0x4000E1F, 0x6000E23, 0x30045FF, 0x3004602, 0x3004605, 0x3004608, 0x300460B, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x5004BC4, 0x4004BC9, 0x4004BCD, 0x0, 0x4000E4E, 0x6004BD1, 0x300460E, 0x3004611, 0x3004614, 0x3004617, 0x4004BC9, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2000375, 0x0, 0x0, 0x0, 0x100012F, 0x200403D, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x300461D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x3004620, 0x3004623, 0x3004626, 0x3004629, 0x300462C, 0x300462F, 0x3004632, 0x3004635, 0x3004638, 0x300463B, 0x300463E, 0x3004641, 0x3004644, 0x3004647, 0x300464A, 0x300464D,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x3004650, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3004653, 0x3004656, 0x3004659, 0x300465C, 0x300465F, 0x3004662, 0x3004665, 0x3004668, 0x300466B, 0x300466E,
+	0x3004671, 0x3004674, 0x3004677, 0x300467A, 0x300467D, 0x3004680, 0x3004683, 0x3004686, 0x3004689, 0x300468C, 0x300468F, 0x3004692, 0x3004695, 0x3004698, 0x300469B, 0x300469E,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30046A1, 0x30046A4, 0x30046A7, 0x30046AA, 0x30046AD, 0x30046B0, 0x30046B3, 0x30046B6, 0x30046B9, 0x30046BC, 0x30046BF, 0x30046C2, 0x30046C5, 0x30046C8, 0x30046CB, 0x30046CE,
+	0x30046D1, 0x30046D4, 0x30046D7, 0x30046DA, 0x30046DD, 0x30046E0, 0x30046E3, 0x30046E6, 0x30046E9, 0x30046EC, 0x30046EF, 0x30046F2, 0x30046F5, 0x30046F8, 0x30046FB, 0x30046FE,
+	0x3004701, 0x3004704, 0x3004707, 0x300470A, 0x300470D, 0x3004710, 0x3004713, 0x3004716, 0x3004719, 0x300471C, 0x300471F, 0x3004722, 0x3004725, 0x3004728, 0x300472B, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300472E, 0x0, 0x2002CED, 0x3004731, 0x2004734, 0x0, 0x0, 0x3004736, 0x0, 0x3004739, 0x0, 0x300473C, 0x0, 0x2001DF5, 0x2001E38, 0x2001DF3,
+	0x2001E1A, 0x0, 0x300473F, 0x0, 0x0, 0x3004742, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2004745, 0x2004747,
+	0x3004749, 0x0, 0x300474C, 0x0, 0x300474F, 0x0, 0x3004752, 0x0, 0x3004755, 0x0, 0x3004758, 0x0, 0x300475B, 0x0, 0x300475E, 0x0,
+	0x3004761, 0x0, 0x3004764, 0x0, 0x3004767, 0x0, 0x300476A, 0x0, 0x300476D, 0x0, 0x3004770, 0x0, 0x3004773, 0x0, 0x3004776, 0x0,
+	0x3004779, 0x0, 0x300477C, 0x0, 0x300477F, 0x0, 0x3004782, 0x0, 0x3004785, 0x0, 0x3004788, 0x0, 0x300478B, 0x0, 0x300478E, 0x0,
+	0x3004791, 0x0, 0x3004794, 0x0, 0x3004797, 0x0, 0x300479A, 0x0, 0x300479D, 0x0, 0x30047A0, 0x0, 0x30047A3, 0x0, 0x30047A6, 0x0,
+	0x30047A9, 0x0, 0x30047AC, 0x0, 0x30047AF, 0x0, 0x30047B2, 0x0, 0x30047B5, 0x0, 0x30047B8, 0x0, 0x30047BB, 0x0, 0x30047BE, 0x0,
+	0x30047C1, 0x0, 0x30047C4, 0x0, 0x30047C7, 0x0, 0x30047CA, 0x0, 0x30047CD, 0x0, 0x30047D0, 0x0, 0x30047D3, 0x0, 0x30047D6, 0x0,
+	0x30047D9, 0x0, 0x30047DC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30047DF, 0x0, 0x30047E2, 0x0, 0x0,
+	0x0, 0x0, 0x30047E5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x30047E8, 0x0, 0x30047EB, 0x0, 0x30047EE, 0x0, 0x30047F1, 0x0, 0x30047F4, 0x0, 0x30047F7, 0x0, 0x30047FA, 0x0, 0x30047FD, 0x0,
+	0x3004800, 0x0, 0x3004803, 0x0, 0x3004806, 0x0, 0x3004809, 0x0, 0x300480C, 0x0, 0x300480F, 0x0, 0x3004812, 0x0, 0x3004815, 0x0,
+	0x3004818, 0x0, 0x300481B, 0x0, 0x300481E, 0x0, 0x3004821, 0x0, 0x3004824, 0x0, 0x3004827, 0x0, 0x300482A, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x300482D, 0x0, 0x3004830, 0x0, 0x3004833, 0x0, 0x3004836, 0x0, 0x3004839, 0x0, 0x300483C, 0x0, 0x300483F, 0x0, 0x3004842, 0x0,
+	0x3004845, 0x0, 0x3004848, 0x0, 0x300484B, 0x0, 0x300484E, 0x0, 0x3004851, 0x0, 0x3004854, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x3004857, 0x0, 0x300485A, 0x0, 0x3002CE7, 0x0, 0x300485D, 0x0, 0x3004860, 0x0, 0x3004863, 0x0, 0x3004866, 0x0,
+	0x0, 0x0, 0x3004869, 0x0, 0x300486C, 0x0, 0x300486F, 0x0, 0x3004872, 0x0, 0x3004875, 0x0, 0x3004878, 0x0, 0x300487B, 0x0,
+	0x300487E, 0x0, 0x3004881, 0x0, 0x3004884, 0x0, 0x3004887, 0x0, 0x300488A, 0x0, 0x300488D, 0x0, 0x3004890, 0x0, 0x3004893, 0x0,
+	0x3004896, 0x0, 0x3004899, 0x0, 0x300489C, 0x0, 0x300489F, 0x0, 0x30048A2, 0x0, 0x30048A5, 0x0, 0x30048A8, 0x0, 0x30048AB, 0x0,
+	0x30048AE, 0x0, 0x30048B1, 0x0, 0x30048B4, 0x0, 0x30048B7, 0x0, 0x30048BA, 0x0, 0x30048BD, 0x0, 0x30048C0, 0x0, 0x3002CE0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30048C3, 0x0, 0x30048C6, 0x0, 0x30048C9, 0x30048CC, 0x0,
+	0x30048CF, 0x0, 0x30048D2, 0x0, 0x30048D5, 0x0, 0x30048D8, 0x0, 0x0, 0x0, 0x0, 0x30048DB, 0x0, 0x2001E24, 0x0, 0x0,
+	0x30048DE, 0x0, 0x30048E1, 0x0, 0x0, 0x0, 0x30048E4, 0x0, 0x30048E7, 0x0, 0x30048EA, 0x0, 0x30048ED, 0x0, 0x30048F0, 0x0,
+	0x30048F3, 0x0, 0x30048F6, 0x0, 0x30048F9, 0x0, 0x30048FC, 0x0, 0x30048FF, 0x0, 0x2001D63, 0x2001DFE, 0x2001E22, 0x2004902, 0x0, 0x0,
+	0x2004904, 0x2004906, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x2002CF2, 0x2002CF4, 0x2002CF6, 0x3002CF8, 0x3002CFB, 0x2002CFE, 0x2002CFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x4002D00, 0x4002D04, 0x4002D08, 0x4002D0C, 0x4002D10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x3004908, 0x300490B, 0x300490E, 0x3004911, 0x3004914, 0x3004917, 0x300491A, 0x300491D, 0x3004920, 0x3004923, 0x3004926, 0x3004929, 0x300492C, 0x300492F, 0x3004932,
+	0x3004935, 0x3004938, 0x300493B, 0x300493E, 0x3004941, 0x3004944, 0x3004947, 0x300494A, 0x300494D, 0x3004950, 0x3004953, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x4004956, 0x400495A, 0x400495E, 0x4004962, 0x4004966, 0x400496A, 0x400496E, 0x4004972, 0x4004976, 0x400497A, 0x400497E, 0x4004982, 0x4004986, 0x400498A, 0x400498E, 0x4004992,
+	0x4004996, 0x400499A, 0x400499E, 0x40049A2, 0x40049A6, 0x40049AA, 0x40049AE, 0x40049B2, 0x40049B6, 0x40049BA, 0x40049BE, 0x40049C2, 0x40049C6, 0x40049CA, 0x40049CE, 0x40049D2,
+	0x40049D6, 0x40049DA, 0x40049DE, 0x40049E2, 0x40049E6, 0x40049EA, 0x40049EE, 0x40049F2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	0x40049F6, 0x40049FA, 0x40049FE, 0x4004A02, 0x4004A06, 0x4004A0A, 0x4004A0E, 0x4004A12, 0x4004A16, 0x4004A1A, 0x4004A1E, 0x4004A22, 0x4004A26, 0x4004A2A, 0x4004A2E, 0x4004A32,
+	0x4004A36, 0x4004A3A, 0x4004A3E, 0x4004A42, 0x4004A46, 0x4004A4A, 0x4004A4E, 0x4004A52, 0x4004A56, 0x4004A5A, 0x4004A5E, 0x4004A62, 0x4004A66, 0x4004A6A, 0x4004A6E, 0x4004A72,
+};
+const uint32_t* CaseFoldingDataPtr = CaseFoldingData;
+
+const size_t UnicodeCompositionRecordCount = 940;
+const CompositionRecord UnicodeCompositionRecord[940] = {
+	{ 0x3c00000338, 0x226e }, { 0x3d00000338, 0x2260 }, { 0x3e00000338, 0x226f }, { 0x4100000300, 0xc0 },
+	{ 0x4100000301, 0xc1 }, { 0x4100000302, 0xc2 }, { 0x4100000303, 0xc3 }, { 0x4100000304, 0x100 },
+	{ 0x4100000306, 0x102 }, { 0x4100000307, 0x226 }, { 0x4100000308, 0xc4 }, { 0x4100000309, 0x1ea2 },
+	{ 0x410000030a, 0xc5 }, { 0x410000030c, 0x1cd }, { 0x410000030f, 0x200 }, { 0x4100000311, 0x202 },
+	{ 0x4100000323, 0x1ea0 }, { 0x4100000325, 0x1e00 }, { 0x4100000328, 0x104 }, { 0x4200000307, 0x1e02 },
+	{ 0x4200000323, 0x1e04 }, { 0x4200000331, 0x1e06 }, { 0x4300000301, 0x106 }, { 0x4300000302, 0x108 },
+	{ 0x4300000307, 0x10a }, { 0x430000030c, 0x10c }, { 0x4300000327, 0xc7 }, { 0x4400000307, 0x1e0a },
+	{ 0x440000030c, 0x10e }, { 0x4400000323, 0x1e0c }, { 0x4400000327, 0x1e10 }, { 0x440000032d, 0x1e12 },
+	{ 0x4400000331, 0x1e0e }, { 0x4500000300, 0xc8 }, { 0x4500000301, 0xc9 }, { 0x4500000302, 0xca },
+	{ 0x4500000303, 0x1ebc }, { 0x4500000304, 0x112 }, { 0x4500000306, 0x114 }, { 0x4500000307, 0x116 },
+	{ 0x4500000308, 0xcb }, { 0x4500000309, 0x1eba }, { 0x450000030c, 0x11a }, { 0x450000030f, 0x204 },
+	{ 0x4500000311, 0x206 }, { 0x4500000323, 0x1eb8 }, { 0x4500000327, 0x228 }, { 0x4500000328, 0x118 },
+	{ 0x450000032d, 0x1e18 }, { 0x4500000330, 0x1e1a }, { 0x4600000307, 0x1e1e }, { 0x4700000301, 0x1f4 },
+	{ 0x4700000302, 0x11c }, { 0x4700000304, 0x1e20 }, { 0x4700000306, 0x11e }, { 0x4700000307, 0x120 },
+	{ 0x470000030c, 0x1e6 }, { 0x4700000327, 0x122 }, { 0x4800000302, 0x124 }, { 0x4800000307, 0x1e22 },
+	{ 0x4800000308, 0x1e26 }, { 0x480000030c, 0x21e }, { 0x4800000323, 0x1e24 }, { 0x4800000327, 0x1e28 },
+	{ 0x480000032e, 0x1e2a }, { 0x4900000300, 0xcc }, { 0x4900000301, 0xcd }, { 0x4900000302, 0xce },
+	{ 0x4900000303, 0x128 }, { 0x4900000304, 0x12a }, { 0x4900000306, 0x12c }, { 0x4900000307, 0x130 },
+	{ 0x4900000308, 0xcf }, { 0x4900000309, 0x1ec8 }, { 0x490000030c, 0x1cf }, { 0x490000030f, 0x208 },
+	{ 0x4900000311, 0x20a }, { 0x4900000323, 0x1eca }, { 0x4900000328, 0x12e }, { 0x4900000330, 0x1e2c },
+	{ 0x4a00000302, 0x134 }, { 0x4b00000301, 0x1e30 }, { 0x4b0000030c, 0x1e8 }, { 0x4b00000323, 0x1e32 },
+	{ 0x4b00000327, 0x136 }, { 0x4b00000331, 0x1e34 }, { 0x4c00000301, 0x139 }, { 0x4c0000030c, 0x13d },
+	{ 0x4c00000323, 0x1e36 }, { 0x4c00000327, 0x13b }, { 0x4c0000032d, 0x1e3c }, { 0x4c00000331, 0x1e3a },
+	{ 0x4d00000301, 0x1e3e }, { 0x4d00000307, 0x1e40 }, { 0x4d00000323, 0x1e42 }, { 0x4e00000300, 0x1f8 },
+	{ 0x4e00000301, 0x143 }, { 0x4e00000303, 0xd1 }, { 0x4e00000307, 0x1e44 }, { 0x4e0000030c, 0x147 },
+	{ 0x4e00000323, 0x1e46 }, { 0x4e00000327, 0x145 }, { 0x4e0000032d, 0x1e4a }, { 0x4e00000331, 0x1e48 },
+	{ 0x4f00000300, 0xd2 }, { 0x4f00000301, 0xd3 }, { 0x4f00000302, 0xd4 }, { 0x4f00000303, 0xd5 },
+	{ 0x4f00000304, 0x14c }, { 0x4f00000306, 0x14e }, { 0x4f00000307, 0x22e }, { 0x4f00000308, 0xd6 },
+	{ 0x4f00000309, 0x1ece }, { 0x4f0000030b, 0x150 }, { 0x4f0000030c, 0x1d1 }, { 0x4f0000030f, 0x20c },
+	{ 0x4f00000311, 0x20e }, { 0x4f0000031b, 0x1a0 }, { 0x4f00000323, 0x1ecc }, { 0x4f00000328, 0x1ea },
+	{ 0x5000000301, 0x1e54 }, { 0x5000000307, 0x1e56 }, { 0x5200000301, 0x154 }, { 0x5200000307, 0x1e58 },
+	{ 0x520000030c, 0x158 }, { 0x520000030f, 0x210 }, { 0x5200000311, 0x212 }, { 0x5200000323, 0x1e5a },
+	{ 0x5200000327, 0x156 }, { 0x5200000331, 0x1e5e }, { 0x5300000301, 0x15a }, { 0x5300000302, 0x15c },
+	{ 0x5300000307, 0x1e60 }, { 0x530000030c, 0x160 }, { 0x5300000323, 0x1e62 }, { 0x5300000326, 0x218 },
+	{ 0x5300000327, 0x15e }, { 0x5400000307, 0x1e6a }, { 0x540000030c, 0x164 }, { 0x5400000323, 0x1e6c },
+	{ 0x5400000326, 0x21a }, { 0x5400000327, 0x162 }, { 0x540000032d, 0x1e70 }, { 0x5400000331, 0x1e6e },
+	{ 0x5500000300, 0xd9 }, { 0x5500000301, 0xda }, { 0x5500000302, 0xdb }, { 0x5500000303, 0x168 },
+	{ 0x5500000304, 0x16a }, { 0x5500000306, 0x16c }, { 0x5500000308, 0xdc }, { 0x5500000309, 0x1ee6 },
+	{ 0x550000030a, 0x16e }, { 0x550000030b, 0x170 }, { 0x550000030c, 0x1d3 }, { 0x550000030f, 0x214 },
+	{ 0x5500000311, 0x216 }, { 0x550000031b, 0x1af }, { 0x5500000323, 0x1ee4 }, { 0x5500000324, 0x1e72 },
+	{ 0x5500000328, 0x172 }, { 0x550000032d, 0x1e76 }, { 0x5500000330, 0x1e74 }, { 0x5600000303, 0x1e7c },
+	{ 0x5600000323, 0x1e7e }, { 0x5700000300, 0x1e80 }, { 0x5700000301, 0x1e82 }, { 0x5700000302, 0x174 },
+	{ 0x5700000307, 0x1e86 }, { 0x5700000308, 0x1e84 }, { 0x5700000323, 0x1e88 }, { 0x5800000307, 0x1e8a },
+	{ 0x5800000308, 0x1e8c }, { 0x5900000300, 0x1ef2 }, { 0x5900000301, 0xdd }, { 0x5900000302, 0x176 },
+	{ 0x5900000303, 0x1ef8 }, { 0x5900000304, 0x232 }, { 0x5900000307, 0x1e8e }, { 0x5900000308, 0x178 },
+	{ 0x5900000309, 0x1ef6 }, { 0x5900000323, 0x1ef4 }, { 0x5a00000301, 0x179 }, { 0x5a00000302, 0x1e90 },
+	{ 0x5a00000307, 0x17b }, { 0x5a0000030c, 0x17d }, { 0x5a00000323, 0x1e92 }, { 0x5a00000331, 0x1e94 },
+	{ 0x6100000300, 0xe0 }, { 0x6100000301, 0xe1 }, { 0x6100000302, 0xe2 }, { 0x6100000303, 0xe3 },
+	{ 0x6100000304, 0x101 }, { 0x6100000306, 0x103 }, { 0x6100000307, 0x227 }, { 0x6100000308, 0xe4 },
+	{ 0x6100000309, 0x1ea3 }, { 0x610000030a, 0xe5 }, { 0x610000030c, 0x1ce }, { 0x610000030f, 0x201 },
+	{ 0x6100000311, 0x203 }, { 0x6100000323, 0x1ea1 }, { 0x6100000325, 0x1e01 }, { 0x6100000328, 0x105 },
+	{ 0x6200000307, 0x1e03 }, { 0x6200000323, 0x1e05 }, { 0x6200000331, 0x1e07 }, { 0x6300000301, 0x107 },
+	{ 0x6300000302, 0x109 }, { 0x6300000307, 0x10b }, { 0x630000030c, 0x10d }, { 0x6300000327, 0xe7 },
+	{ 0x6400000307, 0x1e0b }, { 0x640000030c, 0x10f }, { 0x6400000323, 0x1e0d }, { 0x6400000327, 0x1e11 },
+	{ 0x640000032d, 0x1e13 }, { 0x6400000331, 0x1e0f }, { 0x6500000300, 0xe8 }, { 0x6500000301, 0xe9 },
+	{ 0x6500000302, 0xea }, { 0x6500000303, 0x1ebd }, { 0x6500000304, 0x113 }, { 0x6500000306, 0x115 },
+	{ 0x6500000307, 0x117 }, { 0x6500000308, 0xeb }, { 0x6500000309, 0x1ebb }, { 0x650000030c, 0x11b },
+	{ 0x650000030f, 0x205 }, { 0x6500000311, 0x207 }, { 0x6500000323, 0x1eb9 }, { 0x6500000327, 0x229 },
+	{ 0x6500000328, 0x119 }, { 0x650000032d, 0x1e19 }, { 0x6500000330, 0x1e1b }, { 0x6600000307, 0x1e1f },
+	{ 0x6700000301, 0x1f5 }, { 0x6700000302, 0x11d }, { 0x6700000304, 0x1e21 }, { 0x6700000306, 0x11f },
+	{ 0x6700000307, 0x121 }, { 0x670000030c, 0x1e7 }, { 0x6700000327, 0x123 }, { 0x6800000302, 0x125 },
+	{ 0x6800000307, 0x1e23 }, { 0x6800000308, 0x1e27 }, { 0x680000030c, 0x21f }, { 0x6800000323, 0x1e25 },
+	{ 0x6800000327, 0x1e29 }, { 0x680000032e, 0x1e2b }, { 0x6800000331, 0x1e96 }, { 0x6900000300, 0xec },
+	{ 0x6900000301, 0xed }, { 0x6900000302, 0xee }, { 0x6900000303, 0x129 }, { 0x6900000304, 0x12b },
+	{ 0x6900000306, 0x12d }, { 0x6900000308, 0xef }, { 0x6900000309, 0x1ec9 }, { 0x690000030c, 0x1d0 },
+	{ 0x690000030f, 0x209 }, { 0x6900000311, 0x20b }, { 0x6900000323, 0x1ecb }, { 0x6900000328, 0x12f },
+	{ 0x6900000330, 0x1e2d }, { 0x6a00000302, 0x135 }, { 0x6a0000030c, 0x1f0 }, { 0x6b00000301, 0x1e31 },
+	{ 0x6b0000030c, 0x1e9 }, { 0x6b00000323, 0x1e33 }, { 0x6b00000327, 0x137 }, { 0x6b00000331, 0x1e35 },
+	{ 0x6c00000301, 0x13a }, { 0x6c0000030c, 0x13e }, { 0x6c00000323, 0x1e37 }, { 0x6c00000327, 0x13c },
+	{ 0x6c0000032d, 0x1e3d }, { 0x6c00000331, 0x1e3b }, { 0x6d00000301, 0x1e3f }, { 0x6d00000307, 0x1e41 },
+	{ 0x6d00000323, 0x1e43 }, { 0x6e00000300, 0x1f9 }, { 0x6e00000301, 0x144 }, { 0x6e00000303, 0xf1 },
+	{ 0x6e00000307, 0x1e45 }, { 0x6e0000030c, 0x148 }, { 0x6e00000323, 0x1e47 }, { 0x6e00000327, 0x146 },
+	{ 0x6e0000032d, 0x1e4b }, { 0x6e00000331, 0x1e49 }, { 0x6f00000300, 0xf2 }, { 0x6f00000301, 0xf3 },
+	{ 0x6f00000302, 0xf4 }, { 0x6f00000303, 0xf5 }, { 0x6f00000304, 0x14d }, { 0x6f00000306, 0x14f },
+	{ 0x6f00000307, 0x22f }, { 0x6f00000308, 0xf6 }, { 0x6f00000309, 0x1ecf }, { 0x6f0000030b, 0x151 },
+	{ 0x6f0000030c, 0x1d2 }, { 0x6f0000030f, 0x20d }, { 0x6f00000311, 0x20f }, { 0x6f0000031b, 0x1a1 },
+	{ 0x6f00000323, 0x1ecd }, { 0x6f00000328, 0x1eb }, { 0x7000000301, 0x1e55 }, { 0x7000000307, 0x1e57 },
+	{ 0x7200000301, 0x155 }, { 0x7200000307, 0x1e59 }, { 0x720000030c, 0x159 }, { 0x720000030f, 0x211 },
+	{ 0x7200000311, 0x213 }, { 0x7200000323, 0x1e5b }, { 0x7200000327, 0x157 }, { 0x7200000331, 0x1e5f },
+	{ 0x7300000301, 0x15b }, { 0x7300000302, 0x15d }, { 0x7300000307, 0x1e61 }, { 0x730000030c, 0x161 },
+	{ 0x7300000323, 0x1e63 }, { 0x7300000326, 0x219 }, { 0x7300000327, 0x15f }, { 0x7400000307, 0x1e6b },
+	{ 0x7400000308, 0x1e97 }, { 0x740000030c, 0x165 }, { 0x7400000323, 0x1e6d }, { 0x7400000326, 0x21b },
+	{ 0x7400000327, 0x163 }, { 0x740000032d, 0x1e71 }, { 0x7400000331, 0x1e6f }, { 0x7500000300, 0xf9 },
+	{ 0x7500000301, 0xfa }, { 0x7500000302, 0xfb }, { 0x7500000303, 0x169 }, { 0x7500000304, 0x16b },
+	{ 0x7500000306, 0x16d }, { 0x7500000308, 0xfc }, { 0x7500000309, 0x1ee7 }, { 0x750000030a, 0x16f },
+	{ 0x750000030b, 0x171 }, { 0x750000030c, 0x1d4 }, { 0x750000030f, 0x215 }, { 0x7500000311, 0x217 },
+	{ 0x750000031b, 0x1b0 }, { 0x7500000323, 0x1ee5 }, { 0x7500000324, 0x1e73 }, { 0x7500000328, 0x173 },
+	{ 0x750000032d, 0x1e77 }, { 0x7500000330, 0x1e75 }, { 0x7600000303, 0x1e7d }, { 0x7600000323, 0x1e7f },
+	{ 0x7700000300, 0x1e81 }, { 0x7700000301, 0x1e83 }, { 0x7700000302, 0x175 }, { 0x7700000307, 0x1e87 },
+	{ 0x7700000308, 0x1e85 }, { 0x770000030a, 0x1e98 }, { 0x7700000323, 0x1e89 }, { 0x7800000307, 0x1e8b },
+	{ 0x7800000308, 0x1e8d }, { 0x7900000300, 0x1ef3 }, { 0x7900000301, 0xfd }, { 0x7900000302, 0x177 },
+	{ 0x7900000303, 0x1ef9 }, { 0x7900000304, 0x233 }, { 0x7900000307, 0x1e8f }, { 0x7900000308, 0xff },
+	{ 0x7900000309, 0x1ef7 }, { 0x790000030a, 0x1e99 }, { 0x7900000323, 0x1ef5 }, { 0x7a00000301, 0x17a },
+	{ 0x7a00000302, 0x1e91 }, { 0x7a00000307, 0x17c }, { 0x7a0000030c, 0x17e }, { 0x7a00000323, 0x1e93 },
+	{ 0x7a00000331, 0x1e95 }, { 0xa800000300, 0x1fed }, { 0xa800000301, 0x385 }, { 0xa800000342, 0x1fc1 },
+	{ 0xc200000300, 0x1ea6 }, { 0xc200000301, 0x1ea4 }, { 0xc200000303, 0x1eaa }, { 0xc200000309, 0x1ea8 },
+	{ 0xc400000304, 0x1de }, { 0xc500000301, 0x1fa }, { 0xc600000301, 0x1fc }, { 0xc600000304, 0x1e2 },
+	{ 0xc700000301, 0x1e08 }, { 0xca00000300, 0x1ec0 }, { 0xca00000301, 0x1ebe }, { 0xca00000303, 0x1ec4 },
+	{ 0xca00000309, 0x1ec2 }, { 0xcf00000301, 0x1e2e }, { 0xd400000300, 0x1ed2 }, { 0xd400000301, 0x1ed0 },
+	{ 0xd400000303, 0x1ed6 }, { 0xd400000309, 0x1ed4 }, { 0xd500000301, 0x1e4c }, { 0xd500000304, 0x22c },
+	{ 0xd500000308, 0x1e4e }, { 0xd600000304, 0x22a }, { 0xd800000301, 0x1fe }, { 0xdc00000300, 0x1db },
+	{ 0xdc00000301, 0x1d7 }, { 0xdc00000304, 0x1d5 }, { 0xdc0000030c, 0x1d9 }, { 0xe200000300, 0x1ea7 },
+	{ 0xe200000301, 0x1ea5 }, { 0xe200000303, 0x1eab }, { 0xe200000309, 0x1ea9 }, { 0xe400000304, 0x1df },
+	{ 0xe500000301, 0x1fb }, { 0xe600000301, 0x1fd }, { 0xe600000304, 0x1e3 }, { 0xe700000301, 0x1e09 },
+	{ 0xea00000300, 0x1ec1 }, { 0xea00000301, 0x1ebf }, { 0xea00000303, 0x1ec5 }, { 0xea00000309, 0x1ec3 },
+	{ 0xef00000301, 0x1e2f }, { 0xf400000300, 0x1ed3 }, { 0xf400000301, 0x1ed1 }, { 0xf400000303, 0x1ed7 },
+	{ 0xf400000309, 0x1ed5 }, { 0xf500000301, 0x1e4d }, { 0xf500000304, 0x22d }, { 0xf500000308, 0x1e4f },
+	{ 0xf600000304, 0x22b }, { 0xf800000301, 0x1ff }, { 0xfc00000300, 0x1dc }, { 0xfc00000301, 0x1d8 },
+	{ 0xfc00000304, 0x1d6 }, { 0xfc0000030c, 0x1da }, { 0x10200000300, 0x1eb0 }, { 0x10200000301, 0x1eae },
+	{ 0x10200000303, 0x1eb4 }, { 0x10200000309, 0x1eb2 }, { 0x10300000300, 0x1eb1 }, { 0x10300000301, 0x1eaf },
+	{ 0x10300000303, 0x1eb5 }, { 0x10300000309, 0x1eb3 }, { 0x11200000300, 0x1e14 }, { 0x11200000301, 0x1e16 },
+	{ 0x11300000300, 0x1e15 }, { 0x11300000301, 0x1e17 }, { 0x14c00000300, 0x1e50 }, { 0x14c00000301, 0x1e52 },
+	{ 0x14d00000300, 0x1e51 }, { 0x14d00000301, 0x1e53 }, { 0x15a00000307, 0x1e64 }, { 0x15b00000307, 0x1e65 },
+	{ 0x16000000307, 0x1e66 }, { 0x16100000307, 0x1e67 }, { 0x16800000301, 0x1e78 }, { 0x16900000301, 0x1e79 },
+	{ 0x16a00000308, 0x1e7a }, { 0x16b00000308, 0x1e7b }, { 0x17f00000307, 0x1e9b }, { 0x1a000000300, 0x1edc },
+	{ 0x1a000000301, 0x1eda }, { 0x1a000000303, 0x1ee0 }, { 0x1a000000309, 0x1ede }, { 0x1a000000323, 0x1ee2 },
+	{ 0x1a100000300, 0x1edd }, { 0x1a100000301, 0x1edb }, { 0x1a100000303, 0x1ee1 }, { 0x1a100000309, 0x1edf },
+	{ 0x1a100000323, 0x1ee3 }, { 0x1af00000300, 0x1eea }, { 0x1af00000301, 0x1ee8 }, { 0x1af00000303, 0x1eee },
+	{ 0x1af00000309, 0x1eec }, { 0x1af00000323, 0x1ef0 }, { 0x1b000000300, 0x1eeb }, { 0x1b000000301, 0x1ee9 },
+	{ 0x1b000000303, 0x1eef }, { 0x1b000000309, 0x1eed }, { 0x1b000000323, 0x1ef1 }, { 0x1b70000030c, 0x1ee },
+	{ 0x1ea00000304, 0x1ec }, { 0x1eb00000304, 0x1ed }, { 0x22600000304, 0x1e0 }, { 0x22700000304, 0x1e1 },
+	{ 0x22800000306, 0x1e1c }, { 0x22900000306, 0x1e1d }, { 0x22e00000304, 0x230 }, { 0x22f00000304, 0x231 },
+	{ 0x2920000030c, 0x1ef }, { 0x39100000300, 0x1fba }, { 0x39100000301, 0x386 }, { 0x39100000304, 0x1fb9 },
+	{ 0x39100000306, 0x1fb8 }, { 0x39100000313, 0x1f08 }, { 0x39100000314, 0x1f09 }, { 0x39100000345, 0x1fbc },
+	{ 0x39500000300, 0x1fc8 }, { 0x39500000301, 0x388 }, { 0x39500000313, 0x1f18 }, { 0x39500000314, 0x1f19 },
+	{ 0x39700000300, 0x1fca }, { 0x39700000301, 0x389 }, { 0x39700000313, 0x1f28 }, { 0x39700000314, 0x1f29 },
+	{ 0x39700000345, 0x1fcc }, { 0x39900000300, 0x1fda }, { 0x39900000301, 0x38a }, { 0x39900000304, 0x1fd9 },
+	{ 0x39900000306, 0x1fd8 }, { 0x39900000308, 0x3aa }, { 0x39900000313, 0x1f38 }, { 0x39900000314, 0x1f39 },
+	{ 0x39f00000300, 0x1ff8 }, { 0x39f00000301, 0x38c }, { 0x39f00000313, 0x1f48 }, { 0x39f00000314, 0x1f49 },
+	{ 0x3a100000314, 0x1fec }, { 0x3a500000300, 0x1fea }, { 0x3a500000301, 0x38e }, { 0x3a500000304, 0x1fe9 },
+	{ 0x3a500000306, 0x1fe8 }, { 0x3a500000308, 0x3ab }, { 0x3a500000314, 0x1f59 }, { 0x3a900000300, 0x1ffa },
+	{ 0x3a900000301, 0x38f }, { 0x3a900000313, 0x1f68 }, { 0x3a900000314, 0x1f69 }, { 0x3a900000345, 0x1ffc },
+	{ 0x3ac00000345, 0x1fb4 }, { 0x3ae00000345, 0x1fc4 }, { 0x3b100000300, 0x1f70 }, { 0x3b100000301, 0x3ac },
+	{ 0x3b100000304, 0x1fb1 }, { 0x3b100000306, 0x1fb0 }, { 0x3b100000313, 0x1f00 }, { 0x3b100000314, 0x1f01 },
+	{ 0x3b100000342, 0x1fb6 }, { 0x3b100000345, 0x1fb3 }, { 0x3b500000300, 0x1f72 }, { 0x3b500000301, 0x3ad },
+	{ 0x3b500000313, 0x1f10 }, { 0x3b500000314, 0x1f11 }, { 0x3b700000300, 0x1f74 }, { 0x3b700000301, 0x3ae },
+	{ 0x3b700000313, 0x1f20 }, { 0x3b700000314, 0x1f21 }, { 0x3b700000342, 0x1fc6 }, { 0x3b700000345, 0x1fc3 },
+	{ 0x3b900000300, 0x1f76 }, { 0x3b900000301, 0x3af }, { 0x3b900000304, 0x1fd1 }, { 0x3b900000306, 0x1fd0 },
+	{ 0x3b900000308, 0x3ca }, { 0x3b900000313, 0x1f30 }, { 0x3b900000314, 0x1f31 }, { 0x3b900000342, 0x1fd6 },
+	{ 0x3bf00000300, 0x1f78 }, { 0x3bf00000301, 0x3cc }, { 0x3bf00000313, 0x1f40 }, { 0x3bf00000314, 0x1f41 },
+	{ 0x3c100000313, 0x1fe4 }, { 0x3c100000314, 0x1fe5 }, { 0x3c500000300, 0x1f7a }, { 0x3c500000301, 0x3cd },
+	{ 0x3c500000304, 0x1fe1 }, { 0x3c500000306, 0x1fe0 }, { 0x3c500000308, 0x3cb }, { 0x3c500000313, 0x1f50 },
+	{ 0x3c500000314, 0x1f51 }, { 0x3c500000342, 0x1fe6 }, { 0x3c900000300, 0x1f7c }, { 0x3c900000301, 0x3ce },
+	{ 0x3c900000313, 0x1f60 }, { 0x3c900000314, 0x1f61 }, { 0x3c900000342, 0x1ff6 }, { 0x3c900000345, 0x1ff3 },
+	{ 0x3ca00000300, 0x1fd2 }, { 0x3ca00000301, 0x390 }, { 0x3ca00000342, 0x1fd7 }, { 0x3cb00000300, 0x1fe2 },
+	{ 0x3cb00000301, 0x3b0 }, { 0x3cb00000342, 0x1fe7 }, { 0x3ce00000345, 0x1ff4 }, { 0x3d200000301, 0x3d3 },
+	{ 0x3d200000308, 0x3d4 }, { 0x40600000308, 0x407 }, { 0x41000000306, 0x4d0 }, { 0x41000000308, 0x4d2 },
+	{ 0x41300000301, 0x403 }, { 0x41500000300, 0x400 }, { 0x41500000306, 0x4d6 }, { 0x41500000308, 0x401 },
+	{ 0x41600000306, 0x4c1 }, { 0x41600000308, 0x4dc }, { 0x41700000308, 0x4de }, { 0x41800000300, 0x40d },
+	{ 0x41800000304, 0x4e2 }, { 0x41800000306, 0x419 }, { 0x41800000308, 0x4e4 }, { 0x41a00000301, 0x40c },
+	{ 0x41e00000308, 0x4e6 }, { 0x42300000304, 0x4ee }, { 0x42300000306, 0x40e }, { 0x42300000308, 0x4f0 },
+	{ 0x4230000030b, 0x4f2 }, { 0x42700000308, 0x4f4 }, { 0x42b00000308, 0x4f8 }, { 0x42d00000308, 0x4ec },
+	{ 0x43000000306, 0x4d1 }, { 0x43000000308, 0x4d3 }, { 0x43300000301, 0x453 }, { 0x43500000300, 0x450 },
+	{ 0x43500000306, 0x4d7 }, { 0x43500000308, 0x451 }, { 0x43600000306, 0x4c2 }, { 0x43600000308, 0x4dd },
+	{ 0x43700000308, 0x4df }, { 0x43800000300, 0x45d }, { 0x43800000304, 0x4e3 }, { 0x43800000306, 0x439 },
+	{ 0x43800000308, 0x4e5 }, { 0x43a00000301, 0x45c }, { 0x43e00000308, 0x4e7 }, { 0x44300000304, 0x4ef },
+	{ 0x44300000306, 0x45e }, { 0x44300000308, 0x4f1 }, { 0x4430000030b, 0x4f3 }, { 0x44700000308, 0x4f5 },
+	{ 0x44b00000308, 0x4f9 }, { 0x44d00000308, 0x4ed }, { 0x45600000308, 0x457 }, { 0x4740000030f, 0x476 },
+	{ 0x4750000030f, 0x477 }, { 0x4d800000308, 0x4da }, { 0x4d900000308, 0x4db }, { 0x4e800000308, 0x4ea },
+	{ 0x4e900000308, 0x4eb }, { 0x62700000653, 0x622 }, { 0x62700000654, 0x623 }, { 0x62700000655, 0x625 },
+	{ 0x64800000654, 0x624 }, { 0x64a00000654, 0x626 }, { 0x6c100000654, 0x6c2 }, { 0x6d200000654, 0x6d3 },
+	{ 0x6d500000654, 0x6c0 }, { 0x9280000093c, 0x929 }, { 0x9300000093c, 0x931 }, { 0x9330000093c, 0x934 },
+	{ 0x9c7000009be, 0x9cb }, { 0x9c7000009d7, 0x9cc }, { 0xb4700000b3e, 0xb4b }, { 0xb4700000b56, 0xb48 },
+	{ 0xb4700000b57, 0xb4c }, { 0xb9200000bd7, 0xb94 }, { 0xbc600000bbe, 0xbca }, { 0xbc600000bd7, 0xbcc },
+	{ 0xbc700000bbe, 0xbcb }, { 0xc4600000c56, 0xc48 }, { 0xcbf00000cd5, 0xcc0 }, { 0xcc600000cc2, 0xcca },
+	{ 0xcc600000cd5, 0xcc7 }, { 0xcc600000cd6, 0xcc8 }, { 0xcca00000cd5, 0xccb }, { 0xd4600000d3e, 0xd4a },
+	{ 0xd4600000d57, 0xd4c }, { 0xd4700000d3e, 0xd4b }, { 0xdd900000dca, 0xdda }, { 0xdd900000dcf, 0xddc },
+	{ 0xdd900000ddf, 0xdde }, { 0xddc00000dca, 0xddd }, { 0x10250000102e, 0x1026 }, { 0x1b0500001b35, 0x1b06 },
+	{ 0x1b0700001b35, 0x1b08 }, { 0x1b0900001b35, 0x1b0a }, { 0x1b0b00001b35, 0x1b0c }, { 0x1b0d00001b35, 0x1b0e },
+	{ 0x1b1100001b35, 0x1b12 }, { 0x1b3a00001b35, 0x1b3b }, { 0x1b3c00001b35, 0x1b3d }, { 0x1b3e00001b35, 0x1b40 },
+	{ 0x1b3f00001b35, 0x1b41 }, { 0x1b4200001b35, 0x1b43 }, { 0x1e3600000304, 0x1e38 }, { 0x1e3700000304, 0x1e39 },
+	{ 0x1e5a00000304, 0x1e5c }, { 0x1e5b00000304, 0x1e5d }, { 0x1e6200000307, 0x1e68 }, { 0x1e6300000307, 0x1e69 },
+	{ 0x1ea000000302, 0x1eac }, { 0x1ea000000306, 0x1eb6 }, { 0x1ea100000302, 0x1ead }, { 0x1ea100000306, 0x1eb7 },
+	{ 0x1eb800000302, 0x1ec6 }, { 0x1eb900000302, 0x1ec7 }, { 0x1ecc00000302, 0x1ed8 }, { 0x1ecd00000302, 0x1ed9 },
+	{ 0x1f0000000300, 0x1f02 }, { 0x1f0000000301, 0x1f04 }, { 0x1f0000000342, 0x1f06 }, { 0x1f0000000345, 0x1f80 },
+	{ 0x1f0100000300, 0x1f03 }, { 0x1f0100000301, 0x1f05 }, { 0x1f0100000342, 0x1f07 }, { 0x1f0100000345, 0x1f81 },
+	{ 0x1f0200000345, 0x1f82 }, { 0x1f0300000345, 0x1f83 }, { 0x1f0400000345, 0x1f84 }, { 0x1f0500000345, 0x1f85 },
+	{ 0x1f0600000345, 0x1f86 }, { 0x1f0700000345, 0x1f87 }, { 0x1f0800000300, 0x1f0a }, { 0x1f0800000301, 0x1f0c },
+	{ 0x1f0800000342, 0x1f0e }, { 0x1f0800000345, 0x1f88 }, { 0x1f0900000300, 0x1f0b }, { 0x1f0900000301, 0x1f0d },
+	{ 0x1f0900000342, 0x1f0f }, { 0x1f0900000345, 0x1f89 }, { 0x1f0a00000345, 0x1f8a }, { 0x1f0b00000345, 0x1f8b },
+	{ 0x1f0c00000345, 0x1f8c }, { 0x1f0d00000345, 0x1f8d }, { 0x1f0e00000345, 0x1f8e }, { 0x1f0f00000345, 0x1f8f },
+	{ 0x1f1000000300, 0x1f12 }, { 0x1f1000000301, 0x1f14 }, { 0x1f1100000300, 0x1f13 }, { 0x1f1100000301, 0x1f15 },
+	{ 0x1f1800000300, 0x1f1a }, { 0x1f1800000301, 0x1f1c }, { 0x1f1900000300, 0x1f1b }, { 0x1f1900000301, 0x1f1d },
+	{ 0x1f2000000300, 0x1f22 }, { 0x1f2000000301, 0x1f24 }, { 0x1f2000000342, 0x1f26 }, { 0x1f2000000345, 0x1f90 },
+	{ 0x1f2100000300, 0x1f23 }, { 0x1f2100000301, 0x1f25 }, { 0x1f2100000342, 0x1f27 }, { 0x1f2100000345, 0x1f91 },
+	{ 0x1f2200000345, 0x1f92 }, { 0x1f2300000345, 0x1f93 }, { 0x1f2400000345, 0x1f94 }, { 0x1f2500000345, 0x1f95 },
+	{ 0x1f2600000345, 0x1f96 }, { 0x1f2700000345, 0x1f97 }, { 0x1f2800000300, 0x1f2a }, { 0x1f2800000301, 0x1f2c },
+	{ 0x1f2800000342, 0x1f2e }, { 0x1f2800000345, 0x1f98 }, { 0x1f2900000300, 0x1f2b }, { 0x1f2900000301, 0x1f2d },
+	{ 0x1f2900000342, 0x1f2f }, { 0x1f2900000345, 0x1f99 }, { 0x1f2a00000345, 0x1f9a }, { 0x1f2b00000345, 0x1f9b },
+	{ 0x1f2c00000345, 0x1f9c }, { 0x1f2d00000345, 0x1f9d }, { 0x1f2e00000345, 0x1f9e }, { 0x1f2f00000345, 0x1f9f },
+	{ 0x1f3000000300, 0x1f32 }, { 0x1f3000000301, 0x1f34 }, { 0x1f3000000342, 0x1f36 }, { 0x1f3100000300, 0x1f33 },
+	{ 0x1f3100000301, 0x1f35 }, { 0x1f3100000342, 0x1f37 }, { 0x1f3800000300, 0x1f3a }, { 0x1f3800000301, 0x1f3c },
+	{ 0x1f3800000342, 0x1f3e }, { 0x1f3900000300, 0x1f3b }, { 0x1f3900000301, 0x1f3d }, { 0x1f3900000342, 0x1f3f },
+	{ 0x1f4000000300, 0x1f42 }, { 0x1f4000000301, 0x1f44 }, { 0x1f4100000300, 0x1f43 }, { 0x1f4100000301, 0x1f45 },
+	{ 0x1f4800000300, 0x1f4a }, { 0x1f4800000301, 0x1f4c }, { 0x1f4900000300, 0x1f4b }, { 0x1f4900000301, 0x1f4d },
+	{ 0x1f5000000300, 0x1f52 }, { 0x1f5000000301, 0x1f54 }, { 0x1f5000000342, 0x1f56 }, { 0x1f5100000300, 0x1f53 },
+	{ 0x1f5100000301, 0x1f55 }, { 0x1f5100000342, 0x1f57 }, { 0x1f5900000300, 0x1f5b }, { 0x1f5900000301, 0x1f5d },
+	{ 0x1f5900000342, 0x1f5f }, { 0x1f6000000300, 0x1f62 }, { 0x1f6000000301, 0x1f64 }, { 0x1f6000000342, 0x1f66 },
+	{ 0x1f6000000345, 0x1fa0 }, { 0x1f6100000300, 0x1f63 }, { 0x1f6100000301, 0x1f65 }, { 0x1f6100000342, 0x1f67 },
+	{ 0x1f6100000345, 0x1fa1 }, { 0x1f6200000345, 0x1fa2 }, { 0x1f6300000345, 0x1fa3 }, { 0x1f6400000345, 0x1fa4 },
+	{ 0x1f6500000345, 0x1fa5 }, { 0x1f6600000345, 0x1fa6 }, { 0x1f6700000345, 0x1fa7 }, { 0x1f6800000300, 0x1f6a },
+	{ 0x1f6800000301, 0x1f6c }, { 0x1f6800000342, 0x1f6e }, { 0x1f6800000345, 0x1fa8 }, { 0x1f6900000300, 0x1f6b },
+	{ 0x1f6900000301, 0x1f6d }, { 0x1f6900000342, 0x1f6f }, { 0x1f6900000345, 0x1fa9 }, { 0x1f6a00000345, 0x1faa },
+	{ 0x1f6b00000345, 0x1fab }, { 0x1f6c00000345, 0x1fac }, { 0x1f6d00000345, 0x1fad }, { 0x1f6e00000345, 0x1fae },
+	{ 0x1f6f00000345, 0x1faf }, { 0x1f7000000345, 0x1fb2 }, { 0x1f7400000345, 0x1fc2 }, { 0x1f7c00000345, 0x1ff2 },
+	{ 0x1fb600000345, 0x1fb7 }, { 0x1fbf00000300, 0x1fcd }, { 0x1fbf00000301, 0x1fce }, { 0x1fbf00000342, 0x1fcf },
+	{ 0x1fc600000345, 0x1fc7 }, { 0x1ff600000345, 0x1ff7 }, { 0x1ffe00000300, 0x1fdd }, { 0x1ffe00000301, 0x1fde },
+	{ 0x1ffe00000342, 0x1fdf }, { 0x219000000338, 0x219a }, { 0x219200000338, 0x219b }, { 0x219400000338, 0x21ae },
+	{ 0x21d000000338, 0x21cd }, { 0x21d200000338, 0x21cf }, { 0x21d400000338, 0x21ce }, { 0x220300000338, 0x2204 },
+	{ 0x220800000338, 0x2209 }, { 0x220b00000338, 0x220c }, { 0x222300000338, 0x2224 }, { 0x222500000338, 0x2226 },
+	{ 0x223c00000338, 0x2241 }, { 0x224300000338, 0x2244 }, { 0x224500000338, 0x2247 }, { 0x224800000338, 0x2249 },
+	{ 0x224d00000338, 0x226d }, { 0x226100000338, 0x2262 }, { 0x226400000338, 0x2270 }, { 0x226500000338, 0x2271 },
+	{ 0x227200000338, 0x2274 }, { 0x227300000338, 0x2275 }, { 0x227600000338, 0x2278 }, { 0x227700000338, 0x2279 },
+	{ 0x227a00000338, 0x2280 }, { 0x227b00000338, 0x2281 }, { 0x227c00000338, 0x22e0 }, { 0x227d00000338, 0x22e1 },
+	{ 0x228200000338, 0x2284 }, { 0x228300000338, 0x2285 }, { 0x228600000338, 0x2288 }, { 0x228700000338, 0x2289 },
+	{ 0x229100000338, 0x22e2 }, { 0x229200000338, 0x22e3 }, { 0x22a200000338, 0x22ac }, { 0x22a800000338, 0x22ad },
+	{ 0x22a900000338, 0x22ae }, { 0x22ab00000338, 0x22af }, { 0x22b200000338, 0x22ea }, { 0x22b300000338, 0x22eb },
+	{ 0x22b400000338, 0x22ec }, { 0x22b500000338, 0x22ed }, { 0x304600003099, 0x3094 }, { 0x304b00003099, 0x304c },
+	{ 0x304d00003099, 0x304e }, { 0x304f00003099, 0x3050 }, { 0x305100003099, 0x3052 }, { 0x305300003099, 0x3054 },
+	{ 0x305500003099, 0x3056 }, { 0x305700003099, 0x3058 }, { 0x305900003099, 0x305a }, { 0x305b00003099, 0x305c },
+	{ 0x305d00003099, 0x305e }, { 0x305f00003099, 0x3060 }, { 0x306100003099, 0x3062 }, { 0x306400003099, 0x3065 },
+	{ 0x306600003099, 0x3067 }, { 0x306800003099, 0x3069 }, { 0x306f00003099, 0x3070 }, { 0x306f0000309a, 0x3071 },
+	{ 0x307200003099, 0x3073 }, { 0x30720000309a, 0x3074 }, { 0x307500003099, 0x3076 }, { 0x30750000309a, 0x3077 },
+	{ 0x307800003099, 0x3079 }, { 0x30780000309a, 0x307a }, { 0x307b00003099, 0x307c }, { 0x307b0000309a, 0x307d },
+	{ 0x309d00003099, 0x309e }, { 0x30a600003099, 0x30f4 }, { 0x30ab00003099, 0x30ac }, { 0x30ad00003099, 0x30ae },
+	{ 0x30af00003099, 0x30b0 }, { 0x30b100003099, 0x30b2 }, { 0x30b300003099, 0x30b4 }, { 0x30b500003099, 0x30b6 },
+	{ 0x30b700003099, 0x30b8 }, { 0x30b900003099, 0x30ba }, { 0x30bb00003099, 0x30bc }, { 0x30bd00003099, 0x30be },
+	{ 0x30bf00003099, 0x30c0 }, { 0x30c100003099, 0x30c2 }, { 0x30c400003099, 0x30c5 }, { 0x30c600003099, 0x30c7 },
+	{ 0x30c800003099, 0x30c9 }, { 0x30cf00003099, 0x30d0 }, { 0x30cf0000309a, 0x30d1 }, { 0x30d200003099, 0x30d3 },
+	{ 0x30d20000309a, 0x30d4 }, { 0x30d500003099, 0x30d6 }, { 0x30d50000309a, 0x30d7 }, { 0x30d800003099, 0x30d9 },
+	{ 0x30d80000309a, 0x30da }, { 0x30db00003099, 0x30dc }, { 0x30db0000309a, 0x30dd }, { 0x30ef00003099, 0x30f7 },
+	{ 0x30f000003099, 0x30f8 }, { 0x30f100003099, 0x30f9 }, { 0x30f200003099, 0x30fa }, { 0x30fd00003099, 0x30fe },
+	{ 0x11099000110ba, 0x1109a }, { 0x1109b000110ba, 0x1109c }, { 0x110a5000110ba, 0x110ab }, { 0x1113100011127, 0x1112e },
+	{ 0x1113200011127, 0x1112f }, { 0x113470001133e, 0x1134b }, { 0x1134700011357, 0x1134c }, { 0x114b9000114b0, 0x114bc },
+	{ 0x114b9000114ba, 0x114bb }, { 0x114b9000114bd, 0x114be }, { 0x115b8000115af, 0x115ba }, { 0x115b9000115af, 0x115bb },
+};
+const CompositionRecord* UnicodeCompositionRecordPtr = UnicodeCompositionRecord;
+
+const char* CompressedStringData = 
+	"\x41\xCC\x80\x41\xCC\x81\x41\xCC\x82\x41\xCC\x83\x41\xCC\x88\x41\xCC\x8A\x43\xCC\xA7\x45\xCC\x80\x45"
+	"\xCC\x81\x45\xCC\x82\x45\xCC\x88\x49\xCC\x80\x49\xCC\x81\x49\xCC\x82\x49\xCC\x88\x4E\xCC\x83\x4F\xCC"
+	"\x80\x4F\xCC\x81\x4F\xCC\x82\x4F\xCC\x83\x4F\xCC\x88\x55\xCC\x80\x55\xCC\x81\x55\xCC\x82\x55\xCC\x88"
+	"\x59\xCC\x81\x61\xCC\x80\x61\xCC\x81\x61\xCC\x82\x61\xCC\x83\x61\xCC\x88\x61\xCC\x8A\x63\xCC\xA7\x65"
+	"\xCC\x80\x65\xCC\x81\x65\xCC\x82\x65\xCC\x88\x69\xCC\x80\x69\xCC\x81\x69\xCC\x82\x69\xCC\x88\x6E\xCC"
+	"\x83\x6F\xCC\x80\x6F\xCC\x81\x6F\xCC\x82\x6F\xCC\x83\x6F\xCC\x88\x75\xCC\x80\x75\xCC\x81\x75\xCC\x82"
+	"\x75\xCC\x88\x79\xCC\x81\x79\xCC\x88\x41\xCC\x84\x61\xCC\x84\x41\xCC\x86\x61\xCC\x86\x41\xCC\xA8\x61"
+	"\xCC\xA8\x43\xCC\x81\x63\xCC\x81\x43\xCC\x82\x63\xCC\x82\x43\xCC\x87\x63\xCC\x87\x43\xCC\x8C\x63\xCC"
+	"\x8C\x44\xCC\x8C\x64\xCC\x8C\x45\xCC\x84\x65\xCC\x84\x45\xCC\x86\x65\xCC\x86\x45\xCC\x87\x65\xCC\x87"
+	"\x45\xCC\xA8\x65\xCC\xA8\x45\xCC\x8C\x65\xCC\x8C\x47\xCC\x82\x67\xCC\x82\x47\xCC\x86\x67\xCC\x86\x47"
+	"\xCC\x87\x67\xCC\x87\x47\xCC\xA7\x67\xCC\xA7\x48\xCC\x82\x68\xCC\x82\x49\xCC\x83\x69\xCC\x83\x49\xCC"
+	"\x84\x69\xCC\x84\x49\xCC\x86\x69\xCC\x86\x49\xCC\xA8\x69\xCC\xA8\x49\xCC\x87\x4A\xCC\x82\x6A\xCC\x82"
+	"\x4B\xCC\xA7\x6B\xCC\xA7\x4C\xCC\x81\x6C\xCC\x81\x4C\xCC\xA7\x6C\xCC\xA7\x4C\xCC\x8C\x6C\xCC\x8C\x4E"
+	"\xCC\x81\x6E\xCC\x81\x4E\xCC\xA7\x6E\xCC\xA7\x4E\xCC\x8C\x6E\xCC\x8C\x4F\xCC\x84\x6F\xCC\x84\x4F\xCC"
+	"\x86\x6F\xCC\x86\x4F\xCC\x8B\x6F\xCC\x8B\x52\xCC\x81\x72\xCC\x81\x52\xCC\xA7\x72\xCC\xA7\x52\xCC\x8C"
+	"\x72\xCC\x8C\x53\xCC\x81\x73\xCC\x81\x53\xCC\x82\x73\xCC\x82\x53\xCC\xA7\x73\xCC\xA7\x53\xCC\x8C\x73"
+	"\xCC\x8C\x54\xCC\xA7\x74\xCC\xA7\x54\xCC\x8C\x74\xCC\x8C\x55\xCC\x83\x75\xCC\x83\x55\xCC\x84\x75\xCC"
+	"\x84\x55\xCC\x86\x75\xCC\x86\x55\xCC\x8A\x75\xCC\x8A\x55\xCC\x8B\x75\xCC\x8B\x55\xCC\xA8\x75\xCC\xA8"
+	"\x57\xCC\x82\x77\xCC\x82\x59\xCC\x82\x79\xCC\x82\x59\xCC\x88\x5A\xCC\x81\x7A\xCC\x81\x5A\xCC\x87\x7A"
+	"\xCC\x87\x5A\xCC\x8C\x7A\xCC\x8C\x4F\xCC\x9B\x6F\xCC\x9B\x55\xCC\x9B\x75\xCC\x9B\x41\xCC\x8C\x61\xCC"
+	"\x8C\x49\xCC\x8C\x69\xCC\x8C\x4F\xCC\x8C\x6F\xCC\x8C\x55\xCC\x8C\x75\xCC\x8C\x55\xCC\x88\xCC\x84\x75"
+	"\xCC\x88\xCC\x84\x55\xCC\x88\xCC\x81\x75\xCC\x88\xCC\x81\x55\xCC\x88\xCC\x8C\x75\xCC\x88\xCC\x8C\x55"
+	"\xCC\x88\xCC\x80\x75\xCC\x88\xCC\x80\x41\xCC\x88\xCC\x84\x61\xCC\x88\xCC\x84\x41\xCC\x87\xCC\x84\x61"
+	"\xCC\x87\xCC\x84\xC3\x86\xCC\x84\xC3\xA6\xCC\x84\x47\xCC\x8C\x67\xCC\x8C\x4B\xCC\x8C\x6B\xCC\x8C\x4F"
+	"\xCC\xA8\x6F\xCC\xA8\x4F\xCC\xA8\xCC\x84\x6F\xCC\xA8\xCC\x84\xC6\xB7\xCC\x8C\xCA\x92\xCC\x8C\x6A\xCC"
+	"\x8C\x47\xCC\x81\x67\xCC\x81\x4E\xCC\x80\x6E\xCC\x80\x41\xCC\x8A\xCC\x81\x61\xCC\x8A\xCC\x81\xC3\x86"
+	"\xCC\x81\xC3\xA6\xCC\x81\xC3\x98\xCC\x81\xC3\xB8\xCC\x81\x41\xCC\x8F\x61\xCC\x8F\x41\xCC\x91\x61\xCC"
+	"\x91\x45\xCC\x8F\x65\xCC\x8F\x45\xCC\x91\x65\xCC\x91\x49\xCC\x8F\x69\xCC\x8F\x49\xCC\x91\x69\xCC\x91"
+	"\x4F\xCC\x8F\x6F\xCC\x8F\x4F\xCC\x91\x6F\xCC\x91\x52\xCC\x8F\x72\xCC\x8F\x52\xCC\x91\x72\xCC\x91\x55"
+	"\xCC\x8F\x75\xCC\x8F\x55\xCC\x91\x75\xCC\x91\x53\xCC\xA6\x73\xCC\xA6\x54\xCC\xA6\x74\xCC\xA6\x48\xCC"
+	"\x8C\x68\xCC\x8C\x45\xCC\xA7\x65\xCC\xA7\x4F\xCC\x88\xCC\x84\x6F\xCC\x88\xCC\x84\x4F\xCC\x83\xCC\x84"
+	"\x6F\xCC\x83\xCC\x84\x4F\xCC\x87\x6F\xCC\x87\x4F\xCC\x87\xCC\x84\x6F\xCC\x87\xCC\x84\x59\xCC\x84\x79"
+	"\xCC\x84\xCC\x93\xCA\xB9\x3B\xC2\xA8\xCC\x81\xCE\x91\xCC\x81\xC2\xB7\xCE\x95\xCC\x81\xCE\x97\xCC\x81"
+	"\xCE\x99\xCC\x81\xCE\x9F\xCC\x81\xCE\xA5\xCC\x81\xCE\xA9\xCC\x81\xCE\xB9\xCC\x88\xCC\x81\xCE\x99\xCC"
+	"\x88\xCE\xA5\xCC\x88\xCE\xB1\xCC\x81\xCE\xB5\xCC\x81\xCE\xB7\xCC\x81\xCE\xB9\xCC\x81\xCF\x85\xCC\x88"
+	"\xCC\x81\xCE\xBF\xCC\x81\xCF\x85\xCC\x81\xCF\x89\xCC\x81\xCF\x92\xCC\x81\xCF\x92\xCC\x88\xD0\x95\xCC"
+	"\x80\xD0\x95\xCC\x88\xD0\x93\xCC\x81\xD0\x86\xCC\x88\xD0\x9A\xCC\x81\xD0\x98\xCC\x80\xD0\xA3\xCC\x86"
+	"\xD0\x98\xCC\x86\xD0\xB8\xCC\x86\xD0\xB5\xCC\x80\xD0\xB5\xCC\x88\xD0\xB3\xCC\x81\xD1\x96\xCC\x88\xD0"
+	"\xBA\xCC\x81\xD0\xB8\xCC\x80\xD1\x83\xCC\x86\xD1\xB4\xCC\x8F\xD1\xB5\xCC\x8F\xD0\x96\xCC\x86\xD0\xB6"
+	"\xCC\x86\xD0\x90\xCC\x86\xD0\xB0\xCC\x86\xD0\x90\xCC\x88\xD0\xB0\xCC\x88\xD0\x95\xCC\x86\xD0\xB5\xCC"
+	"\x86\xD3\x98\xCC\x88\xD3\x99\xCC\x88\xD0\x96\xCC\x88\xD0\xB6\xCC\x88\xD0\x97\xCC\x88\xD0\xB7\xCC\x88"
+	"\xD0\x98\xCC\x84\xD0\xB8\xCC\x84\xD0\x98\xCC\x88\xD0\xB8\xCC\x88\xD0\x9E\xCC\x88\xD0\xBE\xCC\x88\xD3"
+	"\xA8\xCC\x88\xD3\xA9\xCC\x88\xD0\xAD\xCC\x88\xD1\x8D\xCC\x88\xD0\xA3\xCC\x84\xD1\x83\xCC\x84\xD0\xA3"
+	"\xCC\x88\xD1\x83\xCC\x88\xD0\xA3\xCC\x8B\xD1\x83\xCC\x8B\xD0\xA7\xCC\x88\xD1\x87\xCC\x88\xD0\xAB\xCC"
+	"\x88\xD1\x8B\xCC\x88\xD8\xA7\xD9\x93\xD8\xA7\xD9\x94\xD9\x88\xD9\x94\xD8\xA7\xD9\x95\xD9\x8A\xD9\x94"
+	"\xDB\x95\xD9\x94\xDB\x81\xD9\x94\xDB\x92\xD9\x94\xE0\xA4\xA8\xE0\xA4\xBC\xE0\xA4\xB0\xE0\xA4\xBC\xE0"
+	"\xA4\xB3\xE0\xA4\xBC\xE0\xA4\x95\xE0\xA4\xBC\xE0\xA4\x96\xE0\xA4\xBC\xE0\xA4\x97\xE0\xA4\xBC\xE0\xA4"
+	"\x9C\xE0\xA4\xBC\xE0\xA4\xA1\xE0\xA4\xBC\xE0\xA4\xA2\xE0\xA4\xBC\xE0\xA4\xAB\xE0\xA4\xBC\xE0\xA4\xAF"
+	"\xE0\xA4\xBC\xE0\xA7\x87\xE0\xA6\xBE\xE0\xA7\x87\xE0\xA7\x97\xE0\xA6\xA1\xE0\xA6\xBC\xE0\xA6\xA2\xE0"
+	"\xA6\xBC\xE0\xA6\xAF\xE0\xA6\xBC\xE0\xA8\xB2\xE0\xA8\xBC\xE0\xA8\xB8\xE0\xA8\xBC\xE0\xA8\x96\xE0\xA8"
+	"\xBC\xE0\xA8\x97\xE0\xA8\xBC\xE0\xA8\x9C\xE0\xA8\xBC\xE0\xA8\xAB\xE0\xA8\xBC\xE0\xAD\x87\xE0\xAD\x96"
+	"\xE0\xAD\x87\xE0\xAC\xBE\xE0\xAD\x87\xE0\xAD\x97\xE0\xAC\xA1\xE0\xAC\xBC\xE0\xAC\xA2\xE0\xAC\xBC\xE0"
+	"\xAE\x92\xE0\xAF\x97\xE0\xAF\x86\xE0\xAE\xBE\xE0\xAF\x87\xE0\xAE\xBE\xE0\xAF\x86\xE0\xAF\x97\xE0\xB1"
+	"\x86\xE0\xB1\x96\xE0\xB2\xBF\xE0\xB3\x95\xE0\xB3\x86\xE0\xB3\x95\xE0\xB3\x86\xE0\xB3\x96\xE0\xB3\x86"
+	"\xE0\xB3\x82\xE0\xB3\x86\xE0\xB3\x82\xE0\xB3\x95\xE0\xB5\x86\xE0\xB4\xBE\xE0\xB5\x87\xE0\xB4\xBE\xE0"
+	"\xB5\x86\xE0\xB5\x97\xE0\xB7\x99\xE0\xB7\x8A\xE0\xB7\x99\xE0\xB7\x8F\xE0\xB7\x99\xE0\xB7\x8F\xE0\xB7"
+	"\x8A\xE0\xB7\x99\xE0\xB7\x9F\xE0\xBD\x82\xE0\xBE\xB7\xE0\xBD\x8C\xE0\xBE\xB7\xE0\xBD\x91\xE0\xBE\xB7"
+	"\xE0\xBD\x96\xE0\xBE\xB7\xE0\xBD\x9B\xE0\xBE\xB7\xE0\xBD\x80\xE0\xBE\xB5\xE0\xBD\xB1\xE0\xBD\xB2\xE0"
+	"\xBD\xB1\xE0\xBD\xB4\xE0\xBE\xB2\xE0\xBE\x80\xE0\xBE\xB3\xE0\xBE\x80\xE0\xBD\xB1\xE0\xBE\x80\xE0\xBE"
+	"\x92\xE0\xBE\xB7\xE0\xBE\x9C\xE0\xBE\xB7\xE0\xBE\xA1\xE0\xBE\xB7\xE0\xBE\xA6\xE0\xBE\xB7\xE0\xBE\xAB"
+	"\xE0\xBE\xB7\xE0\xBE\x90\xE0\xBE\xB5\xE1\x80\xA5\xE1\x80\xAE\xE1\xAC\x85\xE1\xAC\xB5\xE1\xAC\x87\xE1"
+	"\xAC\xB5\xE1\xAC\x89\xE1\xAC\xB5\xE1\xAC\x8B\xE1\xAC\xB5\xE1\xAC\x8D\xE1\xAC\xB5\xE1\xAC\x91\xE1\xAC"
+	"\xB5\xE1\xAC\xBA\xE1\xAC\xB5\xE1\xAC\xBC\xE1\xAC\xB5\xE1\xAC\xBE\xE1\xAC\xB5\xE1\xAC\xBF\xE1\xAC\xB5"
+	"\xE1\xAD\x82\xE1\xAC\xB5\x41\xCC\xA5\x61\xCC\xA5\x42\xCC\x87\x62\xCC\x87\x42\xCC\xA3\x62\xCC\xA3\x42"
+	"\xCC\xB1\x62\xCC\xB1\x43\xCC\xA7\xCC\x81\x63\xCC\xA7\xCC\x81\x44\xCC\x87\x64\xCC\x87\x44\xCC\xA3\x64"
+	"\xCC\xA3\x44\xCC\xB1\x64\xCC\xB1\x44\xCC\xA7\x64\xCC\xA7\x44\xCC\xAD\x64\xCC\xAD\x45\xCC\x84\xCC\x80"
+	"\x65\xCC\x84\xCC\x80\x45\xCC\x84\xCC\x81\x65\xCC\x84\xCC\x81\x45\xCC\xAD\x65\xCC\xAD\x45\xCC\xB0\x65"
+	"\xCC\xB0\x45\xCC\xA7\xCC\x86\x65\xCC\xA7\xCC\x86\x46\xCC\x87\x66\xCC\x87\x47\xCC\x84\x67\xCC\x84\x48"
+	"\xCC\x87\x68\xCC\x87\x48\xCC\xA3\x68\xCC\xA3\x48\xCC\x88\x68\xCC\x88\x48\xCC\xA7\x68\xCC\xA7\x48\xCC"
+	"\xAE\x68\xCC\xAE\x49\xCC\xB0\x69\xCC\xB0\x49\xCC\x88\xCC\x81\x69\xCC\x88\xCC\x81\x4B\xCC\x81\x6B\xCC"
+	"\x81\x4B\xCC\xA3\x6B\xCC\xA3\x4B\xCC\xB1\x6B\xCC\xB1\x4C\xCC\xA3\x6C\xCC\xA3\x4C\xCC\xA3\xCC\x84\x6C"
+	"\xCC\xA3\xCC\x84\x4C\xCC\xB1\x6C\xCC\xB1\x4C\xCC\xAD\x6C\xCC\xAD\x4D\xCC\x81\x6D\xCC\x81\x4D\xCC\x87"
+	"\x6D\xCC\x87\x4D\xCC\xA3\x6D\xCC\xA3\x4E\xCC\x87\x6E\xCC\x87\x4E\xCC\xA3\x6E\xCC\xA3\x4E\xCC\xB1\x6E"
+	"\xCC\xB1\x4E\xCC\xAD\x6E\xCC\xAD\x4F\xCC\x83\xCC\x81\x6F\xCC\x83\xCC\x81\x4F\xCC\x83\xCC\x88\x6F\xCC"
+	"\x83\xCC\x88\x4F\xCC\x84\xCC\x80\x6F\xCC\x84\xCC\x80\x4F\xCC\x84\xCC\x81\x6F\xCC\x84\xCC\x81\x50\xCC"
+	"\x81\x70\xCC\x81\x50\xCC\x87\x70\xCC\x87\x52\xCC\x87\x72\xCC\x87\x52\xCC\xA3\x72\xCC\xA3\x52\xCC\xA3"
+	"\xCC\x84\x72\xCC\xA3\xCC\x84\x52\xCC\xB1\x72\xCC\xB1\x53\xCC\x87\x73\xCC\x87\x53\xCC\xA3\x73\xCC\xA3"
+	"\x53\xCC\x81\xCC\x87\x73\xCC\x81\xCC\x87\x53\xCC\x8C\xCC\x87\x73\xCC\x8C\xCC\x87\x53\xCC\xA3\xCC\x87"
+	"\x73\xCC\xA3\xCC\x87\x54\xCC\x87\x74\xCC\x87\x54\xCC\xA3\x74\xCC\xA3\x54\xCC\xB1\x74\xCC\xB1\x54\xCC"
+	"\xAD\x74\xCC\xAD\x55\xCC\xA4\x75\xCC\xA4\x55\xCC\xB0\x75\xCC\xB0\x55\xCC\xAD\x75\xCC\xAD\x55\xCC\x83"
+	"\xCC\x81\x75\xCC\x83\xCC\x81\x55\xCC\x84\xCC\x88\x75\xCC\x84\xCC\x88\x56\xCC\x83\x76\xCC\x83\x56\xCC"
+	"\xA3\x76\xCC\xA3\x57\xCC\x80\x77\xCC\x80\x57\xCC\x81\x77\xCC\x81\x57\xCC\x88\x77\xCC\x88\x57\xCC\x87"
+	"\x77\xCC\x87\x57\xCC\xA3\x77\xCC\xA3\x58\xCC\x87\x78\xCC\x87\x58\xCC\x88\x78\xCC\x88\x59\xCC\x87\x79"
+	"\xCC\x87\x5A\xCC\x82\x7A\xCC\x82\x5A\xCC\xA3\x7A\xCC\xA3\x5A\xCC\xB1\x7A\xCC\xB1\x68\xCC\xB1\x74\xCC"
+	"\x88\x77\xCC\x8A\x79\xCC\x8A\xC5\xBF\xCC\x87\x41\xCC\xA3\x61\xCC\xA3\x41\xCC\x89\x61\xCC\x89\x41\xCC"
+	"\x82\xCC\x81\x61\xCC\x82\xCC\x81\x41\xCC\x82\xCC\x80\x61\xCC\x82\xCC\x80\x41\xCC\x82\xCC\x89\x61\xCC"
+	"\x82\xCC\x89\x41\xCC\x82\xCC\x83\x61\xCC\x82\xCC\x83\x41\xCC\xA3\xCC\x82\x61\xCC\xA3\xCC\x82\x41\xCC"
+	"\x86\xCC\x81\x61\xCC\x86\xCC\x81\x41\xCC\x86\xCC\x80\x61\xCC\x86\xCC\x80\x41\xCC\x86\xCC\x89\x61\xCC"
+	"\x86\xCC\x89\x41\xCC\x86\xCC\x83\x61\xCC\x86\xCC\x83\x41\xCC\xA3\xCC\x86\x61\xCC\xA3\xCC\x86\x45\xCC"
+	"\xA3\x65\xCC\xA3\x45\xCC\x89\x65\xCC\x89\x45\xCC\x83\x65\xCC\x83\x45\xCC\x82\xCC\x81\x65\xCC\x82\xCC"
+	"\x81\x45\xCC\x82\xCC\x80\x65\xCC\x82\xCC\x80\x45\xCC\x82\xCC\x89\x65\xCC\x82\xCC\x89\x45\xCC\x82\xCC"
+	"\x83\x65\xCC\x82\xCC\x83\x45\xCC\xA3\xCC\x82\x65\xCC\xA3\xCC\x82\x49\xCC\x89\x69\xCC\x89\x49\xCC\xA3"
+	"\x69\xCC\xA3\x4F\xCC\xA3\x6F\xCC\xA3\x4F\xCC\x89\x6F\xCC\x89\x4F\xCC\x82\xCC\x81\x6F\xCC\x82\xCC\x81"
+	"\x4F\xCC\x82\xCC\x80\x6F\xCC\x82\xCC\x80\x4F\xCC\x82\xCC\x89\x6F\xCC\x82\xCC\x89\x4F\xCC\x82\xCC\x83"
+	"\x6F\xCC\x82\xCC\x83\x4F\xCC\xA3\xCC\x82\x6F\xCC\xA3\xCC\x82\x4F\xCC\x9B\xCC\x81\x6F\xCC\x9B\xCC\x81"
+	"\x4F\xCC\x9B\xCC\x80\x6F\xCC\x9B\xCC\x80\x4F\xCC\x9B\xCC\x89\x6F\xCC\x9B\xCC\x89\x4F\xCC\x9B\xCC\x83"
+	"\x6F\xCC\x9B\xCC\x83\x4F\xCC\x9B\xCC\xA3\x6F\xCC\x9B\xCC\xA3\x55\xCC\xA3\x75\xCC\xA3\x55\xCC\x89\x75"
+	"\xCC\x89\x55\xCC\x9B\xCC\x81\x75\xCC\x9B\xCC\x81\x55\xCC\x9B\xCC\x80\x75\xCC\x9B\xCC\x80\x55\xCC\x9B"
+	"\xCC\x89\x75\xCC\x9B\xCC\x89\x55\xCC\x9B\xCC\x83\x75\xCC\x9B\xCC\x83\x55\xCC\x9B\xCC\xA3\x75\xCC\x9B"
+	"\xCC\xA3\x59\xCC\x80\x79\xCC\x80\x59\xCC\xA3\x79\xCC\xA3\x59\xCC\x89\x79\xCC\x89\x59\xCC\x83\x79\xCC"
+	"\x83\xCE\xB1\xCC\x93\xCE\xB1\xCC\x94\xCE\xB1\xCC\x93\xCC\x80\xCE\xB1\xCC\x94\xCC\x80\xCE\xB1\xCC\x93"
+	"\xCC\x81\xCE\xB1\xCC\x94\xCC\x81\xCE\xB1\xCC\x93\xCD\x82\xCE\xB1\xCC\x94\xCD\x82\xCE\x91\xCC\x93\xCE"
+	"\x91\xCC\x94\xCE\x91\xCC\x93\xCC\x80\xCE\x91\xCC\x94\xCC\x80\xCE\x91\xCC\x93\xCC\x81\xCE\x91\xCC\x94"
+	"\xCC\x81\xCE\x91\xCC\x93\xCD\x82\xCE\x91\xCC\x94\xCD\x82\xCE\xB5\xCC\x93\xCE\xB5\xCC\x94\xCE\xB5\xCC"
+	"\x93\xCC\x80\xCE\xB5\xCC\x94\xCC\x80\xCE\xB5\xCC\x93\xCC\x81\xCE\xB5\xCC\x94\xCC\x81\xCE\x95\xCC\x93"
+	"\xCE\x95\xCC\x94\xCE\x95\xCC\x93\xCC\x80\xCE\x95\xCC\x94\xCC\x80\xCE\x95\xCC\x93\xCC\x81\xCE\x95\xCC"
+	"\x94\xCC\x81\xCE\xB7\xCC\x93\xCE\xB7\xCC\x94\xCE\xB7\xCC\x93\xCC\x80\xCE\xB7\xCC\x94\xCC\x80\xCE\xB7"
+	"\xCC\x93\xCC\x81\xCE\xB7\xCC\x94\xCC\x81\xCE\xB7\xCC\x93\xCD\x82\xCE\xB7\xCC\x94\xCD\x82\xCE\x97\xCC"
+	"\x93\xCE\x97\xCC\x94\xCE\x97\xCC\x93\xCC\x80\xCE\x97\xCC\x94\xCC\x80\xCE\x97\xCC\x93\xCC\x81\xCE\x97"
+	"\xCC\x94\xCC\x81\xCE\x97\xCC\x93\xCD\x82\xCE\x97\xCC\x94\xCD\x82\xCE\xB9\xCC\x93\xCE\xB9\xCC\x94\xCE"
+	"\xB9\xCC\x93\xCC\x80\xCE\xB9\xCC\x94\xCC\x80\xCE\xB9\xCC\x93\xCC\x81\xCE\xB9\xCC\x94\xCC\x81\xCE\xB9"
+	"\xCC\x93\xCD\x82\xCE\xB9\xCC\x94\xCD\x82\xCE\x99\xCC\x93\xCE\x99\xCC\x94\xCE\x99\xCC\x93\xCC\x80\xCE"
+	"\x99\xCC\x94\xCC\x80\xCE\x99\xCC\x93\xCC\x81\xCE\x99\xCC\x94\xCC\x81\xCE\x99\xCC\x93\xCD\x82\xCE\x99"
+	"\xCC\x94\xCD\x82\xCE\xBF\xCC\x93\xCE\xBF\xCC\x94\xCE\xBF\xCC\x93\xCC\x80\xCE\xBF\xCC\x94\xCC\x80\xCE"
+	"\xBF\xCC\x93\xCC\x81\xCE\xBF\xCC\x94\xCC\x81\xCE\x9F\xCC\x93\xCE\x9F\xCC\x94\xCE\x9F\xCC\x93\xCC\x80"
+	"\xCE\x9F\xCC\x94\xCC\x80\xCE\x9F\xCC\x93\xCC\x81\xCE\x9F\xCC\x94\xCC\x81\xCF\x85\xCC\x93\xCF\x85\xCC"
+	"\x94\xCF\x85\xCC\x93\xCC\x80\xCF\x85\xCC\x94\xCC\x80\xCF\x85\xCC\x93\xCC\x81\xCF\x85\xCC\x94\xCC\x81"
+	"\xCF\x85\xCC\x93\xCD\x82\xCF\x85\xCC\x94\xCD\x82\xCE\xA5\xCC\x94\xCE\xA5\xCC\x94\xCC\x80\xCE\xA5\xCC"
+	"\x94\xCC\x81\xCE\xA5\xCC\x94\xCD\x82\xCF\x89\xCC\x93\xCF\x89\xCC\x94\xCF\x89\xCC\x93\xCC\x80\xCF\x89"
+	"\xCC\x94\xCC\x80\xCF\x89\xCC\x93\xCC\x81\xCF\x89\xCC\x94\xCC\x81\xCF\x89\xCC\x93\xCD\x82\xCF\x89\xCC"
+	"\x94\xCD\x82\xCE\xA9\xCC\x93\xCE\xA9\xCC\x94\xCE\xA9\xCC\x93\xCC\x80\xCE\xA9\xCC\x94\xCC\x80\xCE\xA9"
+	"\xCC\x93\xCC\x81\xCE\xA9\xCC\x94\xCC\x81\xCE\xA9\xCC\x93\xCD\x82\xCE\xA9\xCC\x94\xCD\x82\xCE\xB1\xCC"
+	"\x80\xCE\xB5\xCC\x80\xCE\xB7\xCC\x80\xCE\xB9\xCC\x80\xCE\xBF\xCC\x80\xCF\x85\xCC\x80\xCF\x89\xCC\x80"
+	"\xCE\xB1\xCC\x93\xCD\x85\xCE\xB1\xCC\x94\xCD\x85\xCE\xB1\xCC\x93\xCC\x80\xCD\x85\xCE\xB1\xCC\x94\xCC"
+	"\x80\xCD\x85\xCE\xB1\xCC\x93\xCC\x81\xCD\x85\xCE\xB1\xCC\x94\xCC\x81\xCD\x85\xCE\xB1\xCC\x93\xCD\x82"
+	"\xCD\x85\xCE\xB1\xCC\x94\xCD\x82\xCD\x85\xCE\x91\xCC\x93\xCD\x85\xCE\x91\xCC\x94\xCD\x85\xCE\x91\xCC"
+	"\x93\xCC\x80\xCD\x85\xCE\x91\xCC\x94\xCC\x80\xCD\x85\xCE\x91\xCC\x93\xCC\x81\xCD\x85\xCE\x91\xCC\x94"
+	"\xCC\x81\xCD\x85\xCE\x91\xCC\x93\xCD\x82\xCD\x85\xCE\x91\xCC\x94\xCD\x82\xCD\x85\xCE\xB7\xCC\x93\xCD"
+	"\x85\xCE\xB7\xCC\x94\xCD\x85\xCE\xB7\xCC\x93\xCC\x80\xCD\x85\xCE\xB7\xCC\x94\xCC\x80\xCD\x85\xCE\xB7"
+	"\xCC\x93\xCC\x81\xCD\x85\xCE\xB7\xCC\x94\xCC\x81\xCD\x85\xCE\xB7\xCC\x93\xCD\x82\xCD\x85\xCE\xB7\xCC"
+	"\x94\xCD\x82\xCD\x85\xCE\x97\xCC\x93\xCD\x85\xCE\x97\xCC\x94\xCD\x85\xCE\x97\xCC\x93\xCC\x80\xCD\x85"
+	"\xCE\x97\xCC\x94\xCC\x80\xCD\x85\xCE\x97\xCC\x93\xCC\x81\xCD\x85\xCE\x97\xCC\x94\xCC\x81\xCD\x85\xCE"
+	"\x97\xCC\x93\xCD\x82\xCD\x85\xCE\x97\xCC\x94\xCD\x82\xCD\x85\xCF\x89\xCC\x93\xCD\x85\xCF\x89\xCC\x94"
+	"\xCD\x85\xCF\x89\xCC\x93\xCC\x80\xCD\x85\xCF\x89\xCC\x94\xCC\x80\xCD\x85\xCF\x89\xCC\x93\xCC\x81\xCD"
+	"\x85\xCF\x89\xCC\x94\xCC\x81\xCD\x85\xCF\x89\xCC\x93\xCD\x82\xCD\x85\xCF\x89\xCC\x94\xCD\x82\xCD\x85"
+	"\xCE\xA9\xCC\x93\xCD\x85\xCE\xA9\xCC\x94\xCD\x85\xCE\xA9\xCC\x93\xCC\x80\xCD\x85\xCE\xA9\xCC\x94\xCC"
+	"\x80\xCD\x85\xCE\xA9\xCC\x93\xCC\x81\xCD\x85\xCE\xA9\xCC\x94\xCC\x81\xCD\x85\xCE\xA9\xCC\x93\xCD\x82"
+	"\xCD\x85\xCE\xA9\xCC\x94\xCD\x82\xCD\x85\xCE\xB1\xCC\x86\xCE\xB1\xCC\x84\xCE\xB1\xCC\x80\xCD\x85\xCE"
+	"\xB1\xCD\x85\xCE\xB1\xCC\x81\xCD\x85\xCE\xB1\xCD\x82\xCE\xB1\xCD\x82\xCD\x85\xCE\x91\xCC\x86\xCE\x91"
+	"\xCC\x84\xCE\x91\xCC\x80\xCE\x91\xCD\x85\xC2\xA8\xCD\x82\xCE\xB7\xCC\x80\xCD\x85\xCE\xB7\xCD\x85\xCE"
+	"\xB7\xCC\x81\xCD\x85\xCE\xB7\xCD\x82\xCE\xB7\xCD\x82\xCD\x85\xCE\x95\xCC\x80\xCE\x97\xCC\x80\xCE\x97"
+	"\xCD\x85\xE1\xBE\xBF\xCC\x80\xE1\xBE\xBF\xCC\x81\xE1\xBE\xBF\xCD\x82\xCE\xB9\xCC\x86\xCE\xB9\xCC\x84"
+	"\xCE\xB9\xCC\x88\xCC\x80\xCE\xB9\xCD\x82\xCE\xB9\xCC\x88\xCD\x82\xCE\x99\xCC\x86\xCE\x99\xCC\x84\xCE"
+	"\x99\xCC\x80\xE1\xBF\xBE\xCC\x80\xE1\xBF\xBE\xCC\x81\xE1\xBF\xBE\xCD\x82\xCF\x85\xCC\x86\xCF\x85\xCC"
+	"\x84\xCF\x85\xCC\x88\xCC\x80\xCF\x81\xCC\x93\xCF\x81\xCC\x94\xCF\x85\xCD\x82\xCF\x85\xCC\x88\xCD\x82"
+	"\xCE\xA5\xCC\x86\xCE\xA5\xCC\x84\xCE\xA5\xCC\x80\xCE\xA1\xCC\x94\xC2\xA8\xCC\x80\x60\xCF\x89\xCC\x80"
+	"\xCD\x85\xCF\x89\xCD\x85\xCF\x89\xCC\x81\xCD\x85\xCF\x89\xCD\x82\xCF\x89\xCD\x82\xCD\x85\xCE\x9F\xCC"
+	"\x80\xCE\xA9\xCC\x80\xCE\xA9\xCD\x85\xC2\xB4\xE2\x80\x82\xE2\x80\x83\xE2\x86\x90\xCC\xB8\xE2\x86\x92"
+	"\xCC\xB8\xE2\x86\x94\xCC\xB8\xE2\x87\x90\xCC\xB8\xE2\x87\x94\xCC\xB8\xE2\x87\x92\xCC\xB8\xE2\x88\x83"
+	"\xCC\xB8\xE2\x88\x88\xCC\xB8\xE2\x88\x8B\xCC\xB8\xE2\x88\xA3\xCC\xB8\xE2\x88\xA5\xCC\xB8\xE2\x88\xBC"
+	"\xCC\xB8\xE2\x89\x83\xCC\xB8\xE2\x89\x85\xCC\xB8\xE2\x89\x88\xCC\xB8\x3D\xCC\xB8\xE2\x89\xA1\xCC\xB8"
+	"\xE2\x89\x8D\xCC\xB8\x3C\xCC\xB8\x3E\xCC\xB8\xE2\x89\xA4\xCC\xB8\xE2\x89\xA5\xCC\xB8\xE2\x89\xB2\xCC"
+	"\xB8\xE2\x89\xB3\xCC\xB8\xE2\x89\xB6\xCC\xB8\xE2\x89\xB7\xCC\xB8\xE2\x89\xBA\xCC\xB8\xE2\x89\xBB\xCC"
+	"\xB8\xE2\x8A\x82\xCC\xB8\xE2\x8A\x83\xCC\xB8\xE2\x8A\x86\xCC\xB8\xE2\x8A\x87\xCC\xB8\xE2\x8A\xA2\xCC"
+	"\xB8\xE2\x8A\xA8\xCC\xB8\xE2\x8A\xA9\xCC\xB8\xE2\x8A\xAB\xCC\xB8\xE2\x89\xBC\xCC\xB8\xE2\x89\xBD\xCC"
+	"\xB8\xE2\x8A\x91\xCC\xB8\xE2\x8A\x92\xCC\xB8\xE2\x8A\xB2\xCC\xB8\xE2\x8A\xB3\xCC\xB8\xE2\x8A\xB4\xCC"
+	"\xB8\xE2\x8A\xB5\xCC\xB8\xE3\x80\x88\xE3\x80\x89\xE2\xAB\x9D\xCC\xB8\xE3\x81\x8B\xE3\x82\x99\xE3\x81"
+	"\x8D\xE3\x82\x99\xE3\x81\x8F\xE3\x82\x99\xE3\x81\x91\xE3\x82\x99\xE3\x81\x93\xE3\x82\x99\xE3\x81\x95"
+	"\xE3\x82\x99\xE3\x81\x97\xE3\x82\x99\xE3\x81\x99\xE3\x82\x99\xE3\x81\x9B\xE3\x82\x99\xE3\x81\x9D\xE3"
+	"\x82\x99\xE3\x81\x9F\xE3\x82\x99\xE3\x81\xA1\xE3\x82\x99\xE3\x81\xA4\xE3\x82\x99\xE3\x81\xA6\xE3\x82"
+	"\x99\xE3\x81\xA8\xE3\x82\x99\xE3\x81\xAF\xE3\x82\x99\xE3\x81\xAF\xE3\x82\x9A\xE3\x81\xB2\xE3\x82\x99"
+	"\xE3\x81\xB2\xE3\x82\x9A\xE3\x81\xB5\xE3\x82\x99\xE3\x81\xB5\xE3\x82\x9A\xE3\x81\xB8\xE3\x82\x99\xE3"
+	"\x81\xB8\xE3\x82\x9A\xE3\x81\xBB\xE3\x82\x99\xE3\x81\xBB\xE3\x82\x9A\xE3\x81\x86\xE3\x82\x99\xE3\x82"
+	"\x9D\xE3\x82\x99\xE3\x82\xAB\xE3\x82\x99\xE3\x82\xAD\xE3\x82\x99\xE3\x82\xAF\xE3\x82\x99\xE3\x82\xB1"
+	"\xE3\x82\x99\xE3\x82\xB3\xE3\x82\x99\xE3\x82\xB5\xE3\x82\x99\xE3\x82\xB7\xE3\x82\x99\xE3\x82\xB9\xE3"
+	"\x82\x99\xE3\x82\xBB\xE3\x82\x99\xE3\x82\xBD\xE3\x82\x99\xE3\x82\xBF\xE3\x82\x99\xE3\x83\x81\xE3\x82"
+	"\x99\xE3\x83\x84\xE3\x82\x99\xE3\x83\x86\xE3\x82\x99\xE3\x83\x88\xE3\x82\x99\xE3\x83\x8F\xE3\x82\x99"
+	"\xE3\x83\x8F\xE3\x82\x9A\xE3\x83\x92\xE3\x82\x99\xE3\x83\x92\xE3\x82\x9A\xE3\x83\x95\xE3\x82\x99\xE3"
+	"\x83\x95\xE3\x82\x9A\xE3\x83\x98\xE3\x82\x99\xE3\x83\x98\xE3\x82\x9A\xE3\x83\x9B\xE3\x82\x99\xE3\x83"
+	"\x9B\xE3\x82\x9A\xE3\x82\xA6\xE3\x82\x99\xE3\x83\xAF\xE3\x82\x99\xE3\x83\xB0\xE3\x82\x99\xE3\x83\xB1"
+	"\xE3\x82\x99\xE3\x83\xB2\xE3\x82\x99\xE3\x83\xBD\xE3\x82\x99\xE8\xB1\x88\xE6\x9B\xB4\xE8\xBB\x8A\xE8"
+	"\xB3\x88\xE6\xBB\x91\xE4\xB8\xB2\xE5\x8F\xA5\xE9\xBE\x9C\xE5\xA5\x91\xE9\x87\x91\xE5\x96\x87\xE5\xA5"
+	"\x88\xE6\x87\xB6\xE7\x99\xA9\xE7\xBE\x85\xE8\x98\xBF\xE8\x9E\xBA\xE8\xA3\xB8\xE9\x82\x8F\xE6\xA8\x82"
+	"\xE6\xB4\x9B\xE7\x83\x99\xE7\x8F\x9E\xE8\x90\xBD\xE9\x85\xAA\xE9\xA7\xB1\xE4\xBA\x82\xE5\x8D\xB5\xE6"
+	"\xAC\x84\xE7\x88\x9B\xE8\x98\xAD\xE9\xB8\x9E\xE5\xB5\x90\xE6\xBF\xAB\xE8\x97\x8D\xE8\xA5\xA4\xE6\x8B"
+	"\x89\xE8\x87\x98\xE8\xA0\x9F\xE5\xBB\x8A\xE6\x9C\x97\xE6\xB5\xAA\xE7\x8B\xBC\xE9\x83\x8E\xE4\xBE\x86"
+	"\xE5\x86\xB7\xE5\x8B\x9E\xE6\x93\x84\xE6\xAB\x93\xE7\x88\x90\xE7\x9B\xA7\xE8\x80\x81\xE8\x98\x86\xE8"
+	"\x99\x9C\xE8\xB7\xAF\xE9\x9C\xB2\xE9\xAD\xAF\xE9\xB7\xBA\xE7\xA2\x8C\xE7\xA5\xBF\xE7\xB6\xA0\xE8\x8F"
+	"\x89\xE9\x8C\x84\xE9\xB9\xBF\xE8\xAB\x96\xE5\xA3\x9F\xE5\xBC\x84\xE7\xB1\xA0\xE8\x81\xBE\xE7\x89\xA2"
+	"\xE7\xA3\x8A\xE8\xB3\x82\xE9\x9B\xB7\xE5\xA3\x98\xE5\xB1\xA2\xE6\xA8\x93\xE6\xB7\x9A\xE6\xBC\x8F\xE7"
+	"\xB4\xAF\xE7\xB8\xB7\xE9\x99\x8B\xE5\x8B\x92\xE8\x82\x8B\xE5\x87\x9C\xE5\x87\x8C\xE7\xA8\x9C\xE7\xB6"
+	"\xBE\xE8\x8F\xB1\xE9\x99\xB5\xE8\xAE\x80\xE6\x8B\x8F\xE8\xAB\xBE\xE4\xB8\xB9\xE5\xAF\xA7\xE6\x80\x92"
+	"\xE7\x8E\x87\xE7\x95\xB0\xE5\x8C\x97\xE7\xA3\xBB\xE4\xBE\xBF\xE5\xBE\xA9\xE4\xB8\x8D\xE6\xB3\x8C\xE6"
+	"\x95\xB8\xE7\xB4\xA2\xE5\x8F\x83\xE5\xA1\x9E\xE7\x9C\x81\xE8\x91\x89\xE8\xAA\xAA\xE6\xAE\xBA\xE8\xBE"
+	"\xB0\xE6\xB2\x88\xE6\x8B\xBE\xE8\x8B\xA5\xE6\x8E\xA0\xE7\x95\xA5\xE4\xBA\xAE\xE5\x85\xA9\xE5\x87\x89"
+	"\xE6\xA2\x81\xE7\xB3\xA7\xE8\x89\xAF\xE8\xAB\x92\xE9\x87\x8F\xE5\x8B\xB5\xE5\x91\x82\xE5\xA5\xB3\xE5"
+	"\xBB\xAC\xE6\x97\x85\xE6\xBF\xBE\xE7\xA4\xAA\xE9\x96\xAD\xE9\xA9\xAA\xE9\xBA\x97\xE9\xBB\x8E\xE5\x8A"
+	"\x9B\xE6\x9B\x86\xE6\xAD\xB7\xE8\xBD\xA2\xE5\xB9\xB4\xE6\x86\x90\xE6\x88\x80\xE6\x92\x9A\xE6\xBC\xA3"
+	"\xE7\x85\x89\xE7\x92\x89\xE7\xA7\x8A\xE7\xB7\xB4\xE8\x81\xAF\xE8\xBC\xA6\xE8\x93\xAE\xE9\x80\xA3\xE9"
+	"\x8D\x8A\xE5\x88\x97\xE5\x8A\xA3\xE5\x92\xBD\xE7\x83\x88\xE8\xA3\x82\xE5\xBB\x89\xE5\xBF\xB5\xE6\x8D"
+	"\xBB\xE6\xAE\xAE\xE7\xB0\xBE\xE7\x8D\xB5\xE4\xBB\xA4\xE5\x9B\xB9\xE5\xB6\xBA\xE6\x80\x9C\xE7\x8E\xB2"
+	"\xE7\x91\xA9\xE7\xBE\x9A\xE8\x81\x86\xE9\x88\xB4\xE9\x9B\xB6\xE9\x9D\x88\xE9\xA0\x98\xE4\xBE\x8B\xE7"
+	"\xA6\xAE\xE9\x86\xB4\xE9\x9A\xB8\xE6\x83\xA1\xE4\xBA\x86\xE5\x83\x9A\xE5\xAF\xAE\xE5\xB0\xBF\xE6\x96"
+	"\x99\xE7\x87\x8E\xE7\x99\x82\xE8\x93\xBC\xE9\x81\xBC\xE9\xBE\x8D\xE6\x9A\x88\xE9\x98\xAE\xE5\x8A\x89"
+	"\xE6\x9D\xBB\xE6\x9F\xB3\xE6\xB5\x81\xE6\xBA\x9C\xE7\x90\x89\xE7\x95\x99\xE7\xA1\xAB\xE7\xB4\x90\xE9"
+	"\xA1\x9E\xE5\x85\xAD\xE6\x88\xAE\xE9\x99\xB8\xE5\x80\xAB\xE5\xB4\x99\xE6\xB7\xAA\xE8\xBC\xAA\xE5\xBE"
+	"\x8B\xE6\x85\x84\xE6\xA0\x97\xE9\x9A\x86\xE5\x88\xA9\xE5\x90\x8F\xE5\xB1\xA5\xE6\x98\x93\xE6\x9D\x8E"
+	"\xE6\xA2\xA8\xE6\xB3\xA5\xE7\x90\x86\xE7\x97\xA2\xE7\xBD\xB9\xE8\xA3\x8F\xE8\xA3\xA1\xE9\x87\x8C\xE9"
+	"\x9B\xA2\xE5\x8C\xBF\xE6\xBA\xBA\xE5\x90\x9D\xE7\x87\x90\xE7\x92\x98\xE8\x97\xBA\xE9\x9A\xA3\xE9\xB1"
+	"\x97\xE9\xBA\x9F\xE6\x9E\x97\xE6\xB7\x8B\xE8\x87\xA8\xE7\xAB\x8B\xE7\xAC\xA0\xE7\xB2\x92\xE7\x8B\x80"
+	"\xE7\x82\x99\xE8\xAD\x98\xE4\xBB\x80\xE8\x8C\xB6\xE5\x88\xBA\xE5\x88\x87\xE5\xBA\xA6\xE6\x8B\x93\xE7"
+	"\xB3\x96\xE5\xAE\x85\xE6\xB4\x9E\xE6\x9A\xB4\xE8\xBC\xBB\xE8\xA1\x8C\xE9\x99\x8D\xE8\xA6\x8B\xE5\xBB"
+	"\x93\xE5\x85\x80\xE5\x97\x80\xE5\xA1\x9A\xE6\x99\xB4\xE5\x87\x9E\xE7\x8C\xAA\xE7\x9B\x8A\xE7\xA4\xBC"
+	"\xE7\xA5\x9E\xE7\xA5\xA5\xE7\xA6\x8F\xE9\x9D\x96\xE7\xB2\xBE\xE7\xBE\xBD\xE8\x98\x92\xE8\xAB\xB8\xE9"
+	"\x80\xB8\xE9\x83\xBD\xE9\xA3\xAF\xE9\xA3\xBC\xE9\xA4\xA8\xE9\xB6\xB4\xE9\x83\x9E\xE9\x9A\xB7\xE4\xBE"
+	"\xAE\xE5\x83\xA7\xE5\x85\x8D\xE5\x8B\x89\xE5\x8B\xA4\xE5\x8D\x91\xE5\x96\x9D\xE5\x98\x86\xE5\x99\xA8"
+	"\xE5\xA1\x80\xE5\xA2\xA8\xE5\xB1\xA4\xE5\xB1\xAE\xE6\x82\x94\xE6\x85\xA8\xE6\x86\x8E\xE6\x87\xB2\xE6"
+	"\x95\x8F\xE6\x97\xA2\xE6\x9A\x91\xE6\xA2\x85\xE6\xB5\xB7\xE6\xB8\x9A\xE6\xBC\xA2\xE7\x85\xAE\xE7\x88"
+	"\xAB\xE7\x90\xA2\xE7\xA2\x91\xE7\xA4\xBE\xE7\xA5\x89\xE7\xA5\x88\xE7\xA5\x90\xE7\xA5\x96\xE7\xA5\x9D"
+	"\xE7\xA6\x8D\xE7\xA6\x8E\xE7\xA9\x80\xE7\xAA\x81\xE7\xAF\x80\xE7\xB8\x89\xE7\xB9\x81\xE7\xBD\xB2\xE8"
+	"\x80\x85\xE8\x87\xAD\xE8\x89\xB9\xE8\x91\x97\xE8\xA4\x90\xE8\xA6\x96\xE8\xAC\x81\xE8\xAC\xB9\xE8\xB3"
+	"\x93\xE8\xB4\x88\xE8\xBE\xB6\xE9\x9B\xA3\xE9\x9F\xBF\xE9\xA0\xBB\xE6\x81\xB5\xF0\xA4\x8B\xAE\xE8\x88"
+	"\x98\xE4\xB8\xA6\xE5\x86\xB5\xE5\x85\xA8\xE4\xBE\x80\xE5\x85\x85\xE5\x86\x80\xE5\x8B\x87\xE5\x8B\xBA"
+	"\xE5\x95\x95\xE5\x96\x99\xE5\x97\xA2\xE5\xA2\xB3\xE5\xA5\x84\xE5\xA5\x94\xE5\xA9\xA2\xE5\xAC\xA8\xE5"
+	"\xBB\x92\xE5\xBB\x99\xE5\xBD\xA9\xE5\xBE\xAD\xE6\x83\x98\xE6\x85\x8E\xE6\x84\x88\xE6\x85\xA0\xE6\x88"
+	"\xB4\xE6\x8F\x84\xE6\x90\x9C\xE6\x91\x92\xE6\x95\x96\xE6\x9C\x9B\xE6\x9D\x96\xE6\xAD\xB9\xE6\xBB\x9B"
+	"\xE6\xBB\x8B\xE7\x80\x9E\xE7\x9E\xA7\xE7\x88\xB5\xE7\x8A\xAF\xE7\x91\xB1\xE7\x94\x86\xE7\x94\xBB\xE7"
+	"\x98\x9D\xE7\x98\x9F\xE7\x9B\x9B\xE7\x9B\xB4\xE7\x9D\x8A\xE7\x9D\x80\xE7\xA3\x8C\xE7\xAA\xB1\xE7\xB1"
+	"\xBB\xE7\xB5\x9B\xE7\xBC\xBE\xE8\x8D\x92\xE8\x8F\xAF\xE8\x9D\xB9\xE8\xA5\x81\xE8\xA6\x86\xE8\xAA\xBF"
+	"\xE8\xAB\x8B\xE8\xAB\xAD\xE8\xAE\x8A\xE8\xBC\xB8\xE9\x81\xB2\xE9\x86\x99\xE9\x89\xB6\xE9\x99\xBC\xE9"
+	"\x9F\x9B\xE9\xA0\x8B\xE9\xAC\x92\xF0\xA2\xA1\x8A\xF0\xA2\xA1\x84\xF0\xA3\x8F\x95\xE3\xAE\x9D\xE4\x80"
+	"\x98\xE4\x80\xB9\xF0\xA5\x89\x89\xF0\xA5\xB3\x90\xF0\xA7\xBB\x93\xE9\xBD\x83\xE9\xBE\x8E\xD7\x99\xD6"
+	"\xB4\xD7\xB2\xD6\xB7\xD7\xA9\xD7\x81\xD7\xA9\xD7\x82\xD7\xA9\xD6\xBC\xD7\x81\xD7\xA9\xD6\xBC\xD7\x82"
+	"\xD7\x90\xD6\xB7\xD7\x90\xD6\xB8\xD7\x90\xD6\xBC\xD7\x91\xD6\xBC\xD7\x92\xD6\xBC\xD7\x93\xD6\xBC\xD7"
+	"\x94\xD6\xBC\xD7\x95\xD6\xBC\xD7\x96\xD6\xBC\xD7\x98\xD6\xBC\xD7\x99\xD6\xBC\xD7\x9A\xD6\xBC\xD7\x9B"
+	"\xD6\xBC\xD7\x9C\xD6\xBC\xD7\x9E\xD6\xBC\xD7\xA0\xD6\xBC\xD7\xA1\xD6\xBC\xD7\xA3\xD6\xBC\xD7\xA4\xD6"
+	"\xBC\xD7\xA6\xD6\xBC\xD7\xA7\xD6\xBC\xD7\xA8\xD6\xBC\xD7\xAA\xD6\xBC\xD7\x95\xD6\xB9\xD7\x91\xD6\xBF"
+	"\xD7\x9B\xD6\xBF\xD7\xA4\xD6\xBF\xF0\x91\x82\x99\xF0\x91\x82\xBA\xF0\x91\x82\x9B\xF0\x91\x82\xBA\xF0"
+	"\x91\x82\xA5\xF0\x91\x82\xBA\xF0\x91\x84\xB1\xF0\x91\x84\xA7\xF0\x91\x84\xB2\xF0\x91\x84\xA7\xF0\x91"
+	"\x8D\x87\xF0\x91\x8C\xBE\xF0\x91\x8D\x87\xF0\x91\x8D\x97\xF0\x91\x92\xB9\xF0\x91\x92\xBA\xF0\x91\x92"
+	"\xB9\xF0\x91\x92\xB0\xF0\x91\x92\xB9\xF0\x91\x92\xBD\xF0\x91\x96\xB8\xF0\x91\x96\xAF\xF0\x91\x96\xB9"
+	"\xF0\x91\x96\xAF\xF0\x9D\x85\x97\xF0\x9D\x85\xA5\xF0\x9D\x85\x98\xF0\x9D\x85\xA5\xF0\x9D\x85\x98\xF0"
+	"\x9D\x85\xA5\xF0\x9D\x85\xAE\xF0\x9D\x85\x98\xF0\x9D\x85\xA5\xF0\x9D\x85\xAF\xF0\x9D\x85\x98\xF0\x9D"
+	"\x85\xA5\xF0\x9D\x85\xB0\xF0\x9D\x85\x98\xF0\x9D\x85\xA5\xF0\x9D\x85\xB1\xF0\x9D\x85\x98\xF0\x9D\x85"
+	"\xA5\xF0\x9D\x85\xB2\xF0\x9D\x86\xB9\xF0\x9D\x85\xA5\xF0\x9D\x86\xBA\xF0\x9D\x85\xA5\xF0\x9D\x86\xB9"
+	"\xF0\x9D\x85\xA5\xF0\x9D\x85\xAE\xF0\x9D\x86\xBA\xF0\x9D\x85\xA5\xF0\x9D\x85\xAE\xF0\x9D\x86\xB9\xF0"
+	"\x9D\x85\xA5\xF0\x9D\x85\xAF\xF0\x9D\x86\xBA\xF0\x9D\x85\xA5\xF0\x9D\x85\xAF\xE4\xB8\xBD\xE4\xB8\xB8"
+	"\xE4\xB9\x81\xF0\xA0\x84\xA2\xE4\xBD\xA0\xE4\xBE\xBB\xE5\x80\x82\xE5\x81\xBA\xE5\x82\x99\xE5\x83\x8F"
+	"\xE3\x92\x9E\xF0\xA0\x98\xBA\xE5\x85\x94\xE5\x85\xA4\xE5\x85\xB7\xF0\xA0\x94\x9C\xE3\x92\xB9\xE5\x85"
+	"\xA7\xE5\x86\x8D\xF0\xA0\x95\x8B\xE5\x86\x97\xE5\x86\xA4\xE4\xBB\x8C\xE5\x86\xAC\xF0\xA9\x87\x9F\xE5"
+	"\x87\xB5\xE5\x88\x83\xE3\x93\x9F\xE5\x88\xBB\xE5\x89\x86\xE5\x89\xB2\xE5\x89\xB7\xE3\x94\x95\xE5\x8C"
+	"\x85\xE5\x8C\x86\xE5\x8D\x89\xE5\x8D\x9A\xE5\x8D\xB3\xE5\x8D\xBD\xE5\x8D\xBF\xF0\xA0\xA8\xAC\xE7\x81"
+	"\xB0\xE5\x8F\x8A\xE5\x8F\x9F\xF0\xA0\xAD\xA3\xE5\x8F\xAB\xE5\x8F\xB1\xE5\x90\x86\xE5\x92\x9E\xE5\x90"
+	"\xB8\xE5\x91\x88\xE5\x91\xA8\xE5\x92\xA2\xE5\x93\xB6\xE5\x94\x90\xE5\x95\x93\xE5\x95\xA3\xE5\x96\x84"
+	"\xE5\x96\xAB\xE5\x96\xB3\xE5\x97\x82\xE5\x9C\x96\xE5\x9C\x97\xE5\x99\x91\xE5\x99\xB4\xE5\xA3\xAE\xE5"
+	"\x9F\x8E\xE5\x9F\xB4\xE5\xA0\x8D\xE5\x9E\x8B\xE5\xA0\xB2\xE5\xA0\xB1\xE5\xA2\xAC\xF0\xA1\x93\xA4\xE5"
+	"\xA3\xB2\xE5\xA3\xB7\xE5\xA4\x86\xE5\xA4\x9A\xE5\xA4\xA2\xE5\xA5\xA2\xF0\xA1\x9A\xA8\xF0\xA1\x9B\xAA"
+	"\xE5\xA7\xAC\xE5\xA8\x9B\xE5\xA8\xA7\xE5\xA7\x98\xE5\xA9\xA6\xE3\x9B\xAE\xE3\x9B\xBC\xE5\xAC\x88\xE5"
+	"\xAC\xBE\xF0\xA1\xA7\x88\xE5\xAF\x83\xE5\xAF\x98\xE5\xAF\xB3\xF0\xA1\xAC\x98\xE5\xAF\xBF\xE5\xB0\x86"
+	"\xE5\xBD\x93\xE5\xB0\xA2\xE3\x9E\x81\xE5\xB1\xA0\xE5\xB3\x80\xE5\xB2\x8D\xF0\xA1\xB7\xA4\xE5\xB5\x83"
+	"\xF0\xA1\xB7\xA6\xE5\xB5\xAE\xE5\xB5\xAB\xE5\xB5\xBC\xE5\xB7\xA1\xE5\xB7\xA2\xE3\xA0\xAF\xE5\xB7\xBD"
+	"\xE5\xB8\xA8\xE5\xB8\xBD\xE5\xB9\xA9\xE3\xA1\xA2\xF0\xA2\x86\x83\xE3\xA1\xBC\xE5\xBA\xB0\xE5\xBA\xB3"
+	"\xE5\xBA\xB6\xF0\xAA\x8E\x92\xE5\xBB\xBE\xF0\xA2\x8C\xB1\xE8\x88\x81\xE5\xBC\xA2\xE3\xA3\x87\xF0\xA3"
+	"\x8A\xB8\xF0\xA6\x87\x9A\xE5\xBD\xA2\xE5\xBD\xAB\xE3\xA3\xA3\xE5\xBE\x9A\xE5\xBF\x8D\xE5\xBF\x97\xE5"
+	"\xBF\xB9\xE6\x82\x81\xE3\xA4\xBA\xE3\xA4\x9C\xF0\xA2\x9B\x94\xE6\x83\x87\xE6\x85\x88\xE6\x85\x8C\xE6"
+	"\x85\xBA\xE6\x86\xB2\xE6\x86\xA4\xE6\x86\xAF\xE6\x87\x9E\xE6\x88\x90\xE6\x88\x9B\xE6\x89\x9D\xE6\x8A"
+	"\xB1\xE6\x8B\x94\xE6\x8D\x90\xF0\xA2\xAC\x8C\xE6\x8C\xBD\xE6\x8B\xBC\xE6\x8D\xA8\xE6\x8E\x83\xE6\x8F"
+	"\xA4\xF0\xA2\xAF\xB1\xE6\x90\xA2\xE6\x8F\x85\xE6\x8E\xA9\xE3\xA8\xAE\xE6\x91\xA9\xE6\x91\xBE\xE6\x92"
+	"\x9D\xE6\x91\xB7\xE3\xA9\xAC\xE6\x95\xAC\xF0\xA3\x80\x8A\xE6\x97\xA3\xE6\x9B\xB8\xE6\x99\x89\xE3\xAC"
+	"\x99\xE3\xAC\x88\xE3\xAB\xA4\xE5\x86\x92\xE5\x86\x95\xE6\x9C\x80\xE6\x9A\x9C\xE8\x82\xAD\xE4\x8F\x99"
+	"\xE6\x9C\xA1\xE6\x9D\x9E\xE6\x9D\x93\xF0\xA3\x8F\x83\xE3\xAD\x89\xE6\x9F\xBA\xE6\x9E\x85\xE6\xA1\x92"
+	"\xF0\xA3\x91\xAD\xE6\xA2\x8E\xE6\xA0\x9F\xE6\xA4\x94\xE6\xA5\x82\xE6\xA6\xA3\xE6\xA7\xAA\xE6\xAA\xA8"
+	"\xF0\xA3\x9A\xA3\xE6\xAB\x9B\xE3\xB0\x98\xE6\xAC\xA1\xF0\xA3\xA2\xA7\xE6\xAD\x94\xE3\xB1\x8E\xE6\xAD"
+	"\xB2\xE6\xAE\x9F\xE6\xAE\xBB\xF0\xA3\xAA\x8D\xF0\xA1\xB4\x8B\xF0\xA3\xAB\xBA\xE6\xB1\x8E\xF0\xA3\xB2"
+	"\xBC\xE6\xB2\xBF\xE6\xB3\x8D\xE6\xB1\xA7\xE6\xB4\x96\xE6\xB4\xBE\xE6\xB5\xA9\xE6\xB5\xB8\xE6\xB6\x85"
+	"\xF0\xA3\xB4\x9E\xE6\xB4\xB4\xE6\xB8\xAF\xE6\xB9\xAE\xE3\xB4\xB3\xE6\xBB\x87\xF0\xA3\xBB\x91\xE6\xB7"
+	"\xB9\xE6\xBD\xAE\xF0\xA3\xBD\x9E\xF0\xA3\xBE\x8E\xE6\xBF\x86\xE7\x80\xB9\xE7\x80\x9B\xE3\xB6\x96\xE7"
+	"\x81\x8A\xE7\x81\xBD\xE7\x81\xB7\xE7\x82\xAD\xF0\xA0\x94\xA5\xE7\x85\x85\xF0\xA4\x89\xA3\xE7\x86\x9C"
+	"\xF0\xA4\x8E\xAB\xE7\x88\xA8\xE7\x89\x90\xF0\xA4\x98\x88\xE7\x8A\x80\xE7\x8A\x95\xF0\xA4\x9C\xB5\xF0"
+	"\xA4\xA0\x94\xE7\x8D\xBA\xE7\x8E\x8B\xE3\xBA\xAC\xE7\x8E\xA5\xE3\xBA\xB8\xE7\x91\x87\xE7\x91\x9C\xE7"
+	"\x92\x85\xE7\x93\x8A\xE3\xBC\x9B\xE7\x94\xA4\xF0\xA4\xB0\xB6\xE7\x94\xBE\xF0\xA4\xB2\x92\xF0\xA2\x86"
+	"\x9F\xE7\x98\x90\xF0\xA4\xBE\xA1\xF0\xA4\xBE\xB8\xF0\xA5\x81\x84\xE3\xBF\xBC\xE4\x80\x88\xF0\xA5\x83"
+	"\xB3\xF0\xA5\x83\xB2\xF0\xA5\x84\x99\xF0\xA5\x84\xB3\xE7\x9C\x9E\xE7\x9C\x9F\xE7\x9E\x8B\xE4\x81\x86"
+	"\xE4\x82\x96\xF0\xA5\x90\x9D\xE7\xA1\x8E\xE4\x83\xA3\xF0\xA5\x98\xA6\xF0\xA5\x9A\x9A\xF0\xA5\x9B\x85"
+	"\xE7\xA7\xAB\xE4\x84\xAF\xE7\xA9\x8A\xE7\xA9\x8F\xF0\xA5\xA5\xBC\xF0\xA5\xAA\xA7\xE7\xAB\xAE\xE4\x88"
+	"\x82\xF0\xA5\xAE\xAB\xE7\xAF\x86\xE7\xAF\x89\xE4\x88\xA7\xF0\xA5\xB2\x80\xE7\xB3\x92\xE4\x8A\xA0\xE7"
+	"\xB3\xA8\xE7\xB3\xA3\xE7\xB4\x80\xF0\xA5\xBE\x86\xE7\xB5\xA3\xE4\x8C\x81\xE7\xB7\x87\xE7\xB8\x82\xE7"
+	"\xB9\x85\xE4\x8C\xB4\xF0\xA6\x88\xA8\xF0\xA6\x89\x87\xE4\x8D\x99\xF0\xA6\x8B\x99\xE7\xBD\xBA\xF0\xA6"
+	"\x8C\xBE\xE7\xBE\x95\xE7\xBF\xBA\xF0\xA6\x93\x9A\xF0\xA6\x94\xA3\xE8\x81\xA0\xF0\xA6\x96\xA8\xE8\x81"
+	"\xB0\xF0\xA3\x8D\x9F\xE4\x8F\x95\xE8\x82\xB2\xE8\x84\x83\xE4\x90\x8B\xE8\x84\xBE\xE5\xAA\xB5\xF0\xA6"
+	"\x9E\xA7\xF0\xA6\x9E\xB5\xF0\xA3\x8E\x93\xF0\xA3\x8E\x9C\xE8\x88\x84\xE8\xBE\x9E\xE4\x91\xAB\xE8\x8A"
+	"\x91\xE8\x8A\x8B\xE8\x8A\x9D\xE5\x8A\xB3\xE8\x8A\xB1\xE8\x8A\xB3\xE8\x8A\xBD\xE8\x8B\xA6\xF0\xA6\xAC"
+	"\xBC\xE8\x8C\x9D\xE8\x8D\xA3\xE8\x8E\xAD\xE8\x8C\xA3\xE8\x8E\xBD\xE8\x8F\xA7\xE8\x8D\x93\xE8\x8F\x8A"
+	"\xE8\x8F\x8C\xE8\x8F\x9C\xF0\xA6\xB0\xB6\xF0\xA6\xB5\xAB\xF0\xA6\xB3\x95\xE4\x94\xAB\xE8\x93\xB1\xE8"
+	"\x93\xB3\xE8\x94\x96\xF0\xA7\x8F\x8A\xE8\x95\xA4\xF0\xA6\xBC\xAC\xE4\x95\x9D\xE4\x95\xA1\xF0\xA6\xBE"
+	"\xB1\xF0\xA7\x83\x92\xE4\x95\xAB\xE8\x99\x90\xE8\x99\xA7\xE8\x99\xA9\xE8\x9A\xA9\xE8\x9A\x88\xE8\x9C"
+	"\x8E\xE8\x9B\xA2\xE8\x9C\xA8\xE8\x9D\xAB\xE8\x9E\x86\xE4\x97\x97\xE8\x9F\xA1\xE8\xA0\x81\xE4\x97\xB9"
+	"\xE8\xA1\xA0\xE8\xA1\xA3\xF0\xA7\x99\xA7\xE8\xA3\x97\xE8\xA3\x9E\xE4\x98\xB5\xE8\xA3\xBA\xE3\x92\xBB"
+	"\xF0\xA7\xA2\xAE\xF0\xA7\xA5\xA6\xE4\x9A\xBE\xE4\x9B\x87\xE8\xAA\xA0\xE8\xB1\x95\xF0\xA7\xB2\xA8\xE8"
+	"\xB2\xAB\xE8\xB3\x81\xE8\xB4\x9B\xE8\xB5\xB7\xF0\xA7\xBC\xAF\xF0\xA0\xA0\x84\xE8\xB7\x8B\xE8\xB6\xBC"
+	"\xE8\xB7\xB0\xF0\xA0\xA3\x9E\xE8\xBB\x94\xF0\xA8\x97\x92\xF0\xA8\x97\xAD\xE9\x82\x94\xE9\x83\xB1\xE9"
+	"\x84\x91\xF0\xA8\x9C\xAE\xE9\x84\x9B\xE9\x88\xB8\xE9\x8B\x97\xE9\x8B\x98\xE9\x89\xBC\xE9\x8F\xB9\xE9"
+	"\x90\x95\xF0\xA8\xAF\xBA\xE9\x96\x8B\xE4\xA6\x95\xE9\x96\xB7\xF0\xA8\xB5\xB7\xE4\xA7\xA6\xE9\x9B\x83"
+	"\xE5\xB6\xB2\xE9\x9C\xA3\xF0\xA9\x85\x85\xF0\xA9\x88\x9A\xE4\xA9\xAE\xE4\xA9\xB6\xE9\x9F\xA0\xF0\xA9"
+	"\x90\x8A\xE4\xAA\xB2\xF0\xA9\x92\x96\xE9\xA0\xA9\xF0\xA9\x96\xB6\xE9\xA3\xA2\xE4\xAC\xB3\xE9\xA4\xA9"
+	"\xE9\xA6\xA7\xE9\xA7\x82\xE9\xA7\xBE\xE4\xAF\x8E\xF0\xA9\xAC\xB0\xE9\xB1\x80\xE9\xB3\xBD\xE4\xB3\x8E"
+	"\xE4\xB3\xAD\xE9\xB5\xA7\xF0\xAA\x83\x8E\xE4\xB3\xB8\xF0\xAA\x84\x85\xF0\xAA\x88\x8E\xF0\xAA\x8A\x91"
+	"\xE9\xBA\xBB\xE4\xB5\x96\xE9\xBB\xB9\xE9\xBB\xBE\xE9\xBC\x85\xE9\xBC\x8F\xE9\xBC\x96\xE9\xBC\xBB\xF0"
+	"\xAA\x98\x80\x20\x20\xCC\x88\x20\xCC\x84\x32\x33\x20\xCC\x81\xCE\xBC\x20\xCC\xA7\x31\x31\xE2\x81\x84"
+	"\x34\x31\xE2\x81\x84\x32\x33\xE2\x81\x84\x34\x49\x4A\x69\x6A\x4C\xC2\xB7\x6C\xC2\xB7\xCA\xBC\x6E\x44"
+	"\x5A\xCC\x8C\x44\x7A\xCC\x8C\x64\x7A\xCC\x8C\x4C\x4A\x4C\x6A\x6C\x6A\x4E\x4A\x4E\x6A\x6E\x6A\xC9\xA6"
+	"\xC9\xB9\xC9\xBB\xCA\x81\x20\xCC\x86\x20\xCC\x87\x20\xCC\x8A\x20\xCC\xA8\x20\xCC\x83\x20\xCC\x8B\xC9"
+	"\xA3\xCA\x95\x20\xCD\x85\x20\xCC\x88\xCC\x81\xCE\xB2\xCE\xB8\xCF\x86\xCF\x80\xCE\xBA\xCF\x82\xCE\x98"
+	"\xCE\xA3\xD5\xA5\xD6\x82\xD8\xA7\xD9\xB4\xD9\x88\xD9\xB4\xDB\x87\xD9\xB4\xD9\x8A\xD9\xB4\xE0\xB3\x86"
+	"\xE0\xB3\x82\xE0\xB3\x95\xE0\xB7\x99\xE0\xB7\x8F\xE0\xB7\x8A\xE0\xB9\x8D\xE0\xB8\xB2\xE0\xBB\x8D\xE0"
+	"\xBA\xB2\xE0\xBA\xAB\xE0\xBA\x99\xE0\xBA\xAB\xE0\xBA\xA1\xE0\xBC\x8B\xE0\xBE\xB2\xE0\xBD\xB1\xE0\xBE"
+	"\x80\xE0\xBE\xB3\xE0\xBD\xB1\xE0\xBE\x80\xE1\x83\x9C\xC6\x8E\xC8\xA2\xC9\x90\xC9\x91\xE1\xB4\x82\xC9"
+	"\x99\xC9\x9B\xC9\x9C\xC5\x8B\xC9\x94\xE1\xB4\x96\xE1\xB4\x97\xE1\xB4\x9D\xC9\xAF\xE1\xB4\xA5\xCE\xB3"
+	"\xCE\xB4\xCF\x87\xD0\xBD\xC9\x92\xC9\x95\xC3\xB0\xC9\x9F\xC9\xA1\xC9\xA5\xC9\xA8\xC9\xA9\xC9\xAA\xE1"
+	"\xB5\xBB\xCA\x9D\xC9\xAD\xE1\xB6\x85\xCA\x9F\xC9\xB1\xC9\xB0\xC9\xB2\xC9\xB3\xC9\xB4\xC9\xB5\xC9\xB8"
+	"\xCA\x82\xCA\x83\xC6\xAB\xCA\x89\xCA\x8A\xE1\xB4\x9C\xCA\x8B\xCA\x8C\xCA\x90\xCA\x91\x61\xCA\xBE\xCE"
+	"\xA5\xCC\x94\xCC\x80\xCE\xB1\xCD\x82\xCD\x85\x20\xCC\x93\x20\xCD\x82\x20\xCC\x88\xCD\x82\xCE\xB7\xCD"
+	"\x82\xCD\x85\x20\xCC\x93\xCC\x80\x20\xCC\x93\xCC\x81\x20\xCC\x93\xCD\x82\x20\xCC\x94\xCC\x80\x20\xCC"
+	"\x94\xCC\x81\x20\xCC\x94\xCD\x82\x20\xCC\x88\xCC\x80\xCF\x89\xCD\x82\xCD\x85\xE2\x80\x90\x20\xCC\xB3"
+	"\x2E\x2E\x2E\xE2\x80\xB2\xE2\x80\xB2\xE2\x80\xB2\xE2\x80\xB2\xE2\x80\xB2\xE2\x80\xB5\xE2\x80\xB5\xE2"
+	"\x80\xB5\xE2\x80\xB5\xE2\x80\xB5\x21\x21\x20\xCC\x85\x3F\x3F\x3F\x21\x21\x3F\x30\x35\x36\x37\x38\x39"
+	"\x2B\xE2\x88\x92\x28\x29\x52\x73\x61\x2F\x63\x61\x2F\x73\xC2\xB0\x43\x63\x2F\x6F\x63\x2F\x75\xC6\x90"
+	"\xC2\xB0\x46\xC4\xA7\x4E\x6F\x51\x53\x4D\x54\x45\x4C\x54\x4D\x46\x41\x58\xCE\x93\xCE\xA0\xE2\x88\x91"
+	"\x31\xE2\x81\x84\x37\x31\xE2\x81\x84\x39\x31\xE2\x81\x84\x31\x30\x31\xE2\x81\x84\x33\x32\xE2\x81\x84"
+	"\x33\x31\xE2\x81\x84\x35\x32\xE2\x81\x84\x35\x33\xE2\x81\x84\x35\x34\xE2\x81\x84\x35\x31\xE2\x81\x84"
+	"\x36\x35\xE2\x81\x84\x36\x31\xE2\x81\x84\x38\x33\xE2\x81\x84\x38\x35\xE2\x81\x84\x38\x37\xE2\x81\x84"
+	"\x38\x49\x49\x49\x49\x49\x49\x56\x56\x49\x56\x49\x49\x56\x49\x49\x49\x49\x58\x58\x49\x58\x49\x49\x69"
+	"\x69\x69\x69\x69\x69\x76\x76\x69\x76\x69\x69\x76\x69\x69\x69\x69\x78\x78\x69\x78\x69\x69\x30\xE2\x81"
+	"\x84\x33\xE2\x88\xAB\xE2\x88\xAB\xE2\x88\xAB\xE2\x88\xAB\xE2\x88\xAB\xE2\x88\xAE\xE2\x88\xAE\xE2\x88"
+	"\xAE\xE2\x88\xAE\xE2\x88\xAE\x31\x32\x31\x33\x31\x34\x31\x35\x31\x36\x31\x37\x31\x38\x31\x39\x32\x30"
+	"\x28\x31\x29\x28\x32\x29\x28\x33\x29\x28\x34\x29\x28\x35\x29\x28\x36\x29\x28\x37\x29\x28\x38\x29\x28"
+	"\x39\x29\x28\x31\x30\x29\x28\x31\x31\x29\x28\x31\x32\x29\x28\x31\x33\x29\x28\x31\x34\x29\x28\x31\x35"
+	"\x29\x28\x31\x36\x29\x28\x31\x37\x29\x28\x31\x38\x29\x28\x31\x39\x29\x28\x32\x30\x29\x31\x2E\x32\x2E"
+	"\x33\x2E\x34\x2E\x35\x2E\x36\x2E\x37\x2E\x38\x2E\x39\x2E\x31\x30\x2E\x31\x31\x2E\x31\x32\x2E\x31\x33"
+	"\x2E\x31\x34\x2E\x31\x35\x2E\x31\x36\x2E\x31\x37\x2E\x31\x38\x2E\x31\x39\x2E\x32\x30\x2E\x28\x61\x29"
+	"\x28\x62\x29\x28\x63\x29\x28\x64\x29\x28\x65\x29\x28\x66\x29\x28\x67\x29\x28\x68\x29\x28\x69\x29\x28"
+	"\x6A\x29\x28\x6B\x29\x28\x6C\x29\x28\x6D\x29\x28\x6E\x29\x28\x6F\x29\x28\x70\x29\x28\x71\x29\x28\x72"
+	"\x29\x28\x73\x29\x28\x74\x29\x28\x75\x29\x28\x76\x29\x28\x77\x29\x28\x78\x29\x28\x79\x29\x28\x7A\x29"
+	"\x3A\x3A\x3D\x3D\x3D\xE2\xB5\xA1\xE6\xAF\x8D\xE9\xBE\x9F\xE4\xB8\x80\xE4\xB8\xA8\xE4\xB8\xB6\xE4\xB8"
+	"\xBF\xE4\xB9\x99\xE4\xBA\x85\xE4\xBA\x8C\xE4\xBA\xA0\xE4\xBA\xBA\xE5\x84\xBF\xE5\x85\xA5\xE5\x85\xAB"
+	"\xE5\x86\x82\xE5\x86\x96\xE5\x86\xAB\xE5\x87\xA0\xE5\x88\x80\xE5\x8B\xB9\xE5\x8C\x95\xE5\x8C\x9A\xE5"
+	"\x8C\xB8\xE5\x8D\x81\xE5\x8D\x9C\xE5\x8D\xA9\xE5\x8E\x82\xE5\x8E\xB6\xE5\x8F\x88\xE5\x8F\xA3\xE5\x9B"
+	"\x97\xE5\x9C\x9F\xE5\xA3\xAB\xE5\xA4\x82\xE5\xA4\x8A\xE5\xA4\x95\xE5\xA4\xA7\xE5\xAD\x90\xE5\xAE\x80"
+	"\xE5\xAF\xB8\xE5\xB0\x8F\xE5\xB0\xB8\xE5\xB1\xB1\xE5\xB7\x9B\xE5\xB7\xA5\xE5\xB7\xB1\xE5\xB7\xBE\xE5"
+	"\xB9\xB2\xE5\xB9\xBA\xE5\xB9\xBF\xE5\xBB\xB4\xE5\xBC\x8B\xE5\xBC\x93\xE5\xBD\x90\xE5\xBD\xA1\xE5\xBD"
+	"\xB3\xE5\xBF\x83\xE6\x88\x88\xE6\x88\xB6\xE6\x89\x8B\xE6\x94\xAF\xE6\x94\xB4\xE6\x96\x87\xE6\x96\x97"
+	"\xE6\x96\xA4\xE6\x96\xB9\xE6\x97\xA0\xE6\x97\xA5\xE6\x9B\xB0\xE6\x9C\x88\xE6\x9C\xA8\xE6\xAC\xA0\xE6"
+	"\xAD\xA2\xE6\xAE\xB3\xE6\xAF\x8B\xE6\xAF\x94\xE6\xAF\x9B\xE6\xB0\x8F\xE6\xB0\x94\xE6\xB0\xB4\xE7\x81"
+	"\xAB\xE7\x88\xAA\xE7\x88\xB6\xE7\x88\xBB\xE7\x88\xBF\xE7\x89\x87\xE7\x89\x99\xE7\x89\x9B\xE7\x8A\xAC"
+	"\xE7\x8E\x84\xE7\x8E\x89\xE7\x93\x9C\xE7\x93\xA6\xE7\x94\x98\xE7\x94\x9F\xE7\x94\xA8\xE7\x94\xB0\xE7"
+	"\x96\x8B\xE7\x96\x92\xE7\x99\xB6\xE7\x99\xBD\xE7\x9A\xAE\xE7\x9A\xBF\xE7\x9B\xAE\xE7\x9F\x9B\xE7\x9F"
+	"\xA2\xE7\x9F\xB3\xE7\xA4\xBA\xE7\xA6\xB8\xE7\xA6\xBE\xE7\xA9\xB4\xE7\xAB\xB9\xE7\xB1\xB3\xE7\xB3\xB8"
+	"\xE7\xBC\xB6\xE7\xBD\x91\xE7\xBE\x8A\xE8\x80\x8C\xE8\x80\x92\xE8\x80\xB3\xE8\x81\xBF\xE8\x82\x89\xE8"
+	"\x87\xA3\xE8\x87\xAA\xE8\x87\xB3\xE8\x87\xBC\xE8\x88\x8C\xE8\x88\x9B\xE8\x88\x9F\xE8\x89\xAE\xE8\x89"
+	"\xB2\xE8\x89\xB8\xE8\x99\x8D\xE8\x99\xAB\xE8\xA1\x80\xE8\xA5\xBE\xE8\xA7\x92\xE8\xA8\x80\xE8\xB0\xB7"
+	"\xE8\xB1\x86\xE8\xB1\xB8\xE8\xB2\x9D\xE8\xB5\xA4\xE8\xB5\xB0\xE8\xB6\xB3\xE8\xBA\xAB\xE8\xBE\x9B\xE8"
+	"\xBE\xB5\xE9\x82\x91\xE9\x85\x89\xE9\x87\x86\xE9\x95\xB7\xE9\x96\x80\xE9\x98\x9C\xE9\x9A\xB6\xE9\x9A"
+	"\xB9\xE9\x9B\xA8\xE9\x9D\x91\xE9\x9D\x9E\xE9\x9D\xA2\xE9\x9D\xA9\xE9\x9F\x8B\xE9\x9F\xAD\xE9\x9F\xB3"
+	"\xE9\xA0\x81\xE9\xA2\xA8\xE9\xA3\x9B\xE9\xA3\x9F\xE9\xA6\x96\xE9\xA6\x99\xE9\xA6\xAC\xE9\xAA\xA8\xE9"
+	"\xAB\x98\xE9\xAB\x9F\xE9\xAC\xA5\xE9\xAC\xAF\xE9\xAC\xB2\xE9\xAC\xBC\xE9\xAD\x9A\xE9\xB3\xA5\xE9\xB9"
+	"\xB5\xE9\xBA\xA5\xE9\xBB\x83\xE9\xBB\x8D\xE9\xBB\x91\xE9\xBB\xBD\xE9\xBC\x8E\xE9\xBC\x93\xE9\xBC\xA0"
+	"\xE9\xBD\x8A\xE9\xBD\x92\xE9\xBE\xA0\xE3\x80\x92\xE5\x8D\x84\xE5\x8D\x85\x20\xE3\x82\x99\x20\xE3\x82"
+	"\x9A\xE3\x82\x88\xE3\x82\x8A\xE3\x82\xB3\xE3\x83\x88\xE1\x84\x80\xE1\x84\x81\xE1\x86\xAA\xE1\x84\x82"
+	"\xE1\x86\xAC\xE1\x86\xAD\xE1\x84\x83\xE1\x84\x84\xE1\x84\x85\xE1\x86\xB0\xE1\x86\xB1\xE1\x86\xB2\xE1"
+	"\x86\xB3\xE1\x86\xB4\xE1\x86\xB5\xE1\x84\x9A\xE1\x84\x86\xE1\x84\x87\xE1\x84\x88\xE1\x84\xA1\xE1\x84"
+	"\x89\xE1\x84\x8A\xE1\x84\x8B\xE1\x84\x8C\xE1\x84\x8D\xE1\x84\x8E\xE1\x84\x8F\xE1\x84\x90\xE1\x84\x91"
+	"\xE1\x84\x92\xE1\x85\xA1\xE1\x85\xA2\xE1\x85\xA3\xE1\x85\xA4\xE1\x85\xA5\xE1\x85\xA6\xE1\x85\xA7\xE1"
+	"\x85\xA8\xE1\x85\xA9\xE1\x85\xAA\xE1\x85\xAB\xE1\x85\xAC\xE1\x85\xAD\xE1\x85\xAE\xE1\x85\xAF\xE1\x85"
+	"\xB0\xE1\x85\xB1\xE1\x85\xB2\xE1\x85\xB3\xE1\x85\xB4\xE1\x85\xB5\xE1\x85\xA0\xE1\x84\x94\xE1\x84\x95"
+	"\xE1\x87\x87\xE1\x87\x88\xE1\x87\x8C\xE1\x87\x8E\xE1\x87\x93\xE1\x87\x97\xE1\x87\x99\xE1\x84\x9C\xE1"
+	"\x87\x9D\xE1\x87\x9F\xE1\x84\x9D\xE1\x84\x9E\xE1\x84\xA0\xE1\x84\xA2\xE1\x84\xA3\xE1\x84\xA7\xE1\x84"
+	"\xA9\xE1\x84\xAB\xE1\x84\xAC\xE1\x84\xAD\xE1\x84\xAE\xE1\x84\xAF\xE1\x84\xB2\xE1\x84\xB6\xE1\x85\x80"
+	"\xE1\x85\x87\xE1\x85\x8C\xE1\x87\xB1\xE1\x87\xB2\xE1\x85\x97\xE1\x85\x98\xE1\x85\x99\xE1\x86\x84\xE1"
+	"\x86\x85\xE1\x86\x88\xE1\x86\x91\xE1\x86\x92\xE1\x86\x94\xE1\x86\x9E\xE1\x86\xA1\xE4\xB8\x89\xE5\x9B"
+	"\x9B\xE4\xB8\x8A\xE4\xB8\xAD\xE4\xB8\x8B\xE7\x94\xB2\xE4\xB8\x99\xE4\xB8\x81\xE5\xA4\xA9\xE5\x9C\xB0"
+	"\x28\xE1\x84\x80\x29\x28\xE1\x84\x82\x29\x28\xE1\x84\x83\x29\x28\xE1\x84\x85\x29\x28\xE1\x84\x86\x29"
+	"\x28\xE1\x84\x87\x29\x28\xE1\x84\x89\x29\x28\xE1\x84\x8B\x29\x28\xE1\x84\x8C\x29\x28\xE1\x84\x8E\x29"
+	"\x28\xE1\x84\x8F\x29\x28\xE1\x84\x90\x29\x28\xE1\x84\x91\x29\x28\xE1\x84\x92\x29\x28\xE1\x84\x80\xE1"
+	"\x85\xA1\x29\x28\xE1\x84\x82\xE1\x85\xA1\x29\x28\xE1\x84\x83\xE1\x85\xA1\x29\x28\xE1\x84\x85\xE1\x85"
+	"\xA1\x29\x28\xE1\x84\x86\xE1\x85\xA1\x29\x28\xE1\x84\x87\xE1\x85\xA1\x29\x28\xE1\x84\x89\xE1\x85\xA1"
+	"\x29\x28\xE1\x84\x8B\xE1\x85\xA1\x29\x28\xE1\x84\x8C\xE1\x85\xA1\x29\x28\xE1\x84\x8E\xE1\x85\xA1\x29"
+	"\x28\xE1\x84\x8F\xE1\x85\xA1\x29\x28\xE1\x84\x90\xE1\x85\xA1\x29\x28\xE1\x84\x91\xE1\x85\xA1\x29\x28"
+	"\xE1\x84\x92\xE1\x85\xA1\x29\x28\xE1\x84\x8C\xE1\x85\xAE\x29\x28\xE1\x84\x8B\xE1\x85\xA9\xE1\x84\x8C"
+	"\xE1\x85\xA5\xE1\x86\xAB\x29\x28\xE1\x84\x8B\xE1\x85\xA9\xE1\x84\x92\xE1\x85\xAE\x29\x28\xE4\xB8\x80"
+	"\x29\x28\xE4\xBA\x8C\x29\x28\xE4\xB8\x89\x29\x28\xE5\x9B\x9B\x29\x28\xE4\xBA\x94\x29\x28\xE5\x85\xAD"
+	"\x29\x28\xE4\xB8\x83\x29\x28\xE5\x85\xAB\x29\x28\xE4\xB9\x9D\x29\x28\xE5\x8D\x81\x29\x28\xE6\x9C\x88"
+	"\x29\x28\xE7\x81\xAB\x29\x28\xE6\xB0\xB4\x29\x28\xE6\x9C\xA8\x29\x28\xE9\x87\x91\x29\x28\xE5\x9C\x9F"
+	"\x29\x28\xE6\x97\xA5\x29\x28\xE6\xA0\xAA\x29\x28\xE6\x9C\x89\x29\x28\xE7\xA4\xBE\x29\x28\xE5\x90\x8D"
+	"\x29\x28\xE7\x89\xB9\x29\x28\xE8\xB2\xA1\x29\x28\xE7\xA5\x9D\x29\x28\xE5\x8A\xB4\x29\x28\xE4\xBB\xA3"
+	"\x29\x28\xE5\x91\xBC\x29\x28\xE5\xAD\xA6\x29\x28\xE7\x9B\xA3\x29\x28\xE4\xBC\x81\x29\x28\xE8\xB3\x87"
+	"\x29\x28\xE5\x8D\x94\x29\x28\xE7\xA5\xAD\x29\x28\xE4\xBC\x91\x29\x28\xE8\x87\xAA\x29\x28\xE8\x87\xB3"
+	"\x29\xE5\x95\x8F\xE5\xB9\xBC\xE7\xAE\x8F\x50\x54\x45\x32\x32\x32\x34\x32\x35\x32\x36\x32\x37\x32\x38"
+	"\x32\x39\x33\x30\x33\x33\x33\x34\x33\x35\xE1\x84\x8E\xE1\x85\xA1\xE1\x86\xB7\xE1\x84\x80\xE1\x85\xA9"
+	"\xE1\x84\x8C\xE1\x85\xAE\xE1\x84\x8B\xE1\x85\xB4\xE1\x84\x8B\xE1\x85\xAE\xE7\xA7\x98\xE7\x94\xB7\xE9"
+	"\x81\xA9\xE5\x84\xAA\xE5\x8D\xB0\xE6\xB3\xA8\xE9\xA0\x85\xE5\x86\x99\xE6\xAD\xA3\xE5\xB7\xA6\xE5\x8F"
+	"\xB3\xE5\x8C\xBB\xE5\xAE\x97\xE5\xA4\x9C\x33\x36\x33\x37\x33\x38\x33\x39\x34\x30\x34\x34\x34\x35\x34"
+	"\x36\x34\x37\x34\x38\x34\x39\x35\x30\x31\xE6\x9C\x88\x32\xE6\x9C\x88\x33\xE6\x9C\x88\x34\xE6\x9C\x88"
+	"\x35\xE6\x9C\x88\x36\xE6\x9C\x88\x37\xE6\x9C\x88\x38\xE6\x9C\x88\x39\xE6\x9C\x88\x31\x30\xE6\x9C\x88"
+	"\x31\x31\xE6\x9C\x88\x31\x32\xE6\x9C\x88\x48\x67\x65\x72\x67\x65\x56\x4C\x54\x44\xE3\x82\xA2\xE3\x82"
+	"\xA4\xE3\x82\xA8\xE3\x82\xAA\xE3\x83\x8A\xE3\x83\x8B\xE3\x83\x8C\xE3\x83\x8D\xE3\x83\x8E\xE3\x83\x9E"
+	"\xE3\x83\x9F\xE3\x83\xA0\xE3\x83\xA1\xE3\x83\xA2\xE3\x83\xA4\xE3\x83\xA6\xE3\x83\xA8\xE3\x83\xA9\xE3"
+	"\x83\xAA\xE3\x83\xAB\xE3\x83\xAC\xE3\x83\xAD\xE3\x82\xA2\xE3\x83\x8F\xE3\x82\x9A\xE3\x83\xBC\xE3\x83"
+	"\x88\xE3\x82\xA2\xE3\x83\xAB\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA2\xE3\x83\xB3\xE3\x83\x98\xE3\x82\x9A"
+	"\xE3\x82\xA2\xE3\x82\xA2\xE3\x83\xBC\xE3\x83\xAB\xE3\x82\xA4\xE3\x83\x8B\xE3\x83\xB3\xE3\x82\xAF\xE3"
+	"\x82\x99\xE3\x82\xA4\xE3\x83\xB3\xE3\x83\x81\xE3\x82\xA6\xE3\x82\xA9\xE3\x83\xB3\xE3\x82\xA8\xE3\x82"
+	"\xB9\xE3\x82\xAF\xE3\x83\xBC\xE3\x83\x88\xE3\x82\x99\xE3\x82\xA8\xE3\x83\xBC\xE3\x82\xAB\xE3\x83\xBC"
+	"\xE3\x82\xAA\xE3\x83\xB3\xE3\x82\xB9\xE3\x82\xAA\xE3\x83\xBC\xE3\x83\xA0\xE3\x82\xAB\xE3\x82\xA4\xE3"
+	"\x83\xAA\xE3\x82\xAB\xE3\x83\xA9\xE3\x83\x83\xE3\x83\x88\xE3\x82\xAB\xE3\x83\xAD\xE3\x83\xAA\xE3\x83"
+	"\xBC\xE3\x82\xAB\xE3\x82\x99\xE3\x83\xAD\xE3\x83\xB3\xE3\x82\xAB\xE3\x82\x99\xE3\x83\xB3\xE3\x83\x9E"
+	"\xE3\x82\xAD\xE3\x82\x99\xE3\x82\xAB\xE3\x82\x99\xE3\x82\xAD\xE3\x82\x99\xE3\x83\x8B\xE3\x83\xBC\xE3"
+	"\x82\xAD\xE3\x83\xA5\xE3\x83\xAA\xE3\x83\xBC\xE3\x82\xAD\xE3\x82\x99\xE3\x83\xAB\xE3\x82\xBF\xE3\x82"
+	"\x99\xE3\x83\xBC\xE3\x82\xAD\xE3\x83\xAD\xE3\x82\xAD\xE3\x83\xAD\xE3\x82\xAF\xE3\x82\x99\xE3\x83\xA9"
+	"\xE3\x83\xA0\xE3\x82\xAD\xE3\x83\xAD\xE3\x83\xA1\xE3\x83\xBC\xE3\x83\x88\xE3\x83\xAB\xE3\x82\xAD\xE3"
+	"\x83\xAD\xE3\x83\xAF\xE3\x83\x83\xE3\x83\x88\xE3\x82\xAF\xE3\x82\x99\xE3\x83\xA9\xE3\x83\xA0\xE3\x83"
+	"\x88\xE3\x83\xB3\xE3\x82\xAF\xE3\x83\xAB\xE3\x82\xBB\xE3\x82\x99\xE3\x82\xA4\xE3\x83\xAD\xE3\x82\xAF"
+	"\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x8D\xE3\x82\xB1\xE3\x83\xBC\xE3\x82\xB9\xE3\x82\xB3\xE3\x83\xAB\xE3"
+	"\x83\x8A\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x9B\xE3\x82\x9A\xE3\x82\xB5\xE3\x82\xA4\xE3\x82\xAF\xE3\x83"
+	"\xAB\xE3\x82\xB5\xE3\x83\xB3\xE3\x83\x81\xE3\x83\xBC\xE3\x83\xA0\xE3\x82\xB7\xE3\x83\xAA\xE3\x83\xB3"
+	"\xE3\x82\xAF\xE3\x82\x99\xE3\x82\xBB\xE3\x83\xB3\xE3\x83\x81\xE3\x82\xBB\xE3\x83\xB3\xE3\x83\x88\xE3"
+	"\x82\xBF\xE3\x82\x99\xE3\x83\xBC\xE3\x82\xB9\xE3\x83\x86\xE3\x82\x99\xE3\x82\xB7\xE3\x83\x88\xE3\x82"
+	"\x99\xE3\x83\xAB\xE3\x83\x8A\xE3\x83\x8E\xE3\x83\x8E\xE3\x83\x83\xE3\x83\x88\xE3\x83\x8F\xE3\x82\xA4"
+	"\xE3\x83\x84\xE3\x83\x8F\xE3\x82\x9A\xE3\x83\xBC\xE3\x82\xBB\xE3\x83\xB3\xE3\x83\x88\xE3\x83\x8F\xE3"
+	"\x82\x9A\xE3\x83\xBC\xE3\x83\x84\xE3\x83\x8F\xE3\x82\x99\xE3\x83\xBC\xE3\x83\xAC\xE3\x83\xAB\xE3\x83"
+	"\x92\xE3\x82\x9A\xE3\x82\xA2\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xAB\xE3\x83\x92\xE3\x82\x9A\xE3\x82\xAF"
+	"\xE3\x83\xAB\xE3\x83\x92\xE3\x82\x9A\xE3\x82\xB3\xE3\x83\x92\xE3\x82\x99\xE3\x83\xAB\xE3\x83\x95\xE3"
+	"\x82\xA1\xE3\x83\xA9\xE3\x83\x83\xE3\x83\x88\xE3\x82\x99\xE3\x83\x95\xE3\x82\xA3\xE3\x83\xBC\xE3\x83"
+	"\x88\xE3\x83\x95\xE3\x82\x99\xE3\x83\x83\xE3\x82\xB7\xE3\x82\xA7\xE3\x83\xAB\xE3\x83\x95\xE3\x83\xA9"
+	"\xE3\x83\xB3\xE3\x83\x98\xE3\x82\xAF\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\xAB\xE3\x83\x98\xE3\x82\x9A\xE3"
+	"\x82\xBD\xE3\x83\x98\xE3\x82\x9A\xE3\x83\x8B\xE3\x83\x92\xE3\x83\x98\xE3\x83\xAB\xE3\x83\x84\xE3\x83"
+	"\x98\xE3\x82\x9A\xE3\x83\xB3\xE3\x82\xB9\xE3\x83\x98\xE3\x82\x9A\xE3\x83\xBC\xE3\x82\xB7\xE3\x82\x99"
+	"\xE3\x83\x98\xE3\x82\x99\xE3\x83\xBC\xE3\x82\xBF\xE3\x83\x9B\xE3\x82\x9A\xE3\x82\xA4\xE3\x83\xB3\xE3"
+	"\x83\x88\xE3\x83\x9B\xE3\x82\x99\xE3\x83\xAB\xE3\x83\x88\xE3\x83\x9B\xE3\x83\xB3\xE3\x83\x9B\xE3\x82"
+	"\x9A\xE3\x83\xB3\xE3\x83\x88\xE3\x82\x99\xE3\x83\x9B\xE3\x83\xBC\xE3\x83\xAB\xE3\x83\x9B\xE3\x83\xBC"
+	"\xE3\x83\xB3\xE3\x83\x9E\xE3\x82\xA4\xE3\x82\xAF\xE3\x83\xAD\xE3\x83\x9E\xE3\x82\xA4\xE3\x83\xAB\xE3"
+	"\x83\x9E\xE3\x83\x83\xE3\x83\x8F\xE3\x83\x9E\xE3\x83\xAB\xE3\x82\xAF\xE3\x83\x9E\xE3\x83\xB3\xE3\x82"
+	"\xB7\xE3\x83\xA7\xE3\x83\xB3\xE3\x83\x9F\xE3\x82\xAF\xE3\x83\xAD\xE3\x83\xB3\xE3\x83\x9F\xE3\x83\xAA"
+	"\xE3\x83\x9F\xE3\x83\xAA\xE3\x83\x8F\xE3\x82\x99\xE3\x83\xBC\xE3\x83\xAB\xE3\x83\xA1\xE3\x82\xAB\xE3"
+	"\x82\x99\xE3\x83\xA1\xE3\x82\xAB\xE3\x82\x99\xE3\x83\x88\xE3\x83\xB3\xE3\x83\xA4\xE3\x83\xBC\xE3\x83"
+	"\x88\xE3\x82\x99\xE3\x83\xA4\xE3\x83\xBC\xE3\x83\xAB\xE3\x83\xA6\xE3\x82\xA2\xE3\x83\xB3\xE3\x83\xAA"
+	"\xE3\x83\x83\xE3\x83\x88\xE3\x83\xAB\xE3\x83\xAA\xE3\x83\xA9\xE3\x83\xAB\xE3\x83\x92\xE3\x82\x9A\xE3"
+	"\x83\xBC\xE3\x83\xAB\xE3\x83\xBC\xE3\x83\x95\xE3\x82\x99\xE3\x83\xAB\xE3\x83\xAC\xE3\x83\xA0\xE3\x83"
+	"\xAC\xE3\x83\xB3\xE3\x83\x88\xE3\x82\xB1\xE3\x82\x99\xE3\x83\xB3\x30\xE7\x82\xB9\x31\xE7\x82\xB9\x32"
+	"\xE7\x82\xB9\x33\xE7\x82\xB9\x34\xE7\x82\xB9\x35\xE7\x82\xB9\x36\xE7\x82\xB9\x37\xE7\x82\xB9\x38\xE7"
+	"\x82\xB9\x39\xE7\x82\xB9\x31\x30\xE7\x82\xB9\x31\x31\xE7\x82\xB9\x31\x32\xE7\x82\xB9\x31\x33\xE7\x82"
+	"\xB9\x31\x34\xE7\x82\xB9\x31\x35\xE7\x82\xB9\x31\x36\xE7\x82\xB9\x31\x37\xE7\x82\xB9\x31\x38\xE7\x82"
+	"\xB9\x31\x39\xE7\x82\xB9\x32\x30\xE7\x82\xB9\x32\x31\xE7\x82\xB9\x32\x32\xE7\x82\xB9\x32\x33\xE7\x82"
+	"\xB9\x32\x34\xE7\x82\xB9\x68\x50\x61\x64\x61\x41\x55\x62\x61\x72\x6F\x56\x70\x63\x64\x6D\x64\x6D\x32"
+	"\x64\x6D\x33\x49\x55\xE5\xB9\xB3\xE6\x88\x90\xE6\x98\xAD\xE5\x92\x8C\xE5\xA4\xA7\xE6\xAD\xA3\xE6\x98"
+	"\x8E\xE6\xB2\xBB\xE6\xA0\xAA\xE5\xBC\x8F\xE4\xBC\x9A\xE7\xA4\xBE\x70\x41\x6E\x41\xCE\xBC\x41\x6D\x41"
+	"\x6B\x41\x4B\x42\x4D\x42\x47\x42\x63\x61\x6C\x6B\x63\x61\x6C\x70\x46\x6E\x46\xCE\xBC\x46\xCE\xBC\x67"
+	"\x6D\x67\x6B\x67\x48\x7A\x6B\x48\x7A\x4D\x48\x7A\x47\x48\x7A\x54\x48\x7A\xCE\xBC\x6C\x6D\x6C\x64\x6C"
+	"\x6B\x6C\x66\x6D\x6E\x6D\xCE\xBC\x6D\x6D\x6D\x63\x6D\x6B\x6D\x6D\x6D\x32\x63\x6D\x32\x6B\x6D\x32\x6D"
+	"\x6D\x33\x63\x6D\x33\x6B\x6D\x33\x6D\xE2\x88\x95\x73\x6D\xE2\x88\x95\x73\x32\x6B\x50\x61\x4D\x50\x61"
+	"\x47\x50\x61\x72\x61\x64\x72\x61\x64\xE2\x88\x95\x73\x72\x61\x64\xE2\x88\x95\x73\x32\x70\x73\x6E\x73"
+	"\xCE\xBC\x73\x6D\x73\x70\x56\x6E\x56\xCE\xBC\x56\x6D\x56\x6B\x56\x4D\x56\x70\x57\x6E\x57\xCE\xBC\x57"
+	"\x6D\x57\x6B\x57\x4D\x57\x6B\xCE\xA9\x4D\xCE\xA9\x61\x2E\x6D\x2E\x42\x71\x63\x63\x43\xE2\x88\x95\x6B"
+	"\x67\x43\x6F\x2E\x64\x42\x47\x79\x68\x61\x48\x50\x69\x6E\x4B\x4B\x4B\x4D\x6B\x74\x6C\x6E\x6C\x6F\x67"
+	"\x6C\x78\x6D\x62\x6D\x69\x6C\x6D\x6F\x6C\x50\x48\x70\x2E\x6D\x2E\x50\x50\x4D\x50\x52\x53\x76\x57\x62"
+	"\x56\xE2\x88\x95\x6D\x41\xE2\x88\x95\x6D\x31\xE6\x97\xA5\x32\xE6\x97\xA5\x33\xE6\x97\xA5\x34\xE6\x97"
+	"\xA5\x35\xE6\x97\xA5\x36\xE6\x97\xA5\x37\xE6\x97\xA5\x38\xE6\x97\xA5\x39\xE6\x97\xA5\x31\x30\xE6\x97"
+	"\xA5\x31\x31\xE6\x97\xA5\x31\x32\xE6\x97\xA5\x31\x33\xE6\x97\xA5\x31\x34\xE6\x97\xA5\x31\x35\xE6\x97"
+	"\xA5\x31\x36\xE6\x97\xA5\x31\x37\xE6\x97\xA5\x31\x38\xE6\x97\xA5\x31\x39\xE6\x97\xA5\x32\x30\xE6\x97"
+	"\xA5\x32\x31\xE6\x97\xA5\x32\x32\xE6\x97\xA5\x32\x33\xE6\x97\xA5\x32\x34\xE6\x97\xA5\x32\x35\xE6\x97"
+	"\xA5\x32\x36\xE6\x97\xA5\x32\x37\xE6\x97\xA5\x32\x38\xE6\x97\xA5\x32\x39\xE6\x97\xA5\x33\x30\xE6\x97"
+	"\xA5\x33\x31\xE6\x97\xA5\x67\x61\x6C\xD1\x8A\xD1\x8C\xEA\x9D\xAF\xC4\xA6\xC5\x93\xEA\x9C\xA7\xEA\xAC"
+	"\xB7\xC9\xAB\xEA\xAD\x92\x66\x66\x66\x69\x66\x6C\x66\x66\x69\x66\x66\x6C\x73\x74\xD5\xB4\xD5\xB6\xD5"
+	"\xB4\xD5\xA5\xD5\xB4\xD5\xAB\xD5\xBE\xD5\xB6\xD5\xB4\xD5\xAD\xD7\xA2\xD7\x9D\xD7\x90\xD7\x9C\xD9\xB1"
+	"\xD9\xBB\xD9\xBE\xDA\x80\xD9\xBA\xD9\xBF\xD9\xB9\xDA\xA4\xDA\xA6\xDA\x84\xDA\x83\xDA\x86\xDA\x87\xDA"
+	"\x8D\xDA\x8C\xDA\x8E\xDA\x88\xDA\x98\xDA\x91\xDA\xA9\xDA\xAF\xDA\xB3\xDA\xB1\xDA\xBA\xDA\xBB\xDA\xBE"
+	"\xDA\xAD\xDB\x86\xDB\x88\xDB\x8B\xDB\x85\xDB\x89\xDB\x90\xD9\x89\xD9\x8A\xD9\x94\xD8\xA7\xD9\x8A\xD9"
+	"\x94\xD9\x88\xD9\x8A\xD9\x94\xDB\x87\xD9\x8A\xD9\x94\xDB\x86\xD9\x8A\xD9\x94\xDB\x88\xD9\x8A\xD9\x94"
+	"\xDB\x90\xD9\x8A\xD9\x94\xD9\x89\xDB\x8C\xD9\x8A\xD9\x94\xD8\xAC\xD9\x8A\xD9\x94\xD8\xAD\xD9\x8A\xD9"
+	"\x94\xD9\x85\xD9\x8A\xD9\x94\xD9\x8A\xD8\xA8\xD8\xAC\xD8\xA8\xD8\xAD\xD8\xA8\xD8\xAE\xD8\xA8\xD9\x85"
+	"\xD8\xA8\xD9\x89\xD8\xA8\xD9\x8A\xD8\xAA\xD8\xAC\xD8\xAA\xD8\xAD\xD8\xAA\xD8\xAE\xD8\xAA\xD9\x85\xD8"
+	"\xAA\xD9\x89\xD8\xAA\xD9\x8A\xD8\xAB\xD8\xAC\xD8\xAB\xD9\x85\xD8\xAB\xD9\x89\xD8\xAB\xD9\x8A\xD8\xAC"
+	"\xD8\xAD\xD8\xAC\xD9\x85\xD8\xAD\xD9\x85\xD8\xAE\xD8\xAC\xD8\xAE\xD8\xAD\xD8\xAE\xD9\x85\xD8\xB3\xD8"
+	"\xAC\xD8\xB3\xD8\xAD\xD8\xB3\xD8\xAE\xD8\xB3\xD9\x85\xD8\xB5\xD8\xAD\xD8\xB5\xD9\x85\xD8\xB6\xD8\xAC"
+	"\xD8\xB6\xD8\xAD\xD8\xB6\xD8\xAE\xD8\xB6\xD9\x85\xD8\xB7\xD8\xAD\xD8\xB7\xD9\x85\xD8\xB8\xD9\x85\xD8"
+	"\xB9\xD8\xAC\xD8\xB9\xD9\x85\xD8\xBA\xD8\xAC\xD8\xBA\xD9\x85\xD9\x81\xD8\xAC\xD9\x81\xD8\xAD\xD9\x81"
+	"\xD8\xAE\xD9\x81\xD9\x85\xD9\x81\xD9\x89\xD9\x81\xD9\x8A\xD9\x82\xD8\xAD\xD9\x82\xD9\x85\xD9\x82\xD9"
+	"\x89\xD9\x82\xD9\x8A\xD9\x83\xD8\xA7\xD9\x83\xD8\xAC\xD9\x83\xD8\xAD\xD9\x83\xD8\xAE\xD9\x83\xD9\x84"
+	"\xD9\x83\xD9\x85\xD9\x83\xD9\x89\xD9\x83\xD9\x8A\xD9\x84\xD8\xAC\xD9\x84\xD8\xAD\xD9\x84\xD8\xAE\xD9"
+	"\x84\xD9\x85\xD9\x84\xD9\x89\xD9\x84\xD9\x8A\xD9\x85\xD8\xAC\xD9\x85\xD9\x85\xD9\x85\xD9\x89\xD9\x86"
+	"\xD8\xAC\xD9\x86\xD8\xAD\xD9\x86\xD8\xAE\xD9\x86\xD9\x85\xD9\x86\xD9\x89\xD9\x86\xD9\x8A\xD9\x87\xD8"
+	"\xAC\xD9\x87\xD9\x85\xD9\x87\xD9\x89\xD9\x87\xD9\x8A\xD9\x8A\xD8\xAD\xD9\x8A\xD8\xAE\xD9\x8A\xD9\x89"
+	"\xD8\xB0\xD9\xB0\xD8\xB1\xD9\xB0\xD9\x89\xD9\xB0\x20\xD9\x8C\xD9\x91\x20\xD9\x8D\xD9\x91\x20\xD9\x8E"
+	"\xD9\x91\x20\xD9\x8F\xD9\x91\x20\xD9\x90\xD9\x91\x20\xD9\x91\xD9\xB0\xD9\x8A\xD9\x94\xD8\xB1\xD9\x8A"
+	"\xD9\x94\xD8\xB2\xD9\x8A\xD9\x94\xD9\x86\xD8\xA8\xD8\xB1\xD8\xA8\xD8\xB2\xD8\xA8\xD9\x86\xD8\xAA\xD8"
+	"\xB1\xD8\xAA\xD8\xB2\xD8\xAA\xD9\x86\xD8\xAB\xD8\xB1\xD8\xAB\xD8\xB2\xD8\xAB\xD9\x86\xD9\x85\xD8\xA7"
+	"\xD9\x86\xD8\xB1\xD9\x86\xD8\xB2\xD9\x86\xD9\x86\xD9\x8A\xD8\xB1\xD9\x8A\xD8\xB2\xD9\x8A\xD9\x86\xD9"
+	"\x8A\xD9\x94\xD8\xAE\xD9\x8A\xD9\x94\xD9\x87\xD8\xA8\xD9\x87\xD8\xAA\xD9\x87\xD8\xB5\xD8\xAE\xD9\x84"
+	"\xD9\x87\xD9\x86\xD9\x87\xD9\x87\xD9\xB0\xD9\x8A\xD8\xAD\xD8\xAB\xD9\x87\xD8\xB3\xD9\x87\xD8\xB4\xD9"
+	"\x85\xD8\xB4\xD9\x87\xD9\x80\xD9\x8E\xD9\x91\xD9\x80\xD9\x8F\xD9\x91\xD9\x80\xD9\x90\xD9\x91\xD8\xB7"
+	"\xD9\x89\xD8\xB7\xD9\x8A\xD8\xB9\xD9\x89\xD8\xB9\xD9\x8A\xD8\xBA\xD9\x89\xD8\xBA\xD9\x8A\xD8\xB3\xD9"
+	"\x89\xD8\xB3\xD9\x8A\xD8\xB4\xD9\x89\xD8\xB4\xD9\x8A\xD8\xAD\xD9\x89\xD8\xAC\xD9\x89\xD8\xAE\xD9\x89"
+	"\xD8\xB5\xD9\x89\xD8\xB5\xD9\x8A\xD8\xB6\xD9\x89\xD8\xB6\xD9\x8A\xD8\xB4\xD8\xAC\xD8\xB4\xD8\xAD\xD8"
+	"\xB4\xD8\xAE\xD8\xB4\xD8\xB1\xD8\xB3\xD8\xB1\xD8\xB5\xD8\xB1\xD8\xB6\xD8\xB1\xD8\xA7\xD9\x8B\xD8\xAA"
+	"\xD8\xAC\xD9\x85\xD8\xAA\xD8\xAD\xD8\xAC\xD8\xAA\xD8\xAD\xD9\x85\xD8\xAA\xD8\xAE\xD9\x85\xD8\xAA\xD9"
+	"\x85\xD8\xAC\xD8\xAA\xD9\x85\xD8\xAD\xD8\xAA\xD9\x85\xD8\xAE\xD8\xAD\xD9\x85\xD9\x8A\xD8\xAD\xD9\x85"
+	"\xD9\x89\xD8\xB3\xD8\xAD\xD8\xAC\xD8\xB3\xD8\xAC\xD8\xAD\xD8\xB3\xD8\xAC\xD9\x89\xD8\xB3\xD9\x85\xD8"
+	"\xAD\xD8\xB3\xD9\x85\xD8\xAC\xD8\xB3\xD9\x85\xD9\x85\xD8\xB5\xD8\xAD\xD8\xAD\xD8\xB5\xD9\x85\xD9\x85"
+	"\xD8\xB4\xD8\xAD\xD9\x85\xD8\xB4\xD8\xAC\xD9\x8A\xD8\xB4\xD9\x85\xD8\xAE\xD8\xB4\xD9\x85\xD9\x85\xD8"
+	"\xB6\xD8\xAD\xD9\x89\xD8\xB6\xD8\xAE\xD9\x85\xD8\xB7\xD9\x85\xD8\xAD\xD8\xB7\xD9\x85\xD9\x85\xD8\xB7"
+	"\xD9\x85\xD9\x8A\xD8\xB9\xD8\xAC\xD9\x85\xD8\xB9\xD9\x85\xD9\x85\xD8\xB9\xD9\x85\xD9\x89\xD8\xBA\xD9"
+	"\x85\xD9\x85\xD8\xBA\xD9\x85\xD9\x8A\xD8\xBA\xD9\x85\xD9\x89\xD9\x81\xD8\xAE\xD9\x85\xD9\x82\xD9\x85"
+	"\xD8\xAD\xD9\x82\xD9\x85\xD9\x85\xD9\x84\xD8\xAD\xD9\x85\xD9\x84\xD8\xAD\xD9\x8A\xD9\x84\xD8\xAD\xD9"
+	"\x89\xD9\x84\xD8\xAC\xD8\xAC\xD9\x84\xD8\xAE\xD9\x85\xD9\x84\xD9\x85\xD8\xAD\xD9\x85\xD8\xAD\xD8\xAC"
+	"\xD9\x85\xD8\xAD\xD9\x8A\xD9\x85\xD8\xAC\xD8\xAD\xD9\x85\xD8\xAE\xD9\x85\xD9\x85\xD8\xAC\xD8\xAE\xD9"
+	"\x87\xD9\x85\xD8\xAC\xD9\x87\xD9\x85\xD9\x85\xD9\x86\xD8\xAD\xD9\x85\xD9\x86\xD8\xAD\xD9\x89\xD9\x86"
+	"\xD8\xAC\xD9\x85\xD9\x86\xD8\xAC\xD9\x89\xD9\x86\xD9\x85\xD9\x8A\xD9\x86\xD9\x85\xD9\x89\xD9\x8A\xD9"
+	"\x85\xD9\x85\xD8\xA8\xD8\xAE\xD9\x8A\xD8\xAA\xD8\xAC\xD9\x8A\xD8\xAA\xD8\xAC\xD9\x89\xD8\xAA\xD8\xAE"
+	"\xD9\x8A\xD8\xAA\xD8\xAE\xD9\x89\xD8\xAA\xD9\x85\xD9\x8A\xD8\xAA\xD9\x85\xD9\x89\xD8\xAC\xD9\x85\xD9"
+	"\x8A\xD8\xAC\xD8\xAD\xD9\x89\xD8\xAC\xD9\x85\xD9\x89\xD8\xB3\xD8\xAE\xD9\x89\xD8\xB5\xD8\xAD\xD9\x8A"
+	"\xD8\xB4\xD8\xAD\xD9\x8A\xD8\xB6\xD8\xAD\xD9\x8A\xD9\x84\xD8\xAC\xD9\x8A\xD9\x84\xD9\x85\xD9\x8A\xD9"
+	"\x8A\xD8\xAD\xD9\x8A\xD9\x8A\xD8\xAC\xD9\x8A\xD9\x8A\xD9\x85\xD9\x8A\xD9\x85\xD9\x85\xD9\x8A\xD9\x82"
+	"\xD9\x85\xD9\x8A\xD9\x86\xD8\xAD\xD9\x8A\xD8\xB9\xD9\x85\xD9\x8A\xD9\x83\xD9\x85\xD9\x8A\xD9\x86\xD8"
+	"\xAC\xD8\xAD\xD9\x85\xD8\xAE\xD9\x8A\xD9\x84\xD8\xAC\xD9\x85\xD9\x83\xD9\x85\xD9\x85\xD8\xAC\xD8\xAD"
+	"\xD9\x8A\xD8\xAD\xD8\xAC\xD9\x8A\xD9\x85\xD8\xAC\xD9\x8A\xD9\x81\xD9\x85\xD9\x8A\xD8\xA8\xD8\xAD\xD9"
+	"\x8A\xD8\xB3\xD8\xAE\xD9\x8A\xD9\x86\xD8\xAC\xD9\x8A\xD8\xB5\xD9\x84\xDB\x92\xD9\x82\xD9\x84\xDB\x92"
+	"\xD8\xA7\xD9\x84\xD9\x84\xD9\x87\xD8\xA7\xD9\x83\xD8\xA8\xD8\xB1\xD9\x85\xD8\xAD\xD9\x85\xD8\xAF\xD8"
+	"\xB5\xD9\x84\xD8\xB9\xD9\x85\xD8\xB1\xD8\xB3\xD9\x88\xD9\x84\xD8\xB9\xD9\x84\xD9\x8A\xD9\x87\xD9\x88"
+	"\xD8\xB3\xD9\x84\xD9\x85\xD8\xB5\xD9\x84\xD9\x89\xD8\xB5\xD9\x84\xD9\x89\x20\xD8\xA7\xD9\x84\xD9\x84"
+	"\xD9\x87\x20\xD8\xB9\xD9\x84\xD9\x8A\xD9\x87\x20\xD9\x88\xD8\xB3\xD9\x84\xD9\x85\xD8\xAC\xD9\x84\x20"
+	"\xD8\xAC\xD9\x84\xD8\xA7\xD9\x84\xD9\x87\xD8\xB1\xDB\x8C\xD8\xA7\xD9\x84\x2C\xE3\x80\x81\xE3\x80\x82"
+	"\xE3\x80\x96\xE3\x80\x97\xE2\x80\x94\xE2\x80\x93\x5F\x7B\x7D\xE3\x80\x94\xE3\x80\x95\xE3\x80\x90\xE3"
+	"\x80\x91\xE3\x80\x8A\xE3\x80\x8B\xE3\x80\x8C\xE3\x80\x8D\xE3\x80\x8E\xE3\x80\x8F\x5B\x5D\x23\x26\x2A"
+	"\x2D\x5C\x24\x25\x40\x20\xD9\x8B\xD9\x80\xD9\x8B\xD9\x80\xD9\x91\x20\xD9\x92\xD9\x80\xD9\x92\xD8\xA1"
+	"\xD8\xA9\xD9\x84\xD8\xA7\xD9\x93\xD9\x84\xD8\xA7\xD9\x94\xD9\x84\xD8\xA7\xD9\x95\x22\x27\x5E\x7C\x7E"
+	"\xE2\xA6\x85\xE2\xA6\x86\xE3\x83\xBB\xE3\x82\xA5\xE3\x83\xA3\xC2\xA2\xC2\xA3\xC2\xAC\xC2\xA6\xC2\xA5"
+	"\xE2\x82\xA9\xE2\x94\x82\xE2\x86\x91\xE2\x86\x93\xE2\x96\xA0\xE2\x97\x8B\xF0\x9D\x85\x98\xF0\x9D\x85"
+	"\xA5\xF0\x9D\x85\xAE\xC4\xB1\xC8\xB7\xCE\x92\xCE\x94\xCE\x96\xCE\x9A\xCE\x9B\xCE\x9C\xCE\x9D\xCE\x9E"
+	"\xCE\xA4\xCE\xA6\xCE\xA7\xCE\xA8\xE2\x88\x87\xCE\xB6\xCE\xBB\xCE\xBD\xCE\xBE\xCF\x83\xCF\x84\xCF\x88"
+	"\xE2\x88\x82\xCF\x9C\xCF\x9D\xD9\xAE\xDA\xA1\xD9\xAF\x30\x2C\x31\x2C\x32\x2C\x33\x2C\x34\x2C\x35\x2C"
+	"\x36\x2C\x37\x2C\x38\x2C\x39\x2C\x28\x41\x29\x28\x42\x29\x28\x43\x29\x28\x44\x29\x28\x45\x29\x28\x46"
+	"\x29\x28\x47\x29\x28\x48\x29\x28\x49\x29\x28\x4A\x29\x28\x4B\x29\x28\x4C\x29\x28\x4D\x29\x28\x4E\x29"
+	"\x28\x4F\x29\x28\x50\x29\x28\x51\x29\x28\x52\x29\x28\x53\x29\x28\x54\x29\x28\x55\x29\x28\x56\x29\x28"
+	"\x57\x29\x28\x58\x29\x28\x59\x29\x28\x5A\x29\xE3\x80\x94\x53\xE3\x80\x95\x43\x44\x57\x5A\x48\x56\x53"
+	"\x44\x53\x53\x50\x50\x56\x57\x43\x4D\x43\x4D\x44\x44\x4A\xE3\x81\xBB\xE3\x81\x8B\xE3\x82\xB3\xE3\x82"
+	"\xB3\xE5\xAD\x97\xE5\x8F\x8C\xE8\xA7\xA3\xE4\xBA\xA4\xE6\x98\xA0\xE7\x84\xA1\xE5\x89\x8D\xE5\xBE\x8C"
+	"\xE6\x96\xB0\xE5\x88\x9D\xE7\xB5\x82\xE8\xB2\xA9\xE5\xA3\xB0\xE5\x90\xB9\xE6\xBC\x94\xE6\x8A\x95\xE6"
+	"\x8D\x95\xE9\x81\x8A\xE6\x8C\x87\xE6\x89\x93\xE7\xA6\x81\xE7\xA9\xBA\xE5\x90\x88\xE6\xBA\x80\xE7\x94"
+	"\xB3\xE5\x96\xB6\xE3\x80\x94\xE6\x9C\xAC\xE3\x80\x95\xE3\x80\x94\xE4\xB8\x89\xE3\x80\x95\xE3\x80\x94"
+	"\xE4\xBA\x8C\xE3\x80\x95\xE3\x80\x94\xE5\xAE\x89\xE3\x80\x95\xE3\x80\x94\xE7\x82\xB9\xE3\x80\x95\xE3"
+	"\x80\x94\xE6\x89\x93\xE3\x80\x95\xE3\x80\x94\xE7\x9B\x97\xE3\x80\x95\xE3\x80\x94\xE5\x8B\x9D\xE3\x80"
+	"\x95\xE3\x80\x94\xE6\x95\x97\xE3\x80\x95\xE5\xBE\x97\xE5\x8F\xAF\xC3\x80\xC3\x81\xC3\x82\xC3\x83\xC3"
+	"\x84\xC3\x85\xC3\x87\xC3\x88\xC3\x89\xC3\x8A\xC3\x8B\xC3\x8C\xC3\x8D\xC3\x8E\xC3\x8F\xC3\x90\xC3\x91"
+	"\xC3\x92\xC3\x93\xC3\x94\xC3\x95\xC3\x96\xC3\x99\xC3\x9A\xC3\x9B\xC3\x9C\xC3\x9D\xC3\x9E\xC5\xB8\xC4"
+	"\x80\xC4\x82\xC4\x84\xC4\x86\xC4\x88\xC4\x8A\xC4\x8C\xC4\x8E\xC4\x90\xC4\x92\xC4\x94\xC4\x96\xC4\x98"
+	"\xC4\x9A\xC4\x9C\xC4\x9E\xC4\xA0\xC4\xA2\xC4\xA4\xC4\xA8\xC4\xAA\xC4\xAC\xC4\xAE\xC4\xB2\xC4\xB4\xC4"
+	"\xB6\xC4\xB9\xC4\xBB\xC4\xBD\xC4\xBF\xC5\x81\xC5\x83\xC5\x85\xC5\x87\xCA\xBC\x4E\xC5\x8A\xC5\x8C\xC5"
+	"\x8E\xC5\x90\xC5\x92\xC5\x94\xC5\x96\xC5\x98\xC5\x9A\xC5\x9C\xC5\x9E\xC5\xA0\xC5\xA2\xC5\xA4\xC5\xA6"
+	"\xC5\xA8\xC5\xAA\xC5\xAC\xC5\xAE\xC5\xB0\xC5\xB2\xC5\xB4\xC5\xB6\xC5\xB9\xC5\xBB\xC5\xBD\xC9\x83\xC6"
+	"\x82\xC6\x84\xC6\x87\xC6\x8B\xC6\x91\xC7\xB6\xC6\x98\xC8\xBD\xC8\xA0\xC6\xA0\xC6\xA2\xC6\xA4\xC6\xA7"
+	"\xC6\xAC\xC6\xAF\xC6\xB3\xC6\xB5\xC6\xB8\xC6\xBC\xC7\xB7\xC7\x84\xC7\x87\xC7\x8A\xC7\x8D\xC7\x8F\xC7"
+	"\x91\xC7\x93\xC7\x95\xC7\x97\xC7\x99\xC7\x9B\xC7\x9E\xC7\xA0\xC7\xA2\xC7\xA4\xC7\xA6\xC7\xA8\xC7\xAA"
+	"\xC7\xAC\xC7\xAE\x4A\xCC\x8C\xC7\xB1\xC7\xB4\xC7\xB8\xC7\xBA\xC7\xBC\xC7\xBE\xC8\x80\xC8\x82\xC8\x84"
+	"\xC8\x86\xC8\x88\xC8\x8A\xC8\x8C\xC8\x8E\xC8\x90\xC8\x92\xC8\x94\xC8\x96\xC8\x98\xC8\x9A\xC8\x9C\xC8"
+	"\x9E\xC8\xA4\xC8\xA6\xC8\xA8\xC8\xAA\xC8\xAC\xC8\xAE\xC8\xB0\xC8\xB2\xC8\xBB\xE2\xB1\xBE\xE2\xB1\xBF"
+	"\xC9\x81\xC9\x86\xC9\x88\xC9\x8A\xC9\x8C\xC9\x8E\xE2\xB1\xAF\xE2\xB1\xAD\xE2\xB1\xB0\xC6\x81\xC6\x86"
+	"\xC6\x89\xC6\x8A\xC6\x8F\xEA\x9E\xAB\xC6\x93\xEA\x9E\xAC\xC6\x94\xEA\x9E\x8D\xEA\x9E\xAA\xC6\x97\xC6"
+	"\x96\xE2\xB1\xA2\xEA\x9E\xAD\xC6\x9C\xE2\xB1\xAE\xC6\x9D\xC6\x9F\xE2\xB1\xA4\xC6\xA6\xC6\xA9\xEA\x9E"
+	"\xB1\xC6\xAE\xC9\x84\xC6\xB1\xC6\xB2\xC9\x85\xEA\x9E\xB0\xCD\xB0\xCD\xB2\xCD\xB6\xCF\xBD\xCF\xBE\xCF"
+	"\xBF\xCE\x99\xCC\x88\xCC\x81\xCE\x86\xCE\x88\xCE\x89\xCE\x8A\xCE\xA5\xCC\x88\xCC\x81\xCE\xAA\xCE\xAB"
+	"\xCE\x8C\xCE\x8E\xCE\x8F\xCF\x8F\xCF\x98\xCF\x9A\xCF\x9E\xCF\xA0\xCF\xA2\xCF\xA4\xCF\xA6\xCF\xA8\xCF"
+	"\xAA\xCF\xAC\xCF\xAE\xCF\xB9\xCD\xBF\xCF\xB7\xCF\xBA\xD0\x91\xD0\x92\xD0\x94\xD0\x99\xD0\x9B\xD0\x9C"
+	"\xD0\x9D\xD0\x9F\xD0\xA0\xD0\xA1\xD0\xA2\xD0\xA4\xD0\xA5\xD0\xA6\xD0\xA8\xD0\xA9\xD0\xAA\xD0\xAC\xD0"
+	"\xAE\xD0\xAF\xD0\x80\xD0\x81\xD0\x82\xD0\x83\xD0\x84\xD0\x85\xD0\x87\xD0\x88\xD0\x89\xD0\x8A\xD0\x8B"
+	"\xD0\x8C\xD0\x8D\xD0\x8E\xD0\x8F\xD1\xA0\xD1\xA2\xD1\xA4\xD1\xA6\xD1\xA8\xD1\xAA\xD1\xAC\xD1\xAE\xD1"
+	"\xB0\xD1\xB2\xD1\xB6\xD1\xB8\xD1\xBA\xD1\xBC\xD1\xBE\xD2\x80\xD2\x8A\xD2\x8C\xD2\x8E\xD2\x90\xD2\x92"
+	"\xD2\x94\xD2\x96\xD2\x98\xD2\x9A\xD2\x9C\xD2\x9E\xD2\xA0\xD2\xA2\xD2\xA4\xD2\xA6\xD2\xA8\xD2\xAA\xD2"
+	"\xAC\xD2\xAE\xD2\xB0\xD2\xB2\xD2\xB4\xD2\xB6\xD2\xB8\xD2\xBA\xD2\xBC\xD2\xBE\xD3\x81\xD3\x83\xD3\x85"
+	"\xD3\x87\xD3\x89\xD3\x8B\xD3\x8D\xD3\x80\xD3\x90\xD3\x92\xD3\x94\xD3\x96\xD3\x9A\xD3\x9C\xD3\x9E\xD3"
+	"\xA0\xD3\xA2\xD3\xA4\xD3\xA6\xD3\xAA\xD3\xAC\xD3\xAE\xD3\xB0\xD3\xB2\xD3\xB4\xD3\xB6\xD3\xB8\xD3\xBA"
+	"\xD3\xBC\xD3\xBE\xD4\x80\xD4\x82\xD4\x84\xD4\x86\xD4\x88\xD4\x8A\xD4\x8C\xD4\x8E\xD4\x90\xD4\x92\xD4"
+	"\x94\xD4\x96\xD4\x98\xD4\x9A\xD4\x9C\xD4\x9E\xD4\xA0\xD4\xA2\xD4\xA4\xD4\xA6\xD4\xA8\xD4\xAA\xD4\xAC"
+	"\xD4\xAE\xD4\xB1\xD4\xB2\xD4\xB3\xD4\xB4\xD4\xB5\xD4\xB6\xD4\xB7\xD4\xB8\xD4\xB9\xD4\xBA\xD4\xBB\xD4"
+	"\xBC\xD4\xBD\xD4\xBE\xD4\xBF\xD5\x80\xD5\x81\xD5\x82\xD5\x83\xD5\x84\xD5\x85\xD5\x86\xD5\x87\xD5\x88"
+	"\xD5\x89\xD5\x8A\xD5\x8B\xD5\x8C\xD5\x8D\xD5\x8E\xD5\x8F\xD5\x90\xD5\x91\xD5\x92\xD5\x93\xD5\x94\xD5"
+	"\x95\xD5\x96\xD4\xB5\xD5\x92\xEA\x9D\xBD\xE2\xB1\xA3\xE1\xB8\x80\xE1\xB8\x82\xE1\xB8\x84\xE1\xB8\x86"
+	"\xE1\xB8\x88\xE1\xB8\x8A\xE1\xB8\x8C\xE1\xB8\x8E\xE1\xB8\x90\xE1\xB8\x92\xE1\xB8\x94\xE1\xB8\x96\xE1"
+	"\xB8\x98\xE1\xB8\x9A\xE1\xB8\x9C\xE1\xB8\x9E\xE1\xB8\xA0\xE1\xB8\xA2\xE1\xB8\xA4\xE1\xB8\xA6\xE1\xB8"
+	"\xA8\xE1\xB8\xAA\xE1\xB8\xAC\xE1\xB8\xAE\xE1\xB8\xB0\xE1\xB8\xB2\xE1\xB8\xB4\xE1\xB8\xB6\xE1\xB8\xB8"
+	"\xE1\xB8\xBA\xE1\xB8\xBC\xE1\xB8\xBE\xE1\xB9\x80\xE1\xB9\x82\xE1\xB9\x84\xE1\xB9\x86\xE1\xB9\x88\xE1"
+	"\xB9\x8A\xE1\xB9\x8C\xE1\xB9\x8E\xE1\xB9\x90\xE1\xB9\x92\xE1\xB9\x94\xE1\xB9\x96\xE1\xB9\x98\xE1\xB9"
+	"\x9A\xE1\xB9\x9C\xE1\xB9\x9E\xE1\xB9\xA0\xE1\xB9\xA2\xE1\xB9\xA4\xE1\xB9\xA6\xE1\xB9\xA8\xE1\xB9\xAA"
+	"\xE1\xB9\xAC\xE1\xB9\xAE\xE1\xB9\xB0\xE1\xB9\xB2\xE1\xB9\xB4\xE1\xB9\xB6\xE1\xB9\xB8\xE1\xB9\xBA\xE1"
+	"\xB9\xBC\xE1\xB9\xBE\xE1\xBA\x80\xE1\xBA\x82\xE1\xBA\x84\xE1\xBA\x86\xE1\xBA\x88\xE1\xBA\x8A\xE1\xBA"
+	"\x8C\xE1\xBA\x8E\xE1\xBA\x90\xE1\xBA\x92\xE1\xBA\x94\x48\xCC\xB1\x54\xCC\x88\x57\xCC\x8A\x59\xCC\x8A"
+	"\x41\xCA\xBE\xE1\xBA\xA0\xE1\xBA\xA2\xE1\xBA\xA4\xE1\xBA\xA6\xE1\xBA\xA8\xE1\xBA\xAA\xE1\xBA\xAC\xE1"
+	"\xBA\xAE\xE1\xBA\xB0\xE1\xBA\xB2\xE1\xBA\xB4\xE1\xBA\xB6\xE1\xBA\xB8\xE1\xBA\xBA\xE1\xBA\xBC\xE1\xBA"
+	"\xBE\xE1\xBB\x80\xE1\xBB\x82\xE1\xBB\x84\xE1\xBB\x86\xE1\xBB\x88\xE1\xBB\x8A\xE1\xBB\x8C\xE1\xBB\x8E"
+	"\xE1\xBB\x90\xE1\xBB\x92\xE1\xBB\x94\xE1\xBB\x96\xE1\xBB\x98\xE1\xBB\x9A\xE1\xBB\x9C\xE1\xBB\x9E\xE1"
+	"\xBB\xA0\xE1\xBB\xA2\xE1\xBB\xA4\xE1\xBB\xA6\xE1\xBB\xA8\xE1\xBB\xAA\xE1\xBB\xAC\xE1\xBB\xAE\xE1\xBB"
+	"\xB0\xE1\xBB\xB2\xE1\xBB\xB4\xE1\xBB\xB6\xE1\xBB\xB8\xE1\xBB\xBA\xE1\xBB\xBC\xE1\xBB\xBE\xE1\xBC\x88"
+	"\xE1\xBC\x89\xE1\xBC\x8A\xE1\xBC\x8B\xE1\xBC\x8C\xE1\xBC\x8D\xE1\xBC\x8E\xE1\xBC\x8F\xE1\xBC\x98\xE1"
+	"\xBC\x99\xE1\xBC\x9A\xE1\xBC\x9B\xE1\xBC\x9C\xE1\xBC\x9D\xE1\xBC\xA8\xE1\xBC\xA9\xE1\xBC\xAA\xE1\xBC"
+	"\xAB\xE1\xBC\xAC\xE1\xBC\xAD\xE1\xBC\xAE\xE1\xBC\xAF\xE1\xBC\xB8\xE1\xBC\xB9\xE1\xBC\xBA\xE1\xBC\xBB"
+	"\xE1\xBC\xBC\xE1\xBC\xBD\xE1\xBC\xBE\xE1\xBC\xBF\xE1\xBD\x88\xE1\xBD\x89\xE1\xBD\x8A\xE1\xBD\x8B\xE1"
+	"\xBD\x8C\xE1\xBD\x8D\xCE\xA5\xCC\x93\xE1\xBD\x99\xCE\xA5\xCC\x93\xCC\x80\xE1\xBD\x9B\xCE\xA5\xCC\x93"
+	"\xCC\x81\xE1\xBD\x9D\xCE\xA5\xCC\x93\xCD\x82\xE1\xBD\x9F\xE1\xBD\xA8\xE1\xBD\xA9\xE1\xBD\xAA\xE1\xBD"
+	"\xAB\xE1\xBD\xAC\xE1\xBD\xAD\xE1\xBD\xAE\xE1\xBD\xAF\xE1\xBE\xBA\xE1\xBE\xBB\xE1\xBF\x88\xE1\xBF\x89"
+	"\xE1\xBF\x8A\xE1\xBF\x8B\xE1\xBF\x9A\xE1\xBF\x9B\xE1\xBF\xB8\xE1\xBF\xB9\xE1\xBF\xAA\xE1\xBF\xAB\xE1"
+	"\xBF\xBA\xE1\xBF\xBB\xE1\xBC\x88\xCE\x99\xE1\xBC\x89\xCE\x99\xE1\xBC\x8A\xCE\x99\xE1\xBC\x8B\xCE\x99"
+	"\xE1\xBC\x8C\xCE\x99\xE1\xBC\x8D\xCE\x99\xE1\xBC\x8E\xCE\x99\xE1\xBC\x8F\xCE\x99\xE1\xBC\xA8\xCE\x99"
+	"\xE1\xBC\xA9\xCE\x99\xE1\xBC\xAA\xCE\x99\xE1\xBC\xAB\xCE\x99\xE1\xBC\xAC\xCE\x99\xE1\xBC\xAD\xCE\x99"
+	"\xE1\xBC\xAE\xCE\x99\xE1\xBC\xAF\xCE\x99\xE1\xBD\xA8\xCE\x99\xE1\xBD\xA9\xCE\x99\xE1\xBD\xAA\xCE\x99"
+	"\xE1\xBD\xAB\xCE\x99\xE1\xBD\xAC\xCE\x99\xE1\xBD\xAD\xCE\x99\xE1\xBD\xAE\xCE\x99\xE1\xBD\xAF\xCE\x99"
+	"\xE1\xBE\xB8\xE1\xBE\xB9\xE1\xBE\xBA\xCE\x99\xCE\x91\xCE\x99\xCE\x86\xCE\x99\xCE\x91\xCD\x82\xCE\x91"
+	"\xCD\x82\xCE\x99\xE1\xBF\x8A\xCE\x99\xCE\x97\xCE\x99\xCE\x89\xCE\x99\xCE\x97\xCD\x82\xCE\x97\xCD\x82"
+	"\xCE\x99\xE1\xBF\x98\xE1\xBF\x99\xCE\x99\xCC\x88\xCC\x80\xCE\x99\xCD\x82\xCE\x99\xCC\x88\xCD\x82\xE1"
+	"\xBF\xA8\xE1\xBF\xA9\xCE\xA5\xCC\x88\xCC\x80\xCE\xA1\xCC\x93\xE1\xBF\xAC\xCE\xA5\xCD\x82\xCE\xA5\xCC"
+	"\x88\xCD\x82\xE1\xBF\xBA\xCE\x99\xCE\xA9\xCE\x99\xCE\x8F\xCE\x99\xCE\xA9\xCD\x82\xCE\xA9\xCD\x82\xCE"
+	"\x99\xE2\x84\xB2\xE2\x85\xA0\xE2\x85\xA1\xE2\x85\xA2\xE2\x85\xA3\xE2\x85\xA4\xE2\x85\xA5\xE2\x85\xA6"
+	"\xE2\x85\xA7\xE2\x85\xA8\xE2\x85\xA9\xE2\x85\xAA\xE2\x85\xAB\xE2\x85\xAC\xE2\x85\xAD\xE2\x85\xAE\xE2"
+	"\x85\xAF\xE2\x86\x83\xE2\x92\xB6\xE2\x92\xB7\xE2\x92\xB8\xE2\x92\xB9\xE2\x92\xBA\xE2\x92\xBB\xE2\x92"
+	"\xBC\xE2\x92\xBD\xE2\x92\xBE\xE2\x92\xBF\xE2\x93\x80\xE2\x93\x81\xE2\x93\x82\xE2\x93\x83\xE2\x93\x84"
+	"\xE2\x93\x85\xE2\x93\x86\xE2\x93\x87\xE2\x93\x88\xE2\x93\x89\xE2\x93\x8A\xE2\x93\x8B\xE2\x93\x8C\xE2"
+	"\x93\x8D\xE2\x93\x8E\xE2\x93\x8F\xE2\xB0\x80\xE2\xB0\x81\xE2\xB0\x82\xE2\xB0\x83\xE2\xB0\x84\xE2\xB0"
+	"\x85\xE2\xB0\x86\xE2\xB0\x87\xE2\xB0\x88\xE2\xB0\x89\xE2\xB0\x8A\xE2\xB0\x8B\xE2\xB0\x8C\xE2\xB0\x8D"
+	"\xE2\xB0\x8E\xE2\xB0\x8F\xE2\xB0\x90\xE2\xB0\x91\xE2\xB0\x92\xE2\xB0\x93\xE2\xB0\x94\xE2\xB0\x95\xE2"
+	"\xB0\x96\xE2\xB0\x97\xE2\xB0\x98\xE2\xB0\x99\xE2\xB0\x9A\xE2\xB0\x9B\xE2\xB0\x9C\xE2\xB0\x9D\xE2\xB0"
+	"\x9E\xE2\xB0\x9F\xE2\xB0\xA0\xE2\xB0\xA1\xE2\xB0\xA2\xE2\xB0\xA3\xE2\xB0\xA4\xE2\xB0\xA5\xE2\xB0\xA6"
+	"\xE2\xB0\xA7\xE2\xB0\xA8\xE2\xB0\xA9\xE2\xB0\xAA\xE2\xB0\xAB\xE2\xB0\xAC\xE2\xB0\xAD\xE2\xB0\xAE\xE2"
+	"\xB1\xA0\xC8\xBA\xC8\xBE\xE2\xB1\xA7\xE2\xB1\xA9\xE2\xB1\xAB\xE2\xB1\xB2\xE2\xB1\xB5\xE2\xB2\x80\xE2"
+	"\xB2\x82\xE2\xB2\x84\xE2\xB2\x86\xE2\xB2\x88\xE2\xB2\x8A\xE2\xB2\x8C\xE2\xB2\x8E\xE2\xB2\x90\xE2\xB2"
+	"\x92\xE2\xB2\x94\xE2\xB2\x96\xE2\xB2\x98\xE2\xB2\x9A\xE2\xB2\x9C\xE2\xB2\x9E\xE2\xB2\xA0\xE2\xB2\xA2"
+	"\xE2\xB2\xA4\xE2\xB2\xA6\xE2\xB2\xA8\xE2\xB2\xAA\xE2\xB2\xAC\xE2\xB2\xAE\xE2\xB2\xB0\xE2\xB2\xB2\xE2"
+	"\xB2\xB4\xE2\xB2\xB6\xE2\xB2\xB8\xE2\xB2\xBA\xE2\xB2\xBC\xE2\xB2\xBE\xE2\xB3\x80\xE2\xB3\x82\xE2\xB3"
+	"\x84\xE2\xB3\x86\xE2\xB3\x88\xE2\xB3\x8A\xE2\xB3\x8C\xE2\xB3\x8E\xE2\xB3\x90\xE2\xB3\x92\xE2\xB3\x94"
+	"\xE2\xB3\x96\xE2\xB3\x98\xE2\xB3\x9A\xE2\xB3\x9C\xE2\xB3\x9E\xE2\xB3\xA0\xE2\xB3\xA2\xE2\xB3\xAB\xE2"
+	"\xB3\xAD\xE2\xB3\xB2\xE1\x82\xA0\xE1\x82\xA1\xE1\x82\xA2\xE1\x82\xA3\xE1\x82\xA4\xE1\x82\xA5\xE1\x82"
+	"\xA6\xE1\x82\xA7\xE1\x82\xA8\xE1\x82\xA9\xE1\x82\xAA\xE1\x82\xAB\xE1\x82\xAC\xE1\x82\xAD\xE1\x82\xAE"
+	"\xE1\x82\xAF\xE1\x82\xB0\xE1\x82\xB1\xE1\x82\xB2\xE1\x82\xB3\xE1\x82\xB4\xE1\x82\xB5\xE1\x82\xB6\xE1"
+	"\x82\xB7\xE1\x82\xB8\xE1\x82\xB9\xE1\x82\xBA\xE1\x82\xBB\xE1\x82\xBC\xE1\x82\xBD\xE1\x82\xBE\xE1\x82"
+	"\xBF\xE1\x83\x80\xE1\x83\x81\xE1\x83\x82\xE1\x83\x83\xE1\x83\x84\xE1\x83\x85\xE1\x83\x87\xE1\x83\x8D"
+	"\xEA\x99\x80\xEA\x99\x82\xEA\x99\x84\xEA\x99\x86\xEA\x99\x88\xEA\x99\x8A\xEA\x99\x8C\xEA\x99\x8E\xEA"
+	"\x99\x90\xEA\x99\x92\xEA\x99\x94\xEA\x99\x96\xEA\x99\x98\xEA\x99\x9A\xEA\x99\x9C\xEA\x99\x9E\xEA\x99"
+	"\xA0\xEA\x99\xA2\xEA\x99\xA4\xEA\x99\xA6\xEA\x99\xA8\xEA\x99\xAA\xEA\x99\xAC\xEA\x9A\x80\xEA\x9A\x82"
+	"\xEA\x9A\x84\xEA\x9A\x86\xEA\x9A\x88\xEA\x9A\x8A\xEA\x9A\x8C\xEA\x9A\x8E\xEA\x9A\x90\xEA\x9A\x92\xEA"
+	"\x9A\x94\xEA\x9A\x96\xEA\x9A\x98\xEA\x9A\x9A\xEA\x9C\xA2\xEA\x9C\xA4\xEA\x9C\xA6\xEA\x9C\xA8\xEA\x9C"
+	"\xAA\xEA\x9C\xAC\xEA\x9C\xAE\xEA\x9C\xB2\xEA\x9C\xB4\xEA\x9C\xB6\xEA\x9C\xB8\xEA\x9C\xBA\xEA\x9C\xBC"
+	"\xEA\x9C\xBE\xEA\x9D\x80\xEA\x9D\x82\xEA\x9D\x84\xEA\x9D\x86\xEA\x9D\x88\xEA\x9D\x8A\xEA\x9D\x8C\xEA"
+	"\x9D\x8E\xEA\x9D\x90\xEA\x9D\x92\xEA\x9D\x94\xEA\x9D\x96\xEA\x9D\x98\xEA\x9D\x9A\xEA\x9D\x9C\xEA\x9D"
+	"\x9E\xEA\x9D\xA0\xEA\x9D\xA2\xEA\x9D\xA4\xEA\x9D\xA6\xEA\x9D\xA8\xEA\x9D\xAA\xEA\x9D\xAC\xEA\x9D\xAE"
+	"\xEA\x9D\xB9\xEA\x9D\xBB\xEA\x9D\xBE\xEA\x9E\x80\xEA\x9E\x82\xEA\x9E\x84\xEA\x9E\x86\xEA\x9E\x8B\xEA"
+	"\x9E\x90\xEA\x9E\x92\xEA\x9E\x96\xEA\x9E\x98\xEA\x9E\x9A\xEA\x9E\x9C\xEA\x9E\x9E\xEA\x9E\xA0\xEA\x9E"
+	"\xA2\xEA\x9E\xA4\xEA\x9E\xA6\xEA\x9E\xA8\x46\x46\x46\x49\x46\x4C\x46\x46\x49\x46\x46\x4C\x53\x54\xD5"
+	"\x84\xD5\x86\xD5\x84\xD4\xB5\xD5\x84\xD4\xBB\xD5\x8E\xD5\x86\xD5\x84\xD4\xBD\xEF\xBC\xA1\xEF\xBC\xA2"
+	"\xEF\xBC\xA3\xEF\xBC\xA4\xEF\xBC\xA5\xEF\xBC\xA6\xEF\xBC\xA7\xEF\xBC\xA8\xEF\xBC\xA9\xEF\xBC\xAA\xEF"
+	"\xBC\xAB\xEF\xBC\xAC\xEF\xBC\xAD\xEF\xBC\xAE\xEF\xBC\xAF\xEF\xBC\xB0\xEF\xBC\xB1\xEF\xBC\xB2\xEF\xBC"
+	"\xB3\xEF\xBC\xB4\xEF\xBC\xB5\xEF\xBC\xB6\xEF\xBC\xB7\xEF\xBC\xB8\xEF\xBC\xB9\xEF\xBC\xBA\xF0\x90\x90"
+	"\x80\xF0\x90\x90\x81\xF0\x90\x90\x82\xF0\x90\x90\x83\xF0\x90\x90\x84\xF0\x90\x90\x85\xF0\x90\x90\x86"
+	"\xF0\x90\x90\x87\xF0\x90\x90\x88\xF0\x90\x90\x89\xF0\x90\x90\x8A\xF0\x90\x90\x8B\xF0\x90\x90\x8C\xF0"
+	"\x90\x90\x8D\xF0\x90\x90\x8E\xF0\x90\x90\x8F\xF0\x90\x90\x90\xF0\x90\x90\x91\xF0\x90\x90\x92\xF0\x90"
+	"\x90\x93\xF0\x90\x90\x94\xF0\x90\x90\x95\xF0\x90\x90\x96\xF0\x90\x90\x97\xF0\x90\x90\x98\xF0\x90\x90"
+	"\x99\xF0\x90\x90\x9A\xF0\x90\x90\x9B\xF0\x90\x90\x9C\xF0\x90\x90\x9D\xF0\x90\x90\x9E\xF0\x90\x90\x9F"
+	"\xF0\x90\x90\xA0\xF0\x90\x90\xA1\xF0\x90\x90\xA2\xF0\x90\x90\xA3\xF0\x90\x90\xA4\xF0\x90\x90\xA5\xF0"
+	"\x90\x90\xA6\xF0\x90\x90\xA7\xF0\x91\xA2\xA0\xF0\x91\xA2\xA1\xF0\x91\xA2\xA2\xF0\x91\xA2\xA3\xF0\x91"
+	"\xA2\xA4\xF0\x91\xA2\xA5\xF0\x91\xA2\xA6\xF0\x91\xA2\xA7\xF0\x91\xA2\xA8\xF0\x91\xA2\xA9\xF0\x91\xA2"
+	"\xAA\xF0\x91\xA2\xAB\xF0\x91\xA2\xAC\xF0\x91\xA2\xAD\xF0\x91\xA2\xAE\xF0\x91\xA2\xAF\xF0\x91\xA2\xB0"
+	"\xF0\x91\xA2\xB1\xF0\x91\xA2\xB2\xF0\x91\xA2\xB3\xF0\x91\xA2\xB4\xF0\x91\xA2\xB5\xF0\x91\xA2\xB6\xF0"
+	"\x91\xA2\xB7\xF0\x91\xA2\xB8\xF0\x91\xA2\xB9\xF0\x91\xA2\xBA\xF0\x91\xA2\xBB\xF0\x91\xA2\xBC\xF0\x91"
+	"\xA2\xBD\xF0\x91\xA2\xBE\xF0\x91\xA2\xBF\xC3\xA0\xC3\xA1\xC3\xA2\xC3\xA3\xC3\xA4\xC3\xA5\xC3\xA7\xC3"
+	"\xA8\xC3\xA9\xC3\xAA\xC3\xAB\xC3\xAC\xC3\xAD\xC3\xAE\xC3\xAF\xC3\xB1\xC3\xB2\xC3\xB3\xC3\xB4\xC3\xB5"
+	"\xC3\xB6\xC3\xB9\xC3\xBA\xC3\xBB\xC3\xBC\xC3\xBD\xC3\xBE\xC4\x81\xC4\x83\xC4\x85\xC4\x87\xC4\x89\xC4"
+	"\x8B\xC4\x8D\xC4\x8F\xC4\x91\xC4\x93\xC4\x95\xC4\x97\xC4\x99\xC4\x9B\xC4\x9D\xC4\x9F\xC4\xA1\xC4\xA3"
+	"\xC4\xA5\xC4\xA9\xC4\xAB\xC4\xAD\xC4\xAF\x69\xCC\x87\xC4\xB3\xC4\xB5\xC4\xB7\xC4\xBA\xC4\xBC\xC4\xBE"
+	"\xC5\x80\xC5\x82\xC5\x84\xC5\x86\xC5\x88\xC5\x8D\xC5\x8F\xC5\x91\xC5\x95\xC5\x97\xC5\x99\xC5\x9B\xC5"
+	"\x9D\xC5\x9F\xC5\xA1\xC5\xA3\xC5\xA5\xC5\xA7\xC5\xA9\xC5\xAB\xC5\xAD\xC5\xAF\xC5\xB1\xC5\xB3\xC5\xB5"
+	"\xC5\xB7\xC3\xBF\xC5\xBA\xC5\xBC\xC5\xBE\xC9\x93\xC6\x83\xC6\x85\xC6\x88\xC9\x96\xC9\x97\xC6\x8C\xC7"
+	"\x9D\xC6\x92\xC9\xA0\xC6\x99\xC6\xA1\xC6\xA3\xC6\xA5\xCA\x80\xC6\xA8\xC6\xAD\xCA\x88\xC6\xB0\xC6\xB4"
+	"\xC6\xB6\xC6\xB9\xC6\xBD\xC7\x86\xC7\x89\xC7\x8C\xC7\x8E\xC7\x90\xC7\x92\xC7\x94\xC7\x96\xC7\x98\xC7"
+	"\x9A\xC7\x9C\xC7\x9F\xC7\xA1\xC7\xA3\xC7\xA5\xC7\xA7\xC7\xA9\xC7\xAB\xC7\xAD\xC7\xAF\xC7\xB3\xC7\xB5"
+	"\xC6\x95\xC6\xBF\xC7\xB9\xC7\xBB\xC7\xBD\xC7\xBF\xC8\x81\xC8\x83\xC8\x85\xC8\x87\xC8\x89\xC8\x8B\xC8"
+	"\x8D\xC8\x8F\xC8\x91\xC8\x93\xC8\x95\xC8\x97\xC8\x99\xC8\x9B\xC8\x9D\xC8\x9F\xC6\x9E\xC8\xA3\xC8\xA5"
+	"\xC8\xA7\xC8\xA9\xC8\xAB\xC8\xAD\xC8\xAF\xC8\xB1\xC8\xB3\xE2\xB1\xA5\xC8\xBC\xC6\x9A\xE2\xB1\xA6\xC9"
+	"\x82\xC6\x80\xC9\x87\xC9\x89\xC9\x8B\xC9\x8D\xC9\x8F\xCD\xB1\xCD\xB3\xCD\xB7\xCF\xB3\xCE\xAC\xCE\xAD"
+	"\xCE\xAE\xCE\xAF\xCF\x8C\xCF\x8D\xCF\x8E\xCF\x8A\xCF\x8B\xCF\x97\xCF\x99\xCF\x9B\xCF\x9F\xCF\xA1\xCF"
+	"\xA3\xCF\xA5\xCF\xA7\xCF\xA9\xCF\xAB\xCF\xAD\xCF\xAF\xCF\xB8\xCF\xB2\xCF\xBB\xCD\xBB\xCD\xBC\xCD\xBD"
+	"\xD1\x90\xD1\x91\xD1\x92\xD1\x93\xD1\x94\xD1\x95\xD1\x97\xD1\x98\xD1\x99\xD1\x9A\xD1\x9B\xD1\x9C\xD1"
+	"\x9D\xD1\x9E\xD1\x9F\xD0\xB1\xD0\xB2\xD0\xB4\xD0\xB9\xD0\xBB\xD0\xBC\xD0\xBF\xD1\x80\xD1\x81\xD1\x82"
+	"\xD1\x84\xD1\x85\xD1\x86\xD1\x88\xD1\x89\xD1\x8E\xD1\x8F\xD1\xA1\xD1\xA3\xD1\xA5\xD1\xA7\xD1\xA9\xD1"
+	"\xAB\xD1\xAD\xD1\xAF\xD1\xB1\xD1\xB3\xD1\xB7\xD1\xB9\xD1\xBB\xD1\xBD\xD1\xBF\xD2\x81\xD2\x8B\xD2\x8D"
+	"\xD2\x8F\xD2\x91\xD2\x93\xD2\x95\xD2\x97\xD2\x99\xD2\x9B\xD2\x9D\xD2\x9F\xD2\xA1\xD2\xA3\xD2\xA5\xD2"
+	"\xA7\xD2\xA9\xD2\xAB\xD2\xAD\xD2\xAF\xD2\xB1\xD2\xB3\xD2\xB5\xD2\xB7\xD2\xB9\xD2\xBB\xD2\xBD\xD2\xBF"
+	"\xD3\x8F\xD3\x82\xD3\x84\xD3\x86\xD3\x88\xD3\x8A\xD3\x8C\xD3\x8E\xD3\x91\xD3\x93\xD3\x95\xD3\x97\xD3"
+	"\x9B\xD3\x9D\xD3\x9F\xD3\xA1\xD3\xA3\xD3\xA5\xD3\xA7\xD3\xAB\xD3\xAD\xD3\xAF\xD3\xB1\xD3\xB3\xD3\xB5"
+	"\xD3\xB7\xD3\xB9\xD3\xBB\xD3\xBD\xD3\xBF\xD4\x81\xD4\x83\xD4\x85\xD4\x87\xD4\x89\xD4\x8B\xD4\x8D\xD4"
+	"\x8F\xD4\x91\xD4\x93\xD4\x95\xD4\x97\xD4\x99\xD4\x9B\xD4\x9D\xD4\x9F\xD4\xA1\xD4\xA3\xD4\xA5\xD4\xA7"
+	"\xD4\xA9\xD4\xAB\xD4\xAD\xD4\xAF\xD5\xA1\xD5\xA2\xD5\xA3\xD5\xA4\xD5\xA6\xD5\xA7\xD5\xA8\xD5\xA9\xD5"
+	"\xAA\xD5\xAC\xD5\xAE\xD5\xAF\xD5\xB0\xD5\xB1\xD5\xB2\xD5\xB3\xD5\xB5\xD5\xB7\xD5\xB8\xD5\xB9\xD5\xBA"
+	"\xD5\xBB\xD5\xBC\xD5\xBD\xD5\xBF\xD6\x80\xD6\x81\xD6\x83\xD6\x84\xD6\x85\xD6\x86\xE2\xB4\x80\xE2\xB4"
+	"\x81\xE2\xB4\x82\xE2\xB4\x83\xE2\xB4\x84\xE2\xB4\x85\xE2\xB4\x86\xE2\xB4\x87\xE2\xB4\x88\xE2\xB4\x89"
+	"\xE2\xB4\x8A\xE2\xB4\x8B\xE2\xB4\x8C\xE2\xB4\x8D\xE2\xB4\x8E\xE2\xB4\x8F\xE2\xB4\x90\xE2\xB4\x91\xE2"
+	"\xB4\x92\xE2\xB4\x93\xE2\xB4\x94\xE2\xB4\x95\xE2\xB4\x96\xE2\xB4\x97\xE2\xB4\x98\xE2\xB4\x99\xE2\xB4"
+	"\x9A\xE2\xB4\x9B\xE2\xB4\x9C\xE2\xB4\x9D\xE2\xB4\x9E\xE2\xB4\x9F\xE2\xB4\xA0\xE2\xB4\xA1\xE2\xB4\xA2"
+	"\xE2\xB4\xA3\xE2\xB4\xA4\xE2\xB4\xA5\xE2\xB4\xA7\xE2\xB4\xAD\xE1\xB8\x81\xE1\xB8\x83\xE1\xB8\x85\xE1"
+	"\xB8\x87\xE1\xB8\x89\xE1\xB8\x8B\xE1\xB8\x8D\xE1\xB8\x8F\xE1\xB8\x91\xE1\xB8\x93\xE1\xB8\x95\xE1\xB8"
+	"\x97\xE1\xB8\x99\xE1\xB8\x9B\xE1\xB8\x9D\xE1\xB8\x9F\xE1\xB8\xA1\xE1\xB8\xA3\xE1\xB8\xA5\xE1\xB8\xA7"
+	"\xE1\xB8\xA9\xE1\xB8\xAB\xE1\xB8\xAD\xE1\xB8\xAF\xE1\xB8\xB1\xE1\xB8\xB3\xE1\xB8\xB5\xE1\xB8\xB7\xE1"
+	"\xB8\xB9\xE1\xB8\xBB\xE1\xB8\xBD\xE1\xB8\xBF\xE1\xB9\x81\xE1\xB9\x83\xE1\xB9\x85\xE1\xB9\x87\xE1\xB9"
+	"\x89\xE1\xB9\x8B\xE1\xB9\x8D\xE1\xB9\x8F\xE1\xB9\x91\xE1\xB9\x93\xE1\xB9\x95\xE1\xB9\x97\xE1\xB9\x99"
+	"\xE1\xB9\x9B\xE1\xB9\x9D\xE1\xB9\x9F\xE1\xB9\xA1\xE1\xB9\xA3\xE1\xB9\xA5\xE1\xB9\xA7\xE1\xB9\xA9\xE1"
+	"\xB9\xAB\xE1\xB9\xAD\xE1\xB9\xAF\xE1\xB9\xB1\xE1\xB9\xB3\xE1\xB9\xB5\xE1\xB9\xB7\xE1\xB9\xB9\xE1\xB9"
+	"\xBB\xE1\xB9\xBD\xE1\xB9\xBF\xE1\xBA\x81\xE1\xBA\x83\xE1\xBA\x85\xE1\xBA\x87\xE1\xBA\x89\xE1\xBA\x8B"
+	"\xE1\xBA\x8D\xE1\xBA\x8F\xE1\xBA\x91\xE1\xBA\x93\xE1\xBA\x95\xC3\x9F\xE1\xBA\xA1\xE1\xBA\xA3\xE1\xBA"
+	"\xA5\xE1\xBA\xA7\xE1\xBA\xA9\xE1\xBA\xAB\xE1\xBA\xAD\xE1\xBA\xAF\xE1\xBA\xB1\xE1\xBA\xB3\xE1\xBA\xB5"
+	"\xE1\xBA\xB7\xE1\xBA\xB9\xE1\xBA\xBB\xE1\xBA\xBD\xE1\xBA\xBF\xE1\xBB\x81\xE1\xBB\x83\xE1\xBB\x85\xE1"
+	"\xBB\x87\xE1\xBB\x89\xE1\xBB\x8B\xE1\xBB\x8D\xE1\xBB\x8F\xE1\xBB\x91\xE1\xBB\x93\xE1\xBB\x95\xE1\xBB"
+	"\x97\xE1\xBB\x99\xE1\xBB\x9B\xE1\xBB\x9D\xE1\xBB\x9F\xE1\xBB\xA1\xE1\xBB\xA3\xE1\xBB\xA5\xE1\xBB\xA7"
+	"\xE1\xBB\xA9\xE1\xBB\xAB\xE1\xBB\xAD\xE1\xBB\xAF\xE1\xBB\xB1\xE1\xBB\xB3\xE1\xBB\xB5\xE1\xBB\xB7\xE1"
+	"\xBB\xB9\xE1\xBB\xBB\xE1\xBB\xBD\xE1\xBB\xBF\xE1\xBC\x80\xE1\xBC\x81\xE1\xBC\x82\xE1\xBC\x83\xE1\xBC"
+	"\x84\xE1\xBC\x85\xE1\xBC\x86\xE1\xBC\x87\xE1\xBC\x90\xE1\xBC\x91\xE1\xBC\x92\xE1\xBC\x93\xE1\xBC\x94"
+	"\xE1\xBC\x95\xE1\xBC\xA0\xE1\xBC\xA1\xE1\xBC\xA2\xE1\xBC\xA3\xE1\xBC\xA4\xE1\xBC\xA5\xE1\xBC\xA6\xE1"
+	"\xBC\xA7\xE1\xBC\xB0\xE1\xBC\xB1\xE1\xBC\xB2\xE1\xBC\xB3\xE1\xBC\xB4\xE1\xBC\xB5\xE1\xBC\xB6\xE1\xBC"
+	"\xB7\xE1\xBD\x80\xE1\xBD\x81\xE1\xBD\x82\xE1\xBD\x83\xE1\xBD\x84\xE1\xBD\x85\xE1\xBD\x91\xE1\xBD\x93"
+	"\xE1\xBD\x95\xE1\xBD\x97\xE1\xBD\xA0\xE1\xBD\xA1\xE1\xBD\xA2\xE1\xBD\xA3\xE1\xBD\xA4\xE1\xBD\xA5\xE1"
+	"\xBD\xA6\xE1\xBD\xA7\xE1\xBE\x80\xE1\xBE\x81\xE1\xBE\x82\xE1\xBE\x83\xE1\xBE\x84\xE1\xBE\x85\xE1\xBE"
+	"\x86\xE1\xBE\x87\xE1\xBE\x90\xE1\xBE\x91\xE1\xBE\x92\xE1\xBE\x93\xE1\xBE\x94\xE1\xBE\x95\xE1\xBE\x96"
+	"\xE1\xBE\x97\xE1\xBE\xA0\xE1\xBE\xA1\xE1\xBE\xA2\xE1\xBE\xA3\xE1\xBE\xA4\xE1\xBE\xA5\xE1\xBE\xA6\xE1"
+	"\xBE\xA7\xE1\xBE\xB0\xE1\xBE\xB1\xE1\xBD\xB0\xE1\xBD\xB1\xE1\xBE\xB3\xE1\xBD\xB2\xE1\xBD\xB3\xE1\xBD"
+	"\xB4\xE1\xBD\xB5\xE1\xBF\x83\xE1\xBF\x90\xE1\xBF\x91\xE1\xBD\xB6\xE1\xBD\xB7\xE1\xBF\xA0\xE1\xBF\xA1"
+	"\xE1\xBD\xBA\xE1\xBD\xBB\xE1\xBF\xA5\xE1\xBD\xB8\xE1\xBD\xB9\xE1\xBD\xBC\xE1\xBD\xBD\xE1\xBF\xB3\xE2"
+	"\x85\x8E\xE2\x85\xB0\xE2\x85\xB1\xE2\x85\xB2\xE2\x85\xB3\xE2\x85\xB4\xE2\x85\xB5\xE2\x85\xB6\xE2\x85"
+	"\xB7\xE2\x85\xB8\xE2\x85\xB9\xE2\x85\xBA\xE2\x85\xBB\xE2\x85\xBC\xE2\x85\xBD\xE2\x85\xBE\xE2\x85\xBF"
+	"\xE2\x86\x84\xE2\x93\x90\xE2\x93\x91\xE2\x93\x92\xE2\x93\x93\xE2\x93\x94\xE2\x93\x95\xE2\x93\x96\xE2"
+	"\x93\x97\xE2\x93\x98\xE2\x93\x99\xE2\x93\x9A\xE2\x93\x9B\xE2\x93\x9C\xE2\x93\x9D\xE2\x93\x9E\xE2\x93"
+	"\x9F\xE2\x93\xA0\xE2\x93\xA1\xE2\x93\xA2\xE2\x93\xA3\xE2\x93\xA4\xE2\x93\xA5\xE2\x93\xA6\xE2\x93\xA7"
+	"\xE2\x93\xA8\xE2\x93\xA9\xE2\xB0\xB0\xE2\xB0\xB1\xE2\xB0\xB2\xE2\xB0\xB3\xE2\xB0\xB4\xE2\xB0\xB5\xE2"
+	"\xB0\xB6\xE2\xB0\xB7\xE2\xB0\xB8\xE2\xB0\xB9\xE2\xB0\xBA\xE2\xB0\xBB\xE2\xB0\xBC\xE2\xB0\xBD\xE2\xB0"
+	"\xBE\xE2\xB0\xBF\xE2\xB1\x80\xE2\xB1\x81\xE2\xB1\x82\xE2\xB1\x83\xE2\xB1\x84\xE2\xB1\x85\xE2\xB1\x86"
+	"\xE2\xB1\x87\xE2\xB1\x88\xE2\xB1\x89\xE2\xB1\x8A\xE2\xB1\x8B\xE2\xB1\x8C\xE2\xB1\x8D\xE2\xB1\x8E\xE2"
+	"\xB1\x8F\xE2\xB1\x90\xE2\xB1\x91\xE2\xB1\x92\xE2\xB1\x93\xE2\xB1\x94\xE2\xB1\x95\xE2\xB1\x96\xE2\xB1"
+	"\x97\xE2\xB1\x98\xE2\xB1\x99\xE2\xB1\x9A\xE2\xB1\x9B\xE2\xB1\x9C\xE2\xB1\x9D\xE2\xB1\x9E\xE2\xB1\xA1"
+	"\xE1\xB5\xBD\xC9\xBD\xE2\xB1\xA8\xE2\xB1\xAA\xE2\xB1\xAC\xE2\xB1\xB3\xE2\xB1\xB6\xC8\xBF\xC9\x80\xE2"
+	"\xB2\x81\xE2\xB2\x83\xE2\xB2\x85\xE2\xB2\x87\xE2\xB2\x89\xE2\xB2\x8B\xE2\xB2\x8D\xE2\xB2\x8F\xE2\xB2"
+	"\x91\xE2\xB2\x93\xE2\xB2\x95\xE2\xB2\x97\xE2\xB2\x99\xE2\xB2\x9B\xE2\xB2\x9D\xE2\xB2\x9F\xE2\xB2\xA1"
+	"\xE2\xB2\xA3\xE2\xB2\xA5\xE2\xB2\xA7\xE2\xB2\xA9\xE2\xB2\xAB\xE2\xB2\xAD\xE2\xB2\xAF\xE2\xB2\xB1\xE2"
+	"\xB2\xB3\xE2\xB2\xB5\xE2\xB2\xB7\xE2\xB2\xB9\xE2\xB2\xBB\xE2\xB2\xBD\xE2\xB2\xBF\xE2\xB3\x81\xE2\xB3"
+	"\x83\xE2\xB3\x85\xE2\xB3\x87\xE2\xB3\x89\xE2\xB3\x8B\xE2\xB3\x8D\xE2\xB3\x8F\xE2\xB3\x91\xE2\xB3\x93"
+	"\xE2\xB3\x95\xE2\xB3\x97\xE2\xB3\x99\xE2\xB3\x9B\xE2\xB3\x9D\xE2\xB3\x9F\xE2\xB3\xA1\xE2\xB3\xA3\xE2"
+	"\xB3\xAC\xE2\xB3\xAE\xE2\xB3\xB3\xEA\x99\x81\xEA\x99\x83\xEA\x99\x85\xEA\x99\x87\xEA\x99\x89\xEA\x99"
+	"\x8B\xEA\x99\x8D\xEA\x99\x8F\xEA\x99\x91\xEA\x99\x93\xEA\x99\x95\xEA\x99\x97\xEA\x99\x99\xEA\x99\x9B"
+	"\xEA\x99\x9D\xEA\x99\x9F\xEA\x99\xA1\xEA\x99\xA3\xEA\x99\xA5\xEA\x99\xA7\xEA\x99\xA9\xEA\x99\xAB\xEA"
+	"\x99\xAD\xEA\x9A\x81\xEA\x9A\x83\xEA\x9A\x85\xEA\x9A\x87\xEA\x9A\x89\xEA\x9A\x8B\xEA\x9A\x8D\xEA\x9A"
+	"\x8F\xEA\x9A\x91\xEA\x9A\x93\xEA\x9A\x95\xEA\x9A\x97\xEA\x9A\x99\xEA\x9A\x9B\xEA\x9C\xA3\xEA\x9C\xA5"
+	"\xEA\x9C\xA9\xEA\x9C\xAB\xEA\x9C\xAD\xEA\x9C\xAF\xEA\x9C\xB3\xEA\x9C\xB5\xEA\x9C\xB7\xEA\x9C\xB9\xEA"
+	"\x9C\xBB\xEA\x9C\xBD\xEA\x9C\xBF\xEA\x9D\x81\xEA\x9D\x83\xEA\x9D\x85\xEA\x9D\x87\xEA\x9D\x89\xEA\x9D"
+	"\x8B\xEA\x9D\x8D\xEA\x9D\x8F\xEA\x9D\x91\xEA\x9D\x93\xEA\x9D\x95\xEA\x9D\x97\xEA\x9D\x99\xEA\x9D\x9B"
+	"\xEA\x9D\x9D\xEA\x9D\x9F\xEA\x9D\xA1\xEA\x9D\xA3\xEA\x9D\xA5\xEA\x9D\xA7\xEA\x9D\xA9\xEA\x9D\xAB\xEA"
+	"\x9D\xAD\xEA\x9D\xBA\xEA\x9D\xBC\xE1\xB5\xB9\xEA\x9D\xBF\xEA\x9E\x81\xEA\x9E\x83\xEA\x9E\x85\xEA\x9E"
+	"\x87\xEA\x9E\x8C\xEA\x9E\x91\xEA\x9E\x93\xEA\x9E\x97\xEA\x9E\x99\xEA\x9E\x9B\xEA\x9E\x9D\xEA\x9E\x9F"
+	"\xEA\x9E\xA1\xEA\x9E\xA3\xEA\x9E\xA5\xEA\x9E\xA7\xEA\x9E\xA9\xC9\xAC\xCA\x9E\xCA\x87\xEF\xBD\x81\xEF"
+	"\xBD\x82\xEF\xBD\x83\xEF\xBD\x84\xEF\xBD\x85\xEF\xBD\x86\xEF\xBD\x87\xEF\xBD\x88\xEF\xBD\x89\xEF\xBD"
+	"\x8A\xEF\xBD\x8B\xEF\xBD\x8C\xEF\xBD\x8D\xEF\xBD\x8E\xEF\xBD\x8F\xEF\xBD\x90\xEF\xBD\x91\xEF\xBD\x92"
+	"\xEF\xBD\x93\xEF\xBD\x94\xEF\xBD\x95\xEF\xBD\x96\xEF\xBD\x97\xEF\xBD\x98\xEF\xBD\x99\xEF\xBD\x9A\xF0"
+	"\x90\x90\xA8\xF0\x90\x90\xA9\xF0\x90\x90\xAA\xF0\x90\x90\xAB\xF0\x90\x90\xAC\xF0\x90\x90\xAD\xF0\x90"
+	"\x90\xAE\xF0\x90\x90\xAF\xF0\x90\x90\xB0\xF0\x90\x90\xB1\xF0\x90\x90\xB2\xF0\x90\x90\xB3\xF0\x90\x90"
+	"\xB4\xF0\x90\x90\xB5\xF0\x90\x90\xB6\xF0\x90\x90\xB7\xF0\x90\x90\xB8\xF0\x90\x90\xB9\xF0\x90\x90\xBA"
+	"\xF0\x90\x90\xBB\xF0\x90\x90\xBC\xF0\x90\x90\xBD\xF0\x90\x90\xBE\xF0\x90\x90\xBF\xF0\x90\x91\x80\xF0"
+	"\x90\x91\x81\xF0\x90\x91\x82\xF0\x90\x91\x83\xF0\x90\x91\x84\xF0\x90\x91\x85\xF0\x90\x91\x86\xF0\x90"
+	"\x91\x87\xF0\x90\x91\x88\xF0\x90\x91\x89\xF0\x90\x91\x8A\xF0\x90\x91\x8B\xF0\x90\x91\x8C\xF0\x90\x91"
+	"\x8D\xF0\x90\x91\x8E\xF0\x90\x91\x8F\xF0\x91\xA3\x80\xF0\x91\xA3\x81\xF0\x91\xA3\x82\xF0\x91\xA3\x83"
+	"\xF0\x91\xA3\x84\xF0\x91\xA3\x85\xF0\x91\xA3\x86\xF0\x91\xA3\x87\xF0\x91\xA3\x88\xF0\x91\xA3\x89\xF0"
+	"\x91\xA3\x8A\xF0\x91\xA3\x8B\xF0\x91\xA3\x8C\xF0\x91\xA3\x8D\xF0\x91\xA3\x8E\xF0\x91\xA3\x8F\xF0\x91"
+	"\xA3\x90\xF0\x91\xA3\x91\xF0\x91\xA3\x92\xF0\x91\xA3\x93\xF0\x91\xA3\x94\xF0\x91\xA3\x95\xF0\x91\xA3"
+	"\x96\xF0\x91\xA3\x97\xF0\x91\xA3\x98\xF0\x91\xA3\x99\xF0\x91\xA3\x9A\xF0\x91\xA3\x9B\xF0\x91\xA3\x9C"
+	"\xF0\x91\xA3\x9D\xF0\x91\xA3\x9E\xF0\x91\xA3\x9F\x53\x73\xC7\x85\xC7\x88\xC7\x8B\xC7\xB2\xD4\xB5\xD6"
+	"\x82\xE1\xBE\x88\xE1\xBE\x89\xE1\xBE\x8A\xE1\xBE\x8B\xE1\xBE\x8C\xE1\xBE\x8D\xE1\xBE\x8E\xE1\xBE\x8F"
+	"\xE1\xBE\x98\xE1\xBE\x99\xE1\xBE\x9A\xE1\xBE\x9B\xE1\xBE\x9C\xE1\xBE\x9D\xE1\xBE\x9E\xE1\xBE\x9F\xE1"
+	"\xBE\xA8\xE1\xBE\xA9\xE1\xBE\xAA\xE1\xBE\xAB\xE1\xBE\xAC\xE1\xBE\xAD\xE1\xBE\xAE\xE1\xBE\xAF\xE1\xBE"
+	"\xBA\xCD\x85\xE1\xBE\xBC\xCE\x86\xCD\x85\xCE\x91\xCD\x82\xCD\x85\xE1\xBF\x8A\xCD\x85\xE1\xBF\x8C\xCE"
+	"\x89\xCD\x85\xCE\x97\xCD\x82\xCD\x85\xE1\xBF\xBA\xCD\x85\xE1\xBF\xBC\xCE\x8F\xCD\x85\xCE\xA9\xCD\x82"
+	"\xCD\x85\x46\x66\x46\x69\x46\x6C\x46\x66\x69\x46\x66\x6C\x53\x74\xD5\x84\xD5\xB6\xD5\x84\xD5\xA5\xD5"
+	"\x84\xD5\xAB\xD5\x8E\xD5\xB6\xD5\x84\xD5\xAD\x73\x73\xE1\xBC\x80\xCE\xB9\xE1\xBC\x81\xCE\xB9\xE1\xBC"
+	"\x82\xCE\xB9\xE1\xBC\x83\xCE\xB9\xE1\xBC\x84\xCE\xB9\xE1\xBC\x85\xCE\xB9\xE1\xBC\x86\xCE\xB9\xE1\xBC"
+	"\x87\xCE\xB9\xE1\xBC\xA0\xCE\xB9\xE1\xBC\xA1\xCE\xB9\xE1\xBC\xA2\xCE\xB9\xE1\xBC\xA3\xCE\xB9\xE1\xBC"
+	"\xA4\xCE\xB9\xE1\xBC\xA5\xCE\xB9\xE1\xBC\xA6\xCE\xB9\xE1\xBC\xA7\xCE\xB9\xE1\xBD\xA0\xCE\xB9\xE1\xBD"
+	"\xA1\xCE\xB9\xE1\xBD\xA2\xCE\xB9\xE1\xBD\xA3\xCE\xB9\xE1\xBD\xA4\xCE\xB9\xE1\xBD\xA5\xCE\xB9\xE1\xBD"
+	"\xA6\xCE\xB9\xE1\xBD\xA7\xCE\xB9\xE1\xBD\xB0\xCE\xB9\xCE\xB1\xCE\xB9\xCE\xAC\xCE\xB9\xCE\xB1\xCD\x82"
+	"\xCE\xB9\xE1\xBD\xB4\xCE\xB9\xCE\xB7\xCE\xB9\xCE\xAE\xCE\xB9\xCE\xB7\xCD\x82\xCE\xB9\xE1\xBD\xBC\xCE"
+	"\xB9\xCF\x89\xCE\xB9\xCF\x8E\xCE\xB9\xCF\x89\xCD\x82\xCE\xB9"
+;
+const size_t CompressedStringDataLength = 19415;
+
+#define DECOMPOSE_INDEX1_SHIFT (12)
+#define DECOMPOSE_INDEX2_SHIFT (5)
+
+static const unicode_t DECOMPOSE_INDEX1_MASK = MAX_LEGAL_UNICODE;
+static const unicode_t DECOMPOSE_INDEX2_MASK = (1 << DECOMPOSE_INDEX1_SHIFT) - 1;
+static const unicode_t DECOMPOSE_DATA_MASK = (1 << DECOMPOSE_INDEX2_SHIFT) - 1;
+
+static const char* database_querydecomposition(unicode_t codepoint, const uint32_t* index1Array, const uint32_t* index2Array, const uint32_t* dataArray, uint8_t* length)
+{
+	uint32_t index;
+	uint32_t data;
+
+	index = index1Array[codepoint >> DECOMPOSE_INDEX1_SHIFT];
+	index = index2Array[index + ((codepoint & DECOMPOSE_INDEX2_MASK) >> DECOMPOSE_INDEX2_SHIFT)];
+	index = index + (codepoint & DECOMPOSE_DATA_MASK);
+
+	if (index == 0 ||
+		(data = dataArray[index]) == 0)
+	{
+		*length = 0;
+
+		return 0;
+	}
+
+	*length = (uint8_t)((data & 0xFF000000) >> 24);
+
+	return CompressedStringData + (data & 0x00FFFFFF);
+}
+
+static unicode_t database_querycomposition(unicode_t left, unicode_t right)
+{
+	uint64_t key = ((uint64_t)left << 32) + (uint64_t)right;
+	size_t offset_start = 0;
+	size_t offset_end = UnicodeCompositionRecordCount - 1;
+	size_t offset_pivot;
+	size_t i;
+
+	if (key < UnicodeCompositionRecordPtr[offset_start].key ||
+		key > UnicodeCompositionRecordPtr[offset_end].key)
+	{
+		return 0;
+	}
+
+	do
+	{
+		offset_pivot = offset_start + ((offset_end - offset_start) / 2);
+
+		if (key == UnicodeCompositionRecordPtr[offset_start].key)
+		{
+			return UnicodeCompositionRecordPtr[offset_start].value;
+		}
+		else if (key == UnicodeCompositionRecordPtr[offset_end].key)
+		{
+			return UnicodeCompositionRecordPtr[offset_end].value;
+		}
+		else if (key == UnicodeCompositionRecordPtr[offset_pivot].key)
+		{
+			return UnicodeCompositionRecordPtr[offset_pivot].value;
+		}
+		else
+		{
+			if (key > UnicodeCompositionRecordPtr[offset_pivot].key)
+			{
+				offset_start = offset_pivot;
+			}
+			else
+			{
+				offset_end = offset_pivot;
+			}
+		}
+	}
+	while (offset_end - offset_start > 32);
+
+	for (i = offset_start; i <= offset_end; ++i)
+	{
+		if (key == UnicodeCompositionRecordPtr[i].key)
+		{
+			return UnicodeCompositionRecordPtr[i].value;
+		}
+	}
+
+	return 0;
+}
+
+const uint8_t codepoint_decoded_length[256] = {
+	/* Basic Latin */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x00 - 0x07 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x08 - 0x0F */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x10 - 0x17 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x18 - 0x1F */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x20 - 0x27 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x28 - 0x2F */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x30 - 0x37 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x38 - 0x3F */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x47 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x48 - 0x4F */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x57 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x58 - 0x5F */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x67 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x68 - 0x6F */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x77 */
+	1, 1, 1, 1, 1, 1, 1, 1, /* 0x78 - 0x7F */
+
+	/* Malformed continuation byte */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x87 */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0x88 - 0x8F */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x97 */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0x98 - 0x9F */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xA7 */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0xA8 - 0xAF */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xB7 */
+	0, 0, 0, 0, 0, 0, 0, 0, /* 0xB8 - 0xBF */
+
+	/* Two bytes */
+	2, 2, 2, 2, 2, 2, 2, 2, /* 0xC0 - 0xC7 */
+	2, 2, 2, 2, 2, 2, 2, 2, /* 0xC8 - 0xCF */
+	2, 2, 2, 2, 2, 2, 2, 2, /* 0xD0 - 0xD7 */
+	2, 2, 2, 2, 2, 2, 2, 2, /* 0xD8 - 0xDF */
+
+	/* Three bytes */
+	3, 3, 3, 3, 3, 3, 3, 3, /* 0xE0 - 0xE7 */
+	3, 3, 3, 3, 3, 3, 3, 3, /* 0xE8 - 0xEF */
+
+	/* Four bytes */
+	4, 4, 4, 4, 4, 4, 4, 4, /* 0xF0 - 0xF7 */
+
+	/* Five bytes */
+	5, 5, 5, 5,             /* 0xF8 - 0xFB */
+
+	/* Six bytes */
+	6, 6,                   /* 0xFC - 0xFD */
+
+	/* Invalid */
+	7, 7                    /* 0xFE - 0xFF */
+};
+
+static uint8_t codepoint_write(unicode_t encoded, char** target, size_t* targetSize)
+{
+	uint8_t encoded_length;
+
+	/* Determine encoded length of code point */
+
+	if (encoded <= MAX_BASIC_LATIN)
+	{
+		encoded_length = 1;
+	}
+	else if (
+		encoded <= 0x7FF)
+	{
+		encoded_length = 2;
+	}
+	else if (
+		encoded <= MAX_BASIC_MULTILINGUAL_PLANE)
+	{
+		encoded_length = 3;
+	}
+	else if (
+		encoded > MAX_LEGAL_UNICODE)
+	{
+		encoded = REPLACEMENT_CHARACTER;
+		encoded_length = REPLACEMENT_CHARACTER_STRING_LENGTH;
+	}
+	else
+	{
+		encoded_length = 4;
+	}
+
+	/* Write to target */
+
+	if (*target != 0)
+	{
+		char* dst;
+
+		if (*targetSize < encoded_length)
+		{
+			return 0;
+		}
+
+		dst = *target;
+
+		switch (encoded_length)
+		{
+
+		case 1:
+			*dst++ = (char)encoded;
+			break;
+
+		case 2:
+			*dst++ = (char)(encoded >>   6)         | 0xC0;
+			*dst++ = (char)(encoded         & 0x3F) | 0x80;
+			break;
+
+		case 3:
+			*dst++ = (char)(encoded  >> 12)         | 0xE0;
+			*dst++ = (char)((encoded >>  6) & 0x3F) | 0x80;
+			*dst++ = (char)(encoded         & 0x3F) | 0x80;
+			break;
+
+		case 4:
+			*dst++ = (char)(encoded  >> 18)         | 0xF0;
+			*dst++ = (char)((encoded >> 12) & 0x3F) | 0x80;
+			*dst++ = (char)((encoded >>  6) & 0x3F) | 0x80;
+			*dst++ = (char)(encoded         & 0x3F) | 0x80;
+			break;
+
+		default:
+			break;
+
+		}
+
+		*target += encoded_length;
+		*targetSize -= encoded_length;
+	}
+
+	return encoded_length;
+}
+
+static uint8_t codepoint_read(const char* input, size_t inputSize, unicode_t* decoded)
+{
+	const uint8_t* src = (const uint8_t*)input;
+
+	if (input == 0 ||
+		inputSize == 0)
+	{
+		/* Invalid data */
+
+		return 0;
+	}
+
+	if (*src <= MAX_BASIC_LATIN)
+	{
+		/* Basic Latin */
+
+		*decoded = (unicode_t)*src;
+
+		return 1;
+	}
+	else
+	{
+		/* Multi-byte sequence */
+
+		static const uint8_t SequenceMask[7] = {
+			0x00, 0x7F, 0x1F, 0x0F,
+			0x07, 0x03, 0x01
+		};
+		static const unicode_t SequenceMinimum[7] = {
+			0x0000, 0x0000, 0x0080, 0x0800,
+			0x10000, MAX_LEGAL_UNICODE, MAX_LEGAL_UNICODE
+		};
+
+		size_t src_size = inputSize;
+		uint8_t src_index;
+
+		/* Length of sequence is determined by first byte */
+
+		uint8_t decoded_length = codepoint_decoded_length[*src];
+		if (decoded_length < 1 ||
+			decoded_length > 6)
+		{
+			/* Not a multi-byte sequence starter */
+
+			*decoded = REPLACEMENT_CHARACTER;
+			decoded_length = 1;
+		}
+		else if (decoded_length > 4)
+		{
+			/* Always an overlong sequence */
+
+			*decoded = REPLACEMENT_CHARACTER;
+
+			/* All bytes in the sequence must be processed */
+
+			for (src_index = 1; src_index < decoded_length; ++src_index)
+			{
+				src++;
+
+				/* Check if next byte is valid */
+
+				if (src_size == 0 ||               /* Not enough data */
+					(*src < 0x80 || *src > 0xBF))  /* Not a continuation byte */
+				{
+					return src_index;
+				}
+
+				src_size--;
+			}
+		}
+		else
+		{
+			/* Use mask to strip value from first byte */
+
+			*decoded = (unicode_t)(*src & SequenceMask[decoded_length]);
+
+			/* All bytes in the sequence must be processed */
+
+			for (src_index = 1; src_index < decoded_length; ++src_index)
+			{
+				src++;
+
+				/* Check if next byte is valid */
+
+				if (src_size == 0 ||               /* Not enough data */
+					(*src < 0x80 || *src > 0xBF))  /* Not a continuation byte */
+				{
+					*decoded = REPLACEMENT_CHARACTER;
+
+					return src_index;
+				}
+
+				src_size--;
+
+				/* Add value of continuation byte to codepoint */
+
+				*decoded = (*decoded << 6) | (*src & 0x3F);
+			}
+
+			/* Check for overlong sequences and surrogate pairs */
+
+			if (*decoded < SequenceMinimum[decoded_length] ||
+				*decoded > MAX_LEGAL_UNICODE ||
+				(*decoded >= SURROGATE_HIGH_START && *decoded <= SURROGATE_LOW_END))
+			{
+				*decoded = REPLACEMENT_CHARACTER;
+			}
+		}
+
+		return decoded_length;
+	}
+}
+
+static uint8_t stream_initialize(StreamState* state, const char* input, size_t inputSize)
+{
+	memset(state, 0, sizeof(StreamState));
+
+	if (input == 0 ||
+		inputSize == 0)
+	{
+		return 0;
+	}
+
+	state->src = input;
+	state->src_size = inputSize;
+
+	state->stable = 1;
+
+	return 1;
+}
+
+static uint8_t stream_read(StreamState* state, const size_t* propertyIndex, const uint8_t* propertyData)
+{
+	/* Ensure input is available */
+
+	if (state->src_size == 0 ||
+		propertyIndex == 0 ||
+		propertyData == 0)
+	{
+		return 0;
+	}
+
+	/* Reset sequence after the first pass */
+
+	if (state->filled > 0)
+	{
+		/* Check for end of data */
+
+		if (state->filled == state->current &&
+			state->src_size <= state->last_length)
+		{
+			state->src_size = 0;
+
+			state->index = 0;
+			state->current = 0;
+			state->filled = 0;
+
+			return 0;
+		}
+
+		/* Copy last peeked codepoint to new sequence */
+
+		state->codepoint[0]                  = state->codepoint[state->filled - 1];
+		state->canonical_combining_class[0]  = state->canonical_combining_class[state->filled - 1];
+		state->quick_check[0]                = state->quick_check[state->filled - 1];
+
+		/* New sequence always starts as stable */
+
+		state->stable = 1;
+
+		/* Reset buffer members */
+
+		state->index = 0;
+		state->current = 1;
+		state->filled = 1;
+	}
+
+	/* Read codepoints */
+
+	while (state->filled < STREAM_SAFE_MAX)
+	{
+		/* Move the input cursor after peeking */
+
+		if (state->last_length > 0)
+		{
+			if (state->src_size <= state->last_length)
+			{
+				state->src += state->src_size;
+				state->src_size = 0;
+
+				break;
+			}
+
+			state->src += state->last_length;
+			state->src_size -= state->last_length;
+		}
+
+		/* Peek the next codepoint */
+
+		state->last_length = codepoint_read(state->src, state->src_size, &state->codepoint[state->filled]);
+		state->quick_check[state->filled] = PROPERTY_GET(propertyIndex, propertyData, state->codepoint[state->filled]);
+		state->canonical_combining_class[state->filled] = PROPERTY_GET_CCC(state->codepoint[state->filled]);
+
+		state->filled++;
+
+		if (state->current > 0)
+		{
+			/* Sequences end on the next starter and can consist of only non-starters */
+
+			if (state->canonical_combining_class[state->current] == 0)
+			{
+				break;
+			}
+
+			/* Check if sequence is unstable by comparing canonical combining classes */
+
+			if (state->stable &&
+				state->canonical_combining_class[state->current] < state->canonical_combining_class[state->current - 1])
+			{
+				state->stable = 0;
+			}
+		}
+
+		state->current++;
+	}
+
+	if (state->filled == STREAM_SAFE_MAX)
+	{
+		/* Insert COMBINING GRAPHEME JOINER into output */
+
+		state->codepoint[state->filled]                  = CP_COMBINING_GRAPHEME_JOINER;
+		state->quick_check[state->filled]                = QuickCheckResult_Yes;
+		state->canonical_combining_class[state->filled]  = CCC_NOT_REORDERED;
+
+		state->filled++;
+	}
+
+	return 1;
+}
+
+
+static uint8_t stream_reorder(StreamState* state)
+{
+	uint8_t i;
+	uint8_t dirty = 1;
+
+	if (state->current == 0)
+	{
+		/* Nothing to do */
+
+		return 0;
+	}
+
+	/* Reorder codepoints until the entire sequence is table */
+
+	do
+	{
+		dirty = 0;
+
+		for (i = 1; i < state->current; i++)
+		{
+			/* Sort codepoints by canonical combining class, smallest to largest */
+
+			if (state->canonical_combining_class[i] < state->canonical_combining_class[i - 1])
+			{
+				unicode_t swap_cp;
+				uint8_t swap_qc;
+				uint8_t swap_ccc;
+
+				swap_cp = state->codepoint[i];
+				state->codepoint[i] = state->codepoint[i - 1];
+				state->codepoint[i - 1] = swap_cp;
+
+				swap_qc = state->quick_check[i];
+				state->quick_check[i] = state->quick_check[i - 1];
+				state->quick_check[i - 1] = swap_qc;
+
+				swap_ccc = state->canonical_combining_class[i];
+				state->canonical_combining_class[i] = state->canonical_combining_class[i - 1];
+				state->canonical_combining_class[i - 1] = swap_ccc;
+
+				dirty = 1;
+			}
+		}
+	}
+	while (dirty == 1);
+
+	return 1;
+}
+
+static uint8_t compose_initialize(ComposeState* state, StreamState* input, StreamState* output, uint8_t compatibility)
+{
+	memset(state, 0, sizeof(ComposeState));
+
+	/* Ensure streams are valid */
+
+	if (input == 0 ||
+		output == 0)
+	{
+		return 0;
+	}
+
+	/* Set up streams */
+
+	state->input = input;
+
+	state->output = output;
+	memset(state->output, 0, sizeof(StreamState));
+
+	/* Set up codepoint quickcheck property */
+
+	if (compatibility == 1)
+	{
+		state->qc_index = QuickCheckNFKCIndexPtr;
+		state->qc_data = QuickCheckNFKCDataPtr;
+	}
+	else
+	{
+		state->qc_index = QuickCheckNFCIndexPtr;
+		state->qc_data = QuickCheckNFCDataPtr;
+	}
+
+	return 1;
+}
+
+static uint8_t compose_readcodepoint(ComposeState* state, uint8_t index)
+{
+	if (state->input->index == state->input->current &&
+		!stream_read(state->input, state->qc_index, state->qc_data))
+	{
+		/* End of data */
+
+		return 0;
+	}
+
+	/* Get next codepoint from sequence */
+
+	state->output->codepoint[index]                  = state->input->codepoint[state->input->index];
+	state->output->quick_check[index]                = state->input->quick_check[state->input->index];
+	state->output->canonical_combining_class[index]  = state->input->canonical_combining_class[state->input->index];
+
+	state->input->index++;
+	state->output->current++;
+
+	return 1;
+}
+
+static uint8_t compose_execute(ComposeState* state)
+{
+	uint8_t output_index;
+	uint8_t cursor_current;
+	uint8_t cursor_next;
+
+	/* Check if input is available */
+
+	if (state->input == 0)
+	{
+		return 0;
+	}
+
+	/* Reset output */
+
+	state->output->current = 0;
+
+	/* Read first codepoint */
+
+	if (!compose_readcodepoint(state, 0))
+	{
+		return 0;
+	}
+
+	for (output_index = 0; output_index < state->output->current; ++output_index)
+	{
+		/* Ensure current codepoint is a starter */
+
+		cursor_current = output_index;
+
+		while (state->output->canonical_combining_class[cursor_current] != CCC_NOT_REORDERED)
+		{
+			cursor_current++;
+
+			if (cursor_current == state->output->current &&
+				!compose_readcodepoint(state, cursor_current))
+			{
+				/* Only non-starters left */
+
+				return 1;
+			}
+		}
+
+		/* Get next codepoint */
+
+		cursor_next = cursor_current + 1;
+
+		while (
+			cursor_next < state->output->current ||
+			compose_readcodepoint(state, cursor_next))
+		{
+			/*
+				Two codepoints can be composed if the current codepoint is a starter
+				and the next codepoint isn't blocked by a previous codepoint.
+			*/
+
+			if (state->output->canonical_combining_class[cursor_next] > state->output->canonical_combining_class[cursor_next - 1] || /* Can be composed based on CCC */
+				/* Quick check value can override composition block by previous codepoint */
+				(state->output->quick_check[cursor_next] != QuickCheckResult_Yes && state->output->canonical_combining_class[cursor_next - 1] == CCC_NOT_REORDERED))
+			{
+				unicode_t composed = 0;
+
+				/*
+					Hangul composition
+
+					Algorithm adapted from Unicode Technical Report #15:
+					http://www.unicode.org/reports/tr15/tr15-18.html#Hangul
+				*/
+
+				if (state->output->codepoint[cursor_current] >= HANGUL_L_FIRST &&
+					state->output->codepoint[cursor_current] <= HANGUL_L_LAST)
+				{
+					/* Check for Hangul LV pair */ 
+
+					if (state->output->codepoint[cursor_next] >= HANGUL_V_FIRST &&
+						state->output->codepoint[cursor_next] <= HANGUL_V_LAST)
+					{
+						unicode_t l_index = state->output->codepoint[cursor_current] - HANGUL_L_FIRST;
+						unicode_t v_index = state->output->codepoint[cursor_next] - HANGUL_V_FIRST;
+
+						composed = HANGUL_S_FIRST + (((l_index * HANGUL_V_COUNT) + v_index) * HANGUL_T_COUNT);
+					}
+				}
+				else if (
+					state->output->codepoint[cursor_current] >= HANGUL_S_FIRST &&
+					state->output->codepoint[cursor_current] <= HANGUL_S_LAST)
+				{
+					/* Check for Hangul LV and T pair */ 
+
+					if (state->output->codepoint[cursor_next] >= HANGUL_T_FIRST &&
+						state->output->codepoint[cursor_next] <= HANGUL_T_LAST)
+					{
+						unicode_t t_index = state->output->codepoint[cursor_next] - HANGUL_T_FIRST;
+
+						composed = state->output->codepoint[cursor_current] + t_index;
+					}
+				}
+				else
+				{
+					/* Attempt to compose codepoints using the database */
+
+					composed = database_querycomposition(
+						state->output->codepoint[cursor_current],
+						state->output->codepoint[cursor_next]);
+				}
+
+				/* Check if composition succeeded */
+
+				if (composed != 0)
+				{
+					/*
+						When we successfully compose two codepoints, the second must be removed
+						from the sequence. The way this is accomplished is by marking the cell
+						empty with a NUL codepoint.
+
+						Decomposed:
+
+						codepoint   U+0044 U+0307 U+0031
+						    index        0      1      2
+
+						Composed:
+
+						codepoint   U+1E0A U+0000 U+0031
+						    index        0      1      2
+
+						If the second codepoint was at the end of the sequence, the output 
+						sequence is shortened by one.
+					*/
+
+					/* Add composition to output */
+
+					state->output->codepoint[cursor_current]                  = composed;
+					state->output->quick_check[cursor_current]                = PROPERTY_GET(state->qc_index, state->qc_data, composed);
+					state->output->canonical_combining_class[cursor_current]  = PROPERTY_GET_CCC(composed);
+
+					/* Clear next codepoint from output */
+
+					state->output->codepoint[cursor_next]                  = 0;
+					state->output->quick_check[cursor_next]                = QuickCheckResult_Yes;
+					state->output->canonical_combining_class[cursor_next]  = CCC_NOT_REORDERED;
+
+					if (cursor_next == state->output->current - 1)
+					{
+						/* Next codepoint was at end of output */
+
+						state->output->current--;
+					}
+
+					/* Reset cursor to current output index */
+
+					cursor_current = output_index;
+					cursor_next = output_index;
+				}
+			}
+			else if (
+				state->output->canonical_combining_class[cursor_next] == CCC_NOT_REORDERED)
+			{
+				/* Attempt to compose starters, but do not read from the next sequence */
+
+				break;
+			}
+
+			/* Evaluate next codepoint */
+
+			cursor_next++;
+		}
+
+		/* Fill up "holes" left by composing codepoints not at the end of the sequence */
+
+		if (state->output->current > 1)
+		{
+			uint8_t write_index = 0;
+			uint8_t read_index = 1;
+
+			/*
+				We want to move valid codepoints to the left as much as possible in order to fill up
+				holes left by the composition process. 
+
+				Note that the process does not clear unused codepoints at the end, this is a small
+				optimization in order to avoid unnecessary clears. The length member is adjusted to
+				the new size.
+				
+				Before reordering:
+
+				codepoint   A  B  0  0  0  D
+				    index   0  1  2  3  4  5
+				   length                  6
+
+				After reordering:
+
+				codepoint   A  B  D  0  0  D
+				    index   0  1  2  3  4  5
+				   length         3
+			*/
+
+			/* Evaluate all codepoints in output sequence */
+
+			while (write_index < state->output->current)
+			{
+				/* Check if read cursor is on an empty cell */
+
+				if (read_index < state->output->current &&
+					state->output->codepoint[read_index] == 0)
+				{
+					/* Skip all empty cells */
+
+					while (
+						read_index < state->output->current &&
+						state->output->codepoint[read_index] == 0)
+					{
+						read_index++;
+					}
+
+					if (read_index == state->output->current)
+					{
+						/* Reached end of data */
+
+						break;
+					}
+
+					/* Copy cell at read cursor to write cursor */
+
+					state->output->codepoint[write_index]                  = state->output->codepoint[read_index];
+					state->output->quick_check[write_index]                = state->output->quick_check[read_index];
+					state->output->canonical_combining_class[write_index]  = state->output->canonical_combining_class[read_index];
+				}
+
+				/* Move cursors */
+
+				write_index++;
+				read_index++;
+			}
+
+			/* Adjust length of output sequence */
+
+			state->output->current = write_index;
+		}
+		else
+		{
+			/* Evaluated all sequences in output */
+
+			state->input = 0;
+
+			break;
+		}
+	}
+
+	return 1;
+}
+
+
+static uint8_t decompose_initialize(
+	DecomposeState* state,
+	StreamState* input, StreamState* output,
+	uint8_t compatibility)
+{
+	memset(state, 0, sizeof(DecomposeState));
+
+	/* Ensure streams are valid */
+
+	if (input == 0 ||
+		output == 0)
+	{
+		return 0;
+	}
+
+	/* Set up streams */
+
+	state->input = input;
+
+	state->output = output;
+	memset(state->output, 0, sizeof(StreamState));
+
+	/* Set up codepoint quickcheck property */
+
+	if (compatibility == 1)
+	{
+		state->property_index1 = NFKDIndex1Ptr;
+		state->property_index2 = NFKDIndex2Ptr;
+		state->property_data = NFKDDataPtr;
+
+		state->qc_index = QuickCheckNFKDIndexPtr;
+		state->qc_data = QuickCheckNFKDDataPtr;
+	}
+	else
+	{
+		state->property_index1 = NFDIndex1Ptr;
+		state->property_index2 = NFDIndex2Ptr;
+		state->property_data = NFDDataPtr;
+
+		state->qc_index = QuickCheckNFDIndexPtr;
+		state->qc_data = QuickCheckNFDDataPtr;
+	}
+
+	return 1;
+}
+
+static uint8_t decompose_execute(DecomposeState* state)
+{
+	unicode_t* src_codepoint;
+	unicode_t* dst_codepoint;
+	uint8_t* dst_canonical_combining_class;
+	uint8_t* dst_quick_check;
+	uint8_t uncached = 1;
+
+	/* Check if input is valid */
+
+	if (state->input == 0)
+	{
+		return 0;
+	}
+
+	/* Set up output */
+
+	state->output->current = 0;
+	state->output->index = 0;
+	state->output->stable = 1;
+
+	dst_codepoint = state->output->codepoint;
+	dst_canonical_combining_class = state->output->canonical_combining_class;
+	dst_quick_check = state->output->quick_check;
+
+	/* Check cache for stored sequences */
+
+	if (state->cache_current < state->cache_filled)
+	{
+		/* Read from cache */
+
+		while (state->cache_current < state->cache_filled)
+		{
+			if (state->output->current > 0 &&
+				state->cache_canonical_combining_class[state->cache_current] == CCC_NOT_REORDERED)
+			{
+				/* Sequence ends on next non-starter or end of data */
+
+				break;
+			}
+
+			*dst_codepoint++ = state->cache_codepoint[state->cache_current];
+			*dst_canonical_combining_class++ = state->cache_canonical_combining_class[state->cache_current];
+			*dst_quick_check++ = QuickCheckResult_Yes;
+
+			state->output->current++;
+			state->cache_current++;
+		}
+
+		/* Check if cache has been emptied */
+
+		if (state->cache_current == state->cache_filled)
+		{
+			state->cache_current = 0;
+			state->cache_filled = 0;
+		}
+
+		/* Check for additional input */
+
+		if (state->input->index == state->input->current)
+		{
+			/* Don't compare canonical combining classes, output will always be stable */
+
+			return state->output->current;
+		}
+	}
+
+	/* Read next sequence from input */
+
+	if (state->input->index == state->input->current &&
+		!stream_read(state->input, state->qc_index, state->qc_data))
+	{
+		/* End of data */
+
+		state->input = 0;
+
+		return 0;
+	}
+
+	/* Read from source */
+
+	src_codepoint = state->input->codepoint + state->input->index;
+
+	while (state->input->index < state->input->current)
+	{
+		if (*src_codepoint <= MAX_BASIC_LATIN)
+		{
+			/* Basic Latin codepoints are already decomposed */
+
+			if (uncached)
+			{
+				*dst_codepoint++ = *src_codepoint;
+				*dst_canonical_combining_class++ = CCC_NOT_REORDERED;
+				*dst_quick_check++ = QuickCheckResult_Yes;
+
+				state->output->current++;
+			}
+			else
+			{
+				state->cache_codepoint[state->cache_filled] = *src_codepoint;
+				state->cache_canonical_combining_class[state->cache_filled] = CCC_NOT_REORDERED;
+
+				state->cache_filled++;
+			}
+		}
+		else if (
+			*src_codepoint >= HANGUL_S_FIRST &&
+			*src_codepoint <= HANGUL_S_LAST)
+		{
+			/*
+				Hangul decomposition
+
+				Algorithm adapted from Unicode Technical Report #15:
+				http://www.unicode.org/reports/tr15/tr15-18.html#Hangul
+			*/
+
+			unicode_t s_index = *src_codepoint - HANGUL_S_FIRST;
+
+			if (uncached)
+			{
+				*dst_codepoint++ = HANGUL_L_FIRST + (s_index / HANGUL_N_COUNT);
+				*dst_canonical_combining_class++ = CCC_NOT_REORDERED;
+				*dst_quick_check++ = QuickCheckResult_Yes;
+
+				state->output->current++;
+			}
+			else
+			{
+				state->cache_codepoint[state->cache_filled] = HANGUL_L_FIRST + (s_index / HANGUL_N_COUNT);
+				state->cache_canonical_combining_class[state->cache_filled] = CCC_NOT_REORDERED;
+
+				state->cache_filled++;
+			}
+
+			/* Store subsequent non-starters in cache */
+
+			uncached = 0;
+
+			state->cache_codepoint[state->cache_filled] = HANGUL_V_FIRST + (s_index % HANGUL_N_COUNT) / HANGUL_T_COUNT;
+			state->cache_canonical_combining_class[state->cache_filled] = CCC_NOT_REORDERED;
+
+			state->cache_filled++;
+
+			if ((s_index % HANGUL_T_COUNT) != 0)
+			{
+				state->cache_codepoint[state->cache_filled] = HANGUL_T_FIRST + (s_index % HANGUL_T_COUNT);
+				state->cache_canonical_combining_class[state->cache_filled] = CCC_NOT_REORDERED;
+
+				state->cache_filled++;
+			}
+		}
+		else
+		{
+			/* Use quick check to skip stable codepoints */
+
+			unicode_t decoded_codepoint = *src_codepoint;
+			uint8_t decoded_quick_check = PROPERTY_GET(state->qc_index, state->qc_data, decoded_codepoint);
+			uint8_t decoded_canonical_combining_class;
+			uint8_t decoded_size;
+
+			if (decoded_quick_check != QuickCheckResult_Yes)
+			{
+				/* Check database for decomposition */
+
+				uint8_t src_size;
+				const char* src = database_querydecomposition(
+					decoded_codepoint,
+					state->property_index1, state->property_index2, state->property_data,
+					&src_size);
+
+				while (src_size > 0)
+				{
+					/* Decode current codepoint */
+
+					decoded_size = codepoint_read(src, src_size, &decoded_codepoint);
+					if (decoded_size == 0)
+					{
+						break;
+					}
+
+					decoded_canonical_combining_class = PROPERTY_GET_CCC(decoded_codepoint);
+
+					/* Check for end of sequence */
+
+					if (uncached &&
+						state->output->current > 0 &&
+						decoded_canonical_combining_class == CCC_NOT_REORDERED)
+					{
+						uncached = 0;
+					}
+
+					if (uncached)
+					{
+						/* Write codepoint to output */
+
+						*dst_codepoint++ = decoded_codepoint;
+						*dst_canonical_combining_class++ = decoded_canonical_combining_class;
+						*dst_quick_check++ = QuickCheckResult_Yes;
+
+						state->output->current++;
+					}
+					else
+					{
+						/* Store in cache */
+
+						state->cache_codepoint[state->cache_filled] = decoded_codepoint;
+						state->cache_canonical_combining_class[state->cache_filled] = decoded_canonical_combining_class;
+
+						state->cache_filled++;
+					}
+
+					src += decoded_size;
+					src_size -= decoded_size;
+				}
+			}
+			else
+			{
+				decoded_canonical_combining_class = PROPERTY_GET_CCC(decoded_codepoint);
+
+				if (uncached)
+				{
+					/* Write codepoint to output */
+
+					*dst_codepoint++ = decoded_codepoint;
+					*dst_canonical_combining_class++ = decoded_canonical_combining_class;
+					*dst_quick_check++ = decoded_quick_check;
+
+					state->output->current++;
+				}
+				else
+				{
+					/* Store in cache */
+
+					state->cache_codepoint[state->cache_filled] = decoded_codepoint;
+					state->cache_canonical_combining_class[state->cache_filled] = decoded_canonical_combining_class;
+
+					state->cache_filled++;
+				}
+			}
+		}
+
+		src_codepoint++;
+		state->input->index++;
+	}
+
+	if (state->output->current > 1)
+	{
+		/* Check if output is stable by comparing canonical combining classes */
+
+		uint8_t i;
+		for (i = 1; i < state->output->current; ++i)
+		{
+			if (state->output->canonical_combining_class[i] < state->output->canonical_combining_class[i - 1])
+			{
+				state->output->stable = 0;
+
+				break;
+			}
+		}
+	}
+
+	return state->output->current;
+}
+
+/**
+   Given a utf8 string, input, 
+
+*/
+
+/*
+   Convert a utf8 string to NFC form.
+   Resulting string is stored in outputp.
+   Caller must free unless this function returns
+   an error.
+*/
+int
+nc_utf8normalize(const unsigned char* input, unsigned char** outputp)
+{
+    int status = UTF8_ERR_NONE;
+    size_t inputsize;
+    char* target = NULL;
+    char* dst = NULL;
+    size_t dst_size, inputSize, targetSize;
+    StreamState stream[4];
+    DecomposeState decompose_state;
+    ComposeState compose_state;
+    StreamState* stream_output;
+    uint8_t finished = 0;
+    size_t bytes_written = 0;
+    size_t flags = UTF8_NORMALIZE_COMPOSE | UTF8_NORMALIZE_COMPATIBILITY;
+    uint8_t compatibility = 1;
+
+    /* The target cannot be more than 3 times the size of the input */
+    inputSize = strlen(input);
+    targetSize = 3 * inputSize;
+    target = (unsigned char*)malloc(dst_size + 1); /* +1 for nul term */
+    if(target == NULL)
+	{status = UTF8_ERR_NOT_ENOUGH_SPACE; goto done;}
+
+    dst = target;
+    dst_size = targetSize;
+
+    /*
+        Decomposition uses the following process:
+
+        input         -->  stream[0]  -->
+        (decompose)   -->  stream[1]  -->
+        (accumulate)  -->  stream[2]  -->
+        output
+
+        The accumulation step is necessary in order to prevent buffer overflow
+        attacks.
+
+        Composition adds another stream buffer:
+
+        input         --> stream[0]  -->
+        (decompose)   --> stream[1]  -->
+        (accumulate)  --> stream[2]  -->
+        (compose)     --> stream[3]  -->
+        output
+
+        Although four streaming buffers may seem excessive, they are necessary
+        for preventing allocations on the heap.
+    */
+
+    /* Validate parameters */
+
+    /* Initialize decomposition */
+    memset(stream, 0, sizeof(stream));
+    if (!stream_initialize(&stream[0], input, inputSize) ||
+        !decompose_initialize(&decompose_state, &stream[0], &stream[1], compatibility))
+    {
+        status = UTF8_ERR_INVALID_DATA;
+	goto done;
+    }
+
+    stream_output = &stream[2];
+
+    {
+        /* Initialize composition */
+        if (!compose_initialize(&compose_state, &stream[2], &stream[3], compatibility))
+        {
+            status = UTF8_ERR_INVALID_DATA;
+	    goto done;
+        }
+        stream_output = &stream[3];
+    }
+
+    do
+    {
+        uint8_t write = 0;
+        /* Accumulate decomposed input in next stream */
+        if (stream[1].current > 0)
+        {
+            unicode_t* src_codepoint = stream[1].codepoint;
+            unicode_t* dst_codepoint = stream[2].codepoint + stream[2].filled;
+            uint8_t* src_qc = stream[1].quick_check;
+            uint8_t* dst_qc = stream[2].quick_check + stream[2].filled;
+            uint8_t* src_ccc = stream[1].canonical_combining_class;
+            uint8_t* dst_ccc = stream[2].canonical_combining_class + stream[2].filled;
+            {
+                uint8_t i;
+                /* Update stream properties to use composition values */
+                for (i = 0; i < stream[1].current; ++i)
+                {
+                    *dst_qc++ = PROPERTY_GET(compose_state.qc_index, compose_state.qc_data, *src_codepoint);
+                    *dst_ccc++ = *src_ccc++;
+                    *dst_codepoint++ = *src_codepoint++;
+                }
+            }
+            stream[2].current += stream[1].current;
+            stream[2].filled += stream[1].current;
+        }
+
+        /* Decompose input sequence into next stream */
+        finished = !decompose_execute(&decompose_state);
+        if (!finished)
+        {
+            /* Output current stream it it could overflow accumulation buffer */
+            write = (stream[1].current + stream[2].filled) >= STREAM_SAFE_MAX;
+        }
+
+        /* Reorder potentially unordered decomposed stream */
+        if (!stream[1].stable)
+        {
+            stream_reorder(&stream[1]);
+        }
+
+        /* Write stream to output when overflowing or when accumulation buffer is empty*/
+        if (write || finished)
+        {
+            uint8_t i;
+            /* Compose accumulation buffer */
+            if (!compose_execute(&compose_state))
+                break;
+
+            /* Write to output buffer */
+            for (i = 0; i < stream_output->current; ++i)
+            {
+                uint8_t encoded_size = codepoint_write(stream_output->codepoint[i], &dst, &dst_size);
+                if (encoded_size == 0)
+                {
+                    status = UTF8_ERR_NOT_ENOUGH_SPACE;
+                    goto done;
+                }
+                bytes_written += encoded_size;
+            }
+
+            /* Reset accumulation buffer */
+            stream[2].current = 0;
+            stream[2].filled = 0;
+        }
+    } while (!finished);
+done:
+    if(status) {
+	if(target != NULL) free(target);
+    } else {
+        if(outputp) *outputp = (unsigned char*)target;
+    }
+    return status;
+}
+
diff --git a/libdispatch/u8.h b/libdispatch/u8.h
new file mode 100644
index 0000000..29f4e56
--- /dev/null
+++ b/libdispatch/u8.h
@@ -0,0 +1,718 @@
+/*
+	Copyright (C) 2014-2016 Quinten Lansu
+
+	Permission is hereby granted, free of charge, to any person
+	obtaining a copy of this software and associated documentation
+	files (the "Software"), to deal in the Software without
+	restriction, including without limitation the rights to use,
+	copy, modify, merge, publish, distribute, sublicense, and/or
+	sell copies of the Software, and to permit persons to whom the
+	Software is furnished to do so, subject to the following
+	conditions:
+
+	The above copyright notice and this permission notice shall be
+	included in all copies or substantial portions of the Software.
+
+	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+	OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+	NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+	HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+	WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+	OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* This is the concatenation of
+
+base.h casemapping.h codepoint.h database.h streaming.h
+composition.h decomposition.h unicodedatabase.h utf8rewind.h
+(order is important)
+
+with some modifications to simplify
+*/
+
+#ifndef U8_H
+#define U8_H 1
+
+#ifndef _UTF8REWIND_H_
+#define _UTF8REWIND_H_
+
+
+
+
+#define UTF8_VERSION_MAKE(_major, _minor, _bugfix) \
+	((_major) * 10000) + ((_minor) * 100) + (_bugfix)
+
+#define UTF8_VERSION_MAJOR   1
+
+#define UTF8_VERSION_MINOR   5
+
+#define UTF8_VERSION_BUGFIX  1
+
+#define UTF8_VERSION \
+	UTF8_VERSION_MAKE(UTF8_VERSION_MAJOR, UTF8_VERSION_MINOR, UTF8_VERSION_BUGFIX)
+
+#define UTF8_VERSION_STRING  "1.5.1"
+
+#define UTF8_VERSION_GUARD(_major, _minor, _bugfix) \
+	(UTF8_VERSION >= UTF8_VERSION_MAKE(_major, _minor, _bugfix))
+
+
+
+#define UTF8_ERR_NONE                           (0)
+
+#define UTF8_ERR_INVALID_DATA                   (-1)
+
+#define UTF8_ERR_INVALID_FLAG                   (-2)
+
+#define UTF8_ERR_NOT_ENOUGH_SPACE               (-3)
+
+#define UTF8_ERR_OVERLAPPING_PARAMETERS         (-4)
+
+#define UTF8_ERR_INVALID_LOCALE                 (-5)
+
+
+
+#define UTF8_LOCALE_DEFAULT                     0
+
+#define UTF8_LOCALE_LITHUANIAN                  1
+
+#define UTF8_LOCALE_TURKISH_AND_AZERI_LATIN     2
+
+#define UTF8_LOCALE_MAXIMUM                     3
+
+
+
+#define UTF8_NORMALIZE_COMPOSE                  0x00000001
+
+#define UTF8_NORMALIZE_DECOMPOSE                0x00000002
+
+#define UTF8_NORMALIZE_COMPATIBILITY            0x00000004
+
+#define UTF8_NORMALIZATION_RESULT_YES           (0)
+
+#define UTF8_NORMALIZATION_RESULT_MAYBE         (1)
+
+#define UTF8_NORMALIZATION_RESULT_NO            (2)
+
+
+
+#define UTF8_CATEGORY_LETTER_UPPERCASE          0x00000001
+
+#define UTF8_CATEGORY_LETTER_LOWERCASE          0x00000002
+
+#define UTF8_CATEGORY_LETTER_TITLECASE          0x00000004
+
+#define UTF8_CATEGORY_LETTER_MODIFIER           0x00000008
+
+#define UTF8_CATEGORY_LETTER_OTHER              0x00000010
+
+#define UTF8_CATEGORY_LETTER \
+	(UTF8_CATEGORY_LETTER_UPPERCASE | UTF8_CATEGORY_LETTER_LOWERCASE | \
+	UTF8_CATEGORY_LETTER_TITLECASE | UTF8_CATEGORY_LETTER_MODIFIER | \
+	UTF8_CATEGORY_LETTER_OTHER)
+
+#define UTF8_CATEGORY_CASE_MAPPED \
+	(UTF8_CATEGORY_LETTER_UPPERCASE | UTF8_CATEGORY_LETTER_LOWERCASE | \
+	UTF8_CATEGORY_LETTER_TITLECASE)
+
+#define UTF8_CATEGORY_MARK_NON_SPACING          0x00000020
+
+#define UTF8_CATEGORY_MARK_SPACING              0x00000040
+
+#define UTF8_CATEGORY_MARK_ENCLOSING            0x00000080
+
+#define UTF8_CATEGORY_MARK \
+	(UTF8_CATEGORY_MARK_NON_SPACING | UTF8_CATEGORY_MARK_SPACING | \
+	UTF8_CATEGORY_MARK_ENCLOSING)
+
+#define UTF8_CATEGORY_NUMBER_DECIMAL            0x00000100
+
+#define UTF8_CATEGORY_NUMBER_LETTER             0x00000200
+
+#define UTF8_CATEGORY_NUMBER_OTHER              0x00000400
+
+#define UTF8_CATEGORY_NUMBER \
+	(UTF8_CATEGORY_NUMBER_DECIMAL | UTF8_CATEGORY_NUMBER_LETTER | \
+	UTF8_CATEGORY_NUMBER_OTHER)
+
+#define UTF8_CATEGORY_PUNCTUATION_CONNECTOR     0x00000800
+
+#define UTF8_CATEGORY_PUNCTUATION_DASH          0x00001000
+
+#define UTF8_CATEGORY_PUNCTUATION_OPEN          0x00002000
+
+#define UTF8_CATEGORY_PUNCTUATION_CLOSE         0x00004000
+
+#define UTF8_CATEGORY_PUNCTUATION_INITIAL       0x00008000
+
+#define UTF8_CATEGORY_PUNCTUATION_FINAL         0x00010000
+
+#define UTF8_CATEGORY_PUNCTUATION_OTHER         0x00020000
+
+#define UTF8_CATEGORY_PUNCTUATION \
+	(UTF8_CATEGORY_PUNCTUATION_CONNECTOR | UTF8_CATEGORY_PUNCTUATION_DASH | \
+	UTF8_CATEGORY_PUNCTUATION_OPEN | UTF8_CATEGORY_PUNCTUATION_CLOSE | \
+	UTF8_CATEGORY_PUNCTUATION_INITIAL | UTF8_CATEGORY_PUNCTUATION_FINAL | \
+	UTF8_CATEGORY_PUNCTUATION_OTHER)
+
+#define UTF8_CATEGORY_SYMBOL_MATH               0x00040000
+
+#define UTF8_CATEGORY_SYMBOL_CURRENCY           0x00080000
+
+#define UTF8_CATEGORY_SYMBOL_MODIFIER           0x00100000
+
+#define UTF8_CATEGORY_SYMBOL_OTHER              0x00200000
+
+#define UTF8_CATEGORY_SYMBOL \
+	(UTF8_CATEGORY_SYMBOL_MATH | UTF8_CATEGORY_SYMBOL_CURRENCY | \
+	UTF8_CATEGORY_SYMBOL_MODIFIER | UTF8_CATEGORY_SYMBOL_OTHER)
+
+#define UTF8_CATEGORY_SEPARATOR_SPACE           0x00400000
+
+#define UTF8_CATEGORY_SEPARATOR_LINE            0x00800000
+
+#define UTF8_CATEGORY_SEPARATOR_PARAGRAPH       0x01000000
+
+#define UTF8_CATEGORY_SEPARATOR \
+	(UTF8_CATEGORY_SEPARATOR_SPACE | UTF8_CATEGORY_SEPARATOR_LINE | \
+	UTF8_CATEGORY_SEPARATOR_PARAGRAPH)
+
+#define UTF8_CATEGORY_CONTROL                   0x02000000
+
+#define UTF8_CATEGORY_FORMAT                    0x04000000
+
+#define UTF8_CATEGORY_SURROGATE                 0x08000000
+
+#define UTF8_CATEGORY_PRIVATE_USE               0x10000000
+
+#define UTF8_CATEGORY_UNASSIGNED                0x20000000
+
+#define UTF8_CATEGORY_COMPATIBILITY             0x40000000
+
+#define UTF8_CATEGORY_IGNORE_GRAPHEME_CLUSTER   0x80000000
+
+#define UTF8_CATEGORY_ISCNTRL \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_CONTROL)
+
+#define UTF8_CATEGORY_ISPRINT \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_LETTER | UTF8_CATEGORY_NUMBER | \
+	UTF8_CATEGORY_PUNCTUATION | UTF8_CATEGORY_SYMBOL | \
+	UTF8_CATEGORY_SEPARATOR)
+
+#define UTF8_CATEGORY_ISSPACE \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_SEPARATOR_SPACE)
+
+#define UTF8_CATEGORY_ISBLANK \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_SEPARATOR_SPACE | UTF8_CATEGORY_PRIVATE_USE)
+
+#define UTF8_CATEGORY_ISGRAPH \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_LETTER | UTF8_CATEGORY_NUMBER | \
+	UTF8_CATEGORY_PUNCTUATION | UTF8_CATEGORY_SYMBOL)
+
+#define UTF8_CATEGORY_ISPUNCT \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_PUNCTUATION | UTF8_CATEGORY_SYMBOL)
+
+#define UTF8_CATEGORY_ISALNUM \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_LETTER | UTF8_CATEGORY_NUMBER)
+
+#define UTF8_CATEGORY_ISALPHA \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_LETTER)
+
+#define UTF8_CATEGORY_ISUPPER \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_LETTER_UPPERCASE)
+
+#define UTF8_CATEGORY_ISLOWER \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_LETTER_LOWERCASE)
+
+#define UTF8_CATEGORY_ISDIGIT \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_NUMBER)
+
+#define UTF8_CATEGORY_ISXDIGIT \
+	(UTF8_CATEGORY_COMPATIBILITY | \
+	UTF8_CATEGORY_NUMBER | UTF8_CATEGORY_PRIVATE_USE)
+
+
+
+
+#ifndef UTF8_WCHAR_SIZE
+	#if (__SIZEOF_WCHAR_T__ == 4) || (WCHAR_MAX > UINT16_MAX) || (__WCHAR_MAX__ > UINT16_MAX)
+		#define UTF8_WCHAR_SIZE (4)
+	#else
+		#define UTF8_WCHAR_SIZE (2)
+	#endif
+#endif
+
+#if (UTF8_WCHAR_SIZE == 4)
+	
+	#define UTF8_WCHAR_UTF32 (1)
+#elif (UTF8_WCHAR_SIZE == 2)
+	
+	#define UTF8_WCHAR_UTF16 (1)
+#else
+	#error Invalid size for wchar_t type.
+#endif
+
+#ifndef UTF8_API
+	#ifdef __cplusplus
+		#define UTF8_API extern "C"
+	#else
+		#define UTF8_API
+	#endif
+#endif
+
+typedef int int32_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+
+typedef uint16_t utf16_t;
+typedef uint32_t unicode_t;
+
+#endif /* _UTF8REWIND_H_ */
+
+
+#ifndef _UTF8REWIND_INTERNAL_BASE_H_
+#define _UTF8REWIND_INTERNAL_BASE_H_
+
+
+
+
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+	#define UTF8_UNUSED(_parameter) _parameter __attribute__ ((unused))
+#else
+	#define UTF8_UNUSED(_parameter) _parameter
+#endif
+
+#define UTF8_SET_ERROR(_error) \
+	if (errors != 0) { *errors = UTF8_ERR_ ## _error; }
+
+/* Validates input before transforming */
+/* Check for parameter overlap using the separating axis theorem */
+
+#define UTF8_VALIDATE_PARAMETERS_CHAR(_inputType, _result) \
+	if (input == 0) { \
+		UTF8_SET_ERROR(INVALID_DATA); \
+		return _result; \
+	} \
+	else if (inputSize < sizeof(_inputType)) { \
+		if (target != 0) { \
+			if (targetSize < 3) { \
+				UTF8_SET_ERROR(NOT_ENOUGH_SPACE); \
+				return _result; \
+			} \
+			memcpy(target, REPLACEMENT_CHARACTER_STRING, REPLACEMENT_CHARACTER_STRING_LENGTH); \
+		} \
+		UTF8_SET_ERROR(INVALID_DATA); \
+		return _result + REPLACEMENT_CHARACTER_STRING_LENGTH; \
+	} \
+	if (target != 0 && targetSize == 0) { \
+		UTF8_SET_ERROR(NOT_ENOUGH_SPACE); \
+		return _result; \
+	} \
+	if ((char*)input == target) { \
+		UTF8_SET_ERROR(OVERLAPPING_PARAMETERS); \
+		return _result; \
+	} \
+	{ \
+		char* input_center = (char*)input + (inputSize / 2); \
+		char* target_center = target + (targetSize / 2); \
+		size_t delta = (size_t)((input_center > target_center) ? (input_center - target_center) : (target_center - input_center)); \
+		if (delta < (inputSize + targetSize) / 2) { \
+			UTF8_SET_ERROR(OVERLAPPING_PARAMETERS); \
+			return _result; \
+		} \
+	}
+
+#define UTF8_VALIDATE_PARAMETERS(_inputType, _outputType, _result) \
+	if (input == 0) { \
+		UTF8_SET_ERROR(INVALID_DATA); \
+		return _result; \
+	} \
+	else if (inputSize < sizeof(_inputType)) { \
+		if (target != 0) { \
+			if (targetSize < sizeof(_outputType)) { \
+				UTF8_SET_ERROR(NOT_ENOUGH_SPACE); \
+				return _result; \
+			} \
+			*target = REPLACEMENT_CHARACTER; \
+		} \
+		UTF8_SET_ERROR(INVALID_DATA); \
+		return _result + sizeof(_outputType); \
+	} \
+	if (target != 0 && targetSize < sizeof(_outputType)) { \
+		UTF8_SET_ERROR(NOT_ENOUGH_SPACE); \
+		return _result; \
+	} \
+	if ((char*)input == (char*)target) { \
+		UTF8_SET_ERROR(OVERLAPPING_PARAMETERS); \
+		return _result; \
+	} \
+	{ \
+		char* input_center = (char*)input + (inputSize / 2); \
+		char* target_center = (char*)target + (targetSize / 2); \
+		size_t delta = (size_t)((input_center > target_center) ? (input_center - target_center) : (target_center - input_center)); \
+		if (delta < (inputSize + targetSize) / 2) { \
+			UTF8_SET_ERROR(OVERLAPPING_PARAMETERS); \
+			return _result; \
+		} \
+	}
+
+
+
+#endif /* _UTF8REWIND_INTERNAL_BASE_H_ */
+
+#ifndef _UTF8REWIND_INTERNAL_CASEMAPPING_H_
+#define _UTF8REWIND_INTERNAL_CASEMAPPING_H_
+
+
+
+
+typedef struct {
+	const char* src;
+	char* dst;
+	size_t src_size;
+	size_t dst_size;
+	size_t total_bytes_needed;
+	unicode_t last_code_point;
+	size_t locale;
+	const uint32_t* property_index1;
+	const uint32_t* property_index2;
+	const uint32_t* property_data;
+	uint32_t last_general_category;
+	uint8_t last_code_point_size;
+	uint8_t last_canonical_combining_class;
+	uint8_t quickcheck_flags;
+} CaseMappingState;
+
+uint8_t casemapping_initialize(
+	CaseMappingState* state,
+	const char* input, size_t inputSize,
+	char* target, size_t targetSize,
+	const uint32_t* propertyIndex1, const uint32_t* propertyIndex2, const uint32_t* propertyData,
+	uint8_t quickCheck, size_t locale,
+	int32_t* errors);
+
+size_t casemapping_execute(CaseMappingState* state, int32_t* errors);
+
+
+
+#endif /* _UTF8REWIND_INTERNAL_CASEMAPPING_H_ */
+#ifndef _UTF8REWIND_INTERNAL_CODEPOINT_H_
+#define _UTF8REWIND_INTERNAL_CODEPOINT_H_
+
+
+
+
+
+
+
+#define MAX_BASIC_LATIN                      0x007F
+
+
+#define MAX_LATIN_1                          0x00FF
+
+
+#define MAX_BASIC_MULTILINGUAL_PLANE         0xFFFF
+
+
+#define MAX_LEGAL_UNICODE                    0x10FFFF
+
+
+#define REPLACEMENT_CHARACTER                0xFFFD
+
+
+#define REPLACEMENT_CHARACTER_STRING         "\xEF\xBF\xBD"
+
+
+#define REPLACEMENT_CHARACTER_STRING_LENGTH  3
+
+
+#define SURROGATE_HIGH_START                 0xD800
+
+
+#define SURROGATE_HIGH_END                   0xDBFF
+
+
+#define SURROGATE_LOW_START                  0xDC00
+
+
+#define SURROGATE_LOW_END                    0xDFFF
+
+
+#define HANGUL_JAMO_FIRST                    0x1100
+
+
+#define HANGUL_JAMO_LAST                     0x11FF
+
+
+#define HANGUL_L_FIRST                       0x1100
+
+
+#define HANGUL_L_LAST                        0x1112
+
+
+#define HANGUL_L_COUNT                       19
+
+
+#define HANGUL_V_FIRST                       0x1161
+
+
+#define HANGUL_V_LAST                        0x1175
+
+
+#define HANGUL_V_COUNT                       21
+
+
+#define HANGUL_T_FIRST                       0x11A7
+
+
+#define HANGUL_T_LAST                        0x11C2
+
+
+#define HANGUL_T_COUNT                       28
+
+
+#define HANGUL_N_COUNT                       588 /* VCount * TCount */
+
+
+#define HANGUL_S_FIRST                       0xAC00
+
+
+#define HANGUL_S_LAST                        0xD7A3
+
+
+#define HANGUL_S_COUNT                       11172 /* LCount * NCount */
+
+#define CP_LATIN_CAPITAL_LETTER_I                 0x0049
+#define CP_LATIN_CAPITAL_LETTER_J                 0x004A
+#define CP_LATIN_SMALL_LETTER_I                   0x0069
+#define CP_LATIN_SMALL_LETTER_J                   0x006A
+#define CP_LATIN_CAPITAL_LETTER_I_WITH_GRAVE      0x00CC
+#define CP_LATIN_CAPITAL_LETTER_I_WITH_ACUTE      0x00CD
+#define CP_LATIN_CAPITAL_LETTER_I_WITH_TILDE      0x0128
+#define CP_LATIN_CAPITAL_LETTER_I_WITH_OGONEK     0x012E
+#define CP_LATIN_SMALL_LETTER_I_WITH_OGONEK       0x012F
+#define CP_LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE  0x0130
+#define CP_LATIN_SMALL_LETTER_DOTLESS_I           0x0131
+#define CP_COMBINING_GRAVE_ACCENT                 0x0300
+#define CP_COMBINING_ACUTE_ACCENT                 0x0301
+#define CP_COMBINING_TILDE_ACCENT                 0x0303
+#define CP_COMBINING_DOT_ABOVE                    0x0307
+#define CP_COMBINING_GREEK_YPOGEGRAMMENI          0x0345
+#define CP_COMBINING_GRAPHEME_JOINER              0x034F
+#define CP_GREEK_CAPITAL_LETTER_SIGMA             0x03A3
+
+#define CCC_NOT_REORDERED                         0
+#define CCC_OVERLAY                               1
+#define CCC_NUKTA                                 7
+#define CCC_KANA_VOICING                          8
+#define CCC_VIRAMA                                9
+#define CCC_FIXED_POSITION_START                  10
+#define CCC_FIXED_POSITION_END                    199
+#define CCC_ATTACHED_BELOW_LEFT                   200
+#define CCC_ATTACHED_BELOW                        202
+#define CCC_ATTACHED_BOTTOM_RIGHT                 204
+#define CCC_ATTACHED_LEFT                         208
+#define CCC_ATTACHED_RIGHT                        210
+#define CCC_ATTACHED_TOP_LEFT                     212
+#define CCC_ATTACHED_ABOVE                        214
+#define CCC_ATTACHED_ABOVE_RIGHT                  216
+#define CCC_BELOW_LEFT                            218
+#define CCC_BELOW                                 220
+#define CCC_BELOW_RIGHT                           222
+#define CCC_LEFT                                  224
+#define CCC_RIGHT                                 226
+#define CCC_ABOVE_LEFT                            228
+#define CCC_ABOVE                                 230
+#define CCC_ABOVE_RIGHT                           232
+#define CCC_DOUBLE_BELOW                          233
+#define CCC_DOUBLE_ABOVE                          234
+#define CCC_IOTA_SUBSCRIPT                        240
+#define CCC_INVALID                               255
+
+
+
+
+
+#endif /* _UTF8REWIND_INTERNAL_CODEPOINT_H_ */
+
+#ifndef _UTF8REWIND_INTERNAL_DATABASE_H_
+#define _UTF8REWIND_INTERNAL_DATABASE_H_
+
+
+
+
+typedef enum QuickCheckCaseMapped
+{
+	QuickCheckCaseMapped_Uppercase = 0x01,
+	QuickCheckCaseMapped_Lowercase = 0x02,
+	QuickCheckCaseMapped_Titlecase = 0x04,
+	QuickCheckCaseMapped_Casefolded = 0x08,
+} QuickCheckCaseMapped;
+
+typedef enum QuickCheckResult
+{
+	QuickCheckResult_Yes,
+	QuickCheckResult_Maybe,
+	QuickCheckResult_No,
+} QuickCheckResult;
+
+#define PROPERTY_INDEX_SHIFT (5)
+
+static const unicode_t PROPERTY_DATA_MASK = (1 << PROPERTY_INDEX_SHIFT) - 1;
+
+#define PROPERTY_GET(_indexArray, _dataArray, _cp) \
+	(_dataArray)[ \
+		(_indexArray)[(_cp) >> PROPERTY_INDEX_SHIFT] + \
+		((_cp) & PROPERTY_DATA_MASK)]
+
+#define PROPERTY_GET_GC(_cp) \
+	PROPERTY_GET(GeneralCategoryIndexPtr, GeneralCategoryDataPtr, _cp)
+
+#define PROPERTY_GET_CCC(_cp) \
+	PROPERTY_GET(CanonicalCombiningClassIndexPtr, CanonicalCombiningClassDataPtr, _cp)
+
+#define PROPERTY_GET_CM(_cp) \
+	PROPERTY_GET(QuickCheckCaseMappedIndexPtr, QuickCheckCaseMappedDataPtr, _cp)
+
+#define PROPERTY_GET_NFC(_cp) \
+	PROPERTY_GET(QuickCheckNFCIndexPtr, QuickCheckNFCDataPtr, _cp)
+
+#define PROPERTY_GET_NFD(_cp) \
+	PROPERTY_GET(QuickCheckNFDIndexPtr, QuickCheckNFDDataPtr, _cp)
+
+#define PROPERTY_GET_NFKC(_cp) \
+	PROPERTY_GET(QuickCheckNFKCIndexPtr, QuickCheckNFKCDataPtr, _cp)
+
+#define PROPERTY_GET_NFKD(_cp) \
+	PROPERTY_GET(QuickCheckNFKDIndexPtr, QuickCheckNFKDDataPtr, _cp)
+
+
+
+#endif /* _UTF8REWIND_INTERNAL_DATABASE_H_ */
+
+
+#ifndef _UTF8REWIND_INTERNAL_STREAMING_H_
+#define _UTF8REWIND_INTERNAL_STREAMING_H_
+
+
+
+
+/*
+	UAX15-D4. Stream-Safe Text Process
+		
+	This is the process of producing a Unicode string in Stream-Safe Text Format by processing that string
+	from start to finish, inserting U+034F COMBINING GRAPHEME JOINER (CGJ) within long sequences of
+	non-starters. The exact position of the inserted CGJs are determined according to the following algorithm,
+	which describes the generation of an output string from an input string:
+
+	* If the input string is empty, return an empty output string.
+	* Set nonStarterCount to zero.
+	* For each code point C in the input string:
+		* Produce the NFKD decomposition S.
+		* If nonStarterCount plus the number of initial non-starters in S is greater than 30, append a CGJ to
+			the output string and set the nonStarterCount to zero.
+		* Append C to the output string.
+		* If there are no starters in S, increment nonStarterCount by the number of code points in S; otherwise,
+			set nonStarterCount to the number of trailing non-starters in S (which may be zero).
+	* Return the output string.
+*/
+
+#define STREAM_SAFE_MAX 30
+#define STREAM_BUFFER_MAX 32
+
+typedef struct {
+	const char* src;
+	size_t src_size;
+	uint8_t index;
+	uint8_t current;
+	uint8_t filled;
+	uint8_t stable;
+	uint8_t last_length;
+	unicode_t codepoint[STREAM_BUFFER_MAX];
+	uint8_t quick_check[STREAM_BUFFER_MAX];
+	uint8_t canonical_combining_class[STREAM_BUFFER_MAX];
+} StreamState;
+
+
+
+
+#endif /* _UTF8REWIND_INTERNAL_STREAMING_H_ */
+
+#ifndef _UTF8REWIND_INTERNAL_COMPOSITION_H_
+#define _UTF8REWIND_INTERNAL_COMPOSITION_H_
+
+
+
+
+typedef struct {
+	StreamState* input;
+	StreamState* output;
+	const size_t* qc_index;
+	const uint8_t* qc_data;
+} ComposeState;
+
+
+
+#endif /* _UTF8REWIND_INTERNAL_COMPOSITION_H_ */
+
+#ifndef _UTF8REWIND_INTERNAL_DECOMPOSITION_H_
+#define _UTF8REWIND_INTERNAL_DECOMPOSITION_H_
+
+
+
+
+typedef struct {
+	StreamState* input;
+	StreamState* output;
+	const size_t* qc_index;
+	const uint8_t* qc_data;
+	const uint32_t* property_index1;
+	const uint32_t* property_index2;
+	const uint32_t* property_data;
+	unicode_t cache_codepoint[STREAM_BUFFER_MAX];
+	uint8_t cache_canonical_combining_class[STREAM_BUFFER_MAX];
+	uint8_t cache_current;
+	uint8_t cache_filled;
+} DecomposeState;
+
+
+
+#endif /* _UTF8REWIND_INTERNAL_DECOMPOSITION_H_ */
+
+#ifndef _UTF8REWIND_UNICODEDATABASE_H_
+#define _UTF8REWIND_UNICODEDATABASE_H_
+
+
+
+
+typedef struct {
+	unicode_t codepoint;
+	uint32_t length_and_offset;
+} DecompositionRecord;
+
+typedef struct {
+	uint64_t key;
+	unicode_t value;
+} CompositionRecord;
+
+
+
+#endif /* _UTF8REWIND_UNICODEDATABASE_H_ */
+
+
+#endif /*U8_H*/
diff --git a/libdispatch/utf8proc.c b/libdispatch/utf8proc.c
new file mode 100644
index 0000000..1ecbb1d
--- /dev/null
+++ b/libdispatch/utf8proc.c
@@ -0,0 +1,759 @@
+/* -*- mode: c; c-basic-offset: 2; tab-width: 2; indent-tabs-mode: nil -*- */
+/*
+ *  Copyright (c) 2015 Steven G. Johnson, Jiahao Chen, Peter Colberg, Tony Kelman, Scott P. Jones, and other contributors.
+ *  Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice shall be included in
+ *  all copies or substantial portions of the Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ *  This library contains derived data from a modified version of the
+ *  Unicode data files.
+ *
+ *  The original data files are available at
+ *  http://www.unicode.org/Public/UNIDATA/
+ *
+ *  Please notice the copyright statement in the file "utf8proc_data.c".
+ */
+
+
+/*
+ *  File name:    utf8proc.c
+ *
+ *  Description:
+ *  Implementation of libutf8proc.
+ */
+
+
+#include "utf8proc.h"
+#include "utf8proc_data.c"
+
+
+/**
+ * Array containing the byte lengths of a UTF-8 encoded codepoint based
+ * on the first byte.
+ */
+const nc_utf8proc_int8_t nc_utf8proc_utf8class[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,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+  4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+#define UTF8PROC_HANGUL_SBASE 0xAC00
+#define UTF8PROC_HANGUL_LBASE 0x1100
+#define UTF8PROC_HANGUL_VBASE 0x1161
+#define UTF8PROC_HANGUL_TBASE 0x11A7
+#define UTF8PROC_HANGUL_LCOUNT 19
+#define UTF8PROC_HANGUL_VCOUNT 21
+#define UTF8PROC_HANGUL_TCOUNT 28
+#define UTF8PROC_HANGUL_NCOUNT 588
+#define UTF8PROC_HANGUL_SCOUNT 11172
+/* END is exclusive */
+#define UTF8PROC_HANGUL_L_START  0x1100
+#define UTF8PROC_HANGUL_L_END    0x115A
+#define UTF8PROC_HANGUL_L_FILLER 0x115F
+#define UTF8PROC_HANGUL_V_START  0x1160
+#define UTF8PROC_HANGUL_V_END    0x11A3
+#define UTF8PROC_HANGUL_T_START  0x11A8
+#define UTF8PROC_HANGUL_T_END    0x11FA
+#define UTF8PROC_HANGUL_S_START  0xAC00
+#define UTF8PROC_HANGUL_S_END    0xD7A4
+
+/* Should follow semantic-versioning rules (semver.org) based on API
+   compatibility.  (Note that the shared-library version number will
+   be different, being based on ABI compatibility.): */
+#define STRINGIZEx(x) #x
+#define STRINGIZE(x) STRINGIZEx(x)
+const char *nc_utf8proc_version(void) {
+  return STRINGIZE(UTF8PROC_VERSION_MAJOR) "." STRINGIZE(UTF8PROC_VERSION_MINOR) "." STRINGIZE(UTF8PROC_VERSION_PATCH) "";
+}
+
+ const char *nc_utf8proc_errmsg(nc_utf8proc_ssize_t errcode) {
+  switch (errcode) {
+    case UTF8PROC_ERROR_NOMEM:
+    return "Memory for processing UTF-8 data could not be allocated.";
+    case UTF8PROC_ERROR_OVERFLOW:
+    return "UTF-8 string is too long to be processed.";
+    case UTF8PROC_ERROR_INVALIDUTF8:
+    return "Invalid UTF-8 string";
+    case UTF8PROC_ERROR_NOTASSIGNED:
+    return "Unassigned Unicode code point found in UTF-8 string.";
+    case UTF8PROC_ERROR_INVALIDOPTS:
+    return "Invalid options for UTF-8 processing chosen.";
+    default:
+    return "An unknown error occurred while processing UTF-8 data.";
+  }
+}
+
+#define utf_cont(ch)  (((ch) & 0xc0) == 0x80)
+nc_utf8proc_ssize_t nc_utf8proc_iterate(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen, nc_utf8proc_int32_t *dst
+) {
+  nc_utf8proc_uint32_t uc;
+  const nc_utf8proc_uint8_t *end;
+
+  *dst = -1;
+  if (!strlen) return 0;
+  end = str + ((strlen < 0) ? 4 : strlen);
+  uc = *str++;
+  if (uc < 0x80) {
+    *dst = uc;
+    return 1;
+  }
+  // Must be between 0xc2 and 0xf4 inclusive to be valid
+  if ((uc - 0xc2) > (0xf4-0xc2)) return UTF8PROC_ERROR_INVALIDUTF8;
+  if (uc < 0xe0) {         // 2-byte sequence
+     // Must have valid continuation character
+     if (str >= end || !utf_cont(*str)) return UTF8PROC_ERROR_INVALIDUTF8;
+     *dst = ((uc & 0x1f)<<6) | (*str & 0x3f);
+     return 2;
+  }
+  if (uc < 0xf0) {        // 3-byte sequence
+     if ((str + 1 >= end) || !utf_cont(*str) || !utf_cont(str[1]))
+        return UTF8PROC_ERROR_INVALIDUTF8;
+     // Check for surrogate chars
+     if (uc == 0xed && *str > 0x9f)
+         return UTF8PROC_ERROR_INVALIDUTF8;
+     uc = ((uc & 0xf)<<12) | ((*str & 0x3f)<<6) | (str[1] & 0x3f);
+     if (uc < 0x800)
+         return UTF8PROC_ERROR_INVALIDUTF8;
+     *dst = uc;
+     return 3;
+  }
+  // 4-byte sequence
+  // Must have 3 valid continuation characters
+  if ((str + 2 >= end) || !utf_cont(*str) || !utf_cont(str[1]) || !utf_cont(str[2]))
+     return UTF8PROC_ERROR_INVALIDUTF8;
+  // Make sure in correct range (0x10000 - 0x10ffff)
+  if (uc == 0xf0) {
+    if (*str < 0x90) return UTF8PROC_ERROR_INVALIDUTF8;
+  } else if (uc == 0xf4) {
+    if (*str > 0x8f) return UTF8PROC_ERROR_INVALIDUTF8;
+  }
+  *dst = ((uc & 7)<<18) | ((*str & 0x3f)<<12) | ((str[1] & 0x3f)<<6) | (str[2] & 0x3f);
+  return 4;
+}
+
+ nc_utf8proc_bool nc_utf8proc_codepoint_valid(nc_utf8proc_int32_t uc) {
+    return (((nc_utf8proc_uint32_t)uc)-0xd800 > 0x07ff) && ((nc_utf8proc_uint32_t)uc < 0x110000);
+}
+
+ nc_utf8proc_ssize_t nc_utf8proc_encode_char(nc_utf8proc_int32_t uc, nc_utf8proc_uint8_t *dst) {
+  if (uc < 0x00) {
+    return 0;
+  } else if (uc < 0x80) {
+    dst[0] = (nc_utf8proc_uint8_t) uc;
+    return 1;
+  } else if (uc < 0x800) {
+    dst[0] = (nc_utf8proc_uint8_t)(0xC0 + (uc >> 6));
+    dst[1] = (nc_utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+    return 2;
+  // Note: we allow encoding 0xd800-0xdfff here, so as not to change
+  // the API, however, these are actually invalid in UTF-8
+  } else if (uc < 0x10000) {
+    dst[0] = (nc_utf8proc_uint8_t)(0xE0 + (uc >> 12));
+    dst[1] = (nc_utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+    dst[2] = (nc_utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+    return 3;
+  } else if (uc < 0x110000) {
+    dst[0] = (nc_utf8proc_uint8_t)(0xF0 + (uc >> 18));
+    dst[1] = (nc_utf8proc_uint8_t)(0x80 + ((uc >> 12) & 0x3F));
+    dst[2] = (nc_utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+    dst[3] = (nc_utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+    return 4;
+  } else return 0;
+}
+
+/* internal "unsafe" version that does not check whether uc is in range */
+static nc_utf8proc_ssize_t nc_unsafe_encode_char(nc_utf8proc_int32_t uc, nc_utf8proc_uint8_t *dst) {
+   if (uc < 0x00) {
+      return 0;
+   } else if (uc < 0x80) {
+      dst[0] = (nc_utf8proc_uint8_t)uc;
+      return 1;
+   } else if (uc < 0x800) {
+      dst[0] = (nc_utf8proc_uint8_t)(0xC0 + (uc >> 6));
+      dst[1] = (nc_utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+      return 2;
+   } else if (uc == 0xFFFF) {
+       dst[0] = (nc_utf8proc_uint8_t)0xFF;
+       return 1;
+   } else if (uc == 0xFFFE) {
+       dst[0] = (nc_utf8proc_uint8_t)0xFE;
+       return 1;
+   } else if (uc < 0x10000) {
+      dst[0] = (nc_utf8proc_uint8_t)(0xE0 + (uc >> 12));
+      dst[1] = (nc_utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+      dst[2] = (nc_utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+      return 3;
+   } else if (uc < 0x110000) {
+      dst[0] = (nc_utf8proc_uint8_t)(0xF0 + (uc >> 18));
+      dst[1] = (nc_utf8proc_uint8_t)(0x80 + ((uc >> 12) & 0x3F));
+      dst[2] = (nc_utf8proc_uint8_t)(0x80 + ((uc >> 6) & 0x3F));
+      dst[3] = (nc_utf8proc_uint8_t)(0x80 + (uc & 0x3F));
+      return 4;
+   } else return 0;
+}
+
+/* internal "unsafe" version that does not check whether uc is in range */
+static const nc_utf8proc_property_t *nc_unsafe_get_property(nc_utf8proc_int32_t uc) {
+  /* ASSERT: uc >= 0 && uc < 0x110000 */
+  return nc_utf8proc_properties + (
+    nc_utf8proc_stage2table[
+      nc_utf8proc_stage1table[uc >> 8] + (uc & 0xFF)
+    ]
+  );
+}
+
+ const nc_utf8proc_property_t *nc_utf8proc_get_property(nc_utf8proc_int32_t uc) {
+  return uc < 0 || uc >= 0x110000 ? nc_utf8proc_properties : nc_unsafe_get_property(uc);
+}
+
+/* return whether there is a grapheme break between boundclasses lbc and tbc
+   (according to the definition of extended grapheme clusters)
+
+  Rule numbering refers to TR29 Version 29 (Unicode 9.0.0):
+  http://www.unicode.org/reports/tr29/tr29-29.html
+
+  CAVEATS:
+   Please note that evaluation of GB10 (grapheme breaks between emoji zwj sequences)
+   and GB 12/13 (regional indicator code points) require knowledge of previous characters
+   and are thus not handled by this function. This may result in an incorrect break before
+   an E_Modifier class codepoint and an incorrectly missing break between two
+   REGIONAL_INDICATOR class code points if such support does not exist in the caller.
+
+   See the special support in grapheme_break_extended, for required bookkeeping by the caller.
+*/
+static nc_utf8proc_bool nc_grapheme_break_simple(int lbc, int tbc) {
+  return
+    (lbc == UTF8PROC_BOUNDCLASS_START) ? true :       // GB1
+    (lbc == UTF8PROC_BOUNDCLASS_CR &&                 // GB3
+     tbc == UTF8PROC_BOUNDCLASS_LF) ? false :         // ---
+    (lbc >= UTF8PROC_BOUNDCLASS_CR && lbc <= UTF8PROC_BOUNDCLASS_CONTROL) ? true :  // GB4
+    (tbc >= UTF8PROC_BOUNDCLASS_CR && tbc <= UTF8PROC_BOUNDCLASS_CONTROL) ? true :  // GB5
+    (lbc == UTF8PROC_BOUNDCLASS_L &&                  // GB6
+     (tbc == UTF8PROC_BOUNDCLASS_L ||                 // ---
+      tbc == UTF8PROC_BOUNDCLASS_V ||                 // ---
+      tbc == UTF8PROC_BOUNDCLASS_LV ||                // ---
+      tbc == UTF8PROC_BOUNDCLASS_LVT)) ? false :      // ---
+    ((lbc == UTF8PROC_BOUNDCLASS_LV ||                // GB7
+      lbc == UTF8PROC_BOUNDCLASS_V) &&                // ---
+     (tbc == UTF8PROC_BOUNDCLASS_V ||                 // ---
+      tbc == UTF8PROC_BOUNDCLASS_T)) ? false :        // ---
+    ((lbc == UTF8PROC_BOUNDCLASS_LVT ||               // GB8
+      lbc == UTF8PROC_BOUNDCLASS_T) &&                // ---
+     tbc == UTF8PROC_BOUNDCLASS_T) ? false :          // ---
+    (tbc == UTF8PROC_BOUNDCLASS_EXTEND ||             // GB9
+     tbc == UTF8PROC_BOUNDCLASS_ZWJ ||                // ---
+     tbc == UTF8PROC_BOUNDCLASS_SPACINGMARK ||        // GB9a
+     lbc == UTF8PROC_BOUNDCLASS_PREPEND) ? false :    // GB9b
+    ((lbc == UTF8PROC_BOUNDCLASS_E_BASE ||            // GB10 (requires additional handling below)
+      lbc == UTF8PROC_BOUNDCLASS_E_BASE_GAZ) &&       // ----
+     tbc == UTF8PROC_BOUNDCLASS_E_MODIFIER) ? false : // ----
+    (lbc == UTF8PROC_BOUNDCLASS_ZWJ &&                         // GB11
+     (tbc == UTF8PROC_BOUNDCLASS_GLUE_AFTER_ZWJ ||             // ----
+      tbc == UTF8PROC_BOUNDCLASS_E_BASE_GAZ)) ? false :        // ----
+    (lbc == UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR &&          // GB12/13 (requires additional handling below)
+     tbc == UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR) ? false :  // ----
+    true; // GB999
+}
+
+static nc_utf8proc_bool nc_grapheme_break_extended(int lbc, int tbc, nc_utf8proc_int32_t *state)
+{
+  int lbc_override = lbc;
+  if (state && *state != UTF8PROC_BOUNDCLASS_START)
+    lbc_override = *state;
+  nc_utf8proc_bool break_permitted = nc_grapheme_break_simple(lbc_override, tbc);
+  if (state) {
+    // Special support for GB 12/13 made possible by GB999. After two RI
+    // class codepoints we want to force a break. Do this by resetting the
+    // second RI's bound class to UTF8PROC_BOUNDCLASS_OTHER, to force a break
+    // after that character according to GB999 (unless of course such a break is
+    // forbidden by a different rule such as GB9).
+    if (*state == tbc && tbc == UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR)
+      *state = UTF8PROC_BOUNDCLASS_OTHER;
+    // Special support for GB10. Fold any EXTEND codepoints into the previous
+    // boundclass if we're dealing with an emoji base boundclass.
+    else if ((*state == UTF8PROC_BOUNDCLASS_E_BASE      ||
+              *state == UTF8PROC_BOUNDCLASS_E_BASE_GAZ) &&
+             tbc == UTF8PROC_BOUNDCLASS_EXTEND)
+      *state = UTF8PROC_BOUNDCLASS_E_BASE;
+    else
+      *state = tbc;
+  }
+  return break_permitted;
+}
+
+ nc_utf8proc_bool nc_utf8proc_grapheme_break_stateful(
+    nc_utf8proc_int32_t c1, nc_utf8proc_int32_t c2, nc_utf8proc_int32_t *state) {
+
+  return nc_grapheme_break_extended(nc_utf8proc_get_property(c1)->boundclass,
+                                 nc_utf8proc_get_property(c2)->boundclass,
+                                 state);
+}
+
+
+ nc_utf8proc_bool nc_utf8proc_grapheme_break(
+    nc_utf8proc_int32_t c1, nc_utf8proc_int32_t c2) {
+  return nc_utf8proc_grapheme_break_stateful(c1, c2, NULL);
+}
+
+static nc_utf8proc_int32_t nc_seqindex_decode_entry(const nc_utf8proc_uint16_t **entry)
+{
+  nc_utf8proc_int32_t entry_cp = **entry;
+  if ((entry_cp & 0xF800) == 0xD800) {
+    *entry = *entry + 1;
+    entry_cp = ((entry_cp & 0x03FF) << 10) | (**entry & 0x03FF);
+    entry_cp += 0x10000;
+  }
+  return entry_cp;
+}
+
+static nc_utf8proc_int32_t nc_seqindex_decode_index(const nc_utf8proc_uint32_t seqindex)
+{
+  const nc_utf8proc_uint16_t *entry = &nc_utf8proc_sequences[seqindex];
+  return nc_seqindex_decode_entry(&entry);
+}
+
+static nc_utf8proc_ssize_t nc_seqindex_write_char_decomposed(nc_utf8proc_uint16_t seqindex, nc_utf8proc_int32_t *dst, nc_utf8proc_ssize_t bufsize, nc_utf8proc_option_t options, int *last_boundclass) {
+  nc_utf8proc_ssize_t written = 0;
+  const nc_utf8proc_uint16_t *entry = &nc_utf8proc_sequences[seqindex & 0x1FFF];
+  int len = seqindex >> 13;
+  if (len >= 7) {
+    len = *entry;
+    entry++;
+  }
+  for (; len >= 0; entry++, len--) {
+    nc_utf8proc_int32_t entry_cp = nc_seqindex_decode_entry(&entry);
+
+    written += nc_utf8proc_decompose_char(entry_cp, dst+written,
+      (bufsize > written) ? (bufsize - written) : 0, options,
+    last_boundclass);
+    if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
+  }
+  return written;
+}
+
+ nc_utf8proc_int32_t nc_utf8proc_tolower(nc_utf8proc_int32_t c)
+{
+  nc_utf8proc_int32_t cl = nc_utf8proc_get_property(c)->lowercase_seqindex;
+  return cl != UINT16_MAX ? nc_seqindex_decode_index(cl) : c;
+}
+
+ nc_utf8proc_int32_t nc_utf8proc_toupper(nc_utf8proc_int32_t c)
+{
+  nc_utf8proc_int32_t cu = nc_utf8proc_get_property(c)->uppercase_seqindex;
+  return cu != UINT16_MAX ? nc_seqindex_decode_index(cu) : c;
+}
+
+ nc_utf8proc_int32_t nc_utf8proc_totitle(nc_utf8proc_int32_t c)
+{
+  nc_utf8proc_int32_t cu = nc_utf8proc_get_property(c)->titlecase_seqindex;
+  return cu != UINT16_MAX ? nc_seqindex_decode_index(cu) : c;
+}
+
+/* return a character width analogous to wcwidth (except portable and
+   hopefully less buggy than most system wcwidth functions). */
+ int nc_utf8proc_charwidth(nc_utf8proc_int32_t c) {
+  return nc_utf8proc_get_property(c)->charwidth;
+}
+
+ nc_utf8proc_category_t nc_utf8proc_category(nc_utf8proc_int32_t c) {
+  return nc_utf8proc_get_property(c)->category;
+}
+
+ const char *nc_utf8proc_category_string(nc_utf8proc_int32_t c) {
+  static const char s[][3] = {"Cn","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"};
+  return s[nc_utf8proc_category(c)];
+}
+
+#define nc_utf8proc_decompose_lump(replacement_uc) \
+  return nc_utf8proc_decompose_char((replacement_uc), dst, bufsize, \
+  options & ~UTF8PROC_LUMP, last_boundclass)
+
+ nc_utf8proc_ssize_t nc_utf8proc_decompose_char(nc_utf8proc_int32_t uc, nc_utf8proc_int32_t *dst, nc_utf8proc_ssize_t bufsize, nc_utf8proc_option_t options, int *last_boundclass) {
+  const nc_utf8proc_property_t *property;
+  nc_utf8proc_propval_t category;
+  nc_utf8proc_int32_t hangul_sindex;
+  if (uc < 0 || uc >= 0x110000) return UTF8PROC_ERROR_NOTASSIGNED;
+  property = nc_unsafe_get_property(uc);
+  category = property->category;
+  hangul_sindex = uc - UTF8PROC_HANGUL_SBASE;
+  if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+    if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT) {
+      nc_utf8proc_int32_t hangul_tindex;
+      if (bufsize >= 1) {
+        dst[0] = UTF8PROC_HANGUL_LBASE +
+          hangul_sindex / UTF8PROC_HANGUL_NCOUNT;
+        if (bufsize >= 2) dst[1] = UTF8PROC_HANGUL_VBASE +
+          (hangul_sindex % UTF8PROC_HANGUL_NCOUNT) / UTF8PROC_HANGUL_TCOUNT;
+      }
+      hangul_tindex = hangul_sindex % UTF8PROC_HANGUL_TCOUNT;
+      if (!hangul_tindex) return 2;
+      if (bufsize >= 3) dst[2] = UTF8PROC_HANGUL_TBASE + hangul_tindex;
+      return 3;
+    }
+  }
+  if (options & UTF8PROC_REJECTNA) {
+    if (!category) return UTF8PROC_ERROR_NOTASSIGNED;
+  }
+  if (options & UTF8PROC_IGNORE) {
+    if (property->ignorable) return 0;
+  }
+  if (options & UTF8PROC_LUMP) {
+    if (category == UTF8PROC_CATEGORY_ZS) nc_utf8proc_decompose_lump(0x0020);
+    if (uc == 0x2018 || uc == 0x2019 || uc == 0x02BC || uc == 0x02C8)
+      nc_utf8proc_decompose_lump(0x0027);
+    if (category == UTF8PROC_CATEGORY_PD || uc == 0x2212)
+      nc_utf8proc_decompose_lump(0x002D);
+    if (uc == 0x2044 || uc == 0x2215) nc_utf8proc_decompose_lump(0x002F);
+    if (uc == 0x2236) nc_utf8proc_decompose_lump(0x003A);
+    if (uc == 0x2039 || uc == 0x2329 || uc == 0x3008)
+      nc_utf8proc_decompose_lump(0x003C);
+    if (uc == 0x203A || uc == 0x232A || uc == 0x3009)
+      nc_utf8proc_decompose_lump(0x003E);
+    if (uc == 0x2216) nc_utf8proc_decompose_lump(0x005C);
+    if (uc == 0x02C4 || uc == 0x02C6 || uc == 0x2038 || uc == 0x2303)
+      nc_utf8proc_decompose_lump(0x005E);
+    if (category == UTF8PROC_CATEGORY_PC || uc == 0x02CD)
+      nc_utf8proc_decompose_lump(0x005F);
+    if (uc == 0x02CB) nc_utf8proc_decompose_lump(0x0060);
+    if (uc == 0x2223) nc_utf8proc_decompose_lump(0x007C);
+    if (uc == 0x223C) nc_utf8proc_decompose_lump(0x007E);
+    if ((options & UTF8PROC_NLF2LS) && (options & UTF8PROC_NLF2PS)) {
+      if (category == UTF8PROC_CATEGORY_ZL ||
+          category == UTF8PROC_CATEGORY_ZP)
+        nc_utf8proc_decompose_lump(0x000A);
+    }
+  }
+  if (options & UTF8PROC_STRIPMARK) {
+    if (category == UTF8PROC_CATEGORY_MN ||
+      category == UTF8PROC_CATEGORY_MC ||
+      category == UTF8PROC_CATEGORY_ME) return 0;
+  }
+  if (options & UTF8PROC_CASEFOLD) {
+    if (property->casefold_seqindex != UINT16_MAX) {
+      return nc_seqindex_write_char_decomposed(property->casefold_seqindex, dst, bufsize, options, last_boundclass);
+    }
+  }
+  if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+    if (property->decomp_seqindex != UINT16_MAX &&
+        (!property->decomp_type || (options & UTF8PROC_COMPAT))) {
+      return nc_seqindex_write_char_decomposed(property->decomp_seqindex, dst, bufsize, options, last_boundclass);
+    }
+  }
+  if (options & UTF8PROC_CHARBOUND) {
+    nc_utf8proc_bool boundary;
+    int tbc = property->boundclass;
+    boundary = nc_grapheme_break_extended(*last_boundclass, tbc, last_boundclass);
+    if (boundary) {
+      if (bufsize >= 1) dst[0] = 0xFFFF;
+      if (bufsize >= 2) dst[1] = uc;
+      return 2;
+    }
+  }
+  if (bufsize >= 1) *dst = uc;
+  return 1;
+}
+
+ nc_utf8proc_ssize_t nc_utf8proc_decompose(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen,
+  nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t bufsize, nc_utf8proc_option_t options
+) {
+    return nc_utf8proc_decompose_custom(str, strlen, buffer, bufsize, options, NULL, NULL);
+}
+
+ nc_utf8proc_ssize_t nc_utf8proc_decompose_custom(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen,
+  nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t bufsize, nc_utf8proc_option_t options,
+  nc_utf8proc_custom_func custom_func, void *custom_data
+) {
+  /* strlen will be ignored, if UTF8PROC_NULLTERM is set in options */
+  nc_utf8proc_ssize_t wpos = 0;
+  if ((options & UTF8PROC_COMPOSE) && (options & UTF8PROC_DECOMPOSE))
+    return UTF8PROC_ERROR_INVALIDOPTS;
+  if ((options & UTF8PROC_STRIPMARK) &&
+      !(options & UTF8PROC_COMPOSE) && !(options & UTF8PROC_DECOMPOSE))
+    return UTF8PROC_ERROR_INVALIDOPTS;
+  {
+    nc_utf8proc_int32_t uc;
+    nc_utf8proc_ssize_t rpos = 0;
+    nc_utf8proc_ssize_t decomp_result;
+    int boundclass = UTF8PROC_BOUNDCLASS_START;
+    while (1) {
+      if (options & UTF8PROC_NULLTERM) {
+        rpos += nc_utf8proc_iterate(str + rpos, -1, &uc);
+        /* checking of return value is not necessary,
+           as 'uc' is < 0 in case of error */
+        if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+        if (rpos < 0) return UTF8PROC_ERROR_OVERFLOW;
+        if (uc == 0) break;
+      } else {
+        if (rpos >= strlen) break;
+        rpos += nc_utf8proc_iterate(str + rpos, strlen - rpos, &uc);
+        if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+      }
+      if (custom_func != NULL) {
+        uc = custom_func(uc, custom_data);   /* user-specified custom mapping */
+      }
+      decomp_result = nc_utf8proc_decompose_char(
+        uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options,
+        &boundclass
+      );
+      if (decomp_result < 0) return decomp_result;
+      wpos += decomp_result;
+      /* prohibiting integer overflows due to too long strings: */
+      if (wpos < 0 ||
+          wpos > (nc_utf8proc_ssize_t)(SSIZE_MAX/sizeof(nc_utf8proc_int32_t)/2))
+        return UTF8PROC_ERROR_OVERFLOW;
+    }
+  }
+  if ((options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) && bufsize >= wpos) {
+    nc_utf8proc_ssize_t pos = 0;
+    while (pos < wpos-1) {
+      nc_utf8proc_int32_t uc1, uc2;
+      const nc_utf8proc_property_t *property1, *property2;
+      uc1 = buffer[pos];
+      uc2 = buffer[pos+1];
+      property1 = nc_unsafe_get_property(uc1);
+      property2 = nc_unsafe_get_property(uc2);
+      if (property1->combining_class > property2->combining_class &&
+          property2->combining_class > 0) {
+        buffer[pos] = uc2;
+        buffer[pos+1] = uc1;
+        if (pos > 0) pos--; else pos++;
+      } else {
+        pos++;
+      }
+    }
+  }
+  return wpos;
+}
+
+ nc_utf8proc_ssize_t nc_utf8proc_normalize_utf32(nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t length, nc_utf8proc_option_t options) {
+  /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored */
+  if (options & (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS | UTF8PROC_STRIPCC)) {
+    nc_utf8proc_ssize_t rpos;
+    nc_utf8proc_ssize_t wpos = 0;
+    nc_utf8proc_int32_t uc;
+    for (rpos = 0; rpos < length; rpos++) {
+      uc = buffer[rpos];
+      if (uc == 0x000D && rpos < length-1 && buffer[rpos+1] == 0x000A) rpos++;
+      if (uc == 0x000A || uc == 0x000D || uc == 0x0085 ||
+          ((options & UTF8PROC_STRIPCC) && (uc == 0x000B || uc == 0x000C))) {
+        if (options & UTF8PROC_NLF2LS) {
+          if (options & UTF8PROC_NLF2PS) {
+            buffer[wpos++] = 0x000A;
+          } else {
+            buffer[wpos++] = 0x2028;
+          }
+        } else {
+          if (options & UTF8PROC_NLF2PS) {
+            buffer[wpos++] = 0x2029;
+          } else {
+            buffer[wpos++] = 0x0020;
+          }
+        }
+      } else if ((options & UTF8PROC_STRIPCC) &&
+          (uc < 0x0020 || (uc >= 0x007F && uc < 0x00A0))) {
+        if (uc == 0x0009) buffer[wpos++] = 0x0020;
+      } else {
+        buffer[wpos++] = uc;
+      }
+    }
+    length = wpos;
+  }
+  if (options & UTF8PROC_COMPOSE) {
+    nc_utf8proc_int32_t *starter = NULL;
+    nc_utf8proc_int32_t current_char;
+    const nc_utf8proc_property_t *starter_property = NULL, *current_property;
+    nc_utf8proc_propval_t max_combining_class = -1;
+    nc_utf8proc_ssize_t rpos;
+    nc_utf8proc_ssize_t wpos = 0;
+    nc_utf8proc_int32_t composition;
+    for (rpos = 0; rpos < length; rpos++) {
+      current_char = buffer[rpos];
+      current_property = nc_unsafe_get_property(current_char);
+      if (starter && current_property->combining_class > max_combining_class) {
+        /* combination perhaps possible */
+        nc_utf8proc_int32_t hangul_lindex;
+        nc_utf8proc_int32_t hangul_sindex;
+        hangul_lindex = *starter - UTF8PROC_HANGUL_LBASE;
+        if (hangul_lindex >= 0 && hangul_lindex < UTF8PROC_HANGUL_LCOUNT) {
+          nc_utf8proc_int32_t hangul_vindex;
+          hangul_vindex = current_char - UTF8PROC_HANGUL_VBASE;
+          if (hangul_vindex >= 0 && hangul_vindex < UTF8PROC_HANGUL_VCOUNT) {
+            *starter = UTF8PROC_HANGUL_SBASE +
+              (hangul_lindex * UTF8PROC_HANGUL_VCOUNT + hangul_vindex) *
+              UTF8PROC_HANGUL_TCOUNT;
+            starter_property = NULL;
+            continue;
+          }
+        }
+        hangul_sindex = *starter - UTF8PROC_HANGUL_SBASE;
+        if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT &&
+            (hangul_sindex % UTF8PROC_HANGUL_TCOUNT) == 0) {
+          nc_utf8proc_int32_t hangul_tindex;
+          hangul_tindex = current_char - UTF8PROC_HANGUL_TBASE;
+          if (hangul_tindex >= 0 && hangul_tindex < UTF8PROC_HANGUL_TCOUNT) {
+            *starter += hangul_tindex;
+            starter_property = NULL;
+            continue;
+          }
+        }
+        if (!starter_property) {
+          starter_property = nc_unsafe_get_property(*starter);
+        }
+        if (starter_property->comb_index < 0x8000 &&
+            current_property->comb_index != UINT16_MAX &&
+            current_property->comb_index >= 0x8000) {
+          int sidx = starter_property->comb_index;
+          int idx = (current_property->comb_index & 0x3FFF) - nc_utf8proc_combinations[sidx];
+          if (idx >= 0 && idx <= nc_utf8proc_combinations[sidx + 1] ) {
+            idx += sidx + 2;
+            if (current_property->comb_index & 0x4000) {
+              composition = (nc_utf8proc_combinations[idx] << 16) | nc_utf8proc_combinations[idx+1];
+            } else
+              composition = nc_utf8proc_combinations[idx];
+
+            if (composition > 0 && (!(options & UTF8PROC_STABLE) ||
+                !(nc_unsafe_get_property(composition)->comp_exclusion))) {
+              *starter = composition;
+              starter_property = NULL;
+              continue;
+            }
+          }
+        }
+      }
+      buffer[wpos] = current_char;
+      if (current_property->combining_class) {
+        if (current_property->combining_class > max_combining_class) {
+          max_combining_class = current_property->combining_class;
+        }
+      } else {
+        starter = buffer + wpos;
+        starter_property = NULL;
+        max_combining_class = -1;
+      }
+      wpos++;
+    }
+    length = wpos;
+  }
+  return length;
+}
+
+ nc_utf8proc_ssize_t nc_utf8proc_reencode(nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t length, nc_utf8proc_option_t options) {
+  /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored
+     ASSERT: 'buffer' has one spare byte of free space at the end! */
+  length = nc_utf8proc_normalize_utf32(buffer, length, options);
+  if (length < 0) return length;
+  {
+    nc_utf8proc_ssize_t rpos, wpos = 0;
+    nc_utf8proc_int32_t uc;
+    if (options & UTF8PROC_CHARBOUND) {
+        for (rpos = 0; rpos < length; rpos++) {
+            uc = buffer[rpos];
+            wpos += nc_unsafe_encode_char(uc, ((nc_utf8proc_uint8_t *)buffer) + wpos);
+        }
+    } else {
+        for (rpos = 0; rpos < length; rpos++) {
+            uc = buffer[rpos];
+            wpos += nc_utf8proc_encode_char(uc, ((nc_utf8proc_uint8_t *)buffer) + wpos);
+        }
+    }
+    ((nc_utf8proc_uint8_t *)buffer)[wpos] = 0;
+    return wpos;
+  }
+}
+
+ nc_utf8proc_ssize_t nc_utf8proc_map(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen, nc_utf8proc_uint8_t **dstptr, nc_utf8proc_option_t options
+) {
+    return nc_utf8proc_map_custom(str, strlen, dstptr, options, NULL, NULL);
+}
+
+ nc_utf8proc_ssize_t nc_utf8proc_map_custom(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen, nc_utf8proc_uint8_t **dstptr, nc_utf8proc_option_t options,
+  nc_utf8proc_custom_func custom_func, void *custom_data
+) {
+  nc_utf8proc_int32_t *buffer;
+  nc_utf8proc_ssize_t result;
+  *dstptr = NULL;
+  result = nc_utf8proc_decompose_custom(str, strlen, NULL, 0, options, custom_func, custom_data);
+  if (result < 0) return result;
+  buffer = (nc_utf8proc_int32_t *) malloc(result * sizeof(nc_utf8proc_int32_t) + 1);
+  if (!buffer) return UTF8PROC_ERROR_NOMEM;
+  result = nc_utf8proc_decompose_custom(str, strlen, buffer, result, options, custom_func, custom_data);
+  if (result < 0) {
+    free(buffer);
+    return result;
+  }
+  result = nc_utf8proc_reencode(buffer, result, options);
+  if (result < 0) {
+    free(buffer);
+    return result;
+  }
+  {
+    nc_utf8proc_int32_t *newptr;
+    newptr = (nc_utf8proc_int32_t *) realloc(buffer, (size_t)result+1);
+    if (newptr) buffer = newptr;
+  }
+  *dstptr = (nc_utf8proc_uint8_t *)buffer;
+  return result;
+}
+
+ nc_utf8proc_uint8_t *nc_utf8proc_NFD(const nc_utf8proc_uint8_t *str) {
+  nc_utf8proc_uint8_t *retval;
+  nc_utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_DECOMPOSE);
+  return retval;
+}
+
+ nc_utf8proc_uint8_t *nc_utf8proc_NFC(const nc_utf8proc_uint8_t *str) {
+  nc_utf8proc_uint8_t *retval;
+  nc_utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_COMPOSE);
+  return retval;
+}
+
+ nc_utf8proc_uint8_t *nc_utf8proc_NFKD(const nc_utf8proc_uint8_t *str) {
+  nc_utf8proc_uint8_t *retval;
+  nc_utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT);
+  return retval;
+}
+
+ nc_utf8proc_uint8_t *nc_utf8proc_NFKC(const nc_utf8proc_uint8_t *str) {
+  nc_utf8proc_uint8_t *retval;
+  nc_utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+    UTF8PROC_COMPOSE | UTF8PROC_COMPAT);
+  return retval;
+}
diff --git a/libdispatch/utf8proc.h b/libdispatch/utf8proc.h
new file mode 100644
index 0000000..cee9882
--- /dev/null
+++ b/libdispatch/utf8proc.h
@@ -0,0 +1,701 @@
+/*
+ * Copyright (c) 2015 Steven G. Johnson, Jiahao Chen, Peter Colberg, Tony Kelman, Scott P. Jones, and other contributors.
+ * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * @mainpage
+ *
+ * utf8proc is a free/open-source (MIT/expat licensed) C library
+ * providing Unicode normalization, case-folding, and other operations
+ * for strings in the UTF-8 encoding, supporting Unicode version
+ * 8.0.0.  See the utf8proc home page (http://julialang.org/utf8proc/)
+ * for downloads and other information, or the source code on github
+ * (https://github.com/JuliaLang/utf8proc).
+ *
+ * For the utf8proc API documentation, see: @ref utf8proc.h
+ *
+ * The features of utf8proc include:
+ *
+ * - Transformation of strings (@ref utf8proc_map) to:
+ *    - decompose (@ref UTF8PROC_DECOMPOSE) or compose (@ref UTF8PROC_COMPOSE) Unicode combining characters (http://en.wikipedia.org/wiki/Combining_character)
+ *    - canonicalize Unicode compatibility characters (@ref UTF8PROC_COMPAT)
+ *    - strip "ignorable" (@ref UTF8PROC_IGNORE) characters, control characters (@ref UTF8PROC_STRIPCC), or combining characters such as accents (@ref UTF8PROC_STRIPMARK)
+ *    - case-folding (@ref UTF8PROC_CASEFOLD)
+ * - Unicode normalization: @ref utf8proc_NFD, @ref utf8proc_NFC, @ref utf8proc_NFKD, @ref utf8proc_NFKC
+ * - Detecting grapheme boundaries (@ref utf8proc_grapheme_break and @ref UTF8PROC_CHARBOUND)
+ * - Character-width computation: @ref utf8proc_charwidth
+ * - Classification of characters by Unicode category: @ref utf8proc_category and @ref utf8proc_category_string
+ * - Encode (@ref utf8proc_encode_char) and decode (@ref utf8proc_iterate) Unicode codepoints to/from UTF-8.
+ */
+
+/** @file */
+
+#ifndef UTF8PROC_H
+#define UTF8PROC_H
+
+/** @name API version
+ *
+ * The utf8proc API version MAJOR.MINOR.PATCH, following
+ * semantic-versioning rules (http://semver.org) based on API
+ * compatibility.
+ *
+ * This is also returned at runtime by @ref utf8proc_version; however, the
+ * runtime version may append a string like "-dev" to the version number
+ * for prerelease versions.
+ *
+ * @note The shared-library version number in the Makefile
+ *       (and CMakeLists.txt, and MANIFEST) may be different,
+ *       being based on ABI compatibility rather than API compatibility.
+ */
+/** @{ */
+/** The MAJOR version number (increased when backwards API compatibility is broken). */
+#define UTF8PROC_VERSION_MAJOR 2
+/** The MINOR version number (increased when new functionality is added in a backwards-compatible manner). */
+#define UTF8PROC_VERSION_MINOR 1
+/** The PATCH version (increased for fixes that do not change the API). */
+#define UTF8PROC_VERSION_PATCH 0
+/** @} */
+
+#include <stdlib.h>
+
+#if defined(_MSC_VER) && _MSC_VER < 1800
+// MSVC prior to 2013 lacked stdbool.h and inttypes.h
+typedef signed char utf8proc_int8_t;
+typedef unsigned char utf8proc_uint8_t;
+typedef short utf8proc_int16_t;
+typedef unsigned short utf8proc_uint16_t;
+typedef int utf8proc_int32_t;
+typedef unsigned int utf8proc_uint32_t;
+#  ifdef _WIN64
+typedef __int64 utf8proc_ssize_t;
+typedef unsigned __int64 utf8proc_size_t;
+#  else
+typedef int utf8proc_ssize_t;
+typedef unsigned int utf8proc_size_t;
+#  endif
+#  ifndef __cplusplus
+// emulate C99 bool
+typedef unsigned char utf8proc_bool;
+#    ifndef __bool_true_false_are_defined
+#      define false 0
+#      define true 1
+#      define __bool_true_false_are_defined 1
+#    endif
+#  else
+typedef bool utf8proc_bool;
+#  endif
+#else
+#  include <stddef.h>
+#  include <stdbool.h>
+#  include <inttypes.h>
+typedef int8_t nc_utf8proc_int8_t;
+typedef uint8_t nc_utf8proc_uint8_t;
+typedef int16_t nc_utf8proc_int16_t;
+typedef uint16_t nc_utf8proc_uint16_t;
+typedef int32_t nc_utf8proc_int32_t;
+typedef uint32_t nc_utf8proc_uint32_t;
+typedef size_t nc_utf8proc_size_t;
+typedef ptrdiff_t nc_utf8proc_ssize_t;
+typedef bool nc_utf8proc_bool;
+#endif
+#include <limits.h>
+
+#ifndef UTF8PROC_EXPORTS
+#ifdef _WIN32
+#  ifdef UTF8PROC_EXPORTS
+#    define UTF8PROC_DLLEXPORT __declspec(dllexport)
+#  else
+#    define UTF8PROC_DLLEXPORT __declspec(dllimport)
+#  endif
+#elif __GNUC__ >= 4
+#  define UTF8PROC_DLLEXPORT __attribute__ ((visibility("default")))
+#else
+#  define UTF8PROC_DLLEXPORT
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SSIZE_MAX
+#define SSIZE_MAX ((size_t)SIZE_MAX/2)
+#endif
+
+#ifndef UINT16_MAX
+#  define UINT16_MAX 65535U
+#endif
+
+/**
+ * Option flags used by several functions in the library.
+ */
+typedef enum {
+  /** The given UTF-8 input is NULL terminated. */
+  UTF8PROC_NULLTERM  = (1<<0),
+  /** Unicode Versioning Stability has to be respected. */
+  UTF8PROC_STABLE    = (1<<1),
+  /** Compatibility decomposition (i.e. formatting information is lost). */
+  UTF8PROC_COMPAT    = (1<<2),
+  /** Return a result with decomposed characters. */
+  UTF8PROC_COMPOSE   = (1<<3),
+  /** Return a result with decomposed characters. */
+  UTF8PROC_DECOMPOSE = (1<<4),
+  /** Strip "default ignorable characters" such as SOFT-HYPHEN or ZERO-WIDTH-SPACE. */
+  UTF8PROC_IGNORE    = (1<<5),
+  /** Return an error, if the input contains unassigned codepoints. */
+  UTF8PROC_REJECTNA  = (1<<6),
+  /**
+   * Indicating that NLF-sequences (LF, CRLF, CR, NEL) are representing a
+   * line break, and should be converted to the codepoint for line
+   * separation (LS).
+   */
+  UTF8PROC_NLF2LS    = (1<<7),
+  /**
+   * Indicating that NLF-sequences are representing a paragraph break, and
+   * should be converted to the codepoint for paragraph separation
+   * (PS).
+   */
+  UTF8PROC_NLF2PS    = (1<<8),
+  /** Indicating that the meaning of NLF-sequences is unknown. */
+  UTF8PROC_NLF2LF    = (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS),
+  /** Strips and/or convers control characters.
+   *
+   * NLF-sequences are transformed into space, except if one of the
+   * NLF2LS/PS/LF options is given. HorizontalTab (HT) and FormFeed (FF)
+   * are treated as a NLF-sequence in this case.  All other control
+   * characters are simply removed.
+   */
+  UTF8PROC_STRIPCC   = (1<<9),
+  /**
+   * Performs unicode case folding, to be able to do a case-insensitive
+   * string comparison.
+   */
+  UTF8PROC_CASEFOLD  = (1<<10),
+  /**
+   * Inserts 0xFF bytes at the beginning of each sequence which is
+   * representing a single grapheme cluster (see UAX#29).
+   */
+  UTF8PROC_CHARBOUND = (1<<11),
+  /** Lumps certain characters together.
+   *
+   * E.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-". See lump.md for details.
+   *
+   * If NLF2LF is set, this includes a transformation of paragraph and
+   * line separators to ASCII line-feed (LF).
+   */
+  UTF8PROC_LUMP      = (1<<12),
+  /** Strips all character markings.
+   *
+   * This includes non-spacing, spacing and enclosing (i.e. accents).
+   * @note This option works only with @ref UTF8PROC_COMPOSE or
+   *       @ref UTF8PROC_DECOMPOSE
+   */
+  UTF8PROC_STRIPMARK = (1<<13),
+} nc_utf8proc_option_t;
+
+/** @name Error codes
+ * Error codes being returned by almost all functions.
+ */
+/** @{ */
+/** Memory could not be allocated. */
+#define UTF8PROC_ERROR_NOMEM -1
+/** The given string is too long to be processed. */
+#define UTF8PROC_ERROR_OVERFLOW -2
+/** The given string is not a legal UTF-8 string. */
+#define UTF8PROC_ERROR_INVALIDUTF8 -3
+/** The @ref UTF8PROC_REJECTNA flag was set and an unassigned codepoint was found. */
+#define UTF8PROC_ERROR_NOTASSIGNED -4
+/** Invalid options have been used. */
+#define UTF8PROC_ERROR_INVALIDOPTS -5
+/** @} */
+
+/* @name Types */
+
+/** Holds the value of a property. */
+typedef nc_utf8proc_int16_t nc_utf8proc_propval_t;
+
+/** Struct containing information about a codepoint. */
+typedef struct nc_utf8proc_property_struct {
+  /**
+   * Unicode category.
+   * @see utf8proc_category_t.
+   */
+  nc_utf8proc_propval_t category;
+  nc_utf8proc_propval_t combining_class;
+  /**
+   * Bidirectional class.
+   * @see utf8proc_bidi_class_t.
+   */
+  nc_utf8proc_propval_t bidi_class;
+  /**
+   * @anchor Decomposition type.
+   * @see utf8proc_decomp_type_t.
+   */
+  nc_utf8proc_propval_t decomp_type;
+  nc_utf8proc_uint16_t decomp_seqindex;
+  nc_utf8proc_uint16_t casefold_seqindex;
+  nc_utf8proc_uint16_t uppercase_seqindex;
+  nc_utf8proc_uint16_t lowercase_seqindex;
+  nc_utf8proc_uint16_t titlecase_seqindex;
+  nc_utf8proc_uint16_t comb_index;
+  unsigned bidi_mirrored:1;
+  unsigned comp_exclusion:1;
+  /**
+   * Can this codepoint be ignored?
+   *
+   * Used by @ref utf8proc_decompose_char when @ref UTF8PROC_IGNORE is
+   * passed as an option.
+   */
+  unsigned ignorable:1;
+  unsigned control_boundary:1;
+  /** The width of the codepoint. */
+  unsigned charwidth:2;
+  unsigned pad:2;
+  /**
+   * Boundclass.
+   * @see utf8proc_boundclass_t.
+   */
+  unsigned boundclass:8;
+} nc_utf8proc_property_t;
+
+/** Unicode categories. */
+typedef enum {
+  UTF8PROC_CATEGORY_CN  = 0, /**< Other, not assigned */
+  UTF8PROC_CATEGORY_LU  = 1, /**< Letter, uppercase */
+  UTF8PROC_CATEGORY_LL  = 2, /**< Letter, lowercase */
+  UTF8PROC_CATEGORY_LT  = 3, /**< Letter, titlecase */
+  UTF8PROC_CATEGORY_LM  = 4, /**< Letter, modifier */
+  UTF8PROC_CATEGORY_LO  = 5, /**< Letter, other */
+  UTF8PROC_CATEGORY_MN  = 6, /**< Mark, nonspacing */
+  UTF8PROC_CATEGORY_MC  = 7, /**< Mark, spacing combining */
+  UTF8PROC_CATEGORY_ME  = 8, /**< Mark, enclosing */
+  UTF8PROC_CATEGORY_ND  = 9, /**< Number, decimal digit */
+  UTF8PROC_CATEGORY_NL = 10, /**< Number, letter */
+  UTF8PROC_CATEGORY_NO = 11, /**< Number, other */
+  UTF8PROC_CATEGORY_PC = 12, /**< Punctuation, connector */
+  UTF8PROC_CATEGORY_PD = 13, /**< Punctuation, dash */
+  UTF8PROC_CATEGORY_PS = 14, /**< Punctuation, open */
+  UTF8PROC_CATEGORY_PE = 15, /**< Punctuation, close */
+  UTF8PROC_CATEGORY_PI = 16, /**< Punctuation, initial quote */
+  UTF8PROC_CATEGORY_PF = 17, /**< Punctuation, final quote */
+  UTF8PROC_CATEGORY_PO = 18, /**< Punctuation, other */
+  UTF8PROC_CATEGORY_SM = 19, /**< Symbol, math */
+  UTF8PROC_CATEGORY_SC = 20, /**< Symbol, currency */
+  UTF8PROC_CATEGORY_SK = 21, /**< Symbol, modifier */
+  UTF8PROC_CATEGORY_SO = 22, /**< Symbol, other */
+  UTF8PROC_CATEGORY_ZS = 23, /**< Separator, space */
+  UTF8PROC_CATEGORY_ZL = 24, /**< Separator, line */
+  UTF8PROC_CATEGORY_ZP = 25, /**< Separator, paragraph */
+  UTF8PROC_CATEGORY_CC = 26, /**< Other, control */
+  UTF8PROC_CATEGORY_CF = 27, /**< Other, format */
+  UTF8PROC_CATEGORY_CS = 28, /**< Other, surrogate */
+  UTF8PROC_CATEGORY_CO = 29, /**< Other, private use */
+} nc_utf8proc_category_t;
+
+/** Bidirectional character classes. */
+typedef enum {
+  UTF8PROC_BIDI_CLASS_L     = 1, /**< Left-to-Right */
+  UTF8PROC_BIDI_CLASS_LRE   = 2, /**< Left-to-Right Embedding */
+  UTF8PROC_BIDI_CLASS_LRO   = 3, /**< Left-to-Right Override */
+  UTF8PROC_BIDI_CLASS_R     = 4, /**< Right-to-Left */
+  UTF8PROC_BIDI_CLASS_AL    = 5, /**< Right-to-Left Arabic */
+  UTF8PROC_BIDI_CLASS_RLE   = 6, /**< Right-to-Left Embedding */
+  UTF8PROC_BIDI_CLASS_RLO   = 7, /**< Right-to-Left Override */
+  UTF8PROC_BIDI_CLASS_PDF   = 8, /**< Pop Directional Format */
+  UTF8PROC_BIDI_CLASS_EN    = 9, /**< European Number */
+  UTF8PROC_BIDI_CLASS_ES   = 10, /**< European Separator */
+  UTF8PROC_BIDI_CLASS_ET   = 11, /**< European Number Terminator */
+  UTF8PROC_BIDI_CLASS_AN   = 12, /**< Arabic Number */
+  UTF8PROC_BIDI_CLASS_CS   = 13, /**< Common Number Separator */
+  UTF8PROC_BIDI_CLASS_NSM  = 14, /**< Nonspacing Mark */
+  UTF8PROC_BIDI_CLASS_BN   = 15, /**< Boundary Neutral */
+  UTF8PROC_BIDI_CLASS_B    = 16, /**< Paragraph Separator */
+  UTF8PROC_BIDI_CLASS_S    = 17, /**< Segment Separator */
+  UTF8PROC_BIDI_CLASS_WS   = 18, /**< Whitespace */
+  UTF8PROC_BIDI_CLASS_ON   = 19, /**< Other Neutrals */
+  UTF8PROC_BIDI_CLASS_LRI  = 20, /**< Left-to-Right Isolate */
+  UTF8PROC_BIDI_CLASS_RLI  = 21, /**< Right-to-Left Isolate */
+  UTF8PROC_BIDI_CLASS_FSI  = 22, /**< First Strong Isolate */
+  UTF8PROC_BIDI_CLASS_PDI  = 23, /**< Pop Directional Isolate */
+} nc_utf8proc_bidi_class_t;
+
+/** Decomposition type. */
+typedef enum {
+  UTF8PROC_DECOMP_TYPE_FONT      = 1, /**< Font */
+  UTF8PROC_DECOMP_TYPE_NOBREAK   = 2, /**< Nobreak */
+  UTF8PROC_DECOMP_TYPE_INITIAL   = 3, /**< Initial */
+  UTF8PROC_DECOMP_TYPE_MEDIAL    = 4, /**< Medial */
+  UTF8PROC_DECOMP_TYPE_FINAL     = 5, /**< Final */
+  UTF8PROC_DECOMP_TYPE_ISOLATED  = 6, /**< Isolated */
+  UTF8PROC_DECOMP_TYPE_CIRCLE    = 7, /**< Circle */
+  UTF8PROC_DECOMP_TYPE_SUPER     = 8, /**< Super */
+  UTF8PROC_DECOMP_TYPE_SUB       = 9, /**< Sub */
+  UTF8PROC_DECOMP_TYPE_VERTICAL = 10, /**< Vertical */
+  UTF8PROC_DECOMP_TYPE_WIDE     = 11, /**< Wide */
+  UTF8PROC_DECOMP_TYPE_NARROW   = 12, /**< Narrow */
+  UTF8PROC_DECOMP_TYPE_SMALL    = 13, /**< Small */
+  UTF8PROC_DECOMP_TYPE_SQUARE   = 14, /**< Square */
+  UTF8PROC_DECOMP_TYPE_FRACTION = 15, /**< Fraction */
+  UTF8PROC_DECOMP_TYPE_COMPAT   = 16, /**< Compat */
+} nc_utf8proc_decomp_type_t;
+
+/** Boundclass property. (TR29) */
+typedef enum {
+  UTF8PROC_BOUNDCLASS_START              =  0, /**< Start */
+  UTF8PROC_BOUNDCLASS_OTHER              =  1, /**< Other */
+  UTF8PROC_BOUNDCLASS_CR                 =  2, /**< Cr */
+  UTF8PROC_BOUNDCLASS_LF                 =  3, /**< Lf */
+  UTF8PROC_BOUNDCLASS_CONTROL            =  4, /**< Control */
+  UTF8PROC_BOUNDCLASS_EXTEND             =  5, /**< Extend */
+  UTF8PROC_BOUNDCLASS_L                  =  6, /**< L */
+  UTF8PROC_BOUNDCLASS_V                  =  7, /**< V */
+  UTF8PROC_BOUNDCLASS_T                  =  8, /**< T */
+  UTF8PROC_BOUNDCLASS_LV                 =  9, /**< Lv */
+  UTF8PROC_BOUNDCLASS_LVT                = 10, /**< Lvt */
+  UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR = 11, /**< Regional indicator */
+  UTF8PROC_BOUNDCLASS_SPACINGMARK        = 12, /**< Spacingmark */
+  UTF8PROC_BOUNDCLASS_PREPEND            = 13, /**< Prepend */
+  UTF8PROC_BOUNDCLASS_ZWJ                = 14, /**< Zero Width Joiner */
+  UTF8PROC_BOUNDCLASS_E_BASE             = 15, /**< Emoji Base */
+  UTF8PROC_BOUNDCLASS_E_MODIFIER         = 16, /**< Emoji Modifier */
+  UTF8PROC_BOUNDCLASS_GLUE_AFTER_ZWJ     = 17, /**< Glue_After_ZWJ */
+  UTF8PROC_BOUNDCLASS_E_BASE_GAZ         = 18, /**< E_BASE + GLUE_AFTER_ZJW */
+} nc_utf8proc_boundclass_t;
+
+/**
+ * Function pointer type passed to @ref utf8proc_map_custom and
+ * @ref utf8proc_decompose_custom, which is used to specify a user-defined
+ * mapping of codepoints to be applied in conjunction with other mappings.
+ */
+typedef nc_utf8proc_int32_t (*nc_utf8proc_custom_func)(nc_utf8proc_int32_t codepoint, void *data);
+
+/**
+ * Array containing the byte lengths of a UTF-8 encoded codepoint based
+ * on the first byte.
+ */
+//const nc_utf8proc_int8_t nc_utf8proc_utf8class[256];
+
+/**
+ * Returns the utf8proc API version as a string MAJOR.MINOR.PATCH
+ * (http://semver.org format), possibly with a "-dev" suffix for
+ * development versions.
+ */
+const char *nc_utf8proc_version(void);
+
+/**
+ * Returns an informative error string for the given utf8proc error code
+ * (e.g. the error codes returned by @ref utf8proc_map).
+ */
+const char *nc_utf8proc_errmsg(nc_utf8proc_ssize_t errcode);
+
+/**
+ * Reads a single codepoint from the UTF-8 sequence being pointed to by `str`.
+ * The maximum number of bytes read is `strlen`, unless `strlen` is
+ * negative (in which case up to 4 bytes are read).
+ *
+ * If a valid codepoint could be read, it is stored in the variable
+ * pointed to by `codepoint_ref`, otherwise that variable will be set to -1.
+ * In case of success, the number of bytes read is returned; otherwise, a
+ * negative error code is returned.
+ */
+UTF8PROC_DLLEXPORT nc_utf8proc_ssize_t nc_utf8proc_iterate(const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen, nc_utf8proc_int32_t *codepoint_ref);
+
+/**
+ * Check if a codepoint is valid (regardless of whether it has been
+ * assigned a value by the current Unicode standard).
+ *
+ * @return 1 if the given `codepoint` is valid and otherwise return 0.
+ */
+nc_utf8proc_bool nc_utf8proc_codepoint_valid(nc_utf8proc_int32_t codepoint);
+
+/**
+ * Encodes the codepoint as an UTF-8 string in the byte array pointed
+ * to by `dst`. This array must be at least 4 bytes long.
+ *
+ * In case of success the number of bytes written is returned, and
+ * otherwise 0 is returned.
+ *
+ * This function does not check whether `codepoint` is valid Unicode.
+ */
+nc_utf8proc_ssize_t nc_utf8proc_encode_char(nc_utf8proc_int32_t codepoint, nc_utf8proc_uint8_t *dst);
+
+/**
+ * Look up the properties for a given codepoint.
+ *
+ * @param codepoint The Unicode codepoint.
+ *
+ * @returns
+ * A pointer to a (constant) struct containing information about
+ * the codepoint.
+ * @par
+ * If the codepoint is unassigned or invalid, a pointer to a special struct is
+ * returned in which `category` is 0 (@ref UTF8PROC_CATEGORY_CN).
+ */
+const nc_utf8proc_property_t *nc_utf8proc_get_property(nc_utf8proc_int32_t codepoint);
+
+/** Decompose a codepoint into an array of codepoints.
+ *
+ * @param codepoint the codepoint.
+ * @param dst the destination buffer.
+ * @param bufsize the size of the destination buffer.
+ * @param options one or more of the following flags:
+ * - @ref UTF8PROC_REJECTNA  - return an error `codepoint` is unassigned
+ * - @ref UTF8PROC_IGNORE    - strip "default ignorable" codepoints
+ * - @ref UTF8PROC_CASEFOLD  - apply Unicode casefolding
+ * - @ref UTF8PROC_COMPAT    - replace certain codepoints with their
+ *                             compatibility decomposition
+ * - @ref UTF8PROC_CHARBOUND - insert 0xFF bytes before each grapheme cluster
+ * - @ref UTF8PROC_LUMP      - lump certain different codepoints together
+ * - @ref UTF8PROC_STRIPMARK - remove all character marks
+ * @param last_boundclass
+ * Pointer to an integer variable containing
+ * the previous codepoint's boundary class if the @ref UTF8PROC_CHARBOUND
+ * option is used.  Otherwise, this parameter is ignored.
+ *
+ * @return
+ * In case of success, the number of codepoints written is returned; in case
+ * of an error, a negative error code is returned (@ref utf8proc_errmsg).
+ * @par
+ * If the number of written codepoints would be bigger than `bufsize`, the
+ * required buffer size is returned, while the buffer will be overwritten with
+ * undefined data.
+ */
+nc_utf8proc_ssize_t nc_utf8proc_decompose_char(
+  nc_utf8proc_int32_t codepoint, nc_utf8proc_int32_t *dst, nc_utf8proc_ssize_t bufsize,
+  nc_utf8proc_option_t options, int *last_boundclass
+);
+
+/**
+ * The same as @ref utf8proc_decompose_char, but acts on a whole UTF-8
+ * string and orders the decomposed sequences correctly.
+ *
+ * If the @ref UTF8PROC_NULLTERM flag in `options` is set, processing
+ * will be stopped, when a NULL byte is encounted, otherwise `strlen`
+ * bytes are processed.  The result (in the form of 32-bit unicode
+ * codepoints) is written into the buffer being pointed to by
+ * `buffer` (which must contain at least `bufsize` entries).  In case of
+ * success, the number of codepoints written is returned; in case of an
+ * error, a negative error code is returned (@ref utf8proc_errmsg).
+ * See @ref utf8proc_decompose_custom to supply additional transformations.
+ *
+ * If the number of written codepoints would be bigger than `bufsize`, the
+ * required buffer size is returned, while the buffer will be overwritten with
+ * undefined data.
+ */
+nc_utf8proc_ssize_t nc_utf8proc_decompose(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen,
+  nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t bufsize, nc_utf8proc_option_t options
+);
+
+/**
+ * The same as @ref utf8proc_decompose, but also takes a `custom_func` mapping function
+ * that is called on each codepoint in `str` before any other transformations
+ * (along with a `custom_data` pointer that is passed through to `custom_func`).
+ * The `custom_func` argument is ignored if it is `NULL`.  See also @ref utf8proc_map_custom.
+ */
+nc_utf8proc_ssize_t nc_utf8proc_decompose_custom(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen,
+  nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t bufsize, nc_utf8proc_option_t options,
+  nc_utf8proc_custom_func custom_func, void *custom_data
+);
+
+/**
+ * Normalizes the sequence of `length` codepoints pointed to by `buffer`
+ * in-place (i.e., the result is also stored in `buffer`).
+ *
+ * @param buffer the (native-endian UTF-32) unicode codepoints to re-encode.
+ * @param length the length (in codepoints) of the buffer.
+ * @param options a bitwise or (`|`) of one or more of the following flags:
+ * - @ref UTF8PROC_NLF2LS  - convert LF, CRLF, CR and NEL into LS
+ * - @ref UTF8PROC_NLF2PS  - convert LF, CRLF, CR and NEL into PS
+ * - @ref UTF8PROC_NLF2LF  - convert LF, CRLF, CR and NEL into LF
+ * - @ref UTF8PROC_STRIPCC - strip or convert all non-affected control characters
+ * - @ref UTF8PROC_COMPOSE - try to combine decomposed codepoints into composite
+ *                           codepoints
+ * - @ref UTF8PROC_STABLE  - prohibit combining characters that would violate
+ *                           the unicode versioning stability
+ *
+ * @return
+ * In case of success, the length (in codepoints) of the normalized UTF-32 string is
+ * returned; otherwise, a negative error code is returned (@ref utf8proc_errmsg).
+ *
+ * @warning The entries of the array pointed to by `str` have to be in the
+ *          range `0x0000` to `0x10FFFF`. Otherwise, the program might crash!
+ */
+nc_utf8proc_ssize_t nc_utf8proc_normalize_utf32(nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t length, nc_utf8proc_option_t options);
+
+/**
+ * Reencodes the sequence of `length` codepoints pointed to by `buffer`
+ * UTF-8 data in-place (i.e., the result is also stored in `buffer`).
+ * Can optionally normalize the UTF-32 sequence prior to UTF-8 conversion.
+ *
+ * @param buffer the (native-endian UTF-32) unicode codepoints to re-encode.
+ * @param length the length (in codepoints) of the buffer.
+ * @param options a bitwise or (`|`) of one or more of the following flags:
+ * - @ref UTF8PROC_NLF2LS  - convert LF, CRLF, CR and NEL into LS
+ * - @ref UTF8PROC_NLF2PS  - convert LF, CRLF, CR and NEL into PS
+ * - @ref UTF8PROC_NLF2LF  - convert LF, CRLF, CR and NEL into LF
+ * - @ref UTF8PROC_STRIPCC - strip or convert all non-affected control characters
+ * - @ref UTF8PROC_COMPOSE - try to combine decomposed codepoints into composite
+ *                           codepoints
+ * - @ref UTF8PROC_STABLE  - prohibit combining characters that would violate
+ *                           the unicode versioning stability
+ * - @ref UTF8PROC_CHARBOUND - insert 0xFF bytes before each grapheme cluster
+ *
+ * @return
+ * In case of success, the length (in bytes) of the resulting nul-terminated
+ * UTF-8 string is returned; otherwise, a negative error code is returned
+ * (@ref utf8proc_errmsg).
+ *
+ * @warning The amount of free space pointed to by `buffer` must
+ *          exceed the amount of the input data by one byte, and the
+ *          entries of the array pointed to by `str` have to be in the
+ *          range `0x0000` to `0x10FFFF`. Otherwise, the program might crash!
+ */
+nc_utf8proc_ssize_t nc_utf8proc_reencode(nc_utf8proc_int32_t *buffer, nc_utf8proc_ssize_t length, nc_utf8proc_option_t options);
+
+/**
+ * Given a pair of consecutive codepoints, return whether a grapheme break is
+ * permitted between them (as defined by the extended grapheme clusters in UAX#29).
+ *
+ * @param state Beginning with Version 29 (Unicode 9.0.0), this algorithm requires
+ *              state to break graphemes. This state can be passed in as a pointer
+ *              in the `state` argument and should initially be set to 0. If the
+ *              state is not passed in (i.e. a null pointer is passed), UAX#29 rules
+ *              GB10/12/13 which require this state will not be applied, essentially
+ *              matching the rules in Unicode 8.0.0.
+ *
+ * @warning If the state parameter is used, `utf8proc_grapheme_break_stateful` must
+ *          be called IN ORDER on ALL potential breaks in a string.
+ */
+nc_utf8proc_bool nc_utf8proc_grapheme_break_stateful(
+    nc_utf8proc_int32_t codepoint1, nc_utf8proc_int32_t codepoint2, nc_utf8proc_int32_t *state);
+
+/**
+ * Same as @ref utf8proc_grapheme_break_stateful, except without support for the
+ * Unicode 9 additions to the algorithm. Supported for legacy reasons.
+ */
+nc_utf8proc_bool nc_utf8proc_grapheme_break(
+    nc_utf8proc_int32_t codepoint1, nc_utf8proc_int32_t codepoint2);
+
+
+/**
+ * Given a codepoint `c`, return the codepoint of the corresponding
+ * lower-case character, if any; otherwise (if there is no lower-case
+ * variant, or if `c` is not a valid codepoint) return `c`.
+ */
+nc_utf8proc_int32_t nc_utf8proc_tolower(nc_utf8proc_int32_t c);
+
+/**
+ * Given a codepoint `c`, return the codepoint of the corresponding
+ * upper-case character, if any; otherwise (if there is no upper-case
+ * variant, or if `c` is not a valid codepoint) return `c`.
+ */
+nc_utf8proc_int32_t nc_utf8proc_toupper(nc_utf8proc_int32_t c);
+
+/**
+ * Given a codepoint `c`, return the codepoint of the corresponding
+ * title-case character, if any; otherwise (if there is no title-case
+ * variant, or if `c` is not a valid codepoint) return `c`.
+ */
+nc_utf8proc_int32_t nc_utf8proc_totitle(nc_utf8proc_int32_t c);
+
+/**
+ * Given a codepoint, return a character width analogous to `wcwidth(codepoint)`,
+ * except that a width of 0 is returned for non-printable codepoints
+ * instead of -1 as in `wcwidth`.
+ *
+ * @note
+ * If you want to check for particular types of non-printable characters,
+ * (analogous to `isprint` or `iscntrl`), use @ref utf8proc_category. */
+int nc_utf8proc_charwidth(nc_utf8proc_int32_t codepoint);
+
+/**
+ * Return the Unicode category for the codepoint (one of the
+ * @ref utf8proc_category_t constants.)
+ */
+nc_utf8proc_category_t nc_utf8proc_category(nc_utf8proc_int32_t codepoint);
+
+/**
+ * Return the two-letter (nul-terminated) Unicode category string for
+ * the codepoint (e.g. `"Lu"` or `"Co"`).
+ */
+const char *nc_utf8proc_category_string(nc_utf8proc_int32_t codepoint);
+
+/**
+ * Maps the given UTF-8 string pointed to by `str` to a new UTF-8
+ * string, allocated dynamically by `malloc` and returned via `dstptr`.
+ *
+ * If the @ref UTF8PROC_NULLTERM flag in the `options` field is set,
+ * the length is determined by a NULL terminator, otherwise the
+ * parameter `strlen` is evaluated to determine the string length, but
+ * in any case the result will be NULL terminated (though it might
+ * contain NULL characters with the string if `str` contained NULL
+ * characters). Other flags in the `options` field are passed to the
+ * functions defined above, and regarded as described.  See also
+ * @ref utfproc_map_custom to supply a custom codepoint transformation.
+ *
+ * In case of success the length of the new string is returned,
+ * otherwise a negative error code is returned.
+ *
+ * @note The memory of the new UTF-8 string will have been allocated
+ * with `malloc`, and should therefore be deallocated with `free`.
+ */
+nc_utf8proc_ssize_t nc_utf8proc_map(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen, nc_utf8proc_uint8_t **dstptr, nc_utf8proc_option_t options
+);
+
+/**
+ * Like @ref utf8proc_map, but also takes a `custom_func` mapping function
+ * that is called on each codepoint in `str` before any other transformations
+ * (along with a `custom_data` pointer that is passed through to `custom_func`).
+ * The `custom_func` argument is ignored if it is `NULL`.
+ */
+nc_utf8proc_ssize_t nc_utf8proc_map_custom(
+  const nc_utf8proc_uint8_t *str, nc_utf8proc_ssize_t strlen, nc_utf8proc_uint8_t **dstptr, nc_utf8proc_option_t options,
+  nc_utf8proc_custom_func custom_func, void *custom_data
+);
+
+/** @name Unicode normalization
+ *
+ * Returns a pointer to newly allocated memory of a NFD, NFC, NFKD or NFKC
+ * normalized version of the null-terminated string `str`.  These
+ * are shortcuts to calling @ref utf8proc_map with @ref UTF8PROC_NULLTERM
+ * combined with @ref UTF8PROC_STABLE and flags indicating the normalization.
+ */
+/** @{ */
+/** NFD normalization (@ref UTF8PROC_DECOMPOSE). */
+UTF8PROC_DLLEXPORT nc_utf8proc_uint8_t *nc_utf8proc_NFD(const nc_utf8proc_uint8_t *str);
+/** NFC normalization (@ref UTF8PROC_COMPOSE). */
+UTF8PROC_DLLEXPORT nc_utf8proc_uint8_t *nc_utf8proc_NFC(const nc_utf8proc_uint8_t *str);
+/** NFKD normalization (@ref UTF8PROC_DECOMPOSE and @ref UTF8PROC_COMPAT). */
+UTF8PROC_DLLEXPORT nc_utf8proc_uint8_t *nc_utf8proc_NFKD(const nc_utf8proc_uint8_t *str);
+/** NFKC normalization (@ref UTF8PROC_COMPOSE and @ref UTF8PROC_COMPAT). */
+UTF8PROC_DLLEXPORT nc_utf8proc_uint8_t *nc_utf8proc_NFKC(const nc_utf8proc_uint8_t *str);
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libdispatch/utf8proc_data.c b/libdispatch/utf8proc_data.c
new file mode 100644
index 0000000..d3a380f
--- /dev/null
+++ b/libdispatch/utf8proc_data.c
@@ -0,0 +1,14386 @@
+const nc_utf8proc_uint16_t nc_utf8proc_sequences[] = {
+  97, 98, 99, 100, 101, 102, 103, 
+  104, 105, 106, 107, 108, 109, 110, 111, 
+  112, 113, 114, 115, 116, 117, 118, 119, 
+  120, 121, 122, 32, 32, 776, 32, 772, 
+  50, 51, 32, 769, 956, 32, 807, 49, 
+  49, 8260, 52, 49, 8260, 50, 51, 8260, 
+  52, 65, 768, 224, 65, 769, 225, 65, 
+  770, 226, 65, 771, 227, 65, 776, 228, 
+  65, 778, 229, 230, 67, 807, 231, 69, 
+  768, 232, 69, 769, 233, 69, 770, 234, 
+  69, 776, 235, 73, 768, 236, 73, 769, 
+  237, 73, 770, 238, 73, 776, 239, 240, 
+  78, 771, 241, 79, 768, 242, 79, 769, 
+  243, 79, 770, 244, 79, 771, 245, 79, 
+  776, 246, 248, 85, 768, 249, 85, 769, 
+  250, 85, 770, 251, 85, 776, 252, 89, 
+  769, 253, 254, 115, 115, 97, 768, 97, 
+  769, 97, 770, 97, 771, 97, 776, 97, 
+  778, 99, 807, 101, 768, 101, 769, 101, 
+  770, 101, 776, 105, 768, 105, 769, 105, 
+  770, 105, 776, 110, 771, 111, 768, 111, 
+  769, 111, 770, 111, 771, 111, 776, 117, 
+  768, 117, 769, 117, 770, 117, 776, 121, 
+  769, 121, 776, 65, 772, 257, 97, 772, 
+  65, 774, 259, 97, 774, 65, 808, 261, 
+  97, 808, 67, 769, 263, 99, 769, 67, 
+  770, 265, 99, 770, 67, 775, 267, 99, 
+  775, 67, 780, 269, 99, 780, 68, 780, 
+  271, 100, 780, 273, 69, 772, 275, 101, 
+  772, 69, 774, 277, 101, 774, 69, 775, 
+  279, 101, 775, 69, 808, 281, 101, 808, 
+  69, 780, 283, 101, 780, 71, 770, 285, 
+  103, 770, 71, 774, 287, 103, 774, 71, 
+  775, 289, 103, 775, 71, 807, 291, 103, 
+  807, 72, 770, 293, 104, 770, 295, 73, 
+  771, 297, 105, 771, 73, 772, 299, 105, 
+  772, 73, 774, 301, 105, 774, 73, 808, 
+  303, 105, 808, 73, 775, 105, 775, 73, 
+  74, 307, 105, 106, 74, 770, 309, 106, 
+  770, 75, 807, 311, 107, 807, 76, 769, 
+  314, 108, 769, 76, 807, 316, 108, 807, 
+  76, 780, 318, 108, 780, 76, 183, 320, 
+  108, 183, 322, 78, 769, 324, 110, 769, 
+  78, 807, 326, 110, 807, 78, 780, 328, 
+  110, 780, 700, 110, 331, 79, 772, 333, 
+  111, 772, 79, 774, 335, 111, 774, 79, 
+  779, 337, 111, 779, 339, 82, 769, 341, 
+  114, 769, 82, 807, 343, 114, 807, 82, 
+  780, 345, 114, 780, 83, 769, 347, 115, 
+  769, 83, 770, 349, 115, 770, 83, 807, 
+  351, 115, 807, 83, 780, 353, 115, 780, 
+  84, 807, 355, 116, 807, 84, 780, 357, 
+  116, 780, 359, 85, 771, 361, 117, 771, 
+  85, 772, 363, 117, 772, 85, 774, 365, 
+  117, 774, 85, 778, 367, 117, 778, 85, 
+  779, 369, 117, 779, 85, 808, 371, 117, 
+  808, 87, 770, 373, 119, 770, 89, 770, 
+  375, 121, 770, 89, 776, 255, 90, 769, 
+  378, 122, 769, 90, 775, 380, 122, 775, 
+  90, 780, 382, 122, 780, 595, 387, 389, 
+  596, 392, 598, 599, 396, 477, 601, 603, 
+  402, 608, 611, 617, 616, 409, 623, 626, 
+  629, 79, 795, 417, 111, 795, 419, 421, 
+  640, 424, 643, 429, 648, 85, 795, 432, 
+  117, 795, 650, 651, 436, 438, 658, 441, 
+  445, 68, 381, 454, 68, 382, 100, 382, 
+  76, 74, 457, 76, 106, 108, 106, 78, 
+  74, 460, 78, 106, 110, 106, 65, 780, 
+  462, 97, 780, 73, 780, 464, 105, 780, 
+  79, 780, 466, 111, 780, 85, 780, 468, 
+  117, 780, 220, 772, 470, 252, 772, 220, 
+  769, 472, 252, 769, 220, 780, 474, 252, 
+  780, 220, 768, 476, 252, 768, 196, 772, 
+  479, 228, 772, 550, 772, 481, 551, 772, 
+  198, 772, 483, 230, 772, 485, 71, 780, 
+  487, 103, 780, 75, 780, 489, 107, 780, 
+  79, 808, 491, 111, 808, 490, 772, 493, 
+  491, 772, 439, 780, 495, 658, 780, 106, 
+  780, 68, 90, 499, 68, 122, 100, 122, 
+  71, 769, 501, 103, 769, 405, 447, 78, 
+  768, 505, 110, 768, 197, 769, 507, 229, 
+  769, 198, 769, 509, 230, 769, 216, 769, 
+  511, 248, 769, 65, 783, 513, 97, 783, 
+  65, 785, 515, 97, 785, 69, 783, 517, 
+  101, 783, 69, 785, 519, 101, 785, 73, 
+  783, 521, 105, 783, 73, 785, 523, 105, 
+  785, 79, 783, 525, 111, 783, 79, 785, 
+  527, 111, 785, 82, 783, 529, 114, 783, 
+  82, 785, 531, 114, 785, 85, 783, 533, 
+  117, 783, 85, 785, 535, 117, 785, 83, 
+  806, 537, 115, 806, 84, 806, 539, 116, 
+  806, 541, 72, 780, 543, 104, 780, 414, 
+  547, 549, 65, 775, 551, 97, 775, 69, 
+  807, 553, 101, 807, 214, 772, 555, 246, 
+  772, 213, 772, 557, 245, 772, 79, 775, 
+  559, 111, 775, 558, 772, 561, 559, 772, 
+  89, 772, 563, 121, 772, 11365, 572, 410, 
+  11366, 578, 384, 649, 652, 583, 585, 587, 
+  589, 591, 614, 633, 635, 641, 32, 774, 
+  32, 775, 32, 778, 32, 808, 32, 771, 
+  32, 779, 661, 768, 769, 787, 776, 769, 
+  953, 881, 883, 697, 887, 32, 837, 59, 
+  1011, 168, 769, 913, 769, 940, 183, 917, 
+  769, 941, 919, 769, 942, 921, 769, 943, 
+  927, 769, 972, 933, 769, 973, 937, 769, 
+  974, 970, 769, 953, 776, 769, 945, 946, 
+  947, 948, 949, 950, 951, 952, 954, 955, 
+  957, 958, 959, 960, 961, 963, 964, 965, 
+  966, 967, 968, 969, 921, 776, 970, 933, 
+  776, 971, 945, 769, 949, 769, 951, 769, 
+  953, 769, 971, 769, 965, 776, 769, 953, 
+  776, 965, 776, 959, 769, 965, 769, 969, 
+  769, 983, 933, 978, 769, 978, 776, 985, 
+  987, 989, 991, 993, 995, 997, 999, 1001, 
+  1003, 1005, 1007, 962, 920, 1016, 931, 1010, 
+  1019, 891, 892, 893, 1045, 768, 1104, 1045, 
+  776, 1105, 1106, 1043, 769, 1107, 1108, 1109, 
+  1110, 1030, 776, 1111, 1112, 1113, 1114, 1115, 
+  1050, 769, 1116, 1048, 768, 1117, 1059, 774, 
+  1118, 1119, 1072, 1073, 1074, 1075, 1076, 1077, 
+  1078, 1079, 1080, 1048, 774, 1081, 1082, 1083, 
+  1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 
+  1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 
+  1100, 1101, 1102, 1103, 1080, 774, 1077, 768, 
+  1077, 776, 1075, 769, 1110, 776, 1082, 769, 
+  1080, 768, 1091, 774, 1121, 1123, 1125, 1127, 
+  1129, 1131, 1133, 1135, 1137, 1139, 1141, 1140, 
+  783, 1143, 1141, 783, 1145, 1147, 1149, 1151, 
+  1153, 1163, 1165, 1167, 1169, 1171, 1173, 1175, 
+  1177, 1179, 1181, 1183, 1185, 1187, 1189, 1191, 
+  1193, 1195, 1197, 1199, 1201, 1203, 1205, 1207, 
+  1209, 1211, 1213, 1215, 1231, 1046, 774, 1218, 
+  1078, 774, 1220, 1222, 1224, 1226, 1228, 1230, 
+  1040, 774, 1233, 1072, 774, 1040, 776, 1235, 
+  1072, 776, 1237, 1045, 774, 1239, 1077, 774, 
+  1241, 1240, 776, 1243, 1241, 776, 1046, 776, 
+  1245, 1078, 776, 1047, 776, 1247, 1079, 776, 
+  1249, 1048, 772, 1251, 1080, 772, 1048, 776, 
+  1253, 1080, 776, 1054, 776, 1255, 1086, 776, 
+  1257, 1256, 776, 1259, 1257, 776, 1069, 776, 
+  1261, 1101, 776, 1059, 772, 1263, 1091, 772, 
+  1059, 776, 1265, 1091, 776, 1059, 779, 1267, 
+  1091, 779, 1063, 776, 1269, 1095, 776, 1271, 
+  1067, 776, 1273, 1099, 776, 1275, 1277, 1279, 
+  1281, 1283, 1285, 1287, 1289, 1291, 1293, 1295, 
+  1297, 1299, 1301, 1303, 1305, 1307, 1309, 1311, 
+  1313, 1315, 1317, 1319, 1321, 1323, 1325, 1327, 
+  1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 
+  1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 
+  1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 
+  1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 
+  1409, 1410, 1411, 1412, 1413, 1414, 1381, 1410, 
+  1575, 1619, 1575, 1620, 1608, 1620, 1575, 1621, 
+  1610, 1620, 1575, 1652, 1608, 1652, 1735, 1652, 
+  1610, 1652, 1749, 1620, 1729, 1620, 1746, 1620, 
+  2344, 2364, 2352, 2364, 2355, 2364, 2325, 2364, 
+  2326, 2364, 2327, 2364, 2332, 2364, 2337, 2364, 
+  2338, 2364, 2347, 2364, 2351, 2364, 2503, 2494, 
+  2503, 2519, 2465, 2492, 2466, 2492, 2479, 2492, 
+  2610, 2620, 2616, 2620, 2582, 2620, 2583, 2620, 
+  2588, 2620, 2603, 2620, 2887, 2902, 2887, 2878, 
+  2887, 2903, 2849, 2876, 2850, 2876, 2962, 3031, 
+  3014, 3006, 3015, 3006, 3014, 3031, 3142, 3158, 
+  3263, 3285, 3270, 3285, 3270, 3286, 3270, 3266, 
+  3274, 3285, 3398, 3390, 3399, 3390, 3398, 3415, 
+  3545, 3530, 3545, 3535, 3548, 3530, 3545, 3551, 
+  3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 
+  3851, 3906, 4023, 3916, 4023, 3921, 4023, 3926, 
+  4023, 3931, 4023, 3904, 4021, 3953, 3954, 3953, 
+  3956, 4018, 3968, 4018, 3969, 4019, 3968, 4019, 
+  3969, 3953, 3968, 3986, 4023, 3996, 4023, 4001, 
+  4023, 4006, 4023, 4011, 4023, 3984, 4021, 4133, 
+  4142, 11520, 11521, 11522, 11523, 11524, 11525, 11526, 
+  11527, 11528, 11529, 11530, 11531, 11532, 11533, 11534, 
+  11535, 11536, 11537, 11538, 11539, 11540, 11541, 11542, 
+  11543, 11544, 11545, 11546, 11547, 11548, 11549, 11550, 
+  11551, 11552, 11553, 11554, 11555, 11556, 11557, 11559, 
+  11565, 4316, 5104, 5105, 5106, 5107, 5108, 5109, 
+  6917, 6965, 6919, 6965, 6921, 6965, 6923, 6965, 
+  6925, 6965, 6929, 6965, 6970, 6965, 6972, 6965, 
+  6974, 6965, 6975, 6965, 6978, 6965, 42571, 65, 
+  198, 66, 68, 69, 398, 71, 72, 73, 
+  74, 75, 76, 77, 78, 79, 546, 80, 
+  82, 84, 85, 87, 592, 593, 7426, 604, 
+  7446, 7447, 7453, 7461, 594, 597, 607, 609, 
+  613, 618, 7547, 669, 621, 7557, 671, 625, 
+  624, 627, 628, 632, 642, 427, 7452, 656, 
+  657, 65, 805, 7681, 97, 805, 66, 775, 
+  7683, 98, 775, 66, 803, 7685, 98, 803, 
+  66, 817, 7687, 98, 817, 199, 769, 7689, 
+  231, 769, 68, 775, 7691, 100, 775, 68, 
+  803, 7693, 100, 803, 68, 817, 7695, 100, 
+  817, 68, 807, 7697, 100, 807, 68, 813, 
+  7699, 100, 813, 274, 768, 7701, 275, 768, 
+  274, 769, 7703, 275, 769, 69, 813, 7705, 
+  101, 813, 69, 816, 7707, 101, 816, 552, 
+  774, 7709, 553, 774, 70, 775, 7711, 102, 
+  775, 71, 772, 7713, 103, 772, 72, 775, 
+  7715, 104, 775, 72, 803, 7717, 104, 803, 
+  72, 776, 7719, 104, 776, 72, 807, 7721, 
+  104, 807, 72, 814, 7723, 104, 814, 73, 
+  816, 7725, 105, 816, 207, 769, 7727, 239, 
+  769, 75, 769, 7729, 107, 769, 75, 803, 
+  7731, 107, 803, 75, 817, 7733, 107, 817, 
+  76, 803, 7735, 108, 803, 7734, 772, 7737, 
+  7735, 772, 76, 817, 7739, 108, 817, 76, 
+  813, 7741, 108, 813, 77, 769, 7743, 109, 
+  769, 77, 775, 7745, 109, 775, 77, 803, 
+  7747, 109, 803, 78, 775, 7749, 110, 775, 
+  78, 803, 7751, 110, 803, 78, 817, 7753, 
+  110, 817, 78, 813, 7755, 110, 813, 213, 
+  769, 7757, 245, 769, 213, 776, 7759, 245, 
+  776, 332, 768, 7761, 333, 768, 332, 769, 
+  7763, 333, 769, 80, 769, 7765, 112, 769, 
+  80, 775, 7767, 112, 775, 82, 775, 7769, 
+  114, 775, 82, 803, 7771, 114, 803, 7770, 
+  772, 7773, 7771, 772, 82, 817, 7775, 114, 
+  817, 83, 775, 7777, 115, 775, 83, 803, 
+  7779, 115, 803, 346, 775, 7781, 347, 775, 
+  352, 775, 7783, 353, 775, 7778, 775, 7785, 
+  7779, 775, 84, 775, 7787, 116, 775, 84, 
+  803, 7789, 116, 803, 84, 817, 7791, 116, 
+  817, 84, 813, 7793, 116, 813, 85, 804, 
+  7795, 117, 804, 85, 816, 7797, 117, 816, 
+  85, 813, 7799, 117, 813, 360, 769, 7801, 
+  361, 769, 362, 776, 7803, 363, 776, 86, 
+  771, 7805, 118, 771, 86, 803, 7807, 118, 
+  803, 87, 768, 7809, 119, 768, 87, 769, 
+  7811, 119, 769, 87, 776, 7813, 119, 776, 
+  87, 775, 7815, 119, 775, 87, 803, 7817, 
+  119, 803, 88, 775, 7819, 120, 775, 88, 
+  776, 7821, 120, 776, 89, 775, 7823, 121, 
+  775, 90, 770, 7825, 122, 770, 90, 803, 
+  7827, 122, 803, 90, 817, 7829, 122, 817, 
+  104, 817, 116, 776, 119, 778, 121, 778, 
+  97, 702, 383, 775, 223, 65, 803, 7841, 
+  97, 803, 65, 777, 7843, 97, 777, 194, 
+  769, 7845, 226, 769, 194, 768, 7847, 226, 
+  768, 194, 777, 7849, 226, 777, 194, 771, 
+  7851, 226, 771, 7840, 770, 7853, 7841, 770, 
+  258, 769, 7855, 259, 769, 258, 768, 7857, 
+  259, 768, 258, 777, 7859, 259, 777, 258, 
+  771, 7861, 259, 771, 7840, 774, 7863, 7841, 
+  774, 69, 803, 7865, 101, 803, 69, 777, 
+  7867, 101, 777, 69, 771, 7869, 101, 771, 
+  202, 769, 7871, 234, 769, 202, 768, 7873, 
+  234, 768, 202, 777, 7875, 234, 777, 202, 
+  771, 7877, 234, 771, 7864, 770, 7879, 7865, 
+  770, 73, 777, 7881, 105, 777, 73, 803, 
+  7883, 105, 803, 79, 803, 7885, 111, 803, 
+  79, 777, 7887, 111, 777, 212, 769, 7889, 
+  244, 769, 212, 768, 7891, 244, 768, 212, 
+  777, 7893, 244, 777, 212, 771, 7895, 244, 
+  771, 7884, 770, 7897, 7885, 770, 416, 769, 
+  7899, 417, 769, 416, 768, 7901, 417, 768, 
+  416, 777, 7903, 417, 777, 416, 771, 7905, 
+  417, 771, 416, 803, 7907, 417, 803, 85, 
+  803, 7909, 117, 803, 85, 777, 7911, 117, 
+  777, 431, 769, 7913, 432, 769, 431, 768, 
+  7915, 432, 768, 431, 777, 7917, 432, 777, 
+  431, 771, 7919, 432, 771, 431, 803, 7921, 
+  432, 803, 89, 768, 7923, 121, 768, 89, 
+  803, 7925, 121, 803, 89, 777, 7927, 121, 
+  777, 89, 771, 7929, 121, 771, 7931, 7933, 
+  7935, 945, 787, 945, 788, 7936, 768, 7937, 
+  768, 7936, 769, 7937, 769, 7936, 834, 7937, 
+  834, 913, 787, 7936, 913, 788, 7937, 7944, 
+  768, 7938, 7945, 768, 7939, 7944, 769, 7940, 
+  7945, 769, 7941, 7944, 834, 7942, 7945, 834, 
+  7943, 949, 787, 949, 788, 7952, 768, 7953, 
+  768, 7952, 769, 7953, 769, 917, 787, 7952, 
+  917, 788, 7953, 7960, 768, 7954, 7961, 768, 
+  7955, 7960, 769, 7956, 7961, 769, 7957, 951, 
+  787, 951, 788, 7968, 768, 7969, 768, 7968, 
+  769, 7969, 769, 7968, 834, 7969, 834, 919, 
+  787, 7968, 919, 788, 7969, 7976, 768, 7970, 
+  7977, 768, 7971, 7976, 769, 7972, 7977, 769, 
+  7973, 7976, 834, 7974, 7977, 834, 7975, 953, 
+  787, 953, 788, 7984, 768, 7985, 768, 7984, 
+  769, 7985, 769, 7984, 834, 7985, 834, 921, 
+  787, 7984, 921, 788, 7985, 7992, 768, 7986, 
+  7993, 768, 7987, 7992, 769, 7988, 7993, 769, 
+  7989, 7992, 834, 7990, 7993, 834, 7991, 959, 
+  787, 959, 788, 8000, 768, 8001, 768, 8000, 
+  769, 8001, 769, 927, 787, 8000, 927, 788, 
+  8001, 8008, 768, 8002, 8009, 768, 8003, 8008, 
+  769, 8004, 8009, 769, 8005, 965, 787, 965, 
+  788, 8016, 768, 965, 787, 768, 8017, 768, 
+  8016, 769, 965, 787, 769, 8017, 769, 8016, 
+  834, 965, 787, 834, 8017, 834, 933, 788, 
+  8017, 8025, 768, 8019, 8025, 769, 8021, 8025, 
+  834, 8023, 969, 787, 969, 788, 8032, 768, 
+  8033, 768, 8032, 769, 8033, 769, 8032, 834, 
+  8033, 834, 937, 787, 8032, 937, 788, 8033, 
+  8040, 768, 8034, 8041, 768, 8035, 8040, 769, 
+  8036, 8041, 769, 8037, 8040, 834, 8038, 8041, 
+  834, 8039, 945, 768, 949, 768, 951, 768, 
+  953, 768, 959, 768, 965, 768, 969, 768, 
+  7936, 837, 7936, 953, 7937, 837, 7937, 953, 
+  7938, 837, 7938, 953, 7939, 837, 7939, 953, 
+  7940, 837, 7940, 953, 7941, 837, 7941, 953, 
+  7942, 837, 7942, 953, 7943, 837, 7943, 953, 
+  7944, 837, 8064, 7945, 837, 8065, 7946, 837, 
+  8066, 7947, 837, 8067, 7948, 837, 8068, 7949, 
+  837, 8069, 7950, 837, 8070, 7951, 837, 8071, 
+  7968, 837, 7968, 953, 7969, 837, 7969, 953, 
+  7970, 837, 7970, 953, 7971, 837, 7971, 953, 
+  7972, 837, 7972, 953, 7973, 837, 7973, 953, 
+  7974, 837, 7974, 953, 7975, 837, 7975, 953, 
+  7976, 837, 8080, 7977, 837, 8081, 7978, 837, 
+  8082, 7979, 837, 8083, 7980, 837, 8084, 7981, 
+  837, 8085, 7982, 837, 8086, 7983, 837, 8087, 
+  8032, 837, 8032, 953, 8033, 837, 8033, 953, 
+  8034, 837, 8034, 953, 8035, 837, 8035, 953, 
+  8036, 837, 8036, 953, 8037, 837, 8037, 953, 
+  8038, 837, 8038, 953, 8039, 837, 8039, 953, 
+  8040, 837, 8096, 8041, 837, 8097, 8042, 837, 
+  8098, 8043, 837, 8099, 8044, 837, 8100, 8045, 
+  837, 8101, 8046, 837, 8102, 8047, 837, 8103, 
+  945, 774, 945, 772, 8048, 837, 8048, 953, 
+  945, 837, 945, 953, 940, 837, 940, 953, 
+  945, 834, 8118, 837, 945, 834, 953, 913, 
+  774, 8112, 913, 772, 8113, 913, 768, 8048, 
+  902, 8049, 913, 837, 8115, 32, 787, 32, 
+  834, 168, 834, 8052, 837, 8052, 953, 951, 
+  837, 951, 953, 942, 837, 942, 953, 951, 
+  834, 8134, 837, 951, 834, 953, 917, 768, 
+  8050, 904, 8051, 919, 768, 8052, 905, 8053, 
+  919, 837, 8131, 8127, 768, 8127, 769, 8127, 
+  834, 953, 774, 953, 772, 970, 768, 953, 
+  776, 768, 912, 953, 834, 970, 834, 953, 
+  776, 834, 921, 774, 8144, 921, 772, 8145, 
+  921, 768, 8054, 906, 8055, 8190, 768, 8190, 
+  769, 8190, 834, 965, 774, 965, 772, 971, 
+  768, 965, 776, 768, 944, 961, 787, 961, 
+  788, 965, 834, 971, 834, 965, 776, 834, 
+  933, 774, 8160, 933, 772, 8161, 933, 768, 
+  8058, 910, 8059, 929, 788, 8165, 168, 768, 
+  901, 96, 8060, 837, 8060, 953, 969, 837, 
+  969, 953, 974, 837, 974, 953, 969, 834, 
+  8182, 837, 969, 834, 953, 927, 768, 8056, 
+  908, 8057, 937, 768, 8060, 911, 8061, 937, 
+  837, 8179, 180, 32, 788, 8194, 8195, 8208, 
+  32, 819, 46, 46, 46, 46, 46, 46, 
+  8242, 8242, 8242, 8242, 8242, 8245, 8245, 8245, 
+  8245, 8245, 33, 33, 32, 773, 63, 63, 
+  63, 33, 33, 63, 8242, 8242, 8242, 8242, 
+  48, 52, 53, 54, 55, 56, 57, 43, 
+  8722, 61, 40, 41, 82, 115, 97, 47, 
+  99, 97, 47, 115, 67, 176, 67, 99, 
+  47, 111, 99, 47, 117, 400, 176, 70, 
+  78, 111, 81, 83, 77, 84, 69, 76, 
+  84, 77, 90, 937, 197, 70, 8526, 1488, 
+  1489, 1490, 1491, 70, 65, 88, 915, 928, 
+  8721, 49, 8260, 55, 49, 8260, 57, 49, 
+  8260, 49, 48, 49, 8260, 51, 50, 8260, 
+  51, 49, 8260, 53, 50, 8260, 53, 51, 
+  8260, 53, 52, 8260, 53, 49, 8260, 54, 
+  53, 8260, 54, 49, 8260, 56, 51, 8260, 
+  56, 53, 8260, 56, 55, 8260, 56, 49, 
+  8260, 8560, 73, 73, 8561, 73, 73, 73, 
+  8562, 73, 86, 8563, 86, 8564, 86, 73, 
+  8565, 86, 73, 73, 8566, 86, 73, 73, 
+  73, 8567, 73, 88, 8568, 88, 8569, 88, 
+  73, 8570, 88, 73, 73, 8571, 8572, 8573, 
+  8574, 8575, 105, 105, 105, 105, 105, 105, 
+  118, 118, 105, 118, 105, 105, 118, 105, 
+  105, 105, 105, 120, 120, 105, 120, 105, 
+  105, 8580, 48, 8260, 51, 8592, 824, 8594, 
+  824, 8596, 824, 8656, 824, 8660, 824, 8658, 
+  824, 8707, 824, 8712, 824, 8715, 824, 8739, 
+  824, 8741, 824, 8747, 8747, 8747, 8747, 8747, 
+  8750, 8750, 8750, 8750, 8750, 8764, 824, 8771, 
+  824, 8773, 824, 8776, 824, 61, 824, 8801, 
+  824, 8781, 824, 60, 824, 62, 824, 8804, 
+  824, 8805, 824, 8818, 824, 8819, 824, 8822, 
+  824, 8823, 824, 8826, 824, 8827, 824, 8834, 
+  824, 8835, 824, 8838, 824, 8839, 824, 8866, 
+  824, 8872, 824, 8873, 824, 8875, 824, 8828, 
+  824, 8829, 824, 8849, 824, 8850, 824, 8882, 
+  824, 8883, 824, 8884, 824, 8885, 824, 12296, 
+  12297, 49, 48, 49, 49, 49, 50, 49, 
+  51, 49, 52, 49, 53, 49, 54, 49, 
+  55, 49, 56, 49, 57, 50, 48, 40, 
+  49, 41, 40, 50, 41, 40, 51, 41, 
+  40, 52, 41, 40, 53, 41, 40, 54, 
+  41, 40, 55, 41, 40, 56, 41, 40, 
+  57, 41, 40, 49, 48, 41, 40, 49, 
+  49, 41, 40, 49, 50, 41, 40, 49, 
+  51, 41, 40, 49, 52, 41, 40, 49, 
+  53, 41, 40, 49, 54, 41, 40, 49, 
+  55, 41, 40, 49, 56, 41, 40, 49, 
+  57, 41, 40, 50, 48, 41, 49, 46, 
+  50, 46, 51, 46, 52, 46, 53, 46, 
+  54, 46, 55, 46, 56, 46, 57, 46, 
+  49, 48, 46, 49, 49, 46, 49, 50, 
+  46, 49, 51, 46, 49, 52, 46, 49, 
+  53, 46, 49, 54, 46, 49, 55, 46, 
+  49, 56, 46, 49, 57, 46, 50, 48, 
+  46, 40, 97, 41, 40, 98, 41, 40, 
+  99, 41, 40, 100, 41, 40, 101, 41, 
+  40, 102, 41, 40, 103, 41, 40, 104, 
+  41, 40, 105, 41, 40, 106, 41, 40, 
+  107, 41, 40, 108, 41, 40, 109, 41, 
+  40, 110, 41, 40, 111, 41, 40, 112, 
+  41, 40, 113, 41, 40, 114, 41, 40, 
+  115, 41, 40, 116, 41, 40, 117, 41, 
+  40, 118, 41, 40, 119, 41, 40, 120, 
+  41, 40, 121, 41, 40, 122, 41, 9424, 
+  9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 
+  9433, 9434, 9435, 9436, 9437, 9438, 9439, 9440, 
+  9441, 83, 9442, 9443, 9444, 9445, 9446, 9447, 
+  89, 9448, 9449, 8747, 8747, 8747, 8747, 58, 
+  58, 61, 61, 61, 61, 61, 61, 10973, 
+  824, 11312, 11313, 11314, 11315, 11316, 11317, 11318, 
+  11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 
+  11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 
+  11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, 
+  11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 
+  11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 
+  11361, 619, 7549, 637, 11368, 11370, 11372, 11379, 
+  11382, 575, 576, 11393, 11395, 11397, 11399, 11401, 
+  11403, 11405, 11407, 11409, 11411, 11413, 11415, 11417, 
+  11419, 11421, 11423, 11425, 11427, 11429, 11431, 11433, 
+  11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 
+  11451, 11453, 11455, 11457, 11459, 11461, 11463, 11465, 
+  11467, 11469, 11471, 11473, 11475, 11477, 11479, 11481, 
+  11483, 11485, 11487, 11489, 11491, 11500, 11502, 11507, 
+  11617, 27597, 40863, 19968, 20008, 20022, 20031, 20057, 
+  20101, 20108, 20128, 20154, 20799, 20837, 20843, 20866, 
+  20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269, 
+  21274, 21304, 21313, 21340, 21353, 21378, 21430, 21448, 
+  21475, 22231, 22303, 22763, 22786, 22794, 22805, 22823, 
+  22899, 23376, 23424, 23544, 23567, 23586, 23608, 23662, 
+  23665, 24027, 24037, 24049, 24062, 24178, 24186, 24191, 
+  24308, 24318, 24331, 24339, 24400, 24417, 24435, 24515, 
+  25096, 25142, 25163, 25903, 25908, 25991, 26007, 26020, 
+  26041, 26080, 26085, 26352, 26376, 26408, 27424, 27490, 
+  27513, 27571, 27595, 27604, 27611, 27663, 27668, 27700, 
+  28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275, 
+  29356, 29572, 29577, 29916, 29926, 29976, 29983, 29992, 
+  30000, 30091, 30098, 30326, 30333, 30382, 30399, 30446, 
+  30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, 
+  31481, 31859, 31992, 32566, 32593, 32650, 32701, 32769, 
+  32780, 32786, 32819, 32895, 32905, 33251, 33258, 33267, 
+  33276, 33292, 33307, 33311, 33390, 33394, 33400, 34381, 
+  34411, 34880, 34892, 34915, 35198, 35211, 35282, 35328, 
+  35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, 
+  36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318, 
+  37324, 37329, 38263, 38272, 38428, 38582, 38585, 38632, 
+  38737, 38750, 38754, 38761, 38859, 38893, 38899, 38913, 
+  39080, 39131, 39135, 39318, 39321, 39340, 39592, 39640, 
+  39647, 39717, 39727, 39730, 39740, 39770, 40165, 40565, 
+  40575, 40613, 40635, 40643, 40653, 40657, 40697, 40701, 
+  40718, 40723, 40736, 40763, 40778, 40786, 40845, 40860, 
+  40864, 12306, 21316, 21317, 12363, 12441, 12365, 12441, 
+  12367, 12441, 12369, 12441, 12371, 12441, 12373, 12441, 
+  12375, 12441, 12377, 12441, 12379, 12441, 12381, 12441, 
+  12383, 12441, 12385, 12441, 12388, 12441, 12390, 12441, 
+  12392, 12441, 12399, 12441, 12399, 12442, 12402, 12441, 
+  12402, 12442, 12405, 12441, 12405, 12442, 12408, 12441, 
+  12408, 12442, 12411, 12441, 12411, 12442, 12358, 12441, 
+  32, 12441, 32, 12442, 12445, 12441, 12424, 12426, 
+  12459, 12441, 12461, 12441, 12463, 12441, 12465, 12441, 
+  12467, 12441, 12469, 12441, 12471, 12441, 12473, 12441, 
+  12475, 12441, 12477, 12441, 12479, 12441, 12481, 12441, 
+  12484, 12441, 12486, 12441, 12488, 12441, 12495, 12441, 
+  12495, 12442, 12498, 12441, 12498, 12442, 12501, 12441, 
+  12501, 12442, 12504, 12441, 12504, 12442, 12507, 12441, 
+  12507, 12442, 12454, 12441, 12527, 12441, 12528, 12441, 
+  12529, 12441, 12530, 12441, 12541, 12441, 12467, 12488, 
+  4352, 4353, 4522, 4354, 4524, 4525, 4355, 4356, 
+  4357, 4528, 4529, 4530, 4531, 4532, 4533, 4378, 
+  4358, 4359, 4360, 4385, 4361, 4362, 4363, 4364, 
+  4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, 
+  4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 
+  4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 
+  4467, 4468, 4469, 4448, 4372, 4373, 4551, 4552, 
+  4556, 4558, 4563, 4567, 4569, 4380, 4573, 4575, 
+  4381, 4382, 4384, 4386, 4387, 4391, 4393, 4395, 
+  4396, 4397, 4398, 4399, 4402, 4406, 4416, 4423, 
+  4428, 4593, 4594, 4439, 4440, 4441, 4484, 4485, 
+  4488, 4497, 4498, 4500, 4510, 4513, 19977, 22235, 
+  19978, 20013, 19979, 30002, 19993, 19969, 22825, 22320, 
+  40, 4352, 41, 40, 4354, 41, 40, 4355, 
+  41, 40, 4357, 41, 40, 4358, 41, 40, 
+  4359, 41, 40, 4361, 41, 40, 4363, 41, 
+  40, 4364, 41, 40, 4366, 41, 40, 4367, 
+  41, 40, 4368, 41, 40, 4369, 41, 40, 
+  4370, 41, 40, 4352, 4449, 41, 40, 4354, 
+  4449, 41, 40, 4355, 4449, 41, 40, 4357, 
+  4449, 41, 40, 4358, 4449, 41, 40, 4359, 
+  4449, 41, 40, 4361, 4449, 41, 40, 4363, 
+  4449, 41, 40, 4364, 4449, 41, 40, 4366, 
+  4449, 41, 40, 4367, 4449, 41, 40, 4368, 
+  4449, 41, 40, 4369, 4449, 41, 40, 4370, 
+  4449, 41, 40, 4364, 4462, 41, 40, 4363, 
+  4457, 4364, 4453, 4523, 41, 40, 4363, 4457, 
+  4370, 4462, 41, 40, 19968, 41, 40, 20108, 
+  41, 40, 19977, 41, 40, 22235, 41, 40, 
+  20116, 41, 40, 20845, 41, 40, 19971, 41, 
+  40, 20843, 41, 40, 20061, 41, 40, 21313, 
+  41, 40, 26376, 41, 40, 28779, 41, 40, 
+  27700, 41, 40, 26408, 41, 40, 37329, 41, 
+  40, 22303, 41, 40, 26085, 41, 40, 26666, 
+  41, 40, 26377, 41, 40, 31038, 41, 40, 
+  21517, 41, 40, 29305, 41, 40, 36001, 41, 
+  40, 31069, 41, 40, 21172, 41, 40, 20195, 
+  41, 40, 21628, 41, 40, 23398, 41, 40, 
+  30435, 41, 40, 20225, 41, 40, 36039, 41, 
+  40, 21332, 41, 40, 31085, 41, 40, 20241, 
+  41, 40, 33258, 41, 40, 33267, 41, 21839, 
+  24188, 31631, 80, 84, 69, 50, 49, 50, 
+  50, 50, 51, 50, 52, 50, 53, 50, 
+  54, 50, 55, 50, 56, 50, 57, 51, 
+  48, 51, 49, 51, 50, 51, 51, 51, 
+  52, 51, 53, 4352, 4449, 4354, 4449, 4355, 
+  4449, 4357, 4449, 4358, 4449, 4359, 4449, 4361, 
+  4449, 4363, 4449, 4364, 4449, 4366, 4449, 4367, 
+  4449, 4368, 4449, 4369, 4449, 4370, 4449, 4366, 
+  4449, 4535, 4352, 4457, 4364, 4462, 4363, 4468, 
+  4363, 4462, 20116, 20845, 19971, 20061, 26666, 26377, 
+  31038, 21517, 29305, 36001, 31069, 21172, 31192, 30007, 
+  36969, 20778, 21360, 27880, 38917, 20241, 20889, 27491, 
+  24038, 21491, 21307, 23447, 23398, 30435, 20225, 36039, 
+  21332, 22812, 51, 54, 51, 55, 51, 56, 
+  51, 57, 52, 48, 52, 49, 52, 50, 
+  52, 51, 52, 52, 52, 53, 52, 54, 
+  52, 55, 52, 56, 52, 57, 53, 48, 
+  49, 26376, 50, 26376, 51, 26376, 52, 26376, 
+  53, 26376, 54, 26376, 55, 26376, 56, 26376, 
+  57, 26376, 49, 48, 26376, 49, 49, 26376, 
+  49, 50, 26376, 72, 103, 101, 114, 103, 
+  101, 86, 76, 84, 68, 12450, 12452, 12454, 
+  12456, 12458, 12459, 12461, 12463, 12465, 12467, 12469, 
+  12471, 12473, 12475, 12477, 12479, 12481, 12484, 12486, 
+  12488, 12490, 12491, 12492, 12493, 12494, 12495, 12498, 
+  12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 
+  12516, 12518, 12520, 12521, 12522, 12523, 12524, 12525, 
+  12527, 12528, 12529, 12530, 12450, 12497, 12540, 12488, 
+  12450, 12523, 12501, 12449, 12450, 12531, 12506, 12450, 
+  12450, 12540, 12523, 12452, 12491, 12531, 12464, 12452, 
+  12531, 12481, 12454, 12457, 12531, 12456, 12473, 12463, 
+  12540, 12489, 12456, 12540, 12459, 12540, 12458, 12531, 
+  12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 
+  12521, 12483, 12488, 12459, 12525, 12522, 12540, 12460, 
+  12525, 12531, 12460, 12531, 12510, 12462, 12460, 12462, 
+  12491, 12540, 12461, 12517, 12522, 12540, 12462, 12523, 
+  12480, 12540, 12461, 12525, 12461, 12525, 12464, 12521, 
+  12512, 12461, 12525, 12513, 12540, 12488, 12523, 12461, 
+  12525, 12527, 12483, 12488, 12464, 12521, 12512, 12464, 
+  12521, 12512, 12488, 12531, 12463, 12523, 12476, 12452, 
+  12525, 12463, 12525, 12540, 12493, 12465, 12540, 12473, 
+  12467, 12523, 12490, 12467, 12540, 12509, 12469, 12452, 
+  12463, 12523, 12469, 12531, 12481, 12540, 12512, 12471, 
+  12522, 12531, 12464, 12475, 12531, 12481, 12475, 12531, 
+  12488, 12480, 12540, 12473, 12487, 12471, 12489, 12523, 
+  12488, 12531, 12490, 12494, 12494, 12483, 12488, 12495, 
+  12452, 12484, 12497, 12540, 12475, 12531, 12488, 12497, 
+  12540, 12484, 12496, 12540, 12524, 12523, 12500, 12450, 
+  12473, 12488, 12523, 12500, 12463, 12523, 12500, 12467, 
+  12499, 12523, 12501, 12449, 12521, 12483, 12489, 12501, 
+  12451, 12540, 12488, 12502, 12483, 12471, 12455, 12523, 
+  12501, 12521, 12531, 12504, 12463, 12479, 12540, 12523, 
+  12506, 12477, 12506, 12491, 12498, 12504, 12523, 12484, 
+  12506, 12531, 12473, 12506, 12540, 12472, 12505, 12540, 
+  12479, 12509, 12452, 12531, 12488, 12508, 12523, 12488, 
+  12507, 12531, 12509, 12531, 12489, 12507, 12540, 12523, 
+  12507, 12540, 12531, 12510, 12452, 12463, 12525, 12510, 
+  12452, 12523, 12510, 12483, 12495, 12510, 12523, 12463, 
+  12510, 12531, 12471, 12519, 12531, 12511, 12463, 12525, 
+  12531, 12511, 12522, 12511, 12522, 12496, 12540, 12523, 
+  12513, 12460, 12513, 12460, 12488, 12531, 12513, 12540, 
+  12488, 12523, 12516, 12540, 12489, 12516, 12540, 12523, 
+  12518, 12450, 12531, 12522, 12483, 12488, 12523, 12522, 
+  12521, 12523, 12500, 12540, 12523, 12540, 12502, 12523, 
+  12524, 12512, 12524, 12531, 12488, 12466, 12531, 12527, 
+  12483, 12488, 48, 28857, 49, 28857, 50, 28857, 
+  51, 28857, 52, 28857, 53, 28857, 54, 28857, 
+  55, 28857, 56, 28857, 57, 28857, 49, 48, 
+  28857, 49, 49, 28857, 49, 50, 28857, 49, 
+  51, 28857, 49, 52, 28857, 49, 53, 28857, 
+  49, 54, 28857, 49, 55, 28857, 49, 56, 
+  28857, 49, 57, 28857, 50, 48, 28857, 50, 
+  49, 28857, 50, 50, 28857, 50, 51, 28857, 
+  50, 52, 28857, 104, 80, 97, 100, 97, 
+  65, 85, 98, 97, 114, 111, 86, 112, 
+  99, 100, 109, 100, 109, 178, 100, 109, 
+  179, 73, 85, 24179, 25104, 26157, 21644, 22823, 
+  27491, 26126, 27835, 26666, 24335, 20250, 31038, 112, 
+  65, 110, 65, 956, 65, 109, 65, 107, 
+  65, 75, 66, 77, 66, 71, 66, 99, 
+  97, 108, 107, 99, 97, 108, 112, 70, 
+  110, 70, 956, 70, 956, 103, 109, 103, 
+  107, 103, 72, 122, 107, 72, 122, 77, 
+  72, 122, 71, 72, 122, 84, 72, 122, 
+  956, 8467, 109, 8467, 100, 8467, 107, 8467, 
+  102, 109, 110, 109, 956, 109, 109, 109, 
+  99, 109, 107, 109, 109, 109, 178, 99, 
+  109, 178, 109, 178, 107, 109, 178, 109, 
+  109, 179, 99, 109, 179, 109, 179, 107, 
+  109, 179, 109, 8725, 115, 109, 8725, 115, 
+  178, 80, 97, 107, 80, 97, 77, 80, 
+  97, 71, 80, 97, 114, 97, 100, 114, 
+  97, 100, 8725, 115, 114, 97, 100, 8725, 
+  115, 178, 112, 115, 110, 115, 956, 115, 
+  109, 115, 112, 86, 110, 86, 956, 86, 
+  109, 86, 107, 86, 77, 86, 112, 87, 
+  110, 87, 956, 87, 109, 87, 107, 87, 
+  77, 87, 107, 937, 77, 937, 97, 46, 
+  109, 46, 66, 113, 99, 99, 99, 100, 
+  67, 8725, 107, 103, 67, 111, 46, 100, 
+  66, 71, 121, 104, 97, 72, 80, 105, 
+  110, 75, 75, 75, 77, 107, 116, 108, 
+  109, 108, 110, 108, 111, 103, 108, 120, 
+  109, 98, 109, 105, 108, 109, 111, 108, 
+  80, 72, 112, 46, 109, 46, 80, 80, 
+  77, 80, 82, 115, 114, 83, 118, 87, 
+  98, 86, 8725, 109, 65, 8725, 109, 49, 
+  26085, 50, 26085, 51, 26085, 52, 26085, 53, 
+  26085, 54, 26085, 55, 26085, 56, 26085, 57, 
+  26085, 49, 48, 26085, 49, 49, 26085, 49, 
+  50, 26085, 49, 51, 26085, 49, 52, 26085, 
+  49, 53, 26085, 49, 54, 26085, 49, 55, 
+  26085, 49, 56, 26085, 49, 57, 26085, 50, 
+  48, 26085, 50, 49, 26085, 50, 50, 26085, 
+  50, 51, 26085, 50, 52, 26085, 50, 53, 
+  26085, 50, 54, 26085, 50, 55, 26085, 50, 
+  56, 26085, 50, 57, 26085, 51, 48, 26085, 
+  51, 49, 26085, 103, 97, 108, 42561, 42563, 
+  42565, 42567, 42569, 42573, 42575, 42577, 42579, 42581, 
+  42583, 42585, 42587, 42589, 42591, 42593, 42595, 42597, 
+  42599, 42601, 42603, 42605, 42625, 42627, 42629, 42631, 
+  42633, 42635, 42637, 42639, 42641, 42643, 42645, 42647, 
+  42649, 42651, 42787, 42789, 42791, 42793, 42795, 42797, 
+  42799, 42803, 42805, 42807, 42809, 42811, 42813, 42815, 
+  42817, 42819, 42821, 42823, 42825, 42827, 42829, 42831, 
+  42833, 42835, 42837, 42839, 42841, 42843, 42845, 42847, 
+  42849, 42851, 42853, 42855, 42857, 42859, 42861, 42863, 
+  42874, 42876, 7545, 42879, 42881, 42883, 42885, 42887, 
+  42892, 42897, 42899, 42903, 42905, 42907, 42909, 42911, 
+  42913, 42915, 42917, 42919, 42921, 620, 670, 647, 
+  43859, 42933, 42935, 294, 43831, 43858, 5024, 5025, 
+  5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 
+  5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 
+  5042, 5043, 5044, 5045, 5046, 5047, 5048, 5049, 
+  5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 
+  5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 
+  5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 
+  5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 
+  5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089, 
+  5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 
+  5098, 5099, 5100, 5101, 5102, 5103, 35912, 26356, 
+  36040, 28369, 20018, 21477, 22865, 21895, 22856, 25078, 
+  30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, 
+  28889, 29662, 33853, 37226, 39409, 20098, 21365, 27396, 
+  29211, 34349, 40478, 23888, 28651, 34253, 35172, 25289, 
+  33240, 34847, 24266, 26391, 28010, 29436, 37070, 20358, 
+  20919, 21214, 25796, 27347, 29200, 30439, 34310, 34396, 
+  36335, 38706, 39791, 40442, 30860, 31103, 32160, 33737, 
+  37636, 35542, 22751, 24324, 31840, 32894, 29282, 30922, 
+  36034, 38647, 22744, 23650, 27155, 28122, 28431, 32047, 
+  32311, 38475, 21202, 32907, 20956, 20940, 31260, 32190, 
+  33777, 38517, 35712, 25295, 35582, 20025, 23527, 24594, 
+  29575, 30064, 21271, 30971, 20415, 24489, 19981, 27852, 
+  25976, 32034, 21443, 22622, 30465, 33865, 35498, 27578, 
+  27784, 25342, 33509, 25504, 30053, 20142, 20841, 20937, 
+  26753, 31975, 33391, 35538, 37327, 21237, 21570, 24300, 
+  26053, 28670, 31018, 38317, 39530, 40599, 40654, 26310, 
+  27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, 
+  29833, 31178, 32244, 32879, 36646, 34030, 36899, 37706, 
+  21015, 21155, 21693, 28872, 35010, 24265, 24565, 25467, 
+  27566, 31806, 29557, 20196, 22265, 23994, 24604, 29618, 
+  29801, 32666, 32838, 37428, 38646, 38728, 38936, 20363, 
+  31150, 37300, 38584, 24801, 20102, 20698, 23534, 23615, 
+  26009, 29134, 30274, 34044, 36988, 26248, 38446, 21129, 
+  26491, 26611, 27969, 28316, 29705, 30041, 30827, 32016, 
+  39006, 25134, 38520, 20523, 23833, 28138, 36650, 24459, 
+  24900, 26647, 38534, 21033, 21519, 23653, 26131, 26446, 
+  26792, 27877, 29702, 30178, 32633, 35023, 35041, 38626, 
+  21311, 28346, 21533, 29136, 29848, 34298, 38563, 40023, 
+  40607, 26519, 28107, 33256, 31520, 31890, 29376, 28825, 
+  35672, 20160, 33590, 21050, 20999, 24230, 25299, 31958, 
+  23429, 27934, 26292, 36667, 38477, 24275, 20800, 21952, 
+  22618, 26228, 20958, 29482, 30410, 31036, 31070, 31077, 
+  31119, 38742, 31934, 34322, 35576, 36920, 37117, 39151, 
+  39164, 39208, 40372, 37086, 38583, 20398, 20711, 20813, 
+  21193, 21220, 21329, 21917, 22022, 22120, 22592, 22696, 
+  23652, 24724, 24936, 24974, 25074, 25935, 26082, 26257, 
+  26757, 28023, 28186, 28450, 29038, 29227, 29730, 30865, 
+  31049, 31048, 31056, 31062, 31117, 31118, 31296, 31361, 
+  31680, 32265, 32321, 32626, 32773, 33261, 33401, 33879, 
+  35088, 35222, 35585, 35641, 36051, 36104, 36790, 38627, 
+  38911, 38971, 24693, 55376, 57070, 33304, 20006, 20917, 
+  20840, 20352, 20805, 20864, 21191, 21242, 21845, 21913, 
+  21986, 22707, 22852, 22868, 23138, 23336, 24274, 24281, 
+  24425, 24493, 24792, 24910, 24840, 24928, 25140, 25540, 
+  25628, 25682, 25942, 26395, 26454, 28379, 28363, 28702, 
+  30631, 29237, 29359, 29809, 29958, 30011, 30237, 30239, 
+  30427, 30452, 30538, 30528, 30924, 31409, 31867, 32091, 
+  32574, 33618, 33775, 34681, 35137, 35206, 35519, 35531, 
+  35565, 35722, 36664, 36978, 37273, 37494, 38524, 38875, 
+  38923, 39698, 55370, 56394, 55370, 56388, 55372, 57301, 
+  15261, 16408, 16441, 55380, 56905, 55383, 56528, 55391, 
+  57043, 40771, 40846, 102, 102, 102, 105, 102, 
+  108, 102, 102, 105, 102, 102, 108, 383, 
+  116, 115, 116, 1396, 1398, 1396, 1381, 1396, 
+  1387, 1406, 1398, 1396, 1389, 1497, 1460, 1522, 
+  1463, 1506, 1492, 1499, 1500, 1501, 1512, 1514, 
+  1513, 1473, 1513, 1474, 64329, 1473, 64329, 1474, 
+  1488, 1463, 1488, 1464, 1488, 1468, 1489, 1468, 
+  1490, 1468, 1491, 1468, 1492, 1468, 1493, 1468, 
+  1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 
+  1499, 1468, 1500, 1468, 1502, 1468, 1504, 1468, 
+  1505, 1468, 1507, 1468, 1508, 1468, 1510, 1468, 
+  1511, 1468, 1512, 1468, 1513, 1468, 1514, 1468, 
+  1493, 1465, 1489, 1471, 1499, 1471, 1508, 1471, 
+  1488, 1500, 1649, 1659, 1662, 1664, 1658, 1663, 
+  1657, 1700, 1702, 1668, 1667, 1670, 1671, 1677, 
+  1676, 1678, 1672, 1688, 1681, 1705, 1711, 1715, 
+  1713, 1722, 1723, 1728, 1729, 1726, 1746, 1747, 
+  1709, 1735, 1734, 1736, 1655, 1739, 1733, 1737, 
+  1744, 1609, 1574, 1575, 1574, 1749, 1574, 1608, 
+  1574, 1735, 1574, 1734, 1574, 1736, 1574, 1744, 
+  1574, 1609, 1740, 1574, 1580, 1574, 1581, 1574, 
+  1605, 1574, 1610, 1576, 1580, 1576, 1581, 1576, 
+  1582, 1576, 1605, 1576, 1609, 1576, 1610, 1578, 
+  1580, 1578, 1581, 1578, 1582, 1578, 1605, 1578, 
+  1609, 1578, 1610, 1579, 1580, 1579, 1605, 1579, 
+  1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581, 
+  1580, 1581, 1605, 1582, 1580, 1582, 1581, 1582, 
+  1605, 1587, 1580, 1587, 1581, 1587, 1582, 1587, 
+  1605, 1589, 1581, 1589, 1605, 1590, 1580, 1590, 
+  1581, 1590, 1582, 1590, 1605, 1591, 1581, 1591, 
+  1605, 1592, 1605, 1593, 1580, 1593, 1605, 1594, 
+  1580, 1594, 1605, 1601, 1580, 1601, 1581, 1601, 
+  1582, 1601, 1605, 1601, 1609, 1601, 1610, 1602, 
+  1581, 1602, 1605, 1602, 1609, 1602, 1610, 1603, 
+  1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603, 
+  1604, 1603, 1605, 1603, 1609, 1603, 1610, 1604, 
+  1580, 1604, 1581, 1604, 1582, 1604, 1605, 1604, 
+  1609, 1604, 1610, 1605, 1580, 1605, 1581, 1605, 
+  1582, 1605, 1605, 1605, 1609, 1605, 1610, 1606, 
+  1580, 1606, 1581, 1606, 1582, 1606, 1605, 1606, 
+  1609, 1606, 1610, 1607, 1580, 1607, 1605, 1607, 
+  1609, 1607, 1610, 1610, 1580, 1610, 1581, 1610, 
+  1582, 1610, 1605, 1610, 1609, 1610, 1610, 1584, 
+  1648, 1585, 1648, 1609, 1648, 32, 1612, 1617, 
+  32, 1613, 1617, 32, 1614, 1617, 32, 1615, 
+  1617, 32, 1616, 1617, 32, 1617, 1648, 1574, 
+  1585, 1574, 1586, 1574, 1606, 1576, 1585, 1576, 
+  1586, 1576, 1606, 1578, 1585, 1578, 1586, 1578, 
+  1606, 1579, 1585, 1579, 1586, 1579, 1606, 1605, 
+  1575, 1606, 1585, 1606, 1586, 1606, 1606, 1610, 
+  1585, 1610, 1586, 1610, 1606, 1574, 1582, 1574, 
+  1607, 1576, 1607, 1578, 1607, 1589, 1582, 1604, 
+  1607, 1606, 1607, 1607, 1648, 1610, 1607, 1579, 
+  1607, 1587, 1607, 1588, 1605, 1588, 1607, 1600, 
+  1614, 1617, 1600, 1615, 1617, 1600, 1616, 1617, 
+  1591, 1609, 1591, 1610, 1593, 1609, 1593, 1610, 
+  1594, 1609, 1594, 1610, 1587, 1609, 1587, 1610, 
+  1588, 1609, 1588, 1610, 1581, 1609, 1581, 1610, 
+  1580, 1609, 1580, 1610, 1582, 1609, 1582, 1610, 
+  1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, 
+  1588, 1580, 1588, 1581, 1588, 1582, 1588, 1585, 
+  1587, 1585, 1589, 1585, 1590, 1585, 1575, 1611, 
+  1578, 1580, 1605, 1578, 1581, 1580, 1578, 1581, 
+  1605, 1578, 1582, 1605, 1578, 1605, 1580, 1578, 
+  1605, 1581, 1578, 1605, 1582, 1580, 1605, 1581, 
+  1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581, 
+  1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 
+  1605, 1581, 1587, 1605, 1580, 1587, 1605, 1605, 
+  1589, 1581, 1581, 1589, 1605, 1605, 1588, 1581, 
+  1605, 1588, 1580, 1610, 1588, 1605, 1582, 1588, 
+  1605, 1605, 1590, 1581, 1609, 1590, 1582, 1605, 
+  1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, 
+  1610, 1593, 1580, 1605, 1593, 1605, 1605, 1593, 
+  1605, 1609, 1594, 1605, 1605, 1594, 1605, 1610, 
+  1594, 1605, 1609, 1601, 1582, 1605, 1602, 1605, 
+  1581, 1602, 1605, 1605, 1604, 1581, 1605, 1604, 
+  1581, 1610, 1604, 1581, 1609, 1604, 1580, 1580, 
+  1604, 1582, 1605, 1604, 1605, 1581, 1605, 1581, 
+  1580, 1605, 1581, 1605, 1605, 1581, 1610, 1605, 
+  1580, 1581, 1605, 1580, 1605, 1605, 1582, 1580, 
+  1605, 1582, 1605, 1605, 1580, 1582, 1607, 1605, 
+  1580, 1607, 1605, 1605, 1606, 1581, 1605, 1606, 
+  1581, 1609, 1606, 1580, 1605, 1606, 1580, 1609, 
+  1606, 1605, 1610, 1606, 1605, 1609, 1610, 1605, 
+  1605, 1576, 1582, 1610, 1578, 1580, 1610, 1578, 
+  1580, 1609, 1578, 1582, 1610, 1578, 1582, 1609, 
+  1578, 1605, 1610, 1578, 1605, 1609, 1580, 1605, 
+  1610, 1580, 1581, 1609, 1580, 1605, 1609, 1587, 
+  1582, 1609, 1589, 1581, 1610, 1588, 1581, 1610, 
+  1590, 1581, 1610, 1604, 1580, 1610, 1604, 1605, 
+  1610, 1610, 1581, 1610, 1610, 1580, 1610, 1610, 
+  1605, 1610, 1605, 1605, 1610, 1602, 1605, 1610, 
+  1606, 1581, 1610, 1593, 1605, 1610, 1603, 1605, 
+  1610, 1606, 1580, 1581, 1605, 1582, 1610, 1604, 
+  1580, 1605, 1603, 1605, 1605, 1580, 1581, 1610, 
+  1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605, 
+  1610, 1576, 1581, 1610, 1587, 1582, 1610, 1606, 
+  1580, 1610, 1589, 1604, 1746, 1602, 1604, 1746, 
+  1575, 1604, 1604, 1607, 1575, 1603, 1576, 1585, 
+  1605, 1581, 1605, 1583, 1589, 1604, 1593, 1605, 
+  1585, 1587, 1608, 1604, 1593, 1604, 1610, 1607, 
+  1608, 1587, 1604, 1605, 1589, 1604, 1609, 17, 
+  1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 
+  32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 
+  1604, 1605, 7, 1580, 1604, 32, 1580, 1604, 
+  1575, 1604, 1607, 1585, 1740, 1575, 1604, 44, 
+  12289, 12290, 58, 33, 63, 12310, 12311, 8230, 
+  8229, 8212, 8211, 95, 123, 125, 12308, 12309, 
+  12304, 12305, 12298, 12299, 12300, 12301, 12302, 12303, 
+  91, 93, 8254, 35, 38, 42, 45, 60, 
+  62, 92, 36, 37, 64, 32, 1611, 1600, 
+  1611, 32, 1612, 32, 1613, 32, 1614, 1600, 
+  1614, 32, 1615, 1600, 1615, 32, 1616, 1600, 
+  1616, 32, 1617, 1600, 1617, 32, 1618, 1600, 
+  1618, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 
+  1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 
+  1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 
+  1592, 1593, 1594, 1601, 1602, 1603, 1604, 1605, 
+  1606, 1607, 1608, 1610, 1604, 1570, 1604, 1571, 
+  1604, 1573, 1604, 1575, 34, 39, 47, 65345, 
+  65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 
+  65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 
+  65362, 65363, 65364, 65365, 65366, 65367, 65368, 65369, 
+  65370, 94, 124, 126, 10629, 10630, 12539, 12449, 
+  12451, 12453, 12455, 12457, 12515, 12517, 12519, 12483, 
+  12540, 12531, 12441, 12442, 12644, 12593, 12594, 12595, 
+  12596, 12597, 12598, 12599, 12600, 12601, 12602, 12603, 
+  12604, 12605, 12606, 12607, 12608, 12609, 12610, 12611, 
+  12612, 12613, 12614, 12615, 12616, 12617, 12618, 12619, 
+  12620, 12621, 12622, 12623, 12624, 12625, 12626, 12627, 
+  12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635, 
+  12636, 12637, 12638, 12639, 12640, 12641, 12642, 12643, 
+  162, 163, 172, 175, 166, 165, 8361, 9474, 
+  8592, 8593, 8594, 8595, 9632, 9675, 55297, 56360, 
+  55297, 56361, 55297, 56362, 55297, 56363, 55297, 56364, 
+  55297, 56365, 55297, 56366, 55297, 56367, 55297, 56368, 
+  55297, 56369, 55297, 56370, 55297, 56371, 55297, 56372, 
+  55297, 56373, 55297, 56374, 55297, 56375, 55297, 56376, 
+  55297, 56377, 55297, 56378, 55297, 56379, 55297, 56380, 
+  55297, 56381, 55297, 56382, 55297, 56383, 55297, 56384, 
+  55297, 56385, 55297, 56386, 55297, 56387, 55297, 56388, 
+  55297, 56389, 55297, 56390, 55297, 56391, 55297, 56392, 
+  55297, 56393, 55297, 56394, 55297, 56395, 55297, 56396, 
+  55297, 56397, 55297, 56398, 55297, 56399, 55297, 56536, 
+  55297, 56537, 55297, 56538, 55297, 56539, 55297, 56540, 
+  55297, 56541, 55297, 56542, 55297, 56543, 55297, 56544, 
+  55297, 56545, 55297, 56546, 55297, 56547, 55297, 56548, 
+  55297, 56549, 55297, 56550, 55297, 56551, 55297, 56552, 
+  55297, 56553, 55297, 56554, 55297, 56555, 55297, 56556, 
+  55297, 56557, 55297, 56558, 55297, 56559, 55297, 56560, 
+  55297, 56561, 55297, 56562, 55297, 56563, 55297, 56564, 
+  55297, 56565, 55297, 56566, 55297, 56567, 55297, 56568, 
+  55297, 56569, 55297, 56570, 55297, 56571, 55299, 56512, 
+  55299, 56513, 55299, 56514, 55299, 56515, 55299, 56516, 
+  55299, 56517, 55299, 56518, 55299, 56519, 55299, 56520, 
+  55299, 56521, 55299, 56522, 55299, 56523, 55299, 56524, 
+  55299, 56525, 55299, 56526, 55299, 56527, 55299, 56528, 
+  55299, 56529, 55299, 56530, 55299, 56531, 55299, 56532, 
+  55299, 56533, 55299, 56534, 55299, 56535, 55299, 56536, 
+  55299, 56537, 55299, 56538, 55299, 56539, 55299, 56540, 
+  55299, 56541, 55299, 56542, 55299, 56543, 55299, 56544, 
+  55299, 56545, 55299, 56546, 55299, 56547, 55299, 56548, 
+  55299, 56549, 55299, 56550, 55299, 56551, 55299, 56552, 
+  55299, 56553, 55299, 56554, 55299, 56555, 55299, 56556, 
+  55299, 56557, 55299, 56558, 55299, 56559, 55299, 56560, 
+  55299, 56561, 55299, 56562, 55300, 56473, 55300, 56506, 
+  55300, 56475, 55300, 56506, 55300, 56485, 55300, 56506, 
+  55300, 56625, 55300, 56615, 55300, 56626, 55300, 56615, 
+  55300, 57159, 55300, 57150, 55300, 57159, 55300, 57175, 
+  55301, 56505, 55301, 56506, 55301, 56505, 55301, 56496, 
+  55301, 56505, 55301, 56509, 55301, 56760, 55301, 56751, 
+  55301, 56761, 55301, 56751, 55302, 56512, 55302, 56513, 
+  55302, 56514, 55302, 56515, 55302, 56516, 55302, 56517, 
+  55302, 56518, 55302, 56519, 55302, 56520, 55302, 56521, 
+  55302, 56522, 55302, 56523, 55302, 56524, 55302, 56525, 
+  55302, 56526, 55302, 56527, 55302, 56528, 55302, 56529, 
+  55302, 56530, 55302, 56531, 55302, 56532, 55302, 56533, 
+  55302, 56534, 55302, 56535, 55302, 56536, 55302, 56537, 
+  55302, 56538, 55302, 56539, 55302, 56540, 55302, 56541, 
+  55302, 56542, 55302, 56543, 55348, 56663, 55348, 56677, 
+  55348, 56664, 55348, 56677, 55348, 56671, 55348, 56686, 
+  55348, 56671, 55348, 56687, 55348, 56671, 55348, 56688, 
+  55348, 56671, 55348, 56689, 55348, 56671, 55348, 56690, 
+  55348, 56761, 55348, 56677, 55348, 56762, 55348, 56677, 
+  55348, 56763, 55348, 56686, 55348, 56764, 55348, 56686, 
+  55348, 56763, 55348, 56687, 55348, 56764, 55348, 56687, 
+  305, 567, 913, 914, 916, 917, 918, 919, 
+  921, 922, 923, 924, 925, 926, 927, 929, 
+  1012, 932, 934, 935, 936, 8711, 8706, 1013, 
+  977, 1008, 981, 1009, 982, 988, 55354, 56610, 
+  55354, 56611, 55354, 56612, 55354, 56613, 55354, 56614, 
+  55354, 56615, 55354, 56616, 55354, 56617, 55354, 56618, 
+  55354, 56619, 55354, 56620, 55354, 56621, 55354, 56622, 
+  55354, 56623, 55354, 56624, 55354, 56625, 55354, 56626, 
+  55354, 56627, 55354, 56628, 55354, 56629, 55354, 56630, 
+  55354, 56631, 55354, 56632, 55354, 56633, 55354, 56634, 
+  55354, 56635, 55354, 56636, 55354, 56637, 55354, 56638, 
+  55354, 56639, 55354, 56640, 55354, 56641, 55354, 56642, 
+  55354, 56643, 1646, 1697, 1647, 48, 46, 48, 
+  44, 49, 44, 50, 44, 51, 44, 52, 
+  44, 53, 44, 54, 44, 55, 44, 56, 
+  44, 57, 44, 40, 65, 41, 40, 66, 
+  41, 40, 67, 41, 40, 68, 41, 40, 
+  69, 41, 40, 70, 41, 40, 71, 41, 
+  40, 72, 41, 40, 73, 41, 40, 74, 
+  41, 40, 75, 41, 40, 76, 41, 40, 
+  77, 41, 40, 78, 41, 40, 79, 41, 
+  40, 80, 41, 40, 81, 41, 40, 82, 
+  41, 40, 83, 41, 40, 84, 41, 40, 
+  85, 41, 40, 86, 41, 40, 87, 41, 
+  40, 88, 41, 40, 89, 41, 40, 90, 
+  41, 12308, 83, 12309, 67, 68, 87, 90, 
+  72, 86, 83, 68, 83, 83, 80, 80, 
+  86, 87, 67, 77, 67, 77, 68, 68, 
+  74, 12411, 12363, 12467, 12467, 23383, 21452, 12487, 
+  22810, 35299, 20132, 26144, 28961, 21069, 24460, 20877, 
+  26032, 21021, 32066, 36009, 22768, 21561, 28436, 25237, 
+  25429, 36938, 25351, 25171, 31105, 31354, 21512, 28288, 
+  30003, 21106, 21942, 37197, 12308, 26412, 12309, 12308, 
+  19977, 12309, 12308, 20108, 12309, 12308, 23433, 12309, 
+  12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, 
+  12309, 12308, 21213, 12309, 12308, 25943, 12309, 24471, 
+  21487, 20029, 20024, 20033, 55360, 56610, 20320, 20411, 
+  20482, 20602, 20633, 20687, 13470, 55361, 56890, 20820, 
+  20836, 20855, 55361, 56604, 13497, 20839, 55361, 56651, 
+  20887, 20900, 20172, 20908, 55396, 56799, 20995, 13535, 
+  21051, 21062, 21111, 13589, 21253, 21254, 21321, 21338, 
+  21363, 21373, 21375, 55362, 56876, 28784, 21450, 21471, 
+  55362, 57187, 21483, 21489, 21510, 21662, 21560, 21576, 
+  21608, 21666, 21750, 21776, 21843, 21859, 21892, 21931, 
+  21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, 
+  22516, 22541, 22411, 22578, 22577, 22700, 55365, 56548, 
+  22770, 22775, 22790, 22818, 22882, 55365, 57000, 55365, 
+  57066, 23020, 23067, 23079, 23000, 23142, 14062, 14076, 
+  23304, 23358, 55366, 56776, 23491, 23512, 23539, 55366, 
+  57112, 23551, 23558, 24403, 14209, 23648, 23744, 23693, 
+  55367, 56804, 23875, 55367, 56806, 23918, 23915, 23932, 
+  24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, 
+  55368, 56707, 14460, 24240, 24243, 24246, 55400, 57234, 
+  55368, 57137, 33281, 24354, 14535, 55372, 57016, 55384, 
+  56794, 24418, 24427, 14563, 24474, 24525, 24535, 24569, 
+  24705, 14650, 14620, 55369, 57044, 24775, 24904, 24908, 
+  24954, 25010, 24996, 25007, 25054, 25104, 25115, 25181, 
+  25265, 25300, 25424, 55370, 57100, 25405, 25340, 25448, 
+  25475, 25572, 55370, 57329, 25634, 25541, 25513, 14894, 
+  25705, 25726, 25757, 25719, 14956, 25964, 55372, 56330, 
+  26083, 26360, 26185, 15129, 15112, 15076, 20882, 20885, 
+  26368, 26268, 32941, 17369, 26401, 26462, 26451, 55372, 
+  57283, 15177, 26618, 26501, 26706, 55373, 56429, 26766, 
+  26655, 26900, 26946, 27043, 27114, 27304, 55373, 56995, 
+  27355, 15384, 27425, 55374, 56487, 27476, 15438, 27506, 
+  27551, 27579, 55374, 56973, 55367, 56587, 55374, 57082, 
+  27726, 55375, 56508, 27839, 27853, 27751, 27926, 27966, 
+  28009, 28024, 28037, 55375, 56606, 27956, 28207, 28270, 
+  15667, 28359, 55375, 57041, 28153, 28526, 55375, 57182, 
+  55375, 57230, 28614, 28729, 28699, 15766, 28746, 28797, 
+  28791, 28845, 55361, 56613, 28997, 55376, 56931, 29084, 
+  55376, 57259, 29224, 29264, 55377, 56840, 29312, 29333, 
+  55377, 57141, 55378, 56340, 29562, 29579, 16044, 29605, 
+  16056, 29767, 29788, 29829, 29898, 16155, 29988, 55379, 
+  56374, 30014, 55379, 56466, 55368, 56735, 30224, 55379, 
+  57249, 55379, 57272, 55380, 56388, 16380, 16392, 55380, 
+  56563, 55380, 56562, 55380, 56601, 55380, 56627, 30494, 
+  30495, 30603, 16454, 16534, 55381, 56349, 30798, 16611, 
+  55381, 56870, 55381, 56986, 55381, 57029, 31211, 16687, 
+  31306, 31311, 55382, 56700, 55382, 56999, 31470, 16898, 
+  55382, 57259, 31686, 31689, 16935, 55383, 56448, 31954, 
+  17056, 31976, 31971, 32000, 55383, 57222, 32099, 17153, 
+  32199, 32258, 32325, 17204, 55384, 56872, 55384, 56903, 
+  17241, 55384, 57049, 32634, 55384, 57150, 32661, 32762, 
+  55385, 56538, 55385, 56611, 32864, 55385, 56744, 32880, 
+  55372, 57183, 17365, 32946, 33027, 17419, 33086, 23221, 
+  55385, 57255, 55385, 57269, 55372, 57235, 55372, 57244, 
+  33284, 36766, 17515, 33425, 33419, 33437, 21171, 33457, 
+  33459, 33469, 33510, 55386, 57148, 33565, 33635, 33709, 
+  33571, 33725, 33767, 33619, 33738, 33740, 33756, 55387, 
+  56374, 55387, 56683, 55387, 56533, 17707, 34033, 34035, 
+  34070, 55388, 57290, 34148, 55387, 57132, 17757, 17761, 
+  55387, 57265, 55388, 56530, 17771, 34384, 34407, 34409, 
+  34473, 34440, 34574, 34530, 34600, 34667, 34694, 17879, 
+  34785, 34817, 17913, 34912, 55389, 56935, 35031, 35038, 
+  17973, 35066, 13499, 55390, 56494, 55390, 56678, 18110, 
+  18119, 35488, 55391, 56488, 36011, 36033, 36123, 36215, 
+  55391, 57135, 55362, 56324, 36299, 36284, 36336, 55362, 
+  56542, 36564, 55393, 56786, 55393, 56813, 37012, 37105, 
+  37137, 55393, 57134, 37147, 37432, 37591, 37592, 37500, 
+  37881, 37909, 55394, 57338, 38283, 18837, 38327, 55395, 
+  56695, 18918, 38595, 23986, 38691, 55396, 56645, 55396, 
+  56858, 19054, 19062, 38880, 55397, 56330, 19122, 55397, 
+  56470, 38953, 55397, 56758, 39138, 19251, 39209, 39335, 
+  39362, 39422, 19406, 55398, 57136, 40000, 40189, 19662, 
+  19693, 40295, 55400, 56526, 19704, 55400, 56581, 55400, 
+  56846, 55400, 56977, 19798, 40702, 40709, 40719, 40726, 
+  55401, 56832, 192, 193, 194, 195, 196, 199, 
+  200, 201, 202, 203, 204, 205, 206, 207, 
+  208, 209, 210, 211, 212, 213, 214, 216, 
+  217, 218, 219, 220, 221, 222, 376, 256, 
+  258, 260, 262, 264, 266, 268, 270, 272, 
+  274, 276, 278, 280, 282, 284, 286, 288, 
+  290, 292, 296, 298, 300, 302, 306, 308, 
+  310, 313, 315, 317, 319, 321, 323, 325, 
+  327, 330, 332, 334, 336, 338, 340, 342, 
+  344, 346, 348, 350, 352, 354, 356, 358, 
+  360, 362, 364, 366, 368, 370, 372, 374, 
+  377, 379, 381, 579, 386, 388, 391, 395, 
+  401, 502, 408, 573, 544, 416, 418, 420, 
+  423, 428, 431, 435, 437, 440, 444, 503, 
+  453, 452, 456, 455, 459, 458, 461, 463, 
+  465, 467, 469, 471, 473, 475, 478, 480, 
+  482, 484, 486, 488, 490, 492, 494, 498, 
+  497, 500, 504, 506, 508, 510, 512, 514, 
+  516, 518, 520, 522, 524, 526, 528, 530, 
+  532, 534, 536, 538, 540, 542, 548, 550, 
+  552, 554, 556, 558, 560, 562, 571, 11390, 
+  11391, 577, 582, 584, 586, 588, 590, 11375, 
+  11373, 11376, 385, 390, 393, 394, 399, 42923, 
+  403, 42924, 404, 42893, 42922, 407, 406, 42926, 
+  11362, 42925, 412, 11374, 413, 415, 11364, 422, 
+  425, 42929, 430, 580, 433, 434, 581, 439, 
+  42930, 42928, 880, 882, 886, 1021, 1022, 1023, 
+  938, 939, 975, 984, 986, 990, 992, 994, 
+  996, 998, 1000, 1002, 1004, 1006, 1017, 895, 
+  1015, 1018, 1040, 1041, 1042, 1043, 1044, 1045, 
+  1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 
+  1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 
+  1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 
+  1070, 1071, 1024, 1025, 1026, 1027, 1028, 1029, 
+  1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 
+  1038, 1039, 1120, 1122, 1124, 1126, 1128, 1130, 
+  1132, 1134, 1136, 1138, 1140, 1142, 1144, 1146, 
+  1148, 1150, 1152, 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, 1217, 1219, 
+  1221, 1223, 1225, 1227, 1229, 1216, 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, 1329, 1330, 
+  1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 
+  1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 
+  1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 
+  1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 
+  1363, 1364, 1365, 1366, 43888, 43889, 43890, 43891, 
+  43892, 43893, 43894, 43895, 43896, 43897, 43898, 43899, 
+  43900, 43901, 43902, 43903, 43904, 43905, 43906, 43907, 
+  43908, 43909, 43910, 43911, 43912, 43913, 43914, 43915, 
+  43916, 43917, 43918, 43919, 43920, 43921, 43922, 43923, 
+  43924, 43925, 43926, 43927, 43928, 43929, 43930, 43931, 
+  43932, 43933, 43934, 43935, 43936, 43937, 43938, 43939, 
+  43940, 43941, 43942, 43943, 43944, 43945, 43946, 43947, 
+  43948, 43949, 43950, 43951, 43952, 43953, 43954, 43955, 
+  43956, 43957, 43958, 43959, 43960, 43961, 43962, 43963, 
+  43964, 43965, 43966, 43967, 5112, 5113, 5114, 5115, 
+  5116, 5117, 42570, 42877, 11363, 7680, 7682, 7684, 
+  7686, 7688, 7690, 7692, 7694, 7696, 7698, 7700, 
+  7702, 7704, 7706, 7708, 7710, 7712, 7714, 7716, 
+  7718, 7720, 7722, 7724, 7726, 7728, 7730, 7732, 
+  7734, 7736, 7738, 7740, 7742, 7744, 7746, 7748, 
+  7750, 7752, 7754, 7756, 7758, 7760, 7762, 7764, 
+  7766, 7768, 7770, 7772, 7774, 7776, 7778, 7780, 
+  7782, 7784, 7786, 7788, 7790, 7792, 7794, 7796, 
+  7798, 7800, 7802, 7804, 7806, 7808, 7810, 7812, 
+  7814, 7816, 7818, 7820, 7822, 7824, 7826, 7828, 
+  7840, 7842, 7844, 7846, 7848, 7850, 7852, 7854, 
+  7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, 
+  7872, 7874, 7876, 7878, 7880, 7882, 7884, 7886, 
+  7888, 7890, 7892, 7894, 7896, 7898, 7900, 7902, 
+  7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, 
+  7920, 7922, 7924, 7926, 7928, 7930, 7932, 7934, 
+  7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 
+  7960, 7961, 7962, 7963, 7964, 7965, 7976, 7977, 
+  7978, 7979, 7980, 7981, 7982, 7983, 7992, 7993, 
+  7994, 7995, 7996, 7997, 7998, 7999, 8008, 8009, 
+  8010, 8011, 8012, 8013, 8025, 8027, 8029, 8031, 
+  8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 
+  8122, 8123, 8136, 8137, 8138, 8139, 8154, 8155, 
+  8184, 8185, 8170, 8171, 8186, 8187, 8072, 8073, 
+  8074, 8075, 8076, 8077, 8078, 8079, 8088, 8089, 
+  8090, 8091, 8092, 8093, 8094, 8095, 8104, 8105, 
+  8106, 8107, 8108, 8109, 8110, 8111, 8120, 8121, 
+  8124, 8140, 8152, 8153, 8168, 8169, 8172, 8188, 
+  8498, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 
+  8551, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 
+  8559, 8579, 9398, 9399, 9400, 9401, 9402, 9403, 
+  9404, 9405, 9406, 9407, 9408, 9409, 9410, 9411, 
+  9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 
+  9420, 9421, 9422, 9423, 11264, 11265, 11266, 11267, 
+  11268, 11269, 11270, 11271, 11272, 11273, 11274, 11275, 
+  11276, 11277, 11278, 11279, 11280, 11281, 11282, 11283, 
+  11284, 11285, 11286, 11287, 11288, 11289, 11290, 11291, 
+  11292, 11293, 11294, 11295, 11296, 11297, 11298, 11299, 
+  11300, 11301, 11302, 11303, 11304, 11305, 11306, 11307, 
+  11308, 11309, 11310, 11360, 570, 574, 11367, 11369, 
+  11371, 11378, 11381, 11392, 11394, 11396, 11398, 11400, 
+  11402, 11404, 11406, 11408, 11410, 11412, 11414, 11416, 
+  11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432, 
+  11434, 11436, 11438, 11440, 11442, 11444, 11446, 11448, 
+  11450, 11452, 11454, 11456, 11458, 11460, 11462, 11464, 
+  11466, 11468, 11470, 11472, 11474, 11476, 11478, 11480, 
+  11482, 11484, 11486, 11488, 11490, 11499, 11501, 11506, 
+  4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 
+  4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 
+  4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 
+  4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 
+  4288, 4289, 4290, 4291, 4292, 4293, 4295, 4301, 
+  42560, 42562, 42564, 42566, 42568, 42572, 42574, 42576, 
+  42578, 42580, 42582, 42584, 42586, 42588, 42590, 42592, 
+  42594, 42596, 42598, 42600, 42602, 42604, 42624, 42626, 
+  42628, 42630, 42632, 42634, 42636, 42638, 42640, 42642, 
+  42644, 42646, 42648, 42650, 42786, 42788, 42790, 42792, 
+  42794, 42796, 42798, 42802, 42804, 42806, 42808, 42810, 
+  42812, 42814, 42816, 42818, 42820, 42822, 42824, 42826, 
+  42828, 42830, 42832, 42834, 42836, 42838, 42840, 42842, 
+  42844, 42846, 42848, 42850, 42852, 42854, 42856, 42858, 
+  42860, 42862, 42873, 42875, 42878, 42880, 42882, 42884, 
+  42886, 42891, 42896, 42898, 42902, 42904, 42906, 42908, 
+  42910, 42912, 42914, 42916, 42918, 42920, 42932, 42934, 
+  42931, 65313, 65314, 65315, 65316, 65317, 65318, 65319, 
+  65320, 65321, 65322, 65323, 65324, 65325, 65326, 65327, 
+  65328, 65329, 65330, 65331, 65332, 65333, 65334, 65335, 
+  65336, 65337, 65338, 55297, 56320, 55297, 56321, 55297, 
+  56322, 55297, 56323, 55297, 56324, 55297, 56325, 55297, 
+  56326, 55297, 56327, 55297, 56328, 55297, 56329, 55297, 
+  56330, 55297, 56331, 55297, 56332, 55297, 56333, 55297, 
+  56334, 55297, 56335, 55297, 56336, 55297, 56337, 55297, 
+  56338, 55297, 56339, 55297, 56340, 55297, 56341, 55297, 
+  56342, 55297, 56343, 55297, 56344, 55297, 56345, 55297, 
+  56346, 55297, 56347, 55297, 56348, 55297, 56349, 55297, 
+  56350, 55297, 56351, 55297, 56352, 55297, 56353, 55297, 
+  56354, 55297, 56355, 55297, 56356, 55297, 56357, 55297, 
+  56358, 55297, 56359, 55297, 56496, 55297, 56497, 55297, 
+  56498, 55297, 56499, 55297, 56500, 55297, 56501, 55297, 
+  56502, 55297, 56503, 55297, 56504, 55297, 56505, 55297, 
+  56506, 55297, 56507, 55297, 56508, 55297, 56509, 55297, 
+  56510, 55297, 56511, 55297, 56512, 55297, 56513, 55297, 
+  56514, 55297, 56515, 55297, 56516, 55297, 56517, 55297, 
+  56518, 55297, 56519, 55297, 56520, 55297, 56521, 55297, 
+  56522, 55297, 56523, 55297, 56524, 55297, 56525, 55297, 
+  56526, 55297, 56527, 55297, 56528, 55297, 56529, 55297, 
+  56530, 55297, 56531, 55299, 56448, 55299, 56449, 55299, 
+  56450, 55299, 56451, 55299, 56452, 55299, 56453, 55299, 
+  56454, 55299, 56455, 55299, 56456, 55299, 56457, 55299, 
+  56458, 55299, 56459, 55299, 56460, 55299, 56461, 55299, 
+  56462, 55299, 56463, 55299, 56464, 55299, 56465, 55299, 
+  56466, 55299, 56467, 55299, 56468, 55299, 56469, 55299, 
+  56470, 55299, 56471, 55299, 56472, 55299, 56473, 55299, 
+  56474, 55299, 56475, 55299, 56476, 55299, 56477, 55299, 
+  56478, 55299, 56479, 55299, 56480, 55299, 56481, 55299, 
+  56482, 55299, 56483, 55299, 56484, 55299, 56485, 55299, 
+  56486, 55299, 56487, 55299, 56488, 55299, 56489, 55299, 
+  56490, 55299, 56491, 55299, 56492, 55299, 56493, 55299, 
+  56494, 55299, 56495, 55299, 56496, 55299, 56497, 55299, 
+  56498, 55302, 56480, 55302, 56481, 55302, 56482, 55302, 
+  56483, 55302, 56484, 55302, 56485, 55302, 56486, 55302, 
+  56487, 55302, 56488, 55302, 56489, 55302, 56490, 55302, 
+  56491, 55302, 56492, 55302, 56493, 55302, 56494, 55302, 
+  56495, 55302, 56496, 55302, 56497, 55302, 56498, 55302, 
+  56499, 55302, 56500, 55302, 56501, 55302, 56502, 55302, 
+  56503, 55302, 56504, 55302, 56505, 55302, 56506, 55302, 
+  56507, 55302, 56508, 55302, 56509, 55302, 56510, 55302, 
+  56511, 55354, 56576, 55354, 56577, 55354, 56578, 55354, 
+  56579, 55354, 56580, 55354, 56581, 55354, 56582, 55354, 
+  56583, 55354, 56584, 55354, 56585, 55354, 56586, 55354, 
+  56587, 55354, 56588, 55354, 56589, 55354, 56590, 55354, 
+  56591, 55354, 56592, 55354, 56593, 55354, 56594, 55354, 
+  56595, 55354, 56596, 55354, 56597, 55354, 56598, 55354, 
+  56599, 55354, 56600, 55354, 56601, 55354, 56602, 55354, 
+  56603, 55354, 56604, 55354, 56605, 55354, 56606, 55354, 
+  56607, 55354, 56608, 55354, 56609, };
+
+const nc_utf8proc_uint16_t nc_utf8proc_stage1table[] = {
+  0, 256, 512, 768, 1024, 1280, 1536, 
+  1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 
+  3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 
+  5888, 6144, 6400, 6656, 6912, 7168, 7424, 7680, 
+  7936, 8192, 8448, 8704, 8960, 9216, 9472, 9728, 
+  9984, 10240, 10496, 10752, 11008, 11264, 11520, 11776, 
+  12032, 12288, 12544, 12800, 13056, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13568, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13824, 14080, 13312, 13312, 13312, 14336, 13312, 14592, 
+  14848, 15104, 15360, 15616, 15872, 16128, 16384, 16640, 
+  16896, 17152, 17408, 17664, 16128, 16384, 16640, 16896, 
+  17152, 17408, 17664, 16128, 16384, 16640, 16896, 17152, 
+  17408, 17664, 16128, 16384, 16640, 16896, 17152, 17408, 
+  17664, 16128, 16384, 16640, 16896, 17152, 17408, 17664, 
+  16128, 16384, 16640, 16896, 17152, 17408, 17664, 16128, 
+  17920, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 
+  18176, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18688, 18944, 19200, 19456, 19712, 19968, 
+  20224, 20480, 20736, 20992, 21248, 21504, 21760, 22016, 
+  22272, 22528, 22784, 23040, 23296, 23552, 23808, 24064, 
+  23808, 24320, 24576, 24832, 25088, 25344, 25600, 25856, 
+  26112, 26368, 23808, 26624, 23808, 26880, 23808, 23808, 
+  23808, 27136, 27136, 27136, 27392, 27648, 27904, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 27136, 27136, 27136, 27136, 28160, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 27136, 27136, 28416, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 27136, 27136, 28672, 28928, 23808, 23808, 23808, 
+  29184, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  29440, 13312, 13312, 29696, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 29952, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 30208, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 30464, 30720, 30976, 31232, 31488, 31744, 32000, 
+  32256, 10240, 10240, 32512, 23808, 23808, 23808, 23808, 
+  23808, 32768, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 33024, 33280, 23808, 23808, 23808, 23808, 33536, 
+  23808, 33792, 34048, 34304, 34560, 34816, 35072, 35328, 
+  35584, 35840, 36096, 23808, 23808, 23808, 23808, 23808, 
+  23808, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 36352, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  36608, 36864, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 
+  13312, 13312, 13312, 13312, 13312, 13312, 13312, 37120, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 37376, 37632, 37888, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 38144, 38400, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 23808, 23808, 23808, 23808, 23808, 23808, 23808, 
+  23808, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  38656, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  18432, 18432, 18432, 18432, 18432, 18432, 18432, 18432, 
+  38656, };
+
+const nc_utf8proc_uint16_t nc_utf8proc_stage2table[] = {
+  1, 2, 2, 2, 2, 2, 2, 
+  2, 2, 3, 4, 3, 5, 6, 2, 
+  2, 2, 2, 2, 2, 2, 2, 2, 
+  2, 2, 2, 2, 2, 7, 7, 7, 
+  3, 8, 9, 9, 10, 11, 10, 9, 
+  9, 12, 13, 9, 14, 15, 16, 15, 
+  15, 17, 17, 17, 17, 17, 17, 17, 
+  17, 17, 17, 15, 9, 18, 19, 20, 
+  9, 9, 21, 22, 23, 24, 25, 26, 
+  27, 28, 29, 30, 31, 32, 33, 34, 
+  35, 36, 37, 38, 39, 40, 41, 42, 
+  43, 44, 45, 46, 12, 9, 13, 47, 
+  48, 47, 49, 50, 51, 52, 53, 54, 
+  55, 56, 57, 58, 59, 60, 61, 62, 
+  63, 64, 65, 66, 67, 68, 69, 70, 
+  71, 72, 73, 74, 12, 75, 13, 75, 
+  2, 2, 2, 2, 2, 2, 7, 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, 76, 9, 11, 11, 11, 11, 77, 
+  9, 78, 77, 79, 80, 75, 81, 77, 
+  82, 83, 84, 85, 86, 87, 88, 9, 
+  9, 89, 90, 91, 92, 93, 94, 95, 
+  9, 96, 97, 98, 99, 100, 101, 102, 
+  103, 104, 105, 106, 107, 108, 109, 110, 
+  111, 112, 113, 114, 115, 116, 117, 118, 
+  75, 119, 120, 121, 122, 123, 124, 125, 
+  126, 127, 128, 129, 130, 131, 132, 133, 
+  134, 135, 136, 137, 138, 139, 140, 141, 
+  142, 143, 144, 145, 146, 147, 148, 149, 
+  75, 150, 151, 152, 153, 154, 155, 156, 
+  157, 158, 159, 160, 161, 162, 163, 164, 
+  165, 166, 167, 168, 169, 170, 171, 172, 
+  173, 174, 175, 176, 177, 178, 179, 180, 
+  181, 182, 183, 184, 185, 186, 187, 188, 
+  189, 190, 191, 192, 193, 194, 195, 196, 
+  197, 198, 199, 200, 201, 202, 203, 204, 
+  205, 206, 207, 208, 209, 210, 211, 212, 
+  213, 214, 215, 216, 217, 218, 219, 220, 
+  221, 222, 223, 224, 225, 226, 227, 228, 
+  229, 230, 231, 232, 233, 234, 235, 236, 
+  237, 238, 239, 240, 241, 242, 243, 244, 
+  245, 246, 247, 248, 249, 250, 251, 252, 
+  253, 254, 255, 256, 257, 258, 259, 260, 
+  261, 262, 263, 264, 265, 266, 267, 268, 
+  269, 270, 271, 272, 273, 274, 275, 276, 
+  277, 278, 279, 280, 281, 282, 283, 284, 
+  285, 286, 287, 288, 289, 290, 291, 292, 
+  293, 294, 295, 296, 297, 298, 214, 299, 
+  300, 301, 302, 303, 304, 305, 306, 307, 
+  308, 309, 310, 311, 214, 312, 313, 314, 
+  315, 316, 317, 318, 319, 320, 321, 322, 
+  323, 324, 325, 214, 214, 326, 327, 328, 
+  329, 330, 331, 332, 333, 334, 335, 336, 
+  337, 338, 339, 214, 340, 341, 342, 214, 
+  343, 340, 340, 340, 340, 344, 345, 346, 
+  347, 348, 349, 350, 351, 352, 353, 354, 
+  355, 356, 357, 358, 359, 360, 361, 362, 
+  363, 364, 365, 366, 367, 368, 369, 370, 
+  371, 372, 373, 374, 375, 376, 377, 378, 
+  379, 380, 381, 382, 383, 384, 385, 386, 
+  387, 388, 389, 390, 391, 392, 393, 394, 
+  395, 396, 397, 398, 399, 400, 401, 402, 
+  403, 404, 405, 406, 407, 408, 409, 410, 
+  411, 412, 413, 414, 415, 416, 417, 418, 
+  419, 420, 421, 422, 423, 424, 425, 426, 
+  427, 428, 429, 430, 431, 432, 433, 434, 
+  435, 436, 214, 437, 438, 439, 440, 441, 
+  442, 443, 444, 445, 446, 447, 448, 449, 
+  450, 451, 452, 453, 454, 214, 214, 214, 
+  214, 214, 214, 455, 456, 457, 458, 459, 
+  460, 461, 462, 463, 464, 465, 466, 467, 
+  468, 469, 470, 471, 472, 473, 474, 475, 
+  476, 477, 478, 479, 480, 481, 214, 482, 
+  483, 214, 484, 214, 485, 486, 214, 214, 
+  214, 487, 488, 214, 489, 214, 490, 491, 
+  214, 492, 493, 494, 495, 496, 214, 214, 
+  497, 214, 498, 499, 214, 214, 500, 214, 
+  214, 214, 214, 214, 214, 214, 501, 214, 
+  214, 502, 214, 214, 503, 214, 214, 214, 
+  504, 505, 506, 507, 508, 509, 214, 214, 
+  214, 214, 214, 510, 214, 340, 214, 214, 
+  214, 214, 214, 214, 214, 214, 511, 512, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 513, 514, 515, 516, 517, 518, 519, 
+  520, 521, 522, 522, 523, 523, 523, 523, 
+  523, 523, 523, 47, 47, 47, 47, 522, 
+  522, 522, 522, 522, 522, 522, 522, 522, 
+  522, 523, 523, 47, 47, 47, 47, 47, 
+  47, 524, 525, 526, 527, 528, 529, 47, 
+  47, 530, 531, 532, 533, 534, 47, 47, 
+  47, 47, 47, 47, 47, 522, 47, 523, 
+  47, 47, 47, 47, 47, 47, 47, 47, 
+  47, 47, 47, 47, 47, 47, 47, 47, 
+  47, 535, 536, 537, 538, 539, 540, 541, 
+  542, 543, 544, 545, 546, 547, 540, 540, 
+  548, 540, 549, 540, 550, 551, 552, 553, 
+  553, 553, 553, 552, 554, 553, 553, 553, 
+  553, 553, 555, 555, 556, 557, 558, 559, 
+  560, 561, 553, 553, 553, 553, 562, 563, 
+  553, 564, 565, 553, 553, 566, 566, 566, 
+  566, 567, 553, 553, 553, 553, 540, 540, 
+  540, 568, 569, 570, 571, 572, 573, 540, 
+  553, 553, 553, 540, 540, 540, 553, 553, 
+  574, 540, 540, 540, 553, 553, 553, 553, 
+  540, 552, 553, 553, 540, 575, 576, 576, 
+  575, 576, 576, 575, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 577, 578, 579, 580, 581, 47, 582, 
+  583, 0, 0, 584, 585, 586, 587, 588, 
+  589, 0, 0, 0, 0, 87, 590, 591, 
+  592, 593, 594, 595, 0, 596, 0, 597, 
+  598, 599, 600, 601, 602, 603, 604, 605, 
+  606, 607, 608, 609, 610, 611, 612, 613, 
+  614, 615, 616, 0, 617, 618, 619, 620, 
+  621, 622, 623, 624, 625, 626, 627, 628, 
+  629, 630, 631, 632, 633, 634, 635, 636, 
+  637, 638, 639, 640, 641, 642, 643, 644, 
+  645, 646, 647, 648, 649, 650, 651, 652, 
+  653, 654, 655, 656, 657, 658, 659, 660, 
+  661, 662, 663, 664, 665, 666, 667, 668, 
+  669, 670, 671, 672, 673, 674, 675, 676, 
+  677, 678, 679, 680, 681, 682, 683, 684, 
+  685, 686, 687, 688, 689, 690, 691, 692, 
+  693, 694, 695, 696, 697, 698, 699, 75, 
+  700, 701, 702, 703, 704, 214, 705, 706, 
+  707, 708, 709, 710, 711, 712, 713, 714, 
+  715, 716, 717, 718, 719, 720, 721, 722, 
+  723, 724, 725, 726, 727, 728, 729, 730, 
+  731, 732, 733, 734, 735, 736, 737, 738, 
+  739, 740, 741, 742, 743, 744, 745, 746, 
+  747, 748, 749, 750, 751, 752, 753, 754, 
+  755, 756, 757, 758, 759, 760, 761, 762, 
+  763, 764, 765, 766, 767, 768, 769, 770, 
+  771, 772, 773, 774, 775, 776, 777, 778, 
+  779, 780, 781, 782, 783, 784, 785, 786, 
+  787, 788, 789, 790, 791, 792, 793, 794, 
+  795, 796, 797, 798, 799, 800, 801, 802, 
+  803, 804, 805, 806, 807, 808, 809, 810, 
+  811, 812, 813, 814, 815, 816, 817, 818, 
+  819, 820, 821, 822, 823, 824, 825, 826, 
+  827, 828, 829, 830, 831, 832, 833, 834, 
+  835, 836, 837, 838, 540, 540, 540, 540, 
+  540, 839, 839, 840, 841, 842, 843, 844, 
+  845, 846, 847, 848, 849, 850, 851, 852, 
+  853, 854, 855, 856, 857, 858, 859, 860, 
+  861, 862, 863, 864, 865, 866, 867, 868, 
+  869, 870, 871, 872, 873, 874, 875, 876, 
+  877, 878, 879, 880, 881, 882, 883, 884, 
+  885, 886, 887, 888, 889, 890, 891, 892, 
+  893, 894, 895, 896, 897, 898, 899, 900, 
+  901, 902, 903, 904, 905, 906, 907, 908, 
+  909, 910, 911, 912, 913, 914, 915, 916, 
+  917, 918, 919, 920, 921, 922, 923, 924, 
+  925, 926, 927, 928, 929, 930, 931, 932, 
+  933, 934, 935, 936, 937, 938, 939, 940, 
+  941, 942, 943, 944, 945, 946, 947, 948, 
+  949, 950, 951, 952, 953, 954, 955, 956, 
+  957, 958, 959, 960, 961, 962, 963, 964, 
+  965, 966, 967, 968, 969, 970, 971, 972, 
+  973, 974, 975, 976, 977, 978, 979, 980, 
+  981, 982, 983, 984, 985, 986, 987, 988, 
+  989, 990, 991, 992, 993, 994, 995, 996, 
+  997, 998, 999, 1000, 1001, 1002, 1003, 1004, 
+  1005, 0, 1006, 1007, 1008, 1009, 1010, 1011, 
+  1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 
+  1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 
+  1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 
+  1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 
+  0, 0, 523, 1044, 1044, 1044, 1044, 1044, 
+  1044, 0, 1045, 1046, 1047, 1048, 1049, 1050, 
+  1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 
+  1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 
+  1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 
+  1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 
+  1083, 0, 1044, 1084, 0, 0, 1085, 1085, 
+  11, 0, 553, 540, 540, 540, 540, 553, 
+  540, 540, 540, 1086, 553, 540, 540, 540, 
+  540, 540, 540, 553, 553, 553, 553, 553, 
+  553, 540, 540, 553, 540, 540, 1086, 1087, 
+  540, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 
+  1095, 1096, 1097, 1097, 1098, 1099, 1100, 1101, 
+  1102, 1103, 1104, 1105, 1103, 540, 553, 1103, 
+  1096, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 0, 0, 0, 0, 
+  0, 1106, 1106, 1106, 1103, 1103, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1107, 1108, 1108, 1108, 1107, 1107, 1109, 
+  1109, 1110, 10, 10, 1111, 15, 1112, 1085, 
+  1085, 540, 540, 540, 540, 540, 540, 540, 
+  540, 1113, 1114, 1115, 1112, 1116, 0, 1117, 
+  1112, 1118, 1118, 1119, 1120, 1121, 1122, 1123, 
+  1124, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1125, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1126, 1127, 1118, 1128, 1129, 1130, 1131, 1113, 
+  1114, 1115, 1132, 1133, 1134, 1135, 1136, 553, 
+  540, 540, 540, 540, 540, 553, 540, 540, 
+  553, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 
+  1137, 1137, 1137, 10, 1138, 1138, 1112, 1118, 
+  1118, 1139, 1118, 1118, 1118, 1118, 1140, 1141, 
+  1142, 1143, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1126, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1144, 1145, 1146, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1147, 1148, 1112, 1149, 540, 
+  540, 540, 540, 540, 540, 540, 1108, 1085, 
+  540, 540, 540, 540, 553, 540, 1125, 1125, 
+  540, 540, 1085, 553, 540, 540, 553, 1118, 
+  1118, 17, 17, 17, 17, 17, 17, 17, 
+  17, 17, 17, 1118, 1118, 1118, 1150, 1150, 
+  1126, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 
+  1117, 1117, 1117, 1117, 1117, 1117, 1117, 0, 
+  1151, 1126, 1152, 1126, 1126, 1126, 1126, 1126, 
+  1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 
+  1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 
+  1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 
+  1126, 540, 553, 540, 540, 553, 540, 540, 
+  553, 553, 553, 540, 553, 553, 540, 553, 
+  540, 540, 540, 553, 540, 553, 540, 553, 
+  540, 553, 540, 540, 0, 0, 1126, 1126, 
+  1126, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1126, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1126, 1126, 
+  1126, 1118, 1118, 1118, 1118, 1118, 1118, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1118, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 
+  1154, 1154, 1154, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 540, 540, 540, 540, 
+  540, 540, 540, 553, 540, 1155, 1155, 77, 
+  9, 9, 9, 1155, 0, 0, 0, 0, 
+  0, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 540, 
+  540, 540, 540, 1157, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 1157, 540, 540, 
+  540, 1157, 540, 540, 540, 540, 540, 0, 
+  0, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 
+  1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 
+  0, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 553, 553, 553, 0, 0, 1158, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 0, 1118, 
+  1118, 1118, 1118, 1118, 1118, 1118, 1118, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 1107, 553, 540, 540, 553, 
+  540, 540, 553, 540, 540, 540, 553, 553, 
+  553, 1129, 1130, 1131, 540, 540, 540, 553, 
+  540, 540, 553, 553, 540, 540, 540, 540, 
+  540, 1153, 1153, 1153, 1159, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1161, 1162, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1163, 1164, 1160, 1165, 1166, 1160, 1160, 
+  1160, 1160, 1160, 1153, 1159, 1167, 1160, 1159, 
+  1159, 1159, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1159, 1159, 1159, 1159, 1168, 1159, 
+  1159, 1160, 540, 553, 540, 540, 1153, 1153, 
+  1153, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 
+  1176, 1160, 1160, 1153, 1153, 1177, 1177, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1177, 1179, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1153, 1159, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 0, 
+  1160, 1160, 0, 0, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 0, 0, 0, 1160, 
+  1160, 1160, 1160, 0, 0, 1180, 1160, 1181, 
+  1159, 1159, 1153, 1153, 1153, 1153, 0, 0, 
+  1182, 1159, 0, 0, 1183, 1184, 1168, 1160, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  1185, 0, 0, 0, 0, 1186, 1187, 0, 
+  1188, 1160, 1160, 1153, 1153, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1160, 1160, 1189, 1189, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1191, 1189, 0, 0, 0, 
+  0, 0, 1153, 1153, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 0, 0, 0, 0, 
+  1160, 1160, 0, 0, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1192, 0, 1160, 1193, 
+  0, 1160, 1160, 0, 0, 1180, 0, 1159, 
+  1159, 1159, 1153, 1153, 0, 0, 0, 0, 
+  1153, 1153, 0, 0, 1153, 1153, 1168, 0, 
+  0, 0, 1153, 0, 0, 0, 0, 0, 
+  0, 0, 1194, 1195, 1196, 1160, 0, 1197, 
+  0, 0, 0, 0, 0, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1153, 1153, 1160, 1160, 1160, 1153, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 1153, 1153, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 0, 
+  1160, 1160, 1160, 0, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 0, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 1180, 1160, 1159, 
+  1159, 1159, 1153, 1153, 1153, 1153, 1153, 0, 
+  1153, 1153, 1159, 0, 1159, 1159, 1168, 0, 
+  0, 1160, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1153, 1153, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1177, 1189, 0, 0, 0, 0, 0, 
+  0, 0, 1160, 0, 0, 0, 0, 0, 
+  0, 0, 1153, 1159, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 0, 
+  1160, 1160, 0, 0, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 0, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 1180, 1160, 1198, 
+  1153, 1159, 1153, 1153, 1153, 1153, 0, 0, 
+  1199, 1200, 0, 0, 1201, 1202, 1168, 0, 
+  0, 0, 0, 0, 0, 0, 0, 1203, 
+  1204, 0, 0, 0, 0, 1205, 1206, 0, 
+  1160, 1160, 1160, 1153, 1153, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1191, 1160, 1190, 1190, 1190, 1190, 1190, 
+  1190, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 1153, 1160, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 0, 0, 0, 1160, 
+  1160, 1160, 0, 1207, 1160, 1208, 1160, 0, 
+  0, 0, 1160, 1160, 0, 1160, 0, 1160, 
+  1160, 0, 0, 0, 1160, 1160, 0, 0, 
+  0, 1160, 1160, 1160, 0, 0, 0, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 0, 0, 1209, 
+  1159, 1153, 1159, 1159, 0, 0, 0, 1210, 
+  1211, 1159, 0, 1212, 1213, 1214, 1168, 0, 
+  0, 1160, 0, 0, 0, 0, 0, 0, 
+  1215, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1190, 1190, 1190, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1189, 1085, 0, 0, 0, 0, 
+  0, 1153, 1159, 1159, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 0, 1160, 1153, 
+  1153, 1153, 1159, 1159, 1159, 1159, 0, 1216, 
+  1153, 1217, 0, 1153, 1153, 1153, 1168, 0, 
+  0, 0, 0, 0, 0, 0, 1218, 1219, 
+  0, 1160, 1160, 1160, 0, 0, 0, 0, 
+  0, 1160, 1160, 1153, 1153, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 
+  1191, 1160, 1153, 1159, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 0, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 1180, 1160, 1159, 
+  1221, 1222, 1159, 1223, 1159, 1159, 0, 1224, 
+  1225, 1226, 0, 1227, 1228, 1153, 1168, 0, 
+  0, 0, 0, 0, 0, 0, 1229, 1230, 
+  0, 0, 0, 0, 0, 0, 0, 1160, 
+  0, 1160, 1160, 1153, 1153, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 0, 1160, 1160, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 1153, 1159, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 0, 0, 1160, 1231, 
+  1159, 1159, 1153, 1153, 1153, 1153, 0, 1232, 
+  1233, 1159, 0, 1234, 1235, 1236, 1168, 1237, 
+  1191, 0, 0, 0, 0, 1160, 1160, 1160, 
+  1238, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1160, 1160, 1160, 1153, 1153, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1191, 1160, 1160, 1160, 1160, 1160, 
+  1160, 0, 0, 1159, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 0, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 0, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 0, 1239, 0, 0, 0, 0, 
+  1240, 1159, 1159, 1153, 1153, 1153, 0, 1153, 
+  0, 1159, 1241, 1242, 1159, 1243, 1244, 1245, 
+  1246, 0, 0, 0, 0, 0, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 0, 0, 1159, 1159, 1177, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 1153, 340, 1247, 1153, 1153, 1153, 
+  1153, 1248, 1248, 1168, 0, 0, 0, 0, 
+  11, 340, 340, 340, 340, 340, 340, 523, 
+  1153, 1249, 1249, 1249, 1249, 1153, 1153, 1153, 
+  1044, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 1044, 1044, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 340, 340, 0, 340, 0, 0, 
+  340, 340, 0, 340, 0, 0, 340, 0, 
+  0, 0, 0, 0, 0, 340, 340, 340, 
+  340, 0, 340, 340, 340, 340, 340, 340, 
+  340, 0, 340, 340, 340, 0, 340, 0, 
+  340, 0, 0, 340, 340, 0, 340, 340, 
+  340, 340, 1153, 340, 1251, 1153, 1153, 1153, 
+  1153, 1252, 1252, 0, 1153, 1153, 340, 0, 
+  0, 340, 340, 340, 340, 340, 0, 523, 
+  0, 1253, 1253, 1253, 1253, 1153, 1153, 0, 
+  0, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 0, 0, 1254, 1255, 340, 
+  340, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1191, 1191, 1191, 1177, 1177, 1177, 
+  1177, 1177, 1177, 1177, 1177, 1256, 1177, 1177, 
+  1177, 1177, 1177, 1177, 1191, 1177, 1191, 1191, 
+  1191, 553, 553, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1190, 1190, 1191, 553, 1191, 
+  553, 1191, 1257, 1258, 1259, 1258, 1259, 1159, 
+  1159, 1160, 1160, 1160, 1260, 1160, 1160, 1160, 
+  1160, 0, 1160, 1160, 1160, 1160, 1261, 1160, 
+  1160, 1160, 1160, 1262, 1160, 1160, 1160, 1160, 
+  1263, 1160, 1160, 1160, 1160, 1264, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1265, 1160, 1160, 1160, 0, 0, 
+  0, 0, 1266, 1267, 1268, 1269, 1270, 1271, 
+  1272, 1273, 1274, 1267, 1267, 1267, 1267, 1153, 
+  1159, 1267, 1275, 540, 540, 1168, 1177, 540, 
+  540, 1160, 1160, 1160, 1160, 1160, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1276, 1153, 1153, 1153, 
+  1153, 0, 1153, 1153, 1153, 1153, 1277, 1153, 
+  1153, 1153, 1153, 1278, 1153, 1153, 1153, 1153, 
+  1279, 1153, 1153, 1153, 1153, 1280, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1281, 1153, 1153, 1153, 0, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 553, 
+  1191, 1191, 1191, 1191, 1191, 1191, 0, 1191, 
+  1191, 1177, 1177, 1177, 1177, 1177, 1191, 1191, 
+  1191, 1191, 1177, 1177, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 340, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 340, 1160, 1160, 1160, 1160, 1282, 1283, 
+  1160, 1160, 1160, 1160, 1284, 1284, 1153, 1285, 
+  1153, 1153, 1159, 1153, 1153, 1153, 1153, 1153, 
+  1180, 1284, 1168, 1168, 1159, 1159, 1153, 1153, 
+  1160, 1178, 1178, 1250, 1250, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1044, 1044, 1044, 1177, 1177, 
+  1177, 1160, 1160, 1160, 1160, 340, 1160, 1159, 
+  1159, 1153, 1153, 1160, 1160, 1160, 1160, 1153, 
+  1153, 1153, 1160, 1284, 1284, 1284, 1160, 1160, 
+  1284, 1284, 1284, 1284, 1284, 1284, 1284, 1160, 
+  1160, 1160, 1153, 1153, 1153, 1153, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1153, 1284, 1159, 1153, 1153, 
+  1284, 1284, 1284, 1284, 1284, 1284, 553, 1160, 
+  1284, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1284, 1284, 1284, 1153, 1191, 
+  1191, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 
+  1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 
+  1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 
+  1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 
+  1317, 1318, 1319, 1320, 1321, 1322, 1323, 0, 
+  1324, 0, 0, 0, 0, 0, 1325, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 1044, 1326, 340, 340, 
+  340, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1328, 1329, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 0, 1160, 1160, 1160, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 0, 1160, 1160, 1160, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 340, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 0, 0, 540, 540, 
+  540, 1177, 1044, 1177, 1177, 1177, 1177, 1177, 
+  1177, 1177, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1190, 1190, 1190, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 77, 77, 77, 77, 77, 1085, 77, 
+  1085, 1085, 77, 0, 0, 0, 0, 0, 
+  0, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 
+  1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 
+  1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 
+  1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 
+  1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 
+  1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 
+  1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 
+  1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 
+  1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 
+  1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 
+  1411, 1412, 1413, 1414, 1415, 1416, 1417, 0, 
+  0, 1418, 1419, 1420, 1421, 1422, 1423, 0, 
+  0, 1424, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 340, 340, 340, 340, 
+  340, 340, 340, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 340, 340, 340, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 340, 
+  1160, 1160, 1160, 1160, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 340, 340, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 1160, 1160, 1160, 1160, 1160, 
+  1160, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 340, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 340, 340, 340, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 340, 
+  340, 340, 340, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 340, 340, 340, 1160, 1160, 1160, 1160, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 340, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 340, 340, 340, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 340, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1177, 1044, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1425, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1258, 1259, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 340, 1160, 340, 340, 340, 340, 
+  340, 340, 340, 340, 1044, 1044, 1044, 1426, 
+  1426, 1426, 340, 340, 340, 340, 340, 340, 
+  340, 340, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 1160, 
+  1160, 1160, 1160, 1153, 1153, 1168, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1153, 1153, 1168, 1177, 1177, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1153, 1153, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 1160, 
+  1160, 1160, 0, 1153, 1153, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 574, 574, 1159, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1159, 1159, 1153, 
+  1159, 1159, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1168, 1153, 1177, 1177, 1044, 
+  1179, 1177, 1177, 1177, 1189, 340, 540, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 
+  1427, 1427, 1427, 0, 0, 0, 0, 0, 
+  0, 1428, 1428, 1428, 1428, 1428, 1428, 1424, 
+  1428, 1428, 1428, 1428, 574, 574, 574, 81, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1179, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1153, 1153, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1087, 1160, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 340, 340, 340, 
+  1160, 340, 1160, 340, 1160, 1160, 1160, 340, 
+  340, 1160, 1160, 1160, 340, 340, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 340, 1160, 340, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 340, 340, 340, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1153, 1153, 1153, 1159, 1159, 1159, 1159, 
+  1153, 1153, 1159, 1159, 1159, 0, 0, 0, 
+  0, 1159, 1159, 1153, 1159, 1159, 1159, 1159, 
+  1159, 1159, 1086, 540, 553, 0, 0, 0, 
+  0, 1085, 0, 0, 0, 1428, 1428, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 0, 
+  0, 340, 340, 340, 340, 340, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1190, 0, 0, 0, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  540, 553, 1159, 1159, 1153, 0, 0, 1177, 
+  1177, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1159, 1153, 
+  1159, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  0, 1168, 1284, 1153, 1284, 1284, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1153, 1153, 540, 540, 
+  540, 540, 540, 540, 540, 540, 0, 0, 
+  553, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 
+  1179, 1177, 1177, 1177, 1177, 1177, 1177, 0, 
+  0, 540, 540, 540, 540, 540, 553, 553, 
+  553, 553, 553, 553, 540, 540, 553, 839, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1153, 1153, 1153, 1153, 1159, 1429, 1430, 
+  1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 
+  1160, 1160, 1439, 1440, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1180, 1441, 1153, 
+  1153, 1153, 1153, 1442, 1443, 1444, 1445, 1446, 
+  1447, 1448, 1449, 1450, 1451, 1452, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1177, 1177, 1177, 1177, 1177, 
+  1177, 1177, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 540, 553, 540, 540, 
+  540, 540, 540, 540, 540, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 0, 0, 
+  0, 1153, 1153, 1159, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1159, 1153, 1153, 1153, 1153, 1159, 
+  1159, 1153, 1153, 1452, 1168, 1153, 1153, 1160, 
+  1160, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1180, 
+  1159, 1153, 1153, 1159, 1159, 1159, 1153, 1159, 
+  1153, 1153, 1153, 1452, 1452, 0, 0, 0, 
+  0, 0, 0, 0, 0, 1177, 1177, 1177, 
+  1177, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1159, 1159, 1153, 
+  1180, 0, 0, 0, 1177, 1177, 1177, 1177, 
+  1177, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 1160, 1160, 
+  1160, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 523, 523, 523, 523, 523, 523, 1044, 
+  1044, 1453, 1454, 1455, 1456, 1457, 1457, 1458, 
+  1459, 1460, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 
+  1177, 0, 0, 0, 0, 0, 0, 0, 
+  0, 540, 540, 540, 1177, 566, 553, 553, 
+  553, 553, 553, 540, 540, 553, 553, 553, 
+  553, 540, 1159, 566, 566, 566, 566, 566, 
+  566, 566, 1160, 1160, 1160, 1160, 553, 1160, 
+  1160, 1160, 1160, 1159, 1159, 540, 1160, 1160, 
+  0, 540, 540, 0, 0, 0, 0, 0, 
+  0, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 1461, 1462, 1463, 
+  523, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 
+  1471, 1472, 1473, 1474, 523, 1475, 1476, 1477, 
+  1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 
+  1486, 1487, 1488, 1489, 1490, 1491, 1492, 523, 
+  1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 
+  1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 
+  1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 
+  1517, 1518, 1519, 1520, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 1521, 1522, 1523, 214, 214, 1524, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 1523, 214, 
+  214, 214, 214, 214, 1525, 1526, 1527, 1528, 
+  1491, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 
+  1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 
+  1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 
+  1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 
+  1560, 540, 540, 553, 540, 540, 540, 540, 
+  540, 540, 540, 553, 540, 540, 576, 1561, 
+  553, 555, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 0, 
+  0, 0, 0, 0, 540, 575, 553, 540, 
+  553, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 
+  1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 
+  1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 
+  1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 
+  1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 
+  1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 
+  1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 
+  1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 
+  1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 
+  1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 
+  1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 
+  1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 
+  1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 
+  1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 
+  1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 
+  1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 
+  1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 
+  1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 
+  1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 
+  1713, 1714, 1715, 1716, 1717, 214, 214, 1718, 
+  214, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 
+  1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 
+  1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 
+  1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 
+  1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 
+  1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 
+  1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 
+  1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 
+  1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 
+  1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 
+  1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 
+  1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 
+  1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 
+  1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 
+  1830, 1831, 1832, 1833, 1834, 1835, 1836, 0, 
+  0, 1837, 1838, 1839, 1840, 1841, 1842, 0, 
+  0, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 
+  1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 
+  1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 
+  1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 
+  1874, 1875, 1876, 1877, 1878, 1879, 1880, 0, 
+  0, 1881, 1882, 1883, 1884, 1885, 1886, 0, 
+  0, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 
+  1894, 0, 1895, 0, 1896, 0, 1897, 0, 
+  1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 
+  1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 
+  1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 
+  1922, 1923, 1924, 1925, 1926, 1927, 1928, 0, 
+  0, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 
+  1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 
+  1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 
+  1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 
+  1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 
+  1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 
+  1976, 1977, 1978, 1979, 1980, 1981, 0, 1982, 
+  1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 
+  1991, 1992, 1993, 1994, 1995, 1996, 0, 1997, 
+  1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 
+  2006, 2007, 2008, 2009, 2010, 0, 0, 2011, 
+  2012, 2013, 2014, 2015, 2016, 0, 2017, 2018, 
+  2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 
+  2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 
+  2035, 0, 0, 2036, 2037, 2038, 0, 2039, 
+  2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 
+  0, 2048, 2049, 2050, 2051, 2050, 2050, 2050, 
+  2052, 2050, 2050, 2050, 81, 2053, 2054, 2055, 
+  2056, 1084, 2057, 1084, 1084, 1084, 1084, 9, 
+  2058, 2059, 2060, 2061, 2059, 2059, 2060, 2061, 
+  2059, 9, 9, 9, 9, 2062, 2063, 2064, 
+  9, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 
+  76, 10, 10, 10, 2072, 2073, 9, 2074, 
+  2075, 9, 80, 92, 9, 2076, 9, 2077, 
+  48, 48, 9, 9, 9, 2078, 12, 13, 
+  2079, 2080, 2081, 9, 9, 9, 9, 9, 
+  9, 9, 9, 75, 9, 48, 9, 9, 
+  2082, 9, 9, 9, 9, 9, 9, 9, 
+  2050, 81, 81, 81, 81, 81, 0, 2083, 
+  2084, 2085, 2086, 81, 81, 81, 81, 81, 
+  81, 2087, 2088, 0, 0, 2089, 2090, 2091, 
+  2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 
+  2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 
+  2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 
+  0, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 
+  2123, 2124, 2125, 2126, 2127, 2128, 0, 0, 
+  0, 11, 11, 11, 11, 11, 11, 11, 
+  11, 2129, 11, 11, 11, 11, 11, 11, 
+  11, 11, 11, 11, 11, 11, 11, 11, 
+  11, 11, 1189, 11, 11, 11, 11, 11, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 540, 540, 566, 566, 540, 540, 540, 
+  540, 566, 566, 566, 540, 540, 839, 839, 
+  839, 839, 540, 839, 839, 839, 566, 566, 
+  540, 553, 540, 566, 566, 553, 553, 553, 
+  553, 540, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 2130, 2131, 2132, 2133, 77, 2134, 2135, 
+  2136, 77, 2137, 2138, 2139, 2139, 2139, 2140, 
+  2141, 2142, 2142, 2143, 2144, 77, 2145, 2146, 
+  77, 75, 2147, 2148, 2149, 2149, 2149, 77, 
+  77, 2150, 2151, 2152, 77, 2153, 77, 2154, 
+  77, 2153, 77, 2155, 2156, 2157, 2132, 83, 
+  2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 
+  2166, 2167, 2168, 1085, 2169, 2170, 2171, 2172, 
+  2173, 2174, 75, 75, 75, 75, 2175, 2176, 
+  2158, 2168, 2177, 77, 75, 1085, 77, 2178, 
+  1191, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 
+  2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 
+  2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 
+  2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 
+  2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 
+  2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 
+  2226, 1426, 1426, 2227, 2228, 2229, 1426, 1426, 
+  1426, 2227, 2230, 77, 77, 0, 0, 0, 
+  0, 2231, 75, 2232, 75, 2233, 77, 77, 
+  77, 77, 77, 2234, 2235, 77, 77, 77, 
+  77, 75, 77, 77, 75, 77, 77, 75, 
+  77, 77, 77, 77, 77, 77, 77, 2236, 
+  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, 2237, 2238, 
+  2239, 2240, 77, 2241, 77, 2242, 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, 1109, 75, 75, 
+  75, 75, 1109, 1109, 1109, 1109, 75, 75, 
+  1109, 75, 2243, 2243, 2244, 2245, 75, 75, 
+  75, 2246, 2247, 2243, 2248, 2249, 2243, 75, 
+  75, 75, 2243, 14, 84, 75, 2243, 2243, 
+  75, 75, 75, 2243, 2243, 2243, 2243, 75, 
+  2243, 2243, 2243, 2243, 2250, 2251, 2252, 2253, 
+  75, 75, 75, 75, 2243, 2254, 2255, 2243, 
+  2256, 2257, 2243, 2243, 2243, 75, 75, 75, 
+  75, 75, 2243, 75, 2243, 2258, 2243, 2243, 
+  2243, 2243, 2259, 2243, 2260, 2261, 2262, 2243, 
+  2263, 2264, 2265, 2243, 2243, 2243, 2266, 75, 
+  75, 75, 75, 2243, 2243, 2243, 2243, 75, 
+  75, 75, 75, 75, 75, 75, 75, 75, 
+  2243, 2267, 2268, 2269, 75, 2270, 2271, 2243, 
+  2243, 2243, 2243, 2243, 2243, 75, 2272, 2273, 
+  2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 
+  2282, 2283, 2284, 2285, 2286, 2287, 2288, 2243, 
+  2243, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 
+  2296, 2297, 2298, 2243, 2243, 2243, 75, 75, 
+  2243, 2243, 2299, 2300, 75, 75, 75, 75, 
+  75, 2243, 75, 75, 75, 75, 75, 75, 
+  75, 75, 75, 2301, 2243, 75, 75, 2243, 
+  2243, 2302, 2303, 2243, 2304, 2305, 2306, 2307, 
+  2308, 2243, 2243, 2309, 2310, 2311, 2312, 2243, 
+  2243, 2243, 75, 75, 75, 75, 75, 2243, 
+  2243, 75, 75, 75, 75, 75, 75, 75, 
+  75, 75, 2243, 2243, 2243, 2243, 2243, 75, 
+  75, 2243, 2243, 75, 75, 75, 75, 2243, 
+  2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 
+  2243, 2313, 2314, 2315, 2316, 2243, 2243, 2243, 
+  2243, 2243, 2243, 2317, 2318, 2319, 2320, 75, 
+  75, 2243, 2243, 2321, 2321, 2243, 2321, 2321, 
+  2243, 2243, 2321, 2321, 2321, 2243, 2321, 2243, 
+  2321, 77, 77, 77, 77, 77, 77, 77, 
+  77, 12, 13, 12, 13, 77, 77, 77, 
+  77, 77, 77, 77, 77, 77, 77, 77, 
+  77, 77, 77, 1085, 1085, 77, 77, 77, 
+  77, 2243, 2243, 77, 77, 77, 77, 77, 
+  77, 77, 2322, 2323, 77, 77, 77, 77, 
+  77, 77, 77, 77, 77, 77, 77, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 1085, 1109, 1085, 1085, 
+  77, 77, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 838, 77, 
+  1085, 1085, 1085, 1085, 75, 75, 75, 75, 
+  75, 75, 75, 75, 75, 75, 75, 75, 
+  75, 75, 75, 75, 75, 75, 75, 75, 
+  75, 75, 75, 1109, 1109, 1085, 1085, 1085, 
+  77, 77, 77, 77, 77, 77, 77, 77, 
+  77, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 77, 77, 1085, 1085, 
+  77, 77, 77, 77, 77, 1085, 1085, 1085, 
+  1085, 1085, 1085, 77, 1085, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1085, 1085, 1085, 1085, 1085, 
+  1085, 77, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 77, 77, 77, 77, 77, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 77, 77, 77, 77, 77, 77, 77, 
+  77, 77, 77, 77, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 
+  2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 
+  2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 
+  2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 
+  2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 
+  2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 
+  2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 
+  2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 
+  2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 
+  2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 
+  2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 
+  2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 
+  2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 
+  2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 
+  2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 
+  2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 
+  2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 
+  2459, 2460, 2461, 2462, 1220, 1220, 1220, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 
+  1220, 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, 
+  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, 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, 
+  75, 77, 77, 77, 77, 77, 77, 77, 
+  77, 77, 75, 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, 75, 75, 75, 75, 75, 1109, 1109, 
+  75, 77, 77, 77, 1085, 77, 77, 77, 
+  77, 77, 77, 77, 77, 77, 77, 77, 
+  77, 77, 77, 77, 77, 1085, 1085, 1085, 
+  1085, 1085, 1085, 77, 77, 77, 2463, 77, 
+  77, 77, 77, 1085, 1085, 1085, 77, 77, 
+  77, 77, 77, 77, 1085, 1085, 77, 77, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 77, 77, 77, 77, 77, 77, 77, 
+  77, 77, 77, 77, 77, 77, 77, 77, 
+  77, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 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, 
+  75, 77, 77, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 77, 77, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 77, 1085, 1085, 1085, 838, 1085, 1085, 
+  1085, 1085, 1085, 77, 77, 77, 77, 1085, 
+  77, 77, 77, 77, 77, 77, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 77, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 2464, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 2464, 2464, 2464, 2464, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 2465, 1085, 1085, 
+  1085, 12, 13, 12, 13, 12, 13, 12, 
+  13, 12, 13, 12, 13, 12, 13, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 2243, 1109, 75, 2321, 2321, 12, 13, 
+  75, 2321, 2321, 75, 2321, 2321, 2321, 1109, 
+  1109, 1109, 75, 1109, 2243, 2243, 2321, 2321, 
+  1109, 1109, 1109, 1109, 1109, 2321, 2321, 2321, 
+  1109, 75, 1109, 2321, 2321, 2321, 2321, 12, 
+  13, 12, 13, 12, 13, 12, 13, 12, 
+  13, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 75, 75, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 75, 75, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 75, 75, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 75, 1109, 1109, 75, 75, 1109, 
+  75, 1109, 75, 1109, 1109, 75, 75, 1109, 
+  1109, 75, 75, 1109, 1109, 75, 75, 1109, 
+  1109, 75, 75, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 75, 75, 1109, 
+  1109, 75, 1109, 75, 12, 13, 12, 13, 
+  12, 13, 12, 13, 12, 13, 12, 13, 
+  12, 13, 12, 13, 1258, 1259, 1258, 1259, 
+  12, 13, 75, 1109, 2321, 2321, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2321, 2321, 2321, 2243, 
+  2243, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 
+  2321, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 2321, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 2321, 2321, 2321, 2321, 2321, 2321, 1109, 
+  1109, 1109, 2321, 1109, 1109, 1109, 1109, 2321, 
+  2321, 2321, 2243, 2243, 75, 2243, 2243, 75, 
+  75, 12, 13, 1258, 1259, 2321, 1109, 1109, 
+  1109, 1109, 2321, 1109, 2321, 2321, 2321, 1109, 
+  1109, 2321, 2321, 1109, 75, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 2321, 2243, 2243, 
+  2243, 2243, 2243, 75, 75, 12, 13, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 2321, 2321, 2466, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2321, 2321, 1109, 2243, 
+  2243, 2321, 2243, 75, 75, 2243, 75, 2243, 
+  1109, 75, 2243, 75, 2243, 2243, 2321, 2321, 
+  75, 75, 75, 75, 1109, 2321, 2321, 1109, 
+  1109, 1109, 1109, 1109, 1109, 2243, 2243, 2243, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 75, 
+  75, 75, 75, 75, 75, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  2321, 2321, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 2321, 2321, 75, 
+  75, 1109, 1109, 2243, 2243, 2243, 2243, 1109, 
+  2243, 2243, 75, 75, 2243, 2467, 2468, 2469, 
+  75, 1109, 2321, 2321, 2321, 2321, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2243, 2243, 2321, 2321, 
+  2243, 2243, 2243, 2243, 2243, 2243, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2321, 1109, 1109, 2321, 
+  2321, 2321, 2321, 2321, 2321, 2321, 2321, 1109, 
+  2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 
+  2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 
+  2321, 2321, 2243, 2243, 2243, 2243, 2321, 2321, 
+  2321, 2321, 2321, 2321, 2243, 2243, 2243, 2243, 
+  1109, 1109, 1109, 1109, 1109, 2470, 2471, 2243, 
+  1109, 1109, 1109, 2321, 2321, 2321, 2321, 2321, 
+  1109, 1109, 1109, 1109, 1109, 2321, 2321, 2243, 
+  75, 75, 75, 75, 2321, 1109, 1109, 75, 
+  2321, 2321, 2321, 2321, 2321, 1109, 2321, 75, 
+  75, 1085, 1085, 1085, 1085, 1085, 1085, 77, 
+  77, 1085, 1085, 1085, 1085, 1085, 77, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 77, 77, 
+  1085, 1085, 1085, 1085, 1085, 1085, 77, 77, 
+  77, 77, 77, 77, 77, 1085, 1085, 77, 
+  77, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1085, 1085, 
+  1109, 1109, 1109, 1109, 1109, 1109, 1085, 77, 
+  77, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 0, 0, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 0, 0, 0, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 0, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 1085, 1085, 1085, 
+  1085, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 
+  2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 
+  2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 
+  2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 
+  2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 
+  2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 
+  0, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 
+  2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 
+  2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 
+  2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 
+  2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 
+  2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 
+  0, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 
+  2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 
+  2581, 2582, 214, 2583, 2584, 214, 2585, 2586, 
+  214, 214, 214, 214, 214, 2587, 2588, 2589, 
+  2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 
+  2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 
+  2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 
+  2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 
+  2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 
+  2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 
+  2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 
+  2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 
+  2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 
+  2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 
+  2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 
+  2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 
+  2686, 2687, 2688, 2689, 2690, 214, 77, 77, 
+  1085, 77, 77, 1085, 2691, 2692, 2693, 2694, 
+  540, 540, 540, 2695, 2696, 0, 0, 0, 
+  0, 0, 9, 9, 9, 9, 1427, 9, 
+  9, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 
+  2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 
+  2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 
+  2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 
+  2728, 2729, 2730, 2731, 2732, 2733, 2734, 0, 
+  2735, 0, 0, 0, 0, 0, 2736, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 0, 0, 0, 0, 0, 0, 0, 
+  2737, 1044, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  1168, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 9, 9, 80, 92, 80, 92, 9, 
+  9, 9, 80, 92, 9, 80, 92, 1428, 
+  1428, 1428, 1428, 9, 1428, 1428, 1428, 9, 
+  1084, 9, 9, 1084, 9, 80, 92, 9, 
+  9, 80, 92, 12, 13, 12, 13, 12, 
+  13, 12, 13, 9, 9, 9, 9, 9, 
+  522, 9, 9, 9, 9, 9, 9, 9, 
+  9, 9, 9, 1084, 1084, 9, 9, 9, 
+  9, 1084, 9, 2061, 1428, 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, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 0, 1085, 1085, 1085, 1085, 
+  2738, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 2739, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 
+  2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 
+  2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 
+  2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 
+  2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 
+  2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 
+  2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 
+  2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 
+  2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 
+  2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 
+  2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 
+  2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 
+  2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 
+  2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 
+  2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 
+  2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 
+  2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 
+  2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 
+  2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 
+  2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 
+  2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 
+  2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 
+  2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 
+  2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 
+  2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 
+  2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 
+  2947, 2948, 2949, 2950, 2951, 2952, 2953, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 0, 0, 0, 
+  0, 2954, 1428, 1428, 1428, 1085, 1179, 1160, 
+  2227, 1258, 1259, 1258, 1259, 1258, 1259, 1258, 
+  1259, 1258, 1259, 1085, 1085, 1258, 1259, 1258, 
+  1259, 1258, 1259, 1258, 1259, 1424, 2955, 2956, 
+  2956, 1085, 2227, 2227, 2227, 2227, 2227, 2227, 
+  2227, 2227, 2227, 2957, 1087, 552, 1086, 2958, 
+  2958, 1424, 1179, 1179, 1179, 1179, 1179, 2959, 
+  1085, 2960, 2961, 2962, 1179, 1160, 1428, 1085, 
+  77, 0, 1160, 1160, 1160, 1160, 1160, 2963, 
+  1160, 1160, 1160, 1160, 2964, 2965, 2966, 2967, 
+  2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 
+  2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 
+  2984, 2985, 2986, 2987, 1160, 2988, 2989, 2990, 
+  2991, 2992, 2993, 1160, 1160, 1160, 1160, 1160, 
+  2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 
+  3002, 3003, 3004, 3005, 3006, 3007, 3008, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 3009, 1160, 1160, 
+  0, 0, 3010, 3011, 3012, 3013, 3014, 3015, 
+  3016, 1424, 1160, 1160, 1160, 1160, 1160, 3017, 
+  1160, 1160, 1160, 1160, 3018, 3019, 3020, 3021, 
+  3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 
+  3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 
+  3038, 3039, 3040, 3041, 1160, 3042, 3043, 3044, 
+  3045, 3046, 3047, 1160, 1160, 1160, 1160, 1160, 
+  3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 
+  3056, 3057, 3058, 3059, 3060, 3061, 3062, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  3063, 3064, 3065, 3066, 1160, 3067, 1160, 1160, 
+  3068, 3069, 3070, 3071, 1428, 1179, 3072, 3073, 
+  3074, 0, 0, 0, 0, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 0, 
+  0, 0, 3075, 3076, 3077, 3078, 3079, 3080, 
+  3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 
+  3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 
+  3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, 
+  3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 
+  3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 
+  3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 
+  3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 
+  3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 
+  3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 
+  3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 
+  3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 
+  0, 1191, 1191, 3169, 3170, 3171, 3172, 3173, 
+  3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 
+  3182, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 
+  3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 
+  3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 
+  3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 
+  0, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 
+  3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 
+  3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 
+  3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 
+  3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 
+  3253, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 
+  3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 
+  3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 
+  3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 
+  3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 
+  3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 
+  1191, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 
+  3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 
+  3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 
+  3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 
+  3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 
+  3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 
+  3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 
+  3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 
+  3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 
+  3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 
+  3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 
+  3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 
+  3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 
+  3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 
+  3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 
+  3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 
+  0, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 
+  3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 
+  3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 
+  3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 
+  3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 
+  3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 
+  3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 
+  3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 
+  3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 
+  3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 
+  3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 
+  3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 
+  3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 
+  3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 
+  3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 
+  3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, 
+  3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 
+  3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 
+  3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 
+  3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 
+  3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 
+  3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 
+  3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 
+  3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 
+  3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 
+  3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 
+  3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 
+  3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 
+  3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 
+  3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 
+  3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 
+  3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 
+  3683, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1179, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 523, 523, 523, 523, 523, 523, 1044, 
+  1044, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1179, 1428, 1428, 
+  1428, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1160, 1160, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 
+  3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 
+  3699, 3700, 3701, 3702, 3703, 3704, 3705, 3706, 
+  3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 
+  3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 
+  3723, 3724, 3725, 3726, 3727, 3728, 3729, 1160, 
+  540, 839, 839, 839, 9, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 9, 
+  522, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 
+  3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 
+  3745, 3746, 3747, 3748, 3749, 3750, 3751, 3752, 
+  3753, 3754, 3755, 3756, 3757, 3758, 3759, 540, 
+  540, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 540, 540, 1044, 1044, 1044, 1044, 1044, 
+  1044, 0, 0, 0, 0, 0, 0, 0, 
+  0, 47, 47, 47, 47, 47, 47, 47, 
+  47, 47, 47, 47, 47, 47, 47, 47, 
+  47, 47, 47, 47, 47, 47, 47, 47, 
+  522, 522, 522, 522, 522, 522, 522, 522, 
+  522, 47, 47, 3760, 3761, 3762, 3763, 3764, 
+  3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, 
+  3773, 214, 214, 3774, 3775, 3776, 3777, 3778, 
+  3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 
+  3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 
+  3795, 3796, 3797, 3798, 3799, 3800, 3801, 3802, 
+  3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 
+  3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 
+  3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 
+  3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, 
+  3835, 3836, 1523, 1523, 1523, 1523, 1523, 1523, 
+  1523, 214, 3837, 3838, 3839, 3840, 3841, 3842, 
+  3843, 3844, 3845, 3846, 3847, 3848, 3849, 3850, 
+  3851, 522, 3852, 3852, 3853, 3854, 3855, 214, 
+  340, 3856, 3857, 3858, 3859, 214, 214, 3860, 
+  3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 
+  3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 
+  3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 
+  0, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 
+  3892, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  340, 3893, 3894, 214, 340, 340, 340, 340, 
+  1160, 1160, 1160, 1153, 1160, 1160, 1160, 1168, 
+  1160, 1160, 1160, 1160, 1153, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1159, 1159, 1153, 1153, 
+  1159, 77, 77, 1085, 1085, 0, 0, 0, 
+  0, 1190, 1190, 1190, 1190, 1190, 1190, 1191, 
+  1191, 1189, 3895, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1428, 1428, 1428, 
+  1428, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1159, 1159, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1168, 1153, 0, 
+  0, 0, 0, 0, 0, 0, 0, 1177, 
+  1177, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1177, 1177, 1177, 1160, 1177, 1160, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1153, 
+  1153, 1153, 1153, 1153, 553, 553, 553, 1177, 
+  1177, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1159, 1452, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  1177, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 
+  1327, 1327, 1327, 1327, 1327, 1327, 0, 0, 
+  0, 1153, 1153, 1153, 1159, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1180, 1159, 1159, 1153, 
+  1153, 1153, 1153, 1159, 1159, 1153, 1159, 1159, 
+  1159, 1452, 1177, 1177, 1177, 1177, 1177, 1177, 
+  1177, 1177, 1177, 1177, 1177, 1177, 1177, 0, 
+  1179, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 1177, 
+  1177, 340, 1160, 1160, 1160, 1160, 1153, 523, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1178, 1160, 1160, 1160, 340, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1159, 1159, 1153, 1153, 1159, 1159, 1153, 1153, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1153, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1153, 1159, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 1177, 1177, 1177, 
+  1177, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1179, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1191, 1191, 1191, 1160, 1284, 1153, 1284, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 540, 1160, 540, 540, 553, 1160, 1160, 
+  540, 540, 1160, 1160, 1160, 1160, 1160, 540, 
+  540, 1160, 540, 1160, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 1160, 1160, 1179, 1177, 
+  1177, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1159, 1153, 1153, 1159, 
+  1159, 1177, 1177, 1160, 1179, 1179, 1159, 1168, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 214, 214, 214, 214, 
+  214, 214, 214, 214, 3896, 214, 214, 214, 
+  214, 214, 214, 214, 3852, 3897, 3898, 3899, 
+  3900, 214, 214, 214, 214, 214, 214, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 
+  3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 
+  3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 
+  3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 
+  3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 
+  3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 
+  3948, 3949, 3950, 3951, 3952, 3953, 3954, 3955, 
+  3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 
+  3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 
+  3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 
+  3980, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1159, 1159, 1153, 1159, 
+  1159, 1153, 1159, 1159, 1177, 1159, 1168, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3981, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3981, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 3982, 3982, 3982, 
+  3982, 3982, 3982, 3982, 3982, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 
+  0, 0, 0, 0, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 
+  1331, 1331, 1331, 1331, 1331, 0, 0, 0, 
+  0, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 
+  3983, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 
+  3992, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 
+  3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 
+  4007, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 
+  4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 
+  4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 
+  4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 
+  4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 
+  4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054, 
+  4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 
+  4063, 4064, 4065, 4066, 4067, 4068, 4069, 4070, 
+  4071, 4072, 4073, 4074, 4075, 4004, 4076, 4077, 
+  4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 
+  4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 
+  4094, 4095, 4096, 4097, 4098, 4099, 4100, 4101, 
+  4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 
+  4110, 4111, 4112, 4113, 4114, 4115, 4116, 4117, 
+  4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 
+  4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 
+  4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 
+  4142, 4143, 4094, 4144, 4145, 4146, 4147, 4148, 
+  4149, 4150, 4151, 4078, 4152, 4153, 4154, 4155, 
+  4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 
+  4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 
+  4004, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 
+  4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 
+  4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 
+  4195, 4196, 4197, 4198, 4080, 4199, 4200, 4201, 
+  4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 
+  4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 
+  4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 
+  4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 
+  4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, 
+  4242, 4243, 4244, 4245, 4246, 4247, 4248, 1160, 
+  1160, 4249, 1160, 4250, 1160, 1160, 4251, 4252, 
+  4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 
+  1160, 4261, 1160, 4262, 1160, 1160, 4263, 4264, 
+  1160, 1160, 1160, 4265, 4266, 4267, 4268, 4269, 
+  4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 
+  4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 
+  4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 
+  4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 
+  4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, 
+  4133, 4310, 4311, 4312, 4313, 4314, 4315, 4315, 
+  4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 
+  4263, 4324, 4325, 4326, 4327, 4328, 4329, 0, 
+  0, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 
+  4337, 4277, 4338, 4339, 4340, 4249, 4341, 4342, 
+  4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 
+  4351, 4352, 4286, 4353, 4287, 4354, 4355, 4356, 
+  4357, 4358, 4250, 4025, 4359, 4360, 4361, 4095, 
+  4182, 4362, 4363, 4294, 4364, 4295, 4365, 4366, 
+  4367, 4252, 4368, 4369, 4370, 4371, 4372, 4253, 
+  4373, 4374, 4375, 4376, 4377, 4378, 4309, 4379, 
+  4380, 4133, 4381, 4313, 4382, 4383, 4384, 4385, 
+  4386, 4318, 4387, 4262, 4388, 4319, 4076, 4389, 
+  4320, 4390, 4322, 4391, 4392, 4393, 4394, 4395, 
+  4324, 4258, 4396, 4325, 4397, 4326, 4398, 3992, 
+  4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 
+  4407, 4408, 4409, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 4417, 4418, 4419, 4420, 
+  4421, 0, 0, 0, 0, 0, 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, 
+  0, 4448, 4449, 4450, 4451, 4452, 0, 4453, 
+  0, 4454, 4455, 0, 4456, 4457, 0, 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, 4566, 4566, 4566, 4566, 
+  4566, 4566, 4566, 4566, 4566, 4566, 4566, 4566, 
+  4566, 4566, 4566, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 4567, 4568, 4569, 4570, 
+  4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 
+  4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 
+  4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594, 
+  4595, 4596, 4597, 4598, 4599, 4600, 4601, 4602, 
+  4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 
+  4611, 4612, 4613, 4614, 4605, 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, 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, 4606, 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, 
+  4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 
+  4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 
+  4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, 
+  4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, 
+  4801, 4802, 4803, 4804, 4805, 4806, 4807, 4808, 
+  4809, 4810, 4811, 4812, 4813, 4814, 4815, 4816, 
+  4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, 
+  4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 
+  4833, 4834, 4835, 4836, 4837, 4838, 4839, 4840, 
+  4841, 4842, 4843, 4844, 4845, 4846, 4847, 4848, 
+  4849, 4850, 4851, 4852, 4853, 4854, 4855, 4856, 
+  4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864, 
+  4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 
+  4873, 4874, 4875, 4876, 4877, 4878, 4879, 4880, 
+  4881, 4882, 4883, 4884, 4885, 4886, 4887, 4888, 
+  4889, 4890, 4891, 4892, 4893, 4894, 4895, 4896, 
+  4897, 4898, 4899, 4900, 4901, 4902, 4903, 4904, 
+  4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 
+  4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 
+  4921, 4922, 4923, 4924, 4925, 4926, 4927, 2956, 
+  2955, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 
+  4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 
+  4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 
+  4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 
+  4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 
+  4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 
+  4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 
+  4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, 
+  4991, 0, 0, 4992, 4993, 4994, 4995, 4996, 
+  4997, 4998, 4999, 5000, 5001, 5002, 5003, 5004, 
+  5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 
+  5013, 5014, 5015, 5016, 5017, 5018, 5019, 5020, 
+  5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 
+  5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 
+  5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, 
+  5045, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 
+  5053, 5054, 5055, 5056, 5057, 5058, 1085, 0, 
+  0, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 
+  5066, 5067, 5068, 0, 0, 0, 0, 0, 
+  0, 540, 540, 540, 540, 540, 540, 540, 
+  553, 553, 553, 553, 553, 553, 553, 540, 
+  540, 5069, 5070, 5071, 5072, 5072, 5073, 5074, 
+  5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 
+  5083, 5084, 5085, 5086, 5087, 5088, 1428, 1428, 
+  5089, 5090, 5091, 5091, 5091, 5091, 5092, 5092, 
+  5092, 5093, 5094, 5095, 0, 5096, 5097, 5098, 
+  5099, 5100, 5101, 5102, 5103, 5104, 5105, 5106, 
+  5107, 5108, 5109, 5110, 5111, 5112, 5113, 5114, 
+  0, 5115, 5116, 5117, 5118, 0, 0, 0, 
+  0, 5119, 5120, 5121, 1118, 5122, 0, 5123, 
+  5124, 5125, 5126, 5127, 5128, 5129, 5130, 5131, 
+  5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 
+  5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, 
+  5148, 5149, 5150, 5151, 5152, 5153, 5154, 5155, 
+  5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 
+  5164, 5165, 5166, 5167, 5168, 5169, 5170, 5171, 
+  5172, 5173, 5174, 5175, 5176, 5177, 5178, 5179, 
+  5180, 5181, 5182, 5183, 5184, 5185, 5186, 5187, 
+  5188, 5189, 5190, 5191, 5192, 5193, 5194, 5195, 
+  5196, 5197, 5198, 5199, 5200, 5201, 5202, 5203, 
+  5204, 5205, 5206, 5207, 5208, 5209, 5210, 5211, 
+  5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 
+  5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, 
+  5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, 
+  5236, 5237, 5238, 5239, 5240, 5241, 5242, 5243, 
+  5244, 5245, 5246, 5247, 5248, 5249, 5250, 5251, 
+  5252, 5253, 5254, 5255, 5256, 5257, 0, 0, 
+  81, 0, 5258, 5259, 5260, 5261, 5262, 5263, 
+  5264, 5265, 5266, 5267, 5268, 5269, 5270, 5271, 
+  5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, 
+  5280, 5281, 5282, 5283, 5284, 5285, 5286, 5287, 
+  5288, 5289, 5290, 5291, 5292, 5293, 5294, 5295, 
+  5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303, 
+  5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 
+  5312, 5313, 5314, 5315, 5316, 5317, 5318, 5319, 
+  5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, 
+  5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, 
+  5336, 5337, 5338, 5339, 5340, 5341, 5342, 5343, 
+  5344, 5345, 5346, 5347, 5348, 5349, 5350, 5351, 
+  5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359, 
+  5360, 5361, 5362, 5363, 5364, 5365, 5366, 5367, 
+  5368, 5369, 5370, 5371, 5372, 5373, 5374, 5375, 
+  5376, 5377, 5378, 5379, 5380, 5381, 5382, 5383, 
+  5384, 5385, 5386, 5387, 5388, 5389, 5390, 5391, 
+  5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399, 
+  5400, 5401, 5402, 5403, 5404, 5405, 5406, 5407, 
+  5408, 5409, 5410, 5411, 5412, 5413, 5414, 5415, 
+  5416, 5417, 5418, 5419, 5420, 5421, 5422, 5423, 
+  5424, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 
+  5432, 5433, 5434, 5435, 5436, 5437, 5438, 5439, 
+  5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 
+  0, 0, 0, 5448, 5449, 5450, 5451, 5452, 
+  5453, 0, 0, 5454, 5455, 5456, 5457, 5458, 
+  5459, 0, 0, 5460, 5461, 5462, 5463, 5464, 
+  5465, 0, 0, 5466, 5467, 5468, 0, 0, 
+  0, 5469, 5470, 5471, 5472, 5473, 5474, 5475, 
+  0, 5476, 5477, 5478, 5479, 5480, 5481, 5482, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 5483, 5483, 5483, 1085, 77, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 0, 340, 1160, 
+  1160, 340, 340, 340, 1160, 340, 340, 340, 
+  340, 340, 340, 340, 340, 1160, 340, 340, 
+  340, 340, 340, 1160, 1160, 1160, 340, 340, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 1160, 
+  340, 340, 340, 340, 0, 340, 340, 0, 
+  340, 340, 1160, 340, 340, 1160, 1160, 1160, 
+  340, 340, 340, 1160, 1160, 340, 1160, 0, 
+  0, 340, 340, 1160, 340, 340, 1160, 340, 
+  1160, 1160, 1160, 340, 1160, 1160, 1160, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 1160, 1160, 1160, 1160, 340, 
+  340, 340, 340, 1160, 1160, 1160, 1160, 1160, 
+  340, 1160, 340, 340, 340, 340, 1160, 1160, 
+  1160, 1160, 1160, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 340, 1160, 340, 1160, 
+  1160, 1160, 1160, 1160, 340, 340, 1160, 1160, 
+  1160, 1160, 1160, 1160, 340, 1160, 1160, 1160, 
+  1160, 1160, 340, 340, 340, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 0, 0, 0, 0, 
+  0, 1044, 9, 1044, 0, 0, 0, 0, 
+  5484, 5484, 5484, 5484, 5484, 5484, 5484, 5484, 
+  5484, 5484, 5484, 5484, 5484, 5484, 5484, 5484, 
+  5484, 5484, 5484, 5484, 5484, 5484, 5484, 5484, 
+  5484, 5484, 1190, 5484, 1190, 5484, 1190, 1190, 
+  1190, 1190, 1190, 1190, 5484, 1190, 5484, 1190, 
+  1190, 1190, 1190, 1190, 1190, 0, 0, 0, 
+  1191, 838, 1191, 838, 838, 838, 838, 838, 
+  1191, 5485, 5485, 5485, 5485, 5485, 5485, 5485, 
+  5485, 5485, 5485, 5485, 5485, 5485, 5485, 5485, 
+  5485, 5485, 5485, 5485, 5485, 5485, 5485, 5485, 
+  5485, 5485, 5485, 5485, 5485, 5485, 5485, 5485, 
+  5485, 5485, 5485, 5485, 5485, 5485, 5485, 5485, 
+  5485, 5485, 5486, 5486, 5486, 5486, 5486, 5486, 
+  5485, 5486, 5485, 5485, 5485, 5485, 1427, 1427, 
+  1220, 1427, 77, 77, 77, 77, 77, 77, 
+  77, 77, 77, 77, 77, 77, 77, 77, 
+  77, 1085, 77, 1427, 1427, 77, 838, 838, 
+  0, 77, 77, 77, 77, 77, 77, 77, 
+  1085, 1085, 1085, 77, 77, 0, 0, 0, 
+  0, 77, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 553, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 1160, 
+  1160, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 340, 1160, 340, 340, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 340, 340, 340, 340, 340, 340, 
+  1160, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 553, 5487, 5487, 5487, 5487, 5487, 5487, 
+  5487, 5487, 5487, 5487, 5487, 5487, 5487, 5487, 
+  5487, 5487, 5487, 5487, 5487, 5487, 5487, 5487, 
+  5487, 5487, 5487, 5487, 5487, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 5484, 5484, 5484, 5484, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 1426, 340, 340, 340, 340, 340, 
+  340, 340, 340, 1426, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 540, 
+  540, 540, 540, 540, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 0, 
+  1177, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1177, 2227, 2227, 2227, 2227, 2227, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 5488, 5489, 5490, 5491, 5492, 5493, 5494, 
+  5495, 5496, 5497, 5498, 5499, 5500, 5501, 5502, 
+  5503, 5504, 5505, 5506, 5507, 5508, 5509, 5510, 
+  5511, 5512, 5513, 5514, 5515, 5516, 5517, 5518, 
+  5519, 5520, 5521, 5522, 5523, 5524, 5525, 5526, 
+  5527, 5528, 5529, 5530, 5531, 5532, 5533, 5534, 
+  5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 
+  5543, 5544, 5545, 5546, 5547, 5548, 5549, 5550, 
+  5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, 
+  5559, 5560, 5561, 5562, 5563, 5564, 5565, 5566, 
+  5567, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 1160, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 1160, 
+  340, 1160, 340, 340, 1160, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 1160, 0, 
+  0, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 0, 0, 0, 0, 0, 
+  0, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 
+  5575, 5576, 5577, 5578, 5579, 5580, 5581, 5582, 
+  5583, 5584, 5585, 5586, 5587, 5588, 5589, 5590, 
+  5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 
+  5599, 5600, 5601, 5602, 5603, 0, 0, 0, 
+  0, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 
+  5611, 5612, 5613, 5614, 5615, 5616, 5617, 5618, 
+  5619, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 
+  5627, 5628, 5629, 5630, 5631, 5632, 5633, 5634, 
+  5635, 5636, 5637, 5638, 5639, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  1044, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 1160, 340, 340, 340, 
+  340, 1160, 340, 1160, 1160, 1160, 340, 340, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 340, 340, 1160, 340, 340, 1160, 1160, 
+  340, 340, 1160, 1160, 1160, 1160, 340, 1160, 
+  340, 340, 340, 340, 340, 1160, 1160, 1160, 
+  340, 1160, 340, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 340, 1160, 1160, 1160, 340, 
+  1160, 1160, 340, 340, 1160, 1160, 1160, 1160, 
+  1160, 1160, 340, 340, 1160, 1160, 1160, 340, 
+  340, 340, 340, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 340, 1160, 1160, 1160, 1160, 
+  340, 1160, 1160, 340, 340, 340, 1160, 1160, 
+  1160, 1160, 340, 340, 340, 1160, 1160, 1160, 
+  1160, 340, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 1160, 1160, 1160, 1160, 1160, 340, 340, 
+  1160, 1160, 340, 1160, 1160, 340, 1160, 1160, 
+  1160, 1160, 1160, 340, 1160, 1160, 1160, 340, 
+  1160, 1160, 340, 1160, 1160, 340, 1160, 340, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 340, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 340, 340, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 340, 1160, 
+  340, 340, 340, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 340, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 340, 1160, 1160, 340, 1160, 340, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1156, 1156, 1156, 1106, 1156, 1106, 0, 
+  0, 1156, 0, 1106, 1156, 1156, 1156, 1156, 
+  1156, 1106, 1156, 1106, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1106, 1156, 1156, 1156, 1156, 1106, 
+  1156, 1106, 1156, 1156, 1106, 1106, 1156, 1106, 
+  1156, 1106, 1106, 1106, 1106, 1156, 1106, 1106, 
+  1106, 1106, 1106, 1156, 1106, 1156, 1106, 0, 
+  1156, 1106, 0, 0, 0, 1156, 0, 0, 
+  1156, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 0, 
+  1103, 5640, 5640, 5640, 5640, 5640, 5640, 5640, 
+  5640, 1156, 1156, 1156, 1106, 1106, 1106, 1106, 
+  1156, 1106, 1106, 1156, 1106, 1156, 1106, 1106, 
+  1156, 1156, 1106, 1156, 1156, 1106, 1156, 1156, 
+  5641, 5641, 5640, 5640, 5642, 5642, 5642, 5642, 
+  5640, 1156, 1106, 1156, 1156, 1156, 1106, 1106, 
+  1106, 1106, 1106, 1156, 1156, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1156, 
+  1156, 1106, 1156, 1156, 1106, 1106, 1106, 1106, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  5640, 5640, 5640, 5640, 5640, 5640, 5640, 5640, 
+  5640, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 0, 1106, 1106, 0, 
+  0, 0, 0, 0, 5640, 5640, 5640, 5640, 
+  5640, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 5640, 
+  5640, 5640, 5640, 5640, 5640, 0, 0, 0, 
+  9, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 0, 0, 0, 0, 0, 
+  1103, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1156, 1106, 1156, 1156, 1156, 1156, 1156, 
+  1106, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1106, 1156, 1156, 1156, 1156, 1156, 1156, 1106, 
+  1156, 1156, 1106, 1156, 1106, 1156, 1106, 1106, 
+  1106, 1106, 1156, 1106, 1156, 1106, 1156, 1106, 
+  1106, 1106, 1156, 1106, 1156, 1106, 1156, 1156, 
+  1106, 0, 0, 0, 0, 5642, 5640, 1106, 
+  1156, 5640, 5640, 5640, 5640, 5642, 5642, 5642, 
+  5640, 5640, 5642, 5642, 5642, 5642, 5642, 5642, 
+  5642, 0, 0, 5642, 5642, 5642, 5642, 5642, 
+  5642, 5642, 5642, 5642, 5642, 5642, 5642, 5642, 
+  5642, 5642, 5642, 5642, 5642, 5642, 5642, 5642, 
+  5642, 5642, 5642, 5642, 5642, 5642, 5642, 5642, 
+  5642, 5642, 5642, 5642, 5642, 5642, 5642, 5640, 
+  5640, 5640, 5640, 5642, 5640, 5642, 5642, 5642, 
+  5642, 1156, 1153, 1153, 1153, 0, 1153, 1153, 
+  0, 0, 0, 0, 0, 1153, 553, 1153, 
+  540, 1156, 1156, 1156, 1156, 0, 1156, 1156, 
+  1156, 0, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 0, 0, 0, 
+  0, 540, 566, 553, 0, 0, 0, 0, 
+  1168, 5642, 5642, 5642, 5642, 5642, 5642, 5642, 
+  5642, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 
+  1158, 1158, 0, 0, 0, 0, 0, 0, 
+  0, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 5640, 5640, 
+  1103, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 5640, 5640, 
+  5640, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1106, 1156, 1156, 1106, 1106, 1106, 1156, 
+  1106, 5643, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1156, 1156, 1156, 1106, 1156, 1156, 1156, 
+  1106, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1106, 1156, 1156, 1106, 540, 553, 
+  0, 0, 0, 0, 5640, 5642, 5642, 5642, 
+  5642, 1158, 1158, 1158, 1158, 1103, 1103, 1103, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1106, 1156, 1156, 1156, 1156, 1106, 1106, 
+  1106, 1156, 1156, 1156, 1156, 1106, 1106, 1106, 
+  1106, 1106, 1156, 1156, 1156, 1156, 1106, 1156, 
+  1106, 1106, 1106, 1106, 1156, 1106, 1106, 1106, 
+  1106, 1156, 1156, 1106, 1106, 1106, 1106, 1106, 
+  1156, 1106, 1106, 1156, 1156, 1106, 1106, 1106, 
+  1106, 1106, 1156, 1156, 1156, 1156, 1156, 0, 
+  0, 0, 9, 9, 9, 9, 9, 9, 
+  9, 1156, 1156, 1106, 1106, 1156, 1106, 1106, 
+  1106, 1156, 1106, 1156, 1106, 1156, 1156, 1106, 
+  1106, 1156, 1156, 1106, 1106, 1106, 1106, 0, 
+  0, 5640, 5640, 5640, 5640, 5640, 5640, 5642, 
+  5640, 1106, 1106, 1106, 1106, 1156, 1106, 1106, 
+  1156, 1106, 1106, 1106, 1106, 1156, 1106, 1156, 
+  1106, 1106, 1156, 1106, 0, 0, 0, 0, 
+  0, 5640, 5640, 5640, 5640, 5640, 5640, 5640, 
+  5640, 1106, 1156, 1106, 1156, 1106, 1106, 1106, 
+  1156, 1106, 1156, 1106, 1106, 1106, 1156, 1106, 
+  1106, 1156, 1106, 0, 0, 0, 0, 0, 
+  0, 0, 1158, 1158, 1158, 1158, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 5640, 5640, 5640, 5642, 5640, 5640, 
+  5642, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 
+  1106, 1106, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 5644, 5645, 5646, 5647, 5648, 5649, 5650, 
+  5651, 5652, 5653, 5654, 5655, 5656, 5657, 5658, 
+  5659, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 
+  5667, 5668, 5669, 5670, 5671, 5672, 5673, 5674, 
+  5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, 
+  5683, 5684, 5685, 5686, 5687, 5688, 5689, 5690, 
+  5691, 5692, 5693, 5694, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 5695, 5696, 5697, 5698, 5699, 5700, 5701, 
+  5702, 5703, 5704, 5705, 5706, 5707, 5708, 5709, 
+  5710, 5711, 5712, 5713, 5714, 5715, 5716, 5717, 
+  5718, 5719, 5720, 5721, 5722, 5723, 5724, 5725, 
+  5726, 5727, 5728, 5729, 5730, 5731, 5732, 5733, 
+  5734, 5735, 5736, 5737, 5738, 5739, 5740, 5741, 
+  5742, 5743, 5744, 5745, 0, 0, 0, 0, 
+  0, 0, 0, 5640, 5640, 5640, 5640, 5640, 
+  5640, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 5746, 5746, 5747, 5746, 5746, 5746, 5746, 
+  5746, 5747, 5746, 5746, 5747, 5747, 5747, 5746, 
+  5746, 5747, 5746, 5746, 5746, 5747, 5747, 5746, 
+  5747, 5747, 5746, 5746, 5747, 5747, 5747, 5747, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1159, 1153, 1159, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1168, 
+  1177, 1177, 1177, 1177, 1177, 1177, 1177, 0, 
+  0, 0, 0, 1220, 1220, 1220, 1220, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 
+  1220, 1220, 1220, 1220, 1220, 1220, 1220, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  1168, 1153, 1153, 1159, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 5748, 5749, 5750, 5751, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 5752, 1160, 
+  1160, 1160, 1160, 1160, 5753, 1160, 1160, 1160, 
+  1160, 1159, 1159, 1159, 1153, 1153, 1153, 1153, 
+  1159, 1159, 1168, 5754, 1177, 1177, 5755, 1177, 
+  1177, 1177, 1177, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 0, 0, 0, 0, 0, 0, 
+  0, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 0, 0, 0, 0, 0, 
+  0, 540, 540, 540, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  5756, 1153, 1153, 1153, 1153, 1159, 1153, 5757, 
+  5758, 1153, 5759, 5760, 1168, 1168, 0, 1178, 
+  1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1177, 1177, 1177, 1177, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 340, 340, 340, 1160, 340, 340, 
+  340, 340, 1160, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 1160, 340, 1160, 
+  1160, 1160, 1160, 1160, 340, 1160, 340, 1160, 
+  340, 340, 340, 340, 1180, 1044, 1044, 1160, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1153, 1153, 1159, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1159, 1159, 1159, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1159, 1452, 1160, 1237, 1237, 1160, 1177, 1177, 
+  1177, 1177, 1177, 1180, 1153, 1153, 1177, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1160, 1177, 1160, 1177, 1177, 
+  1177, 0, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1190, 1190, 1190, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 0, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1159, 1159, 1159, 
+  1153, 1153, 1153, 1159, 1159, 1153, 1452, 1180, 
+  1153, 1177, 1177, 1177, 1177, 1177, 1177, 1153, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 1160, 0, 1160, 1160, 1160, 1160, 0, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 0, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1177, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1153, 1159, 1159, 1159, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1180, 1168, 0, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 1153, 1153, 1159, 1159, 0, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 0, 
+  1160, 1160, 0, 0, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 0, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 1180, 1160, 5761, 
+  1159, 1153, 1159, 1159, 1159, 1159, 0, 0, 
+  5762, 1159, 0, 0, 5763, 5764, 1452, 0, 
+  0, 1160, 0, 0, 0, 0, 0, 0, 
+  5765, 0, 0, 0, 0, 0, 1160, 1160, 
+  1160, 1160, 1160, 1159, 1159, 0, 0, 540, 
+  540, 540, 540, 540, 540, 540, 0, 0, 
+  0, 540, 540, 540, 540, 540, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1159, 1159, 
+  1159, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1159, 1159, 1168, 1153, 1153, 1159, 1180, 
+  1160, 1160, 1160, 1160, 1177, 1177, 1177, 1177, 
+  1177, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 1177, 0, 1177, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 5766, 1159, 1159, 1153, 1153, 1153, 1153, 
+  1153, 1153, 5767, 5768, 5769, 5770, 5771, 5772, 
+  1153, 1153, 1159, 1168, 1180, 1160, 1160, 1177, 
+  1160, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  5773, 1159, 1159, 1153, 1153, 1153, 1153, 0, 
+  0, 5774, 5775, 5776, 5777, 1153, 1153, 1159, 
+  1168, 1180, 1177, 1177, 1177, 1177, 1177, 1177, 
+  1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 
+  1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 
+  1177, 1160, 1160, 1160, 1160, 1153, 1153, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1159, 1159, 1159, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1159, 1159, 1153, 1159, 
+  1168, 1153, 1177, 1177, 1177, 1160, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 
+  1428, 1428, 1428, 1428, 1428, 1428, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1153, 1159, 1153, 1159, 
+  1159, 1153, 1153, 1153, 1153, 1153, 1153, 1452, 
+  1180, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 0, 1153, 1153, 
+  1153, 1159, 1159, 1153, 1153, 1153, 1153, 1159, 
+  1153, 1153, 1153, 1153, 1168, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1190, 1190, 1177, 1177, 1177, 
+  1191, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 5778, 5779, 5780, 5781, 5782, 5783, 5784, 
+  5785, 5786, 5787, 5788, 5789, 5790, 5791, 5792, 
+  5793, 5794, 5795, 5796, 5797, 5798, 5799, 5800, 
+  5801, 5802, 5803, 5804, 5805, 5806, 5807, 5808, 
+  5809, 5810, 5811, 5812, 5813, 5814, 5815, 5816, 
+  5817, 5818, 5819, 5820, 5821, 5822, 5823, 5824, 
+  5825, 5826, 5827, 5828, 5829, 5830, 5831, 5832, 
+  5833, 5834, 5835, 5836, 5837, 5838, 5839, 5840, 
+  5841, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 5484, 5484, 5484, 5484, 5484, 
+  5484, 5484, 5484, 5484, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  340, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 0, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  5842, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  0, 1153, 1153, 1153, 1153, 1153, 1153, 1159, 
+  5843, 1160, 1177, 1177, 1177, 1177, 1177, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 
+  1178, 1178, 1178, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 1190, 1190, 1190, 0, 0, 
+  0, 1044, 1044, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 0, 0, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 0, 1159, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1159, 1153, 1153, 1159, 1153, 1153, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 
+  0, 1044, 1044, 1044, 1044, 1044, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  0, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 0, 0, 0, 0, 1044, 
+  1044, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 0, 
+  0, 566, 566, 566, 566, 566, 1044, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 540, 540, 540, 540, 540, 540, 540, 
+  1044, 1044, 1044, 1044, 1044, 838, 838, 838, 
+  838, 523, 523, 523, 523, 1044, 838, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 
+  1250, 1250, 1250, 0, 5484, 5484, 5484, 5484, 
+  5484, 5484, 5484, 0, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 0, 0, 0, 0, 0, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1159, 1159, 1159, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 
+  1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  1153, 1153, 1153, 1153, 1179, 1179, 1179, 1179, 
+  1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 
+  1179, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1179, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 1160, 1160, 
+  1160, 1160, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 1160, 1160, 340, 340, 
+  1160, 1160, 340, 340, 1160, 1160, 1160, 1160, 
+  340, 340, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 1160, 1160, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 1160, 340, 340, 340, 1160, 340, 340, 
+  1160, 1160, 1160, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 340, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  340, 1160, 340, 340, 340, 340, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 0, 0, 0, 0, 0, 0, 
+  0, 340, 340, 340, 340, 340, 340, 340, 
+  340, 340, 340, 0, 0, 1191, 1153, 566, 
+  1177, 81, 81, 81, 81, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 838, 838, 838, 838, 838, 838, 838, 
+  838, 1191, 1191, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 1191, 838, 1191, 838, 
+  838, 838, 1191, 838, 838, 838, 1191, 1191, 
+  1191, 838, 1191, 838, 1191, 838, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 838, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 838, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  838, 838, 1191, 1191, 1191, 1191, 1191, 838, 
+  838, 838, 838, 1191, 838, 1191, 1191, 1191, 
+  838, 838, 838, 1191, 1191, 1191, 1191, 1191, 
+  838, 1191, 1191, 1191, 838, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 838, 1191, 1191, 1191, 838, 
+  838, 838, 1191, 1191, 838, 838, 838, 838, 
+  1191, 1191, 838, 838, 838, 1191, 1191, 838, 
+  838, 838, 838, 1191, 1191, 1191, 1191, 1191, 
+  838, 838, 838, 838, 838, 838, 1191, 838, 
+  838, 1191, 1191, 1191, 838, 1191, 1191, 1191, 
+  1191, 838, 838, 1191, 838, 1191, 838, 1191, 
+  1191, 1191, 1191, 1191, 1191, 838, 838, 838, 
+  1191, 1191, 838, 838, 838, 1191, 838, 1191, 
+  838, 1191, 838, 838, 1191, 1191, 1191, 1191, 
+  838, 1191, 1191, 1191, 838, 1191, 1191, 1191, 
+  1191, 838, 1191, 1191, 1191, 838, 1191, 1191, 
+  1191, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 1191, 
+  838, 1191, 838, 838, 838, 838, 838, 838, 
+  838, 1191, 838, 1191, 838, 838, 838, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 838, 1191, 838, 838, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 838, 
+  838, 838, 1191, 1191, 1191, 1191, 838, 838, 
+  0, 0, 1191, 838, 1191, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 1191, 
+  1191, 1191, 1191, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  5844, 5845, 1191, 838, 838, 1191, 838, 5846, 
+  5847, 5848, 5849, 5850, 5851, 5852, 5853, 5854, 
+  566, 566, 566, 1191, 1191, 1191, 5855, 5856, 
+  5857, 5858, 5859, 5860, 81, 81, 81, 81, 
+  81, 81, 81, 81, 553, 553, 553, 553, 
+  553, 553, 553, 553, 838, 838, 540, 540, 
+  540, 540, 540, 553, 553, 838, 838, 838, 
+  838, 838, 838, 1191, 1191, 838, 838, 1191, 
+  1191, 1191, 1191, 838, 838, 1191, 1191, 838, 
+  838, 838, 838, 838, 1191, 1191, 838, 1191, 
+  1191, 838, 838, 540, 540, 540, 540, 1191, 
+  1191, 1191, 1191, 1191, 1191, 838, 1191, 1191, 
+  1191, 1191, 5861, 5862, 5863, 5864, 5865, 5866, 
+  5867, 5868, 838, 838, 838, 838, 838, 838, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 838, 838, 838, 838, 838, 838, 838, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 540, 540, 540, 1085, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 5484, 1190, 1190, 1190, 1190, 1190, 
+  1190, 1190, 1190, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 5869, 2157, 2132, 5870, 2159, 2160, 5871, 
+  2139, 2142, 5872, 5873, 2143, 2162, 2145, 5874, 
+  2147, 2148, 2149, 5875, 5876, 5877, 5878, 5879, 
+  5880, 5881, 2153, 5882, 5883, 5884, 5885, 2158, 
+  5886, 2138, 2140, 2168, 2177, 5887, 2144, 5888, 
+  5889, 2163, 5890, 5891, 5892, 5893, 5894, 5895, 
+  5896, 5897, 5898, 5899, 5900, 5901, 5902, 5903, 
+  2175, 5904, 5905, 5906, 5907, 5908, 5909, 5910, 
+  5911, 5912, 5913, 5914, 5915, 5916, 5917, 5918, 
+  5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 
+  5927, 5928, 2176, 5929, 5930, 5931, 0, 5932, 
+  5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 
+  5941, 5942, 5943, 5944, 5945, 5946, 5947, 5948, 
+  5949, 5901, 5902, 5903, 2175, 5904, 5905, 5906, 
+  5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 
+  5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 
+  5923, 5924, 5925, 5926, 5927, 5928, 2176, 5929, 
+  5930, 5931, 5950, 5932, 5933, 5934, 5935, 5936, 
+  5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 
+  5945, 5946, 5947, 5948, 5949, 5901, 0, 5903, 
+  2175, 0, 0, 5906, 0, 0, 5909, 5910, 
+  0, 0, 5913, 5914, 5915, 5916, 0, 5918, 
+  5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 
+  5927, 5928, 2176, 0, 5930, 0, 5950, 5932, 
+  5933, 5934, 5935, 5936, 5937, 0, 5939, 5940, 
+  5941, 5942, 5943, 5944, 5945, 5946, 5947, 5948, 
+  5949, 5901, 5902, 5903, 2175, 5904, 5905, 5906, 
+  5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 
+  5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 
+  5923, 5924, 5925, 5926, 5927, 5928, 2176, 5929, 
+  5930, 5931, 5950, 5932, 5933, 5934, 5935, 5936, 
+  5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 
+  5945, 5946, 5947, 5948, 5949, 5869, 2157, 0, 
+  5870, 2159, 2160, 5871, 0, 0, 5872, 5873, 
+  2143, 2162, 2145, 5874, 2147, 2148, 0, 5875, 
+  5876, 5877, 5878, 5879, 5880, 5881, 0, 5882, 
+  5883, 5884, 5885, 2158, 5886, 2138, 2140, 2168, 
+  2177, 5887, 2144, 5888, 5889, 2163, 5890, 5891, 
+  5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 
+  5900, 5869, 2157, 0, 5870, 2159, 2160, 5871, 
+  0, 2142, 5872, 5873, 2143, 2162, 0, 5874, 
+  0, 0, 0, 5875, 5876, 5877, 5878, 5879, 
+  5880, 5881, 0, 5882, 5883, 5884, 5885, 2158, 
+  5886, 2138, 2140, 2168, 2177, 5887, 2144, 5888, 
+  5889, 2163, 5890, 5891, 5892, 5893, 5894, 5895, 
+  5896, 5897, 5898, 5899, 5900, 5869, 2157, 2132, 
+  5870, 2159, 2160, 5871, 2139, 2142, 5872, 5873, 
+  2143, 2162, 2145, 5874, 2147, 2148, 2149, 5875, 
+  5876, 5877, 5878, 5879, 5880, 5881, 2153, 5882, 
+  5883, 5884, 5885, 2158, 5886, 2138, 2140, 2168, 
+  2177, 5887, 2144, 5888, 5889, 2163, 5890, 5891, 
+  5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 
+  5900, 5869, 2157, 2132, 5870, 2159, 2160, 5871, 
+  2139, 2142, 5872, 5873, 2143, 2162, 2145, 5874, 
+  2147, 2148, 2149, 5875, 5876, 5877, 5878, 5879, 
+  5880, 5881, 2153, 5882, 5883, 5884, 5885, 2158, 
+  5886, 2138, 2140, 2168, 2177, 5887, 2144, 5888, 
+  5889, 2163, 5890, 5891, 5892, 5893, 5894, 5895, 
+  5896, 5897, 5898, 5899, 5900, 5869, 2157, 2132, 
+  5870, 2159, 2160, 5871, 2139, 2142, 5872, 5873, 
+  2143, 2162, 2145, 5874, 2147, 2148, 2149, 5875, 
+  5876, 5877, 5878, 5879, 5880, 5881, 2153, 5882, 
+  5883, 5884, 5885, 2158, 5886, 2138, 2140, 2168, 
+  2177, 5887, 2144, 5888, 5889, 2163, 5890, 5891, 
+  5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 
+  5900, 5901, 5902, 5903, 2175, 5904, 5905, 5906, 
+  5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 
+  5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 
+  5923, 5924, 5925, 5926, 5927, 5928, 2176, 5929, 
+  5930, 5931, 5950, 5932, 5933, 5934, 5935, 5936, 
+  5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 
+  5945, 5946, 5947, 5948, 5949, 5901, 5902, 5903, 
+  2175, 5904, 5905, 5906, 5907, 5908, 5909, 5910, 
+  5911, 5912, 5913, 5914, 5915, 5916, 5917, 5918, 
+  5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 
+  5927, 5928, 2176, 5929, 5930, 5931, 5950, 5932, 
+  5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 
+  5941, 5942, 5943, 5944, 5945, 5946, 5947, 5948, 
+  5949, 5901, 5902, 5903, 2175, 5904, 5905, 5906, 
+  5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 
+  5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 
+  5923, 5924, 5925, 5926, 5927, 5928, 2176, 5929, 
+  5930, 5931, 5950, 5932, 5933, 5934, 5935, 5936, 
+  5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 
+  5945, 5946, 5947, 5948, 5949, 5951, 5952, 0, 
+  0, 5953, 5954, 2172, 5955, 5956, 5957, 5958, 
+  5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966, 
+  5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974, 
+  5975, 5976, 5977, 5978, 5979, 5980, 5981, 5982, 
+  5983, 5984, 5985, 5986, 5987, 5988, 5989, 5990, 
+  5991, 5992, 5993, 5994, 5995, 5996, 5997, 5998, 
+  5999, 6000, 6001, 6002, 6003, 6004, 6005, 6006, 
+  6007, 6008, 6009, 6010, 6011, 6012, 6013, 6014, 
+  6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 
+  6023, 6024, 2173, 6025, 6026, 6027, 6028, 6029, 
+  6030, 6031, 6032, 6033, 6034, 6035, 6036, 2171, 
+  6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 
+  6045, 6046, 6047, 6048, 2170, 6049, 6050, 6051, 
+  6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 
+  6005, 6060, 6061, 6062, 6063, 6010, 6011, 6012, 
+  6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 
+  6021, 6022, 6023, 6024, 2173, 6025, 6026, 6027, 
+  6028, 6029, 6030, 6031, 6032, 6033, 6034, 6035, 
+  6036, 2171, 6037, 6038, 6039, 6040, 6041, 6042, 
+  6043, 6044, 6045, 6046, 6047, 6048, 2170, 6049, 
+  6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 
+  6058, 6059, 6064, 6060, 6061, 6062, 6063, 5953, 
+  5954, 2172, 5955, 5956, 5957, 5958, 5959, 5960, 
+  5961, 5962, 5963, 5964, 5965, 5966, 5967, 5968, 
+  5969, 5970, 5971, 5972, 5973, 5974, 5975, 5976, 
+  5977, 5978, 5979, 5980, 5981, 5982, 5983, 5984, 
+  5985, 5986, 5987, 5988, 5989, 5990, 5991, 5992, 
+  5993, 5994, 5995, 5996, 5997, 5998, 5999, 6000, 
+  6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 
+  6009, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 
+  6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 
+  2173, 6025, 6026, 6027, 6028, 6029, 6030, 6031, 
+  6032, 6033, 6034, 6035, 6036, 2171, 6037, 6038, 
+  6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 
+  6047, 6048, 2170, 6049, 6050, 6051, 6052, 6053, 
+  6054, 6055, 6056, 6057, 6058, 6059, 6064, 6060, 
+  6061, 6062, 6063, 6065, 6066, 0, 0, 6067, 
+  6068, 6069, 6070, 6071, 6072, 6073, 6074, 6075, 
+  6076, 6067, 6068, 6069, 6070, 6071, 6072, 6073, 
+  6074, 6075, 6076, 6067, 6068, 6069, 6070, 6071, 
+  6072, 6073, 6074, 6075, 6076, 6067, 6068, 6069, 
+  6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, 
+  6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 
+  6086, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  838, 838, 838, 838, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 838, 838, 
+  838, 838, 838, 838, 838, 838, 1153, 838, 
+  838, 838, 838, 838, 838, 838, 838, 838, 
+  838, 838, 838, 838, 838, 1153, 838, 838, 
+  1044, 1044, 1044, 1044, 1044, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 1153, 1153, 1153, 1153, 
+  1153, 0, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 
+  1153, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 540, 540, 540, 540, 540, 540, 540, 
+  0, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 540, 540, 540, 540, 540, 540, 
+  540, 540, 0, 0, 540, 540, 540, 540, 
+  540, 540, 540, 0, 540, 540, 0, 540, 
+  540, 540, 540, 540, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1106, 1106, 1106, 1106, 
+  1106, 1156, 1156, 1106, 1106, 1106, 1106, 1106, 
+  1156, 1106, 1156, 1106, 1106, 1106, 1156, 1106, 
+  1156, 1156, 1106, 1106, 1106, 1106, 1156, 1106, 
+  1106, 1106, 1156, 1156, 1106, 1156, 1156, 1156, 
+  1156, 1156, 1156, 1156, 1106, 1106, 1156, 1156, 
+  1156, 1156, 1156, 1106, 1156, 1106, 1106, 1106, 
+  1106, 1106, 1156, 1156, 1106, 1106, 1106, 1106, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 
+  1106, 1156, 1156, 1106, 1106, 1106, 1106, 1156, 
+  1156, 1156, 1156, 1106, 1156, 1156, 1156, 1156, 
+  1106, 1156, 1156, 1106, 1156, 1106, 1156, 1106, 
+  1156, 1156, 1106, 1106, 1106, 1106, 1106, 1156, 
+  1156, 1156, 1106, 1156, 1106, 1156, 1106, 1156, 
+  1156, 1156, 1156, 1106, 1156, 1156, 1156, 1156, 
+  1156, 1156, 1106, 1156, 1156, 1156, 1156, 1156, 
+  1156, 1106, 1106, 1156, 1156, 1156, 1106, 1106, 
+  1156, 1156, 1156, 1156, 1106, 1156, 1156, 1106, 
+  1156, 1156, 1156, 1156, 1106, 1156, 1156, 1106, 
+  1156, 1156, 1106, 1156, 1156, 1156, 1106, 1156, 
+  1156, 1156, 1156, 1106, 1106, 1156, 1156, 1106, 
+  1156, 1156, 1156, 1156, 1156, 1156, 1156, 1106, 
+  1156, 1156, 1156, 1156, 1156, 1156, 0, 0, 
+  5642, 5642, 5642, 5642, 5642, 5642, 5642, 5642, 
+  5642, 553, 553, 553, 553, 553, 553, 553, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 
+  6094, 6095, 6096, 6097, 6098, 6099, 6100, 6101, 
+  6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 
+  6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 
+  6118, 6119, 6120, 6121, 6122, 6123, 6124, 6125, 
+  6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, 
+  6134, 6135, 6136, 6137, 6138, 6139, 6140, 6141, 
+  6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149, 
+  6150, 6151, 6152, 6153, 6154, 540, 540, 540, 
+  540, 540, 540, 1180, 0, 0, 0, 0, 
+  0, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 
+  1154, 1154, 1154, 0, 0, 0, 0, 1103, 
+  1103, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 6155, 6156, 6157, 6158, 0, 6159, 6160, 
+  6161, 6162, 6163, 6164, 6165, 6166, 6167, 6168, 
+  6169, 6170, 6171, 6172, 6173, 6174, 6175, 6176, 
+  6177, 6178, 6179, 6180, 6181, 6182, 6183, 6184, 
+  6185, 0, 6156, 6157, 0, 6186, 0, 0, 
+  6161, 0, 6163, 6164, 6165, 6166, 6167, 6168, 
+  6169, 6170, 6171, 6172, 0, 6174, 6175, 6176, 
+  6177, 0, 6179, 0, 6181, 0, 0, 0, 
+  0, 0, 0, 6157, 0, 0, 0, 0, 
+  6161, 0, 6163, 0, 6165, 0, 6167, 6168, 
+  6169, 0, 6171, 6172, 0, 6174, 0, 0, 
+  6177, 0, 6179, 0, 6181, 0, 6183, 0, 
+  6185, 0, 6156, 6157, 0, 6187, 0, 0, 
+  6161, 6162, 6163, 6164, 0, 6166, 6167, 6168, 
+  6169, 6170, 6171, 6172, 0, 6174, 6175, 6176, 
+  6177, 0, 6179, 6180, 6181, 6182, 0, 6184, 
+  0, 6155, 6156, 6157, 6158, 6187, 6159, 6160, 
+  6161, 6162, 6163, 0, 6165, 6166, 6167, 6168, 
+  6169, 6170, 6171, 6172, 6173, 6174, 6175, 6176, 
+  6177, 6178, 6179, 6180, 6181, 0, 0, 0, 
+  0, 0, 6188, 6189, 6190, 0, 6191, 6192, 
+  6193, 6194, 6195, 0, 6196, 6197, 6198, 6199, 
+  6200, 6201, 6202, 6203, 6204, 6205, 6206, 6207, 
+  6208, 6209, 6210, 6211, 6212, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1109, 1109, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 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, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  0, 0, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 0, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 0, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 6213, 6214, 6215, 6216, 6217, 6218, 6219, 
+  6220, 6221, 6222, 6223, 1220, 1220, 0, 0, 
+  0, 6224, 6225, 6226, 6227, 6228, 6229, 6230, 
+  6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, 
+  6239, 6240, 6241, 6242, 6243, 6244, 6245, 6246, 
+  6247, 6248, 6249, 6250, 6251, 6252, 6253, 6254, 
+  0, 6255, 6256, 6257, 6258, 6259, 6260, 6261, 
+  6262, 6263, 6264, 6265, 6266, 6267, 6268, 6269, 
+  6270, 6271, 6272, 6273, 6274, 6275, 6276, 6277, 
+  6278, 6279, 6280, 6281, 3613, 6282, 6283, 6284, 
+  6285, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 6286, 6287, 0, 0, 0, 
+  0, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 6288, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 
+  1191, 1191, 1191, 1191, 1191, 1191, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 6289, 
+  6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 
+  6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 
+  6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 
+  6289, 6290, 6291, 6292, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 6293, 6294, 6295, 6296, 6297, 6298, 6299, 
+  6300, 6301, 6302, 6303, 6304, 6305, 6306, 6307, 
+  6308, 6309, 6310, 6311, 6312, 6313, 6314, 6315, 
+  6316, 6317, 6318, 6319, 6320, 6321, 6322, 6323, 
+  6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 
+  6332, 6333, 6334, 6335, 6336, 0, 0, 0, 
+  0, 6337, 6338, 6339, 6340, 6341, 6342, 6343, 
+  6344, 6345, 0, 0, 0, 0, 0, 0, 
+  0, 6346, 6347, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 2464, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 2464, 2464, 1085, 1085, 
+  1085, 1085, 1085, 2464, 2464, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 6348, 6348, 6348, 6348, 
+  6348, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 2464, 2464, 1085, 1085, 2464, 
+  2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464, 
+  2464, 2464, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 6349, 
+  6349, 6349, 6349, 1085, 1085, 1085, 1085, 2464, 
+  1085, 2464, 2464, 2464, 2464, 2464, 2464, 2464, 
+  2464, 2464, 1085, 1085, 1085, 2464, 1085, 1085, 
+  1085, 1085, 2464, 2464, 2464, 1085, 2464, 2464, 
+  2464, 1085, 1085, 1085, 2465, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 2464, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 2464, 1085, 
+  1085, 1085, 1085, 2464, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 2464, 1085, 1085, 1085, 1085, 2464, 2464, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  77, 2465, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 2464, 2464, 
+  2464, 1085, 1085, 1085, 2464, 2464, 2464, 2464, 
+  2464, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 77, 
+  77, 77, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 2464, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 2464, 2464, 2464, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 2464, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 77, 77, 1085, 77, 77, 
+  77, 1085, 1085, 1085, 1085, 77, 77, 77, 
+  1085, 1085, 77, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 77, 1085, 77, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 77, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 77, 77, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  77, 77, 77, 1085, 1085, 1085, 77, 77, 
+  77, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 77, 77, 77, 77, 77, 77, 77, 
+  77, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 0, 0, 0, 0, 0, 0, 0, 
+  0, 77, 77, 77, 77, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 77, 77, 77, 
+  77, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 77, 77, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 2464, 2464, 2464, 2464, 2464, 2464, 2464, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 2464, 
+  1085, 0, 0, 0, 0, 0, 0, 0, 
+  0, 2464, 0, 0, 2464, 2464, 2464, 2464, 
+  2464, 2464, 2464, 1085, 1085, 2464, 2464, 2464, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 
+  1085, 1085, 1085, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1085, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 0, 
+  0, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 
+  1160, 1160, 1160, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 6350, 6351, 6352, 6353, 6354, 4271, 6355, 
+  6356, 6357, 6358, 4272, 6359, 6360, 6361, 4273, 
+  6362, 6363, 6364, 6365, 6366, 6367, 6368, 6369, 
+  6370, 6371, 6372, 6373, 4331, 6374, 6375, 6376, 
+  6377, 6378, 6379, 6380, 6381, 6382, 4336, 4274, 
+  4275, 4337, 6383, 6384, 4082, 6385, 4276, 6386, 
+  6387, 6388, 6389, 6389, 6389, 6390, 6391, 6392, 
+  6393, 6394, 6395, 6396, 6397, 6398, 6399, 6400, 
+  6401, 6402, 6403, 6404, 6405, 6406, 6407, 6407, 
+  4339, 6408, 6409, 6410, 6411, 4278, 6412, 6413, 
+  6414, 4235, 6415, 6416, 6417, 6418, 6419, 6420, 
+  6421, 6422, 6423, 6424, 6425, 6426, 6427, 6428, 
+  6429, 6430, 6431, 6432, 6433, 6434, 6435, 6436, 
+  6437, 6438, 6439, 6440, 6440, 6441, 6442, 6443, 
+  4078, 6444, 6445, 6446, 6447, 6448, 6449, 6450, 
+  6451, 4283, 6452, 6453, 6454, 6455, 6456, 6457, 
+  6458, 6459, 6460, 6461, 6462, 6463, 6464, 6465, 
+  6466, 6467, 6468, 6469, 6470, 6471, 6472, 4024, 
+  6473, 6474, 6475, 6475, 6476, 6477, 6477, 6478, 
+  6479, 6480, 6481, 6482, 6483, 6484, 6485, 6486, 
+  6487, 6488, 6489, 6490, 4284, 6491, 6492, 6493, 
+  6494, 4351, 6494, 6495, 4286, 6496, 6497, 6498, 
+  6499, 4287, 3997, 6500, 6501, 6502, 6503, 6504, 
+  6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 
+  6513, 6514, 6515, 6516, 6517, 6518, 6519, 6520, 
+  6521, 4288, 6522, 6523, 6524, 6525, 6526, 6527, 
+  4290, 6528, 6529, 6530, 6531, 6532, 6533, 6534, 
+  6535, 4025, 4359, 6536, 6537, 6538, 6539, 6540, 
+  6541, 6542, 6543, 4291, 6544, 6545, 6546, 6547, 
+  4402, 6548, 6549, 6550, 6551, 6552, 6553, 6554, 
+  6555, 6556, 6557, 6558, 6559, 6560, 4095, 6561, 
+  6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 
+  6570, 6571, 4292, 4182, 6572, 6573, 6574, 6575, 
+  6576, 6577, 6578, 6579, 4363, 6580, 6581, 6582, 
+  6583, 6584, 6585, 6586, 6587, 4364, 6588, 6589, 
+  6590, 6591, 6592, 6593, 6594, 6595, 6596, 6597, 
+  6598, 6599, 4366, 6600, 6601, 6602, 6603, 6604, 
+  6605, 6606, 6607, 6608, 6609, 6610, 6610, 6611, 
+  6612, 4368, 6613, 6614, 6615, 6616, 6617, 6618, 
+  6619, 4081, 6620, 6621, 6622, 6623, 6624, 6625, 
+  6626, 4374, 6627, 6628, 6629, 6630, 6631, 6632, 
+  6632, 4375, 4404, 6633, 6634, 6635, 6636, 6637, 
+  4043, 4377, 6638, 6639, 4303, 6640, 6641, 4257, 
+  6642, 6643, 4307, 6644, 6645, 6646, 6647, 6647, 
+  6648, 6649, 6650, 6651, 6652, 6653, 6654, 6655, 
+  6656, 6657, 6658, 6659, 6660, 6661, 6662, 6663, 
+  6664, 6665, 6666, 6667, 6668, 6669, 6670, 6671, 
+  6672, 6673, 6674, 4313, 6675, 6676, 6677, 6678, 
+  6679, 6680, 6681, 6682, 6683, 6684, 6685, 6686, 
+  6687, 6688, 6689, 6690, 6476, 6691, 6692, 6693, 
+  6694, 6695, 6696, 6697, 6698, 6699, 6700, 6701, 
+  6702, 4099, 6703, 6704, 6705, 6706, 6707, 6708, 
+  4316, 6709, 6710, 6711, 6712, 6713, 6714, 6715, 
+  6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, 
+  6724, 6725, 6726, 6727, 6728, 4038, 6729, 6730, 
+  6731, 6732, 6733, 6734, 4384, 6735, 6736, 6737, 
+  6738, 6739, 6740, 6741, 6742, 6743, 6744, 6745, 
+  6746, 6747, 6748, 6749, 6750, 6751, 6752, 6753, 
+  6754, 4389, 4390, 6755, 6756, 6757, 6758, 6759, 
+  6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, 
+  4391, 6768, 6769, 6770, 6771, 6772, 6773, 6774, 
+  6775, 6776, 6777, 6778, 6779, 6780, 6781, 6782, 
+  6783, 6784, 6785, 6786, 6787, 6788, 6789, 6790, 
+  6791, 6792, 6793, 6794, 6795, 6796, 6797, 4397, 
+  4397, 6798, 6799, 6800, 6801, 6802, 6803, 6804, 
+  6805, 6806, 6807, 4398, 6808, 6809, 6810, 6811, 
+  6812, 6813, 6814, 6815, 6816, 6817, 6818, 6819, 
+  6820, 6821, 6822, 6823, 6824, 6825, 6826, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 81, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 
+  2053, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 574, 574, 574, 574, 574, 574, 574, 
+  574, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 
+  3984, 3984, 3984, 3984, 3984, 3984, 3984, 0, 
+  0, };
+
+const nc_utf8proc_property_t nc_utf8proc_properties[] = {
+  {0, 0, 0, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX,  false,false,false,false, 0, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_LF},
+  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_WS, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CR},
+  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5093, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5084, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5096, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 0, UINT16_MAX, 0, UINT16_MAX, 0, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1, UINT16_MAX, 1, UINT16_MAX, 2784, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2, UINT16_MAX, 2, UINT16_MAX, 49, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3, UINT16_MAX, 3, UINT16_MAX, 704, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 4, UINT16_MAX, 4, UINT16_MAX, 62, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5, UINT16_MAX, 5, UINT16_MAX, 2872, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6, UINT16_MAX, 6, UINT16_MAX, 782, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7, UINT16_MAX, 7, UINT16_MAX, 808, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8, UINT16_MAX, 8, UINT16_MAX, 111, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9, UINT16_MAX, 9, UINT16_MAX, 898, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 10, UINT16_MAX, 10, UINT16_MAX, 913, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 11, UINT16_MAX, 11, UINT16_MAX, 999, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 12, UINT16_MAX, 12, UINT16_MAX, 2890, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 13, UINT16_MAX, 13, UINT16_MAX, 160, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 14, UINT16_MAX, 14, UINT16_MAX, 205, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 15, UINT16_MAX, 15, UINT16_MAX, 2982, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 16, UINT16_MAX, 16, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 17, UINT16_MAX, 17, UINT16_MAX, 1087, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 18, UINT16_MAX, 18, UINT16_MAX, 1173, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 19, UINT16_MAX, 19, UINT16_MAX, 1257, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 20, UINT16_MAX, 20, UINT16_MAX, 254, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 21, UINT16_MAX, 21, UINT16_MAX, 3042, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 22, UINT16_MAX, 22, UINT16_MAX, 1337, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 23, UINT16_MAX, 23, UINT16_MAX, 3122, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 24, UINT16_MAX, 24, UINT16_MAX, 303, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 25, UINT16_MAX, 25, UINT16_MAX, 1423, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1446, UINT16_MAX, 1446, 352, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1448, UINT16_MAX, 1448, 2818, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2795, UINT16_MAX, 2795, 401, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1449, UINT16_MAX, 1449, 743, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1450, UINT16_MAX, 1450, 414, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2820, UINT16_MAX, 2820, 2875, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1452, UINT16_MAX, 1452, 795, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1453, UINT16_MAX, 1453, 853, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1454, UINT16_MAX, 1454, 463, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1455, UINT16_MAX, 1455, 901, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1456, UINT16_MAX, 1456, 956, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1457, UINT16_MAX, 1457, 1043, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1458, UINT16_MAX, 1458, 2932, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1459, UINT16_MAX, 1459, 512, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1460, UINT16_MAX, 1460, 557, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1462, UINT16_MAX, 1462, 2994, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2809, UINT16_MAX, 2809, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1463, UINT16_MAX, 1463, 1130, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 3288, UINT16_MAX, 3288, 1215, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1464, UINT16_MAX, 1464, 1296, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1465, UINT16_MAX, 1465, 606, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2891, UINT16_MAX, 2891, 3082, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1466, UINT16_MAX, 1466, 1380, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2908, UINT16_MAX, 2908, 3131, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 3295, UINT16_MAX, 3295, 655, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2817, UINT16_MAX, 2817, 1466, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_NOBREAK, 26, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1621, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PI, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8221, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ET, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ET, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 31, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 32, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8225, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 35, 35, 7130, UINT16_MAX, 7130, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8228, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 38, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 14, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PF, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 16423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 16426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 16429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8240, 50, UINT16_MAX, 50, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8243, 53, UINT16_MAX, 53, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8246, 56, UINT16_MAX, 56, UINT16_MAX, 3143, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8249, 59, UINT16_MAX, 59, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8252, 62, UINT16_MAX, 62, UINT16_MAX, 1537, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8255, 65, UINT16_MAX, 65, UINT16_MAX, 1579, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 66, UINT16_MAX, 66, UINT16_MAX, 1549, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8259, 69, UINT16_MAX, 69, UINT16_MAX, 2852, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8262, 72, UINT16_MAX, 72, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8265, 75, UINT16_MAX, 75, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8268, 78, UINT16_MAX, 78, UINT16_MAX, 3357, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8271, 81, UINT16_MAX, 81, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8274, 84, UINT16_MAX, 84, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8277, 87, UINT16_MAX, 87, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8280, 90, UINT16_MAX, 90, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8283, 93, UINT16_MAX, 93, UINT16_MAX, 2878, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 94, UINT16_MAX, 94, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8287, 97, UINT16_MAX, 97, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8290, 100, UINT16_MAX, 100, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8293, 103, UINT16_MAX, 103, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8296, 106, UINT16_MAX, 106, UINT16_MAX, 3461, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8299, 109, UINT16_MAX, 109, UINT16_MAX, 1597, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8302, 112, UINT16_MAX, 112, UINT16_MAX, 1591, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 113, UINT16_MAX, 113, UINT16_MAX, 1585, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8306, 116, UINT16_MAX, 116, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8309, 119, UINT16_MAX, 119, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8312, 122, UINT16_MAX, 122, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8315, 125, UINT16_MAX, 125, UINT16_MAX, 1509, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8318, 128, UINT16_MAX, 128, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 129, UINT16_MAX, 129, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8322, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8324, UINT16_MAX, 7977, UINT16_MAX, 7977, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8326, UINT16_MAX, 7978, UINT16_MAX, 7978, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8328, UINT16_MAX, 7979, UINT16_MAX, 7979, 3192, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8330, UINT16_MAX, 7980, UINT16_MAX, 7980, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8332, UINT16_MAX, 7981, UINT16_MAX, 7981, 1540, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8334, UINT16_MAX, 2819, UINT16_MAX, 2819, 1582, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1447, UINT16_MAX, 1447, 1558, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8336, UINT16_MAX, 7982, UINT16_MAX, 7982, 2855, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8338, UINT16_MAX, 7983, UINT16_MAX, 7983, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8340, UINT16_MAX, 7984, UINT16_MAX, 7984, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8342, UINT16_MAX, 7985, UINT16_MAX, 7985, 3406, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8344, UINT16_MAX, 7986, UINT16_MAX, 7986, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8346, UINT16_MAX, 7987, UINT16_MAX, 7987, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8348, UINT16_MAX, 7988, UINT16_MAX, 7988, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8350, UINT16_MAX, 7989, UINT16_MAX, 7989, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8352, UINT16_MAX, 7990, UINT16_MAX, 7990, 2881, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7991, UINT16_MAX, 7991, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8354, UINT16_MAX, 7992, UINT16_MAX, 7992, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8356, UINT16_MAX, 7993, UINT16_MAX, 7993, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8358, UINT16_MAX, 7994, UINT16_MAX, 7994, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8360, UINT16_MAX, 7995, UINT16_MAX, 7995, 3510, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8362, UINT16_MAX, 7996, UINT16_MAX, 7996, 1606, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8364, UINT16_MAX, 7997, UINT16_MAX, 7997, 1594, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7998, UINT16_MAX, 7998, 1588, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8366, UINT16_MAX, 7999, UINT16_MAX, 7999, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8368, UINT16_MAX, 8000, UINT16_MAX, 8000, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8370, UINT16_MAX, 8001, UINT16_MAX, 8001, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8372, UINT16_MAX, 8002, UINT16_MAX, 8002, 1523, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8374, UINT16_MAX, 8003, UINT16_MAX, 8003, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8004, UINT16_MAX, 8004, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8376, UINT16_MAX, 8005, UINT16_MAX, 8005, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8378, 188, UINT16_MAX, 188, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8381, UINT16_MAX, 8006, UINT16_MAX, 8006, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8383, 193, UINT16_MAX, 193, UINT16_MAX, 3259, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8386, UINT16_MAX, 8007, UINT16_MAX, 8007, 3308, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8388, 198, UINT16_MAX, 198, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8391, UINT16_MAX, 8008, UINT16_MAX, 8008, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8393, 203, UINT16_MAX, 203, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8396, UINT16_MAX, 8009, UINT16_MAX, 8009, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8398, 208, UINT16_MAX, 208, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8401, UINT16_MAX, 8010, UINT16_MAX, 8010, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8403, 213, UINT16_MAX, 213, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8406, UINT16_MAX, 8011, UINT16_MAX, 8011, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8408, 218, UINT16_MAX, 218, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8411, UINT16_MAX, 8012, UINT16_MAX, 8012, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8413, 223, UINT16_MAX, 223, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8416, UINT16_MAX, 8013, UINT16_MAX, 8013, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 226, UINT16_MAX, 226, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8014, UINT16_MAX, 8014, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8419, 229, UINT16_MAX, 229, UINT16_MAX, 2858, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8422, UINT16_MAX, 8015, UINT16_MAX, 8015, 2862, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8424, 234, UINT16_MAX, 234, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8427, UINT16_MAX, 8016, UINT16_MAX, 8016, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8429, 239, UINT16_MAX, 239, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8432, UINT16_MAX, 8017, UINT16_MAX, 8017, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8434, 244, UINT16_MAX, 244, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8437, UINT16_MAX, 8018, UINT16_MAX, 8018, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8439, 249, UINT16_MAX, 249, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8442, UINT16_MAX, 8019, UINT16_MAX, 8019, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8444, 254, UINT16_MAX, 254, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8447, UINT16_MAX, 8020, UINT16_MAX, 8020, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8449, 259, UINT16_MAX, 259, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8452, UINT16_MAX, 8021, UINT16_MAX, 8021, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8454, 264, UINT16_MAX, 264, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8457, UINT16_MAX, 8022, UINT16_MAX, 8022, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8459, 269, UINT16_MAX, 269, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8462, UINT16_MAX, 8023, UINT16_MAX, 8023, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8464, 274, UINT16_MAX, 274, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8467, UINT16_MAX, 8024, UINT16_MAX, 8024, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 277, UINT16_MAX, 277, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 5138, UINT16_MAX, 5138, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8470, 280, UINT16_MAX, 280, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8473, UINT16_MAX, 8025, UINT16_MAX, 8025, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8475, 285, UINT16_MAX, 285, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8478, UINT16_MAX, 8026, UINT16_MAX, 8026, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8480, 290, UINT16_MAX, 290, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8483, UINT16_MAX, 8027, UINT16_MAX, 8027, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8485, 295, UINT16_MAX, 295, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8488, UINT16_MAX, 8028, UINT16_MAX, 8028, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8490, 8492, UINT16_MAX, 8, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1454, UINT16_MAX, 1454, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8494, 304, UINT16_MAX, 304, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8497, UINT16_MAX, 8029, UINT16_MAX, 8029, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8499, 309, UINT16_MAX, 309, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8502, UINT16_MAX, 8030, UINT16_MAX, 8030, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8504, 314, UINT16_MAX, 314, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8507, UINT16_MAX, 8031, UINT16_MAX, 8031, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8509, 319, UINT16_MAX, 319, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8512, UINT16_MAX, 8032, UINT16_MAX, 8032, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8514, 324, UINT16_MAX, 324, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8517, UINT16_MAX, 8033, UINT16_MAX, 8033, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8519, 329, UINT16_MAX, 329, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8522, UINT16_MAX, 8034, UINT16_MAX, 8034, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8524, 334, UINT16_MAX, 334, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8527, UINT16_MAX, 8035, UINT16_MAX, 8035, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 337, UINT16_MAX, 337, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8036, UINT16_MAX, 8036, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8530, 340, UINT16_MAX, 340, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8533, UINT16_MAX, 8037, UINT16_MAX, 8037, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8535, 345, UINT16_MAX, 345, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8538, UINT16_MAX, 8038, UINT16_MAX, 8038, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8540, 350, UINT16_MAX, 350, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8543, UINT16_MAX, 8039, UINT16_MAX, 8039, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8545, 8545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 355, UINT16_MAX, 355, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8040, UINT16_MAX, 8040, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8548, 358, UINT16_MAX, 358, UINT16_MAX, 2974, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8551, UINT16_MAX, 8041, UINT16_MAX, 8041, 2978, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8553, 363, UINT16_MAX, 363, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8556, UINT16_MAX, 8042, UINT16_MAX, 8042, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8558, 368, UINT16_MAX, 368, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8561, UINT16_MAX, 8043, UINT16_MAX, 8043, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 371, UINT16_MAX, 371, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8044, UINT16_MAX, 8044, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8564, 374, UINT16_MAX, 374, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8567, UINT16_MAX, 8045, UINT16_MAX, 8045, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8569, 379, UINT16_MAX, 379, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8572, UINT16_MAX, 8046, UINT16_MAX, 8046, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8574, 384, UINT16_MAX, 384, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8577, UINT16_MAX, 8047, UINT16_MAX, 8047, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8579, 389, UINT16_MAX, 389, UINT16_MAX, 3012, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8582, UINT16_MAX, 8048, UINT16_MAX, 8048, 3015, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8584, 394, UINT16_MAX, 394, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8587, UINT16_MAX, 8049, UINT16_MAX, 8049, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8589, 399, UINT16_MAX, 399, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8592, UINT16_MAX, 8050, UINT16_MAX, 8050, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8594, 404, UINT16_MAX, 404, UINT16_MAX, 3018, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8597, UINT16_MAX, 8051, UINT16_MAX, 8051, 3021, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8599, 409, UINT16_MAX, 409, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8602, UINT16_MAX, 8052, UINT16_MAX, 8052, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8604, 414, UINT16_MAX, 414, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8607, UINT16_MAX, 8053, UINT16_MAX, 8053, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 417, UINT16_MAX, 417, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8054, UINT16_MAX, 8054, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8610, 420, UINT16_MAX, 420, UINT16_MAX, 3030, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8613, UINT16_MAX, 8055, UINT16_MAX, 8055, 3033, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8615, 425, UINT16_MAX, 425, UINT16_MAX, 3036, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8618, UINT16_MAX, 8056, UINT16_MAX, 8056, 3039, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8620, 430, UINT16_MAX, 430, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8623, UINT16_MAX, 8057, UINT16_MAX, 8057, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8625, 435, UINT16_MAX, 435, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8628, UINT16_MAX, 8058, UINT16_MAX, 8058, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8630, 440, UINT16_MAX, 440, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8633, UINT16_MAX, 8059, UINT16_MAX, 8059, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8635, 445, UINT16_MAX, 445, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8638, UINT16_MAX, 8060, UINT16_MAX, 8060, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8640, 450, UINT16_MAX, 450, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8643, UINT16_MAX, 8061, UINT16_MAX, 8061, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8645, 455, UINT16_MAX, 455, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8648, UINT16_MAX, 8062, UINT16_MAX, 8062, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8650, 460, UINT16_MAX, 460, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8653, 463, UINT16_MAX, 463, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8656, UINT16_MAX, 8063, UINT16_MAX, 8063, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8658, 468, UINT16_MAX, 468, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8661, UINT16_MAX, 8064, UINT16_MAX, 8064, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8663, 473, UINT16_MAX, 473, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8666, UINT16_MAX, 8065, UINT16_MAX, 8065, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 18, 18, 3288, UINT16_MAX, 3288, 3140, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8066, UINT16_MAX, 8066, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 476, UINT16_MAX, 476, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 477, UINT16_MAX, 477, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8067, UINT16_MAX, 8067, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 478, UINT16_MAX, 478, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8068, UINT16_MAX, 8068, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 479, UINT16_MAX, 479, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 480, UINT16_MAX, 480, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8069, UINT16_MAX, 8069, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 481, UINT16_MAX, 481, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 482, UINT16_MAX, 482, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 483, UINT16_MAX, 483, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8070, UINT16_MAX, 8070, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 484, UINT16_MAX, 484, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 485, UINT16_MAX, 485, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 486, UINT16_MAX, 486, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 487, UINT16_MAX, 487, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8071, UINT16_MAX, 8071, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 488, UINT16_MAX, 488, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 489, UINT16_MAX, 489, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8072, UINT16_MAX, 8072, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 490, UINT16_MAX, 490, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 491, UINT16_MAX, 491, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 492, UINT16_MAX, 492, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8073, UINT16_MAX, 8073, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8074, UINT16_MAX, 8074, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 493, UINT16_MAX, 493, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 494, UINT16_MAX, 494, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8075, UINT16_MAX, 8075, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 495, UINT16_MAX, 495, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8688, 498, UINT16_MAX, 498, UINT16_MAX, 3565, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8691, UINT16_MAX, 8076, UINT16_MAX, 8076, 3614, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 501, UINT16_MAX, 501, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8077, UINT16_MAX, 8077, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 502, UINT16_MAX, 502, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8078, UINT16_MAX, 8078, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 503, UINT16_MAX, 503, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 504, UINT16_MAX, 504, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8079, UINT16_MAX, 8079, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 505, UINT16_MAX, 505, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 506, UINT16_MAX, 506, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8080, UINT16_MAX, 8080, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 507, UINT16_MAX, 507, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8700, 510, UINT16_MAX, 510, UINT16_MAX, 3663, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8703, UINT16_MAX, 8081, UINT16_MAX, 8081, 3712, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 513, UINT16_MAX, 513, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 514, UINT16_MAX, 514, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 515, UINT16_MAX, 515, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8082, UINT16_MAX, 8082, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 516, UINT16_MAX, 516, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8083, UINT16_MAX, 8083, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 517, UINT16_MAX, 517, UINT16_MAX, 1573, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 518, UINT16_MAX, 518, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8084, UINT16_MAX, 8084, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 519, UINT16_MAX, 519, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8085, UINT16_MAX, 8085, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8086, UINT16_MAX, 8086, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8712, 522, UINT16_MAX, 522, 8087, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8715, 522, 8088, 522, 8087, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8717, UINT16_MAX, 8088, UINT16_MAX, 8087, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8719, 529, UINT16_MAX, 529, 8089, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8722, 529, 8090, 529, 8089, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8724, UINT16_MAX, 8090, UINT16_MAX, 8089, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8726, 536, UINT16_MAX, 536, 8091, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8729, 536, 8092, 536, 8091, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8731, UINT16_MAX, 8092, UINT16_MAX, 8091, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8733, 543, UINT16_MAX, 543, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8736, UINT16_MAX, 8093, UINT16_MAX, 8093, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8738, 548, UINT16_MAX, 548, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8741, UINT16_MAX, 8094, UINT16_MAX, 8094, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8743, 553, UINT16_MAX, 553, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8746, UINT16_MAX, 8095, UINT16_MAX, 8095, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8748, 558, UINT16_MAX, 558, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8751, UINT16_MAX, 8096, UINT16_MAX, 8096, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8753, 563, UINT16_MAX, 563, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8756, UINT16_MAX, 8097, UINT16_MAX, 8097, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8758, 568, UINT16_MAX, 568, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8761, UINT16_MAX, 8098, UINT16_MAX, 8098, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8763, 573, UINT16_MAX, 573, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8766, UINT16_MAX, 8099, UINT16_MAX, 8099, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8768, 578, UINT16_MAX, 578, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8771, UINT16_MAX, 8100, UINT16_MAX, 8100, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1451, UINT16_MAX, 1451, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8773, 583, UINT16_MAX, 583, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8776, UINT16_MAX, 8101, UINT16_MAX, 8101, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8778, 588, UINT16_MAX, 588, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8781, UINT16_MAX, 8102, UINT16_MAX, 8102, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8783, 593, UINT16_MAX, 593, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8786, UINT16_MAX, 8103, UINT16_MAX, 8103, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 596, UINT16_MAX, 596, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8104, UINT16_MAX, 8104, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8789, 599, UINT16_MAX, 599, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8792, UINT16_MAX, 8105, UINT16_MAX, 8105, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8794, 604, UINT16_MAX, 604, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8797, UINT16_MAX, 8106, UINT16_MAX, 8106, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8799, 609, UINT16_MAX, 609, UINT16_MAX, 1567, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8802, UINT16_MAX, 8107, UINT16_MAX, 8107, 1570, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8804, 614, UINT16_MAX, 614, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8807, UINT16_MAX, 8108, UINT16_MAX, 8108, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8809, 619, UINT16_MAX, 619, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8812, UINT16_MAX, 8109, UINT16_MAX, 8109, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8814, 8814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8816, 626, UINT16_MAX, 626, 8110, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8819, 626, 8111, 626, 8110, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8821, UINT16_MAX, 8111, UINT16_MAX, 8110, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8823, 633, UINT16_MAX, 633, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8826, UINT16_MAX, 8112, UINT16_MAX, 8112, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 636, UINT16_MAX, 636, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 637, UINT16_MAX, 637, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8830, 640, UINT16_MAX, 640, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8833, UINT16_MAX, 8113, UINT16_MAX, 8113, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8835, 645, UINT16_MAX, 645, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8838, UINT16_MAX, 8114, UINT16_MAX, 8114, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8840, 650, UINT16_MAX, 650, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8843, UINT16_MAX, 8115, UINT16_MAX, 8115, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8845, 655, UINT16_MAX, 655, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8848, UINT16_MAX, 8116, UINT16_MAX, 8116, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8850, 660, UINT16_MAX, 660, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8853, UINT16_MAX, 8117, UINT16_MAX, 8117, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8855, 665, UINT16_MAX, 665, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8858, UINT16_MAX, 8118, UINT16_MAX, 8118, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8860, 670, UINT16_MAX, 670, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8863, UINT16_MAX, 8119, UINT16_MAX, 8119, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8865, 675, UINT16_MAX, 675, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8868, UINT16_MAX, 8120, UINT16_MAX, 8120, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8870, 680, UINT16_MAX, 680, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8873, UINT16_MAX, 8121, UINT16_MAX, 8121, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8875, 685, UINT16_MAX, 685, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8878, UINT16_MAX, 8122, UINT16_MAX, 8122, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8880, 690, UINT16_MAX, 690, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8883, UINT16_MAX, 8123, UINT16_MAX, 8123, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8885, 695, UINT16_MAX, 695, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8888, UINT16_MAX, 8124, UINT16_MAX, 8124, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8890, 700, UINT16_MAX, 700, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8893, UINT16_MAX, 8125, UINT16_MAX, 8125, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8895, 705, UINT16_MAX, 705, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8898, UINT16_MAX, 8126, UINT16_MAX, 8126, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8900, 710, UINT16_MAX, 710, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8903, UINT16_MAX, 8127, UINT16_MAX, 8127, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8905, 715, UINT16_MAX, 715, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8908, UINT16_MAX, 8128, UINT16_MAX, 8128, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8910, 720, UINT16_MAX, 720, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8913, UINT16_MAX, 8129, UINT16_MAX, 8129, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8915, 725, UINT16_MAX, 725, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8918, UINT16_MAX, 8130, UINT16_MAX, 8130, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 728, UINT16_MAX, 728, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8131, UINT16_MAX, 8131, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8921, 731, UINT16_MAX, 731, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8924, UINT16_MAX, 8132, UINT16_MAX, 8132, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 734, UINT16_MAX, 734, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 735, UINT16_MAX, 735, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1461, UINT16_MAX, 1461, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 736, UINT16_MAX, 736, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8133, UINT16_MAX, 8133, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8929, 739, UINT16_MAX, 739, UINT16_MAX, 1543, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8932, UINT16_MAX, 8134, UINT16_MAX, 8134, 1546, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8934, 744, UINT16_MAX, 744, UINT16_MAX, 2866, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8937, UINT16_MAX, 8135, UINT16_MAX, 8135, 2869, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8939, 749, UINT16_MAX, 749, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8942, UINT16_MAX, 8136, UINT16_MAX, 8136, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8944, 754, UINT16_MAX, 754, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8947, UINT16_MAX, 8137, UINT16_MAX, 8137, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8949, 759, UINT16_MAX, 759, UINT16_MAX, 1615, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8952, UINT16_MAX, 8138, UINT16_MAX, 8138, 1618, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8954, 764, UINT16_MAX, 764, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8957, UINT16_MAX, 8139, UINT16_MAX, 8139, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 8959, 769, UINT16_MAX, 769, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 8962, UINT16_MAX, 8140, UINT16_MAX, 8140, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 772, UINT16_MAX, 772, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 773, UINT16_MAX, 773, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8141, UINT16_MAX, 8141, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 774, UINT16_MAX, 774, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 775, UINT16_MAX, 775, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8142, UINT16_MAX, 8142, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8143, UINT16_MAX, 8143, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 776, UINT16_MAX, 776, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8144, UINT16_MAX, 8144, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 777, UINT16_MAX, 777, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 778, UINT16_MAX, 778, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 779, UINT16_MAX, 779, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 780, UINT16_MAX, 780, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8145, UINT16_MAX, 8145, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 781, UINT16_MAX, 781, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8146, UINT16_MAX, 8146, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 782, UINT16_MAX, 782, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8147, UINT16_MAX, 8147, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 783, UINT16_MAX, 783, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8148, UINT16_MAX, 8148, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 784, UINT16_MAX, 784, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8149, UINT16_MAX, 8149, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8150, UINT16_MAX, 8150, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8151, UINT16_MAX, 8151, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8152, UINT16_MAX, 8152, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8153, UINT16_MAX, 8153, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8154, UINT16_MAX, 8154, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8155, UINT16_MAX, 8155, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8156, UINT16_MAX, 8156, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8157, UINT16_MAX, 8157, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2804, UINT16_MAX, 2804, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8158, UINT16_MAX, 8158, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8159, UINT16_MAX, 8159, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8160, UINT16_MAX, 8160, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8161, UINT16_MAX, 8161, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8162, UINT16_MAX, 8162, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8163, UINT16_MAX, 8163, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8164, UINT16_MAX, 8164, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8165, UINT16_MAX, 8165, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8166, UINT16_MAX, 8166, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8167, UINT16_MAX, 8167, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8168, UINT16_MAX, 8168, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8169, UINT16_MAX, 8169, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8170, UINT16_MAX, 8170, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8171, UINT16_MAX, 8171, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8172, UINT16_MAX, 8172, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8173, UINT16_MAX, 8173, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8174, UINT16_MAX, 8174, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8175, UINT16_MAX, 8175, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8176, UINT16_MAX, 8176, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8177, UINT16_MAX, 8177, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8178, UINT16_MAX, 8178, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8179, UINT16_MAX, 8179, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8180, UINT16_MAX, 8180, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8181, UINT16_MAX, 8181, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8182, UINT16_MAX, 8182, 1576, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8183, UINT16_MAX, 8183, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8184, UINT16_MAX, 8184, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 7, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 17, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 788, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 22, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 24, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8981, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8985, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8987, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8989, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8991, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 11, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 18, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 23, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 801, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32768, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32769, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32770, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32771, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32775, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32776, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32778, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32772, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32814, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32773, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32780, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32779, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32782, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32783, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32815, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32816, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32781, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32808, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32813, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32807, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32784, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32774, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32777, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32810, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32812, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32811, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32809, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32819, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, 802, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, 803, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32817, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, 804, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, 8997, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 240, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, 807, 7127, UINT16_MAX, 7127, 32818, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 233, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 808, UINT16_MAX, 808, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8185, UINT16_MAX, 8185, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 809, UINT16_MAX, 809, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8186, UINT16_MAX, 8186, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 810, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 811, UINT16_MAX, 811, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8187, UINT16_MAX, 8187, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 9004, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8188, UINT16_MAX, 8188, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8189, UINT16_MAX, 8189, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8190, UINT16_MAX, 8190, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, 814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 815, UINT16_MAX, 815, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 9008, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9010, 820, UINT16_MAX, 820, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, 821, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9014, 824, UINT16_MAX, 824, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9017, 827, UINT16_MAX, 827, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9020, 830, UINT16_MAX, 830, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9023, 833, UINT16_MAX, 833, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9026, 836, UINT16_MAX, 836, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9029, 839, UINT16_MAX, 839, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9032, 17226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 845, UINT16_MAX, 845, UINT16_MAX, 1673, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 846, UINT16_MAX, 846, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 847, UINT16_MAX, 847, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 848, UINT16_MAX, 848, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 849, UINT16_MAX, 849, UINT16_MAX, 1726, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 850, UINT16_MAX, 850, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 851, UINT16_MAX, 851, UINT16_MAX, 1777, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 852, UINT16_MAX, 852, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 807, UINT16_MAX, 807, UINT16_MAX, 1830, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 853, UINT16_MAX, 853, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 854, UINT16_MAX, 854, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 35, UINT16_MAX, 35, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 855, UINT16_MAX, 855, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 856, UINT16_MAX, 856, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 857, UINT16_MAX, 857, UINT16_MAX, 1881, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 858, UINT16_MAX, 858, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 859, UINT16_MAX, 859, UINT16_MAX, 5027, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 860, UINT16_MAX, 860, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 861, UINT16_MAX, 861, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 862, UINT16_MAX, 862, UINT16_MAX, 1932, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 863, UINT16_MAX, 863, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 864, UINT16_MAX, 864, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 865, UINT16_MAX, 865, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 866, UINT16_MAX, 866, UINT16_MAX, 1983, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9059, 869, UINT16_MAX, 869, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9062, 872, UINT16_MAX, 872, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9065, UINT16_MAX, 2583, UINT16_MAX, 2583, 4904, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9067, UINT16_MAX, 2616, UINT16_MAX, 2616, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9069, UINT16_MAX, 2621, UINT16_MAX, 2621, 4913, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9071, UINT16_MAX, 2658, UINT16_MAX, 2658, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9073, 17267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7121, UINT16_MAX, 7121, 2088, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7122, UINT16_MAX, 7122, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2829, UINT16_MAX, 2829, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7123, UINT16_MAX, 7123, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7124, UINT16_MAX, 7124, 2141, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7125, UINT16_MAX, 7125, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7126, UINT16_MAX, 7126, 2192, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 915, UINT16_MAX, 915, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7127, UINT16_MAX, 7127, 2245, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7128, UINT16_MAX, 7128, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7129, UINT16_MAX, 7129, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7130, UINT16_MAX, 7130, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7131, UINT16_MAX, 7131, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7132, UINT16_MAX, 7132, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7133, UINT16_MAX, 7133, 2401, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2830, UINT16_MAX, 2830, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7134, UINT16_MAX, 7134, 5023, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 860, 917, UINT16_MAX, 917, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 917, UINT16_MAX, 917, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7136, UINT16_MAX, 7136, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 897, UINT16_MAX, 897, 2349, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7137, UINT16_MAX, 7137, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7138, UINT16_MAX, 7138, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7139, UINT16_MAX, 7139, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 2818, UINT16_MAX, 2818, 2452, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9078, UINT16_MAX, 8191, UINT16_MAX, 8191, 2036, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9080, UINT16_MAX, 8192, UINT16_MAX, 8192, 2297, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9082, UINT16_MAX, 2727, UINT16_MAX, 2727, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9084, UINT16_MAX, 2696, UINT16_MAX, 2696, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9086, UINT16_MAX, 2732, UINT16_MAX, 2732, 5033, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 896, UINT16_MAX, 896, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 846, 846, 7122, UINT16_MAX, 7122, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 852, 852, 915, UINT16_MAX, 915, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2505, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9092, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 863, 863, 7137, UINT16_MAX, 7137, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 858, 858, 2830, UINT16_MAX, 2830, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8193, UINT16_MAX, 8193, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 902, UINT16_MAX, 902, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8194, UINT16_MAX, 8194, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 903, UINT16_MAX, 903, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8195, UINT16_MAX, 8195, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 904, UINT16_MAX, 904, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 7148, UINT16_MAX, 7148, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 905, UINT16_MAX, 905, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8196, UINT16_MAX, 8196, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 906, UINT16_MAX, 906, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8197, UINT16_MAX, 8197, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 907, UINT16_MAX, 907, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8198, UINT16_MAX, 8198, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 908, UINT16_MAX, 908, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8199, UINT16_MAX, 8199, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 909, UINT16_MAX, 909, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8200, UINT16_MAX, 8200, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 910, UINT16_MAX, 910, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8201, UINT16_MAX, 8201, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 911, UINT16_MAX, 911, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8202, UINT16_MAX, 8202, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 912, UINT16_MAX, 912, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8203, UINT16_MAX, 8203, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 913, UINT16_MAX, 913, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8204, UINT16_MAX, 8204, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 853, 853, 7128, UINT16_MAX, 7128, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 859, 859, 7134, UINT16_MAX, 7134, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 914, UINT16_MAX, 8205, UINT16_MAX, 8205, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8206, UINT16_MAX, 8206, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 915, 852, UINT16_MAX, 852, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 849, 849, 7124, UINT16_MAX, 7124, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 916, UINT16_MAX, 916, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8207, UINT16_MAX, 8207, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 917, 918, UINT16_MAX, 918, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 919, UINT16_MAX, 919, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8208, UINT16_MAX, 8208, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 920, UINT16_MAX, 920, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 921, UINT16_MAX, 921, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 922, UINT16_MAX, 922, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9115, 925, UINT16_MAX, 925, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9118, 928, UINT16_MAX, 928, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 929, UINT16_MAX, 929, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9122, 932, UINT16_MAX, 932, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 933, UINT16_MAX, 933, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 934, UINT16_MAX, 934, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 935, UINT16_MAX, 935, UINT16_MAX, 2525, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9128, 938, UINT16_MAX, 938, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 939, UINT16_MAX, 939, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 940, UINT16_MAX, 940, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 941, UINT16_MAX, 941, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 942, UINT16_MAX, 942, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9135, 945, UINT16_MAX, 945, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9138, 948, UINT16_MAX, 948, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9141, 951, UINT16_MAX, 951, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 952, UINT16_MAX, 952, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 953, UINT16_MAX, 953, UINT16_MAX, 2615, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 954, UINT16_MAX, 954, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 955, UINT16_MAX, 955, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 956, UINT16_MAX, 956, UINT16_MAX, 2522, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 957, UINT16_MAX, 957, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 958, UINT16_MAX, 958, UINT16_MAX, 2511, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 959, UINT16_MAX, 959, UINT16_MAX, 2601, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 960, UINT16_MAX, 960, UINT16_MAX, 2635, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 961, UINT16_MAX, 961, UINT16_MAX, 2531, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9154, 964, UINT16_MAX, 964, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 965, UINT16_MAX, 965, UINT16_MAX, 2528, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 966, UINT16_MAX, 966, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 967, UINT16_MAX, 967, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 968, UINT16_MAX, 968, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 969, UINT16_MAX, 969, UINT16_MAX, 2641, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 970, UINT16_MAX, 970, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 971, UINT16_MAX, 971, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 972, UINT16_MAX, 972, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 973, UINT16_MAX, 973, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 974, UINT16_MAX, 974, UINT16_MAX, 2542, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 975, UINT16_MAX, 975, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 976, UINT16_MAX, 976, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 977, UINT16_MAX, 977, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 978, UINT16_MAX, 978, UINT16_MAX, 2659, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 979, UINT16_MAX, 979, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 980, UINT16_MAX, 980, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 981, UINT16_MAX, 981, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 982, UINT16_MAX, 982, UINT16_MAX, 2665, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 983, UINT16_MAX, 983, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 984, UINT16_MAX, 984, UINT16_MAX, 2653, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 985, UINT16_MAX, 985, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 986, UINT16_MAX, 986, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8209, UINT16_MAX, 8209, 2622, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8210, UINT16_MAX, 8210, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8211, UINT16_MAX, 8211, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8212, UINT16_MAX, 8212, 2575, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8213, UINT16_MAX, 8213, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8214, UINT16_MAX, 8214, 2564, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8215, UINT16_MAX, 8215, 2608, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8216, UINT16_MAX, 8216, 2638, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8217, UINT16_MAX, 8217, 2553, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9179, UINT16_MAX, 8218, UINT16_MAX, 8218, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8219, UINT16_MAX, 8219, 2581, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8220, UINT16_MAX, 8220, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8221, UINT16_MAX, 8221, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8222, UINT16_MAX, 8222, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8223, UINT16_MAX, 8223, 2644, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8224, UINT16_MAX, 8224, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8225, UINT16_MAX, 8225, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8226, UINT16_MAX, 8226, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8227, UINT16_MAX, 8227, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8228, UINT16_MAX, 8228, 2584, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8229, UINT16_MAX, 8229, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8230, UINT16_MAX, 8230, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8231, UINT16_MAX, 8231, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8232, UINT16_MAX, 8232, 2662, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8233, UINT16_MAX, 8233, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8234, UINT16_MAX, 8234, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8235, UINT16_MAX, 8235, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8236, UINT16_MAX, 8236, 2668, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8237, UINT16_MAX, 8237, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8238, UINT16_MAX, 8238, 2656, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8239, UINT16_MAX, 8239, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8240, UINT16_MAX, 8240, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9181, UINT16_MAX, 8241, UINT16_MAX, 8241, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9183, UINT16_MAX, 8242, UINT16_MAX, 8242, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8243, UINT16_MAX, 8243, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9185, UINT16_MAX, 8244, UINT16_MAX, 8244, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8245, UINT16_MAX, 8245, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8246, UINT16_MAX, 8246, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8247, UINT16_MAX, 8247, 2578, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9187, UINT16_MAX, 8248, UINT16_MAX, 8248, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8249, UINT16_MAX, 8249, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8250, UINT16_MAX, 8250, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8251, UINT16_MAX, 8251, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8252, UINT16_MAX, 8252, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9189, UINT16_MAX, 8253, UINT16_MAX, 8253, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9191, UINT16_MAX, 8254, UINT16_MAX, 8254, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9193, UINT16_MAX, 8255, UINT16_MAX, 8255, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8256, UINT16_MAX, 8256, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1003, UINT16_MAX, 1003, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8257, UINT16_MAX, 8257, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1004, UINT16_MAX, 1004, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8258, UINT16_MAX, 8258, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1005, UINT16_MAX, 1005, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8259, UINT16_MAX, 8259, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1006, UINT16_MAX, 1006, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8260, UINT16_MAX, 8260, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1007, UINT16_MAX, 1007, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8261, UINT16_MAX, 8261, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1008, UINT16_MAX, 1008, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8262, UINT16_MAX, 8262, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1009, UINT16_MAX, 1009, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8263, UINT16_MAX, 8263, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1010, UINT16_MAX, 1010, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8264, UINT16_MAX, 8264, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1011, UINT16_MAX, 1011, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8265, UINT16_MAX, 8265, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1012, UINT16_MAX, 1012, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8266, UINT16_MAX, 8266, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1013, UINT16_MAX, 1013, UINT16_MAX, 2595, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8267, UINT16_MAX, 8267, 2598, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9206, 1016, UINT16_MAX, 1016, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9209, UINT16_MAX, 8268, UINT16_MAX, 8268, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1019, UINT16_MAX, 1019, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8269, UINT16_MAX, 8269, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1020, UINT16_MAX, 1020, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8270, UINT16_MAX, 8270, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1021, UINT16_MAX, 1021, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8271, UINT16_MAX, 8271, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1022, UINT16_MAX, 1022, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8272, UINT16_MAX, 8272, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1023, UINT16_MAX, 1023, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8273, UINT16_MAX, 8273, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ME, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1024, UINT16_MAX, 1024, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8274, UINT16_MAX, 8274, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1025, UINT16_MAX, 1025, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8275, UINT16_MAX, 8275, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1026, UINT16_MAX, 1026, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8276, UINT16_MAX, 8276, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1027, UINT16_MAX, 1027, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8277, UINT16_MAX, 8277, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1028, UINT16_MAX, 1028, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8278, UINT16_MAX, 8278, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1029, UINT16_MAX, 1029, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8279, UINT16_MAX, 8279, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1030, UINT16_MAX, 1030, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8280, UINT16_MAX, 8280, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1031, UINT16_MAX, 1031, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8281, UINT16_MAX, 8281, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1032, UINT16_MAX, 1032, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8282, UINT16_MAX, 8282, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1033, UINT16_MAX, 1033, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8283, UINT16_MAX, 8283, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1034, UINT16_MAX, 1034, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8284, UINT16_MAX, 8284, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1035, UINT16_MAX, 1035, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8285, UINT16_MAX, 8285, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1036, UINT16_MAX, 1036, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8286, UINT16_MAX, 8286, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1037, UINT16_MAX, 1037, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8287, UINT16_MAX, 8287, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1038, UINT16_MAX, 1038, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8288, UINT16_MAX, 8288, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1039, UINT16_MAX, 1039, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8289, UINT16_MAX, 8289, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1040, UINT16_MAX, 1040, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8290, UINT16_MAX, 8290, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1041, UINT16_MAX, 1041, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8291, UINT16_MAX, 8291, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1042, UINT16_MAX, 1042, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8292, UINT16_MAX, 8292, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1043, UINT16_MAX, 1043, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8293, UINT16_MAX, 8293, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1044, UINT16_MAX, 1044, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8294, UINT16_MAX, 8294, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1045, UINT16_MAX, 1045, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8295, UINT16_MAX, 8295, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1046, UINT16_MAX, 1046, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8296, UINT16_MAX, 8296, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1047, UINT16_MAX, 1047, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8297, UINT16_MAX, 8297, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1048, UINT16_MAX, 1048, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8298, UINT16_MAX, 8298, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1049, UINT16_MAX, 1049, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8299, UINT16_MAX, 8299, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1050, UINT16_MAX, 1050, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8300, UINT16_MAX, 8300, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1051, UINT16_MAX, 1051, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9244, 1054, UINT16_MAX, 1054, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9247, UINT16_MAX, 8301, UINT16_MAX, 8301, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1057, UINT16_MAX, 1057, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8302, UINT16_MAX, 8302, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1058, UINT16_MAX, 1058, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8303, UINT16_MAX, 8303, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1059, UINT16_MAX, 1059, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8304, UINT16_MAX, 8304, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1060, UINT16_MAX, 1060, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8305, UINT16_MAX, 8305, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1061, UINT16_MAX, 1061, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8306, UINT16_MAX, 8306, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1062, UINT16_MAX, 1062, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8307, UINT16_MAX, 8307, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8308, UINT16_MAX, 8308, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9255, 1065, UINT16_MAX, 1065, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9258, UINT16_MAX, 8309, UINT16_MAX, 8309, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9260, 1070, UINT16_MAX, 1070, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9263, UINT16_MAX, 8310, UINT16_MAX, 8310, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1073, UINT16_MAX, 1073, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8311, UINT16_MAX, 8311, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9266, 1076, UINT16_MAX, 1076, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9269, UINT16_MAX, 8312, UINT16_MAX, 8312, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1079, UINT16_MAX, 1079, UINT16_MAX, 2629, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8313, UINT16_MAX, 8313, 2632, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9272, 1082, UINT16_MAX, 1082, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9275, UINT16_MAX, 8314, UINT16_MAX, 8314, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9277, 1087, UINT16_MAX, 1087, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9280, UINT16_MAX, 8315, UINT16_MAX, 8315, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9282, 1092, UINT16_MAX, 1092, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9285, UINT16_MAX, 8316, UINT16_MAX, 8316, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1095, UINT16_MAX, 1095, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8317, UINT16_MAX, 8317, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9288, 1098, UINT16_MAX, 1098, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9291, UINT16_MAX, 8318, UINT16_MAX, 8318, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9293, 1103, UINT16_MAX, 1103, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9296, UINT16_MAX, 8319, UINT16_MAX, 8319, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9298, 1108, UINT16_MAX, 1108, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9301, UINT16_MAX, 8320, UINT16_MAX, 8320, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1111, UINT16_MAX, 1111, UINT16_MAX, 2647, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8321, UINT16_MAX, 8321, 2650, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9304, 1114, UINT16_MAX, 1114, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9307, UINT16_MAX, 8322, UINT16_MAX, 8322, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9309, 1119, UINT16_MAX, 1119, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9312, UINT16_MAX, 8323, UINT16_MAX, 8323, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9314, 1124, UINT16_MAX, 1124, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9317, UINT16_MAX, 8324, UINT16_MAX, 8324, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9319, 1129, UINT16_MAX, 1129, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9322, UINT16_MAX, 8325, UINT16_MAX, 8325, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9324, 1134, UINT16_MAX, 1134, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9327, UINT16_MAX, 8326, UINT16_MAX, 8326, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9329, 1139, UINT16_MAX, 1139, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9332, UINT16_MAX, 8327, UINT16_MAX, 8327, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1142, UINT16_MAX, 1142, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8328, UINT16_MAX, 8328, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9335, 1145, UINT16_MAX, 1145, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9338, UINT16_MAX, 8329, UINT16_MAX, 8329, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1148, UINT16_MAX, 1148, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8330, UINT16_MAX, 8330, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1149, UINT16_MAX, 1149, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8331, UINT16_MAX, 8331, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1150, UINT16_MAX, 1150, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8332, UINT16_MAX, 8332, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1151, UINT16_MAX, 1151, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8333, UINT16_MAX, 8333, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1152, UINT16_MAX, 1152, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8334, UINT16_MAX, 8334, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1153, UINT16_MAX, 1153, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8335, UINT16_MAX, 8335, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1154, UINT16_MAX, 1154, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8336, UINT16_MAX, 8336, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1155, UINT16_MAX, 1155, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8337, UINT16_MAX, 8337, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1156, UINT16_MAX, 1156, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8338, UINT16_MAX, 8338, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1157, UINT16_MAX, 1157, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8339, UINT16_MAX, 8339, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1158, UINT16_MAX, 1158, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8340, UINT16_MAX, 8340, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1159, UINT16_MAX, 1159, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8341, UINT16_MAX, 8341, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1160, UINT16_MAX, 1160, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8342, UINT16_MAX, 8342, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1161, UINT16_MAX, 1161, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8343, UINT16_MAX, 8343, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1162, UINT16_MAX, 1162, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8344, UINT16_MAX, 8344, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1163, UINT16_MAX, 1163, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8345, UINT16_MAX, 8345, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1164, UINT16_MAX, 1164, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8346, UINT16_MAX, 8346, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1165, UINT16_MAX, 1165, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8347, UINT16_MAX, 8347, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1166, UINT16_MAX, 1166, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8348, UINT16_MAX, 8348, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1167, UINT16_MAX, 1167, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8349, UINT16_MAX, 8349, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1168, UINT16_MAX, 1168, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8350, UINT16_MAX, 8350, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1169, UINT16_MAX, 1169, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8351, UINT16_MAX, 8351, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1170, UINT16_MAX, 1170, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8352, UINT16_MAX, 8352, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1171, UINT16_MAX, 1171, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8353, UINT16_MAX, 8353, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1172, UINT16_MAX, 1172, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8354, UINT16_MAX, 8354, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1173, UINT16_MAX, 1173, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8355, UINT16_MAX, 8355, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1174, UINT16_MAX, 1174, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8356, UINT16_MAX, 8356, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1175, UINT16_MAX, 1175, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1176, UINT16_MAX, 1176, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1177, UINT16_MAX, 1177, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1178, UINT16_MAX, 1178, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1179, UINT16_MAX, 1179, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1180, UINT16_MAX, 1180, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1181, UINT16_MAX, 1181, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1182, UINT16_MAX, 1182, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1183, UINT16_MAX, 1183, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1184, UINT16_MAX, 1184, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1185, UINT16_MAX, 1185, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1186, UINT16_MAX, 1186, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1187, UINT16_MAX, 1187, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1188, UINT16_MAX, 1188, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1189, UINT16_MAX, 1189, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1190, UINT16_MAX, 1190, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1191, UINT16_MAX, 1191, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1192, UINT16_MAX, 1192, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1193, UINT16_MAX, 1193, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1194, UINT16_MAX, 1194, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1195, UINT16_MAX, 1195, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1196, UINT16_MAX, 1196, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1197, UINT16_MAX, 1197, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1198, UINT16_MAX, 1198, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1199, UINT16_MAX, 1199, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1200, UINT16_MAX, 1200, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1201, UINT16_MAX, 1201, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1202, UINT16_MAX, 1202, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1203, UINT16_MAX, 1203, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1204, UINT16_MAX, 1204, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1205, UINT16_MAX, 1205, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1206, UINT16_MAX, 1206, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1207, UINT16_MAX, 1207, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1208, UINT16_MAX, 1208, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1209, UINT16_MAX, 1209, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1210, UINT16_MAX, 1210, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1211, UINT16_MAX, 1211, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1212, UINT16_MAX, 1212, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8357, UINT16_MAX, 8357, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8358, UINT16_MAX, 8358, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8359, UINT16_MAX, 8359, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8360, UINT16_MAX, 8360, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8361, UINT16_MAX, 8361, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8362, UINT16_MAX, 8362, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8363, UINT16_MAX, 8363, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8364, UINT16_MAX, 8364, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8365, UINT16_MAX, 8365, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8366, UINT16_MAX, 8366, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8367, UINT16_MAX, 8367, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8368, UINT16_MAX, 8368, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8369, UINT16_MAX, 8369, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8370, UINT16_MAX, 8370, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8371, UINT16_MAX, 8371, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8372, UINT16_MAX, 8372, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8373, UINT16_MAX, 8373, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8374, UINT16_MAX, 8374, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8375, UINT16_MAX, 8375, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8376, UINT16_MAX, 8376, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8377, UINT16_MAX, 8377, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8378, UINT16_MAX, 8378, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8379, UINT16_MAX, 8379, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8380, UINT16_MAX, 8380, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8381, UINT16_MAX, 8381, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8382, UINT16_MAX, 8382, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8383, UINT16_MAX, 8383, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8384, UINT16_MAX, 8384, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8385, UINT16_MAX, 8385, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8386, UINT16_MAX, 8386, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8387, UINT16_MAX, 8387, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8388, UINT16_MAX, 8388, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8389, UINT16_MAX, 8389, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8390, UINT16_MAX, 8390, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8391, UINT16_MAX, 8391, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8392, UINT16_MAX, 8392, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8393, UINT16_MAX, 8393, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8394, UINT16_MAX, 8394, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 9405, 9405, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 222, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 228, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 10, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 11, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 12, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 13, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 14, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 15, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 16, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 17, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 18, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 19, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 20, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 21, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 22, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 23, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 24, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 25, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_PREPEND},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 2, 0, UTF8PROC_BOUNDCLASS_PREPEND},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 30, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 31, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 32, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9407, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9409, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9411, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9413, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9415, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2671, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2676, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2679, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 27, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 28, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 29, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 33, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 34, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32785, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32786, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32787, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_AN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 35, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, 9417, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, 9419, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, 9421, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, 9423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9425, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2685, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2688, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, 9429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2682, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_PREPEND},
+  {UTF8PROC_CATEGORY_MN, 36, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2691, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9431, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2694, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2697, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32788, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9443, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9445, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9447, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32789, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2700, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32790, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32792, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2704, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9477, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32791, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32793, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2709, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32795, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2712, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2716, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9487, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32794, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2719, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 84, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 91, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32796, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2722, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9495, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32799, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2725, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2730, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32797, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32798, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32800, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2733, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2737, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_PREPEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32801, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32802, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32803, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2740, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2745, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32804, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 9519, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 103, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 107, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 9521, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 118, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 122, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 9523, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 9525, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NOBREAK, 1335, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9528, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9530, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9534, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9536, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9538, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 129, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 130, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9540, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 132, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9542, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9544, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, 9546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9548, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, 9550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 9564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2748, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32805, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1376, UINT16_MAX, 1376, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1377, UINT16_MAX, 1377, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1378, UINT16_MAX, 1378, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1379, UINT16_MAX, 1379, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1380, UINT16_MAX, 1380, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1381, UINT16_MAX, 1381, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1382, UINT16_MAX, 1382, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1383, UINT16_MAX, 1383, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1384, UINT16_MAX, 1384, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1385, UINT16_MAX, 1385, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1386, UINT16_MAX, 1386, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1387, UINT16_MAX, 1387, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1388, UINT16_MAX, 1388, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1389, UINT16_MAX, 1389, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1390, UINT16_MAX, 1390, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1391, UINT16_MAX, 1391, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1392, UINT16_MAX, 1392, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1393, UINT16_MAX, 1393, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1394, UINT16_MAX, 1394, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1395, UINT16_MAX, 1395, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1396, UINT16_MAX, 1396, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1397, UINT16_MAX, 1397, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1398, UINT16_MAX, 1398, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1399, UINT16_MAX, 1399, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1400, UINT16_MAX, 1400, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1401, UINT16_MAX, 1401, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1402, UINT16_MAX, 1402, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1403, UINT16_MAX, 1403, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1404, UINT16_MAX, 1404, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1405, UINT16_MAX, 1405, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1406, UINT16_MAX, 1406, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1407, UINT16_MAX, 1407, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1408, UINT16_MAX, 1408, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1409, UINT16_MAX, 1409, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1410, UINT16_MAX, 1410, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1411, UINT16_MAX, 1411, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1412, UINT16_MAX, 1412, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1413, UINT16_MAX, 1413, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1414, UINT16_MAX, 1414, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1415, UINT16_MAX, 1415, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1416, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_L},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, false, 2, 0, UTF8PROC_BOUNDCLASS_L},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, false, 2, 0, UTF8PROC_BOUNDCLASS_V},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_V},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_T},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8395, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8396, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8397, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8398, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8399, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8400, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8401, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8402, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8403, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8404, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8405, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8406, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8407, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8408, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8409, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8410, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8411, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8412, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8413, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8414, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8415, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8416, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8417, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8418, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8419, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8420, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8421, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8422, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8423, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8424, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8425, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8426, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8427, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8428, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8429, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8430, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8431, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8432, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8433, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8434, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8435, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8436, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8437, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8438, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8439, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8440, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8441, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8442, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8443, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8444, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8445, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8446, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8447, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8448, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8449, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8450, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8451, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8452, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8453, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8454, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8455, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8456, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8457, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8458, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8459, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8460, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8461, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8462, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8463, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8464, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8465, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8466, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8467, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8468, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8469, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8470, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8471, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8472, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8473, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8474, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8475, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8476, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8477, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8478, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8479, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 8480, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1417, 1417, UINT16_MAX, 1417, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1418, 1418, UINT16_MAX, 1418, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1419, 1419, UINT16_MAX, 1419, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1420, 1420, UINT16_MAX, 1420, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1421, 1421, UINT16_MAX, 1421, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1422, 1422, UINT16_MAX, 1422, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2751, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9615, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2754, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2757, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2760, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9621, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2763, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2766, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 9625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32806, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2769, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9627, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2772, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2775, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2778, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 2781, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 9635, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 955, 8211, UINT16_MAX, 8211, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 957, 8213, UINT16_MAX, 8213, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 969, 8223, UINT16_MAX, 8223, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 972, 8226, UINT16_MAX, 8226, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 973, 8227, UINT16_MAX, 8227, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 981, 8235, UINT16_MAX, 8235, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1004, 8258, UINT16_MAX, 8258, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1445, 8481, UINT16_MAX, 8481, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1447, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 4, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 486, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 10, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 12, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 14, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 15, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 19, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 20, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 21, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 8, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 17, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 20, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 21, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 968, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8482, UINT16_MAX, 8482, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8483, UINT16_MAX, 8483, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 2, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1476, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 94, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 5, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1477, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1484, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1486, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1487, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 495, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 25, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1495, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 852, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 214, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9688, 1498, UINT16_MAX, 1498, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9691, UINT16_MAX, 8484, UINT16_MAX, 8484, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9693, 1503, UINT16_MAX, 1503, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9696, UINT16_MAX, 8485, UINT16_MAX, 8485, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9698, 1508, UINT16_MAX, 1508, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9701, UINT16_MAX, 8486, UINT16_MAX, 8486, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9703, 1513, UINT16_MAX, 1513, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9706, UINT16_MAX, 8487, UINT16_MAX, 8487, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9708, 1518, UINT16_MAX, 1518, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9711, UINT16_MAX, 8488, UINT16_MAX, 8488, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9713, 1523, UINT16_MAX, 1523, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9716, UINT16_MAX, 8489, UINT16_MAX, 8489, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9718, 1528, UINT16_MAX, 1528, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9721, UINT16_MAX, 8490, UINT16_MAX, 8490, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9723, 1533, UINT16_MAX, 1533, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9726, UINT16_MAX, 8491, UINT16_MAX, 8491, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9728, 1538, UINT16_MAX, 1538, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9731, UINT16_MAX, 8492, UINT16_MAX, 8492, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9733, 1543, UINT16_MAX, 1543, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9736, UINT16_MAX, 8493, UINT16_MAX, 8493, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9738, 1548, UINT16_MAX, 1548, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9741, UINT16_MAX, 8494, UINT16_MAX, 8494, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9743, 1553, UINT16_MAX, 1553, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9746, UINT16_MAX, 8495, UINT16_MAX, 8495, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9748, 1558, UINT16_MAX, 1558, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9751, UINT16_MAX, 8496, UINT16_MAX, 8496, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9753, 1563, UINT16_MAX, 1563, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9756, UINT16_MAX, 8497, UINT16_MAX, 8497, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9758, 1568, UINT16_MAX, 1568, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9761, UINT16_MAX, 8498, UINT16_MAX, 8498, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9763, 1573, UINT16_MAX, 1573, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9766, UINT16_MAX, 8499, UINT16_MAX, 8499, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9768, 1578, UINT16_MAX, 1578, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9771, UINT16_MAX, 8500, UINT16_MAX, 8500, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9773, 1583, UINT16_MAX, 1583, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9776, UINT16_MAX, 8501, UINT16_MAX, 8501, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9778, 1588, UINT16_MAX, 1588, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9781, UINT16_MAX, 8502, UINT16_MAX, 8502, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9783, 1593, UINT16_MAX, 1593, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9786, UINT16_MAX, 8503, UINT16_MAX, 8503, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9788, 1598, UINT16_MAX, 1598, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9791, UINT16_MAX, 8504, UINT16_MAX, 8504, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9793, 1603, UINT16_MAX, 1603, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9796, UINT16_MAX, 8505, UINT16_MAX, 8505, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9798, 1608, UINT16_MAX, 1608, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9801, UINT16_MAX, 8506, UINT16_MAX, 8506, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9803, 1613, UINT16_MAX, 1613, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9806, UINT16_MAX, 8507, UINT16_MAX, 8507, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9808, 1618, UINT16_MAX, 1618, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9811, UINT16_MAX, 8508, UINT16_MAX, 8508, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9813, 1623, UINT16_MAX, 1623, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9816, UINT16_MAX, 8509, UINT16_MAX, 8509, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9818, 1628, UINT16_MAX, 1628, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9821, UINT16_MAX, 8510, UINT16_MAX, 8510, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9823, 1633, UINT16_MAX, 1633, UINT16_MAX, 2884, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9826, UINT16_MAX, 8511, UINT16_MAX, 8511, 2887, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9828, 1638, UINT16_MAX, 1638, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9831, UINT16_MAX, 8512, UINT16_MAX, 8512, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9833, 1643, UINT16_MAX, 1643, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9836, UINT16_MAX, 8513, UINT16_MAX, 8513, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9838, 1648, UINT16_MAX, 1648, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9841, UINT16_MAX, 8514, UINT16_MAX, 8514, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9843, 1653, UINT16_MAX, 1653, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9846, UINT16_MAX, 8515, UINT16_MAX, 8515, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9848, 1658, UINT16_MAX, 1658, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9851, UINT16_MAX, 8516, UINT16_MAX, 8516, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9853, 1663, UINT16_MAX, 1663, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9856, UINT16_MAX, 8517, UINT16_MAX, 8517, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9858, 1668, UINT16_MAX, 1668, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9861, UINT16_MAX, 8518, UINT16_MAX, 8518, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9863, 1673, UINT16_MAX, 1673, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9866, UINT16_MAX, 8519, UINT16_MAX, 8519, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9868, 1678, UINT16_MAX, 1678, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9871, UINT16_MAX, 8520, UINT16_MAX, 8520, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9873, 1683, UINT16_MAX, 1683, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9876, UINT16_MAX, 8521, UINT16_MAX, 8521, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9878, 1688, UINT16_MAX, 1688, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9881, UINT16_MAX, 8522, UINT16_MAX, 8522, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9883, 1693, UINT16_MAX, 1693, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9886, UINT16_MAX, 8523, UINT16_MAX, 8523, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9888, 1698, UINT16_MAX, 1698, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9891, UINT16_MAX, 8524, UINT16_MAX, 8524, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9893, 1703, UINT16_MAX, 1703, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9896, UINT16_MAX, 8525, UINT16_MAX, 8525, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9898, 1708, UINT16_MAX, 1708, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9901, UINT16_MAX, 8526, UINT16_MAX, 8526, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9903, 1713, UINT16_MAX, 1713, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9906, UINT16_MAX, 8527, UINT16_MAX, 8527, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9908, 1718, UINT16_MAX, 1718, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9911, UINT16_MAX, 8528, UINT16_MAX, 8528, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9913, 1723, UINT16_MAX, 1723, UINT16_MAX, 3006, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9916, UINT16_MAX, 8529, UINT16_MAX, 8529, 3009, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9918, 1728, UINT16_MAX, 1728, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9921, UINT16_MAX, 8530, UINT16_MAX, 8530, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9923, 1733, UINT16_MAX, 1733, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9926, UINT16_MAX, 8531, UINT16_MAX, 8531, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9928, 1738, UINT16_MAX, 1738, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9931, UINT16_MAX, 8532, UINT16_MAX, 8532, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9933, 1743, UINT16_MAX, 1743, UINT16_MAX, 3024, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9936, UINT16_MAX, 8533, UINT16_MAX, 8533, 3027, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9938, 1748, UINT16_MAX, 1748, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9941, UINT16_MAX, 8534, UINT16_MAX, 8534, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9943, 1753, UINT16_MAX, 1753, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9946, UINT16_MAX, 8535, UINT16_MAX, 8535, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9948, 1758, UINT16_MAX, 1758, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9951, UINT16_MAX, 8536, UINT16_MAX, 8536, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9953, 1763, UINT16_MAX, 1763, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9956, UINT16_MAX, 8537, UINT16_MAX, 8537, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9958, 1768, UINT16_MAX, 1768, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9961, UINT16_MAX, 8538, UINT16_MAX, 8538, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9963, 1773, UINT16_MAX, 1773, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9966, UINT16_MAX, 8539, UINT16_MAX, 8539, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9968, 1778, UINT16_MAX, 1778, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9971, UINT16_MAX, 8540, UINT16_MAX, 8540, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9973, 1783, UINT16_MAX, 1783, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9976, UINT16_MAX, 8541, UINT16_MAX, 8541, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9978, 1788, UINT16_MAX, 1788, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9981, UINT16_MAX, 8542, UINT16_MAX, 8542, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9983, 1793, UINT16_MAX, 1793, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9986, UINT16_MAX, 8543, UINT16_MAX, 8543, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9988, 1798, UINT16_MAX, 1798, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9991, UINT16_MAX, 8544, UINT16_MAX, 8544, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9993, 1803, UINT16_MAX, 1803, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 9996, UINT16_MAX, 8545, UINT16_MAX, 8545, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 9998, 1808, UINT16_MAX, 1808, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10001, UINT16_MAX, 8546, UINT16_MAX, 8546, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10003, 1813, UINT16_MAX, 1813, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10006, UINT16_MAX, 8547, UINT16_MAX, 8547, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10008, 1818, UINT16_MAX, 1818, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10011, UINT16_MAX, 8548, UINT16_MAX, 8548, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10013, 1823, UINT16_MAX, 1823, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10016, UINT16_MAX, 8549, UINT16_MAX, 8549, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10018, 1828, UINT16_MAX, 1828, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10021, UINT16_MAX, 8550, UINT16_MAX, 8550, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10023, 1833, UINT16_MAX, 1833, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10026, UINT16_MAX, 8551, UINT16_MAX, 8551, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10028, 1838, UINT16_MAX, 1838, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10031, UINT16_MAX, 8552, UINT16_MAX, 8552, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10033, 1843, UINT16_MAX, 1843, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10036, UINT16_MAX, 8553, UINT16_MAX, 8553, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10038, 1848, UINT16_MAX, 1848, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10041, UINT16_MAX, 8554, UINT16_MAX, 8554, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10043, 1853, UINT16_MAX, 1853, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10046, UINT16_MAX, 8555, UINT16_MAX, 8555, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10048, 1858, UINT16_MAX, 1858, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10051, UINT16_MAX, 8556, UINT16_MAX, 8556, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10053, 1863, UINT16_MAX, 1863, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10056, UINT16_MAX, 8557, UINT16_MAX, 8557, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10058, 1868, UINT16_MAX, 1868, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10061, UINT16_MAX, 8558, UINT16_MAX, 8558, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10063, 10063, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10065, 10065, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10067, 10067, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10069, 10069, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 10071, 10071, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10073, 1738, 8532, UINT16_MAX, 8532, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1883, UINT16_MAX, 1883, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10076, 1886, UINT16_MAX, 1886, UINT16_MAX, 3241, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10079, UINT16_MAX, 8559, UINT16_MAX, 8559, 3250, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10081, 1891, UINT16_MAX, 1891, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10084, UINT16_MAX, 8560, UINT16_MAX, 8560, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10086, 1896, UINT16_MAX, 1896, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10089, UINT16_MAX, 8561, UINT16_MAX, 8561, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10091, 1901, UINT16_MAX, 1901, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10094, UINT16_MAX, 8562, UINT16_MAX, 8562, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10096, 1906, UINT16_MAX, 1906, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10099, UINT16_MAX, 8563, UINT16_MAX, 8563, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10101, 1911, UINT16_MAX, 1911, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10104, UINT16_MAX, 8564, UINT16_MAX, 8564, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10106, 1916, UINT16_MAX, 1916, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10109, UINT16_MAX, 8565, UINT16_MAX, 8565, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10111, 1921, UINT16_MAX, 1921, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10114, UINT16_MAX, 8566, UINT16_MAX, 8566, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10116, 1926, UINT16_MAX, 1926, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10119, UINT16_MAX, 8567, UINT16_MAX, 8567, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10121, 1931, UINT16_MAX, 1931, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10124, UINT16_MAX, 8568, UINT16_MAX, 8568, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10126, 1936, UINT16_MAX, 1936, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10129, UINT16_MAX, 8569, UINT16_MAX, 8569, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10131, 1941, UINT16_MAX, 1941, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10134, UINT16_MAX, 8570, UINT16_MAX, 8570, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10136, 1946, UINT16_MAX, 1946, UINT16_MAX, 3455, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10139, UINT16_MAX, 8571, UINT16_MAX, 8571, 3458, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10141, 1951, UINT16_MAX, 1951, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10144, UINT16_MAX, 8572, UINT16_MAX, 8572, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10146, 1956, UINT16_MAX, 1956, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10149, UINT16_MAX, 8573, UINT16_MAX, 8573, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10151, 1961, UINT16_MAX, 1961, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10154, UINT16_MAX, 8574, UINT16_MAX, 8574, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10156, 1966, UINT16_MAX, 1966, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10159, UINT16_MAX, 8575, UINT16_MAX, 8575, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10161, 1971, UINT16_MAX, 1971, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10164, UINT16_MAX, 8576, UINT16_MAX, 8576, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10166, 1976, UINT16_MAX, 1976, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10169, UINT16_MAX, 8577, UINT16_MAX, 8577, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10171, 1981, UINT16_MAX, 1981, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10174, UINT16_MAX, 8578, UINT16_MAX, 8578, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10176, 1986, UINT16_MAX, 1986, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10179, UINT16_MAX, 8579, UINT16_MAX, 8579, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10181, 1991, UINT16_MAX, 1991, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10184, UINT16_MAX, 8580, UINT16_MAX, 8580, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10186, 1996, UINT16_MAX, 1996, UINT16_MAX, 3559, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10189, UINT16_MAX, 8581, UINT16_MAX, 8581, 3562, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10191, 2001, UINT16_MAX, 2001, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10194, UINT16_MAX, 8582, UINT16_MAX, 8582, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10196, 2006, UINT16_MAX, 2006, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10199, UINT16_MAX, 8583, UINT16_MAX, 8583, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10201, 2011, UINT16_MAX, 2011, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10204, UINT16_MAX, 8584, UINT16_MAX, 8584, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10206, 2016, UINT16_MAX, 2016, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10209, UINT16_MAX, 8585, UINT16_MAX, 8585, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10211, 2021, UINT16_MAX, 2021, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10214, UINT16_MAX, 8586, UINT16_MAX, 8586, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10216, 2026, UINT16_MAX, 2026, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10219, UINT16_MAX, 8587, UINT16_MAX, 8587, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10221, 2031, UINT16_MAX, 2031, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10224, UINT16_MAX, 8588, UINT16_MAX, 8588, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10226, 2036, UINT16_MAX, 2036, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10229, UINT16_MAX, 8589, UINT16_MAX, 8589, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10231, 2041, UINT16_MAX, 2041, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10234, UINT16_MAX, 8590, UINT16_MAX, 8590, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10236, 2046, UINT16_MAX, 2046, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10239, UINT16_MAX, 8591, UINT16_MAX, 8591, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10241, 2051, UINT16_MAX, 2051, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10244, UINT16_MAX, 8592, UINT16_MAX, 8592, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10246, 2056, UINT16_MAX, 2056, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10249, UINT16_MAX, 8593, UINT16_MAX, 8593, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10251, 2061, UINT16_MAX, 2061, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10254, UINT16_MAX, 8594, UINT16_MAX, 8594, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10256, 2066, UINT16_MAX, 2066, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10259, UINT16_MAX, 8595, UINT16_MAX, 8595, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10261, 2071, UINT16_MAX, 2071, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10264, UINT16_MAX, 8596, UINT16_MAX, 8596, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10266, 2076, UINT16_MAX, 2076, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10269, UINT16_MAX, 8597, UINT16_MAX, 8597, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10271, 2081, UINT16_MAX, 2081, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10274, UINT16_MAX, 8598, UINT16_MAX, 8598, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10276, 2086, UINT16_MAX, 2086, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10279, UINT16_MAX, 8599, UINT16_MAX, 8599, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10281, 2091, UINT16_MAX, 2091, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10284, UINT16_MAX, 8600, UINT16_MAX, 8600, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10286, 2096, UINT16_MAX, 2096, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10289, UINT16_MAX, 8601, UINT16_MAX, 8601, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10291, 2101, UINT16_MAX, 2101, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10294, UINT16_MAX, 8602, UINT16_MAX, 8602, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10296, 2106, UINT16_MAX, 2106, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10299, UINT16_MAX, 8603, UINT16_MAX, 8603, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2109, UINT16_MAX, 2109, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8604, UINT16_MAX, 8604, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2110, UINT16_MAX, 2110, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8605, UINT16_MAX, 8605, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2111, UINT16_MAX, 2111, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8606, UINT16_MAX, 8606, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10304, UINT16_MAX, 8607, UINT16_MAX, 8607, 3761, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10306, UINT16_MAX, 8608, UINT16_MAX, 8608, 3814, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10308, UINT16_MAX, 8609, UINT16_MAX, 8609, 4793, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10310, UINT16_MAX, 8610, UINT16_MAX, 8610, 4796, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10312, UINT16_MAX, 8611, UINT16_MAX, 8611, 4799, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10314, UINT16_MAX, 8612, UINT16_MAX, 8612, 4802, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10316, UINT16_MAX, 8613, UINT16_MAX, 8613, 4805, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10318, UINT16_MAX, 8614, UINT16_MAX, 8614, 4808, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10320, 2130, UINT16_MAX, 2130, UINT16_MAX, 3867, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10323, 2133, UINT16_MAX, 2133, UINT16_MAX, 3920, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10326, 2136, UINT16_MAX, 2136, UINT16_MAX, 4811, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10329, 2139, UINT16_MAX, 2139, UINT16_MAX, 4814, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10332, 2142, UINT16_MAX, 2142, UINT16_MAX, 4817, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10335, 2145, UINT16_MAX, 2145, UINT16_MAX, 4820, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10338, 2148, UINT16_MAX, 2148, UINT16_MAX, 4823, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10341, 2151, UINT16_MAX, 2151, UINT16_MAX, 4826, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10344, UINT16_MAX, 8615, UINT16_MAX, 8615, 3973, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10346, UINT16_MAX, 8616, UINT16_MAX, 8616, 3977, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10348, UINT16_MAX, 8617, UINT16_MAX, 8617, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10350, UINT16_MAX, 8618, UINT16_MAX, 8618, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10352, UINT16_MAX, 8619, UINT16_MAX, 8619, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10354, UINT16_MAX, 8620, UINT16_MAX, 8620, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10356, 2166, UINT16_MAX, 2166, UINT16_MAX, 3981, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10359, 2169, UINT16_MAX, 2169, UINT16_MAX, 3985, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10362, 2172, UINT16_MAX, 2172, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10365, 2175, UINT16_MAX, 2175, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10368, 2178, UINT16_MAX, 2178, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10371, 2181, UINT16_MAX, 2181, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10374, UINT16_MAX, 8621, UINT16_MAX, 8621, 3989, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10376, UINT16_MAX, 8622, UINT16_MAX, 8622, 4042, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10378, UINT16_MAX, 8623, UINT16_MAX, 8623, 4829, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10380, UINT16_MAX, 8624, UINT16_MAX, 8624, 4832, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10382, UINT16_MAX, 8625, UINT16_MAX, 8625, 4835, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10384, UINT16_MAX, 8626, UINT16_MAX, 8626, 4838, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10386, UINT16_MAX, 8627, UINT16_MAX, 8627, 4841, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10388, UINT16_MAX, 8628, UINT16_MAX, 8628, 4844, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10390, 2200, UINT16_MAX, 2200, UINT16_MAX, 4095, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10393, 2203, UINT16_MAX, 2203, UINT16_MAX, 4148, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10396, 2206, UINT16_MAX, 2206, UINT16_MAX, 4847, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10399, 2209, UINT16_MAX, 2209, UINT16_MAX, 4850, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10402, 2212, UINT16_MAX, 2212, UINT16_MAX, 4853, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10405, 2215, UINT16_MAX, 2215, UINT16_MAX, 4856, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10408, 2218, UINT16_MAX, 2218, UINT16_MAX, 4859, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10411, 2221, UINT16_MAX, 2221, UINT16_MAX, 4862, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10414, UINT16_MAX, 8629, UINT16_MAX, 8629, 4201, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10416, UINT16_MAX, 8630, UINT16_MAX, 8630, 4253, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10418, UINT16_MAX, 8631, UINT16_MAX, 8631, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10420, UINT16_MAX, 8632, UINT16_MAX, 8632, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10422, UINT16_MAX, 8633, UINT16_MAX, 8633, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10424, UINT16_MAX, 8634, UINT16_MAX, 8634, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10426, UINT16_MAX, 8635, UINT16_MAX, 8635, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10428, UINT16_MAX, 8636, UINT16_MAX, 8636, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10430, 2240, UINT16_MAX, 2240, UINT16_MAX, 4305, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10433, 2243, UINT16_MAX, 2243, UINT16_MAX, 4357, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10436, 2246, UINT16_MAX, 2246, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10439, 2249, UINT16_MAX, 2249, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10442, 2252, UINT16_MAX, 2252, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10445, 2255, UINT16_MAX, 2255, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10448, 2258, UINT16_MAX, 2258, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10451, 2261, UINT16_MAX, 2261, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10454, UINT16_MAX, 8637, UINT16_MAX, 8637, 4409, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10456, UINT16_MAX, 8638, UINT16_MAX, 8638, 4413, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10458, UINT16_MAX, 8639, UINT16_MAX, 8639, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10460, UINT16_MAX, 8640, UINT16_MAX, 8640, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10462, UINT16_MAX, 8641, UINT16_MAX, 8641, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10464, UINT16_MAX, 8642, UINT16_MAX, 8642, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10466, 2276, UINT16_MAX, 2276, UINT16_MAX, 4417, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10469, 2279, UINT16_MAX, 2279, UINT16_MAX, 4421, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10472, 2282, UINT16_MAX, 2282, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10475, 2285, UINT16_MAX, 2285, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10478, 2288, UINT16_MAX, 2288, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10481, 2291, UINT16_MAX, 2291, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10484, 10484, UINT16_MAX, UINT16_MAX, UINT16_MAX, 4425, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10486, UINT16_MAX, 8643, UINT16_MAX, 8643, 4477, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10488, 18682, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10493, UINT16_MAX, 8644, UINT16_MAX, 8644, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10495, 18689, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10500, UINT16_MAX, 8645, UINT16_MAX, 8645, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10502, 18696, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10507, UINT16_MAX, 8646, UINT16_MAX, 8646, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10509, 2319, UINT16_MAX, 2319, UINT16_MAX, 4529, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10512, 2322, UINT16_MAX, 2322, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10515, 2325, UINT16_MAX, 2325, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10518, 2328, UINT16_MAX, 2328, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10521, UINT16_MAX, 8647, UINT16_MAX, 8647, 4581, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10523, UINT16_MAX, 8648, UINT16_MAX, 8648, 4634, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10525, UINT16_MAX, 8649, UINT16_MAX, 8649, 4865, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10527, UINT16_MAX, 8650, UINT16_MAX, 8650, 4868, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10529, UINT16_MAX, 8651, UINT16_MAX, 8651, 4871, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10531, UINT16_MAX, 8652, UINT16_MAX, 8652, 4874, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10533, UINT16_MAX, 8653, UINT16_MAX, 8653, 4877, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10535, UINT16_MAX, 8654, UINT16_MAX, 8654, 4880, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10537, 2347, UINT16_MAX, 2347, UINT16_MAX, 4687, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10540, 2350, UINT16_MAX, 2350, UINT16_MAX, 4740, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10543, 2353, UINT16_MAX, 2353, UINT16_MAX, 4883, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10546, 2356, UINT16_MAX, 2356, UINT16_MAX, 4886, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10549, 2359, UINT16_MAX, 2359, UINT16_MAX, 4889, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10552, 2362, UINT16_MAX, 2362, UINT16_MAX, 4892, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10555, 2365, UINT16_MAX, 2365, UINT16_MAX, 4895, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10558, 2368, UINT16_MAX, 2368, UINT16_MAX, 4898, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10561, UINT16_MAX, 8655, UINT16_MAX, 8655, 4901, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 820, UINT16_MAX, 8656, UINT16_MAX, 8656, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10563, UINT16_MAX, 8657, UINT16_MAX, 8657, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 824, UINT16_MAX, 8658, UINT16_MAX, 8658, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10565, UINT16_MAX, 8659, UINT16_MAX, 8659, 4910, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 827, UINT16_MAX, 8660, UINT16_MAX, 8660, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10567, UINT16_MAX, 8661, UINT16_MAX, 8661, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 830, UINT16_MAX, 8662, UINT16_MAX, 8662, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10569, UINT16_MAX, 8663, UINT16_MAX, 8663, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 833, UINT16_MAX, 8664, UINT16_MAX, 8664, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10571, UINT16_MAX, 8665, UINT16_MAX, 8665, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 836, UINT16_MAX, 8666, UINT16_MAX, 8666, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10573, UINT16_MAX, 8667, UINT16_MAX, 8667, 5030, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 839, UINT16_MAX, 8668, UINT16_MAX, 8668, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10575, 10577, 8669, UINT16_MAX, 8669, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10579, 10581, 8670, UINT16_MAX, 8670, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10583, 10585, 8671, UINT16_MAX, 8671, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10587, 10589, 8672, UINT16_MAX, 8672, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10591, 10593, 8673, UINT16_MAX, 8673, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10595, 10597, 8674, UINT16_MAX, 8674, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10599, 10601, 8675, UINT16_MAX, 8675, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10603, 10605, 8676, UINT16_MAX, 8676, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10607, 2417, UINT16_MAX, 2417, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10610, 2420, UINT16_MAX, 2420, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10613, 2423, UINT16_MAX, 2423, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10616, 2426, UINT16_MAX, 2426, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10619, 2429, UINT16_MAX, 2429, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10622, 2432, UINT16_MAX, 2432, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10625, 2435, UINT16_MAX, 2435, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10628, 2438, UINT16_MAX, 2438, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10631, 10633, 8677, UINT16_MAX, 8677, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10635, 10637, 8678, UINT16_MAX, 8678, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10639, 10641, 8679, UINT16_MAX, 8679, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10643, 10645, 8680, UINT16_MAX, 8680, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10647, 10649, 8681, UINT16_MAX, 8681, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10651, 10653, 8682, UINT16_MAX, 8682, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10655, 10657, 8683, UINT16_MAX, 8683, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10659, 10661, 8684, UINT16_MAX, 8684, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10663, 2473, UINT16_MAX, 2473, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10666, 2476, UINT16_MAX, 2476, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10669, 2479, UINT16_MAX, 2479, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10672, 2482, UINT16_MAX, 2482, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10675, 2485, UINT16_MAX, 2485, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10678, 2488, UINT16_MAX, 2488, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10681, 2491, UINT16_MAX, 2491, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10684, 2494, UINT16_MAX, 2494, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10687, 10689, 8685, UINT16_MAX, 8685, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10691, 10693, 8686, UINT16_MAX, 8686, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10695, 10697, 8687, UINT16_MAX, 8687, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10699, 10701, 8688, UINT16_MAX, 8688, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10703, 10705, 8689, UINT16_MAX, 8689, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10707, 10709, 8690, UINT16_MAX, 8690, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10711, 10713, 8691, UINT16_MAX, 8691, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10715, 10717, 8692, UINT16_MAX, 8692, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10719, 2529, UINT16_MAX, 2529, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10722, 2532, UINT16_MAX, 2532, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10725, 2535, UINT16_MAX, 2535, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10728, 2538, UINT16_MAX, 2538, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10731, 2541, UINT16_MAX, 2541, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10734, 2544, UINT16_MAX, 2544, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10737, 2547, UINT16_MAX, 2547, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10740, 2550, UINT16_MAX, 2550, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10743, UINT16_MAX, 8693, UINT16_MAX, 8693, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10745, UINT16_MAX, 8694, UINT16_MAX, 8694, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10747, 10749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10751, 10753, 8695, UINT16_MAX, 8695, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10755, 10757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10759, 10759, UINT16_MAX, UINT16_MAX, UINT16_MAX, 4907, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10761, 18955, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10766, 2576, UINT16_MAX, 2576, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10769, 2579, UINT16_MAX, 2579, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10772, 2582, UINT16_MAX, 2582, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2583, 2584, UINT16_MAX, 2584, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10777, 2587, UINT16_MAX, 2587, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 807, 807, 7127, UINT16_MAX, 7127, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 4919, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10786, 10788, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10790, 10792, 8696, UINT16_MAX, 8696, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10794, 10796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10798, 10798, UINT16_MAX, UINT16_MAX, UINT16_MAX, 4916, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10800, 18994, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10805, 2615, UINT16_MAX, 2615, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2616, 2617, UINT16_MAX, 2617, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10810, 2620, UINT16_MAX, 2620, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2621, 2622, UINT16_MAX, 2622, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10815, 2625, UINT16_MAX, 2625, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10822, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10824, UINT16_MAX, 8697, UINT16_MAX, 8697, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10826, UINT16_MAX, 8698, UINT16_MAX, 8698, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10828, 19022, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 2641, 17226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10834, 10834, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10836, 19030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10841, 2651, UINT16_MAX, 2651, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10844, 2654, UINT16_MAX, 2654, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10847, 2657, UINT16_MAX, 2657, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2658, 2659, UINT16_MAX, 2659, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10852, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10858, UINT16_MAX, 8699, UINT16_MAX, 8699, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10860, UINT16_MAX, 8700, UINT16_MAX, 8700, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10862, 19056, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 2675, 17267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10868, 10868, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10870, UINT16_MAX, 8701, UINT16_MAX, 8701, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10872, 10872, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10874, 19068, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10879, 2689, UINT16_MAX, 2689, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10882, 2692, UINT16_MAX, 2692, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10885, 2695, UINT16_MAX, 2695, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2696, 2697, UINT16_MAX, 2697, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10890, 2700, UINT16_MAX, 2700, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 10893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 2703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 2704, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10897, 10899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10901, 10903, 8702, UINT16_MAX, 8702, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10905, 10907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10909, 10909, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5036, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, 10911, 19105, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10916, 2726, UINT16_MAX, 2726, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2727, 2728, UINT16_MAX, 2728, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 10921, 2731, UINT16_MAX, 2731, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2732, 2733, UINT16_MAX, 2733, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, 10926, 2736, UINT16_MAX, 2736, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, 2737, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10930, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 4971, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, 2740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, 2741, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_COMPAT, 26, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_COMPAT, 26, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_NOBREAK, 26, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_ZWJ},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NOBREAK, 2742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PI, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PF, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 2745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19132, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZL, 0, UTF8PROC_BIDI_CLASS_WS, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_ZP, 0, UTF8PROC_BIDI_CLASS_B, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRE, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLE, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_PDF, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRO, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLO, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, 10943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, 19137, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10948, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10953, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10955, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_CS, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10961, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27347, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRI, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLI, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_FSI, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_PDI, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 2775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 2776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 2777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 2778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 2779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 2780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, 2781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, 2782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, 2783, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 2784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 2785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 2786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 13, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 2775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 38, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 31, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 32, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 2776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 2777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 2778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 2779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 2780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, 2781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, 2782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, 2783, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, 2784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, 2785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, 2786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 4, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 14, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 23, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 7, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 10, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 11, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 12, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 13, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 15, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 18, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 19, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, 10979, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19173, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19176, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10988, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19182, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2804, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10997, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 10999, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 11002, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 11007, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2818, 866, UINT16_MAX, 866, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 1456, 10, UINT16_MAX, 10, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, 2819, 65, UINT16_MAX, 65, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2821, UINT16_MAX, 2821, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2822, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2823, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2824, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2825, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 858, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2829, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2830, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, 2831, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8703, UINT16_MAX, 8703, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19216, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 27414, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19229, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19232, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19235, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19238, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19241, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19244, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19247, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19253, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19256, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 11070, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 1454, 2880, UINT16_MAX, 2880, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11073, 2883, UINT16_MAX, 2883, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19268, 2887, UINT16_MAX, 2887, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11080, 2890, UINT16_MAX, 2890, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2891, 2892, UINT16_MAX, 2892, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11085, 2895, UINT16_MAX, 2895, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19280, 2899, UINT16_MAX, 2899, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 27476, 2904, UINT16_MAX, 2904, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11097, 2907, UINT16_MAX, 2907, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2908, 2909, UINT16_MAX, 2909, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11102, 2912, UINT16_MAX, 2912, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19297, 2916, UINT16_MAX, 2916, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 1457, 2917, UINT16_MAX, 2917, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2795, 2918, UINT16_MAX, 2918, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 1449, 2919, UINT16_MAX, 2919, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 1458, 2920, UINT16_MAX, 2920, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 8, UINT16_MAX, 8704, UINT16_MAX, 8704, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11113, UINT16_MAX, 8705, UINT16_MAX, 8705, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19307, UINT16_MAX, 8706, UINT16_MAX, 8706, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11118, UINT16_MAX, 8707, UINT16_MAX, 8707, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21, UINT16_MAX, 8708, UINT16_MAX, 8708, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11120, UINT16_MAX, 8709, UINT16_MAX, 8709, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19314, UINT16_MAX, 8710, UINT16_MAX, 8710, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 27509, UINT16_MAX, 8711, UINT16_MAX, 8711, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11129, UINT16_MAX, 8712, UINT16_MAX, 8712, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23, UINT16_MAX, 8713, UINT16_MAX, 8713, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11131, UINT16_MAX, 8714, UINT16_MAX, 8714, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19325, UINT16_MAX, 8715, UINT16_MAX, 8715, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 11, UINT16_MAX, 8716, UINT16_MAX, 8716, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 2, UINT16_MAX, 8717, UINT16_MAX, 8717, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3, UINT16_MAX, 8718, UINT16_MAX, 8718, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12, UINT16_MAX, 8719, UINT16_MAX, 8719, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2944, UINT16_MAX, 2944, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8720, UINT16_MAX, 8720, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, 19329, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5039, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5042, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5045, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11144, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11146, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11148, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11150, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5048, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5054, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5051, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5057, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11152, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5060, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11154, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5063, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11156, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5066, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11158, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5069, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 11162, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19356, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 11167, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19361, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5072, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11172, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5075, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5078, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11176, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5081, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11178, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5090, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11180, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5087, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11182, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5099, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5102, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11184, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11186, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5105, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5108, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5111, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5114, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5117, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5120, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5147, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5150, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5123, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5126, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5129, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5132, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5153, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5156, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5135, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5138, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5141, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5144, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11214, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11216, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11218, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11220, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5159, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5162, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5165, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5168, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11222, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11224, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11228, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11230, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11232, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11234, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11236, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, 3046, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, 3047, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 38, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 31, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 32, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 2776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 2777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 2778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 2779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 2780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 2781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11240, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11242, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11244, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11246, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11248, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11252, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11254, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11256, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11258, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 11260, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27681, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27685, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27689, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27693, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27697, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27701, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27705, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27709, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27713, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11333, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11335, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11337, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11339, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11341, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11343, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11345, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11347, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 11349, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19543, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 19573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19579, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19582, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19585, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19588, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19591, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19594, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19597, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19600, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19603, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19606, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19609, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19615, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19618, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19621, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19627, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19630, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19636, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19639, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19642, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19645, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19648, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 19651, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1446, 3270, UINT16_MAX, 3270, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1448, 3271, UINT16_MAX, 3271, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2795, 3272, UINT16_MAX, 3272, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1449, 3273, UINT16_MAX, 3273, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1450, 3274, UINT16_MAX, 3274, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2820, 3275, UINT16_MAX, 3275, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1452, 3276, UINT16_MAX, 3276, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1453, 3277, UINT16_MAX, 3277, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1454, 3278, UINT16_MAX, 3278, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1455, 3279, UINT16_MAX, 3279, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1456, 3280, UINT16_MAX, 3280, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1457, 3281, UINT16_MAX, 3281, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1458, 3282, UINT16_MAX, 3282, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1459, 3283, UINT16_MAX, 3283, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1460, 3284, UINT16_MAX, 3284, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1462, 3285, UINT16_MAX, 3285, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2809, 3286, UINT16_MAX, 3286, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1463, 3287, UINT16_MAX, 3287, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3288, 3289, UINT16_MAX, 3289, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1464, 3290, UINT16_MAX, 3290, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1465, 3291, UINT16_MAX, 3291, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2891, 3292, UINT16_MAX, 3292, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1466, 3293, UINT16_MAX, 3293, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2908, 3294, UINT16_MAX, 3294, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3295, 3296, UINT16_MAX, 3296, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2817, 3297, UINT16_MAX, 3297, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 0, UINT16_MAX, 8721, UINT16_MAX, 8721, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1, UINT16_MAX, 8722, UINT16_MAX, 8722, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2, UINT16_MAX, 8723, UINT16_MAX, 8723, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3, UINT16_MAX, 8724, UINT16_MAX, 8724, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4, UINT16_MAX, 8725, UINT16_MAX, 8725, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 5, UINT16_MAX, 8726, UINT16_MAX, 8726, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 6, UINT16_MAX, 8727, UINT16_MAX, 8727, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 7, UINT16_MAX, 8728, UINT16_MAX, 8728, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 8, UINT16_MAX, 8729, UINT16_MAX, 8729, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 9, UINT16_MAX, 8730, UINT16_MAX, 8730, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 10, UINT16_MAX, 8731, UINT16_MAX, 8731, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 11, UINT16_MAX, 8732, UINT16_MAX, 8732, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12, UINT16_MAX, 8733, UINT16_MAX, 8733, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 13, UINT16_MAX, 8734, UINT16_MAX, 8734, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 14, UINT16_MAX, 8735, UINT16_MAX, 8735, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 15, UINT16_MAX, 8736, UINT16_MAX, 8736, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 16, UINT16_MAX, 8737, UINT16_MAX, 8737, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 17, UINT16_MAX, 8738, UINT16_MAX, 8738, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 18, UINT16_MAX, 8739, UINT16_MAX, 8739, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 19, UINT16_MAX, 8740, UINT16_MAX, 8740, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 20, UINT16_MAX, 8741, UINT16_MAX, 8741, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 21, UINT16_MAX, 8742, UINT16_MAX, 8742, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 22, UINT16_MAX, 8743, UINT16_MAX, 8743, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 23, UINT16_MAX, 8744, UINT16_MAX, 8744, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 24, UINT16_MAX, 8745, UINT16_MAX, 8745, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 25, UINT16_MAX, 8746, UINT16_MAX, 8746, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 2775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_E_BASE},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_E_BASE},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_GLUE_AFTER_ZWJ},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 27874, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19686, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 11497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 19691, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, 11502, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, true, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5171, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3312, UINT16_MAX, 3312, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3313, UINT16_MAX, 3313, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3314, UINT16_MAX, 3314, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3315, UINT16_MAX, 3315, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3316, UINT16_MAX, 3316, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3317, UINT16_MAX, 3317, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3318, UINT16_MAX, 3318, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3319, UINT16_MAX, 3319, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3320, UINT16_MAX, 3320, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3321, UINT16_MAX, 3321, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3322, UINT16_MAX, 3322, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3323, UINT16_MAX, 3323, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3324, UINT16_MAX, 3324, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3325, UINT16_MAX, 3325, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3326, UINT16_MAX, 3326, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3327, UINT16_MAX, 3327, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3328, UINT16_MAX, 3328, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3329, UINT16_MAX, 3329, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3330, UINT16_MAX, 3330, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3331, UINT16_MAX, 3331, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3332, UINT16_MAX, 3332, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3333, UINT16_MAX, 3333, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3334, UINT16_MAX, 3334, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3335, UINT16_MAX, 3335, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3336, UINT16_MAX, 3336, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3337, UINT16_MAX, 3337, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3338, UINT16_MAX, 3338, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3339, UINT16_MAX, 3339, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3340, UINT16_MAX, 3340, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3341, UINT16_MAX, 3341, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3342, UINT16_MAX, 3342, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3343, UINT16_MAX, 3343, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3344, UINT16_MAX, 3344, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3345, UINT16_MAX, 3345, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3346, UINT16_MAX, 3346, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3347, UINT16_MAX, 3347, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3348, UINT16_MAX, 3348, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3349, UINT16_MAX, 3349, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3350, UINT16_MAX, 3350, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3351, UINT16_MAX, 3351, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3352, UINT16_MAX, 3352, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3353, UINT16_MAX, 3353, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3354, UINT16_MAX, 3354, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3355, UINT16_MAX, 3355, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3356, UINT16_MAX, 3356, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3357, UINT16_MAX, 3357, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3358, UINT16_MAX, 3358, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8747, UINT16_MAX, 8747, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8748, UINT16_MAX, 8748, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8749, UINT16_MAX, 8749, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8750, UINT16_MAX, 8750, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8751, UINT16_MAX, 8751, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8752, UINT16_MAX, 8752, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8753, UINT16_MAX, 8753, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8754, UINT16_MAX, 8754, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8755, UINT16_MAX, 8755, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8756, UINT16_MAX, 8756, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8757, UINT16_MAX, 8757, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8758, UINT16_MAX, 8758, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8759, UINT16_MAX, 8759, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8760, UINT16_MAX, 8760, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8761, UINT16_MAX, 8761, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8762, UINT16_MAX, 8762, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8763, UINT16_MAX, 8763, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8764, UINT16_MAX, 8764, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8765, UINT16_MAX, 8765, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8766, UINT16_MAX, 8766, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8767, UINT16_MAX, 8767, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8768, UINT16_MAX, 8768, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8769, UINT16_MAX, 8769, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8770, UINT16_MAX, 8770, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8771, UINT16_MAX, 8771, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8772, UINT16_MAX, 8772, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8773, UINT16_MAX, 8773, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8774, UINT16_MAX, 8774, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8775, UINT16_MAX, 8775, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8776, UINT16_MAX, 8776, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8777, UINT16_MAX, 8777, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8778, UINT16_MAX, 8778, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8779, UINT16_MAX, 8779, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8780, UINT16_MAX, 8780, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8781, UINT16_MAX, 8781, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8782, UINT16_MAX, 8782, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8783, UINT16_MAX, 8783, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8784, UINT16_MAX, 8784, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8785, UINT16_MAX, 8785, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8786, UINT16_MAX, 8786, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8787, UINT16_MAX, 8787, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8788, UINT16_MAX, 8788, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8789, UINT16_MAX, 8789, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8790, UINT16_MAX, 8790, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8791, UINT16_MAX, 8791, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8792, UINT16_MAX, 8792, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8793, UINT16_MAX, 8793, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3359, UINT16_MAX, 3359, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8794, UINT16_MAX, 8794, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3360, UINT16_MAX, 3360, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3361, UINT16_MAX, 3361, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3362, UINT16_MAX, 3362, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8795, UINT16_MAX, 8795, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8796, UINT16_MAX, 8796, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3363, UINT16_MAX, 3363, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8797, UINT16_MAX, 8797, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3364, UINT16_MAX, 3364, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8798, UINT16_MAX, 8798, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3365, UINT16_MAX, 3365, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8799, UINT16_MAX, 8799, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1468, UINT16_MAX, 1468, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1486, UINT16_MAX, 1486, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1467, UINT16_MAX, 1467, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1475, UINT16_MAX, 1475, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3366, UINT16_MAX, 3366, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8800, UINT16_MAX, 8800, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3367, UINT16_MAX, 3367, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8801, UINT16_MAX, 8801, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 9, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 2891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3368, UINT16_MAX, 3368, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3369, UINT16_MAX, 3369, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3370, UINT16_MAX, 3370, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8802, UINT16_MAX, 8802, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3371, UINT16_MAX, 3371, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8803, UINT16_MAX, 8803, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3372, UINT16_MAX, 3372, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8804, UINT16_MAX, 8804, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3373, UINT16_MAX, 3373, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8805, UINT16_MAX, 8805, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3374, UINT16_MAX, 3374, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8806, UINT16_MAX, 8806, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3375, UINT16_MAX, 3375, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8807, UINT16_MAX, 8807, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3376, UINT16_MAX, 3376, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8808, UINT16_MAX, 8808, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3377, UINT16_MAX, 3377, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8809, UINT16_MAX, 8809, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3378, UINT16_MAX, 3378, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8810, UINT16_MAX, 8810, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3379, UINT16_MAX, 3379, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8811, UINT16_MAX, 8811, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3380, UINT16_MAX, 3380, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8812, UINT16_MAX, 8812, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3381, UINT16_MAX, 3381, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8813, UINT16_MAX, 8813, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3382, UINT16_MAX, 3382, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8814, UINT16_MAX, 8814, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3383, UINT16_MAX, 3383, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8815, UINT16_MAX, 8815, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3384, UINT16_MAX, 3384, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8816, UINT16_MAX, 8816, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3385, UINT16_MAX, 3385, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8817, UINT16_MAX, 8817, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3386, UINT16_MAX, 3386, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8818, UINT16_MAX, 8818, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3387, UINT16_MAX, 3387, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8819, UINT16_MAX, 8819, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3388, UINT16_MAX, 3388, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8820, UINT16_MAX, 8820, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3389, UINT16_MAX, 3389, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8821, UINT16_MAX, 8821, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3390, UINT16_MAX, 3390, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8822, UINT16_MAX, 8822, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3391, UINT16_MAX, 3391, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8823, UINT16_MAX, 8823, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3392, UINT16_MAX, 3392, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8824, UINT16_MAX, 8824, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3393, UINT16_MAX, 3393, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8825, UINT16_MAX, 8825, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3394, UINT16_MAX, 3394, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8826, UINT16_MAX, 8826, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3395, UINT16_MAX, 3395, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8827, UINT16_MAX, 8827, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3396, UINT16_MAX, 3396, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8828, UINT16_MAX, 8828, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3397, UINT16_MAX, 3397, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8829, UINT16_MAX, 8829, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3398, UINT16_MAX, 3398, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8830, UINT16_MAX, 8830, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3399, UINT16_MAX, 3399, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8831, UINT16_MAX, 8831, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3400, UINT16_MAX, 3400, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8832, UINT16_MAX, 8832, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3401, UINT16_MAX, 3401, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8833, UINT16_MAX, 8833, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3402, UINT16_MAX, 3402, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8834, UINT16_MAX, 8834, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3403, UINT16_MAX, 3403, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8835, UINT16_MAX, 8835, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3404, UINT16_MAX, 3404, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8836, UINT16_MAX, 8836, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3405, UINT16_MAX, 3405, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8837, UINT16_MAX, 8837, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3406, UINT16_MAX, 3406, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8838, UINT16_MAX, 8838, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3407, UINT16_MAX, 3407, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8839, UINT16_MAX, 8839, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3408, UINT16_MAX, 3408, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8840, UINT16_MAX, 8840, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3409, UINT16_MAX, 3409, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8841, UINT16_MAX, 8841, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3410, UINT16_MAX, 3410, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8842, UINT16_MAX, 8842, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3411, UINT16_MAX, 3411, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8843, UINT16_MAX, 8843, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3412, UINT16_MAX, 3412, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8844, UINT16_MAX, 8844, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3413, UINT16_MAX, 3413, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8845, UINT16_MAX, 8845, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3414, UINT16_MAX, 3414, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8846, UINT16_MAX, 8846, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3415, UINT16_MAX, 3415, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8847, UINT16_MAX, 8847, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3416, UINT16_MAX, 3416, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8848, UINT16_MAX, 8848, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3417, UINT16_MAX, 3417, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8849, UINT16_MAX, 8849, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3418, UINT16_MAX, 3418, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8850, UINT16_MAX, 8850, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3419, UINT16_MAX, 3419, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8851, UINT16_MAX, 8851, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3420, UINT16_MAX, 3420, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8852, UINT16_MAX, 8852, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3421, UINT16_MAX, 3421, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8853, UINT16_MAX, 8853, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 3422, UINT16_MAX, 3422, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8854, UINT16_MAX, 8854, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8855, UINT16_MAX, 8855, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8856, UINT16_MAX, 8856, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8857, UINT16_MAX, 8857, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8858, UINT16_MAX, 8858, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8859, UINT16_MAX, 8859, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8860, UINT16_MAX, 8860, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8861, UINT16_MAX, 8861, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8862, UINT16_MAX, 8862, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8863, UINT16_MAX, 8863, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8864, UINT16_MAX, 8864, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8865, UINT16_MAX, 8865, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8866, UINT16_MAX, 8866, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8867, UINT16_MAX, 8867, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8868, UINT16_MAX, 8868, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8869, UINT16_MAX, 8869, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8870, UINT16_MAX, 8870, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8871, UINT16_MAX, 8871, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8872, UINT16_MAX, 8872, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8873, UINT16_MAX, 8873, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8874, UINT16_MAX, 8874, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8875, UINT16_MAX, 8875, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8876, UINT16_MAX, 8876, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8877, UINT16_MAX, 8877, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8878, UINT16_MAX, 8878, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8879, UINT16_MAX, 8879, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8880, UINT16_MAX, 8880, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8881, UINT16_MAX, 8881, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8882, UINT16_MAX, 8882, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8883, UINT16_MAX, 8883, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8884, UINT16_MAX, 8884, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8885, UINT16_MAX, 8885, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8886, UINT16_MAX, 8886, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8887, UINT16_MAX, 8887, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8888, UINT16_MAX, 8888, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8889, UINT16_MAX, 8889, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8890, UINT16_MAX, 8890, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8891, UINT16_MAX, 8891, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8892, UINT16_MAX, 8892, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8893, UINT16_MAX, 8893, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8894, UINT16_MAX, 8894, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3424, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3425, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3431, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3434, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3442, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3443, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3444, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3445, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3447, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3476, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3477, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3484, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3486, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3487, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3495, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3498, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3502, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3504, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3506, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3508, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3512, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3516, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3518, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3519, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3520, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3521, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3522, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3523, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3524, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3525, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3526, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3527, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3528, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3529, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3530, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3531, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3533, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3534, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3535, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3536, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3537, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3538, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3539, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3540, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3541, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3542, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3543, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3544, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3547, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3548, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3579, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3580, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3581, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3582, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3583, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3584, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3585, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3586, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3587, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3588, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3589, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3590, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3591, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3593, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3594, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3595, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3596, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3597, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3598, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3599, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3600, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3601, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3602, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3603, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3604, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3605, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3606, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3609, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3611, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3614, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3615, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3618, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3620, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3621, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3622, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3627, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3630, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3635, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3636, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3639, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_WIDE, 26, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 218, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 224, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 3640, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3641, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3642, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5239, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5174, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11835, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5177, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11837, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5180, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11839, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5183, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11841, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5186, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11843, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5189, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5192, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5195, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11849, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5198, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5201, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5204, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11855, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5207, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5210, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5213, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5216, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5219, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11867, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5223, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5227, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11873, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11875, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5231, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11879, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5235, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11881, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11883, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32820, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 32821, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 11887, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 11889, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5242, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, 11891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, 11893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5310, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5245, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5248, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5251, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5254, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11901, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5257, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5260, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11905, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5263, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5266, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5269, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5272, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11913, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5275, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5278, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5281, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11919, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5284, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5287, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11923, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5290, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11925, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11927, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5294, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11929, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11931, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5298, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11933, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5302, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5306, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5313, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5316, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5319, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5322, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11945, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11947, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11949, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11951, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 11953, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5325, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, 11955, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, 11957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3768, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3771, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3774, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3783, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3788, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3789, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3791, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3792, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3794, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3797, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3798, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3799, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3800, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3801, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3802, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3803, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3804, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3805, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3806, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3807, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3808, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3810, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3811, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3812, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3813, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3815, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3816, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3819, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3821, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3822, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3823, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3824, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3825, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3826, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3827, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3828, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3829, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3830, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3831, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3832, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3833, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3834, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3835, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3836, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3837, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3838, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3839, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3840, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3841, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3842, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3843, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3844, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3849, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3850, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3852, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3855, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3858, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 3860, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3862, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3867, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3868, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3870, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3434, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20258, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20276, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20282, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20291, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20294, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28521, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28525, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28529, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28533, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28537, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28541, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 28545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 53125, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 44940, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20376, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20379, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20382, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20385, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20388, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20391, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20394, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20397, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20400, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20403, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20406, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20409, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20412, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20415, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20418, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20421, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20424, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20442, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20445, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4095, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4096, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 20481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12292, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12294, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12296, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12298, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12300, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12302, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12304, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12306, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12310, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12312, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12314, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12316, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12318, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12320, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3783, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3789, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3792, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3794, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12322, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12324, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12326, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12328, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12330, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12332, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12334, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12336, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12338, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12340, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12342, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12344, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12346, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12348, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 36926, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 28739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12359, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3862, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4169, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4171, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4172, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4173, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4175, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4176, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4177, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4178, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4180, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4181, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4182, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4183, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4184, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4186, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 3865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12393, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12395, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12397, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12399, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12401, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12403, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12405, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12407, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12409, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12411, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12413, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12415, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12417, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12419, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, 12421, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12425, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12431, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20636, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 20639, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 12450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 20644, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 12455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 20649, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4274, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4276, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4278, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4280, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4281, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4282, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4290, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4291, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4292, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4293, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4294, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4296, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4297, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4298, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4300, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4301, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4302, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4304, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4306, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4309, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4310, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4311, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4312, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4313, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 4314, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20711, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28906, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20721, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37108, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20733, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20736, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20750, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20753, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28953, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37155, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 45352, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37166, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28992, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20804, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20807, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20810, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29005, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37201, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29014, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20826, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20829, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20832, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12643, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12645, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12647, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12649, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20843, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37233, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29049, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37245, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12679, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29070, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20887, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37274, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20906, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12727, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20924, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20927, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20940, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37327, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37338, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29157, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20969, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20972, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20975, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20984, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12799, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37377, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 20998, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12811, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12813, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12815, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12819, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12821, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12823, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12825, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 12827, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21021, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21024, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21027, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21033, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21036, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21039, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21042, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21045, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21048, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21051, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21054, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21057, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21060, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21063, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21066, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12879, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21073, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12886, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 12888, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 21082, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 21085, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 12896, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12898, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12904, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29290, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12912, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12918, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12920, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12922, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12924, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21118, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29313, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12933, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12945, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21139, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21148, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12961, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12963, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12965, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12967, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12969, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12971, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12973, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12975, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12977, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21171, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12985, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21182, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12996, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29388, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13008, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21211, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37598, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 45795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13033, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13035, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13037, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13039, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13041, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13043, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13045, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13047, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13049, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13051, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13053, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13055, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13057, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13059, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13061, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13063, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13065, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13067, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13073, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13075, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13077, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13086, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13088, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13092, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13096, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13098, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13100, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21298, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13109, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13111, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13119, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 21317, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13130, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13132, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 13134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 21328, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 21331, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13144, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13146, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13148, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13150, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13152, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13154, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13156, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13158, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21352, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21361, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21376, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21379, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21382, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21385, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21388, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21391, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21394, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21397, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21400, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21403, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21406, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21409, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21412, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 21415, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, 21418, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5037, UINT16_MAX, 5037, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8895, UINT16_MAX, 8895, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5038, UINT16_MAX, 5038, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8896, UINT16_MAX, 8896, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5039, UINT16_MAX, 5039, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8897, UINT16_MAX, 8897, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5040, UINT16_MAX, 5040, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8898, UINT16_MAX, 8898, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5041, UINT16_MAX, 5041, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8899, UINT16_MAX, 8899, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1445, UINT16_MAX, 1445, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8481, UINT16_MAX, 8481, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5042, UINT16_MAX, 5042, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8900, UINT16_MAX, 8900, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5043, UINT16_MAX, 5043, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8901, UINT16_MAX, 8901, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5044, UINT16_MAX, 5044, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8902, UINT16_MAX, 8902, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5045, UINT16_MAX, 5045, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8903, UINT16_MAX, 8903, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5046, UINT16_MAX, 5046, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8904, UINT16_MAX, 8904, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5047, UINT16_MAX, 5047, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8905, UINT16_MAX, 8905, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5048, UINT16_MAX, 5048, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8906, UINT16_MAX, 8906, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5049, UINT16_MAX, 5049, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8907, UINT16_MAX, 8907, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5050, UINT16_MAX, 5050, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8908, UINT16_MAX, 8908, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5051, UINT16_MAX, 5051, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8909, UINT16_MAX, 8909, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5052, UINT16_MAX, 5052, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8910, UINT16_MAX, 8910, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5053, UINT16_MAX, 5053, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8911, UINT16_MAX, 8911, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5054, UINT16_MAX, 5054, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8912, UINT16_MAX, 8912, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5055, UINT16_MAX, 5055, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8913, UINT16_MAX, 8913, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5056, UINT16_MAX, 5056, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8914, UINT16_MAX, 8914, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5057, UINT16_MAX, 5057, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8915, UINT16_MAX, 8915, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5058, UINT16_MAX, 5058, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8916, UINT16_MAX, 8916, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5059, UINT16_MAX, 5059, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8917, UINT16_MAX, 8917, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5060, UINT16_MAX, 5060, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8918, UINT16_MAX, 8918, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5061, UINT16_MAX, 5061, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8919, UINT16_MAX, 8919, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5062, UINT16_MAX, 5062, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8920, UINT16_MAX, 8920, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5063, UINT16_MAX, 5063, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8921, UINT16_MAX, 8921, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5064, UINT16_MAX, 5064, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8922, UINT16_MAX, 8922, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5065, UINT16_MAX, 5065, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8923, UINT16_MAX, 8923, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5066, UINT16_MAX, 5066, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8924, UINT16_MAX, 8924, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5067, UINT16_MAX, 5067, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8925, UINT16_MAX, 8925, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5068, UINT16_MAX, 5068, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8926, UINT16_MAX, 8926, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5069, UINT16_MAX, 5069, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8927, UINT16_MAX, 8927, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5070, UINT16_MAX, 5070, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8928, UINT16_MAX, 8928, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5071, UINT16_MAX, 5071, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8929, UINT16_MAX, 8929, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5072, UINT16_MAX, 5072, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8930, UINT16_MAX, 8930, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 981, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5073, UINT16_MAX, 5073, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8931, UINT16_MAX, 8931, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5074, UINT16_MAX, 5074, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8932, UINT16_MAX, 8932, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5075, UINT16_MAX, 5075, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8933, UINT16_MAX, 8933, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5076, UINT16_MAX, 5076, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8934, UINT16_MAX, 8934, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5077, UINT16_MAX, 5077, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8935, UINT16_MAX, 8935, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5078, UINT16_MAX, 5078, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8936, UINT16_MAX, 8936, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5079, UINT16_MAX, 5079, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8937, UINT16_MAX, 8937, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5080, UINT16_MAX, 5080, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8938, UINT16_MAX, 8938, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5081, UINT16_MAX, 5081, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8939, UINT16_MAX, 8939, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5082, UINT16_MAX, 5082, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8940, UINT16_MAX, 8940, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5083, UINT16_MAX, 5083, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8941, UINT16_MAX, 8941, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5084, UINT16_MAX, 5084, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8942, UINT16_MAX, 8942, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5085, UINT16_MAX, 5085, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8943, UINT16_MAX, 8943, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5086, UINT16_MAX, 5086, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8944, UINT16_MAX, 8944, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5087, UINT16_MAX, 5087, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8945, UINT16_MAX, 8945, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5088, UINT16_MAX, 5088, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8946, UINT16_MAX, 8946, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5089, UINT16_MAX, 5089, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8947, UINT16_MAX, 8947, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5090, UINT16_MAX, 5090, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8948, UINT16_MAX, 8948, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5091, UINT16_MAX, 5091, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8949, UINT16_MAX, 8949, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5092, UINT16_MAX, 5092, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8950, UINT16_MAX, 8950, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5093, UINT16_MAX, 5093, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8951, UINT16_MAX, 8951, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5094, UINT16_MAX, 5094, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8952, UINT16_MAX, 8952, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5095, UINT16_MAX, 5095, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8953, UINT16_MAX, 8953, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5096, UINT16_MAX, 5096, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8954, UINT16_MAX, 8954, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5097, UINT16_MAX, 5097, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8955, UINT16_MAX, 8955, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5098, UINT16_MAX, 5098, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8956, UINT16_MAX, 8956, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5099, UINT16_MAX, 5099, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8957, UINT16_MAX, 8957, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5100, UINT16_MAX, 5100, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8958, UINT16_MAX, 8958, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5101, UINT16_MAX, 5101, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8959, UINT16_MAX, 8959, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5102, UINT16_MAX, 5102, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8960, UINT16_MAX, 8960, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5103, UINT16_MAX, 5103, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8961, UINT16_MAX, 8961, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5104, UINT16_MAX, 5104, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8962, UINT16_MAX, 8962, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5105, UINT16_MAX, 5105, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8963, UINT16_MAX, 8963, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5106, UINT16_MAX, 5106, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8964, UINT16_MAX, 8964, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5107, UINT16_MAX, 5107, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8965, UINT16_MAX, 8965, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5108, UINT16_MAX, 5108, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8966, UINT16_MAX, 8966, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5109, UINT16_MAX, 5109, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8967, UINT16_MAX, 8967, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5110, UINT16_MAX, 5110, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8968, UINT16_MAX, 8968, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 5110, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5111, UINT16_MAX, 5111, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8969, UINT16_MAX, 8969, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5112, UINT16_MAX, 5112, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8970, UINT16_MAX, 8970, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5113, UINT16_MAX, 5113, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5114, UINT16_MAX, 5114, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8971, UINT16_MAX, 8971, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5115, UINT16_MAX, 5115, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8972, UINT16_MAX, 8972, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5116, UINT16_MAX, 5116, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8973, UINT16_MAX, 8973, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5117, UINT16_MAX, 5117, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8974, UINT16_MAX, 8974, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5118, UINT16_MAX, 5118, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8975, UINT16_MAX, 8975, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5119, UINT16_MAX, 5119, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8976, UINT16_MAX, 8976, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1479, UINT16_MAX, 1479, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5120, UINT16_MAX, 5120, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8977, UINT16_MAX, 8977, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5121, UINT16_MAX, 5121, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8978, UINT16_MAX, 8978, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5122, UINT16_MAX, 5122, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8979, UINT16_MAX, 8979, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5123, UINT16_MAX, 5123, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8980, UINT16_MAX, 8980, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5124, UINT16_MAX, 5124, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8981, UINT16_MAX, 8981, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5125, UINT16_MAX, 5125, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8982, UINT16_MAX, 8982, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5126, UINT16_MAX, 5126, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8983, UINT16_MAX, 8983, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5127, UINT16_MAX, 5127, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8984, UINT16_MAX, 8984, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5128, UINT16_MAX, 5128, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8985, UINT16_MAX, 8985, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5129, UINT16_MAX, 5129, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8986, UINT16_MAX, 8986, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5130, UINT16_MAX, 5130, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8987, UINT16_MAX, 8987, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5131, UINT16_MAX, 5131, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8988, UINT16_MAX, 8988, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 785, UINT16_MAX, 785, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1470, UINT16_MAX, 1470, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1478, UINT16_MAX, 1478, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5132, UINT16_MAX, 5132, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1480, UINT16_MAX, 1480, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5133, UINT16_MAX, 5133, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5134, UINT16_MAX, 5134, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1482, UINT16_MAX, 1482, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5135, UINT16_MAX, 5135, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5136, UINT16_MAX, 5136, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8989, UINT16_MAX, 8989, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5137, UINT16_MAX, 5137, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8990, UINT16_MAX, 8990, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 5138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 371, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ET, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8991, UINT16_MAX, 8991, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 5075, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 5139, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 3360, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 5140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5141, 5141, UINT16_MAX, 5141, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5142, 5142, UINT16_MAX, 5142, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5143, 5143, UINT16_MAX, 5143, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5144, 5144, UINT16_MAX, 5144, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5145, 5145, UINT16_MAX, 5145, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5146, 5146, UINT16_MAX, 5146, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5147, 5147, UINT16_MAX, 5147, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5148, 5148, UINT16_MAX, 5148, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5149, 5149, UINT16_MAX, 5149, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5150, 5150, UINT16_MAX, 5150, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5151, 5151, UINT16_MAX, 5151, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5152, 5152, UINT16_MAX, 5152, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5153, 5153, UINT16_MAX, 5153, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5154, 5154, UINT16_MAX, 5154, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5155, 5155, UINT16_MAX, 5155, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5156, 5156, UINT16_MAX, 5156, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5157, 5157, UINT16_MAX, 5157, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5158, 5158, UINT16_MAX, 5158, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5159, 5159, UINT16_MAX, 5159, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5160, 5160, UINT16_MAX, 5160, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5161, 5161, UINT16_MAX, 5161, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5162, 5162, UINT16_MAX, 5162, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5163, 5163, UINT16_MAX, 5163, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5164, 5164, UINT16_MAX, 5164, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5165, 5165, UINT16_MAX, 5165, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5166, 5166, UINT16_MAX, 5166, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5167, 5167, UINT16_MAX, 5167, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5168, 5168, UINT16_MAX, 5168, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5169, 5169, UINT16_MAX, 5169, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5170, 5170, UINT16_MAX, 5170, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5171, 5171, UINT16_MAX, 5171, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5172, 5172, UINT16_MAX, 5172, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5173, 5173, UINT16_MAX, 5173, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5174, 5174, UINT16_MAX, 5174, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5175, 5175, UINT16_MAX, 5175, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5176, 5176, UINT16_MAX, 5176, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5177, 5177, UINT16_MAX, 5177, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5178, 5178, UINT16_MAX, 5178, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5179, 5179, UINT16_MAX, 5179, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5180, 5180, UINT16_MAX, 5180, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5181, 5181, UINT16_MAX, 5181, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5182, 5182, UINT16_MAX, 5182, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5183, 5183, UINT16_MAX, 5183, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5184, 5184, UINT16_MAX, 5184, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5185, 5185, UINT16_MAX, 5185, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5186, 5186, UINT16_MAX, 5186, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5187, 5187, UINT16_MAX, 5187, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5188, 5188, UINT16_MAX, 5188, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5189, 5189, UINT16_MAX, 5189, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5190, 5190, UINT16_MAX, 5190, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5191, 5191, UINT16_MAX, 5191, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5192, 5192, UINT16_MAX, 5192, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5193, 5193, UINT16_MAX, 5193, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5194, 5194, UINT16_MAX, 5194, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5195, 5195, UINT16_MAX, 5195, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5196, 5196, UINT16_MAX, 5196, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5197, 5197, UINT16_MAX, 5197, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5198, 5198, UINT16_MAX, 5198, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5199, 5199, UINT16_MAX, 5199, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5200, 5200, UINT16_MAX, 5200, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5201, 5201, UINT16_MAX, 5201, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5202, 5202, UINT16_MAX, 5202, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5203, 5203, UINT16_MAX, 5203, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5204, 5204, UINT16_MAX, 5204, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5205, 5205, UINT16_MAX, 5205, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5206, 5206, UINT16_MAX, 5206, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5207, 5207, UINT16_MAX, 5207, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5208, 5208, UINT16_MAX, 5208, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5209, 5209, UINT16_MAX, 5209, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5210, 5210, UINT16_MAX, 5210, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5211, 5211, UINT16_MAX, 5211, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5212, 5212, UINT16_MAX, 5212, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5213, 5213, UINT16_MAX, 5213, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5214, 5214, UINT16_MAX, 5214, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5215, 5215, UINT16_MAX, 5215, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5216, 5216, UINT16_MAX, 5216, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5217, 5217, UINT16_MAX, 5217, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5218, 5218, UINT16_MAX, 5218, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5219, 5219, UINT16_MAX, 5219, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 5220, 5220, UINT16_MAX, 5220, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_LV},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_LVT},
+  {UTF8PROC_CATEGORY_CS, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_CO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5221, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5222, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3584, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5223, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5224, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5225, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5227, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5228, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5229, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5230, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5231, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5232, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5233, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5234, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5235, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5236, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5237, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5238, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5239, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5240, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5241, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5242, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5243, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5244, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5245, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5246, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5247, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5248, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5249, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5251, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5252, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5253, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5254, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5256, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5258, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5260, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5262, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5274, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5276, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5278, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5280, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5281, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5282, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5290, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5291, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5292, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5293, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5294, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5296, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5297, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5298, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5300, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5301, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5302, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5304, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5306, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5309, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5310, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5311, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5312, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5313, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5314, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5315, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5316, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5317, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5318, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5319, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5320, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5321, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5322, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5323, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5324, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5325, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5326, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3586, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5327, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5328, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5329, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5330, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5331, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5332, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5333, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5334, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5335, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5336, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5337, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5338, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5339, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5340, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5341, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5342, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5343, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5344, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5345, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5346, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5347, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5348, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5349, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3444, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5350, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5351, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5352, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5353, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5354, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5356, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5357, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5359, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5360, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5361, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5362, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5363, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5365, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5366, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5368, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5369, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5371, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5372, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5374, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5375, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5376, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5377, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5378, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5379, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5380, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5381, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5382, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5383, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5384, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5385, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5386, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5387, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5388, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5389, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5390, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5391, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5392, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5393, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5394, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5395, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5396, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5397, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5398, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5399, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5400, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5401, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5402, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5403, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5404, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5405, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5406, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5407, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5408, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5409, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5410, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5411, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5412, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5413, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5414, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5415, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5416, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5417, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5418, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5419, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5420, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5421, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5422, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5424, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5425, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5431, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5434, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3591, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5442, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5443, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5444, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5445, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5447, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3542, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5476, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5477, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5484, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5486, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5487, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5495, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5498, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5502, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5504, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5506, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5508, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5512, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5516, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5518, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4175, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5519, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5520, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5521, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5522, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5523, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5524, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5525, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5526, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5527, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5528, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5529, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5530, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5531, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5533, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5534, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5535, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5536, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5537, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5538, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5539, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5540, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5541, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5542, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5543, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5544, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5548, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5579, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5580, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5581, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5582, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5583, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5584, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5585, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5586, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5587, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5588, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5589, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5590, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5591, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5593, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5594, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5595, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5596, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5597, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5598, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5599, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5600, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5601, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5602, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5603, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5604, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5605, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5606, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5609, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5611, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5614, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5615, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5621, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5630, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13826, 13826, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13828, 13828, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13830, 13830, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 22024, 22024, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 22027, 22027, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13838, 13840, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13840, 13840, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13842, 13842, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13844, 13844, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13846, 13846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13848, 13848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 13850, 13850, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13852, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 26, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 5664, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 2822, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 2825, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 5665, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 5666, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 5667, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 5668, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 5669, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 5670, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_FONT, 2782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13867, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13873, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13875, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13879, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13881, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13883, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13887, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13889, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13901, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13905, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13913, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13919, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13923, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 13925, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, 13927, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5737, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5737, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5738, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5738, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5738, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5738, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5741, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5741, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5741, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5741, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5744, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5744, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5744, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5744, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5748, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5748, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5748, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5748, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5750, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5750, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5751, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5751, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5752, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5752, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5753, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5753, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5754, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5754, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5756, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5756, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5756, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5756, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5762, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5762, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5765, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5765, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5768, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5768, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5771, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5774, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5774, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13969, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13969, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13971, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13971, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13973, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13973, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13975, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13975, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13977, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13977, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13979, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13979, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13981, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13981, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13981, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 5793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 5793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13986, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13988, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13990, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13992, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13994, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13996, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 13998, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14002, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14004, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14008, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14010, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14012, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14014, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14016, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14018, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14020, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14022, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14024, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14026, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14028, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14032, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14034, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14036, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14038, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14040, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14042, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14044, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14046, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14048, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14052, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14054, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14056, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14058, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14060, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14062, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14064, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14066, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14068, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14070, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14072, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14074, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14076, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14078, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14080, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14082, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14084, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14086, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14088, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14092, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14096, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14098, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14100, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14106, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14108, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14110, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14112, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14114, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14116, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14118, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14120, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14124, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14126, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14130, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14132, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14136, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14144, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14146, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14148, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14150, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14152, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14154, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14156, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14158, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14162, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14164, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14166, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14168, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22376, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22379, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13990, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 13992, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14002, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14004, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14012, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14014, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14016, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14020, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14022, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14024, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14082, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14084, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14092, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14106, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14108, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14116, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14118, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14120, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14214, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14216, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14218, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14220, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14144, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14222, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14224, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14162, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14164, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13986, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13988, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14228, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13990, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14230, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13994, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13996, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 13998, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14232, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14008, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14010, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14012, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14234, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14020, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14026, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14028, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14032, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14034, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14038, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14040, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14042, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14044, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14046, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14048, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14236, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14052, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14054, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14056, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14058, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14060, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14064, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14066, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14068, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14070, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14072, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14074, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14076, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14078, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14080, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14086, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14088, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14096, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14098, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14100, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14110, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14112, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14114, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14116, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14238, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14124, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14126, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14136, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14240, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14146, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14148, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14242, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14154, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14156, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14158, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14244, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 13990, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14230, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14232, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14012, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14234, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14020, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14246, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14046, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14248, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14252, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14116, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14240, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14244, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 22446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 22449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 22452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14281, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14291, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14293, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14297, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14301, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14309, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14311, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14313, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14315, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14281, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14291, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14293, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14297, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14301, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14309, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14311, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14313, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14315, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14248, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14252, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 14062, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14040, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14042, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14044, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14062, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14064, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14317, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14317, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22520, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22523, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22526, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22529, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22535, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22538, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22541, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22544, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22547, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22580, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22580, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22583, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22583, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22586, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22589, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22595, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22595, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22598, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22601, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22604, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22622, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22640, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22643, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22646, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22649, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22652, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22655, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22658, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22661, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22664, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22667, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22670, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22676, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22679, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22682, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22685, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22685, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22688, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22691, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22694, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22697, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22700, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22706, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22709, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22712, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22715, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22721, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22724, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22727, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22730, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22733, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22736, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22748, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22751, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22754, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 22562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 22790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 30991, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 30995, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 30999, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 31003, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 31007, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 31011, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 31015, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 22827, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 63790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 63809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 31050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6484, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6486, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6487, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 2785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 2786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6495, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6498, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 3046, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 3047, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6502, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 6504, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 6505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 6490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 6478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 2745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 6481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 2785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 2786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 6506, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6508, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, 2782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, 6509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 2784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6512, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 6513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 6514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 6515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14708, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14710, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14712, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14714, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14716, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14720, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14722, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14724, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14726, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14728, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14730, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14732, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 14734, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6544, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6547, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6547, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6548, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6548, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 5776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 5776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 6578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 6578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 6578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 6578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14771, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14771, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 14777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 14777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6587, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 6506, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 6513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 6514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6588, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 2785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 2786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6508, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, 2782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 6478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, 6509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 2745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 6589, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 2775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 38, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 31, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 32, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 2776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 2777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 2778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 2779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 2780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 2781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 6481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 2784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1446, 6590, UINT16_MAX, 6590, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1448, 6591, UINT16_MAX, 6591, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2795, 6592, UINT16_MAX, 6592, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1449, 6593, UINT16_MAX, 6593, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1450, 6594, UINT16_MAX, 6594, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2820, 6595, UINT16_MAX, 6595, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1452, 6596, UINT16_MAX, 6596, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1453, 6597, UINT16_MAX, 6597, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1454, 6598, UINT16_MAX, 6598, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1455, 6599, UINT16_MAX, 6599, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1456, 6600, UINT16_MAX, 6600, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1457, 6601, UINT16_MAX, 6601, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1458, 6602, UINT16_MAX, 6602, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1459, 6603, UINT16_MAX, 6603, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1460, 6604, UINT16_MAX, 6604, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1462, 6605, UINT16_MAX, 6605, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2809, 6606, UINT16_MAX, 6606, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1463, 6607, UINT16_MAX, 6607, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 3288, 6608, UINT16_MAX, 6608, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1464, 6609, UINT16_MAX, 6609, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1465, 6610, UINT16_MAX, 6610, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2891, 6611, UINT16_MAX, 6611, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1466, 6612, UINT16_MAX, 6612, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2908, 6613, UINT16_MAX, 6613, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 3295, 6614, UINT16_MAX, 6614, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2817, 6615, UINT16_MAX, 6615, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6512, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6504, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 2704, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 0, UINT16_MAX, 8992, UINT16_MAX, 8992, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1, UINT16_MAX, 8993, UINT16_MAX, 8993, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2, UINT16_MAX, 8994, UINT16_MAX, 8994, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 3, UINT16_MAX, 8995, UINT16_MAX, 8995, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 4, UINT16_MAX, 8996, UINT16_MAX, 8996, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 5, UINT16_MAX, 8997, UINT16_MAX, 8997, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 6, UINT16_MAX, 8998, UINT16_MAX, 8998, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 7, UINT16_MAX, 8999, UINT16_MAX, 8999, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 8, UINT16_MAX, 9000, UINT16_MAX, 9000, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 9, UINT16_MAX, 9001, UINT16_MAX, 9001, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 10, UINT16_MAX, 9002, UINT16_MAX, 9002, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 11, UINT16_MAX, 9003, UINT16_MAX, 9003, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 12, UINT16_MAX, 9004, UINT16_MAX, 9004, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 13, UINT16_MAX, 9005, UINT16_MAX, 9005, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 14, UINT16_MAX, 9006, UINT16_MAX, 9006, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 15, UINT16_MAX, 9007, UINT16_MAX, 9007, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 16, UINT16_MAX, 9008, UINT16_MAX, 9008, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 17, UINT16_MAX, 9009, UINT16_MAX, 9009, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 18, UINT16_MAX, 9010, UINT16_MAX, 9010, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 19, UINT16_MAX, 9011, UINT16_MAX, 9011, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 20, UINT16_MAX, 9012, UINT16_MAX, 9012, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 21, UINT16_MAX, 9013, UINT16_MAX, 9013, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 22, UINT16_MAX, 9014, UINT16_MAX, 9014, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 23, UINT16_MAX, 9015, UINT16_MAX, 9015, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 24, UINT16_MAX, 9016, UINT16_MAX, 9016, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 25, UINT16_MAX, 9017, UINT16_MAX, 9017, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6618, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6620, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6621, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4314, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6622, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6627, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6630, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4274, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4276, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4278, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4280, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4281, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4282, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4290, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4291, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4292, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4293, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4294, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4296, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4297, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4298, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4300, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4301, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4302, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4304, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4306, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4309, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4310, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 4311, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6635, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, true, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6636, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6639, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6640, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6641, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6642, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6643, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6644, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6645, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6646, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6647, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6648, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6649, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6650, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6651, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6652, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6653, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6654, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6655, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6656, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6657, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6658, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6659, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6660, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6661, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6662, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6663, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6664, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6665, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6666, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6667, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6668, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6669, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6670, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6671, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6672, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6675, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6676, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6678, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6679, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6680, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6681, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6682, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6683, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6684, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6685, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 6686, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 6687, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 6688, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6689, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6690, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 6691, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 6692, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 6693, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6694, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6695, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6696, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6697, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6698, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6699, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 6700, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_CONTROL},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6701, UINT16_MAX, 6701, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6703, UINT16_MAX, 6703, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6705, UINT16_MAX, 6705, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6707, UINT16_MAX, 6707, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6709, UINT16_MAX, 6709, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6711, UINT16_MAX, 6711, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6713, UINT16_MAX, 6713, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6715, UINT16_MAX, 6715, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6717, UINT16_MAX, 6717, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6719, UINT16_MAX, 6719, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6721, UINT16_MAX, 6721, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6723, UINT16_MAX, 6723, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6725, UINT16_MAX, 6725, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6727, UINT16_MAX, 6727, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6729, UINT16_MAX, 6729, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6731, UINT16_MAX, 6731, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6733, UINT16_MAX, 6733, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6735, UINT16_MAX, 6735, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6737, UINT16_MAX, 6737, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6739, UINT16_MAX, 6739, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6741, UINT16_MAX, 6741, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6743, UINT16_MAX, 6743, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6745, UINT16_MAX, 6745, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6747, UINT16_MAX, 6747, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6749, UINT16_MAX, 6749, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6751, UINT16_MAX, 6751, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6753, UINT16_MAX, 6753, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6755, UINT16_MAX, 6755, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6757, UINT16_MAX, 6757, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6759, UINT16_MAX, 6759, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6761, UINT16_MAX, 6761, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6763, UINT16_MAX, 6763, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6765, UINT16_MAX, 6765, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6767, UINT16_MAX, 6767, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6769, UINT16_MAX, 6769, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6771, UINT16_MAX, 6771, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6773, UINT16_MAX, 6773, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6775, UINT16_MAX, 6775, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6777, UINT16_MAX, 6777, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6779, UINT16_MAX, 6779, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9018, UINT16_MAX, 9018, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9020, UINT16_MAX, 9020, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9022, UINT16_MAX, 9022, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9024, UINT16_MAX, 9024, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9026, UINT16_MAX, 9026, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9028, UINT16_MAX, 9028, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9030, UINT16_MAX, 9030, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9032, UINT16_MAX, 9032, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9034, UINT16_MAX, 9034, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9036, UINT16_MAX, 9036, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9038, UINT16_MAX, 9038, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9040, UINT16_MAX, 9040, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9042, UINT16_MAX, 9042, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9044, UINT16_MAX, 9044, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9046, UINT16_MAX, 9046, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9048, UINT16_MAX, 9048, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9050, UINT16_MAX, 9050, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9052, UINT16_MAX, 9052, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9054, UINT16_MAX, 9054, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9056, UINT16_MAX, 9056, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9058, UINT16_MAX, 9058, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9060, UINT16_MAX, 9060, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9062, UINT16_MAX, 9062, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9064, UINT16_MAX, 9064, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9066, UINT16_MAX, 9066, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9068, UINT16_MAX, 9068, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9070, UINT16_MAX, 9070, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9072, UINT16_MAX, 9072, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9074, UINT16_MAX, 9074, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9076, UINT16_MAX, 9076, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9078, UINT16_MAX, 9078, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9080, UINT16_MAX, 9080, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9082, UINT16_MAX, 9082, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9084, UINT16_MAX, 9084, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9086, UINT16_MAX, 9086, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9088, UINT16_MAX, 9088, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9090, UINT16_MAX, 9090, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9092, UINT16_MAX, 9092, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9094, UINT16_MAX, 9094, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9096, UINT16_MAX, 9096, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6781, UINT16_MAX, 6781, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6783, UINT16_MAX, 6783, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6785, UINT16_MAX, 6785, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6787, UINT16_MAX, 6787, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6789, UINT16_MAX, 6789, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6791, UINT16_MAX, 6791, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6793, UINT16_MAX, 6793, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6795, UINT16_MAX, 6795, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6797, UINT16_MAX, 6797, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6799, UINT16_MAX, 6799, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6801, UINT16_MAX, 6801, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6803, UINT16_MAX, 6803, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6805, UINT16_MAX, 6805, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6807, UINT16_MAX, 6807, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6809, UINT16_MAX, 6809, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6811, UINT16_MAX, 6811, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6813, UINT16_MAX, 6813, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6815, UINT16_MAX, 6815, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6817, UINT16_MAX, 6817, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6819, UINT16_MAX, 6819, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6821, UINT16_MAX, 6821, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6823, UINT16_MAX, 6823, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6825, UINT16_MAX, 6825, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6827, UINT16_MAX, 6827, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6829, UINT16_MAX, 6829, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6831, UINT16_MAX, 6831, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6833, UINT16_MAX, 6833, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6835, UINT16_MAX, 6835, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6837, UINT16_MAX, 6837, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6839, UINT16_MAX, 6839, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6841, UINT16_MAX, 6841, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6843, UINT16_MAX, 6843, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6845, UINT16_MAX, 6845, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6847, UINT16_MAX, 6847, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6849, UINT16_MAX, 6849, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6851, UINT16_MAX, 6851, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9098, UINT16_MAX, 9098, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9100, UINT16_MAX, 9100, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9102, UINT16_MAX, 9102, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9104, UINT16_MAX, 9104, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9106, UINT16_MAX, 9106, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9108, UINT16_MAX, 9108, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9110, UINT16_MAX, 9110, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9112, UINT16_MAX, 9112, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9114, UINT16_MAX, 9114, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9116, UINT16_MAX, 9116, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9118, UINT16_MAX, 9118, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9120, UINT16_MAX, 9120, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9122, UINT16_MAX, 9122, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9124, UINT16_MAX, 9124, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9126, UINT16_MAX, 9126, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9128, UINT16_MAX, 9128, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9130, UINT16_MAX, 9130, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9132, UINT16_MAX, 9132, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9134, UINT16_MAX, 9134, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9136, UINT16_MAX, 9136, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9138, UINT16_MAX, 9138, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9140, UINT16_MAX, 9140, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9142, UINT16_MAX, 9142, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9144, UINT16_MAX, 9144, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9146, UINT16_MAX, 9146, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9148, UINT16_MAX, 9148, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9150, UINT16_MAX, 9150, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9152, UINT16_MAX, 9152, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9154, UINT16_MAX, 9154, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9156, UINT16_MAX, 9156, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9158, UINT16_MAX, 9158, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9160, UINT16_MAX, 9160, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9162, UINT16_MAX, 9162, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9164, UINT16_MAX, 9164, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9166, UINT16_MAX, 9166, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9168, UINT16_MAX, 9168, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6853, UINT16_MAX, 6853, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6855, UINT16_MAX, 6855, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6857, UINT16_MAX, 6857, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6859, UINT16_MAX, 6859, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6861, UINT16_MAX, 6861, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6863, UINT16_MAX, 6863, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6865, UINT16_MAX, 6865, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6867, UINT16_MAX, 6867, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6869, UINT16_MAX, 6869, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6871, UINT16_MAX, 6871, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6873, UINT16_MAX, 6873, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6875, UINT16_MAX, 6875, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6877, UINT16_MAX, 6877, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6879, UINT16_MAX, 6879, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6881, UINT16_MAX, 6881, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6883, UINT16_MAX, 6883, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6885, UINT16_MAX, 6885, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6887, UINT16_MAX, 6887, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6889, UINT16_MAX, 6889, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6891, UINT16_MAX, 6891, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6893, UINT16_MAX, 6893, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6895, UINT16_MAX, 6895, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6897, UINT16_MAX, 6897, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6899, UINT16_MAX, 6899, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6901, UINT16_MAX, 6901, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6903, UINT16_MAX, 6903, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6905, UINT16_MAX, 6905, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6907, UINT16_MAX, 6907, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6909, UINT16_MAX, 6909, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6911, UINT16_MAX, 6911, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6913, UINT16_MAX, 6913, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6915, UINT16_MAX, 6915, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6917, UINT16_MAX, 6917, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6919, UINT16_MAX, 6919, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6921, UINT16_MAX, 6921, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6923, UINT16_MAX, 6923, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6925, UINT16_MAX, 6925, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6927, UINT16_MAX, 6927, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6929, UINT16_MAX, 6929, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6931, UINT16_MAX, 6931, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6933, UINT16_MAX, 6933, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6935, UINT16_MAX, 6935, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6937, UINT16_MAX, 6937, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6939, UINT16_MAX, 6939, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6941, UINT16_MAX, 6941, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6943, UINT16_MAX, 6943, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6945, UINT16_MAX, 6945, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6947, UINT16_MAX, 6947, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6949, UINT16_MAX, 6949, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6951, UINT16_MAX, 6951, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 6953, UINT16_MAX, 6953, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9170, UINT16_MAX, 9170, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9172, UINT16_MAX, 9172, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9174, UINT16_MAX, 9174, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9176, UINT16_MAX, 9176, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9178, UINT16_MAX, 9178, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9180, UINT16_MAX, 9180, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9182, UINT16_MAX, 9182, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9184, UINT16_MAX, 9184, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9186, UINT16_MAX, 9186, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9188, UINT16_MAX, 9188, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9190, UINT16_MAX, 9190, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9192, UINT16_MAX, 9192, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9194, UINT16_MAX, 9194, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9196, UINT16_MAX, 9196, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9198, UINT16_MAX, 9198, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9200, UINT16_MAX, 9200, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9202, UINT16_MAX, 9202, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9204, UINT16_MAX, 9204, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9206, UINT16_MAX, 9206, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9208, UINT16_MAX, 9208, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9210, UINT16_MAX, 9210, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9212, UINT16_MAX, 9212, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9214, UINT16_MAX, 9214, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9216, UINT16_MAX, 9216, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9218, UINT16_MAX, 9218, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9220, UINT16_MAX, 9220, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9222, UINT16_MAX, 9222, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9224, UINT16_MAX, 9224, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9226, UINT16_MAX, 9226, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9228, UINT16_MAX, 9228, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9230, UINT16_MAX, 9230, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9232, UINT16_MAX, 9232, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9234, UINT16_MAX, 9234, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9236, UINT16_MAX, 9236, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9238, UINT16_MAX, 9238, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9240, UINT16_MAX, 9240, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9242, UINT16_MAX, 9242, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9244, UINT16_MAX, 9244, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9246, UINT16_MAX, 9246, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9248, UINT16_MAX, 9248, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9250, UINT16_MAX, 9250, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9252, UINT16_MAX, 9252, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9254, UINT16_MAX, 9254, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9256, UINT16_MAX, 9256, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9258, UINT16_MAX, 9258, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9260, UINT16_MAX, 9260, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9262, UINT16_MAX, 9262, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9264, UINT16_MAX, 9264, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9266, UINT16_MAX, 9266, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9268, UINT16_MAX, 9268, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9270, UINT16_MAX, 9270, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_AN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_AN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5328, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15147, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5332, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15151, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5336, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15155, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49206, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, true, 0, 0, UTF8PROC_BOUNDCLASS_PREPEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49208, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 15159, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 15163, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5340, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5344, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49210, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5348, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 15167, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 15171, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49212, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49216, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5354, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49214, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 15175, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 15179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49218, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 15183, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49220, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5362, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5366, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 15187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 15191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7003, UINT16_MAX, 7003, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7005, UINT16_MAX, 7005, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7007, UINT16_MAX, 7007, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7009, UINT16_MAX, 7009, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7011, UINT16_MAX, 7011, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7013, UINT16_MAX, 7013, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7015, UINT16_MAX, 7015, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7017, UINT16_MAX, 7017, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7019, UINT16_MAX, 7019, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7021, UINT16_MAX, 7021, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7023, UINT16_MAX, 7023, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7025, UINT16_MAX, 7025, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7027, UINT16_MAX, 7027, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7029, UINT16_MAX, 7029, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7031, UINT16_MAX, 7031, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7033, UINT16_MAX, 7033, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7035, UINT16_MAX, 7035, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7037, UINT16_MAX, 7037, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7039, UINT16_MAX, 7039, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7041, UINT16_MAX, 7041, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7043, UINT16_MAX, 7043, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7045, UINT16_MAX, 7045, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7047, UINT16_MAX, 7047, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7049, UINT16_MAX, 7049, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7051, UINT16_MAX, 7051, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7053, UINT16_MAX, 7053, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7055, UINT16_MAX, 7055, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7057, UINT16_MAX, 7057, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7059, UINT16_MAX, 7059, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7061, UINT16_MAX, 7061, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7063, UINT16_MAX, 7063, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 7065, UINT16_MAX, 7065, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9272, UINT16_MAX, 9272, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9274, UINT16_MAX, 9274, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9276, UINT16_MAX, 9276, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9278, UINT16_MAX, 9278, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9280, UINT16_MAX, 9280, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9282, UINT16_MAX, 9282, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9284, UINT16_MAX, 9284, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9286, UINT16_MAX, 9286, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9288, UINT16_MAX, 9288, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9290, UINT16_MAX, 9290, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9292, UINT16_MAX, 9292, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9294, UINT16_MAX, 9294, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9296, UINT16_MAX, 9296, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9298, UINT16_MAX, 9298, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9300, UINT16_MAX, 9300, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9302, UINT16_MAX, 9302, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9304, UINT16_MAX, 9304, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9306, UINT16_MAX, 9306, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9308, UINT16_MAX, 9308, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9310, UINT16_MAX, 9310, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9312, UINT16_MAX, 9312, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9314, UINT16_MAX, 9314, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9316, UINT16_MAX, 9316, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9318, UINT16_MAX, 9318, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9320, UINT16_MAX, 9320, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9322, UINT16_MAX, 9322, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9324, UINT16_MAX, 9324, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9326, UINT16_MAX, 9326, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9328, UINT16_MAX, 9328, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9330, UINT16_MAX, 9330, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9332, UINT16_MAX, 9332, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9334, UINT16_MAX, 9334, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5370, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5374, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5378, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49222, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 226, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK},
+  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49224, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49226, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49228, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49230, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 49232, false, false, false, false, 0, 0, UTF8PROC_BOUNDCLASS_EXTEND},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5390, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5394, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5398, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15291, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 5404, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 15307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, true, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2908, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2908, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7119, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7120, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7121, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7123, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7124, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7125, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7126, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7127, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7129, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7130, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7131, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7132, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7133, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2830, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7135, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7136, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7137, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7139, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 849, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 850, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 852, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 807, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 855, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 858, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 860, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 862, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, 7141, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7143, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7144, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7146, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7147, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7121, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2829, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7123, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7124, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7125, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7126, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7127, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7129, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7130, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7131, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7132, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7133, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7135, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7136, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7137, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7139, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 849, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 850, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 852, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 807, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 855, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 860, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 862, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, 7141, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, true, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7144, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7146, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7147, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7143, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7148, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 904, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 2781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7149, UINT16_MAX, 7149, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7151, UINT16_MAX, 7151, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7153, UINT16_MAX, 7153, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7155, UINT16_MAX, 7155, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7157, UINT16_MAX, 7157, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7159, UINT16_MAX, 7159, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7161, UINT16_MAX, 7161, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7163, UINT16_MAX, 7163, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7165, UINT16_MAX, 7165, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7167, UINT16_MAX, 7167, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7169, UINT16_MAX, 7169, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7171, UINT16_MAX, 7171, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7173, UINT16_MAX, 7173, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7175, UINT16_MAX, 7175, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7177, UINT16_MAX, 7177, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7179, UINT16_MAX, 7179, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7181, UINT16_MAX, 7181, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7183, UINT16_MAX, 7183, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7185, UINT16_MAX, 7185, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7187, UINT16_MAX, 7187, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7189, UINT16_MAX, 7189, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7191, UINT16_MAX, 7191, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7193, UINT16_MAX, 7193, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7195, UINT16_MAX, 7195, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7197, UINT16_MAX, 7197, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7199, UINT16_MAX, 7199, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7201, UINT16_MAX, 7201, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7203, UINT16_MAX, 7203, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7205, UINT16_MAX, 7205, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7207, UINT16_MAX, 7207, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7209, UINT16_MAX, 7209, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7211, UINT16_MAX, 7211, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7213, UINT16_MAX, 7213, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 7215, UINT16_MAX, 7215, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9336, UINT16_MAX, 9336, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9338, UINT16_MAX, 9338, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9340, UINT16_MAX, 9340, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9342, UINT16_MAX, 9342, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9344, UINT16_MAX, 9344, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9346, UINT16_MAX, 9346, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9348, UINT16_MAX, 9348, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9350, UINT16_MAX, 9350, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9352, UINT16_MAX, 9352, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9354, UINT16_MAX, 9354, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9356, UINT16_MAX, 9356, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9358, UINT16_MAX, 9358, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9360, UINT16_MAX, 9360, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9362, UINT16_MAX, 9362, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9364, UINT16_MAX, 9364, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9366, UINT16_MAX, 9366, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9368, UINT16_MAX, 9368, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9370, UINT16_MAX, 9370, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9372, UINT16_MAX, 9372, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9374, UINT16_MAX, 9374, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9376, UINT16_MAX, 9376, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9378, UINT16_MAX, 9378, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9380, UINT16_MAX, 9380, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9382, UINT16_MAX, 9382, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9384, UINT16_MAX, 9384, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9386, UINT16_MAX, 9386, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9388, UINT16_MAX, 9388, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9390, UINT16_MAX, 9390, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9392, UINT16_MAX, 9392, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9394, UINT16_MAX, 9394, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9396, UINT16_MAX, 9396, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9398, UINT16_MAX, 9398, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9400, UINT16_MAX, 9400, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9402, UINT16_MAX, 9402, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 7217, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 5760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 7218, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 7219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 1, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 6569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15412, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15414, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15416, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15418, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15420, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15422, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15424, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 15432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23635, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23641, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23644, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23647, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23650, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23653, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23656, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23659, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23662, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23665, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23668, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23671, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23680, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23683, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23686, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23689, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23692, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23695, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23698, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23701, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23704, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 2795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 1463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 15515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 15517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 2795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 2820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 2809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 2891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 1466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 2908, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 2817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 15519, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 15521, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 15523, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 23717, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 15528, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 15530, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 15532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 15534, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 15536, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 15538, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4278, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7348, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7349, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7350, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7351, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7352, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7353, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7354, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5399, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7356, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7357, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7359, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7360, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7361, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3525, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7362, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7363, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7365, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7366, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7368, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7369, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3581, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7371, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7372, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7374, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 3499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7375, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7376, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7377, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7378, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 7406, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 7407, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_E_MODIFIER},
+  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_E_BASE_GAZ},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7408, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7409, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7410, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7411, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7413, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7414, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7415, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7416, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7417, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7418, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7419, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7420, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7422, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7424, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7425, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7431, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7434, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3442, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7376, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7442, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7443, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7444, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7445, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7447, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7476, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7477, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7483, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7484, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7485, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7487, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7351, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7498, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7502, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7504, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7508, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7512, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7516, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7518, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7519, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7521, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7522, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7524, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7525, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7526, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7527, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7528, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7529, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7530, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7531, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7533, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7534, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7535, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7537, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7538, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7539, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7540, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7541, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7543, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7547, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7548, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7555, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7556, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7557, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7580, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7581, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7582, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7583, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7584, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7585, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7587, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7588, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7589, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7590, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7591, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7593, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7594, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7595, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7596, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7597, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7599, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7600, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7601, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7602, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7603, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7604, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7605, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7606, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7609, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7611, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7614, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7618, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7620, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7622, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7627, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7636, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7639, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7640, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7641, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7643, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7645, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7647, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7648, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7650, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7651, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7652, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7653, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7654, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7655, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7656, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7657, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7658, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7660, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7661, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7662, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7663, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7664, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7665, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7667, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7668, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7669, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7671, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7675, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7676, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7678, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7679, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7680, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7681, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7683, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7684, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7686, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7687, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7689, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7690, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7691, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7693, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7694, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7695, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7697, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7699, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7700, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7701, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7702, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7704, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7705, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7706, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7707, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7708, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7709, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7710, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7712, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7713, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7715, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7717, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7720, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7722, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7724, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7725, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7726, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7728, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7730, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7732, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7734, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7735, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7736, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7737, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7738, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7741, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7750, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7751, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7752, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7753, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7762, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7768, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7771, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7774, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7783, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7789, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7791, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7798, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7799, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7801, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7802, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7803, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7804, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7805, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7806, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7807, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7811, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7813, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7815, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7816, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7819, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7821, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7822, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7823, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7824, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7825, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7826, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7828, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7829, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7830, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7831, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7832, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7833, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7834, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7835, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7836, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7837, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7838, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7840, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7842, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7844, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7850, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7855, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7860, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7862, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7867, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7868, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7870, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7872, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7873, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7874, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7875, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7879, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7880, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7881, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7882, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7886, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7887, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7888, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7889, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7892, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7894, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7901, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7904, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7905, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7912, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7918, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7919, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7920, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7923, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7924, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7925, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7926, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7928, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7929, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7930, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7931, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7932, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7936, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7942, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7944, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7945, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7947, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7948, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7949, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7950, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7951, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7952, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7953, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7954, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7956, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7958, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7960, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7961, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7963, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7964, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7966, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7968, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7970, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7971, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7972, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7973, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7974, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 3634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7975, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, false, false, false, false, 2, 0, UTF8PROC_BOUNDCLASS_OTHER},
+};
+
+const nc_utf8proc_uint16_t nc_utf8proc_combinations[] = {
+  0, 46, 192, 193, 194, 195, 196, 197, 0, 
+  256, 258, 260, 550, 461, 0, 0, 512, 
+  514, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7680, 7840, 0, 0, 0, 0, 0, 7842, 
+1, 11, 
+  262, 264, 0, 0, 0, 199, 0, 0, 
+  0, 266, 268, 
+0, 46, 200, 201, 202, 7868, 203, 
+  0, 552, 274, 276, 280, 278, 282, 0, 
+  0, 516, 518, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7864, 0, 7704, 7706, 0, 
+  0, 7866, 
+0, 46, 204, 205, 206, 296, 207, 0, 
+  0, 298, 300, 302, 304, 463, 0, 0, 
+  520, 522, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7882, 0, 0, 7724, 0, 0, 
+  7880, 
+0, 42, 504, 323, 0, 209, 0, 0, 325, 
+  0, 0, 0, 7748, 327, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7750, 7752, 7754, 
+0, 46, 210, 211, 212, 213, 
+  214, 0, 0, 332, 334, 490, 558, 465, 
+  336, 416, 524, 526, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 7884, 0, 0, 0, 
+  0, 0, 7886, 
+0, 46, 217, 218, 219, 360, 220, 
+  366, 0, 362, 364, 370, 0, 467, 368, 
+  431, 532, 534, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7908, 0, 7798, 7796, 0, 
+  7794, 7910, 
+0, 46, 7922, 221, 374, 7928, 376, 0, 
+  0, 562, 0, 0, 7822, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7924, 0, 0, 0, 0, 0, 
+  7926, 
+0, 46, 224, 225, 226, 227, 228, 229, 0, 
+  257, 259, 261, 551, 462, 0, 0, 513, 
+  515, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7681, 7841, 0, 0, 0, 0, 0, 7843, 
+1, 11, 
+  263, 265, 0, 0, 0, 231, 0, 0, 
+  0, 267, 269, 
+0, 46, 232, 233, 234, 7869, 235, 
+  0, 553, 275, 277, 281, 279, 283, 0, 
+  0, 517, 519, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7865, 0, 7705, 7707, 0, 
+  0, 7867, 
+0, 46, 236, 237, 238, 297, 239, 0, 
+  0, 299, 301, 303, 0, 464, 0, 0, 
+  521, 523, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7883, 0, 0, 7725, 0, 0, 
+  7881, 
+0, 42, 505, 324, 0, 241, 0, 0, 326, 
+  0, 0, 0, 7749, 328, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7751, 7753, 7755, 
+0, 46, 242, 243, 244, 245, 
+  246, 0, 0, 333, 335, 491, 559, 466, 
+  337, 417, 525, 527, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 7885, 0, 0, 0, 
+  0, 0, 7887, 
+0, 46, 249, 250, 251, 361, 252, 
+  367, 0, 363, 365, 371, 0, 468, 369, 
+  432, 533, 535, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7909, 0, 7799, 7797, 0, 
+  7795, 7911, 
+0, 46, 7923, 253, 375, 7929, 255, 7833, 
+  0, 563, 0, 0, 7823, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7925, 0, 0, 0, 0, 0, 
+  7927, 
+6, 42, 7696, 0, 0, 0, 7690, 270, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7692, 7694, 7698, 
+6, 42, 7697, 0, 
+  0, 0, 7691, 271, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7693, 7695, 7699, 
+1, 11, 500, 284, 0, 0, 0, 
+  290, 7712, 286, 0, 288, 486, 
+1, 11, 501, 285, 
+  0, 0, 0, 291, 7713, 287, 0, 289, 
+  487, 
+2, 44, 292, 0, 7718, 0, 7720, 0, 0, 
+  0, 7714, 542, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7716, 
+  0, 0, 0, 7722, 
+2, 44, 293, 0, 7719, 0, 
+  7721, 0, 0, 0, 7715, 543, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7717, 7830, 0, 0, 7723, 
+2, 2, 308, 
+2, 11, 
+  309, 0, 0, 0, 0, 0, 0, 0, 
+  0, 496, 
+1, 41, 7728, 0, 0, 0, 0, 310, 
+  0, 0, 0, 0, 488, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7730, 7732, 
+1, 41, 7729, 0, 0, 0, 0, 
+  311, 0, 0, 0, 0, 489, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7731, 7733, 
+1, 42, 313, 0, 0, 0, 
+  0, 315, 0, 0, 0, 0, 317, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7734, 7738, 7740, 
+1, 42, 314, 0, 
+  0, 0, 0, 316, 0, 0, 0, 0, 
+  318, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 7735, 7739, 7741, 
+1, 41, 
+  340, 0, 0, 0, 0, 342, 0, 0, 
+  0, 7768, 344, 0, 0, 528, 530, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7770, 
+  7774, 
+1, 41, 341, 0, 0, 0, 0, 343, 0, 
+  0, 0, 7769, 345, 0, 0, 529, 531, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7771, 7775, 
+1, 40, 346, 348, 0, 0, 0, 350, 
+  0, 0, 0, 7776, 352, 0, 0, 0, 
+  0, 536, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7778, 
+1, 40, 347, 349, 0, 0, 0, 351, 
+  0, 0, 0, 7777, 353, 0, 0, 0, 
+  0, 537, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7779, 
+6, 42, 354, 0, 0, 0, 7786, 356, 
+  0, 0, 0, 0, 538, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 7788, 7790, 7792, 
+4, 42, 7831, 
+  0, 355, 0, 0, 0, 7787, 357, 0, 
+  0, 0, 0, 539, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7789, 7791, 7793, 
+0, 40, 7808, 7810, 
+  372, 0, 7812, 0, 0, 0, 0, 0, 
+  7814, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7816, 
+0, 40, 7809, 
+  7811, 373, 0, 7813, 7832, 0, 0, 0, 
+  0, 7815, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7817, 
+1, 41, 
+  377, 7824, 0, 0, 0, 0, 0, 0, 
+  0, 379, 381, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7826, 
+  7828, 
+1, 41, 378, 7825, 0, 0, 0, 0, 0, 
+  0, 0, 380, 382, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7827, 7829, 
+0, 11, 475, 471, 0, 0, 0, 0, 
+  0, 469, 0, 0, 0, 473, 
+0, 11, 476, 472, 
+  0, 0, 0, 0, 0, 470, 0, 0, 
+  0, 474, 
+7, 7, 478, 
+7, 7, 479, 
+7, 7, 480, 
+7, 7, 481, 
+1, 7, 508, 0, 
+  0, 0, 0, 0, 482, 
+1, 7, 509, 0, 0, 
+  0, 0, 0, 483, 
+7, 7, 492, 
+7, 7, 493, 
+11, 11, 494, 
+11, 11, 495, 
+1, 1, 
+  506, 
+1, 1, 507, 
+1, 1, 510, 
+1, 1, 511, 
+7, 7, 554, 
+7, 7, 555, 
+1, 7, 7756, 0, 
+  0, 7758, 0, 0, 556, 
+1, 7, 7757, 0, 0, 
+  7759, 0, 0, 557, 
+7, 7, 560, 
+7, 7, 561, 
+0, 49, 8173, 901, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 8129, 
+0, 50, 
+  8122, 902, 0, 0, 0, 0, 0, 8121, 
+  8120, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7944, 
+  7945, 0, 8124, 
+0, 48, 8136, 904, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7960, 7961, 
+0, 50, 8138, 905, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7976, 7977, 0, 8140, 
+0, 48, 8154, 
+  906, 0, 0, 938, 0, 0, 8153, 8152, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7992, 7993, 
+0, 48, 
+  8184, 908, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 8008, 
+  8009, 
+0, 48, 8170, 910, 0, 0, 939, 0, 0, 
+  8169, 8168, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 8025, 
+0, 50, 8186, 911, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 8040, 8041, 0, 8188, 
+0, 49, 8146, 912, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 8151, 
+0, 50, 8048, 
+  940, 0, 0, 0, 0, 0, 8113, 8112, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7936, 7937, 
+  8118, 8115, 
+0, 48, 8050, 941, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7952, 7953, 
+0, 50, 8052, 942, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7968, 7969, 8134, 8131, 
+0, 49, 8054, 943, 
+  0, 0, 970, 0, 0, 8145, 8144, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 7984, 7985, 8150, 
+0, 49, 
+  8162, 944, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 8167, 
+0, 49, 8058, 973, 0, 0, 971, 0, 
+  0, 8161, 8160, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 8016, 8017, 8166, 
+0, 48, 8056, 972, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 8000, 8001, 
+0, 50, 8060, 974, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 8032, 8033, 8182, 8179, 
+1, 4, 
+  979, 0, 0, 980, 
+0, 8, 1024, 0, 0, 0, 
+  1025, 0, 0, 0, 1238, 
+1, 1, 1027, 
+4, 4, 1031, 
+1, 1, 1036, 
+0, 8, 
+  1037, 0, 0, 0, 1252, 0, 0, 1250, 
+  1049, 
+4, 12, 1264, 0, 0, 1262, 1038, 0, 0, 
+  0, 1266, 
+0, 8, 1117, 0, 0, 0, 1253, 0, 
+  0, 1251, 1081, 
+0, 8, 1104, 0, 0, 0, 1105, 
+  0, 0, 0, 1239, 
+1, 1, 1107, 
+4, 4, 1111, 
+1, 1, 1116, 
+4, 12, 1265, 
+  0, 0, 1263, 1118, 0, 0, 0, 1267, 
+14, 14, 
+  1142, 
+14, 14, 1143, 
+4, 8, 1244, 0, 0, 0, 1217, 
+4, 8, 1245, 
+  0, 0, 0, 1218, 
+4, 8, 1234, 0, 0, 0, 
+  1232, 
+4, 8, 1235, 0, 0, 0, 1233, 
+4, 4, 1242, 
+4, 4, 1243, 
+4, 4, 
+  1246, 
+4, 4, 1247, 
+4, 4, 1254, 
+4, 4, 1255, 
+4, 4, 1258, 
+4, 4, 1259, 
+4, 4, 1260, 
+4, 4, 1261, 
+4, 4, 
+  1268, 
+4, 4, 1269, 
+4, 4, 1272, 
+4, 4, 1273, 
+17, 19, 1570, 1571, 1573, 
+18, 18, 1572, 
+18, 18, 
+  1574, 
+18, 18, 1728, 
+18, 18, 1730, 
+18, 18, 1747, 
+20, 20, 2345, 
+20, 20, 2353, 
+20, 20, 2356, 
+21, 22, 2507, 
+  2508, 
+23, 25, 2888, 2891, 2892, 
+26, 26, 2964, 
+26, 27, 3020, 3018, 
+27, 27, 3019, 
+28, 28, 
+  3144, 
+29, 29, 3264, 
+29, 31, 3271, 3272, 3274, 
+29, 29, 3275, 
+32, 33, 3402, 3404, 
+32, 32, 
+  3403, 
+34, 36, 3546, 3548, 3550, 
+34, 34, 3549, 
+37, 37, 4134, 
+38, 38, 6918, 
+38, 38, 6920, 
+38, 38, 
+  6922, 
+38, 38, 6924, 
+38, 38, 6926, 
+38, 38, 6930, 
+38, 38, 6971, 
+38, 38, 6973, 
+38, 38, 6976, 
+38, 38, 6977, 
+38, 38, 
+  6979, 
+10, 41, 7682, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7684, 
+  7686, 
+10, 41, 7683, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7685, 
+  7687, 
+1, 1, 7688, 
+1, 1, 7689, 
+0, 1, 7700, 7702, 
+0, 1, 7701, 7703, 
+8, 8, 7708, 
+8, 8, 
+  7709, 
+10, 10, 7710, 
+10, 10, 7711, 
+1, 1, 7726, 
+1, 1, 7727, 
+7, 7, 7736, 
+7, 7, 7737, 
+1, 40, 7742, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7744, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7746, 
+1, 40, 7743, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7745, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7747, 
+0, 1, 7760, 
+  7762, 
+0, 1, 7761, 7763, 
+1, 10, 7764, 0, 0, 0, 0, 
+  0, 0, 0, 0, 7766, 
+1, 10, 7765, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7767, 
+7, 7, 7772, 
+7, 7, 
+  7773, 
+10, 10, 7780, 
+10, 10, 7781, 
+10, 10, 7782, 
+10, 10, 7783, 
+10, 10, 7784, 
+10, 10, 7785, 
+1, 1, 7800, 
+1, 1, 
+  7801, 
+4, 4, 7802, 
+4, 4, 7803, 
+3, 40, 7804, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7806, 
+3, 40, 7805, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7807, 
+4, 10, 7820, 
+  0, 0, 0, 0, 0, 7818, 
+4, 10, 7821, 0, 
+  0, 0, 0, 0, 7819, 
+10, 10, 7835, 
+0, 46, 7846, 7844, 
+  0, 7850, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 7848, 
+0, 46, 7847, 7845, 0, 
+  7851, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7849, 
+2, 8, 7852, 0, 0, 0, 
+  0, 0, 7862, 
+2, 8, 7853, 0, 0, 0, 0, 
+  0, 7863, 
+0, 46, 7856, 7854, 0, 7860, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7858, 
+0, 46, 7857, 7855, 0, 7861, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7859, 
+0, 46, 
+  7872, 7870, 0, 7876, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7874, 
+0, 46, 7873, 
+  7871, 0, 7877, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 7875, 
+2, 2, 7878, 
+2, 2, 7879, 
+0, 46, 
+  7890, 7888, 0, 7894, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7892, 
+0, 46, 7891, 
+  7889, 0, 7895, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 7893, 
+2, 2, 7896, 
+2, 2, 7897, 
+0, 46, 
+  7900, 7898, 0, 7904, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7906, 0, 0, 0, 0, 0, 7902, 
+0, 46, 7901, 
+  7899, 0, 7905, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7907, 
+  0, 0, 0, 0, 0, 7903, 
+0, 46, 7914, 7912, 
+  0, 7918, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7920, 0, 
+  0, 0, 0, 0, 7916, 
+0, 46, 7915, 7913, 0, 
+  7919, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 7921, 0, 0, 
+  0, 0, 0, 7917, 
+0, 50, 7938, 7940, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 7942, 8064, 
+0, 50, 7939, 
+  7941, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  7943, 8065, 
+0, 50, 7946, 7948, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7950, 8072, 
+0, 50, 7947, 7949, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 7951, 8073, 
+0, 1, 
+  7954, 7956, 
+0, 1, 7955, 7957, 
+0, 1, 7962, 7964, 
+0, 1, 7963, 7965, 
+0, 50, 
+  7970, 7972, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7974, 8080, 
+0, 50, 7971, 7973, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 7975, 8081, 
+0, 50, 7978, 7980, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7982, 
+  8088, 
+0, 50, 7979, 7981, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 7983, 8089, 
+0, 49, 7986, 7988, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 7990, 
+0, 49, 7987, 7989, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 7991, 
+0, 49, 
+  7994, 7996, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 7998, 
+0, 49, 7995, 7997, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 7999, 
+0, 1, 8002, 8004, 
+0, 1, 8003, 8005, 
+0, 1, 
+  8010, 8012, 
+0, 1, 8011, 8013, 
+0, 49, 8018, 8020, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 8022, 
+0, 49, 8019, 8021, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 8023, 
+0, 49, 
+  8027, 8029, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 8031, 
+0, 50, 8034, 8036, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 8038, 8096, 
+0, 50, 8035, 8037, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 8039, 8097, 
+0, 50, 
+  8042, 8044, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 8046, 8104, 
+0, 50, 8043, 8045, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 8047, 8105, 
+50, 50, 8066, 
+50, 50, 8067, 
+50, 50, 
+  8068, 
+50, 50, 8069, 
+50, 50, 8070, 
+50, 50, 8071, 
+50, 50, 8074, 
+50, 50, 8075, 
+50, 50, 8076, 
+50, 50, 8077, 
+50, 50, 
+  8078, 
+50, 50, 8079, 
+50, 50, 8082, 
+50, 50, 8083, 
+50, 50, 8084, 
+50, 50, 8085, 
+50, 50, 8086, 
+50, 50, 8087, 
+50, 50, 
+  8090, 
+50, 50, 8091, 
+50, 50, 8092, 
+50, 50, 8093, 
+50, 50, 8094, 
+50, 50, 8095, 
+50, 50, 8098, 
+50, 50, 8099, 
+50, 50, 
+  8100, 
+50, 50, 8101, 
+50, 50, 8102, 
+50, 50, 8103, 
+50, 50, 8106, 
+50, 50, 8107, 
+50, 50, 8108, 
+50, 50, 8109, 
+50, 50, 
+  8110, 
+50, 50, 8111, 
+50, 50, 8114, 
+50, 50, 8116, 
+50, 50, 8119, 
+50, 50, 8130, 
+50, 50, 8132, 
+50, 50, 8135, 
+0, 49, 
+  8141, 8142, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 8143, 
+0, 49, 8157, 8158, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 0, 8159, 
+47, 48, 8164, 8165, 
+48, 48, 8172, 
+50, 50, 8178, 
+50, 50, 
+  8180, 
+50, 50, 8183, 
+51, 51, 8602, 
+51, 51, 8603, 
+51, 51, 8622, 
+51, 51, 8653, 
+51, 51, 8654, 
+51, 51, 8655, 
+51, 51, 
+  8708, 
+51, 51, 8713, 
+51, 51, 8716, 
+51, 51, 8740, 
+51, 51, 8742, 
+51, 51, 8769, 
+51, 51, 8772, 
+51, 51, 8775, 
+51, 51, 
+  8777, 
+51, 51, 8800, 
+51, 51, 8802, 
+51, 51, 8813, 
+51, 51, 8814, 
+51, 51, 8815, 
+51, 51, 8816, 
+51, 51, 8817, 
+51, 51, 
+  8820, 
+51, 51, 8821, 
+51, 51, 8824, 
+51, 51, 8825, 
+51, 51, 8832, 
+51, 51, 8833, 
+51, 51, 8836, 
+51, 51, 8837, 
+51, 51, 
+  8840, 
+51, 51, 8841, 
+51, 51, 8876, 
+51, 51, 8877, 
+51, 51, 8878, 
+51, 51, 8879, 
+51, 51, 8928, 
+51, 51, 8929, 
+51, 51, 
+  8930, 
+51, 51, 8931, 
+51, 51, 8938, 
+51, 51, 8939, 
+51, 51, 8940, 
+51, 51, 8941, 
+51, 51, 10972, 
+52, 52, 12364, 
+52, 52, 
+  12366, 
+52, 52, 12368, 
+52, 52, 12370, 
+52, 52, 12372, 
+52, 52, 12374, 
+52, 52, 12376, 
+52, 52, 12378, 
+52, 52, 12380, 
+52, 52, 
+  12382, 
+52, 52, 12384, 
+52, 52, 12386, 
+52, 52, 12389, 
+52, 52, 12391, 
+52, 52, 12393, 
+52, 53, 12400, 12401, 
+52, 53, 
+  12403, 12404, 
+52, 53, 12406, 12407, 
+52, 53, 12409, 12410, 
+52, 53, 12412, 12413, 
+52, 52, 
+  12436, 
+52, 52, 12446, 
+52, 52, 12460, 
+52, 52, 12462, 
+52, 52, 12464, 
+52, 52, 12466, 
+52, 52, 12468, 
+52, 52, 12470, 
+52, 52, 
+  12472, 
+52, 52, 12474, 
+52, 52, 12476, 
+52, 52, 12478, 
+52, 52, 12480, 
+52, 52, 12482, 
+52, 52, 12485, 
+52, 52, 12487, 
+52, 52, 
+  12489, 
+52, 53, 12496, 12497, 
+52, 53, 12499, 12500, 
+52, 53, 12502, 12503, 
+52, 53, 12505, 
+  12506, 
+52, 53, 12508, 12509, 
+52, 52, 12532, 
+52, 52, 12535, 
+52, 52, 12536, 
+52, 52, 12537, 
+52, 52, 12538, 
+52, 52, 
+  12542, 
+54, 55, 1, 4250, 
+54, 55, 1, 4252, 
+54, 55, 1, 4267, 
+56, 57, 1, 4398, 
+56, 57, 1, 4399, 
+58, 61, 1, 4939, 1, 4940, 
+62, 67, 
+  1, 5307, 1, 5308, 1, 5310, 
+68, 69, 1, 5562, 
+68, 69, 1, 5563, 
+70, 71, 1, 53598, 
+70, 71, 1, 53599, 
+72, 81, 1, 53600, 
+  1, 53601, 1, 53602, 1, 53603, 1, 53604, 
+70, 71, 1, 53691, 
+70, 71, 1, 53692, 
+72, 75, 1, 53693, 1, 53695, 
+72, 75, 
+  1, 53694, 1, 53696, 
+};
+
diff --git a/libdispatch/utf8proc_data.h b/libdispatch/utf8proc_data.h
deleted file mode 100644
index 1426b76..0000000
--- a/libdispatch/utf8proc_data.h
+++ /dev/null
@@ -1,13383 +0,0 @@
-/*
- *  This file contains derived data from a modified version of the
- *  Unicode data files.
- *
- *  The original data files are available at
- *  http://www.unicode.org/Public/UNIDATA/
- *
- *
- *  COPYRIGHT AND PERMISSION NOTICE
- *
- *  Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed
- *  under the Terms of Use in http://www.unicode.org/copyright.html.
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of the Unicode data files and any associated documentation (the "Data
- *  Files") or Unicode software and any associated documentation (the
- *  "Software") to deal in the Data Files or Software without restriction,
- *  including without limitation the rights to use, copy, modify, merge,
- *  publish, distribute, and/or sell copies of the Data Files or Software, and
- *  to permit persons to whom the Data Files or Software are furnished to do
- *  so, provided that (a) the above copyright notice(s) and this permission
- *  notice appear with all copies of the Data Files or Software, (b) both the
- *  above copyright notice(s) and this permission notice appear in associated
- *  documentation, and (c) there is clear notice in each modified Data File or
- *  in the Software as well as in the documentation associated with the Data
- *  File(s) or Software that the data or software has been modified.
- *
- *  THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
- *  KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
- *  THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
- *  INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
- *  CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- *  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- *  PERFORMANCE OF THE DATA FILES OR SOFTWARE.
- *
- *  Except as contained in this notice, the name of a copyright holder shall
- *  not be used in advertising or otherwise to promote the sale, use or other
- *  dealings in these Data Files or Software without prior written
- *  authorization of the copyright holder.
- */
-
-
-const int32_t utf8proc_sequences[] = {
-  97, -1, 98, -1, 99, -1, 100, 
-  -1, 101, -1, 102, -1, 103, -1, 104, 
-  -1, 105, -1, 106, -1, 107, -1, 108, 
-  -1, 109, -1, 110, -1, 111, -1, 112, 
-  -1, 113, -1, 114, -1, 115, -1, 116, 
-  -1, 117, -1, 118, -1, 119, -1, 120, 
-  -1, 121, -1, 122, -1, 32, -1, 32, 
-  776, -1, 32, 772, -1, 50, -1, 51, 
-  -1, 32, 769, -1, 956, -1, 32, 807, 
-  -1, 49, -1, 49, 8260, 52, -1, 49, 
-  8260, 50, -1, 51, 8260, 52, -1, 65, 
-  768, -1, 224, -1, 65, 769, -1, 225, 
-  -1, 65, 770, -1, 226, -1, 65, 771, 
-  -1, 227, -1, 65, 776, -1, 228, -1, 
-  65, 778, -1, 229, -1, 230, -1, 67, 
-  807, -1, 231, -1, 69, 768, -1, 232, 
-  -1, 69, 769, -1, 233, -1, 69, 770, 
-  -1, 234, -1, 69, 776, -1, 235, -1, 
-  73, 768, -1, 236, -1, 73, 769, -1, 
-  237, -1, 73, 770, -1, 238, -1, 73, 
-  776, -1, 239, -1, 240, -1, 78, 771, 
-  -1, 241, -1, 79, 768, -1, 242, -1, 
-  79, 769, -1, 243, -1, 79, 770, -1, 
-  244, -1, 79, 771, -1, 245, -1, 79, 
-  776, -1, 246, -1, 248, -1, 85, 768, 
-  -1, 249, -1, 85, 769, -1, 250, -1, 
-  85, 770, -1, 251, -1, 85, 776, -1, 
-  252, -1, 89, 769, -1, 253, -1, 254, 
-  -1, 115, 115, -1, 97, 768, -1, 97, 
-  769, -1, 97, 770, -1, 97, 771, -1, 
-  97, 776, -1, 97, 778, -1, 99, 807, 
-  -1, 101, 768, -1, 101, 769, -1, 101, 
-  770, -1, 101, 776, -1, 105, 768, -1, 
-  105, 769, -1, 105, 770, -1, 105, 776, 
-  -1, 110, 771, -1, 111, 768, -1, 111, 
-  769, -1, 111, 770, -1, 111, 771, -1, 
-  111, 776, -1, 117, 768, -1, 117, 769, 
-  -1, 117, 770, -1, 117, 776, -1, 121, 
-  769, -1, 121, 776, -1, 65, 772, -1, 
-  257, -1, 97, 772, -1, 65, 774, -1, 
-  259, -1, 97, 774, -1, 65, 808, -1, 
-  261, -1, 97, 808, -1, 67, 769, -1, 
-  263, -1, 99, 769, -1, 67, 770, -1, 
-  265, -1, 99, 770, -1, 67, 775, -1, 
-  267, -1, 99, 775, -1, 67, 780, -1, 
-  269, -1, 99, 780, -1, 68, 780, -1, 
-  271, -1, 100, 780, -1, 273, -1, 69, 
-  772, -1, 275, -1, 101, 772, -1, 69, 
-  774, -1, 277, -1, 101, 774, -1, 69, 
-  775, -1, 279, -1, 101, 775, -1, 69, 
-  808, -1, 281, -1, 101, 808, -1, 69, 
-  780, -1, 283, -1, 101, 780, -1, 71, 
-  770, -1, 285, -1, 103, 770, -1, 71, 
-  774, -1, 287, -1, 103, 774, -1, 71, 
-  775, -1, 289, -1, 103, 775, -1, 71, 
-  807, -1, 291, -1, 103, 807, -1, 72, 
-  770, -1, 293, -1, 104, 770, -1, 295, 
-  -1, 73, 771, -1, 297, -1, 105, 771, 
-  -1, 73, 772, -1, 299, -1, 105, 772, 
-  -1, 73, 774, -1, 301, -1, 105, 774, 
-  -1, 73, 808, -1, 303, -1, 105, 808, 
-  -1, 73, 775, -1, 105, 775, -1, 73, 
-  74, -1, 307, -1, 105, 106, -1, 74, 
-  770, -1, 309, -1, 106, 770, -1, 75, 
-  807, -1, 311, -1, 107, 807, -1, 76, 
-  769, -1, 314, -1, 108, 769, -1, 76, 
-  807, -1, 316, -1, 108, 807, -1, 76, 
-  780, -1, 318, -1, 108, 780, -1, 76, 
-  183, -1, 320, -1, 108, 183, -1, 322, 
-  -1, 78, 769, -1, 324, -1, 110, 769, 
-  -1, 78, 807, -1, 326, -1, 110, 807, 
-  -1, 78, 780, -1, 328, -1, 110, 780, 
-  -1, 700, 110, -1, 331, -1, 79, 772, 
-  -1, 333, -1, 111, 772, -1, 79, 774, 
-  -1, 335, -1, 111, 774, -1, 79, 779, 
-  -1, 337, -1, 111, 779, -1, 339, -1, 
-  82, 769, -1, 341, -1, 114, 769, -1, 
-  82, 807, -1, 343, -1, 114, 807, -1, 
-  82, 780, -1, 345, -1, 114, 780, -1, 
-  83, 769, -1, 347, -1, 115, 769, -1, 
-  83, 770, -1, 349, -1, 115, 770, -1, 
-  83, 807, -1, 351, -1, 115, 807, -1, 
-  83, 780, -1, 353, -1, 115, 780, -1, 
-  84, 807, -1, 355, -1, 116, 807, -1, 
-  84, 780, -1, 357, -1, 116, 780, -1, 
-  359, -1, 85, 771, -1, 361, -1, 117, 
-  771, -1, 85, 772, -1, 363, -1, 117, 
-  772, -1, 85, 774, -1, 365, -1, 117, 
-  774, -1, 85, 778, -1, 367, -1, 117, 
-  778, -1, 85, 779, -1, 369, -1, 117, 
-  779, -1, 85, 808, -1, 371, -1, 117, 
-  808, -1, 87, 770, -1, 373, -1, 119, 
-  770, -1, 89, 770, -1, 375, -1, 121, 
-  770, -1, 89, 776, -1, 255, -1, 90, 
-  769, -1, 378, -1, 122, 769, -1, 90, 
-  775, -1, 380, -1, 122, 775, -1, 90, 
-  780, -1, 382, -1, 122, 780, -1, 595, 
-  -1, 387, -1, 389, -1, 596, -1, 392, 
-  -1, 598, -1, 599, -1, 396, -1, 477, 
-  -1, 601, -1, 603, -1, 402, -1, 608, 
-  -1, 611, -1, 617, -1, 616, -1, 409, 
-  -1, 623, -1, 626, -1, 629, -1, 79, 
-  795, -1, 417, -1, 111, 795, -1, 419, 
-  -1, 421, -1, 640, -1, 424, -1, 643, 
-  -1, 429, -1, 648, -1, 85, 795, -1, 
-  432, -1, 117, 795, -1, 650, -1, 651, 
-  -1, 436, -1, 438, -1, 658, -1, 441, 
-  -1, 445, -1, 68, 381, -1, 454, -1, 
-  68, 382, -1, 100, 382, -1, 76, 74, 
-  -1, 457, -1, 76, 106, -1, 108, 106, 
-  -1, 78, 74, -1, 460, -1, 78, 106, 
-  -1, 110, 106, -1, 65, 780, -1, 462, 
-  -1, 97, 780, -1, 73, 780, -1, 464, 
-  -1, 105, 780, -1, 79, 780, -1, 466, 
-  -1, 111, 780, -1, 85, 780, -1, 468, 
-  -1, 117, 780, -1, 220, 772, -1, 470, 
-  -1, 252, 772, -1, 220, 769, -1, 472, 
-  -1, 252, 769, -1, 220, 780, -1, 474, 
-  -1, 252, 780, -1, 220, 768, -1, 476, 
-  -1, 252, 768, -1, 196, 772, -1, 479, 
-  -1, 228, 772, -1, 550, 772, -1, 481, 
-  -1, 551, 772, -1, 198, 772, -1, 483, 
-  -1, 230, 772, -1, 485, -1, 71, 780, 
-  -1, 487, -1, 103, 780, -1, 75, 780, 
-  -1, 489, -1, 107, 780, -1, 79, 808, 
-  -1, 491, -1, 111, 808, -1, 490, 772, 
-  -1, 493, -1, 491, 772, -1, 439, 780, 
-  -1, 495, -1, 658, 780, -1, 106, 780, 
-  -1, 68, 90, -1, 499, -1, 68, 122, 
-  -1, 100, 122, -1, 71, 769, -1, 501, 
-  -1, 103, 769, -1, 405, -1, 447, -1, 
-  78, 768, -1, 505, -1, 110, 768, -1, 
-  197, 769, -1, 507, -1, 229, 769, -1, 
-  198, 769, -1, 509, -1, 230, 769, -1, 
-  216, 769, -1, 511, -1, 248, 769, -1, 
-  65, 783, -1, 513, -1, 97, 783, -1, 
-  65, 785, -1, 515, -1, 97, 785, -1, 
-  69, 783, -1, 517, -1, 101, 783, -1, 
-  69, 785, -1, 519, -1, 101, 785, -1, 
-  73, 783, -1, 521, -1, 105, 783, -1, 
-  73, 785, -1, 523, -1, 105, 785, -1, 
-  79, 783, -1, 525, -1, 111, 783, -1, 
-  79, 785, -1, 527, -1, 111, 785, -1, 
-  82, 783, -1, 529, -1, 114, 783, -1, 
-  82, 785, -1, 531, -1, 114, 785, -1, 
-  85, 783, -1, 533, -1, 117, 783, -1, 
-  85, 785, -1, 535, -1, 117, 785, -1, 
-  83, 806, -1, 537, -1, 115, 806, -1, 
-  84, 806, -1, 539, -1, 116, 806, -1, 
-  541, -1, 72, 780, -1, 543, -1, 104, 
-  780, -1, 414, -1, 547, -1, 549, -1, 
-  65, 775, -1, 551, -1, 97, 775, -1, 
-  69, 807, -1, 553, -1, 101, 807, -1, 
-  214, 772, -1, 555, -1, 246, 772, -1, 
-  213, 772, -1, 557, -1, 245, 772, -1, 
-  79, 775, -1, 559, -1, 111, 775, -1, 
-  558, 772, -1, 561, -1, 559, 772, -1, 
-  89, 772, -1, 563, -1, 121, 772, -1, 
-  11365, -1, 572, -1, 410, -1, 11366, -1, 
-  578, -1, 384, -1, 649, -1, 652, -1, 
-  583, -1, 585, -1, 587, -1, 589, -1, 
-  591, -1, 614, -1, 633, -1, 635, -1, 
-  641, -1, 32, 774, -1, 32, 775, -1, 
-  32, 778, -1, 32, 808, -1, 32, 771, 
-  -1, 32, 779, -1, 661, -1, 768, -1, 
-  769, -1, 787, -1, 776, 769, -1, 953, 
-  -1, 697, -1, 32, 837, -1, 59, -1, 
-  168, 769, -1, 913, 769, -1, 940, -1, 
-  183, -1, 917, 769, -1, 941, -1, 919, 
-  769, -1, 942, -1, 921, 769, -1, 943, 
-  -1, 927, 769, -1, 972, -1, 933, 769, 
-  -1, 973, -1, 937, 769, -1, 974, -1, 
-  970, 769, -1, 953, 776, 769, -1, 945, 
-  -1, 946, -1, 947, -1, 948, -1, 949, 
-  -1, 950, -1, 951, -1, 952, -1, 954, 
-  -1, 955, -1, 957, -1, 958, -1, 959, 
-  -1, 960, -1, 961, -1, 963, -1, 964, 
-  -1, 965, -1, 966, -1, 967, -1, 968, 
-  -1, 969, -1, 921, 776, -1, 970, -1, 
-  933, 776, -1, 971, -1, 945, 769, -1, 
-  949, 769, -1, 951, 769, -1, 953, 769, 
-  -1, 971, 769, -1, 965, 776, 769, -1, 
-  953, 776, -1, 965, 776, -1, 959, 769, 
-  -1, 965, 769, -1, 969, 769, -1, 933, 
-  -1, 978, 769, -1, 978, 776, -1, 985, 
-  -1, 987, -1, 989, -1, 991, -1, 993, 
-  -1, 995, -1, 997, -1, 999, -1, 1001, 
-  -1, 1003, -1, 1005, -1, 1007, -1, 962, 
-  -1, 920, -1, 1016, -1, 931, -1, 1010, 
-  -1, 1019, -1, 891, -1, 892, -1, 893, 
-  -1, 1045, 768, -1, 1104, -1, 1045, 776, 
-  -1, 1105, -1, 1106, -1, 1043, 769, -1, 
-  1107, -1, 1108, -1, 1109, -1, 1110, -1, 
-  1030, 776, -1, 1111, -1, 1112, -1, 1113, 
-  -1, 1114, -1, 1115, -1, 1050, 769, -1, 
-  1116, -1, 1048, 768, -1, 1117, -1, 1059, 
-  774, -1, 1118, -1, 1119, -1, 1072, -1, 
-  1073, -1, 1074, -1, 1075, -1, 1076, -1, 
-  1077, -1, 1078, -1, 1079, -1, 1080, -1, 
-  1048, 774, -1, 1081, -1, 1082, -1, 1083, 
-  -1, 1084, -1, 1085, -1, 1086, -1, 1087, 
-  -1, 1088, -1, 1089, -1, 1090, -1, 1091, 
-  -1, 1092, -1, 1093, -1, 1094, -1, 1095, 
-  -1, 1096, -1, 1097, -1, 1098, -1, 1099, 
-  -1, 1100, -1, 1101, -1, 1102, -1, 1103, 
-  -1, 1080, 774, -1, 1077, 768, -1, 1077, 
-  776, -1, 1075, 769, -1, 1110, 776, -1, 
-  1082, 769, -1, 1080, 768, -1, 1091, 774, 
-  -1, 1121, -1, 1123, -1, 1125, -1, 1127, 
-  -1, 1129, -1, 1131, -1, 1133, -1, 1135, 
-  -1, 1137, -1, 1139, -1, 1141, -1, 1140, 
-  783, -1, 1143, -1, 1141, 783, -1, 1145, 
-  -1, 1147, -1, 1149, -1, 1151, -1, 1153, 
-  -1, 1163, -1, 1165, -1, 1167, -1, 1169, 
-  -1, 1171, -1, 1173, -1, 1175, -1, 1177, 
-  -1, 1179, -1, 1181, -1, 1183, -1, 1185, 
-  -1, 1187, -1, 1189, -1, 1191, -1, 1193, 
-  -1, 1195, -1, 1197, -1, 1199, -1, 1201, 
-  -1, 1203, -1, 1205, -1, 1207, -1, 1209, 
-  -1, 1211, -1, 1213, -1, 1215, -1, 1231, 
-  -1, 1046, 774, -1, 1218, -1, 1078, 774, 
-  -1, 1220, -1, 1222, -1, 1224, -1, 1226, 
-  -1, 1228, -1, 1230, -1, 1040, 774, -1, 
-  1233, -1, 1072, 774, -1, 1040, 776, -1, 
-  1235, -1, 1072, 776, -1, 1237, -1, 1045, 
-  774, -1, 1239, -1, 1077, 774, -1, 1241, 
-  -1, 1240, 776, -1, 1243, -1, 1241, 776, 
-  -1, 1046, 776, -1, 1245, -1, 1078, 776, 
-  -1, 1047, 776, -1, 1247, -1, 1079, 776, 
-  -1, 1249, -1, 1048, 772, -1, 1251, -1, 
-  1080, 772, -1, 1048, 776, -1, 1253, -1, 
-  1080, 776, -1, 1054, 776, -1, 1255, -1, 
-  1086, 776, -1, 1257, -1, 1256, 776, -1, 
-  1259, -1, 1257, 776, -1, 1069, 776, -1, 
-  1261, -1, 1101, 776, -1, 1059, 772, -1, 
-  1263, -1, 1091, 772, -1, 1059, 776, -1, 
-  1265, -1, 1091, 776, -1, 1059, 779, -1, 
-  1267, -1, 1091, 779, -1, 1063, 776, -1, 
-  1269, -1, 1095, 776, -1, 1271, -1, 1067, 
-  776, -1, 1273, -1, 1099, 776, -1, 1275, 
-  -1, 1277, -1, 1279, -1, 1281, -1, 1283, 
-  -1, 1285, -1, 1287, -1, 1289, -1, 1291, 
-  -1, 1293, -1, 1295, -1, 1297, -1, 1299, 
-  -1, 1377, -1, 1378, -1, 1379, -1, 1380, 
-  -1, 1381, -1, 1382, -1, 1383, -1, 1384, 
-  -1, 1385, -1, 1386, -1, 1387, -1, 1388, 
-  -1, 1389, -1, 1390, -1, 1391, -1, 1392, 
-  -1, 1393, -1, 1394, -1, 1395, -1, 1396, 
-  -1, 1397, -1, 1398, -1, 1399, -1, 1400, 
-  -1, 1401, -1, 1402, -1, 1403, -1, 1404, 
-  -1, 1405, -1, 1406, -1, 1407, -1, 1408, 
-  -1, 1409, -1, 1410, -1, 1411, -1, 1412, 
-  -1, 1413, -1, 1414, -1, 1381, 1410, -1, 
-  1575, 1619, -1, 1575, 1620, -1, 1608, 1620, 
-  -1, 1575, 1621, -1, 1610, 1620, -1, 1575, 
-  1652, -1, 1608, 1652, -1, 1735, 1652, -1, 
-  1610, 1652, -1, 1749, 1620, -1, 1729, 1620, 
-  -1, 1746, 1620, -1, 2344, 2364, -1, 2352, 
-  2364, -1, 2355, 2364, -1, 2325, 2364, -1, 
-  2326, 2364, -1, 2327, 2364, -1, 2332, 2364, 
-  -1, 2337, 2364, -1, 2338, 2364, -1, 2347, 
-  2364, -1, 2351, 2364, -1, 2503, 2494, -1, 
-  2503, 2519, -1, 2465, 2492, -1, 2466, 2492, 
-  -1, 2479, 2492, -1, 2610, 2620, -1, 2616, 
-  2620, -1, 2582, 2620, -1, 2583, 2620, -1, 
-  2588, 2620, -1, 2603, 2620, -1, 2887, 2902, 
-  -1, 2887, 2878, -1, 2887, 2903, -1, 2849, 
-  2876, -1, 2850, 2876, -1, 2962, 3031, -1, 
-  3014, 3006, -1, 3015, 3006, -1, 3014, 3031, 
-  -1, 3142, 3158, -1, 3263, 3285, -1, 3270, 
-  3285, -1, 3270, 3286, -1, 3270, 3266, -1, 
-  3274, 3285, -1, 3398, 3390, -1, 3399, 3390, 
-  -1, 3398, 3415, -1, 3545, 3530, -1, 3545, 
-  3535, -1, 3548, 3530, -1, 3545, 3551, -1, 
-  3661, 3634, -1, 3789, 3762, -1, 3755, 3737, 
-  -1, 3755, 3745, -1, 3851, -1, 3906, 4023, 
-  -1, 3916, 4023, -1, 3921, 4023, -1, 3926, 
-  4023, -1, 3931, 4023, -1, 3904, 4021, -1, 
-  3953, 3954, -1, 3953, 3956, -1, 4018, 3968, 
-  -1, 4018, 3969, -1, 4019, 3968, -1, 4019, 
-  3969, -1, 3953, 3968, -1, 3986, 4023, -1, 
-  3996, 4023, -1, 4001, 4023, -1, 4006, 4023, 
-  -1, 4011, 4023, -1, 3984, 4021, -1, 4133, 
-  4142, -1, 11520, -1, 11521, -1, 11522, -1, 
-  11523, -1, 11524, -1, 11525, -1, 11526, -1, 
-  11527, -1, 11528, -1, 11529, -1, 11530, -1, 
-  11531, -1, 11532, -1, 11533, -1, 11534, -1, 
-  11535, -1, 11536, -1, 11537, -1, 11538, -1, 
-  11539, -1, 11540, -1, 11541, -1, 11542, -1, 
-  11543, -1, 11544, -1, 11545, -1, 11546, -1, 
-  11547, -1, 11548, -1, 11549, -1, 11550, -1, 
-  11551, -1, 11552, -1, 11553, -1, 11554, -1, 
-  11555, -1, 11556, -1, 11557, -1, 4316, -1, 
-  6917, 6965, -1, 6919, 6965, -1, 6921, 6965, 
-  -1, 6923, 6965, -1, 6925, 6965, -1, 6929, 
-  6965, -1, 6970, 6965, -1, 6972, 6965, -1, 
-  6974, 6965, -1, 6975, 6965, -1, 6978, 6965, 
-  -1, 65, -1, 198, -1, 66, -1, 68, 
-  -1, 69, -1, 398, -1, 71, -1, 72, 
-  -1, 73, -1, 74, -1, 75, -1, 76, 
-  -1, 77, -1, 78, -1, 79, -1, 546, 
-  -1, 80, -1, 82, -1, 84, -1, 85, 
-  -1, 87, -1, 592, -1, 593, -1, 7426, 
-  -1, 604, -1, 7446, -1, 7447, -1, 7453, 
-  -1, 7461, -1, 594, -1, 597, -1, 607, 
-  -1, 609, -1, 613, -1, 618, -1, 7547, 
-  -1, 669, -1, 621, -1, 7557, -1, 671, 
-  -1, 625, -1, 624, -1, 627, -1, 628, 
-  -1, 632, -1, 642, -1, 427, -1, 7452, 
-  -1, 656, -1, 657, -1, 65, 805, -1, 
-  7681, -1, 97, 805, -1, 66, 775, -1, 
-  7683, -1, 98, 775, -1, 66, 803, -1, 
-  7685, -1, 98, 803, -1, 66, 817, -1, 
-  7687, -1, 98, 817, -1, 199, 769, -1, 
-  7689, -1, 231, 769, -1, 68, 775, -1, 
-  7691, -1, 100, 775, -1, 68, 803, -1, 
-  7693, -1, 100, 803, -1, 68, 817, -1, 
-  7695, -1, 100, 817, -1, 68, 807, -1, 
-  7697, -1, 100, 807, -1, 68, 813, -1, 
-  7699, -1, 100, 813, -1, 274, 768, -1, 
-  7701, -1, 275, 768, -1, 274, 769, -1, 
-  7703, -1, 275, 769, -1, 69, 813, -1, 
-  7705, -1, 101, 813, -1, 69, 816, -1, 
-  7707, -1, 101, 816, -1, 552, 774, -1, 
-  7709, -1, 553, 774, -1, 70, 775, -1, 
-  7711, -1, 102, 775, -1, 71, 772, -1, 
-  7713, -1, 103, 772, -1, 72, 775, -1, 
-  7715, -1, 104, 775, -1, 72, 803, -1, 
-  7717, -1, 104, 803, -1, 72, 776, -1, 
-  7719, -1, 104, 776, -1, 72, 807, -1, 
-  7721, -1, 104, 807, -1, 72, 814, -1, 
-  7723, -1, 104, 814, -1, 73, 816, -1, 
-  7725, -1, 105, 816, -1, 207, 769, -1, 
-  7727, -1, 239, 769, -1, 75, 769, -1, 
-  7729, -1, 107, 769, -1, 75, 803, -1, 
-  7731, -1, 107, 803, -1, 75, 817, -1, 
-  7733, -1, 107, 817, -1, 76, 803, -1, 
-  7735, -1, 108, 803, -1, 7734, 772, -1, 
-  7737, -1, 7735, 772, -1, 76, 817, -1, 
-  7739, -1, 108, 817, -1, 76, 813, -1, 
-  7741, -1, 108, 813, -1, 77, 769, -1, 
-  7743, -1, 109, 769, -1, 77, 775, -1, 
-  7745, -1, 109, 775, -1, 77, 803, -1, 
-  7747, -1, 109, 803, -1, 78, 775, -1, 
-  7749, -1, 110, 775, -1, 78, 803, -1, 
-  7751, -1, 110, 803, -1, 78, 817, -1, 
-  7753, -1, 110, 817, -1, 78, 813, -1, 
-  7755, -1, 110, 813, -1, 213, 769, -1, 
-  7757, -1, 245, 769, -1, 213, 776, -1, 
-  7759, -1, 245, 776, -1, 332, 768, -1, 
-  7761, -1, 333, 768, -1, 332, 769, -1, 
-  7763, -1, 333, 769, -1, 80, 769, -1, 
-  7765, -1, 112, 769, -1, 80, 775, -1, 
-  7767, -1, 112, 775, -1, 82, 775, -1, 
-  7769, -1, 114, 775, -1, 82, 803, -1, 
-  7771, -1, 114, 803, -1, 7770, 772, -1, 
-  7773, -1, 7771, 772, -1, 82, 817, -1, 
-  7775, -1, 114, 817, -1, 83, 775, -1, 
-  7777, -1, 115, 775, -1, 83, 803, -1, 
-  7779, -1, 115, 803, -1, 346, 775, -1, 
-  7781, -1, 347, 775, -1, 352, 775, -1, 
-  7783, -1, 353, 775, -1, 7778, 775, -1, 
-  7785, -1, 7779, 775, -1, 84, 775, -1, 
-  7787, -1, 116, 775, -1, 84, 803, -1, 
-  7789, -1, 116, 803, -1, 84, 817, -1, 
-  7791, -1, 116, 817, -1, 84, 813, -1, 
-  7793, -1, 116, 813, -1, 85, 804, -1, 
-  7795, -1, 117, 804, -1, 85, 816, -1, 
-  7797, -1, 117, 816, -1, 85, 813, -1, 
-  7799, -1, 117, 813, -1, 360, 769, -1, 
-  7801, -1, 361, 769, -1, 362, 776, -1, 
-  7803, -1, 363, 776, -1, 86, 771, -1, 
-  7805, -1, 118, 771, -1, 86, 803, -1, 
-  7807, -1, 118, 803, -1, 87, 768, -1, 
-  7809, -1, 119, 768, -1, 87, 769, -1, 
-  7811, -1, 119, 769, -1, 87, 776, -1, 
-  7813, -1, 119, 776, -1, 87, 775, -1, 
-  7815, -1, 119, 775, -1, 87, 803, -1, 
-  7817, -1, 119, 803, -1, 88, 775, -1, 
-  7819, -1, 120, 775, -1, 88, 776, -1, 
-  7821, -1, 120, 776, -1, 89, 775, -1, 
-  7823, -1, 121, 775, -1, 90, 770, -1, 
-  7825, -1, 122, 770, -1, 90, 803, -1, 
-  7827, -1, 122, 803, -1, 90, 817, -1, 
-  7829, -1, 122, 817, -1, 104, 817, -1, 
-  116, 776, -1, 119, 778, -1, 121, 778, 
-  -1, 97, 702, -1, 383, 775, -1, 65, 
-  803, -1, 7841, -1, 97, 803, -1, 65, 
-  777, -1, 7843, -1, 97, 777, -1, 194, 
-  769, -1, 7845, -1, 226, 769, -1, 194, 
-  768, -1, 7847, -1, 226, 768, -1, 194, 
-  777, -1, 7849, -1, 226, 777, -1, 194, 
-  771, -1, 7851, -1, 226, 771, -1, 7840, 
-  770, -1, 7853, -1, 7841, 770, -1, 258, 
-  769, -1, 7855, -1, 259, 769, -1, 258, 
-  768, -1, 7857, -1, 259, 768, -1, 258, 
-  777, -1, 7859, -1, 259, 777, -1, 258, 
-  771, -1, 7861, -1, 259, 771, -1, 7840, 
-  774, -1, 7863, -1, 7841, 774, -1, 69, 
-  803, -1, 7865, -1, 101, 803, -1, 69, 
-  777, -1, 7867, -1, 101, 777, -1, 69, 
-  771, -1, 7869, -1, 101, 771, -1, 202, 
-  769, -1, 7871, -1, 234, 769, -1, 202, 
-  768, -1, 7873, -1, 234, 768, -1, 202, 
-  777, -1, 7875, -1, 234, 777, -1, 202, 
-  771, -1, 7877, -1, 234, 771, -1, 7864, 
-  770, -1, 7879, -1, 7865, 770, -1, 73, 
-  777, -1, 7881, -1, 105, 777, -1, 73, 
-  803, -1, 7883, -1, 105, 803, -1, 79, 
-  803, -1, 7885, -1, 111, 803, -1, 79, 
-  777, -1, 7887, -1, 111, 777, -1, 212, 
-  769, -1, 7889, -1, 244, 769, -1, 212, 
-  768, -1, 7891, -1, 244, 768, -1, 212, 
-  777, -1, 7893, -1, 244, 777, -1, 212, 
-  771, -1, 7895, -1, 244, 771, -1, 7884, 
-  770, -1, 7897, -1, 7885, 770, -1, 416, 
-  769, -1, 7899, -1, 417, 769, -1, 416, 
-  768, -1, 7901, -1, 417, 768, -1, 416, 
-  777, -1, 7903, -1, 417, 777, -1, 416, 
-  771, -1, 7905, -1, 417, 771, -1, 416, 
-  803, -1, 7907, -1, 417, 803, -1, 85, 
-  803, -1, 7909, -1, 117, 803, -1, 85, 
-  777, -1, 7911, -1, 117, 777, -1, 431, 
-  769, -1, 7913, -1, 432, 769, -1, 431, 
-  768, -1, 7915, -1, 432, 768, -1, 431, 
-  777, -1, 7917, -1, 432, 777, -1, 431, 
-  771, -1, 7919, -1, 432, 771, -1, 431, 
-  803, -1, 7921, -1, 432, 803, -1, 89, 
-  768, -1, 7923, -1, 121, 768, -1, 89, 
-  803, -1, 7925, -1, 121, 803, -1, 89, 
-  777, -1, 7927, -1, 121, 777, -1, 89, 
-  771, -1, 7929, -1, 121, 771, -1, 945, 
-  787, -1, 945, 788, -1, 7936, 768, -1, 
-  7937, 768, -1, 7936, 769, -1, 7937, 769, 
-  -1, 7936, 834, -1, 7937, 834, -1, 913, 
-  787, -1, 7936, -1, 913, 788, -1, 7937, 
-  -1, 7944, 768, -1, 7938, -1, 7945, 768, 
-  -1, 7939, -1, 7944, 769, -1, 7940, -1, 
-  7945, 769, -1, 7941, -1, 7944, 834, -1, 
-  7942, -1, 7945, 834, -1, 7943, -1, 949, 
-  787, -1, 949, 788, -1, 7952, 768, -1, 
-  7953, 768, -1, 7952, 769, -1, 7953, 769, 
-  -1, 917, 787, -1, 7952, -1, 917, 788, 
-  -1, 7953, -1, 7960, 768, -1, 7954, -1, 
-  7961, 768, -1, 7955, -1, 7960, 769, -1, 
-  7956, -1, 7961, 769, -1, 7957, -1, 951, 
-  787, -1, 951, 788, -1, 7968, 768, -1, 
-  7969, 768, -1, 7968, 769, -1, 7969, 769, 
-  -1, 7968, 834, -1, 7969, 834, -1, 919, 
-  787, -1, 7968, -1, 919, 788, -1, 7969, 
-  -1, 7976, 768, -1, 7970, -1, 7977, 768, 
-  -1, 7971, -1, 7976, 769, -1, 7972, -1, 
-  7977, 769, -1, 7973, -1, 7976, 834, -1, 
-  7974, -1, 7977, 834, -1, 7975, -1, 953, 
-  787, -1, 953, 788, -1, 7984, 768, -1, 
-  7985, 768, -1, 7984, 769, -1, 7985, 769, 
-  -1, 7984, 834, -1, 7985, 834, -1, 921, 
-  787, -1, 7984, -1, 921, 788, -1, 7985, 
-  -1, 7992, 768, -1, 7986, -1, 7993, 768, 
-  -1, 7987, -1, 7992, 769, -1, 7988, -1, 
-  7993, 769, -1, 7989, -1, 7992, 834, -1, 
-  7990, -1, 7993, 834, -1, 7991, -1, 959, 
-  787, -1, 959, 788, -1, 8000, 768, -1, 
-  8001, 768, -1, 8000, 769, -1, 8001, 769, 
-  -1, 927, 787, -1, 8000, -1, 927, 788, 
-  -1, 8001, -1, 8008, 768, -1, 8002, -1, 
-  8009, 768, -1, 8003, -1, 8008, 769, -1, 
-  8004, -1, 8009, 769, -1, 8005, -1, 965, 
-  787, -1, 965, 788, -1, 8016, 768, -1, 
-  965, 787, 768, -1, 8017, 768, -1, 8016, 
-  769, -1, 965, 787, 769, -1, 8017, 769, 
-  -1, 8016, 834, -1, 965, 787, 834, -1, 
-  8017, 834, -1, 933, 788, -1, 8017, -1, 
-  8025, 768, -1, 8019, -1, 8025, 769, -1, 
-  8021, -1, 8025, 834, -1, 8023, -1, 969, 
-  787, -1, 969, 788, -1, 8032, 768, -1, 
-  8033, 768, -1, 8032, 769, -1, 8033, 769, 
-  -1, 8032, 834, -1, 8033, 834, -1, 937, 
-  787, -1, 8032, -1, 937, 788, -1, 8033, 
-  -1, 8040, 768, -1, 8034, -1, 8041, 768, 
-  -1, 8035, -1, 8040, 769, -1, 8036, -1, 
-  8041, 769, -1, 8037, -1, 8040, 834, -1, 
-  8038, -1, 8041, 834, -1, 8039, -1, 945, 
-  768, -1, 949, 768, -1, 951, 768, -1, 
-  953, 768, -1, 959, 768, -1, 965, 768, 
-  -1, 969, 768, -1, 7936, 837, -1, 7936, 
-  953, -1, 7937, 837, -1, 7937, 953, -1, 
-  7938, 837, -1, 7938, 953, -1, 7939, 837, 
-  -1, 7939, 953, -1, 7940, 837, -1, 7940, 
-  953, -1, 7941, 837, -1, 7941, 953, -1, 
-  7942, 837, -1, 7942, 953, -1, 7943, 837, 
-  -1, 7943, 953, -1, 7944, 837, -1, 8064, 
-  -1, 7945, 837, -1, 8065, -1, 7946, 837, 
-  -1, 8066, -1, 7947, 837, -1, 8067, -1, 
-  7948, 837, -1, 8068, -1, 7949, 837, -1, 
-  8069, -1, 7950, 837, -1, 8070, -1, 7951, 
-  837, -1, 8071, -1, 7968, 837, -1, 7968, 
-  953, -1, 7969, 837, -1, 7969, 953, -1, 
-  7970, 837, -1, 7970, 953, -1, 7971, 837, 
-  -1, 7971, 953, -1, 7972, 837, -1, 7972, 
-  953, -1, 7973, 837, -1, 7973, 953, -1, 
-  7974, 837, -1, 7974, 953, -1, 7975, 837, 
-  -1, 7975, 953, -1, 7976, 837, -1, 8080, 
-  -1, 7977, 837, -1, 8081, -1, 7978, 837, 
-  -1, 8082, -1, 7979, 837, -1, 8083, -1, 
-  7980, 837, -1, 8084, -1, 7981, 837, -1, 
-  8085, -1, 7982, 837, -1, 8086, -1, 7983, 
-  837, -1, 8087, -1, 8032, 837, -1, 8032, 
-  953, -1, 8033, 837, -1, 8033, 953, -1, 
-  8034, 837, -1, 8034, 953, -1, 8035, 837, 
-  -1, 8035, 953, -1, 8036, 837, -1, 8036, 
-  953, -1, 8037, 837, -1, 8037, 953, -1, 
-  8038, 837, -1, 8038, 953, -1, 8039, 837, 
-  -1, 8039, 953, -1, 8040, 837, -1, 8096, 
-  -1, 8041, 837, -1, 8097, -1, 8042, 837, 
-  -1, 8098, -1, 8043, 837, -1, 8099, -1, 
-  8044, 837, -1, 8100, -1, 8045, 837, -1, 
-  8101, -1, 8046, 837, -1, 8102, -1, 8047, 
-  837, -1, 8103, -1, 945, 774, -1, 945, 
-  772, -1, 8048, 837, -1, 8048, 953, -1, 
-  945, 837, -1, 945, 953, -1, 940, 837, 
-  -1, 940, 953, -1, 945, 834, -1, 8118, 
-  837, -1, 945, 834, 953, -1, 913, 774, 
-  -1, 8112, -1, 913, 772, -1, 8113, -1, 
-  913, 768, -1, 8048, -1, 902, -1, 8049, 
-  -1, 913, 837, -1, 8115, -1, 32, 787, 
-  -1, 32, 834, -1, 168, 834, -1, 8052, 
-  837, -1, 8052, 953, -1, 951, 837, -1, 
-  951, 953, -1, 942, 837, -1, 942, 953, 
-  -1, 951, 834, -1, 8134, 837, -1, 951, 
-  834, 953, -1, 917, 768, -1, 8050, -1, 
-  904, -1, 8051, -1, 919, 768, -1, 8052, 
-  -1, 905, -1, 8053, -1, 919, 837, -1, 
-  8131, -1, 8127, 768, -1, 8127, 769, -1, 
-  8127, 834, -1, 953, 774, -1, 953, 772, 
-  -1, 970, 768, -1, 953, 776, 768, -1, 
-  912, -1, 953, 834, -1, 970, 834, -1, 
-  953, 776, 834, -1, 921, 774, -1, 8144, 
-  -1, 921, 772, -1, 8145, -1, 921, 768, 
-  -1, 8054, -1, 906, -1, 8055, -1, 8190, 
-  768, -1, 8190, 769, -1, 8190, 834, -1, 
-  965, 774, -1, 965, 772, -1, 971, 768, 
-  -1, 965, 776, 768, -1, 944, -1, 961, 
-  787, -1, 961, 788, -1, 965, 834, -1, 
-  971, 834, -1, 965, 776, 834, -1, 933, 
-  774, -1, 8160, -1, 933, 772, -1, 8161, 
-  -1, 933, 768, -1, 8058, -1, 910, -1, 
-  8059, -1, 929, 788, -1, 8165, -1, 168, 
-  768, -1, 901, -1, 96, -1, 8060, 837, 
-  -1, 8060, 953, -1, 969, 837, -1, 969, 
-  953, -1, 974, 837, -1, 974, 953, -1, 
-  969, 834, -1, 8182, 837, -1, 969, 834, 
-  953, -1, 927, 768, -1, 8056, -1, 908, 
-  -1, 8057, -1, 937, 768, -1, 8060, -1, 
-  911, -1, 8061, -1, 937, 837, -1, 8179, 
-  -1, 180, -1, 32, 788, -1, 8194, -1, 
-  8195, -1, 8208, -1, 32, 819, -1, 46, 
-  -1, 46, 46, -1, 46, 46, 46, -1, 
-  8242, 8242, -1, 8242, 8242, 8242, -1, 8245, 
-  8245, -1, 8245, 8245, 8245, -1, 33, 33, 
-  -1, 32, 773, -1, 63, 63, -1, 63, 
-  33, -1, 33, 63, -1, 8242, 8242, 8242, 
-  8242, -1, 48, -1, 52, -1, 53, -1, 
-  54, -1, 55, -1, 56, -1, 57, -1, 
-  43, -1, 8722, -1, 61, -1, 40, -1, 
-  41, -1, 82, 115, -1, 97, 47, 99, 
-  -1, 97, 47, 115, -1, 67, -1, 176, 
-  67, -1, 99, 47, 111, -1, 99, 47, 
-  117, -1, 400, -1, 176, 70, -1, 78, 
-  111, -1, 81, -1, 83, 77, -1, 84, 
-  69, 76, -1, 84, 77, -1, 90, -1, 
-  937, -1, 197, -1, 70, -1, 8526, -1, 
-  1488, -1, 1489, -1, 1490, -1, 1491, -1, 
-  70, 65, 88, -1, 915, -1, 928, -1, 
-  8721, -1, 49, 8260, 51, -1, 50, 8260, 
-  51, -1, 49, 8260, 53, -1, 50, 8260, 
-  53, -1, 51, 8260, 53, -1, 52, 8260, 
-  53, -1, 49, 8260, 54, -1, 53, 8260, 
-  54, -1, 49, 8260, 56, -1, 51, 8260, 
-  56, -1, 53, 8260, 56, -1, 55, 8260, 
-  56, -1, 49, 8260, -1, 8560, -1, 73, 
-  73, -1, 8561, -1, 73, 73, 73, -1, 
-  8562, -1, 73, 86, -1, 8563, -1, 86, 
-  -1, 8564, -1, 86, 73, -1, 8565, -1, 
-  86, 73, 73, -1, 8566, -1, 86, 73, 
-  73, 73, -1, 8567, -1, 73, 88, -1, 
-  8568, -1, 88, -1, 8569, -1, 88, 73, 
-  -1, 8570, -1, 88, 73, 73, -1, 8571, 
-  -1, 8572, -1, 8573, -1, 8574, -1, 8575, 
-  -1, 105, 105, -1, 105, 105, 105, -1, 
-  105, 118, -1, 118, 105, -1, 118, 105, 
-  105, -1, 118, 105, 105, 105, -1, 105, 
-  120, -1, 120, 105, -1, 120, 105, 105, 
-  -1, 8580, -1, 8592, 824, -1, 8594, 824, 
-  -1, 8596, 824, -1, 8656, 824, -1, 8660, 
-  824, -1, 8658, 824, -1, 8707, 824, -1, 
-  8712, 824, -1, 8715, 824, -1, 8739, 824, 
-  -1, 8741, 824, -1, 8747, 8747, -1, 8747, 
-  8747, 8747, -1, 8750, 8750, -1, 8750, 8750, 
-  8750, -1, 8764, 824, -1, 8771, 824, -1, 
-  8773, 824, -1, 8776, 824, -1, 61, 824, 
-  -1, 8801, 824, -1, 8781, 824, -1, 60, 
-  824, -1, 62, 824, -1, 8804, 824, -1, 
-  8805, 824, -1, 8818, 824, -1, 8819, 824, 
-  -1, 8822, 824, -1, 8823, 824, -1, 8826, 
-  824, -1, 8827, 824, -1, 8834, 824, -1, 
-  8835, 824, -1, 8838, 824, -1, 8839, 824, 
-  -1, 8866, 824, -1, 8872, 824, -1, 8873, 
-  824, -1, 8875, 824, -1, 8828, 824, -1, 
-  8829, 824, -1, 8849, 824, -1, 8850, 824, 
-  -1, 8882, 824, -1, 8883, 824, -1, 8884, 
-  824, -1, 8885, 824, -1, 12296, -1, 12297, 
-  -1, 49, 48, -1, 49, 49, -1, 49, 
-  50, -1, 49, 51, -1, 49, 52, -1, 
-  49, 53, -1, 49, 54, -1, 49, 55, 
-  -1, 49, 56, -1, 49, 57, -1, 50, 
-  48, -1, 40, 49, 41, -1, 40, 50, 
-  41, -1, 40, 51, 41, -1, 40, 52, 
-  41, -1, 40, 53, 41, -1, 40, 54, 
-  41, -1, 40, 55, 41, -1, 40, 56, 
-  41, -1, 40, 57, 41, -1, 40, 49, 
-  48, 41, -1, 40, 49, 49, 41, -1, 
-  40, 49, 50, 41, -1, 40, 49, 51, 
-  41, -1, 40, 49, 52, 41, -1, 40, 
-  49, 53, 41, -1, 40, 49, 54, 41, 
-  -1, 40, 49, 55, 41, -1, 40, 49, 
-  56, 41, -1, 40, 49, 57, 41, -1, 
-  40, 50, 48, 41, -1, 49, 46, -1, 
-  50, 46, -1, 51, 46, -1, 52, 46, 
-  -1, 53, 46, -1, 54, 46, -1, 55, 
-  46, -1, 56, 46, -1, 57, 46, -1, 
-  49, 48, 46, -1, 49, 49, 46, -1, 
-  49, 50, 46, -1, 49, 51, 46, -1, 
-  49, 52, 46, -1, 49, 53, 46, -1, 
-  49, 54, 46, -1, 49, 55, 46, -1, 
-  49, 56, 46, -1, 49, 57, 46, -1, 
-  50, 48, 46, -1, 40, 97, 41, -1, 
-  40, 98, 41, -1, 40, 99, 41, -1, 
-  40, 100, 41, -1, 40, 101, 41, -1, 
-  40, 102, 41, -1, 40, 103, 41, -1, 
-  40, 104, 41, -1, 40, 105, 41, -1, 
-  40, 106, 41, -1, 40, 107, 41, -1, 
-  40, 108, 41, -1, 40, 109, 41, -1, 
-  40, 110, 41, -1, 40, 111, 41, -1, 
-  40, 112, 41, -1, 40, 113, 41, -1, 
-  40, 114, 41, -1, 40, 115, 41, -1, 
-  40, 116, 41, -1, 40, 117, 41, -1, 
-  40, 118, 41, -1, 40, 119, 41, -1, 
-  40, 120, 41, -1, 40, 121, 41, -1, 
-  40, 122, 41, -1, 9424, -1, 9425, -1, 
-  9426, -1, 9427, -1, 9428, -1, 9429, -1, 
-  9430, -1, 9431, -1, 9432, -1, 9433, -1, 
-  9434, -1, 9435, -1, 9436, -1, 9437, -1, 
-  9438, -1, 9439, -1, 9440, -1, 9441, -1, 
-  83, -1, 9442, -1, 9443, -1, 9444, -1, 
-  9445, -1, 9446, -1, 9447, -1, 89, -1, 
-  9448, -1, 9449, -1, 8747, 8747, 8747, 8747, 
-  -1, 58, 58, 61, -1, 61, 61, -1, 
-  61, 61, 61, -1, 10973, 824, -1, 11312, 
-  -1, 11313, -1, 11314, -1, 11315, -1, 11316, 
-  -1, 11317, -1, 11318, -1, 11319, -1, 11320, 
-  -1, 11321, -1, 11322, -1, 11323, -1, 11324, 
-  -1, 11325, -1, 11326, -1, 11327, -1, 11328, 
-  -1, 11329, -1, 11330, -1, 11331, -1, 11332, 
-  -1, 11333, -1, 11334, -1, 11335, -1, 11336, 
-  -1, 11337, -1, 11338, -1, 11339, -1, 11340, 
-  -1, 11341, -1, 11342, -1, 11343, -1, 11344, 
-  -1, 11345, -1, 11346, -1, 11347, -1, 11348, 
-  -1, 11349, -1, 11350, -1, 11351, -1, 11352, 
-  -1, 11353, -1, 11354, -1, 11355, -1, 11356, 
-  -1, 11357, -1, 11358, -1, 11361, -1, 619, 
-  -1, 7549, -1, 637, -1, 11368, -1, 11370, 
-  -1, 11372, -1, 11382, -1, 11393, -1, 11395, 
-  -1, 11397, -1, 11399, -1, 11401, -1, 11403, 
-  -1, 11405, -1, 11407, -1, 11409, -1, 11411, 
-  -1, 11413, -1, 11415, -1, 11417, -1, 11419, 
-  -1, 11421, -1, 11423, -1, 11425, -1, 11427, 
-  -1, 11429, -1, 11431, -1, 11433, -1, 11435, 
-  -1, 11437, -1, 11439, -1, 11441, -1, 11443, 
-  -1, 11445, -1, 11447, -1, 11449, -1, 11451, 
-  -1, 11453, -1, 11455, -1, 11457, -1, 11459, 
-  -1, 11461, -1, 11463, -1, 11465, -1, 11467, 
-  -1, 11469, -1, 11471, -1, 11473, -1, 11475, 
-  -1, 11477, -1, 11479, -1, 11481, -1, 11483, 
-  -1, 11485, -1, 11487, -1, 11489, -1, 11491, 
-  -1, 11617, -1, 27597, -1, 40863, -1, 19968, 
-  -1, 20008, -1, 20022, -1, 20031, -1, 20057, 
-  -1, 20101, -1, 20108, -1, 20128, -1, 20154, 
-  -1, 20799, -1, 20837, -1, 20843, -1, 20866, 
-  -1, 20886, -1, 20907, -1, 20960, -1, 20981, 
-  -1, 20992, -1, 21147, -1, 21241, -1, 21269, 
-  -1, 21274, -1, 21304, -1, 21313, -1, 21340, 
-  -1, 21353, -1, 21378, -1, 21430, -1, 21448, 
-  -1, 21475, -1, 22231, -1, 22303, -1, 22763, 
-  -1, 22786, -1, 22794, -1, 22805, -1, 22823, 
-  -1, 22899, -1, 23376, -1, 23424, -1, 23544, 
-  -1, 23567, -1, 23586, -1, 23608, -1, 23662, 
-  -1, 23665, -1, 24027, -1, 24037, -1, 24049, 
-  -1, 24062, -1, 24178, -1, 24186, -1, 24191, 
-  -1, 24308, -1, 24318, -1, 24331, -1, 24339, 
-  -1, 24400, -1, 24417, -1, 24435, -1, 24515, 
-  -1, 25096, -1, 25142, -1, 25163, -1, 25903, 
-  -1, 25908, -1, 25991, -1, 26007, -1, 26020, 
-  -1, 26041, -1, 26080, -1, 26085, -1, 26352, 
-  -1, 26376, -1, 26408, -1, 27424, -1, 27490, 
-  -1, 27513, -1, 27571, -1, 27595, -1, 27604, 
-  -1, 27611, -1, 27663, -1, 27668, -1, 27700, 
-  -1, 28779, -1, 29226, -1, 29238, -1, 29243, 
-  -1, 29247, -1, 29255, -1, 29273, -1, 29275, 
-  -1, 29356, -1, 29572, -1, 29577, -1, 29916, 
-  -1, 29926, -1, 29976, -1, 29983, -1, 29992, 
-  -1, 30000, -1, 30091, -1, 30098, -1, 30326, 
-  -1, 30333, -1, 30382, -1, 30399, -1, 30446, 
-  -1, 30683, -1, 30690, -1, 30707, -1, 31034, 
-  -1, 31160, -1, 31166, -1, 31348, -1, 31435, 
-  -1, 31481, -1, 31859, -1, 31992, -1, 32566, 
-  -1, 32593, -1, 32650, -1, 32701, -1, 32769, 
-  -1, 32780, -1, 32786, -1, 32819, -1, 32895, 
-  -1, 32905, -1, 33251, -1, 33258, -1, 33267, 
-  -1, 33276, -1, 33292, -1, 33307, -1, 33311, 
-  -1, 33390, -1, 33394, -1, 33400, -1, 34381, 
-  -1, 34411, -1, 34880, -1, 34892, -1, 34915, 
-  -1, 35198, -1, 35211, -1, 35282, -1, 35328, 
-  -1, 35895, -1, 35910, -1, 35925, -1, 35960, 
-  -1, 35997, -1, 36196, -1, 36208, -1, 36275, 
-  -1, 36523, -1, 36554, -1, 36763, -1, 36784, 
-  -1, 36789, -1, 37009, -1, 37193, -1, 37318, 
-  -1, 37324, -1, 37329, -1, 38263, -1, 38272, 
-  -1, 38428, -1, 38582, -1, 38585, -1, 38632, 
-  -1, 38737, -1, 38750, -1, 38754, -1, 38761, 
-  -1, 38859, -1, 38893, -1, 38899, -1, 38913, 
-  -1, 39080, -1, 39131, -1, 39135, -1, 39318, 
-  -1, 39321, -1, 39340, -1, 39592, -1, 39640, 
-  -1, 39647, -1, 39717, -1, 39727, -1, 39730, 
-  -1, 39740, -1, 39770, -1, 40165, -1, 40565, 
-  -1, 40575, -1, 40613, -1, 40635, -1, 40643, 
-  -1, 40653, -1, 40657, -1, 40697, -1, 40701, 
-  -1, 40718, -1, 40723, -1, 40736, -1, 40763, 
-  -1, 40778, -1, 40786, -1, 40845, -1, 40860, 
-  -1, 40864, -1, 12306, -1, 21316, -1, 21317, 
-  -1, 12363, 12441, -1, 12365, 12441, -1, 12367, 
-  12441, -1, 12369, 12441, -1, 12371, 12441, -1, 
-  12373, 12441, -1, 12375, 12441, -1, 12377, 12441, 
-  -1, 12379, 12441, -1, 12381, 12441, -1, 12383, 
-  12441, -1, 12385, 12441, -1, 12388, 12441, -1, 
-  12390, 12441, -1, 12392, 12441, -1, 12399, 12441, 
-  -1, 12399, 12442, -1, 12402, 12441, -1, 12402, 
-  12442, -1, 12405, 12441, -1, 12405, 12442, -1, 
-  12408, 12441, -1, 12408, 12442, -1, 12411, 12441, 
-  -1, 12411, 12442, -1, 12358, 12441, -1, 32, 
-  12441, -1, 32, 12442, -1, 12445, 12441, -1, 
-  12424, 12426, -1, 12459, 12441, -1, 12461, 12441, 
-  -1, 12463, 12441, -1, 12465, 12441, -1, 12467, 
-  12441, -1, 12469, 12441, -1, 12471, 12441, -1, 
-  12473, 12441, -1, 12475, 12441, -1, 12477, 12441, 
-  -1, 12479, 12441, -1, 12481, 12441, -1, 12484, 
-  12441, -1, 12486, 12441, -1, 12488, 12441, -1, 
-  12495, 12441, -1, 12495, 12442, -1, 12498, 12441, 
-  -1, 12498, 12442, -1, 12501, 12441, -1, 12501, 
-  12442, -1, 12504, 12441, -1, 12504, 12442, -1, 
-  12507, 12441, -1, 12507, 12442, -1, 12454, 12441, 
-  -1, 12527, 12441, -1, 12528, 12441, -1, 12529, 
-  12441, -1, 12530, 12441, -1, 12541, 12441, -1, 
-  12467, 12488, -1, 4352, -1, 4353, -1, 4522, 
-  -1, 4354, -1, 4524, -1, 4525, -1, 4355, 
-  -1, 4356, -1, 4357, -1, 4528, -1, 4529, 
-  -1, 4530, -1, 4531, -1, 4532, -1, 4533, 
-  -1, 4378, -1, 4358, -1, 4359, -1, 4360, 
-  -1, 4385, -1, 4361, -1, 4362, -1, 4363, 
-  -1, 4364, -1, 4365, -1, 4366, -1, 4367, 
-  -1, 4368, -1, 4369, -1, 4370, -1, 4449, 
-  -1, 4450, -1, 4451, -1, 4452, -1, 4453, 
-  -1, 4454, -1, 4455, -1, 4456, -1, 4457, 
-  -1, 4458, -1, 4459, -1, 4460, -1, 4461, 
-  -1, 4462, -1, 4463, -1, 4464, -1, 4465, 
-  -1, 4466, -1, 4467, -1, 4468, -1, 4469, 
-  -1, 4448, -1, 4372, -1, 4373, -1, 4551, 
-  -1, 4552, -1, 4556, -1, 4558, -1, 4563, 
-  -1, 4567, -1, 4569, -1, 4380, -1, 4573, 
-  -1, 4575, -1, 4381, -1, 4382, -1, 4384, 
-  -1, 4386, -1, 4387, -1, 4391, -1, 4393, 
-  -1, 4395, -1, 4396, -1, 4397, -1, 4398, 
-  -1, 4399, -1, 4402, -1, 4406, -1, 4416, 
-  -1, 4423, -1, 4428, -1, 4593, -1, 4594, 
-  -1, 4439, -1, 4440, -1, 4441, -1, 4484, 
-  -1, 4485, -1, 4488, -1, 4497, -1, 4498, 
-  -1, 4500, -1, 4510, -1, 4513, -1, 19977, 
-  -1, 22235, -1, 19978, -1, 20013, -1, 19979, 
-  -1, 30002, -1, 19993, -1, 19969, -1, 22825, 
-  -1, 22320, -1, 40, 4352, 41, -1, 40, 
-  4354, 41, -1, 40, 4355, 41, -1, 40, 
-  4357, 41, -1, 40, 4358, 41, -1, 40, 
-  4359, 41, -1, 40, 4361, 41, -1, 40, 
-  4363, 41, -1, 40, 4364, 41, -1, 40, 
-  4366, 41, -1, 40, 4367, 41, -1, 40, 
-  4368, 41, -1, 40, 4369, 41, -1, 40, 
-  4370, 41, -1, 40, 4352, 4449, 41, -1, 
-  40, 4354, 4449, 41, -1, 40, 4355, 4449, 
-  41, -1, 40, 4357, 4449, 41, -1, 40, 
-  4358, 4449, 41, -1, 40, 4359, 4449, 41, 
-  -1, 40, 4361, 4449, 41, -1, 40, 4363, 
-  4449, 41, -1, 40, 4364, 4449, 41, -1, 
-  40, 4366, 4449, 41, -1, 40, 4367, 4449, 
-  41, -1, 40, 4368, 4449, 41, -1, 40, 
-  4369, 4449, 41, -1, 40, 4370, 4449, 41, 
-  -1, 40, 4364, 4462, 41, -1, 40, 4363, 
-  4457, 4364, 4453, 4523, 41, -1, 40, 4363, 
-  4457, 4370, 4462, 41, -1, 40, 19968, 41, 
-  -1, 40, 20108, 41, -1, 40, 19977, 41, 
-  -1, 40, 22235, 41, -1, 40, 20116, 41, 
-  -1, 40, 20845, 41, -1, 40, 19971, 41, 
-  -1, 40, 20843, 41, -1, 40, 20061, 41, 
-  -1, 40, 21313, 41, -1, 40, 26376, 41, 
-  -1, 40, 28779, 41, -1, 40, 27700, 41, 
-  -1, 40, 26408, 41, -1, 40, 37329, 41, 
-  -1, 40, 22303, 41, -1, 40, 26085, 41, 
-  -1, 40, 26666, 41, -1, 40, 26377, 41, 
-  -1, 40, 31038, 41, -1, 40, 21517, 41, 
-  -1, 40, 29305, 41, -1, 40, 36001, 41, 
-  -1, 40, 31069, 41, -1, 40, 21172, 41, 
-  -1, 40, 20195, 41, -1, 40, 21628, 41, 
-  -1, 40, 23398, 41, -1, 40, 30435, 41, 
-  -1, 40, 20225, 41, -1, 40, 36039, 41, 
-  -1, 40, 21332, 41, -1, 40, 31085, 41, 
-  -1, 40, 20241, 41, -1, 40, 33258, 41, 
-  -1, 40, 33267, 41, -1, 80, 84, 69, 
-  -1, 50, 49, -1, 50, 50, -1, 50, 
-  51, -1, 50, 52, -1, 50, 53, -1, 
-  50, 54, -1, 50, 55, -1, 50, 56, 
-  -1, 50, 57, -1, 51, 48, -1, 51, 
-  49, -1, 51, 50, -1, 51, 51, -1, 
-  51, 52, -1, 51, 53, -1, 4352, 4449, 
-  -1, 4354, 4449, -1, 4355, 4449, -1, 4357, 
-  4449, -1, 4358, 4449, -1, 4359, 4449, -1, 
-  4361, 4449, -1, 4363, 4449, -1, 4364, 4449, 
-  -1, 4366, 4449, -1, 4367, 4449, -1, 4368, 
-  4449, -1, 4369, 4449, -1, 4370, 4449, -1, 
-  4366, 4449, 4535, 4352, 4457, -1, 4364, 4462, 
-  4363, 4468, -1, 4363, 4462, -1, 20116, -1, 
-  20845, -1, 19971, -1, 20061, -1, 26666, -1, 
-  26377, -1, 31038, -1, 21517, -1, 29305, -1, 
-  36001, -1, 31069, -1, 21172, -1, 31192, -1, 
-  30007, -1, 36969, -1, 20778, -1, 21360, -1, 
-  27880, -1, 38917, -1, 20241, -1, 20889, -1, 
-  27491, -1, 24038, -1, 21491, -1, 21307, -1, 
-  23447, -1, 23398, -1, 30435, -1, 20225, -1, 
-  36039, -1, 21332, -1, 22812, -1, 51, 54, 
-  -1, 51, 55, -1, 51, 56, -1, 51, 
-  57, -1, 52, 48, -1, 52, 49, -1, 
-  52, 50, -1, 52, 51, -1, 52, 52, 
-  -1, 52, 53, -1, 52, 54, -1, 52, 
-  55, -1, 52, 56, -1, 52, 57, -1, 
-  53, 48, -1, 49, 26376, -1, 50, 26376, 
-  -1, 51, 26376, -1, 52, 26376, -1, 53, 
-  26376, -1, 54, 26376, -1, 55, 26376, -1, 
-  56, 26376, -1, 57, 26376, -1, 49, 48, 
-  26376, -1, 49, 49, 26376, -1, 49, 50, 
-  26376, -1, 72, 103, -1, 101, 114, 103, 
-  -1, 101, 86, -1, 76, 84, 68, -1, 
-  12450, -1, 12452, -1, 12454, -1, 12456, -1, 
-  12458, -1, 12459, -1, 12461, -1, 12463, -1, 
-  12465, -1, 12467, -1, 12469, -1, 12471, -1, 
-  12473, -1, 12475, -1, 12477, -1, 12479, -1, 
-  12481, -1, 12484, -1, 12486, -1, 12488, -1, 
-  12490, -1, 12491, -1, 12492, -1, 12493, -1, 
-  12494, -1, 12495, -1, 12498, -1, 12501, -1, 
-  12504, -1, 12507, -1, 12510, -1, 12511, -1, 
-  12512, -1, 12513, -1, 12514, -1, 12516, -1, 
-  12518, -1, 12520, -1, 12521, -1, 12522, -1, 
-  12523, -1, 12524, -1, 12525, -1, 12527, -1, 
-  12528, -1, 12529, -1, 12530, -1, 12450, 12497, 
-  12540, 12488, -1, 12450, 12523, 12501, 12449, -1, 
-  12450, 12531, 12506, 12450, -1, 12450, 12540, 12523, 
-  -1, 12452, 12491, 12531, 12464, -1, 12452, 12531, 
-  12481, -1, 12454, 12457, 12531, -1, 12456, 12473, 
-  12463, 12540, 12489, -1, 12456, 12540, 12459, 12540, 
-  -1, 12458, 12531, 12473, -1, 12458, 12540, 12512, 
-  -1, 12459, 12452, 12522, -1, 12459, 12521, 12483, 
-  12488, -1, 12459, 12525, 12522, 12540, -1, 12460, 
-  12525, 12531, -1, 12460, 12531, 12510, -1, 12462, 
-  12460, -1, 12462, 12491, 12540, -1, 12461, 12517, 
-  12522, 12540, -1, 12462, 12523, 12480, 12540, -1, 
-  12461, 12525, -1, 12461, 12525, 12464, 12521, 12512, 
-  -1, 12461, 12525, 12513, 12540, 12488, 12523, -1, 
-  12461, 12525, 12527, 12483, 12488, -1, 12464, 12521, 
-  12512, -1, 12464, 12521, 12512, 12488, 12531, -1, 
-  12463, 12523, 12476, 12452, 12525, -1, 12463, 12525, 
-  12540, 12493, -1, 12465, 12540, 12473, -1, 12467, 
-  12523, 12490, -1, 12467, 12540, 12509, -1, 12469, 
-  12452, 12463, 12523, -1, 12469, 12531, 12481, 12540, 
-  12512, -1, 12471, 12522, 12531, 12464, -1, 12475, 
-  12531, 12481, -1, 12475, 12531, 12488, -1, 12480, 
-  12540, 12473, -1, 12487, 12471, -1, 12489, 12523, 
-  -1, 12488, 12531, -1, 12490, 12494, -1, 12494, 
-  12483, 12488, -1, 12495, 12452, 12484, -1, 12497, 
-  12540, 12475, 12531, 12488, -1, 12497, 12540, 12484, 
-  -1, 12496, 12540, 12524, 12523, -1, 12500, 12450, 
-  12473, 12488, 12523, -1, 12500, 12463, 12523, -1, 
-  12500, 12467, -1, 12499, 12523, -1, 12501, 12449, 
-  12521, 12483, 12489, -1, 12501, 12451, 12540, 12488, 
-  -1, 12502, 12483, 12471, 12455, 12523, -1, 12501, 
-  12521, 12531, -1, 12504, 12463, 12479, 12540, 12523, 
-  -1, 12506, 12477, -1, 12506, 12491, 12498, -1, 
-  12504, 12523, 12484, -1, 12506, 12531, 12473, -1, 
-  12506, 12540, 12472, -1, 12505, 12540, 12479, -1, 
-  12509, 12452, 12531, 12488, -1, 12508, 12523, 12488, 
-  -1, 12507, 12531, -1, 12509, 12531, 12489, -1, 
-  12507, 12540, 12523, -1, 12507, 12540, 12531, -1, 
-  12510, 12452, 12463, 12525, -1, 12510, 12452, 12523, 
-  -1, 12510, 12483, 12495, -1, 12510, 12523, 12463, 
-  -1, 12510, 12531, 12471, 12519, 12531, -1, 12511, 
-  12463, 12525, 12531, -1, 12511, 12522, -1, 12511, 
-  12522, 12496, 12540, 12523, -1, 12513, 12460, -1, 
-  12513, 12460, 12488, 12531, -1, 12513, 12540, 12488, 
-  12523, -1, 12516, 12540, 12489, -1, 12516, 12540, 
-  12523, -1, 12518, 12450, 12531, -1, 12522, 12483, 
-  12488, 12523, -1, 12522, 12521, -1, 12523, 12500, 
-  12540, -1, 12523, 12540, 12502, 12523, -1, 12524, 
-  12512, -1, 12524, 12531, 12488, 12466, 12531, -1, 
-  12527, 12483, 12488, -1, 48, 28857, -1, 49, 
-  28857, -1, 50, 28857, -1, 51, 28857, -1, 
-  52, 28857, -1, 53, 28857, -1, 54, 28857, 
-  -1, 55, 28857, -1, 56, 28857, -1, 57, 
-  28857, -1, 49, 48, 28857, -1, 49, 49, 
-  28857, -1, 49, 50, 28857, -1, 49, 51, 
-  28857, -1, 49, 52, 28857, -1, 49, 53, 
-  28857, -1, 49, 54, 28857, -1, 49, 55, 
-  28857, -1, 49, 56, 28857, -1, 49, 57, 
-  28857, -1, 50, 48, 28857, -1, 50, 49, 
-  28857, -1, 50, 50, 28857, -1, 50, 51, 
-  28857, -1, 50, 52, 28857, -1, 104, 80, 
-  97, -1, 100, 97, -1, 65, 85, -1, 
-  98, 97, 114, -1, 111, 86, -1, 112, 
-  99, -1, 100, 109, -1, 100, 109, 178, 
-  -1, 100, 109, 179, -1, 73, 85, -1, 
-  24179, 25104, -1, 26157, 21644, -1, 22823, 27491, 
-  -1, 26126, 27835, -1, 26666, 24335, 20250, 31038, 
-  -1, 112, 65, -1, 110, 65, -1, 956, 
-  65, -1, 109, 65, -1, 107, 65, -1, 
-  75, 66, -1, 77, 66, -1, 71, 66, 
-  -1, 99, 97, 108, -1, 107, 99, 97, 
-  108, -1, 112, 70, -1, 110, 70, -1, 
-  956, 70, -1, 956, 103, -1, 109, 103, 
-  -1, 107, 103, -1, 72, 122, -1, 107, 
-  72, 122, -1, 77, 72, 122, -1, 71, 
-  72, 122, -1, 84, 72, 122, -1, 956, 
-  8467, -1, 109, 8467, -1, 100, 8467, -1, 
-  107, 8467, -1, 102, 109, -1, 110, 109, 
-  -1, 956, 109, -1, 109, 109, -1, 99, 
-  109, -1, 107, 109, -1, 109, 109, 178, 
-  -1, 99, 109, 178, -1, 109, 178, -1, 
-  107, 109, 178, -1, 109, 109, 179, -1, 
-  99, 109, 179, -1, 109, 179, -1, 107, 
-  109, 179, -1, 109, 8725, 115, -1, 109, 
-  8725, 115, 178, -1, 80, 97, -1, 107, 
-  80, 97, -1, 77, 80, 97, -1, 71, 
-  80, 97, -1, 114, 97, 100, -1, 114, 
-  97, 100, 8725, 115, -1, 114, 97, 100, 
-  8725, 115, 178, -1, 112, 115, -1, 110, 
-  115, -1, 956, 115, -1, 109, 115, -1, 
-  112, 86, -1, 110, 86, -1, 956, 86, 
-  -1, 109, 86, -1, 107, 86, -1, 77, 
-  86, -1, 112, 87, -1, 110, 87, -1, 
-  956, 87, -1, 109, 87, -1, 107, 87, 
-  -1, 77, 87, -1, 107, 937, -1, 77, 
-  937, -1, 97, 46, 109, 46, -1, 66, 
-  113, -1, 99, 99, -1, 99, 100, -1, 
-  67, 8725, 107, 103, -1, 67, 111, 46, 
-  -1, 100, 66, -1, 71, 121, -1, 104, 
-  97, -1, 72, 80, -1, 105, 110, -1, 
-  75, 75, -1, 75, 77, -1, 107, 116, 
-  -1, 108, 109, -1, 108, 110, -1, 108, 
-  111, 103, -1, 108, 120, -1, 109, 98, 
-  -1, 109, 105, 108, -1, 109, 111, 108, 
-  -1, 80, 72, -1, 112, 46, 109, 46, 
-  -1, 80, 80, 77, -1, 80, 82, -1, 
-  115, 114, -1, 83, 118, -1, 87, 98, 
-  -1, 86, 8725, 109, -1, 65, 8725, 109, 
-  -1, 49, 26085, -1, 50, 26085, -1, 51, 
-  26085, -1, 52, 26085, -1, 53, 26085, -1, 
-  54, 26085, -1, 55, 26085, -1, 56, 26085, 
-  -1, 57, 26085, -1, 49, 48, 26085, -1, 
-  49, 49, 26085, -1, 49, 50, 26085, -1, 
-  49, 51, 26085, -1, 49, 52, 26085, -1, 
-  49, 53, 26085, -1, 49, 54, 26085, -1, 
-  49, 55, 26085, -1, 49, 56, 26085, -1, 
-  49, 57, 26085, -1, 50, 48, 26085, -1, 
-  50, 49, 26085, -1, 50, 50, 26085, -1, 
-  50, 51, 26085, -1, 50, 52, 26085, -1, 
-  50, 53, 26085, -1, 50, 54, 26085, -1, 
-  50, 55, 26085, -1, 50, 56, 26085, -1, 
-  50, 57, 26085, -1, 51, 48, 26085, -1, 
-  51, 49, 26085, -1, 103, 97, 108, -1, 
-  35912, -1, 26356, -1, 36040, -1, 28369, -1, 
-  20018, -1, 21477, -1, 22865, -1, 21895, -1, 
-  22856, -1, 25078, -1, 30313, -1, 32645, -1, 
-  34367, -1, 34746, -1, 35064, -1, 37007, -1, 
-  27138, -1, 27931, -1, 28889, -1, 29662, -1, 
-  33853, -1, 37226, -1, 39409, -1, 20098, -1, 
-  21365, -1, 27396, -1, 29211, -1, 34349, -1, 
-  40478, -1, 23888, -1, 28651, -1, 34253, -1, 
-  35172, -1, 25289, -1, 33240, -1, 34847, -1, 
-  24266, -1, 26391, -1, 28010, -1, 29436, -1, 
-  37070, -1, 20358, -1, 20919, -1, 21214, -1, 
-  25796, -1, 27347, -1, 29200, -1, 30439, -1, 
-  34310, -1, 34396, -1, 36335, -1, 38706, -1, 
-  39791, -1, 40442, -1, 30860, -1, 31103, -1, 
-  32160, -1, 33737, -1, 37636, -1, 35542, -1, 
-  22751, -1, 24324, -1, 31840, -1, 32894, -1, 
-  29282, -1, 30922, -1, 36034, -1, 38647, -1, 
-  22744, -1, 23650, -1, 27155, -1, 28122, -1, 
-  28431, -1, 32047, -1, 32311, -1, 38475, -1, 
-  21202, -1, 32907, -1, 20956, -1, 20940, -1, 
-  31260, -1, 32190, -1, 33777, -1, 38517, -1, 
-  35712, -1, 25295, -1, 35582, -1, 20025, -1, 
-  23527, -1, 24594, -1, 29575, -1, 30064, -1, 
-  21271, -1, 30971, -1, 20415, -1, 24489, -1, 
-  19981, -1, 27852, -1, 25976, -1, 32034, -1, 
-  21443, -1, 22622, -1, 30465, -1, 33865, -1, 
-  35498, -1, 27578, -1, 27784, -1, 25342, -1, 
-  33509, -1, 25504, -1, 30053, -1, 20142, -1, 
-  20841, -1, 20937, -1, 26753, -1, 31975, -1, 
-  33391, -1, 35538, -1, 37327, -1, 21237, -1, 
-  21570, -1, 24300, -1, 26053, -1, 28670, -1, 
-  31018, -1, 38317, -1, 39530, -1, 40599, -1, 
-  40654, -1, 26310, -1, 27511, -1, 36706, -1, 
-  24180, -1, 24976, -1, 25088, -1, 25754, -1, 
-  28451, -1, 29001, -1, 29833, -1, 31178, -1, 
-  32244, -1, 32879, -1, 36646, -1, 34030, -1, 
-  36899, -1, 37706, -1, 21015, -1, 21155, -1, 
-  21693, -1, 28872, -1, 35010, -1, 24265, -1, 
-  24565, -1, 25467, -1, 27566, -1, 31806, -1, 
-  29557, -1, 20196, -1, 22265, -1, 23994, -1, 
-  24604, -1, 29618, -1, 29801, -1, 32666, -1, 
-  32838, -1, 37428, -1, 38646, -1, 38728, -1, 
-  38936, -1, 20363, -1, 31150, -1, 37300, -1, 
-  38584, -1, 24801, -1, 20102, -1, 20698, -1, 
-  23534, -1, 23615, -1, 26009, -1, 29134, -1, 
-  30274, -1, 34044, -1, 36988, -1, 26248, -1, 
-  38446, -1, 21129, -1, 26491, -1, 26611, -1, 
-  27969, -1, 28316, -1, 29705, -1, 30041, -1, 
-  30827, -1, 32016, -1, 39006, -1, 25134, -1, 
-  38520, -1, 20523, -1, 23833, -1, 28138, -1, 
-  36650, -1, 24459, -1, 24900, -1, 26647, -1, 
-  38534, -1, 21033, -1, 21519, -1, 23653, -1, 
-  26131, -1, 26446, -1, 26792, -1, 27877, -1, 
-  29702, -1, 30178, -1, 32633, -1, 35023, -1, 
-  35041, -1, 38626, -1, 21311, -1, 28346, -1, 
-  21533, -1, 29136, -1, 29848, -1, 34298, -1, 
-  38563, -1, 40023, -1, 40607, -1, 26519, -1, 
-  28107, -1, 33256, -1, 31520, -1, 31890, -1, 
-  29376, -1, 28825, -1, 35672, -1, 20160, -1, 
-  33590, -1, 21050, -1, 20999, -1, 24230, -1, 
-  25299, -1, 31958, -1, 23429, -1, 27934, -1, 
-  26292, -1, 36667, -1, 38477, -1, 24275, -1, 
-  20800, -1, 21952, -1, 22618, -1, 26228, -1, 
-  20958, -1, 29482, -1, 30410, -1, 31036, -1, 
-  31070, -1, 31077, -1, 31119, -1, 38742, -1, 
-  31934, -1, 34322, -1, 35576, -1, 36920, -1, 
-  37117, -1, 39151, -1, 39164, -1, 39208, -1, 
-  40372, -1, 20398, -1, 20711, -1, 20813, -1, 
-  21193, -1, 21220, -1, 21329, -1, 21917, -1, 
-  22022, -1, 22120, -1, 22592, -1, 22696, -1, 
-  23652, -1, 24724, -1, 24936, -1, 24974, -1, 
-  25074, -1, 25935, -1, 26082, -1, 26257, -1, 
-  26757, -1, 28023, -1, 28186, -1, 28450, -1, 
-  29038, -1, 29227, -1, 29730, -1, 30865, -1, 
-  31049, -1, 31048, -1, 31056, -1, 31062, -1, 
-  31117, -1, 31118, -1, 31296, -1, 31361, -1, 
-  31680, -1, 32265, -1, 32321, -1, 32626, -1, 
-  32773, -1, 33261, -1, 33401, -1, 33879, -1, 
-  35088, -1, 35222, -1, 35585, -1, 35641, -1, 
-  36051, -1, 36104, -1, 36790, -1, 38627, -1, 
-  38911, -1, 38971, -1, 20006, -1, 20917, -1, 
-  20840, -1, 20352, -1, 20805, -1, 20864, -1, 
-  21191, -1, 21242, -1, 21845, -1, 21913, -1, 
-  21986, -1, 22707, -1, 22852, -1, 22868, -1, 
-  23138, -1, 23336, -1, 24274, -1, 24281, -1, 
-  24425, -1, 24493, -1, 24792, -1, 24910, -1, 
-  24840, -1, 24928, -1, 25140, -1, 25540, -1, 
-  25628, -1, 25682, -1, 25942, -1, 26395, -1, 
-  26454, -1, 28379, -1, 28363, -1, 28702, -1, 
-  30631, -1, 29237, -1, 29359, -1, 29809, -1, 
-  29958, -1, 30011, -1, 30237, -1, 30239, -1, 
-  30427, -1, 30452, -1, 30538, -1, 30528, -1, 
-  30924, -1, 31409, -1, 31867, -1, 32091, -1, 
-  32574, -1, 33618, -1, 33775, -1, 34681, -1, 
-  35137, -1, 35206, -1, 35519, -1, 35531, -1, 
-  35565, -1, 35722, -1, 36664, -1, 36978, -1, 
-  37273, -1, 37494, -1, 38524, -1, 38875, -1, 
-  38923, -1, 39698, -1, 141386, -1, 141380, -1, 
-  144341, -1, 15261, -1, 16408, -1, 16441, -1, 
-  152137, -1, 154832, -1, 163539, -1, 40771, -1, 
-  40846, -1, 102, 102, -1, 102, 105, -1, 
-  102, 108, -1, 102, 102, 105, -1, 102, 
-  102, 108, -1, 383, 116, -1, 115, 116, 
-  -1, 1396, 1398, -1, 1396, 1381, -1, 1396, 
-  1387, -1, 1406, 1398, -1, 1396, 1389, -1, 
-  1497, 1460, -1, 1522, 1463, -1, 1506, -1, 
-  1492, -1, 1499, -1, 1500, -1, 1501, -1, 
-  1512, -1, 1514, -1, 1513, 1473, -1, 1513, 
-  1474, -1, 64329, 1473, -1, 64329, 1474, -1, 
-  1488, 1463, -1, 1488, 1464, -1, 1488, 1468, 
-  -1, 1489, 1468, -1, 1490, 1468, -1, 1491, 
-  1468, -1, 1492, 1468, -1, 1493, 1468, -1, 
-  1494, 1468, -1, 1496, 1468, -1, 1497, 1468, 
-  -1, 1498, 1468, -1, 1499, 1468, -1, 1500, 
-  1468, -1, 1502, 1468, -1, 1504, 1468, -1, 
-  1505, 1468, -1, 1507, 1468, -1, 1508, 1468, 
-  -1, 1510, 1468, -1, 1511, 1468, -1, 1512, 
-  1468, -1, 1513, 1468, -1, 1514, 1468, -1, 
-  1493, 1465, -1, 1489, 1471, -1, 1499, 1471, 
-  -1, 1508, 1471, -1, 1488, 1500, -1, 1649, 
-  -1, 1659, -1, 1662, -1, 1664, -1, 1658, 
-  -1, 1663, -1, 1657, -1, 1700, -1, 1702, 
-  -1, 1668, -1, 1667, -1, 1670, -1, 1671, 
-  -1, 1677, -1, 1676, -1, 1678, -1, 1672, 
-  -1, 1688, -1, 1681, -1, 1705, -1, 1711, 
-  -1, 1715, -1, 1713, -1, 1722, -1, 1723, 
-  -1, 1728, -1, 1729, -1, 1726, -1, 1746, 
-  -1, 1747, -1, 1709, -1, 1735, -1, 1734, 
-  -1, 1736, -1, 1655, -1, 1739, -1, 1733, 
-  -1, 1737, -1, 1744, -1, 1609, -1, 1574, 
-  1575, -1, 1574, 1749, -1, 1574, 1608, -1, 
-  1574, 1735, -1, 1574, 1734, -1, 1574, 1736, 
-  -1, 1574, 1744, -1, 1574, 1609, -1, 1740, 
-  -1, 1574, 1580, -1, 1574, 1581, -1, 1574, 
-  1605, -1, 1574, 1610, -1, 1576, 1580, -1, 
-  1576, 1581, -1, 1576, 1582, -1, 1576, 1605, 
-  -1, 1576, 1609, -1, 1576, 1610, -1, 1578, 
-  1580, -1, 1578, 1581, -1, 1578, 1582, -1, 
-  1578, 1605, -1, 1578, 1609, -1, 1578, 1610, 
-  -1, 1579, 1580, -1, 1579, 1605, -1, 1579, 
-  1609, -1, 1579, 1610, -1, 1580, 1581, -1, 
-  1580, 1605, -1, 1581, 1580, -1, 1581, 1605, 
-  -1, 1582, 1580, -1, 1582, 1581, -1, 1582, 
-  1605, -1, 1587, 1580, -1, 1587, 1581, -1, 
-  1587, 1582, -1, 1587, 1605, -1, 1589, 1581, 
-  -1, 1589, 1605, -1, 1590, 1580, -1, 1590, 
-  1581, -1, 1590, 1582, -1, 1590, 1605, -1, 
-  1591, 1581, -1, 1591, 1605, -1, 1592, 1605, 
-  -1, 1593, 1580, -1, 1593, 1605, -1, 1594, 
-  1580, -1, 1594, 1605, -1, 1601, 1580, -1, 
-  1601, 1581, -1, 1601, 1582, -1, 1601, 1605, 
-  -1, 1601, 1609, -1, 1601, 1610, -1, 1602, 
-  1581, -1, 1602, 1605, -1, 1602, 1609, -1, 
-  1602, 1610, -1, 1603, 1575, -1, 1603, 1580, 
-  -1, 1603, 1581, -1, 1603, 1582, -1, 1603, 
-  1604, -1, 1603, 1605, -1, 1603, 1609, -1, 
-  1603, 1610, -1, 1604, 1580, -1, 1604, 1581, 
-  -1, 1604, 1582, -1, 1604, 1605, -1, 1604, 
-  1609, -1, 1604, 1610, -1, 1605, 1580, -1, 
-  1605, 1581, -1, 1605, 1582, -1, 1605, 1605, 
-  -1, 1605, 1609, -1, 1605, 1610, -1, 1606, 
-  1580, -1, 1606, 1581, -1, 1606, 1582, -1, 
-  1606, 1605, -1, 1606, 1609, -1, 1606, 1610, 
-  -1, 1607, 1580, -1, 1607, 1605, -1, 1607, 
-  1609, -1, 1607, 1610, -1, 1610, 1580, -1, 
-  1610, 1581, -1, 1610, 1582, -1, 1610, 1605, 
-  -1, 1610, 1609, -1, 1610, 1610, -1, 1584, 
-  1648, -1, 1585, 1648, -1, 1609, 1648, -1, 
-  32, 1612, 1617, -1, 32, 1613, 1617, -1, 
-  32, 1614, 1617, -1, 32, 1615, 1617, -1, 
-  32, 1616, 1617, -1, 32, 1617, 1648, -1, 
-  1574, 1585, -1, 1574, 1586, -1, 1574, 1606, 
-  -1, 1576, 1585, -1, 1576, 1586, -1, 1576, 
-  1606, -1, 1578, 1585, -1, 1578, 1586, -1, 
-  1578, 1606, -1, 1579, 1585, -1, 1579, 1586, 
-  -1, 1579, 1606, -1, 1605, 1575, -1, 1606, 
-  1585, -1, 1606, 1586, -1, 1606, 1606, -1, 
-  1610, 1585, -1, 1610, 1586, -1, 1610, 1606, 
-  -1, 1574, 1582, -1, 1574, 1607, -1, 1576, 
-  1607, -1, 1578, 1607, -1, 1589, 1582, -1, 
-  1604, 1607, -1, 1606, 1607, -1, 1607, 1648, 
-  -1, 1610, 1607, -1, 1579, 1607, -1, 1587, 
-  1607, -1, 1588, 1605, -1, 1588, 1607, -1, 
-  1600, 1614, 1617, -1, 1600, 1615, 1617, -1, 
-  1600, 1616, 1617, -1, 1591, 1609, -1, 1591, 
-  1610, -1, 1593, 1609, -1, 1593, 1610, -1, 
-  1594, 1609, -1, 1594, 1610, -1, 1587, 1609, 
-  -1, 1587, 1610, -1, 1588, 1609, -1, 1588, 
-  1610, -1, 1581, 1609, -1, 1581, 1610, -1, 
-  1580, 1609, -1, 1580, 1610, -1, 1582, 1609, 
-  -1, 1582, 1610, -1, 1589, 1609, -1, 1589, 
-  1610, -1, 1590, 1609, -1, 1590, 1610, -1, 
-  1588, 1580, -1, 1588, 1581, -1, 1588, 1582, 
-  -1, 1588, 1585, -1, 1587, 1585, -1, 1589, 
-  1585, -1, 1590, 1585, -1, 1575, 1611, -1, 
-  1578, 1580, 1605, -1, 1578, 1581, 1580, -1, 
-  1578, 1581, 1605, -1, 1578, 1582, 1605, -1, 
-  1578, 1605, 1580, -1, 1578, 1605, 1581, -1, 
-  1578, 1605, 1582, -1, 1580, 1605, 1581, -1, 
-  1581, 1605, 1610, -1, 1581, 1605, 1609, -1, 
-  1587, 1581, 1580, -1, 1587, 1580, 1581, -1, 
-  1587, 1580, 1609, -1, 1587, 1605, 1581, -1, 
-  1587, 1605, 1580, -1, 1587, 1605, 1605, -1, 
-  1589, 1581, 1581, -1, 1589, 1605, 1605, -1, 
-  1588, 1581, 1605, -1, 1588, 1580, 1610, -1, 
-  1588, 1605, 1582, -1, 1588, 1605, 1605, -1, 
-  1590, 1581, 1609, -1, 1590, 1582, 1605, -1, 
-  1591, 1605, 1581, -1, 1591, 1605, 1605, -1, 
-  1591, 1605, 1610, -1, 1593, 1580, 1605, -1, 
-  1593, 1605, 1605, -1, 1593, 1605, 1609, -1, 
-  1594, 1605, 1605, -1, 1594, 1605, 1610, -1, 
-  1594, 1605, 1609, -1, 1601, 1582, 1605, -1, 
-  1602, 1605, 1581, -1, 1602, 1605, 1605, -1, 
-  1604, 1581, 1605, -1, 1604, 1581, 1610, -1, 
-  1604, 1581, 1609, -1, 1604, 1580, 1580, -1, 
-  1604, 1582, 1605, -1, 1604, 1605, 1581, -1, 
-  1605, 1581, 1580, -1, 1605, 1581, 1605, -1, 
-  1605, 1581, 1610, -1, 1605, 1580, 1581, -1, 
-  1605, 1580, 1605, -1, 1605, 1582, 1580, -1, 
-  1605, 1582, 1605, -1, 1605, 1580, 1582, -1, 
-  1607, 1605, 1580, -1, 1607, 1605, 1605, -1, 
-  1606, 1581, 1605, -1, 1606, 1581, 1609, -1, 
-  1606, 1580, 1605, -1, 1606, 1580, 1609, -1, 
-  1606, 1605, 1610, -1, 1606, 1605, 1609, -1, 
-  1610, 1605, 1605, -1, 1576, 1582, 1610, -1, 
-  1578, 1580, 1610, -1, 1578, 1580, 1609, -1, 
-  1578, 1582, 1610, -1, 1578, 1582, 1609, -1, 
-  1578, 1605, 1610, -1, 1578, 1605, 1609, -1, 
-  1580, 1605, 1610, -1, 1580, 1581, 1609, -1, 
-  1580, 1605, 1609, -1, 1587, 1582, 1609, -1, 
-  1589, 1581, 1610, -1, 1588, 1581, 1610, -1, 
-  1590, 1581, 1610, -1, 1604, 1580, 1610, -1, 
-  1604, 1605, 1610, -1, 1610, 1581, 1610, -1, 
-  1610, 1580, 1610, -1, 1610, 1605, 1610, -1, 
-  1605, 1605, 1610, -1, 1602, 1605, 1610, -1, 
-  1606, 1581, 1610, -1, 1593, 1605, 1610, -1, 
-  1603, 1605, 1610, -1, 1606, 1580, 1581, -1, 
-  1605, 1582, 1610, -1, 1604, 1580, 1605, -1, 
-  1603, 1605, 1605, -1, 1580, 1581, 1610, -1, 
-  1581, 1580, 1610, -1, 1605, 1580, 1610, -1, 
-  1601, 1605, 1610, -1, 1576, 1581, 1610, -1, 
-  1587, 1582, 1610, -1, 1606, 1580, 1610, -1, 
-  1589, 1604, 1746, -1, 1602, 1604, 1746, -1, 
-  1575, 1604, 1604, 1607, -1, 1575, 1603, 1576, 
-  1585, -1, 1605, 1581, 1605, 1583, -1, 1589, 
-  1604, 1593, 1605, -1, 1585, 1587, 1608, 1604, 
-  -1, 1593, 1604, 1610, 1607, -1, 1608, 1587, 
-  1604, 1605, -1, 1589, 1604, 1609, -1, 1589, 
-  1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 
-  1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 
-  1605, -1, 1580, 1604, 32, 1580, 1604, 1575, 
-  1604, 1607, -1, 1585, 1740, 1575, 1604, -1, 
-  44, -1, 12289, -1, 12290, -1, 58, -1, 
-  33, -1, 63, -1, 12310, -1, 12311, -1, 
-  8230, -1, 8229, -1, 8212, -1, 8211, -1, 
-  95, -1, 123, -1, 125, -1, 12308, -1, 
-  12309, -1, 12304, -1, 12305, -1, 12298, -1, 
-  12299, -1, 12300, -1, 12301, -1, 12302, -1, 
-  12303, -1, 91, -1, 93, -1, 8254, -1, 
-  35, -1, 38, -1, 42, -1, 45, -1, 
-  60, -1, 62, -1, 92, -1, 36, -1, 
-  37, -1, 64, -1, 32, 1611, -1, 1600, 
-  1611, -1, 32, 1612, -1, 32, 1613, -1, 
-  32, 1614, -1, 1600, 1614, -1, 32, 1615, 
-  -1, 1600, 1615, -1, 32, 1616, -1, 1600, 
-  1616, -1, 32, 1617, -1, 1600, 1617, -1, 
-  32, 1618, -1, 1600, 1618, -1, 1569, -1, 
-  1570, -1, 1571, -1, 1572, -1, 1573, -1, 
-  1574, -1, 1575, -1, 1576, -1, 1577, -1, 
-  1578, -1, 1579, -1, 1580, -1, 1581, -1, 
-  1582, -1, 1583, -1, 1584, -1, 1585, -1, 
-  1586, -1, 1587, -1, 1588, -1, 1589, -1, 
-  1590, -1, 1591, -1, 1592, -1, 1593, -1, 
-  1594, -1, 1601, -1, 1602, -1, 1603, -1, 
-  1604, -1, 1605, -1, 1606, -1, 1607, -1, 
-  1608, -1, 1610, -1, 1604, 1570, -1, 1604, 
-  1571, -1, 1604, 1573, -1, 1604, 1575, -1, 
-  34, -1, 39, -1, 47, -1, 65345, -1, 
-  65346, -1, 65347, -1, 65348, -1, 65349, -1, 
-  65350, -1, 65351, -1, 65352, -1, 65353, -1, 
-  65354, -1, 65355, -1, 65356, -1, 65357, -1, 
-  65358, -1, 65359, -1, 65360, -1, 65361, -1, 
-  65362, -1, 65363, -1, 65364, -1, 65365, -1, 
-  65366, -1, 65367, -1, 65368, -1, 65369, -1, 
-  65370, -1, 94, -1, 124, -1, 126, -1, 
-  10629, -1, 10630, -1, 12539, -1, 12449, -1, 
-  12451, -1, 12453, -1, 12455, -1, 12457, -1, 
-  12515, -1, 12517, -1, 12519, -1, 12483, -1, 
-  12540, -1, 12531, -1, 12441, -1, 12442, -1, 
-  12644, -1, 12593, -1, 12594, -1, 12595, -1, 
-  12596, -1, 12597, -1, 12598, -1, 12599, -1, 
-  12600, -1, 12601, -1, 12602, -1, 12603, -1, 
-  12604, -1, 12605, -1, 12606, -1, 12607, -1, 
-  12608, -1, 12609, -1, 12610, -1, 12611, -1, 
-  12612, -1, 12613, -1, 12614, -1, 12615, -1, 
-  12616, -1, 12617, -1, 12618, -1, 12619, -1, 
-  12620, -1, 12621, -1, 12622, -1, 12623, -1, 
-  12624, -1, 12625, -1, 12626, -1, 12627, -1, 
-  12628, -1, 12629, -1, 12630, -1, 12631, -1, 
-  12632, -1, 12633, -1, 12634, -1, 12635, -1, 
-  12636, -1, 12637, -1, 12638, -1, 12639, -1, 
-  12640, -1, 12641, -1, 12642, -1, 12643, -1, 
-  162, -1, 163, -1, 172, -1, 175, -1, 
-  166, -1, 165, -1, 8361, -1, 9474, -1, 
-  8592, -1, 8593, -1, 8594, -1, 8595, -1, 
-  9632, -1, 9675, -1, 66600, -1, 66601, -1, 
-  66602, -1, 66603, -1, 66604, -1, 66605, -1, 
-  66606, -1, 66607, -1, 66608, -1, 66609, -1, 
-  66610, -1, 66611, -1, 66612, -1, 66613, -1, 
-  66614, -1, 66615, -1, 66616, -1, 66617, -1, 
-  66618, -1, 66619, -1, 66620, -1, 66621, -1, 
-  66622, -1, 66623, -1, 66624, -1, 66625, -1, 
-  66626, -1, 66627, -1, 66628, -1, 66629, -1, 
-  66630, -1, 66631, -1, 66632, -1, 66633, -1, 
-  66634, -1, 66635, -1, 66636, -1, 66637, -1, 
-  66638, -1, 66639, -1, 119127, 119141, -1, 119128, 
-  119141, -1, 119135, 119150, -1, 119135, 119151, -1, 
-  119135, 119152, -1, 119135, 119153, -1, 119135, 119154, 
-  -1, 119225, 119141, -1, 119226, 119141, -1, 119227, 
-  119150, -1, 119228, 119150, -1, 119227, 119151, -1, 
-  119228, 119151, -1, 305, -1, 567, -1, 913, 
-  -1, 914, -1, 916, -1, 917, -1, 918, 
-  -1, 919, -1, 921, -1, 922, -1, 923, 
-  -1, 924, -1, 925, -1, 926, -1, 927, 
-  -1, 929, -1, 1012, -1, 932, -1, 934, 
-  -1, 935, -1, 936, -1, 8711, -1, 8706, 
-  -1, 1013, -1, 977, -1, 1008, -1, 981, 
-  -1, 1009, -1, 982, -1, 988, -1, 20029, 
-  -1, 20024, -1, 20033, -1, 131362, -1, 20320, 
-  -1, 20411, -1, 20482, -1, 20602, -1, 20633, 
-  -1, 20687, -1, 13470, -1, 132666, -1, 20820, 
-  -1, 20836, -1, 20855, -1, 132380, -1, 13497, 
-  -1, 20839, -1, 20877, -1, 132427, -1, 20887, 
-  -1, 20900, -1, 20172, -1, 20908, -1, 168415, 
-  -1, 20995, -1, 13535, -1, 21051, -1, 21062, 
-  -1, 21106, -1, 21111, -1, 13589, -1, 21253, 
-  -1, 21254, -1, 21321, -1, 21338, -1, 21363, 
-  -1, 21373, -1, 21375, -1, 133676, -1, 28784, 
-  -1, 21450, -1, 21471, -1, 133987, -1, 21483, 
-  -1, 21489, -1, 21510, -1, 21662, -1, 21560, 
-  -1, 21576, -1, 21608, -1, 21666, -1, 21750, 
-  -1, 21776, -1, 21843, -1, 21859, -1, 21892, 
-  -1, 21931, -1, 21939, -1, 21954, -1, 22294, 
-  -1, 22295, -1, 22097, -1, 22132, -1, 22766, 
-  -1, 22478, -1, 22516, -1, 22541, -1, 22411, 
-  -1, 22578, -1, 22577, -1, 22700, -1, 136420, 
-  -1, 22770, -1, 22775, -1, 22790, -1, 22810, 
-  -1, 22818, -1, 22882, -1, 136872, -1, 136938, 
-  -1, 23020, -1, 23067, -1, 23079, -1, 23000, 
-  -1, 23142, -1, 14062, -1, 14076, -1, 23304, 
-  -1, 23358, -1, 137672, -1, 23491, -1, 23512, 
-  -1, 23539, -1, 138008, -1, 23551, -1, 23558, 
-  -1, 24403, -1, 14209, -1, 23648, -1, 23744, 
-  -1, 23693, -1, 138724, -1, 23875, -1, 138726, 
-  -1, 23918, -1, 23915, -1, 23932, -1, 24033, 
-  -1, 24034, -1, 14383, -1, 24061, -1, 24104, 
-  -1, 24125, -1, 24169, -1, 14434, -1, 139651, 
-  -1, 14460, -1, 24240, -1, 24243, -1, 24246, 
-  -1, 172946, -1, 140081, -1, 33281, -1, 24354, 
-  -1, 14535, -1, 144056, -1, 156122, -1, 24418, 
-  -1, 24427, -1, 14563, -1, 24474, -1, 24525, 
-  -1, 24535, -1, 24569, -1, 24705, -1, 14650, 
-  -1, 14620, -1, 141012, -1, 24775, -1, 24904, 
-  -1, 24908, -1, 24954, -1, 25010, -1, 24996, 
-  -1, 25007, -1, 25054, -1, 25104, -1, 25115, 
-  -1, 25181, -1, 25265, -1, 25300, -1, 25424, 
-  -1, 142092, -1, 25405, -1, 25340, -1, 25448, 
-  -1, 25475, -1, 25572, -1, 142321, -1, 25634, 
-  -1, 25541, -1, 25513, -1, 14894, -1, 25705, 
-  -1, 25726, -1, 25757, -1, 25719, -1, 14956, 
-  -1, 25964, -1, 143370, -1, 26083, -1, 26360, 
-  -1, 26185, -1, 15129, -1, 15112, -1, 15076, 
-  -1, 20882, -1, 20885, -1, 26368, -1, 26268, 
-  -1, 32941, -1, 17369, -1, 26401, -1, 26462, 
-  -1, 26451, -1, 144323, -1, 15177, -1, 26618, 
-  -1, 26501, -1, 26706, -1, 144493, -1, 26766, 
-  -1, 26655, -1, 26900, -1, 26946, -1, 27043, 
-  -1, 27114, -1, 27304, -1, 145059, -1, 27355, 
-  -1, 15384, -1, 27425, -1, 145575, -1, 27476, 
-  -1, 15438, -1, 27506, -1, 27551, -1, 27579, 
-  -1, 146061, -1, 138507, -1, 146170, -1, 27726, 
-  -1, 146620, -1, 27839, -1, 27853, -1, 27751, 
-  -1, 27926, -1, 27966, -1, 28009, -1, 28024, 
-  -1, 28037, -1, 146718, -1, 27956, -1, 28207, 
-  -1, 28270, -1, 15667, -1, 28359, -1, 147153, 
-  -1, 28153, -1, 28526, -1, 147294, -1, 147342, 
-  -1, 28614, -1, 28729, -1, 28699, -1, 15766, 
-  -1, 28746, -1, 28797, -1, 28791, -1, 28845, 
-  -1, 132389, -1, 28997, -1, 148067, -1, 29084, 
-  -1, 148395, -1, 29224, -1, 29264, -1, 149000, 
-  -1, 29312, -1, 29333, -1, 149301, -1, 149524, 
-  -1, 29562, -1, 29579, -1, 16044, -1, 29605, 
-  -1, 16056, -1, 29767, -1, 29788, -1, 29829, 
-  -1, 29898, -1, 16155, -1, 29988, -1, 150582, 
-  -1, 30014, -1, 150674, -1, 139679, -1, 30224, 
-  -1, 151457, -1, 151480, -1, 151620, -1, 16380, 
-  -1, 16392, -1, 151795, -1, 151794, -1, 151833, 
-  -1, 151859, -1, 30494, -1, 30495, -1, 30603, 
-  -1, 16454, -1, 16534, -1, 152605, -1, 30798, 
-  -1, 16611, -1, 153126, -1, 153242, -1, 153285, 
-  -1, 31211, -1, 16687, -1, 31306, -1, 31311, 
-  -1, 153980, -1, 154279, -1, 31470, -1, 16898, 
-  -1, 154539, -1, 31686, -1, 31689, -1, 16935, 
-  -1, 154752, -1, 31954, -1, 17056, -1, 31976, 
-  -1, 31971, -1, 32000, -1, 155526, -1, 32099, 
-  -1, 17153, -1, 32199, -1, 32258, -1, 32325, 
-  -1, 17204, -1, 156200, -1, 156231, -1, 17241, 
-  -1, 156377, -1, 32634, -1, 156478, -1, 32661, 
-  -1, 32762, -1, 156890, -1, 156963, -1, 32864, 
-  -1, 157096, -1, 32880, -1, 144223, -1, 17365, 
-  -1, 32946, -1, 33027, -1, 17419, -1, 33086, 
-  -1, 23221, -1, 157607, -1, 157621, -1, 144275, 
-  -1, 144284, -1, 33284, -1, 36766, -1, 17515, 
-  -1, 33425, -1, 33419, -1, 33437, -1, 21171, 
-  -1, 33457, -1, 33459, -1, 33469, -1, 33510, 
-  -1, 158524, -1, 33565, -1, 33635, -1, 33709, 
-  -1, 33571, -1, 33725, -1, 33767, -1, 33619, 
-  -1, 33738, -1, 33740, -1, 33756, -1, 158774, 
-  -1, 159083, -1, 158933, -1, 17707, -1, 34033, 
-  -1, 34035, -1, 34070, -1, 160714, -1, 34148, 
-  -1, 159532, -1, 17757, -1, 17761, -1, 159665, 
-  -1, 159954, -1, 17771, -1, 34384, -1, 34407, 
-  -1, 34409, -1, 34473, -1, 34440, -1, 34574, 
-  -1, 34530, -1, 34600, -1, 34667, -1, 34694, 
-  -1, 17879, -1, 34785, -1, 34817, -1, 17913, 
-  -1, 34912, -1, 161383, -1, 35031, -1, 35038, 
-  -1, 17973, -1, 35066, -1, 13499, -1, 161966, 
-  -1, 162150, -1, 18110, -1, 18119, -1, 35488, 
-  -1, 162984, -1, 36011, -1, 36033, -1, 36123, 
-  -1, 36215, -1, 163631, -1, 133124, -1, 36299, 
-  -1, 36284, -1, 36336, -1, 133342, -1, 36564, 
-  -1, 165330, -1, 165357, -1, 37012, -1, 37105, 
-  -1, 37137, -1, 165678, -1, 37147, -1, 37432, 
-  -1, 37591, -1, 37592, -1, 37500, -1, 37881, 
-  -1, 37909, -1, 166906, -1, 38283, -1, 18837, 
-  -1, 38327, -1, 167287, -1, 18918, -1, 38595, 
-  -1, 23986, -1, 38691, -1, 168261, -1, 168474, 
-  -1, 19054, -1, 19062, -1, 38880, -1, 168970, 
-  -1, 19122, -1, 169110, -1, 38953, -1, 169398, 
-  -1, 39138, -1, 19251, -1, 39209, -1, 39335, 
-  -1, 39362, -1, 39422, -1, 19406, -1, 170800, 
-  -1, 40000, -1, 40189, -1, 19662, -1, 19693, 
-  -1, 40295, -1, 172238, -1, 19704, -1, 172293, 
-  -1, 172558, -1, 172689, -1, 19798, -1, 40702, 
-  -1, 40709, -1, 40719, -1, 40726, -1, 173568, 
-  -1, };
-
-const uint16_t utf8proc_stage1table[] = {
-  0, 256, 512, 768, 1024, 1280, 1536, 
-  1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 
-  3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 
-  5888, 6144, 6400, 6656, 6912, 2048, 7168, 7424, 
-  7680, 7936, 8192, 8448, 8704, 8960, 9216, 9472, 
-  9728, 9984, 10240, 10496, 10752, 11008, 11264, 11520, 
-  11776, 12032, 12288, 12544, 12800, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 13056, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  13312, 13568, 5376, 5376, 5376, 13824, 2048, 2048, 
-  14080, 14336, 2048, 2048, 2048, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  14592, 14848, 14848, 14848, 14848, 14848, 14848, 14848, 
-  14848, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15360, 15616, 15872, 16128, 16384, 16640, 
-  16896, 17152, 17408, 2048, 17664, 17920, 2048, 2048, 
-  2048, 18176, 18432, 18688, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 5376, 5376, 5376, 18944, 19200, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 19456, 19712, 19968, 20224, 20480, 20736, 20992, 
-  21248, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, 
-  5376, 5376, 5376, 5376, 5376, 5376, 5376, 21504, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 21760, 22016, 22272, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 22528, 22784, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 
-  2048, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  23040, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, 
-  23040, };
-
-const uint16_t utf8proc_stage2table[] = {
-  1, 1, 1, 1, 1, 1, 1, 
-  1, 1, 2, 3, 2, 4, 3, 1, 
-  1, 1, 1, 1, 1, 1, 1, 1, 
-  1, 1, 1, 1, 1, 5, 5, 5, 
-  6, 7, 8, 8, 9, 10, 9, 8, 
-  8, 11, 12, 8, 13, 14, 15, 14, 
-  14, 16, 16, 16, 16, 16, 16, 16, 
-  16, 16, 16, 14, 8, 17, 18, 19, 
-  8, 8, 20, 21, 22, 23, 24, 25, 
-  26, 27, 28, 29, 30, 31, 32, 33, 
-  34, 35, 36, 37, 38, 39, 40, 41, 
-  42, 43, 44, 45, 11, 8, 12, 46, 
-  47, 46, 48, 49, 50, 51, 52, 53, 
-  54, 55, 56, 57, 58, 59, 60, 61, 
-  62, 63, 64, 65, 66, 67, 68, 69, 
-  70, 71, 72, 73, 11, 74, 12, 74, 
-  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, 75, 8, 10, 10, 10, 10, 76, 
-  76, 77, 76, 78, 79, 74, 80, 76, 
-  81, 82, 83, 84, 85, 86, 87, 76, 
-  8, 88, 89, 90, 91, 92, 93, 94, 
-  8, 95, 96, 97, 98, 99, 100, 101, 
-  102, 103, 104, 105, 106, 107, 108, 109, 
-  110, 111, 112, 113, 114, 115, 116, 117, 
-  74, 118, 119, 120, 121, 122, 123, 124, 
-  125, 126, 127, 128, 129, 130, 131, 132, 
-  133, 134, 135, 136, 137, 138, 139, 140, 
-  141, 142, 143, 144, 145, 146, 147, 148, 
-  74, 149, 150, 151, 152, 153, 154, 155, 
-  156, 157, 158, 159, 160, 161, 162, 163, 
-  164, 165, 166, 167, 168, 169, 170, 171, 
-  172, 173, 174, 175, 176, 177, 178, 179, 
-  180, 181, 182, 183, 184, 185, 186, 187, 
-  188, 189, 190, 191, 192, 193, 194, 195, 
-  196, 197, 198, 199, 200, 201, 202, 203, 
-  204, 205, 206, 207, 208, 209, 210, 211, 
-  212, 213, 214, 215, 216, 217, 218, 219, 
-  220, 221, 222, 223, 224, 225, 226, 227, 
-  228, 229, 230, 231, 232, 233, 234, 235, 
-  236, 237, 238, 239, 240, 241, 242, 243, 
-  244, 245, 246, 247, 248, 249, 250, 251, 
-  252, 253, 254, 255, 256, 257, 258, 259, 
-  260, 261, 262, 263, 264, 265, 266, 267, 
-  268, 269, 270, 271, 272, 273, 274, 275, 
-  276, 277, 278, 279, 280, 281, 282, 283, 
-  284, 285, 286, 287, 288, 289, 290, 291, 
-  292, 293, 294, 295, 296, 297, 213, 298, 
-  299, 300, 301, 302, 303, 304, 305, 306, 
-  307, 308, 309, 310, 213, 311, 312, 313, 
-  314, 315, 316, 317, 318, 319, 320, 321, 
-  322, 323, 324, 213, 213, 325, 326, 327, 
-  328, 329, 330, 331, 332, 333, 334, 335, 
-  336, 337, 338, 213, 339, 340, 341, 213, 
-  342, 339, 339, 339, 339, 343, 344, 345, 
-  346, 347, 348, 349, 350, 351, 352, 353, 
-  354, 355, 356, 357, 358, 359, 360, 361, 
-  362, 363, 364, 365, 366, 367, 368, 369, 
-  370, 371, 372, 373, 374, 375, 376, 377, 
-  378, 379, 380, 381, 382, 383, 384, 385, 
-  386, 387, 388, 389, 390, 391, 392, 393, 
-  394, 395, 396, 397, 398, 399, 400, 401, 
-  402, 403, 404, 405, 406, 407, 408, 409, 
-  410, 411, 412, 413, 414, 415, 416, 417, 
-  418, 419, 420, 421, 422, 423, 424, 425, 
-  426, 427, 428, 429, 430, 431, 432, 433, 
-  434, 435, 213, 436, 437, 438, 439, 440, 
-  441, 442, 443, 444, 445, 446, 447, 448, 
-  449, 450, 451, 452, 453, 213, 213, 213, 
-  213, 213, 213, 454, 455, 456, 457, 458, 
-  213, 213, 459, 460, 461, 462, 463, 464, 
-  465, 466, 467, 468, 469, 470, 471, 472, 
-  473, 213, 213, 213, 474, 475, 213, 476, 
-  477, 213, 478, 213, 479, 213, 213, 213, 
-  213, 480, 213, 213, 481, 213, 213, 213, 
-  213, 482, 483, 213, 484, 213, 213, 213, 
-  485, 213, 213, 486, 213, 213, 487, 213, 
-  213, 213, 213, 213, 213, 213, 488, 213, 
-  213, 489, 213, 213, 490, 213, 213, 213, 
-  213, 491, 492, 493, 494, 495, 213, 213, 
-  213, 213, 213, 496, 213, 339, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 497, 498, 499, 500, 501, 502, 503, 
-  504, 505, 506, 506, 507, 507, 507, 507, 
-  507, 507, 507, 46, 46, 46, 46, 506, 
-  506, 506, 506, 506, 506, 506, 506, 506, 
-  506, 507, 507, 46, 46, 46, 46, 46, 
-  46, 508, 509, 510, 511, 512, 513, 46, 
-  46, 514, 515, 516, 517, 518, 46, 46, 
-  46, 46, 46, 46, 46, 46, 46, 507, 
-  46, 46, 46, 46, 46, 46, 46, 46, 
-  46, 46, 46, 46, 46, 46, 46, 46, 
-  46, 519, 520, 521, 522, 523, 524, 525, 
-  526, 527, 528, 529, 530, 531, 524, 524, 
-  532, 524, 533, 524, 534, 535, 536, 537, 
-  537, 537, 537, 536, 538, 537, 537, 537, 
-  537, 537, 539, 539, 540, 541, 542, 543, 
-  544, 545, 537, 537, 537, 537, 546, 547, 
-  537, 548, 549, 537, 537, 550, 550, 550, 
-  550, 551, 537, 537, 537, 537, 524, 524, 
-  524, 552, 553, 554, 555, 556, 557, 524, 
-  537, 537, 537, 524, 524, 524, 537, 537, 
-  558, 524, 524, 524, 537, 537, 537, 537, 
-  524, 536, 537, 537, 524, 559, 560, 560, 
-  559, 560, 560, 559, 524, 524, 524, 524, 
-  524, 524, 524, 524, 524, 524, 524, 524, 
-  524, 0, 0, 0, 0, 561, 46, 0, 
-  0, 0, 0, 562, 563, 564, 565, 566, 
-  0, 0, 0, 0, 0, 86, 567, 568, 
-  569, 570, 571, 572, 0, 573, 0, 574, 
-  575, 576, 577, 578, 579, 580, 581, 582, 
-  583, 584, 585, 586, 587, 588, 589, 590, 
-  591, 592, 593, 0, 594, 595, 596, 597, 
-  598, 599, 600, 601, 602, 603, 604, 605, 
-  606, 607, 608, 609, 610, 611, 612, 613, 
-  614, 615, 616, 617, 618, 619, 620, 621, 
-  622, 623, 624, 625, 626, 627, 628, 629, 
-  630, 631, 632, 633, 634, 635, 636, 637, 
-  0, 638, 639, 640, 641, 642, 643, 644, 
-  213, 645, 646, 647, 648, 649, 650, 651, 
-  652, 653, 654, 655, 656, 657, 658, 659, 
-  660, 661, 662, 663, 664, 665, 666, 667, 
-  668, 669, 670, 671, 213, 672, 673, 74, 
-  674, 675, 676, 677, 678, 213, 679, 680, 
-  681, 682, 683, 684, 685, 686, 687, 688, 
-  689, 690, 691, 692, 693, 694, 695, 696, 
-  697, 698, 699, 700, 701, 702, 703, 704, 
-  705, 706, 707, 708, 709, 710, 711, 712, 
-  713, 714, 715, 716, 717, 718, 719, 720, 
-  721, 722, 723, 724, 725, 726, 727, 728, 
-  729, 730, 731, 732, 733, 734, 735, 736, 
-  737, 738, 739, 740, 741, 742, 743, 744, 
-  745, 746, 747, 748, 749, 750, 751, 752, 
-  753, 754, 755, 756, 757, 758, 759, 760, 
-  761, 762, 763, 764, 765, 766, 767, 768, 
-  769, 770, 771, 772, 773, 774, 775, 776, 
-  777, 778, 779, 780, 781, 782, 783, 784, 
-  785, 786, 787, 788, 789, 790, 791, 792, 
-  793, 794, 795, 796, 797, 798, 799, 800, 
-  801, 802, 803, 804, 805, 806, 807, 808, 
-  809, 810, 811, 812, 524, 524, 524, 524, 
-  0, 813, 813, 814, 815, 816, 817, 818, 
-  819, 820, 821, 822, 823, 824, 825, 826, 
-  827, 828, 829, 830, 831, 832, 833, 834, 
-  835, 836, 837, 838, 839, 840, 841, 842, 
-  843, 844, 845, 846, 847, 848, 849, 850, 
-  851, 852, 853, 854, 855, 856, 857, 858, 
-  859, 860, 861, 862, 863, 864, 865, 866, 
-  867, 868, 869, 870, 871, 872, 873, 874, 
-  875, 876, 877, 878, 879, 880, 881, 882, 
-  883, 884, 885, 886, 887, 888, 889, 890, 
-  891, 892, 893, 894, 895, 896, 897, 898, 
-  899, 900, 901, 902, 903, 904, 905, 906, 
-  907, 908, 909, 910, 911, 912, 913, 914, 
-  915, 916, 917, 918, 919, 920, 921, 922, 
-  923, 924, 925, 926, 927, 928, 929, 930, 
-  931, 932, 933, 934, 935, 936, 937, 938, 
-  939, 940, 941, 942, 943, 944, 945, 946, 
-  947, 948, 949, 950, 951, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 952, 953, 954, 955, 956, 957, 
-  958, 959, 960, 961, 962, 963, 964, 965, 
-  966, 967, 968, 969, 970, 971, 972, 973, 
-  974, 975, 976, 977, 978, 979, 980, 981, 
-  982, 983, 984, 985, 986, 987, 988, 989, 
-  0, 0, 507, 990, 990, 990, 990, 990, 
-  990, 0, 991, 992, 993, 994, 995, 996, 
-  997, 998, 999, 1000, 1001, 1002, 1003, 1004, 
-  1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 
-  1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 
-  1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 
-  1029, 0, 990, 1030, 0, 0, 0, 0, 
-  0, 0, 537, 524, 524, 524, 524, 537, 
-  524, 524, 524, 1031, 537, 524, 524, 524, 
-  524, 524, 524, 537, 537, 537, 537, 537, 
-  537, 524, 524, 537, 524, 524, 1031, 1032, 
-  524, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 
-  1040, 1041, 1042, 1042, 1043, 1044, 1045, 1046, 
-  1047, 1046, 1048, 1049, 1046, 524, 537, 1046, 
-  1041, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 0, 0, 0, 0, 
-  0, 1050, 1050, 1050, 1046, 1046, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1051, 1051, 1051, 1051, 0, 0, 0, 
-  0, 0, 0, 0, 1052, 14, 1053, 76, 
-  76, 524, 524, 524, 524, 524, 524, 0, 
-  0, 0, 0, 0, 1053, 0, 0, 1053, 
-  1053, 0, 1054, 1055, 1056, 1057, 1058, 1059, 
-  1060, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 0, 0, 0, 0, 
-  0, 1061, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1062, 1054, 1063, 1064, 1065, 1066, 1067, 
-  1068, 1069, 1070, 1071, 1072, 1073, 1074, 537, 
-  524, 524, 524, 524, 524, 537, 524, 524, 
-  0, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 
-  1075, 1075, 1075, 9, 1076, 1076, 1053, 1054, 
-  1054, 1077, 1054, 1054, 1054, 1054, 1078, 1079, 
-  1080, 1081, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1082, 1083, 1084, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1085, 1086, 1053, 1087, 524, 
-  524, 524, 524, 524, 524, 524, 1051, 813, 
-  524, 524, 524, 524, 537, 524, 1061, 1061, 
-  524, 524, 76, 537, 524, 524, 537, 1054, 
-  1054, 16, 16, 16, 16, 16, 16, 16, 
-  16, 16, 16, 1054, 1054, 1054, 1088, 1088, 
-  1054, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 
-  1053, 1053, 1053, 1053, 1053, 1053, 1053, 0, 
-  80, 1054, 1089, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 524, 537, 524, 524, 537, 524, 524, 
-  537, 537, 537, 524, 537, 537, 524, 537, 
-  524, 524, 524, 537, 524, 537, 524, 537, 
-  524, 537, 524, 524, 0, 0, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 
-  1054, 1054, 1054, 1054, 1054, 1054, 1054, 1090, 
-  1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 
-  1090, 1090, 1054, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 
-  1091, 1091, 1091, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 524, 524, 524, 524, 
-  524, 524, 524, 537, 524, 1092, 1092, 76, 
-  8, 8, 8, 1092, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 1090, 1090, 1093, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 1094, 1095, 339, 339, 339, 339, 339, 
-  339, 1096, 1097, 339, 1098, 1099, 339, 339, 
-  339, 339, 339, 0, 0, 1100, 339, 1093, 
-  1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090, 
-  1090, 1090, 1093, 1093, 1093, 1093, 1101, 0, 
-  0, 339, 524, 537, 524, 524, 0, 0, 
-  0, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 
-  1109, 339, 339, 1090, 1090, 990, 990, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 990, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 339, 339, 339, 339, 
-  339, 0, 1090, 1093, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 0, 
-  339, 339, 0, 0, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 0, 0, 0, 339, 
-  339, 339, 339, 0, 0, 1111, 339, 1112, 
-  1093, 1093, 1090, 1090, 1090, 1090, 0, 0, 
-  1113, 1093, 0, 0, 1114, 1115, 1101, 339, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  1116, 0, 0, 0, 0, 1117, 1118, 0, 
-  1119, 339, 339, 1090, 1090, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 339, 339, 10, 10, 1120, 1120, 1120, 
-  1120, 1120, 1120, 812, 0, 0, 0, 0, 
-  0, 0, 1090, 1090, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 0, 0, 0, 0, 
-  339, 339, 0, 0, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 1121, 0, 339, 1122, 
-  0, 339, 339, 0, 0, 1111, 0, 1093, 
-  1093, 1093, 1090, 1090, 0, 0, 0, 0, 
-  1090, 1090, 0, 0, 1090, 1090, 1101, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 1123, 1124, 1125, 339, 0, 1126, 
-  0, 0, 0, 0, 0, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1090, 1090, 339, 339, 339, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 1090, 1090, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  339, 339, 339, 0, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 0, 339, 339, 
-  339, 339, 339, 0, 0, 1111, 339, 1093, 
-  1093, 1093, 1090, 1090, 1090, 1090, 1090, 0, 
-  1090, 1090, 1093, 0, 1093, 1093, 1101, 0, 
-  0, 339, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 1090, 1090, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 0, 10, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 1090, 1093, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 0, 
-  339, 339, 0, 0, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 0, 339, 339, 
-  339, 339, 339, 0, 0, 1111, 339, 1127, 
-  1090, 1093, 1090, 1090, 1090, 0, 0, 0, 
-  1128, 1129, 0, 0, 1130, 1131, 1101, 0, 
-  0, 0, 0, 0, 0, 0, 0, 1132, 
-  1133, 0, 0, 0, 0, 1134, 1135, 0, 
-  339, 339, 339, 0, 0, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 812, 339, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 1090, 339, 0, 339, 339, 
-  339, 339, 339, 339, 0, 0, 0, 339, 
-  339, 339, 0, 1136, 339, 1137, 339, 0, 
-  0, 0, 339, 339, 0, 339, 0, 339, 
-  339, 0, 0, 0, 339, 339, 0, 0, 
-  0, 339, 339, 339, 0, 0, 0, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 0, 0, 0, 0, 1138, 
-  1093, 1090, 1093, 1093, 0, 0, 0, 1139, 
-  1140, 1093, 0, 1141, 1142, 1143, 1101, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  1144, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1120, 1120, 1120, 76, 76, 76, 76, 
-  76, 76, 10, 76, 0, 0, 0, 0, 
-  0, 0, 1093, 1093, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 0, 339, 339, 
-  339, 339, 339, 0, 0, 0, 0, 1090, 
-  1090, 1090, 1093, 1093, 1093, 1093, 0, 1145, 
-  1090, 1146, 0, 1090, 1090, 1090, 1101, 0, 
-  0, 0, 0, 0, 0, 0, 1147, 1148, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 0, 0, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 1093, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 0, 339, 339, 
-  339, 339, 339, 0, 0, 1111, 339, 1093, 
-  1149, 1150, 1093, 1151, 1093, 1093, 0, 1152, 
-  1153, 1154, 0, 1155, 1156, 1090, 1101, 0, 
-  0, 0, 0, 0, 0, 0, 1157, 1158, 
-  0, 0, 0, 0, 0, 0, 0, 339, 
-  0, 339, 339, 1090, 1090, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 0, 76, 76, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 1093, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 0, 0, 0, 0, 1159, 
-  1093, 1093, 1090, 1090, 1090, 0, 0, 1160, 
-  1161, 1093, 0, 1162, 1163, 1164, 1101, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  1165, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 0, 0, 0, 0, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 1093, 1093, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 0, 0, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 0, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 0, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 0, 0, 1166, 0, 0, 0, 0, 
-  1167, 1093, 1093, 1090, 1090, 1090, 0, 1090, 
-  0, 1093, 1168, 1169, 1093, 1170, 1171, 1172, 
-  1173, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 1093, 1093, 990, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 1090, 339, 1174, 1090, 1090, 1090, 
-  1090, 1175, 1175, 1101, 0, 0, 0, 0, 
-  10, 339, 339, 339, 339, 339, 339, 507, 
-  1090, 1176, 1176, 1176, 1176, 1090, 1090, 1090, 
-  990, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 990, 990, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 339, 339, 0, 339, 0, 0, 
-  339, 339, 0, 339, 0, 0, 339, 0, 
-  0, 0, 0, 0, 0, 339, 339, 339, 
-  339, 0, 339, 339, 339, 339, 339, 339, 
-  339, 0, 339, 339, 339, 0, 339, 0, 
-  339, 0, 0, 339, 339, 0, 339, 339, 
-  339, 339, 1090, 339, 1177, 1090, 1090, 1090, 
-  1090, 1178, 1178, 0, 1090, 1090, 339, 0, 
-  0, 339, 339, 339, 339, 339, 0, 507, 
-  0, 1179, 1179, 1179, 1179, 1090, 1090, 0, 
-  0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 0, 0, 1180, 1181, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 812, 812, 812, 990, 990, 990, 
-  990, 990, 990, 990, 990, 1182, 990, 990, 
-  990, 990, 990, 990, 812, 812, 812, 812, 
-  812, 537, 537, 812, 812, 812, 812, 812, 
-  812, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 812, 537, 812, 
-  537, 812, 1183, 11, 12, 11, 12, 1093, 
-  1093, 339, 339, 339, 1184, 339, 339, 339, 
-  339, 0, 339, 339, 339, 339, 1185, 339, 
-  339, 339, 339, 1186, 339, 339, 339, 339, 
-  1187, 339, 339, 339, 339, 1188, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 1189, 339, 0, 0, 0, 0, 
-  0, 0, 1190, 1191, 1192, 1193, 1194, 1195, 
-  1196, 1197, 1198, 1191, 1191, 1191, 1191, 1090, 
-  1093, 1191, 1199, 524, 524, 1101, 990, 524, 
-  524, 339, 339, 339, 339, 0, 0, 0, 
-  0, 1090, 1090, 1090, 1200, 1090, 1090, 1090, 
-  1090, 0, 1090, 1090, 1090, 1090, 1201, 1090, 
-  1090, 1090, 1090, 1202, 1090, 1090, 1090, 1090, 
-  1203, 1090, 1090, 1090, 1090, 1204, 1090, 1090, 
-  1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 
-  1090, 1090, 1205, 1090, 1090, 1090, 0, 812, 
-  812, 812, 812, 812, 812, 812, 812, 537, 
-  812, 812, 812, 812, 812, 812, 0, 0, 
-  812, 990, 990, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 0, 339, 339, 1206, 1207, 
-  339, 0, 339, 339, 0, 1093, 1090, 1208, 
-  1090, 1090, 1093, 1090, 0, 0, 0, 1090, 
-  1111, 1093, 1101, 0, 0, 0, 0, 0, 
-  0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 990, 990, 990, 990, 990, 
-  990, 339, 339, 339, 339, 339, 339, 1093, 
-  1093, 1090, 1090, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 
-  1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 
-  1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 
-  1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 
-  1240, 1241, 1242, 1243, 1244, 1245, 1246, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 990, 1247, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 0, 0, 0, 0, 0, 
-  1248, 1248, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 0, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 0, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 0, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 0, 0, 0, 0, 
-  524, 812, 990, 990, 990, 990, 990, 990, 
-  990, 990, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 1120, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 990, 990, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 7, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 11, 12, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 990, 990, 990, 1249, 
-  1249, 1249, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 339, 
-  339, 339, 339, 1090, 1090, 1101, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 1090, 1090, 1101, 990, 990, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 1090, 1090, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 339, 
-  339, 339, 0, 1090, 1090, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 1250, 1250, 1093, 
-  1090, 1090, 1090, 1090, 1090, 1090, 1090, 1093, 
-  1093, 1093, 1093, 1093, 1093, 1093, 1093, 1090, 
-  1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090, 
-  1090, 1090, 1090, 1101, 1090, 990, 990, 990, 
-  507, 990, 990, 990, 10, 339, 524, 0, 
-  0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 0, 0, 0, 0, 0, 
-  0, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 
-  1251, 1251, 1251, 0, 0, 0, 0, 0, 
-  0, 8, 8, 8, 8, 8, 8, 1030, 
-  8, 8, 8, 8, 558, 558, 558, 7, 
-  0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 507, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 1032, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 0, 
-  0, 1090, 1090, 1090, 1093, 1093, 1093, 1093, 
-  1090, 1090, 1252, 1252, 1252, 0, 0, 0, 
-  0, 1093, 1093, 1090, 1093, 1093, 1093, 1093, 
-  1093, 1093, 1031, 524, 537, 0, 0, 0, 
-  0, 76, 0, 0, 0, 8, 8, 1110, 
-  1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 0, 0, 0, 0, 0, 
-  0, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 
-  1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 
-  1093, 1093, 339, 339, 339, 339, 339, 339, 
-  339, 1093, 1093, 0, 0, 0, 0, 0, 
-  0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 0, 0, 0, 0, 8, 
-  8, 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, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  524, 537, 1093, 1093, 1093, 0, 0, 990, 
-  990, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1090, 1090, 1090, 1090, 1093, 1253, 1254, 
-  1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 
-  339, 339, 1263, 1264, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 1111, 1265, 1090, 
-  1090, 1090, 1090, 1266, 1267, 1268, 1269, 1270, 
-  1271, 1272, 1273, 1274, 1275, 1276, 339, 339, 
-  339, 339, 339, 339, 339, 0, 0, 0, 
-  0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 990, 990, 990, 990, 990, 
-  990, 990, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 524, 537, 524, 524, 
-  524, 524, 524, 524, 524, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 1277, 1278, 1279, 
-  507, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 
-  1287, 1288, 1289, 1290, 507, 1291, 1292, 1293, 
-  1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 
-  1302, 1303, 1304, 1305, 1306, 1307, 1308, 507, 
-  1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 
-  1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 
-  1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 
-  1333, 1334, 1335, 1336, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 1337, 213, 213, 213, 213, 1338, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 213, 213, 213, 213, 
-  213, 213, 213, 213, 1339, 1340, 1341, 1342, 
-  1307, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 
-  1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 
-  1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 
-  1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 
-  1374, 524, 524, 537, 524, 524, 524, 524, 
-  524, 524, 524, 537, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 524, 
-  537, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 
-  1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 
-  1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 
-  1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 
-  1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 
-  1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 
-  1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 
-  1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 
-  1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 
-  1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 
-  1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 
-  1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 
-  1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 
-  1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 
-  1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 
-  1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 
-  1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 
-  1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 
-  1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 
-  1526, 1527, 1528, 1529, 1530, 0, 0, 0, 
-  0, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 
-  1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 
-  1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 
-  1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 
-  1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 
-  1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 
-  1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 
-  1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 
-  1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 
-  1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 
-  1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 
-  1618, 1619, 1620, 0, 0, 0, 0, 0, 
-  0, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 
-  1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 
-  1636, 1637, 1638, 1639, 1640, 1641, 1642, 0, 
-  0, 1643, 1644, 1645, 1646, 1647, 1648, 0, 
-  0, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 
-  1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 
-  1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 
-  1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 
-  1680, 1681, 1682, 1683, 1684, 1685, 1686, 0, 
-  0, 1687, 1688, 1689, 1690, 1691, 1692, 0, 
-  0, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 
-  1700, 0, 1701, 0, 1702, 0, 1703, 0, 
-  1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 
-  1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 
-  1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 
-  1728, 1729, 1730, 1731, 1732, 1733, 1734, 0, 
-  0, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 
-  1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 
-  1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 
-  1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 
-  1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 
-  1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 
-  1782, 1783, 1784, 1785, 1786, 1787, 0, 1788, 
-  1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 
-  1797, 1798, 1799, 1800, 1801, 1802, 0, 1803, 
-  1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 
-  1812, 1813, 1814, 1815, 1816, 0, 0, 1817, 
-  1818, 1819, 1820, 1821, 1822, 0, 1823, 1824, 
-  1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 
-  1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 
-  1841, 0, 0, 1842, 1843, 1844, 0, 1845, 
-  1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 
-  0, 1854, 1855, 1856, 1856, 1856, 1856, 1856, 
-  1857, 1856, 1856, 1856, 80, 1858, 1858, 1250, 
-  1859, 1030, 1860, 1030, 1030, 1030, 1030, 8, 
-  1861, 79, 91, 11, 79, 79, 91, 11, 
-  79, 8, 8, 8, 8, 1862, 1863, 1864, 
-  8, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 
-  75, 9, 9, 9, 1872, 1873, 8, 1874, 
-  1875, 8, 79, 91, 8, 1876, 8, 1877, 
-  47, 47, 8, 8, 8, 1878, 11, 12, 
-  1879, 1880, 1881, 8, 8, 8, 8, 8, 
-  8, 8, 8, 74, 8, 47, 8, 8, 
-  1882, 8, 8, 8, 8, 8, 8, 8, 
-  1856, 80, 80, 80, 80, 0, 0, 0, 
-  0, 0, 0, 80, 80, 80, 80, 80, 
-  80, 1883, 1884, 0, 0, 1885, 1886, 1887, 
-  1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 
-  1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 
-  1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 
-  0, 1912, 1913, 1914, 1915, 1916, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 10, 10, 10, 10, 10, 10, 10, 
-  10, 1917, 10, 10, 10, 10, 10, 10, 
-  10, 10, 10, 10, 10, 10, 10, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 524, 524, 550, 550, 524, 524, 524, 
-  524, 550, 550, 550, 524, 524, 813, 813, 
-  813, 813, 524, 813, 813, 813, 550, 550, 
-  524, 537, 524, 550, 550, 537, 537, 537, 
-  537, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1918, 1919, 1920, 1921, 76, 1922, 1923, 
-  1924, 76, 1925, 1926, 1927, 1927, 1927, 1928, 
-  1929, 1930, 1930, 1931, 1932, 76, 1933, 1934, 
-  76, 76, 1935, 1936, 1937, 1937, 1937, 76, 
-  76, 1938, 1939, 1940, 76, 1941, 76, 1942, 
-  76, 1941, 76, 1943, 1944, 1945, 1920, 82, 
-  1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 
-  1954, 1955, 1956, 76, 1957, 1958, 1959, 1960, 
-  1961, 1962, 74, 74, 74, 74, 1963, 1964, 
-  1946, 1956, 1965, 76, 74, 76, 76, 1966, 
-  0, 0, 0, 0, 1967, 1968, 1969, 1970, 
-  1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 
-  1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 
-  1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 
-  1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 
-  2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 
-  2011, 1249, 1249, 1249, 2012, 2013, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 2014, 74, 2015, 74, 2016, 76, 76, 
-  76, 76, 76, 2017, 2018, 76, 76, 76, 
-  76, 74, 76, 76, 74, 76, 76, 74, 
-  76, 76, 76, 76, 76, 76, 76, 2019, 
-  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, 2020, 2021, 
-  2022, 2023, 76, 2024, 76, 2025, 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, 74, 74, 74, 
-  74, 74, 74, 74, 74, 74, 74, 74, 
-  74, 74, 2026, 2026, 2027, 2028, 74, 74, 
-  74, 2029, 2030, 2026, 2031, 2032, 2026, 74, 
-  74, 74, 2026, 13, 83, 74, 2026, 2026, 
-  74, 74, 74, 2026, 2026, 2026, 2026, 74, 
-  2026, 2026, 2026, 2026, 2033, 2034, 2035, 2036, 
-  74, 74, 74, 74, 2026, 2037, 2038, 2026, 
-  2039, 2040, 2026, 2026, 2026, 74, 74, 74, 
-  74, 74, 2026, 74, 2026, 2041, 2026, 2026, 
-  2026, 2026, 2042, 2026, 2043, 2044, 2045, 2026, 
-  2046, 2047, 2048, 2026, 2026, 2026, 2049, 74, 
-  74, 74, 74, 2026, 2026, 2026, 2026, 74, 
-  74, 74, 74, 74, 74, 74, 74, 74, 
-  2026, 2050, 2051, 2052, 74, 2053, 2054, 2026, 
-  2026, 2026, 2026, 2026, 2026, 74, 2055, 2056, 
-  2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 
-  2065, 2066, 2067, 2068, 2069, 2070, 2071, 2026, 
-  2026, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 
-  2079, 2080, 2081, 2026, 2026, 2026, 74, 74, 
-  2026, 2026, 2082, 2083, 74, 74, 74, 74, 
-  74, 2026, 74, 74, 74, 74, 74, 74, 
-  74, 74, 74, 2084, 2026, 74, 74, 2026, 
-  2026, 2085, 2086, 2026, 2087, 2088, 2089, 2090, 
-  2091, 2026, 2026, 2092, 2093, 2094, 2095, 2026, 
-  2026, 2026, 74, 74, 74, 74, 74, 2026, 
-  2026, 74, 74, 74, 74, 74, 74, 74, 
-  74, 74, 2026, 2026, 2026, 2026, 2026, 74, 
-  74, 2026, 2026, 74, 74, 74, 74, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2096, 2097, 2098, 2099, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2100, 2101, 2102, 2103, 74, 
-  74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 76, 76, 76, 76, 76, 76, 76, 
-  76, 2026, 2026, 2026, 2026, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 2026, 2026, 76, 76, 76, 76, 76, 
-  76, 76, 2104, 2105, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 76, 74, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 812, 76, 
-  76, 76, 76, 76, 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, 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, 74, 74, 74, 
-  74, 74, 74, 76, 76, 76, 76, 76, 
-  76, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 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, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 
-  2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 
-  2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 
-  2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 
-  2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 
-  2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 
-  2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 
-  2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 
-  2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 
-  2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 
-  2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 
-  2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 
-  2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 
-  2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 
-  2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 
-  2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 
-  2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 
-  2241, 2242, 2243, 2244, 1251, 1251, 1251, 1251, 
-  1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 
-  1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 
-  1251, 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, 
-  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, 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, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  74, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 74, 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, 74, 74, 74, 74, 74, 74, 74, 
-  74, 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, 
-  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, 76, 
-  74, 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, 0, 0, 
-  0, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 812, 76, 76, 
-  76, 76, 76, 76, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 76, 76, 76, 76, 0, 76, 
-  76, 76, 76, 0, 0, 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, 0, 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, 0, 76, 0, 
-  76, 76, 76, 76, 0, 0, 0, 76, 
-  0, 76, 76, 76, 76, 76, 76, 76, 
-  0, 0, 76, 76, 76, 76, 76, 76, 
-  76, 11, 12, 11, 12, 11, 12, 11, 
-  12, 11, 12, 11, 12, 11, 12, 1251, 
-  1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 
-  1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 
-  1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 
-  1251, 1251, 1251, 1251, 1251, 76, 0, 0, 
-  0, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 0, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  0, 2026, 74, 74, 2026, 2026, 11, 12, 
-  74, 74, 74, 74, 0, 0, 0, 0, 
-  0, 74, 74, 74, 2026, 2026, 2026, 2026, 
-  74, 74, 74, 74, 74, 2026, 2026, 2026, 
-  74, 74, 74, 2026, 2026, 2026, 2026, 11, 
-  12, 11, 12, 11, 12, 0, 0, 0, 
-  0, 74, 74, 74, 74, 74, 74, 74, 
-  74, 74, 74, 74, 74, 74, 74, 74, 
-  74, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 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, 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, 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, 11, 12, 11, 12, 
-  11, 12, 11, 12, 11, 12, 11, 12, 
-  11, 12, 11, 12, 11, 12, 11, 12, 
-  11, 12, 74, 74, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 74, 74, 74, 74, 74, 74, 74, 
-  74, 2026, 74, 74, 74, 74, 74, 74, 
-  74, 2026, 2026, 2026, 2026, 2026, 2026, 74, 
-  74, 74, 2026, 74, 74, 74, 74, 2026, 
-  2026, 2026, 2026, 2026, 74, 2026, 2026, 74, 
-  74, 11, 12, 11, 12, 2026, 74, 74, 
-  74, 74, 2026, 74, 2026, 2026, 2026, 74, 
-  74, 2026, 2026, 74, 74, 74, 74, 74, 
-  74, 74, 74, 74, 74, 2026, 2026, 2026, 
-  2026, 2026, 2026, 74, 74, 11, 12, 74, 
-  74, 74, 74, 74, 74, 74, 74, 74, 
-  74, 74, 74, 2026, 2026, 2245, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 74, 2026, 
-  2026, 2026, 2026, 74, 74, 2026, 74, 2026, 
-  74, 74, 2026, 74, 2026, 2026, 2026, 2026, 
-  74, 74, 74, 74, 74, 2026, 2026, 74, 
-  74, 74, 74, 74, 74, 2026, 2026, 2026, 
-  74, 74, 74, 74, 74, 74, 74, 74, 
-  74, 74, 74, 74, 74, 74, 74, 74, 
-  74, 74, 74, 74, 74, 74, 74, 74, 
-  2026, 2026, 74, 74, 74, 74, 74, 74, 
-  74, 74, 74, 74, 74, 2026, 2026, 74, 
-  74, 74, 74, 2026, 2026, 2026, 2026, 74, 
-  2026, 2026, 74, 74, 2026, 2246, 2247, 2248, 
-  74, 74, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 74, 74, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 74, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 
-  74, 74, 74, 74, 74, 2249, 2250, 2026, 
-  74, 74, 74, 2026, 2026, 2026, 2026, 2026, 
-  74, 74, 74, 74, 74, 2026, 2026, 2026, 
-  74, 74, 74, 74, 2026, 74, 74, 74, 
-  2026, 2026, 2026, 2026, 2026, 74, 2026, 74, 
-  74, 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, 0, 0, 0, 0, 
-  0, 76, 76, 76, 76, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 
-  2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 
-  2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 
-  2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 
-  2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 
-  2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 
-  0, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 
-  2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 
-  2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 
-  2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 
-  2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 
-  2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 
-  0, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 
-  2352, 2353, 2354, 2355, 2356, 2357, 0, 0, 
-  0, 0, 0, 0, 0, 213, 2358, 2359, 
-  213, 0, 0, 0, 0, 0, 0, 0, 
-  0, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 
-  2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 
-  2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 
-  2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 
-  2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 
-  2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 
-  2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 
-  2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 
-  2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 
-  2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 
-  2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 
-  2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 
-  2455, 2456, 2457, 2458, 2459, 213, 76, 76, 
-  76, 76, 76, 76, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 8, 8, 8, 8, 1251, 8, 
-  8, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 
-  2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 
-  2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 
-  2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 
-  2491, 2492, 2493, 2494, 2495, 2496, 2497, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  2498, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 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, 79, 91, 79, 91, 8, 
-  8, 8, 79, 91, 8, 79, 91, 8, 
-  8, 8, 8, 8, 8, 8, 8, 8, 
-  1030, 0, 0, 0, 0, 79, 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, 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, 0, 76, 76, 76, 76, 
-  2499, 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, 
-  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, 2500, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 
-  2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 
-  2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 
-  2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 
-  2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 
-  2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 
-  2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 
-  2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 
-  2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 
-  2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 
-  2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 
-  2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 
-  2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 
-  2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 
-  2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 
-  2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 
-  2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 
-  2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 
-  2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 
-  2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 
-  2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 
-  2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 
-  2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 
-  2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 
-  2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 
-  2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 
-  2708, 2709, 2710, 2711, 2712, 2713, 2714, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 0, 0, 0, 
-  0, 2715, 8, 8, 8, 76, 507, 339, 
-  1249, 11, 12, 11, 12, 11, 12, 11, 
-  12, 11, 12, 76, 76, 11, 12, 11, 
-  12, 11, 12, 11, 12, 1030, 11, 12, 
-  12, 76, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 2716, 1032, 536, 1031, 2717, 
-  2717, 1030, 507, 507, 507, 507, 507, 2718, 
-  76, 2719, 2720, 2721, 507, 339, 8, 76, 
-  76, 0, 339, 339, 339, 339, 339, 2722, 
-  339, 339, 339, 339, 2723, 2724, 2725, 2726, 
-  2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 
-  2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 
-  2743, 2744, 2745, 2746, 339, 2747, 2748, 2749, 
-  2750, 2751, 2752, 339, 339, 339, 339, 339, 
-  2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 
-  2761, 2762, 2763, 2764, 2765, 2766, 2767, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 2768, 339, 339, 
-  0, 0, 2769, 2770, 2771, 2772, 2773, 2774, 
-  2775, 1030, 339, 339, 339, 339, 339, 2776, 
-  339, 339, 339, 339, 2777, 2778, 2779, 2780, 
-  2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 
-  2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 
-  2797, 2798, 2799, 2800, 339, 2801, 2802, 2803, 
-  2804, 2805, 2806, 339, 339, 339, 339, 339, 
-  2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 
-  2815, 2816, 2817, 2818, 2819, 2820, 2821, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  2822, 2823, 2824, 2825, 339, 2826, 339, 339, 
-  2827, 2828, 2829, 2830, 8, 507, 2831, 2832, 
-  2833, 0, 0, 0, 0, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 0, 
-  0, 0, 2834, 2835, 2836, 2837, 2838, 2839, 
-  2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 
-  2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 
-  2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 
-  2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 
-  2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 
-  2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 
-  2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 
-  2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 
-  2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 
-  2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 
-  2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 
-  0, 812, 812, 2928, 2929, 2930, 2931, 2932, 
-  2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 
-  2941, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 0, 0, 0, 0, 0, 0, 0, 
-  0, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 
-  2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 
-  2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 
-  2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 
-  0, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 
-  2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 
-  2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 
-  2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 
-  3004, 3005, 3006, 3007, 3008, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 
-  3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 
-  3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 
-  3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 
-  3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 
-  3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 
-  812, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 
-  3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 
-  3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 
-  3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 
-  3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 
-  3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 
-  3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 
-  3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 
-  3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 
-  3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 
-  3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 
-  3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 
-  3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 
-  3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 
-  3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 
-  3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 
-  0, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 
-  3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 
-  3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 
-  3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 
-  3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 
-  3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 
-  3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 
-  3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 
-  3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 
-  3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 
-  3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 
-  3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 
-  3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 
-  3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 
-  3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 
-  3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 
-  3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 
-  3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 
-  3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 
-  3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 
-  3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, 
-  3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 
-  3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 
-  3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 
-  3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 
-  3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 
-  3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 
-  3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 
-  3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 
-  3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 
-  3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 
-  3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 
-  3438, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 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, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 507, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 0, 0, 
-  0, 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, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 46, 46, 46, 46, 46, 46, 46, 
-  46, 46, 46, 46, 46, 46, 46, 46, 
-  46, 46, 46, 46, 46, 46, 46, 46, 
-  506, 506, 506, 506, 0, 0, 0, 0, 
-  0, 46, 46, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 1252, 339, 339, 339, 1101, 
-  339, 339, 339, 339, 1090, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 1093, 1093, 1090, 1090, 
-  1093, 76, 76, 76, 76, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 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, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 
-  3439, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 
-  3448, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 
-  3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 
-  3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 
-  3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 
-  3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 
-  3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 
-  3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 
-  3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 
-  3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 
-  3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 
-  3527, 3528, 3529, 3530, 3531, 3460, 3532, 3533, 
-  3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 
-  3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 
-  3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 
-  3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 
-  3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 
-  3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 
-  3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 
-  3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 
-  3598, 3599, 3550, 3600, 3601, 3602, 3603, 3604, 
-  3605, 3606, 3607, 3534, 3608, 3609, 3610, 3611, 
-  3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 
-  3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 
-  3460, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 
-  3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 
-  3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 
-  3651, 3652, 3653, 3654, 3536, 3655, 3656, 3657, 
-  3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 
-  3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 
-  3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 
-  3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 
-  3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 
-  3698, 3699, 3700, 3701, 3702, 3703, 3704, 339, 
-  339, 3705, 339, 3706, 339, 339, 3707, 3708, 
-  3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 
-  339, 3717, 339, 3718, 339, 339, 3719, 3720, 
-  339, 339, 339, 3721, 3722, 3723, 3724, 0, 
-  0, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 
-  3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 
-  3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 
-  3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 
-  3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 
-  3589, 3764, 3765, 3766, 3767, 3768, 3769, 3769, 
-  3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 
-  3719, 3778, 3779, 3780, 0, 0, 0, 0, 
-  0, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 
-  3788, 3731, 3789, 3790, 3791, 3705, 3792, 3793, 
-  3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801, 
-  3802, 3803, 3740, 3804, 3741, 3805, 3806, 3807, 
-  3808, 3809, 3706, 3481, 3810, 3811, 3812, 3551, 
-  3638, 3813, 3814, 3748, 3815, 3749, 3816, 3817, 
-  3818, 3708, 3819, 3820, 3821, 3822, 3823, 3709, 
-  3824, 3825, 3826, 3827, 3828, 3829, 3763, 3830, 
-  3831, 3589, 3832, 3767, 3833, 3834, 3835, 3836, 
-  3837, 3772, 3838, 3718, 3839, 3773, 3532, 3840, 
-  3774, 3841, 3776, 3842, 3843, 3844, 3845, 3846, 
-  3778, 3714, 3847, 3779, 3848, 3780, 3849, 3448, 
-  3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 
-  3858, 3859, 3860, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 3868, 3869, 3870, 3871, 
-  3872, 0, 0, 0, 0, 0, 3873, 3874, 
-  3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 
-  3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 
-  3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 
-  0, 3899, 3900, 3901, 3902, 3903, 0, 3904, 
-  0, 3905, 3906, 0, 3907, 3908, 0, 3909, 
-  3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 
-  3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 
-  3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 
-  3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 
-  3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, 
-  3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 
-  3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 
-  3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 
-  3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 
-  3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 
-  3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 
-  3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, 
-  4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 
-  4014, 4015, 4016, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 4017, 4018, 4019, 4020, 
-  4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 
-  4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 
-  4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 
-  4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, 
-  4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 
-  4061, 4062, 4063, 4064, 4055, 4065, 4066, 4067, 
-  4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 
-  4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 
-  4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, 
-  4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099, 
-  4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 
-  4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, 
-  4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 
-  4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 
-  4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 
-  4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, 
-  4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 
-  4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 
-  4164, 4056, 4165, 4166, 4167, 4168, 4169, 4170, 
-  4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 
-  4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 
-  4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 
-  4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 
-  4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 
-  4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 
-  4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 
-  4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 
-  4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 
-  4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 
-  4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 
-  4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 
-  4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 
-  4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 
-  4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 
-  4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, 
-  4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306, 
-  4307, 4308, 4309, 4310, 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, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 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, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 
-  4505, 4506, 4507, 4508, 4509, 4510, 76, 0, 
-  0, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 
-  4518, 4519, 4520, 0, 0, 0, 0, 0, 
-  0, 524, 524, 524, 524, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 4521, 4522, 4523, 4524, 4524, 4525, 4526, 
-  4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 
-  4535, 4536, 4537, 4538, 4539, 4540, 8, 8, 
-  4541, 4542, 4543, 4543, 4543, 4543, 4544, 4544, 
-  4544, 4545, 4546, 4547, 0, 4548, 4549, 4550, 
-  4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 
-  4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 
-  0, 4567, 4568, 4569, 4570, 0, 0, 0, 
-  0, 4571, 4572, 4573, 1054, 4574, 0, 4575, 
-  4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 
-  4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 
-  4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599, 
-  4600, 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, 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, 0, 0, 
-  80, 0, 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, 4769, 4770, 4771, 
-  4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 
-  4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, 
-  4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, 
-  4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, 
-  4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, 
-  4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 
-  4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, 
-  4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, 
-  4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 
-  4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 
-  4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 
-  4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867, 
-  4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 
-  4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883, 
-  4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, 
-  4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899, 
-  0, 0, 0, 4900, 4901, 4902, 4903, 4904, 
-  4905, 0, 0, 4906, 4907, 4908, 4909, 4910, 
-  4911, 0, 0, 4912, 4913, 4914, 4915, 4916, 
-  4917, 0, 0, 4918, 4919, 4920, 0, 0, 
-  0, 4921, 4922, 4923, 4924, 4925, 4926, 4927, 
-  0, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 4935, 4935, 4935, 76, 76, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 0, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 0, 339, 339, 0, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 0, 0, 0, 0, 
-  0, 990, 8, 812, 0, 0, 0, 0, 
-  1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 0, 0, 0, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 
-  4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 
-  4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 
-  4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 
-  4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 
-  4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, 
-  4936, 4936, 4936, 4936, 4936, 4936, 1251, 1251, 
-  1251, 1251, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 1251, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 1120, 1120, 1120, 1120, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 1249, 339, 339, 339, 339, 339, 
-  339, 339, 339, 1249, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  990, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 990, 1249, 1249, 1249, 1249, 1249, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 
-  4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 
-  4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 
-  4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 
-  4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 
-  4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 
-  4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, 
-  4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999, 
-  5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 
-  5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 
-  5016, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 0, 
-  0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 
-  1110, 1110, 1110, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1050, 1050, 1050, 1050, 1050, 1050, 0, 
-  0, 1050, 0, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 0, 
-  1050, 1050, 0, 0, 0, 1050, 0, 0, 
-  1050, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 5017, 
-  5017, 5017, 5017, 0, 0, 0, 0, 0, 
-  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, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1050, 1090, 1090, 1090, 0, 1090, 1090, 
-  0, 0, 0, 0, 0, 1090, 537, 1090, 
-  524, 1050, 1050, 1050, 1050, 0, 1050, 1050, 
-  1050, 0, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 
-  1050, 1050, 1050, 1050, 1050, 0, 0, 0, 
-  0, 524, 550, 537, 0, 0, 0, 0, 
-  1101, 5017, 5017, 5017, 5017, 5017, 5017, 5017, 
-  5017, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 
-  1046, 1046, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 
-  1249, 1249, 1249, 1249, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 990, 990, 990, 990, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  0, 0, 0, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  5018, 5019, 812, 812, 812, 812, 812, 5020, 
-  5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 
-  550, 550, 550, 812, 812, 812, 5029, 5030, 
-  5031, 5032, 5033, 5034, 80, 80, 80, 80, 
-  80, 80, 80, 80, 537, 537, 537, 537, 
-  537, 537, 537, 537, 812, 812, 524, 524, 
-  524, 524, 524, 537, 537, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 524, 524, 524, 524, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 5035, 5036, 5037, 5038, 5039, 5040, 
-  5041, 5042, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 812, 
-  812, 812, 812, 812, 812, 812, 812, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 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, 
-  76, 76, 76, 76, 76, 76, 76, 76, 
-  76, 76, 76, 524, 524, 524, 76, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 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, 
-  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, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 
-  1120, 1120, 1120, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 
-  1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 
-  1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 
-  5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 
-  5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 
-  5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 
-  5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 
-  1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 
-  1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 
-  5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 
-  5056, 5057, 1964, 1946, 5058, 1926, 0, 1956, 
-  1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 
-  5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 
-  5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 
-  1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 
-  1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 
-  5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 
-  5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 
-  5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 
-  5068, 5069, 5070, 5071, 5072, 5043, 0, 1920, 
-  1963, 0, 0, 5044, 0, 0, 5045, 5046, 
-  0, 0, 1933, 5047, 1935, 1936, 0, 5048, 
-  5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 
-  5056, 5057, 1964, 0, 5058, 0, 1928, 1956, 
-  1965, 5059, 1932, 5060, 5061, 0, 5062, 5063, 
-  5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 
-  5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 
-  1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 
-  1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 
-  5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 
-  5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 
-  5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 
-  5068, 5069, 5070, 5071, 5072, 5043, 1945, 0, 
-  1963, 1947, 1948, 5044, 0, 0, 5045, 5046, 
-  1931, 1950, 1933, 5047, 1935, 1936, 0, 5048, 
-  5049, 5050, 5051, 5052, 5053, 5054, 0, 5055, 
-  5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 
-  1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 
-  5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 
-  5072, 5043, 1945, 0, 1963, 1947, 1948, 5044, 
-  0, 1930, 5045, 5046, 1931, 1950, 0, 5047, 
-  0, 0, 0, 5048, 5049, 5050, 5051, 5052, 
-  5053, 5054, 0, 5055, 5056, 5057, 1964, 1946, 
-  5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 
-  5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 
-  5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 
-  1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 
-  1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 
-  5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 
-  5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 
-  1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 
-  5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 
-  5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 
-  1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 
-  1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 
-  5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 
-  5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 
-  5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 
-  5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 
-  1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 
-  1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 
-  5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 
-  5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 
-  1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 
-  5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 
-  5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 
-  1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 
-  1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 
-  5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 
-  5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 
-  5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 
-  5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, 
-  1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, 
-  1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, 
-  5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, 
-  5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, 
-  1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, 
-  5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 
-  5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, 
-  1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, 
-  1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, 
-  5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, 
-  5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, 
-  5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, 
-  5068, 5069, 5070, 5071, 5072, 5073, 5074, 0, 
-  0, 5075, 5076, 1960, 5077, 5078, 5079, 5080, 
-  5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 
-  1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 
-  5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, 
-  5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 
-  5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, 
-  5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 
-  5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078, 
-  5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 
-  5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093, 
-  5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959, 
-  5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 
-  5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115, 
-  5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 
-  5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960, 
-  5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 
-  5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091, 
-  5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 
-  5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106, 
-  5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113, 
-  5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 
-  5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075, 
-  5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082, 
-  5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089, 
-  5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 
-  5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104, 
-  5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 
-  1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 
-  5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 
-  5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080, 
-  5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 
-  1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 
-  5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, 
-  5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 
-  5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, 
-  5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 
-  5126, 5127, 5128, 5129, 5130, 0, 0, 5131, 
-  5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 
-  5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 
-  5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135, 
-  5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133, 
-  5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131, 
-  5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 
-  5140, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  339, 339, 339, 339, 339, 339, 339, 339, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 5141, 5142, 5143, 5144, 5145, 3725, 5146, 
-  5147, 5148, 5149, 3726, 5150, 5151, 5152, 3727, 
-  5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 
-  5161, 5162, 5163, 5164, 3782, 5165, 5166, 5167, 
-  5168, 5169, 5170, 5171, 5172, 5173, 3787, 3728, 
-  3729, 3788, 5174, 5175, 3538, 5176, 3730, 5177, 
-  5178, 5179, 5180, 5180, 5180, 5181, 5182, 5183, 
-  5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, 
-  5192, 5193, 5194, 5195, 5196, 5197, 5198, 5198, 
-  3790, 5199, 5200, 5201, 5202, 3732, 5203, 5204, 
-  5205, 3691, 5206, 5207, 5208, 5209, 5210, 5211, 
-  5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 
-  5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, 
-  5228, 5229, 5230, 5231, 5231, 5232, 5233, 5234, 
-  3534, 5235, 5236, 5237, 5238, 5239, 5240, 5241, 
-  5242, 3737, 5243, 5244, 5245, 5246, 5247, 5248, 
-  5249, 5250, 5251, 5252, 5253, 5254, 5255, 5256, 
-  5257, 5258, 5259, 5260, 5261, 5262, 5263, 3480, 
-  5264, 5265, 5266, 5266, 5267, 5268, 5268, 5269, 
-  5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, 
-  5278, 5279, 5280, 5281, 3738, 5282, 5283, 5284, 
-  5285, 3802, 5285, 5286, 3740, 5287, 5288, 5289, 
-  5290, 3741, 3453, 5291, 5292, 5293, 5294, 5295, 
-  5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303, 
-  5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 
-  5312, 3742, 5313, 5314, 5315, 5316, 5317, 5318, 
-  3744, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 
-  5326, 3481, 3810, 5327, 5328, 5329, 5330, 5331, 
-  5332, 5333, 5334, 3745, 5335, 5336, 5337, 5338, 
-  3853, 5339, 5340, 5341, 5342, 5343, 5344, 5345, 
-  5346, 5347, 5348, 5349, 5350, 5351, 3551, 5352, 
-  5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, 
-  5361, 5362, 3746, 3638, 5363, 5364, 5365, 5366, 
-  5367, 5368, 5369, 5370, 3814, 5371, 5372, 5373, 
-  5374, 5375, 5376, 5377, 5378, 3815, 5379, 5380, 
-  5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, 
-  5389, 5390, 3817, 5391, 5392, 5393, 5394, 5395, 
-  5396, 5397, 5398, 5399, 5400, 5401, 5401, 5402, 
-  5403, 3819, 5404, 5405, 5406, 5407, 5408, 5409, 
-  5410, 3537, 5411, 5412, 5413, 5414, 5415, 5416, 
-  5417, 3825, 5418, 5419, 5420, 5421, 5422, 5423, 
-  5423, 3826, 3855, 5424, 5425, 5426, 5427, 5428, 
-  3499, 3828, 5429, 5430, 3757, 5431, 5432, 3713, 
-  5433, 5434, 3761, 5435, 5436, 5437, 5438, 5438, 
-  5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 
-  5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454, 
-  5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 
-  5463, 5464, 5465, 3767, 5466, 5467, 5468, 5469, 
-  5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, 
-  5478, 5479, 5480, 5481, 5267, 5482, 5483, 5484, 
-  5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 
-  5493, 3555, 5494, 5495, 5496, 5497, 5498, 5499, 
-  3770, 5500, 5501, 5502, 5503, 5504, 5505, 5506, 
-  5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514, 
-  5515, 5516, 5517, 5518, 5519, 3494, 5520, 5521, 
-  5522, 5523, 5524, 5525, 3835, 5526, 5527, 5528, 
-  5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, 
-  5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 
-  5545, 3840, 3841, 5546, 5547, 5548, 5549, 5550, 
-  5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, 
-  3842, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 
-  5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 
-  5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, 
-  5582, 5583, 5584, 5585, 5586, 5587, 5588, 3848, 
-  3848, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 
-  5596, 5597, 5598, 3849, 5599, 5600, 5601, 5602, 
-  5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 
-  5611, 5612, 5613, 5614, 5615, 5616, 5617, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 80, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 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, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 558, 558, 558, 558, 558, 558, 558, 
-  558, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 
-  3440, 3440, 3440, 3440, 3440, 3440, 3440, 0, 
-  0, };
-
-const utf8proc_property_t utf8proc_properties[] = {
-  {0, 0, 0, 0, NULL, false, -1, -1, -1, -1, -1, false},
-  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
-  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
-  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
-  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17580, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17400, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17640, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 97, -1, 0, -1, false, false, false, false, utf8proc_sequences + 0},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 98, -1, 8640, -1, false, false, false, false, utf8proc_sequences + 2},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 99, -1, 60, -1, false, false, false, false, utf8proc_sequences + 4},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 100, -1, 960, -1, false, false, false, false, utf8proc_sequences + 6},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 101, -1, 120, -1, false, false, false, false, utf8proc_sequences + 8},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 102, -1, 9120, -1, false, false, false, false, utf8proc_sequences + 10},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 103, -1, 1080, -1, false, false, false, false, utf8proc_sequences + 12},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 104, -1, 1200, -1, false, false, false, false, utf8proc_sequences + 14},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 105, -1, 180, -1, false, false, false, false, utf8proc_sequences + 16},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 106, -1, 1320, -1, false, false, false, false, utf8proc_sequences + 18},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 107, -1, 1440, -1, false, false, false, false, utf8proc_sequences + 20},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 108, -1, 1560, -1, false, false, false, false, utf8proc_sequences + 22},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 109, -1, 9480, -1, false, false, false, false, utf8proc_sequences + 24},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 110, -1, 240, -1, false, false, false, false, utf8proc_sequences + 26},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 111, -1, 300, -1, false, false, false, false, utf8proc_sequences + 28},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 112, -1, 9720, -1, false, false, false, false, utf8proc_sequences + 30},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 32},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 114, -1, 1680, -1, false, false, false, false, utf8proc_sequences + 34},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 115, -1, 1800, -1, false, false, false, false, utf8proc_sequences + 36},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 116, -1, 1920, -1, false, false, false, false, utf8proc_sequences + 38},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 117, -1, 360, -1, false, false, false, false, utf8proc_sequences + 40},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 118, -1, 10560, -1, false, false, false, false, utf8proc_sequences + 42},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 119, -1, 2040, -1, false, false, false, false, utf8proc_sequences + 44},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 120, -1, 10680, -1, false, false, false, false, utf8proc_sequences + 46},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 121, -1, 420, -1, false, false, false, false, utf8proc_sequences + 48},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 122, -1, 2160, -1, false, false, false, false, utf8proc_sequences + 50},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 65, -1, 65, 480, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66, -1, 66, 8700, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 67, -1, 67, 540, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 68, -1, 68, 1020, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 69, -1, 69, 600, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 70, -1, 70, 9180, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 71, -1, 71, 1140, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 72, -1, 72, 1260, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, 660, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 74, -1, 74, 1380, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 75, -1, 75, 1500, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 76, -1, 76, 1620, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 77, -1, 77, 9540, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 78, -1, 78, 720, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 79, -1, 79, 780, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 80, -1, 80, 9780, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 81, -1, 81, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 82, -1, 82, 1740, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 83, -1, 83, 1860, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 84, -1, 84, 1980, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 85, -1, 85, 840, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 86, -1, 86, 10620, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 87, -1, 87, 2100, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 88, -1, 88, 10740, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 89, -1, 89, 900, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 90, -1, 90, 2220, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 54, false, -1, -1, -1, 3600, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PI, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 57, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 64, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 67, false, 924, -1, 924, -1, -1, false, false, false, false, utf8proc_sequences + 67},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 69, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 74, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 78, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 82, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 86, false, -1, 224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 89},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 91, false, -1, 225, -1, -1, -1, false, false, false, false, utf8proc_sequences + 94},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 96, false, -1, 226, -1, 10860, -1, false, false, false, false, utf8proc_sequences + 99},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 101, false, -1, 227, -1, -1, -1, false, false, false, false, utf8proc_sequences + 104},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 106, false, -1, 228, -1, 2400, -1, false, false, false, false, utf8proc_sequences + 109},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 111, false, -1, 229, -1, 3000, -1, false, false, false, false, utf8proc_sequences + 114},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 230, -1, 2640, -1, false, false, false, false, utf8proc_sequences + 116},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 118, false, -1, 231, -1, 8760, -1, false, false, false, false, utf8proc_sequences + 121},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 123, false, -1, 232, -1, -1, -1, false, false, false, false, utf8proc_sequences + 126},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 128, false, -1, 233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 131},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 133, false, -1, 234, -1, 11220, -1, false, false, false, false, utf8proc_sequences + 136},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 138, false, -1, 235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 141},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 143, false, -1, 236, -1, -1, -1, false, false, false, false, utf8proc_sequences + 146},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 148, false, -1, 237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 151},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 153, false, -1, 238, -1, -1, -1, false, false, false, false, utf8proc_sequences + 156},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 158, false, -1, 239, -1, 9240, -1, false, false, false, false, utf8proc_sequences + 161},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 240, -1, -1, -1, false, false, false, false, utf8proc_sequences + 163},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 165, false, -1, 241, -1, -1, -1, false, false, false, false, utf8proc_sequences + 168},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 170, false, -1, 242, -1, -1, -1, false, false, false, false, utf8proc_sequences + 173},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 175, false, -1, 243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 178},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 180, false, -1, 244, -1, 11460, -1, false, false, false, false, utf8proc_sequences + 183},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 185, false, -1, 245, -1, 3360, -1, false, false, false, false, utf8proc_sequences + 188},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 190, false, -1, 246, -1, 3240, -1, false, false, false, false, utf8proc_sequences + 193},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 248, -1, 3120, -1, false, false, false, false, utf8proc_sequences + 195},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 197, false, -1, 249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 200},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 202, false, -1, 250, -1, -1, -1, false, false, false, false, utf8proc_sequences + 205},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 207, false, -1, 251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 210},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 212, false, -1, 252, -1, 2280, -1, false, false, false, false, utf8proc_sequences + 215},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 217, false, -1, 253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 220},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 254, -1, -1, -1, false, false, false, false, utf8proc_sequences + 222},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 224},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 227, false, 192, -1, 192, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 230, false, 193, -1, 193, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 233, false, 194, -1, 194, 10920, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 236, false, 195, -1, 195, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 239, false, 196, -1, 196, 2460, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 242, false, 197, -1, 197, 3060, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 198, -1, 198, 2700, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 245, false, 199, -1, 199, 8820, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 248, false, 200, -1, 200, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 251, false, 201, -1, 201, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 254, false, 202, -1, 202, 11280, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 257, false, 203, -1, 203, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 260, false, 204, -1, 204, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 263, false, 205, -1, 205, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 266, false, 206, -1, 206, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 269, false, 207, -1, 207, 9300, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 208, -1, 208, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 272, false, 209, -1, 209, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 275, false, 210, -1, 210, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 278, false, 211, -1, 211, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 281, false, 212, -1, 212, 11520, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 284, false, 213, -1, 213, 3420, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 287, false, 214, -1, 214, 3300, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 216, -1, 216, 3180, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 290, false, 217, -1, 217, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 293, false, 218, -1, 218, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 296, false, 219, -1, 219, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 299, false, 220, -1, 220, 2340, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 302, false, 221, -1, 221, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 222, -1, 222, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 305, false, 376, -1, 376, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 308, false, -1, 257, -1, -1, -1, false, false, false, false, utf8proc_sequences + 311},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 313, false, 256, -1, 256, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 316, false, -1, 259, -1, 11100, -1, false, false, false, false, utf8proc_sequences + 319},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 321, false, 258, -1, 258, 11160, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 324, false, -1, 261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 327},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 329, false, 260, -1, 260, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 332, false, -1, 263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 335},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 337, false, 262, -1, 262, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 340, false, -1, 265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 343},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 345, false, 264, -1, 264, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 348, false, -1, 267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 351},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 353, false, 266, -1, 266, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 356, false, -1, 269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 359},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 361, false, 268, -1, 268, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 364, false, -1, 271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 367},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 369, false, 270, -1, 270, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 372},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 272, -1, 272, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 374, false, -1, 275, -1, 8880, -1, false, false, false, false, utf8proc_sequences + 377},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 379, false, 274, -1, 274, 8940, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 382, false, -1, 277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 385},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 387, false, 276, -1, 276, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 390, false, -1, 279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 393},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 395, false, 278, -1, 278, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 398, false, -1, 281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 401},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 403, false, 280, -1, 280, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 406, false, -1, 283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 409},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 411, false, 282, -1, 282, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 414, false, -1, 285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 417},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 419, false, 284, -1, 284, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 422, false, -1, 287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 425},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 427, false, 286, -1, 286, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 430, false, -1, 289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 433},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 435, false, 288, -1, 288, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 438, false, -1, 291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 441},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 443, false, 290, -1, 290, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 446, false, -1, 293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 449},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 451, false, 292, -1, 292, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 454},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 294, -1, 294, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 456, false, -1, 297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 459},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 461, false, 296, -1, 296, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 464, false, -1, 299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 467},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 469, false, 298, -1, 298, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 472, false, -1, 301, -1, -1, -1, false, false, false, false, utf8proc_sequences + 475},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 477, false, 300, -1, 300, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 480, false, -1, 303, -1, -1, -1, false, false, false, false, utf8proc_sequences + 483},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 485, false, 302, -1, 302, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 488, false, -1, 105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 491},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 494, false, -1, 307, -1, -1, -1, false, false, false, false, utf8proc_sequences + 497},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 499, false, 306, -1, 306, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 502, false, -1, 309, -1, -1, -1, false, false, false, false, utf8proc_sequences + 505},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 507, false, 308, -1, 308, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 510, false, -1, 311, -1, -1, -1, false, false, false, false, utf8proc_sequences + 513},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 515, false, 310, -1, 310, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 518, false, -1, 314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 521},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 523, false, 313, -1, 313, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 526, false, -1, 316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 529},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 531, false, 315, -1, 315, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 534, false, -1, 318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 537},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 539, false, 317, -1, 317, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 542, false, -1, 320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 545},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 547, false, 319, -1, 319, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 550},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 321, -1, 321, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 552, false, -1, 324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 555},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 557, false, 323, -1, 323, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 560, false, -1, 326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 563},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 565, false, 325, -1, 325, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 568, false, -1, 328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 571},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 573, false, 327, -1, 327, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 576, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 576},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 579},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 330, -1, 330, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 581, false, -1, 333, -1, 9600, -1, false, false, false, false, utf8proc_sequences + 584},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 586, false, 332, -1, 332, 9660, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 589, false, -1, 335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 592},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 594, false, 334, -1, 334, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 597, false, -1, 337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 600},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 602, false, 336, -1, 336, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 605},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 338, -1, 338, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 607, false, -1, 341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 610},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 612, false, 340, -1, 340, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 615, false, -1, 343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 618},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 620, false, 342, -1, 342, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 623, false, -1, 345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 626},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 628, false, 344, -1, 344, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 631, false, -1, 347, -1, 9960, -1, false, false, false, false, utf8proc_sequences + 634},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 636, false, 346, -1, 346, 10020, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 639, false, -1, 349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 642},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 644, false, 348, -1, 348, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 647, false, -1, 351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 650},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 652, false, 350, -1, 350, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 655, false, -1, 353, -1, 10080, -1, false, false, false, false, utf8proc_sequences + 658},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 660, false, 352, -1, 352, 10140, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 663, false, -1, 355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 666},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 668, false, 354, -1, 354, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 671, false, -1, 357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 674},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 676, false, 356, -1, 356, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 679},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 358, -1, 358, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 681, false, -1, 361, -1, 10320, -1, false, false, false, false, utf8proc_sequences + 684},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 686, false, 360, -1, 360, 10380, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 689, false, -1, 363, -1, 10440, -1, false, false, false, false, utf8proc_sequences + 692},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 694, false, 362, -1, 362, 10500, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 697, false, -1, 365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 700},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 702, false, 364, -1, 364, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 705, false, -1, 367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 708},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 710, false, 366, -1, 366, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 713, false, -1, 369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 716},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 718, false, 368, -1, 368, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 721, false, -1, 371, -1, -1, -1, false, false, false, false, utf8proc_sequences + 724},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 726, false, 370, -1, 370, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 729, false, -1, 373, -1, -1, -1, false, false, false, false, utf8proc_sequences + 732},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 734, false, 372, -1, 372, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 737, false, -1, 375, -1, -1, -1, false, false, false, false, utf8proc_sequences + 740},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 742, false, 374, -1, 374, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 745, false, -1, 255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 748},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 750, false, -1, 378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 753},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 755, false, 377, -1, 377, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 758, false, -1, 380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 761},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 763, false, 379, -1, 379, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 766, false, -1, 382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 769},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 771, false, 381, -1, 381, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 36, false, 83, -1, 83, 10800, -1, false, false, false, false, utf8proc_sequences + 36},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 579, -1, 579, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 595, -1, -1, -1, false, false, false, false, utf8proc_sequences + 774},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 776},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 386, -1, 386, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 778},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 388, -1, 388, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 596, -1, -1, -1, false, false, false, false, utf8proc_sequences + 780},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 782},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 391, -1, 391, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 598, -1, -1, -1, false, false, false, false, utf8proc_sequences + 784},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 599, -1, -1, -1, false, false, false, false, utf8proc_sequences + 786},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 788},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 395, -1, 395, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 790},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 792},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 794},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 796},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 401, -1, 401, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 798},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 800},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 502, -1, 502, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 802},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 804},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 806},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 408, -1, 408, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 573, -1, 573, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 808},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 810},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 544, -1, 544, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 812},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 814, false, -1, 417, -1, 11700, -1, false, false, false, false, utf8proc_sequences + 817},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 819, false, 416, -1, 416, 11760, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 822},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 418, -1, 418, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 824},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 420, -1, 420, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 640, -1, -1, -1, false, false, false, false, utf8proc_sequences + 826},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 828},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 423, -1, 423, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 643, -1, -1, -1, false, false, false, false, utf8proc_sequences + 830},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 832},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 428, -1, 428, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 648, -1, -1, -1, false, false, false, false, utf8proc_sequences + 834},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 836, false, -1, 432, -1, 11820, -1, false, false, false, false, utf8proc_sequences + 839},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 841, false, 431, -1, 431, 11880, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 650, -1, -1, -1, false, false, false, false, utf8proc_sequences + 844},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 651, -1, -1, -1, false, false, false, false, utf8proc_sequences + 846},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 848},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 435, -1, 435, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 850},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 437, -1, 437, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 658, -1, 2880, -1, false, false, false, false, utf8proc_sequences + 852},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 854},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 440, -1, 440, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 856},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 444, -1, 444, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 503, -1, 503, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 858, false, -1, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 863, false, 452, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 866, false, 452, -1, 453, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 869, false, -1, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 874, false, 455, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 877, false, 455, -1, 456, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 880, false, -1, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 885, false, 458, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 888, false, 458, -1, 459, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 891, false, -1, 462, -1, -1, -1, false, false, false, false, utf8proc_sequences + 894},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 896, false, 461, -1, 461, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 899, false, -1, 464, -1, -1, -1, false, false, false, false, utf8proc_sequences + 902},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 904, false, 463, -1, 463, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 907, false, -1, 466, -1, -1, -1, false, false, false, false, utf8proc_sequences + 910},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 912, false, 465, -1, 465, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 915, false, -1, 468, -1, -1, -1, false, false, false, false, utf8proc_sequences + 918},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 920, false, 467, -1, 467, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 923, false, -1, 470, -1, -1, -1, false, false, false, false, utf8proc_sequences + 926},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 928, false, 469, -1, 469, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 931, false, -1, 472, -1, -1, -1, false, false, false, false, utf8proc_sequences + 934},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 936, false, 471, -1, 471, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 939, false, -1, 474, -1, -1, -1, false, false, false, false, utf8proc_sequences + 942},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 944, false, 473, -1, 473, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 947, false, -1, 476, -1, -1, -1, false, false, false, false, utf8proc_sequences + 950},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 952, false, 475, -1, 475, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 398, -1, 398, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 955, false, -1, 479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 958},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 960, false, 478, -1, 478, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 963, false, -1, 481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 966},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 968, false, 480, -1, 480, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 971, false, -1, 483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 974},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 976, false, 482, -1, 482, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 979},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 484, -1, 484, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 981, false, -1, 487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 984},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 986, false, 486, -1, 486, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 989, false, -1, 489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 992},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 994, false, 488, -1, 488, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 997, false, -1, 491, -1, 2760, -1, false, false, false, false, utf8proc_sequences + 1000},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1002, false, 490, -1, 490, 2820, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1005, false, -1, 493, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1008},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1010, false, 492, -1, 492, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1013, false, -1, 495, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1016},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1018, false, 494, -1, 494, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1021, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1021},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1024, false, -1, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1029, false, 497, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1032, false, 497, -1, 498, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1035, false, -1, 501, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1038},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1040, false, 500, -1, 500, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1043},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1045},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1047, false, -1, 505, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1050},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1052, false, 504, -1, 504, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1055, false, -1, 507, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1058},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1060, false, 506, -1, 506, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1063, false, -1, 509, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1066},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1068, false, 508, -1, 508, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1071, false, -1, 511, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1074},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1076, false, 510, -1, 510, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1079, false, -1, 513, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1082},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1084, false, 512, -1, 512, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1087, false, -1, 515, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1090},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1092, false, 514, -1, 514, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1095, false, -1, 517, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1098},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1100, false, 516, -1, 516, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1103, false, -1, 519, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1106},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1108, false, 518, -1, 518, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1111, false, -1, 521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1114},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1116, false, 520, -1, 520, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1119, false, -1, 523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1122},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1124, false, 522, -1, 522, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1127, false, -1, 525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1130},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1132, false, 524, -1, 524, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1135, false, -1, 527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1138},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1140, false, 526, -1, 526, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1143, false, -1, 529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1146},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1148, false, 528, -1, 528, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1151, false, -1, 531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1154},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1156, false, 530, -1, 530, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1159, false, -1, 533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1162},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1164, false, 532, -1, 532, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1167, false, -1, 535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1170},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1172, false, 534, -1, 534, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1175, false, -1, 537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1178},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1180, false, 536, -1, 536, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1183, false, -1, 539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1186},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1188, false, 538, -1, 538, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1191},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 540, -1, 540, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1193, false, -1, 543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1196},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1198, false, 542, -1, 542, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1201},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1203},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 546, -1, 546, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1205},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 548, -1, 548, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1207, false, -1, 551, -1, 2520, -1, false, false, false, false, utf8proc_sequences + 1210},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1212, false, 550, -1, 550, 2580, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1215, false, -1, 553, -1, 9000, -1, false, false, false, false, utf8proc_sequences + 1218},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1220, false, 552, -1, 552, 9060, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1223, false, -1, 555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1226},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1228, false, 554, -1, 554, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1231, false, -1, 557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1234},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1236, false, 556, -1, 556, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1239, false, -1, 559, -1, 3480, -1, false, false, false, false, utf8proc_sequences + 1242},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1244, false, 558, -1, 558, 3540, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1247, false, -1, 561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1250},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1252, false, 560, -1, 560, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1255, false, -1, 563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1258},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1260, false, 562, -1, 562, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1263},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1265},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 571, -1, 571, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1267},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1269},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 578, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1271},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 577, -1, 577, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1273},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 649, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1275},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 652, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1277},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 583, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1279},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 582, -1, 582, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 585, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1281},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 584, -1, 584, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 587, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1283},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 586, -1, 586, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 589, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1285},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 588, -1, 588, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 591, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1287},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 590, -1, 590, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 385, -1, 385, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 390, -1, 390, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 393, -1, 393, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 394, -1, 394, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 399, -1, 399, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 400, -1, 400, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 403, -1, 403, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 404, -1, 404, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 407, -1, 407, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 406, -1, 406, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11362, -1, 11362, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 412, -1, 412, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 413, -1, 413, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 415, -1, 415, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11364, -1, 11364, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 422, -1, 422, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 425, -1, 425, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 430, -1, 430, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 580, -1, 580, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 433, -1, 433, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 434, -1, 434, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 581, -1, 581, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 439, -1, 439, 2940, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 0, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 2, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 3, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 7, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 8, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 10, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 4, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 46, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 5, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 12, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 11, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 14, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 15, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 47, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 48, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 13, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 40, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 45, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 39, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 16, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 6, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 9, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 42, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 44, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 43, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 41, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 51, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1317, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1319, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 49, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1321, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1323, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 240, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, 921, -1, 921, -1, 50, false, false, false, true, utf8proc_sequences + 1326},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 233, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1021, -1, 1021, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1022, -1, 1022, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1023, -1, 1023, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1338, false, -1, 940, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1341},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1345, false, -1, 941, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1348},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1350, false, -1, 942, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1353},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1355, false, -1, 943, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1358},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1360, false, -1, 972, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1363},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1365, false, -1, 973, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1368},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1370, false, -1, 974, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1373},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1375, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 945, -1, 3660, -1, false, false, false, false, utf8proc_sequences + 1382},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 946, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1384},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 947, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1386},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 948, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1388},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 949, -1, 3720, -1, false, false, false, false, utf8proc_sequences + 1390},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 950, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1392},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 951, -1, 3780, -1, false, false, false, false, utf8proc_sequences + 1394},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 953, -1, 3840, -1, false, false, false, false, utf8proc_sequences + 1326},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1398},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1400},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 67},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1402},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 958, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1404},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 959, -1, 3900, -1, false, false, false, false, utf8proc_sequences + 1406},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 960, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1408},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 961, -1, 16260, -1, false, false, false, false, utf8proc_sequences + 1410},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 963, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1412},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 964, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1414},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 965, -1, 3960, -1, false, false, false, false, utf8proc_sequences + 1416},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 966, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1418},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 967, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1420},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 968, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1422},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 969, -1, 4020, -1, false, false, false, false, utf8proc_sequences + 1424},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1426, false, -1, 970, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1429},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1431, false, -1, 971, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1434},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1436, false, 902, -1, 902, 15780, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1439, false, 904, -1, 904, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1442, false, 905, -1, 905, 15960, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1445, false, 906, -1, 906, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1448, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 913, -1, 913, 4140, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 914, -1, 914, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 915, -1, 915, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 916, -1, 916, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 917, -1, 917, 4200, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 918, -1, 918, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 919, -1, 919, 4260, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 920, -1, 920, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 921, -1, 921, 4320, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 922, -1, 922, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 923, -1, 923, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 924, -1, 924, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 925, -1, 925, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 926, -1, 926, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 927, -1, 927, 4500, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 928, -1, 928, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 929, -1, 929, 16200, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, utf8proc_sequences + 1412},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 932, -1, 932, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 933, -1, 933, 4440, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 934, -1, 934, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 935, -1, 935, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 936, -1, 936, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 937, -1, 937, 4560, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1455, false, 938, -1, 938, 4080, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1458, false, 939, -1, 939, 4380, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1461, false, 908, -1, 908, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1464, false, 910, -1, 910, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1467, false, 911, -1, 911, 16380, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1384, false, 914, -1, 914, -1, -1, false, false, false, false, utf8proc_sequences + 1384},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1396, false, 920, -1, 920, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1470, false, -1, -1, -1, 4620, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1418, false, 934, -1, 934, -1, -1, false, false, false, false, utf8proc_sequences + 1418},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1408, false, 928, -1, 928, -1, -1, false, false, false, false, utf8proc_sequences + 1408},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 985, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1478},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 984, -1, 984, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1480},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 986, -1, 986, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1482},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 988, -1, 988, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1484},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 990, -1, 990, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 993, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1486},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 992, -1, 992, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 995, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1488},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 994, -1, 994, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 997, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1490},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 996, -1, 996, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 999, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1492},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 998, -1, 998, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1001, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1494},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1000, -1, 1000, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1496},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1002, -1, 1002, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1498},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1004, -1, 1004, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1007, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1500},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1006, -1, 1006, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1398, false, 922, -1, 922, -1, -1, false, false, false, false, utf8proc_sequences + 1398},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1410, false, 929, -1, 929, -1, -1, false, false, false, false, utf8proc_sequences + 1410},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1502, false, 1017, -1, 1017, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1504, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1390, false, 917, -1, 917, -1, -1, false, false, false, false, utf8proc_sequences + 1390},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1016, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1506},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1015, -1, 1015, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1508, false, -1, 1010, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1510},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1512},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1018, -1, 1018, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1514},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 892, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1516},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1518},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1520, false, -1, 1104, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1523},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1525, false, -1, 1105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1528},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1106, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1530},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1532, false, -1, 1107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1535},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1108, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1537},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1109, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1539},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1110, -1, 4800, -1, false, false, false, false, utf8proc_sequences + 1541},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1543, false, -1, 1111, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1546},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1548},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1550},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1114, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1552},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1554},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1556, false, -1, 1116, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1559},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1561, false, -1, 1117, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1564},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1566, false, -1, 1118, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1569},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1119, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1571},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1072, -1, 5640, -1, false, false, false, false, utf8proc_sequences + 1573},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1073, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1575},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1074, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1577},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1075, -1, 4740, -1, false, false, false, false, utf8proc_sequences + 1579},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1076, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1581},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1077, -1, 4680, -1, false, false, false, false, utf8proc_sequences + 1583},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1078, -1, 5520, -1, false, false, false, false, utf8proc_sequences + 1585},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1079, -1, 5880, -1, false, false, false, false, utf8proc_sequences + 1587},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1080, -1, 4920, -1, false, false, false, false, utf8proc_sequences + 1589},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1591, false, -1, 1081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1594},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1082, -1, 4860, -1, false, false, false, false, utf8proc_sequences + 1596},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1598},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1600},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1602},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1086, -1, 6000, -1, false, false, false, false, utf8proc_sequences + 1604},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1606},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1088, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1608},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1089, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1610},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1090, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1612},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1091, -1, 4980, -1, false, false, false, false, utf8proc_sequences + 1614},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1092, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1616},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1093, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1618},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1094, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1620},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1095, -1, 6360, -1, false, false, false, false, utf8proc_sequences + 1622},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1624},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1626},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1628},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1099, -1, 6480, -1, false, false, false, false, utf8proc_sequences + 1630},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1632},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1101, -1, 6240, -1, false, false, false, false, utf8proc_sequences + 1634},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1636},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1638},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1040, -1, 1040, 5700, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1041, -1, 1041, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1042, -1, 1042, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1043, -1, 1043, 5160, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1044, -1, 1044, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1045, -1, 1045, 5100, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1046, -1, 1046, 5580, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1047, -1, 1047, 5940, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1048, -1, 1048, 5040, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1640, false, 1049, -1, 1049, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1050, -1, 1050, 5280, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1051, -1, 1051, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1052, -1, 1052, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1053, -1, 1053, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1054, -1, 1054, 6060, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1055, -1, 1055, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1056, -1, 1056, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1057, -1, 1057, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1058, -1, 1058, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1059, -1, 1059, 5340, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1060, -1, 1060, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1061, -1, 1061, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1062, -1, 1062, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1063, -1, 1063, 6420, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1064, -1, 1064, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1065, -1, 1065, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1066, -1, 1066, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1067, -1, 1067, 6540, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1068, -1, 1068, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1069, -1, 1069, 6300, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1070, -1, 1070, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1071, -1, 1071, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1643, false, 1024, -1, 1024, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1646, false, 1025, -1, 1025, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1026, -1, 1026, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1649, false, 1027, -1, 1027, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1028, -1, 1028, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1029, -1, 1029, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1030, -1, 1030, 5220, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1652, false, 1031, -1, 1031, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1032, -1, 1032, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1033, -1, 1033, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1034, -1, 1034, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1035, -1, 1035, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1655, false, 1036, -1, 1036, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1658, false, 1037, -1, 1037, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1661, false, 1038, -1, 1038, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1039, -1, 1039, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1121, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1664},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1120, -1, 1120, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1123, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1666},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1122, -1, 1122, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1125, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1668},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1124, -1, 1124, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1127, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1670},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1126, -1, 1126, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1129, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1672},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1128, -1, 1128, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1674},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1130, -1, 1130, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1133, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1676},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1132, -1, 1132, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1135, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1678},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1134, -1, 1134, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1137, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1680},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1136, -1, 1136, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1139, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1682},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1138, -1, 1138, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1141, -1, 5400, -1, false, false, false, false, utf8proc_sequences + 1684},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1140, -1, 1140, 5460, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1686, false, -1, 1143, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1689},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1691, false, 1142, -1, 1142, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1694},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1144, -1, 1144, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1147, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1696},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1146, -1, 1146, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1149, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1698},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1148, -1, 1148, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1151, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1700},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1150, -1, 1150, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1153, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1702},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1152, -1, 1152, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ME, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1163, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1704},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1162, -1, 1162, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1706},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1164, -1, 1164, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1167, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1708},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1166, -1, 1166, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1169, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1710},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1168, -1, 1168, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1171, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1712},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1170, -1, 1170, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1173, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1714},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1172, -1, 1172, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1175, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1716},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1174, -1, 1174, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1177, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1718},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1176, -1, 1176, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1720},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1178, -1, 1178, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1181, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1722},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1180, -1, 1180, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1183, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1724},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1182, -1, 1182, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1185, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1726},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1184, -1, 1184, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1187, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1728},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1186, -1, 1186, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1189, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1730},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1188, -1, 1188, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1191, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1732},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1190, -1, 1190, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1193, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1734},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1192, -1, 1192, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1195, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1736},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1194, -1, 1194, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1197, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1738},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1196, -1, 1196, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1199, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1740},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1198, -1, 1198, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1201, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1742},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1200, -1, 1200, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1203, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1744},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1202, -1, 1202, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1205, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1746},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1204, -1, 1204, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1207, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1748},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1206, -1, 1206, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1209, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1750},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1208, -1, 1208, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1211, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1752},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1210, -1, 1210, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1213, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1754},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1212, -1, 1212, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1215, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1756},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1214, -1, 1214, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1231, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1758},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1760, false, -1, 1218, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1763},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1765, false, 1217, -1, 1217, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1220, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1768},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1219, -1, 1219, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1222, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1770},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1221, -1, 1221, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1772},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1223, -1, 1223, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1226, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1774},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1225, -1, 1225, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1228, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1776},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1227, -1, 1227, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1230, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1778},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1229, -1, 1229, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1216, -1, 1216, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1780, false, -1, 1233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1783},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1785, false, 1232, -1, 1232, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1788, false, -1, 1235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1791},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1793, false, 1234, -1, 1234, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1796},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1236, -1, 1236, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1798, false, -1, 1239, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1801},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1803, false, 1238, -1, 1238, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1241, -1, 5760, -1, false, false, false, false, utf8proc_sequences + 1806},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1240, -1, 1240, 5820, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1808, false, -1, 1243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1811},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1813, false, 1242, -1, 1242, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1816, false, -1, 1245, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1819},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1821, false, 1244, -1, 1244, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1824, false, -1, 1247, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1827},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1829, false, 1246, -1, 1246, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1832},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1248, -1, 1248, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1834, false, -1, 1251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1837},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1839, false, 1250, -1, 1250, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1842, false, -1, 1253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1845},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1847, false, 1252, -1, 1252, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1850, false, -1, 1255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1853},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1855, false, 1254, -1, 1254, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1257, -1, 6120, -1, false, false, false, false, utf8proc_sequences + 1858},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1256, -1, 1256, 6180, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1860, false, -1, 1259, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1863},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1865, false, 1258, -1, 1258, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1868, false, -1, 1261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1871},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1873, false, 1260, -1, 1260, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1876, false, -1, 1263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1879},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1881, false, 1262, -1, 1262, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1884, false, -1, 1265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1887},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1889, false, 1264, -1, 1264, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1892, false, -1, 1267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1895},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1897, false, 1266, -1, 1266, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1900, false, -1, 1269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1903},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1905, false, 1268, -1, 1268, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1908},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1270, -1, 1270, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1910, false, -1, 1273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1913},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1915, false, 1272, -1, 1272, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1275, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1918},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1274, -1, 1274, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1920},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1276, -1, 1276, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1922},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1278, -1, 1278, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1924},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1280, -1, 1280, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1926},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1282, -1, 1282, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1928},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1284, -1, 1284, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1930},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1286, -1, 1286, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1932},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1288, -1, 1288, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1934},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1290, -1, 1290, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1936},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1292, -1, 1292, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1938},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1294, -1, 1294, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1940},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1296, -1, 1296, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1942},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1298, -1, 1298, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1377, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1944},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1946},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1379, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1948},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1950},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1381, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1952},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1954},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1383, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1956},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1958},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1385, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1960},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1386, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1962},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1964},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1388, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1966},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1968},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1390, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1970},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1391, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1972},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1974},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1976},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1394, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1978},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1980},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1982},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1984},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1398, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1986},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1988},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1400, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1990},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1992},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1994},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1996},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1404, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1998},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2000},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1406, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2002},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2004},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1408, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2006},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2008},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2010},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2012},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1412, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2014},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2016},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2018},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1329, -1, 1329, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1330, -1, 1330, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1331, -1, 1331, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1332, -1, 1332, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1333, -1, 1333, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1334, -1, 1334, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1335, -1, 1335, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1336, -1, 1336, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1337, -1, 1337, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1338, -1, 1338, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1339, -1, 1339, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1340, -1, 1340, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1341, -1, 1341, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1342, -1, 1342, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1343, -1, 1343, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1344, -1, 1344, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1345, -1, 1345, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1346, -1, 1346, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1347, -1, 1347, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1348, -1, 1348, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1349, -1, 1349, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1350, -1, 1350, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1351, -1, 1351, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1352, -1, 1352, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1353, -1, 1353, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1354, -1, 1354, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1355, -1, 1355, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1356, -1, 1356, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1357, -1, 1357, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1358, -1, 1358, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1359, -1, 1359, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1360, -1, 1360, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1361, -1, 1361, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1362, -1, 1362, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1363, -1, 1363, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1364, -1, 1364, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1365, -1, 1365, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1366, -1, 1366, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2020, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2020},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 222, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 228, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 10, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 11, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 12, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 13, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 14, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 15, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 16, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 17, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 18, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 19, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 20, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 21, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 22, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 23, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 24, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 25, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6600, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6660, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6720, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 27, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 28, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 29, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 30, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 31, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 32, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 33, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 34, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 17, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 18, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 19, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 35, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6840, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6900, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6780, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 36, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 6960, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7020, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7080, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 20, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2068, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2071, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2074, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2077, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2080, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2083, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2086, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2089, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 21, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7140, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 22, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2098, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2101, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2104, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2107, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2110, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2113, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2116, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2119, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2122, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 24, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7200, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 23, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 25, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2134, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2137, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7260, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 27, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7320, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7380, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 26, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 7440, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2152, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 84, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 91, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 28, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7500, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 31, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7560, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2164, false, -1, -1, -1, 7620, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 29, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 30, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 32, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7680, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7740, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 33, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 34, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 35, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7800, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2182, false, -1, -1, -1, 7860, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 36, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 103, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 107, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 118, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 122, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 2203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2205, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2208, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2211, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2214, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2217, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2220, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 129, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 130, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2223, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 132, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2226, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2229, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2232, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2235, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2238, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2241, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2244, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2247, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2250, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2253, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2256, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2259, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7920, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 37, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11520, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2265},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2267},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11522, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2269},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2271},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11524, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2273},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2275},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2277},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2279},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11528, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2281},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2283},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11530, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2285},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2287},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11532, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2289},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2291},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11534, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2293},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2295},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11536, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2297},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2299},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11538, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2301},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2303},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11540, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2305},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2307},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11542, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2309},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2311},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11544, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2313},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11545, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2315},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11546, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2317},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2319},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11548, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2321},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2323},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11550, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2325},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11551, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2327},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11552, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2329},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11553, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2331},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11554, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2333},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2335},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11556, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2337},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2339},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7980, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8040, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8100, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8160, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8220, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8280, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 38, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8340, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8400, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8460, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8520, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8580, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11363, -1, 11363, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2476, false, -1, 7681, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2479},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2481, false, 7680, -1, 7680, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2484, false, -1, 7683, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2487},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2489, false, 7682, -1, 7682, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2492, false, -1, 7685, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2495},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2497, false, 7684, -1, 7684, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2500, false, -1, 7687, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2503},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2505, false, 7686, -1, 7686, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2508, false, -1, 7689, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2511},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2513, false, 7688, -1, 7688, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2516, false, -1, 7691, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2519},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2521, false, 7690, -1, 7690, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2524, false, -1, 7693, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2527},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2529, false, 7692, -1, 7692, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2532, false, -1, 7695, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2535},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2537, false, 7694, -1, 7694, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2540, false, -1, 7697, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2543},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2545, false, 7696, -1, 7696, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2548, false, -1, 7699, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2551},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2553, false, 7698, -1, 7698, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2556, false, -1, 7701, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2559},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2561, false, 7700, -1, 7700, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2564, false, -1, 7703, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2567},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2569, false, 7702, -1, 7702, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2572, false, -1, 7705, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2575},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2577, false, 7704, -1, 7704, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2580, false, -1, 7707, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2583},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2585, false, 7706, -1, 7706, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2588, false, -1, 7709, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2591},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2593, false, 7708, -1, 7708, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2596, false, -1, 7711, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2599},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2601, false, 7710, -1, 7710, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2604, false, -1, 7713, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2607},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2609, false, 7712, -1, 7712, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2612, false, -1, 7715, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2615},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2617, false, 7714, -1, 7714, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2620, false, -1, 7717, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2623},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2625, false, 7716, -1, 7716, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2628, false, -1, 7719, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2631},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2633, false, 7718, -1, 7718, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2636, false, -1, 7721, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2639},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2641, false, 7720, -1, 7720, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2644, false, -1, 7723, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2647},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2649, false, 7722, -1, 7722, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2652, false, -1, 7725, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2655},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2657, false, 7724, -1, 7724, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2660, false, -1, 7727, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2663},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2665, false, 7726, -1, 7726, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2668, false, -1, 7729, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2671},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2673, false, 7728, -1, 7728, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2676, false, -1, 7731, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2679},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2681, false, 7730, -1, 7730, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2684, false, -1, 7733, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2687},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2689, false, 7732, -1, 7732, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2692, false, -1, 7735, -1, 9360, -1, false, false, false, false, utf8proc_sequences + 2695},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2697, false, 7734, -1, 7734, 9420, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2700, false, -1, 7737, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2703},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2705, false, 7736, -1, 7736, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2708, false, -1, 7739, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2711},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2713, false, 7738, -1, 7738, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2716, false, -1, 7741, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2719},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2721, false, 7740, -1, 7740, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2724, false, -1, 7743, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2727},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2729, false, 7742, -1, 7742, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2732, false, -1, 7745, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2735},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2737, false, 7744, -1, 7744, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2740, false, -1, 7747, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2743},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2745, false, 7746, -1, 7746, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2748, false, -1, 7749, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2751},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2753, false, 7748, -1, 7748, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2756, false, -1, 7751, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2759},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2761, false, 7750, -1, 7750, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2764, false, -1, 7753, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2767},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2769, false, 7752, -1, 7752, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2772, false, -1, 7755, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2775},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2777, false, 7754, -1, 7754, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2780, false, -1, 7757, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2783},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2785, false, 7756, -1, 7756, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2788, false, -1, 7759, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2791},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2793, false, 7758, -1, 7758, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2796, false, -1, 7761, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2799},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2801, false, 7760, -1, 7760, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2804, false, -1, 7763, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2807},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2809, false, 7762, -1, 7762, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2812, false, -1, 7765, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2815},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2817, false, 7764, -1, 7764, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2820, false, -1, 7767, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2823},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2825, false, 7766, -1, 7766, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2828, false, -1, 7769, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2831},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2833, false, 7768, -1, 7768, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2836, false, -1, 7771, -1, 9840, -1, false, false, false, false, utf8proc_sequences + 2839},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2841, false, 7770, -1, 7770, 9900, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2844, false, -1, 7773, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2847},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2849, false, 7772, -1, 7772, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2852, false, -1, 7775, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2855},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2857, false, 7774, -1, 7774, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2860, false, -1, 7777, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2863},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2865, false, 7776, -1, 7776, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2868, false, -1, 7779, -1, 10200, -1, false, false, false, false, utf8proc_sequences + 2871},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2873, false, 7778, -1, 7778, 10260, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2876, false, -1, 7781, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2879},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2881, false, 7780, -1, 7780, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2884, false, -1, 7783, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2887},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2889, false, 7782, -1, 7782, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2892, false, -1, 7785, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2895},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2897, false, 7784, -1, 7784, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2900, false, -1, 7787, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2903},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2905, false, 7786, -1, 7786, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2908, false, -1, 7789, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2911},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2913, false, 7788, -1, 7788, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2916, false, -1, 7791, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2919},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2921, false, 7790, -1, 7790, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2924, false, -1, 7793, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2927},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2929, false, 7792, -1, 7792, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2932, false, -1, 7795, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2935},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2937, false, 7794, -1, 7794, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2940, false, -1, 7797, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2943},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2945, false, 7796, -1, 7796, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2948, false, -1, 7799, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2951},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2953, false, 7798, -1, 7798, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2956, false, -1, 7801, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2959},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2961, false, 7800, -1, 7800, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2964, false, -1, 7803, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2967},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2969, false, 7802, -1, 7802, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2972, false, -1, 7805, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2975},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2977, false, 7804, -1, 7804, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2980, false, -1, 7807, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2983},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2985, false, 7806, -1, 7806, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2988, false, -1, 7809, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2991},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2993, false, 7808, -1, 7808, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2996, false, -1, 7811, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2999},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3001, false, 7810, -1, 7810, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3004, false, -1, 7813, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3007},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3009, false, 7812, -1, 7812, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3012, false, -1, 7815, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3015},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3017, false, 7814, -1, 7814, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3020, false, -1, 7817, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3023},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3025, false, 7816, -1, 7816, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3028, false, -1, 7819, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3031},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3033, false, 7818, -1, 7818, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3036, false, -1, 7821, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3039},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3041, false, 7820, -1, 7820, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3044, false, -1, 7823, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3047},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3049, false, 7822, -1, 7822, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3052, false, -1, 7825, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3055},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3057, false, 7824, -1, 7824, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3060, false, -1, 7827, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3063},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3065, false, 7826, -1, 7826, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3068, false, -1, 7829, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3071},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3073, false, 7828, -1, 7828, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3076, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3076},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3079, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3079},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3082, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3082},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3085, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3085},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 3088, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3088},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3091, false, 7776, -1, 7776, -1, -1, false, false, false, false, utf8proc_sequences + 2863},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3094, false, -1, 7841, -1, 10980, -1, false, false, false, false, utf8proc_sequences + 3097},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3099, false, 7840, -1, 7840, 11040, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3102, false, -1, 7843, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3105},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3107, false, 7842, -1, 7842, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3110, false, -1, 7845, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3113},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3115, false, 7844, -1, 7844, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3118, false, -1, 7847, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3121},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3123, false, 7846, -1, 7846, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3126, false, -1, 7849, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3129},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3131, false, 7848, -1, 7848, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3134, false, -1, 7851, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3137},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3139, false, 7850, -1, 7850, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3142, false, -1, 7853, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3145},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3147, false, 7852, -1, 7852, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3150, false, -1, 7855, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3153},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3155, false, 7854, -1, 7854, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3158, false, -1, 7857, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3161},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3163, false, 7856, -1, 7856, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3166, false, -1, 7859, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3169},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3171, false, 7858, -1, 7858, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3174, false, -1, 7861, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3177},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3179, false, 7860, -1, 7860, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3182, false, -1, 7863, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3185},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3187, false, 7862, -1, 7862, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3190, false, -1, 7865, -1, 11340, -1, false, false, false, false, utf8proc_sequences + 3193},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3195, false, 7864, -1, 7864, 11400, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3198, false, -1, 7867, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3201},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3203, false, 7866, -1, 7866, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3206, false, -1, 7869, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3209},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3211, false, 7868, -1, 7868, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3214, false, -1, 7871, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3217},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3219, false, 7870, -1, 7870, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3222, false, -1, 7873, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3225},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3227, false, 7872, -1, 7872, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3230, false, -1, 7875, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3233},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3235, false, 7874, -1, 7874, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3238, false, -1, 7877, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3241},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3243, false, 7876, -1, 7876, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3246, false, -1, 7879, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3249},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3251, false, 7878, -1, 7878, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3254, false, -1, 7881, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3257},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3259, false, 7880, -1, 7880, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3262, false, -1, 7883, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3265},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3267, false, 7882, -1, 7882, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3270, false, -1, 7885, -1, 11580, -1, false, false, false, false, utf8proc_sequences + 3273},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3275, false, 7884, -1, 7884, 11640, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3278, false, -1, 7887, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3281},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3283, false, 7886, -1, 7886, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3286, false, -1, 7889, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3289},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3291, false, 7888, -1, 7888, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3294, false, -1, 7891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3297},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3299, false, 7890, -1, 7890, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3302, false, -1, 7893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3305},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3307, false, 7892, -1, 7892, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3310, false, -1, 7895, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3313},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3315, false, 7894, -1, 7894, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3318, false, -1, 7897, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3321},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3323, false, 7896, -1, 7896, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3326, false, -1, 7899, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3329},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3331, false, 7898, -1, 7898, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3334, false, -1, 7901, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3337},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3339, false, 7900, -1, 7900, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3342, false, -1, 7903, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3345},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3347, false, 7902, -1, 7902, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3350, false, -1, 7905, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3353},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3355, false, 7904, -1, 7904, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3358, false, -1, 7907, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3361},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3363, false, 7906, -1, 7906, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3366, false, -1, 7909, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3369},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3371, false, 7908, -1, 7908, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3374, false, -1, 7911, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3377},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3379, false, 7910, -1, 7910, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3382, false, -1, 7913, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3385},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3387, false, 7912, -1, 7912, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3390, false, -1, 7915, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3393},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3395, false, 7914, -1, 7914, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3398, false, -1, 7917, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3401},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3403, false, 7916, -1, 7916, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3406, false, -1, 7919, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3409},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3411, false, 7918, -1, 7918, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3414, false, -1, 7921, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3417},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3419, false, 7920, -1, 7920, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3422, false, -1, 7923, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3425},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3427, false, 7922, -1, 7922, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3430, false, -1, 7925, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3433},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3435, false, 7924, -1, 7924, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3438, false, -1, 7927, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3441},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3443, false, 7926, -1, 7926, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3446, false, -1, 7929, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3449},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3451, false, 7928, -1, 7928, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3454, false, 7944, -1, 7944, 11940, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3457, false, 7945, -1, 7945, 12000, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3460, false, 7946, -1, 7946, 13560, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3463, false, 7947, -1, 7947, 13620, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3466, false, 7948, -1, 7948, 13680, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3469, false, 7949, -1, 7949, 13740, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3472, false, 7950, -1, 7950, 13800, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3475, false, 7951, -1, 7951, 13860, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3478, false, -1, 7936, -1, 12060, -1, false, false, false, false, utf8proc_sequences + 3481},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3483, false, -1, 7937, -1, 12120, -1, false, false, false, false, utf8proc_sequences + 3486},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3488, false, -1, 7938, -1, 13920, -1, false, false, false, false, utf8proc_sequences + 3491},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3493, false, -1, 7939, -1, 13980, -1, false, false, false, false, utf8proc_sequences + 3496},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3498, false, -1, 7940, -1, 14040, -1, false, false, false, false, utf8proc_sequences + 3501},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3503, false, -1, 7941, -1, 14100, -1, false, false, false, false, utf8proc_sequences + 3506},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3508, false, -1, 7942, -1, 14160, -1, false, false, false, false, utf8proc_sequences + 3511},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3513, false, -1, 7943, -1, 14220, -1, false, false, false, false, utf8proc_sequences + 3516},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3518, false, 7960, -1, 7960, 12180, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3521, false, 7961, -1, 7961, 12240, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3524, false, 7962, -1, 7962, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3527, false, 7963, -1, 7963, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3530, false, 7964, -1, 7964, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3533, false, 7965, -1, 7965, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3536, false, -1, 7952, -1, 12300, -1, false, false, false, false, utf8proc_sequences + 3539},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3541, false, -1, 7953, -1, 12360, -1, false, false, false, false, utf8proc_sequences + 3544},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3546, false, -1, 7954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3549},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3551, false, -1, 7955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3554},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3556, false, -1, 7956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3559},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3561, false, -1, 7957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3564},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3566, false, 7976, -1, 7976, 12420, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3569, false, 7977, -1, 7977, 12480, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3572, false, 7978, -1, 7978, 14280, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3575, false, 7979, -1, 7979, 14340, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3578, false, 7980, -1, 7980, 14400, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3581, false, 7981, -1, 7981, 14460, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3584, false, 7982, -1, 7982, 14520, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3587, false, 7983, -1, 7983, 14580, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3590, false, -1, 7968, -1, 12540, -1, false, false, false, false, utf8proc_sequences + 3593},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3595, false, -1, 7969, -1, 12600, -1, false, false, false, false, utf8proc_sequences + 3598},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3600, false, -1, 7970, -1, 14640, -1, false, false, false, false, utf8proc_sequences + 3603},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3605, false, -1, 7971, -1, 14700, -1, false, false, false, false, utf8proc_sequences + 3608},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3610, false, -1, 7972, -1, 14760, -1, false, false, false, false, utf8proc_sequences + 3613},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3615, false, -1, 7973, -1, 14820, -1, false, false, false, false, utf8proc_sequences + 3618},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3620, false, -1, 7974, -1, 14880, -1, false, false, false, false, utf8proc_sequences + 3623},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3625, false, -1, 7975, -1, 14940, -1, false, false, false, false, utf8proc_sequences + 3628},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3630, false, 7992, -1, 7992, 12660, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3633, false, 7993, -1, 7993, 12720, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3636, false, 7994, -1, 7994, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3639, false, 7995, -1, 7995, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3642, false, 7996, -1, 7996, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3645, false, 7997, -1, 7997, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3648, false, 7998, -1, 7998, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3651, false, 7999, -1, 7999, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3654, false, -1, 7984, -1, 12780, -1, false, false, false, false, utf8proc_sequences + 3657},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3659, false, -1, 7985, -1, 12840, -1, false, false, false, false, utf8proc_sequences + 3662},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3664, false, -1, 7986, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3667},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3669, false, -1, 7987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3672},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3674, false, -1, 7988, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3677},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3679, false, -1, 7989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3682},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3684, false, -1, 7990, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3687},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3689, false, -1, 7991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3692},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3694, false, 8008, -1, 8008, 12900, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3697, false, 8009, -1, 8009, 12960, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3700, false, 8010, -1, 8010, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3703, false, 8011, -1, 8011, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3706, false, 8012, -1, 8012, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3709, false, 8013, -1, 8013, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3712, false, -1, 8000, -1, 13020, -1, false, false, false, false, utf8proc_sequences + 3715},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3717, false, -1, 8001, -1, 13080, -1, false, false, false, false, utf8proc_sequences + 3720},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3722, false, -1, 8002, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3725},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3727, false, -1, 8003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3730},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3732, false, -1, 8004, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3735},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3737, false, -1, 8005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3740},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3742, false, -1, -1, -1, 13140, -1, false, false, false, false, utf8proc_sequences + 3742},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3745, false, 8025, -1, 8025, 13200, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3751},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3755, false, 8027, -1, 8027, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3761},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3765, false, 8029, -1, 8029, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3771},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3775, false, 8031, -1, 8031, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3778, false, -1, 8017, -1, 13260, -1, false, false, false, false, utf8proc_sequences + 3781},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3783, false, -1, 8019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3786},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3788, false, -1, 8021, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3791},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3793, false, -1, 8023, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3796},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3798, false, 8040, -1, 8040, 13320, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3801, false, 8041, -1, 8041, 13380, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3804, false, 8042, -1, 8042, 15000, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3807, false, 8043, -1, 8043, 15060, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3810, false, 8044, -1, 8044, 15120, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3813, false, 8045, -1, 8045, 15180, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3816, false, 8046, -1, 8046, 15240, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3819, false, 8047, -1, 8047, 15300, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3822, false, -1, 8032, -1, 13440, -1, false, false, false, false, utf8proc_sequences + 3825},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3827, false, -1, 8033, -1, 13500, -1, false, false, false, false, utf8proc_sequences + 3830},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3832, false, -1, 8034, -1, 15360, -1, false, false, false, false, utf8proc_sequences + 3835},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3837, false, -1, 8035, -1, 15420, -1, false, false, false, false, utf8proc_sequences + 3840},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3842, false, -1, 8036, -1, 15480, -1, false, false, false, false, utf8proc_sequences + 3845},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3847, false, -1, 8037, -1, 15540, -1, false, false, false, false, utf8proc_sequences + 3850},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3852, false, -1, 8038, -1, 15600, -1, false, false, false, false, utf8proc_sequences + 3855},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3857, false, -1, 8039, -1, 15660, -1, false, false, false, false, utf8proc_sequences + 3860},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3862, false, 8122, -1, 8122, 15720, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1341, false, 8123, -1, 8123, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3865, false, 8136, -1, 8136, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1348, false, 8137, -1, 8137, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3868, false, 8138, -1, 8138, 15900, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1353, false, 8139, -1, 8139, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3871, false, 8154, -1, 8154, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1358, false, 8155, -1, 8155, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3874, false, 8184, -1, 8184, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1363, false, 8185, -1, 8185, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3877, false, 8170, -1, 8170, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1368, false, 8171, -1, 8171, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3880, false, 8186, -1, 8186, 16320, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1373, false, 8187, -1, 8187, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3883, false, 8072, -1, 8072, -1, -1, false, false, false, false, utf8proc_sequences + 3886},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3889, false, 8073, -1, 8073, -1, -1, false, false, false, false, utf8proc_sequences + 3892},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3895, false, 8074, -1, 8074, -1, -1, false, false, false, false, utf8proc_sequences + 3898},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3901, false, 8075, -1, 8075, -1, -1, false, false, false, false, utf8proc_sequences + 3904},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3907, false, 8076, -1, 8076, -1, -1, false, false, false, false, utf8proc_sequences + 3910},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3913, false, 8077, -1, 8077, -1, -1, false, false, false, false, utf8proc_sequences + 3916},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3919, false, 8078, -1, 8078, -1, -1, false, false, false, false, utf8proc_sequences + 3922},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3925, false, 8079, -1, 8079, -1, -1, false, false, false, false, utf8proc_sequences + 3928},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3931, false, -1, 8064, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3934},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3936, false, -1, 8065, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3939},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3941, false, -1, 8066, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3944},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3946, false, -1, 8067, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3949},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3951, false, -1, 8068, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3954},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3956, false, -1, 8069, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3959},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3961, false, -1, 8070, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3964},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3966, false, -1, 8071, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3969},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3971, false, 8088, -1, 8088, -1, -1, false, false, false, false, utf8proc_sequences + 3974},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3977, false, 8089, -1, 8089, -1, -1, false, false, false, false, utf8proc_sequences + 3980},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3983, false, 8090, -1, 8090, -1, -1, false, false, false, false, utf8proc_sequences + 3986},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3989, false, 8091, -1, 8091, -1, -1, false, false, false, false, utf8proc_sequences + 3992},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3995, false, 8092, -1, 8092, -1, -1, false, false, false, false, utf8proc_sequences + 3998},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4001, false, 8093, -1, 8093, -1, -1, false, false, false, false, utf8proc_sequences + 4004},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4007, false, 8094, -1, 8094, -1, -1, false, false, false, false, utf8proc_sequences + 4010},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4013, false, 8095, -1, 8095, -1, -1, false, false, false, false, utf8proc_sequences + 4016},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4019, false, -1, 8080, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4022},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4024, false, -1, 8081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4027},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4029, false, -1, 8082, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4032},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4034, false, -1, 8083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4037},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4039, false, -1, 8084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4042},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4044, false, -1, 8085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4047},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4049, false, -1, 8086, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4052},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4054, false, -1, 8087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4057},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4059, false, 8104, -1, 8104, -1, -1, false, false, false, false, utf8proc_sequences + 4062},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4065, false, 8105, -1, 8105, -1, -1, false, false, false, false, utf8proc_sequences + 4068},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4071, false, 8106, -1, 8106, -1, -1, false, false, false, false, utf8proc_sequences + 4074},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4077, false, 8107, -1, 8107, -1, -1, false, false, false, false, utf8proc_sequences + 4080},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4083, false, 8108, -1, 8108, -1, -1, false, false, false, false, utf8proc_sequences + 4086},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4089, false, 8109, -1, 8109, -1, -1, false, false, false, false, utf8proc_sequences + 4092},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4095, false, 8110, -1, 8110, -1, -1, false, false, false, false, utf8proc_sequences + 4098},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4101, false, 8111, -1, 8111, -1, -1, false, false, false, false, utf8proc_sequences + 4104},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4107, false, -1, 8096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4110},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4112, false, -1, 8097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4115},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4117, false, -1, 8098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4120},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4122, false, -1, 8099, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4125},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4127, false, -1, 8100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4130},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4132, false, -1, 8101, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4135},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4137, false, -1, 8102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4140},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4142, false, -1, 8103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4145},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4147, false, 8120, -1, 8120, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4150, false, 8121, -1, 8121, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4153, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4156},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4159, false, 8124, -1, 8124, -1, -1, false, false, false, false, utf8proc_sequences + 4162},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4165, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4168},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4171, false, -1, -1, -1, 15840, -1, false, false, false, false, utf8proc_sequences + 4171},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4174, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4177},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4181, false, -1, 8112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4184},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4186, false, -1, 8113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4189},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4191, false, -1, 8048, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4194},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4196, false, -1, 8049, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4198},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4200, false, -1, 8115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4203},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1326, false, 921, -1, 921, -1, -1, false, false, false, false, utf8proc_sequences + 1326},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, 16080, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4214, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4217},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4220, false, 8140, -1, 8140, -1, -1, false, false, false, false, utf8proc_sequences + 4223},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4226, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4229},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4232, false, -1, -1, -1, 16020, -1, false, false, false, false, utf8proc_sequences + 4232},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4235, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4238},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4242, false, -1, 8050, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4245},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4247, false, -1, 8051, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4249},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4251, false, -1, 8052, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4254},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4256, false, -1, 8053, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4258},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4260, false, -1, 8131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4263},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4274, false, 8152, -1, 8152, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4277, false, 8153, -1, 8153, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4280, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4283},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4287, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4289, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4289},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4292, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4295},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4299, false, -1, 8144, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4302},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4304, false, -1, 8145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4307},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4309, false, -1, 8054, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4312},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4314, false, -1, 8055, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4316},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4327, false, 8168, -1, 8168, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4330, false, 8169, -1, 8169, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4333, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4336},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4340, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4342, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4342},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4345, false, 8172, -1, 8172, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4348, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4348},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4351, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4354},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4358, false, -1, 8160, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4361},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4363, false, -1, 8161, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4366},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4368, false, -1, 8058, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4371},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4373, false, -1, 8059, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4375},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4377, false, -1, 8165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4380},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4389, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4392},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4395, false, 8188, -1, 8188, -1, -1, false, false, false, false, utf8proc_sequences + 4398},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4401, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4404},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4407, false, -1, -1, -1, 16440, -1, false, false, false, false, utf8proc_sequences + 4407},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4410, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4413},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4417, false, -1, 8056, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4420},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4422, false, -1, 8057, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4424},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4426, false, -1, 8060, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4429},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4431, false, -1, 8061, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4433},
-  {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4435, false, -1, 8179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4438},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4442, false, -1, -1, -1, 16140, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, true, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 4449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ZL, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
-  {UTF8PROC_CATEGORY_ZP, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_PDF, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4567, false, -1, 969, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1424},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2396, false, -1, 107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 20},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4569, false, -1, 229, -1, -1, -1, false, false, false, false, utf8proc_sequences + 114},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4573},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4591, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8498, -1, 8498, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2392, false, -1, 8560, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4644},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4646, false, -1, 8561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4649},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4651, false, -1, 8562, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4655},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4657, false, -1, 8563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4660},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4662, false, -1, 8564, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4664},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4666, false, -1, 8565, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4669},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4671, false, -1, 8566, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4675},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4677, false, -1, 8567, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4682},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4684, false, -1, 8568, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4687},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4689, false, -1, 8569, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4691},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4693, false, -1, 8570, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4696},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4698, false, -1, 8571, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4702},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2398, false, -1, 8572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4704},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4532, false, -1, 8573, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4706},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2382, false, -1, 8574, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4708},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2400, false, -1, 8575, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4710},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 16, false, 8544, -1, 8544, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4712, false, 8545, -1, 8545, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4715, false, 8546, -1, 8546, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4719, false, 8547, -1, 8547, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 42, false, 8548, -1, 8548, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4722, false, 8549, -1, 8549, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4725, false, 8550, -1, 8550, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4729, false, 8551, -1, 8551, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4734, false, 8552, -1, 8552, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 46, false, 8553, -1, 8553, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4737, false, 8554, -1, 8554, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4740, false, 8555, -1, 8555, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 22, false, 8556, -1, 8556, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4, false, 8557, -1, 8557, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6, false, 8558, -1, 8558, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 24, false, 8559, -1, 8559, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8580, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4744},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8579, -1, 8579, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16500, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16560, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16620, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16680, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16800, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16740, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16860, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4764, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16920, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4767, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16980, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4770, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17040, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4773, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17100, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4776, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4779, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4782, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4786, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4789, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17160, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4793, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17220, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4796, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17280, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4799, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17340, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4802, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17520, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4805, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17460, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4808, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17700, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17760, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4814, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4817, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4820, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4823, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17820, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17880, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4826, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4829, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17940, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18000, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4832, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4835, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18060, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18120, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18660, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18720, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4838, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4841, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18180, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18240, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4844, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4847, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18300, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18360, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4850, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4853, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18780, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18840, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18420, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18480, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18540, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18600, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4856, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4859, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4862, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4865, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18900, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18960, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19020, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19080, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4868, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4871, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4874, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4877, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4880, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4883, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4886, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4889, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4892, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4894, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2376, false, -1, 9424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5195},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2380, false, -1, 9425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5197},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4532, false, -1, 9426, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5199},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2382, false, -1, 9427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5201},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2384, false, -1, 9428, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5203},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4571, false, -1, 9429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5205},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2388, false, -1, 9430, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5207},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2390, false, -1, 9431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5209},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2392, false, -1, 9432, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5211},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2394, false, -1, 9433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5213},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2396, false, -1, 9434, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5215},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2398, false, -1, 9435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5217},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2400, false, -1, 9436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5219},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2402, false, -1, 9437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5221},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2404, false, -1, 9438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5223},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2408, false, -1, 9439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5225},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4553, false, -1, 9440, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5227},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2410, false, -1, 9441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5229},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5231, false, -1, 9442, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5233},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2412, false, -1, 9443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5235},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2414, false, -1, 9444, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5237},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4662, false, -1, 9445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5239},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2416, false, -1, 9446, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5241},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4689, false, -1, 9447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5243},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5245, false, -1, 9448, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5247},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4565, false, -1, 9449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5249},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 0, false, 9398, -1, 9398, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2, false, 9399, -1, 9399, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4, false, 9400, -1, 9400, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6, false, 9401, -1, 9401, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 8, false, 9402, -1, 9402, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 10, false, 9403, -1, 9403, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 12, false, 9404, -1, 9404, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 14, false, 9405, -1, 9405, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 16, false, 9406, -1, 9406, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 18, false, 9407, -1, 9407, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 20, false, 9408, -1, 9408, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 22, false, 9409, -1, 9409, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 24, false, 9410, -1, 9410, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 26, false, 9411, -1, 9411, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 28, false, 9412, -1, 9412, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 30, false, 9413, -1, 9413, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 32, false, 9414, -1, 9414, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 34, false, 9415, -1, 9415, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 36, false, 9416, -1, 9416, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 38, false, 9417, -1, 9417, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 40, false, 9418, -1, 9418, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 42, false, 9419, -1, 9419, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 44, false, 9420, -1, 9420, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 46, false, 9421, -1, 9421, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 48, false, 9422, -1, 9422, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 50, false, 9423, -1, 9423, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5251, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5256, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 5267, true, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 19140, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11312, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5270},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11313, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5272},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5274},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11315, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5276},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5278},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11317, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5280},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5282},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11319, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5284},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5286},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11321, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5288},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5290},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11323, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5292},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5294},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11325, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5296},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5298},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11327, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5300},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5302},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11329, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5304},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11330, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5306},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5308},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11332, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5310},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11333, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5312},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11334, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5314},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5316},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11336, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5318},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5320},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11338, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5322},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5324},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11340, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5326},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5328},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11342, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5330},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5332},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11344, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5334},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5336},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5338},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5340},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5342},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5344},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5346},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5348},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5350},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5352},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5354},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5356},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5358},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5360},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5362},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11264, -1, 11264, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11265, -1, 11265, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11266, -1, 11266, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11267, -1, 11267, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11268, -1, 11268, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11269, -1, 11269, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11270, -1, 11270, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11271, -1, 11271, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11272, -1, 11272, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11273, -1, 11273, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11274, -1, 11274, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11275, -1, 11275, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11276, -1, 11276, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11277, -1, 11277, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11278, -1, 11278, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11279, -1, 11279, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11280, -1, 11280, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11281, -1, 11281, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11282, -1, 11282, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11283, -1, 11283, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11284, -1, 11284, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11285, -1, 11285, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11286, -1, 11286, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11287, -1, 11287, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11288, -1, 11288, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11289, -1, 11289, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11290, -1, 11290, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11291, -1, 11291, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11292, -1, 11292, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11293, -1, 11293, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11294, -1, 11294, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11295, -1, 11295, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11296, -1, 11296, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11297, -1, 11297, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11298, -1, 11298, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11299, -1, 11299, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11300, -1, 11300, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11301, -1, 11301, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11302, -1, 11302, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11303, -1, 11303, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11304, -1, 11304, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11305, -1, 11305, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11306, -1, 11306, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11307, -1, 11307, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11308, -1, 11308, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11309, -1, 11309, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11310, -1, 11310, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5364},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11360, -1, 11360, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5366},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 7549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5368},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5370},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 570, -1, 570, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 574, -1, 574, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5372},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11367, -1, 11367, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5374},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11369, -1, 11369, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11372, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5376},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11371, -1, 11371, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5378},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11381, -1, 11381, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5380},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11392, -1, 11392, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5382},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11394, -1, 11394, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5384},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11396, -1, 11396, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5386},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11398, -1, 11398, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5388},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11400, -1, 11400, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5390},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11402, -1, 11402, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5392},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11404, -1, 11404, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5394},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11406, -1, 11406, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5396},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11408, -1, 11408, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5398},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11410, -1, 11410, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5400},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11412, -1, 11412, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11415, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5402},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11414, -1, 11414, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11417, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5404},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11416, -1, 11416, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5406},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11418, -1, 11418, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5408},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11420, -1, 11420, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11423, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5410},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11422, -1, 11422, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5412},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11424, -1, 11424, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5414},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11426, -1, 11426, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5416},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11428, -1, 11428, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5418},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11430, -1, 11430, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5420},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11432, -1, 11432, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5422},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11434, -1, 11434, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5424},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11436, -1, 11436, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5426},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11438, -1, 11438, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5428},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11440, -1, 11440, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5430},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11442, -1, 11442, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5432},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11444, -1, 11444, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5434},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11446, -1, 11446, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5436},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11448, -1, 11448, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11451, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5438},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11450, -1, 11450, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11453, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5440},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11452, -1, 11452, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11455, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5442},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11454, -1, 11454, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11457, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5444},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11456, -1, 11456, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11459, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5446},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11458, -1, 11458, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11461, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5448},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11460, -1, 11460, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11463, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5450},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11462, -1, 11462, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11465, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5452},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11464, -1, 11464, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11467, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5454},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11466, -1, 11466, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11469, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5456},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11468, -1, 11468, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11471, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5458},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11470, -1, 11470, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11473, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5460},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11472, -1, 11472, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11475, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5462},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11474, -1, 11474, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5464},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11476, -1, 11476, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5466},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11478, -1, 11478, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5468},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11480, -1, 11480, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5470},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11482, -1, 11482, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5472},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11484, -1, 11484, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5474},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11486, -1, 11486, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5476},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11488, -1, 11488, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11491, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5478},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11490, -1, 11490, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4256, -1, 4256, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4257, -1, 4257, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4258, -1, 4258, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4259, -1, 4259, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4260, -1, 4260, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4261, -1, 4261, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4262, -1, 4262, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4263, -1, 4263, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4264, -1, 4264, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4265, -1, 4265, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4266, -1, 4266, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4267, -1, 4267, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4268, -1, 4268, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4269, -1, 4269, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4270, -1, 4270, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4271, -1, 4271, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4272, -1, 4272, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4273, -1, 4273, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4274, -1, 4274, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4275, -1, 4275, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4276, -1, 4276, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4277, -1, 4277, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4278, -1, 4278, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4279, -1, 4279, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4280, -1, 4280, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4281, -1, 4281, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4282, -1, 4282, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4283, -1, 4283, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4284, -1, 4284, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4285, -1, 4285, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4286, -1, 4286, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4287, -1, 4287, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4288, -1, 4288, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4289, -1, 4289, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4290, -1, 4290, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4291, -1, 4291, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4292, -1, 4292, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4293, -1, 4293, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 218, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 224, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20400, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19200, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19260, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19320, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19380, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19440, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19500, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19560, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19620, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19680, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19740, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19800, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19860, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19920, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19980, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20040, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20100, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20160, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20220, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20280, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20340, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 52, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 53, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20460, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21720, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20520, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20580, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20640, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20700, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20760, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20820, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20880, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20940, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21000, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21060, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21120, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21180, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21240, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21300, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21360, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21420, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21480, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21540, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21600, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21660, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21780, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21840, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21900, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21960, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22020, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6208, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6745, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6757, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6769, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6773, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6785, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6809, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6821, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6849, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6853, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6857, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7781, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7813, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_CS, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
-  {UTF8PROC_CATEGORY_CO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8039, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8057, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8069, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8157, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8165, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8169, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8177, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8181, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8193, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8199, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8201, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8207, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8213, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8225, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8391, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8399, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8403, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8423, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8427, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8439, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8457, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8469, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8471, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8481, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8487, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8493, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8495, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8525, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8533, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8549, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8557, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8561, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8573, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8585, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8645, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8649, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8657, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8661, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8669, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8681, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8693, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8705, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8745, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8745},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8748},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8751, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8751},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8754, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8754},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8758},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8762, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8765, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8768},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8771, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8771},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8774, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8774},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8777, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8777},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8780, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8780},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8783, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MN, 26, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8786, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8789, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8793, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8801, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8803, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8806, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8809, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8812, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8815, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8818, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8821, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8824, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8827, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8830, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8833, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8836, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8839, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8842, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8845, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8848, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8851, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8854, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8857, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8860, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8863, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8866, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8869, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8872, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8875, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8878, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8881, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8884, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8887, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8890, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8893, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8896, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9775, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9783, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9787, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9819, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9823, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9831, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 10013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9989, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9991, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2376, false, -1, 65345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10165},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2380, false, -1, 65346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10167},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4532, false, -1, 65347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10169},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2382, false, -1, 65348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10171},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2384, false, -1, 65349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10173},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4571, false, -1, 65350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10175},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2388, false, -1, 65351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10177},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2390, false, -1, 65352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10179},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2392, false, -1, 65353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10181},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2394, false, -1, 65354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10183},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2396, false, -1, 65355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10185},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2398, false, -1, 65356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10187},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2400, false, -1, 65357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10189},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2402, false, -1, 65358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10191},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2404, false, -1, 65359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10193},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2408, false, -1, 65360, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10195},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4553, false, -1, 65361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10197},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2410, false, -1, 65362, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10199},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5231, false, -1, 65363, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10201},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2412, false, -1, 65364, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10203},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2414, false, -1, 65365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10205},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4662, false, -1, 65366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10207},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2416, false, -1, 65367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10209},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4689, false, -1, 65368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10211},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5245, false, -1, 65369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10213},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4565, false, -1, 65370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10215},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10009, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10011, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 0, false, 65313, -1, 65313, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2, false, 65314, -1, 65314, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4, false, 65315, -1, 65315, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 6, false, 65316, -1, 65316, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 8, false, 65317, -1, 65317, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10, false, 65318, -1, 65318, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 12, false, 65319, -1, 65319, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 14, false, 65320, -1, 65320, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 16, false, 65321, -1, 65321, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 18, false, 65322, -1, 65322, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 20, false, 65323, -1, 65323, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 22, false, 65324, -1, 65324, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 24, false, 65325, -1, 65325, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 26, false, 65326, -1, 65326, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 28, false, 65327, -1, 65327, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 30, false, 65328, -1, 65328, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 32, false, 65329, -1, 65329, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 34, false, 65330, -1, 65330, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 36, false, 65331, -1, 65331, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 38, false, 65332, -1, 65332, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 40, false, 65333, -1, 65333, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 42, false, 65334, -1, 65334, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 44, false, 65335, -1, 65335, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 46, false, 65336, -1, 65336, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 48, false, 65337, -1, 65337, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 50, false, 65338, -1, 65338, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10223, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10225, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10001, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10003, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10255, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
-  {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66600, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10387},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10389},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66602, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10391},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10393},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66604, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10395},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66605, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10397},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66606, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10399},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66607, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10401},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10403},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66609, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10405},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66610, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10407},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10409},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66612, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10411},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66613, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10413},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66614, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10415},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66615, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10417},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10419},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10421},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66618, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10423},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10425},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66620, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10427},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66621, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10429},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66622, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10431},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10433},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66624, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10435},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66625, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10437},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10439},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66627, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10441},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66628, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10443},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10445},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66630, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10447},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66631, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10449},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66632, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10451},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66633, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10453},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66634, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10455},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66635, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10457},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66636, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10459},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10461},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66638, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10463},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66639, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10465},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66560, -1, 66560, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66561, -1, 66561, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66562, -1, 66562, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66563, -1, 66563, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66564, -1, 66564, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66565, -1, 66565, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66566, -1, 66566, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66567, -1, 66567, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66568, -1, 66568, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66569, -1, 66569, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66570, -1, 66570, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66571, -1, 66571, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66572, -1, 66572, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66573, -1, 66573, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66574, -1, 66574, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66575, -1, 66575, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66576, -1, 66576, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66577, -1, 66577, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66578, -1, 66578, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66579, -1, 66579, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66580, -1, 66580, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66581, -1, 66581, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66582, -1, 66582, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66583, -1, 66583, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66584, -1, 66584, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66585, -1, 66585, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66586, -1, 66586, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66587, -1, 66587, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66588, -1, 66588, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66589, -1, 66589, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66590, -1, 66590, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66591, -1, 66591, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66592, -1, 66592, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66593, -1, 66593, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66594, -1, 66594, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66595, -1, 66595, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66596, -1, 66596, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66597, -1, 66597, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66598, -1, 66598, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66599, -1, 66599, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22080, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22140, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10467, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10470, false, -1, -1, -1, 22200, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10473, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10476, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10479, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10482, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10485, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 54, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 226, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 55, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 56, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 57, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 58, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 59, false, false, false, true, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22260, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22320, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10488, false, -1, -1, -1, 22380, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10491, false, -1, -1, -1, 22440, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10494, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10497, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10500, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10503, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 32, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 67, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10550, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10996, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11002, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11018, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11024, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11036, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11042, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11048, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11054, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11060, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11066, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11072, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11078, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11084, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11090, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11096, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11316, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11336, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11340, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11348, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11360, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11372, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11478, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-  {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
-};
-
-const int32_t utf8proc_combinations[] = {
-  192, 193, 194, 195, 196, 197, -1, 
-  256, 258, 260, 550, 461, -1, -1, 512, 
-  514, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7680, 7840, -1, -1, -1, -1, -1, 7842, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 262, 264, 
-  -1, -1, -1, 199, -1, -1, -1, 266, 
-  268, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 200, 201, 202, 7868, 203, -1, 552, 
-  274, 276, 280, 278, 282, -1, -1, 516, 
-  518, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7864, -1, 7704, 7706, -1, -1, 7866, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 204, 205, 206, 
-  296, 207, -1, -1, 298, 300, 302, 304, 
-  463, -1, -1, 520, 522, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7882, -1, -1, 
-  7724, -1, -1, 7880, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 504, 323, -1, 209, -1, -1, 325, 
-  -1, -1, -1, 7748, 327, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7750, 7752, 7754, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 210, 211, 212, 
-  213, 214, -1, -1, 332, 334, 490, 558, 
-  465, 336, 416, 524, 526, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7884, -1, -1, 
-  -1, -1, -1, 7886, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 217, 218, 219, 360, 220, 366, -1, 
-  362, 364, 370, -1, 467, 368, 431, 532, 
-  534, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7908, -1, 7798, 7796, -1, 7794, 7910, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7922, 221, 374, 
-  7928, 376, -1, -1, 562, -1, -1, 7822, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7924, -1, -1, 
-  -1, -1, -1, 7926, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 224, 225, 226, 227, 228, 229, -1, 
-  257, 259, 261, 551, 462, -1, -1, 513, 
-  515, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7681, 7841, -1, -1, -1, -1, -1, 7843, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 263, 265, 
-  -1, -1, -1, 231, -1, -1, -1, 267, 
-  269, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 232, 233, 234, 7869, 235, -1, 553, 
-  275, 277, 281, 279, 283, -1, -1, 517, 
-  519, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7865, -1, 7705, 7707, -1, -1, 7867, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 236, 237, 238, 
-  297, 239, -1, -1, 299, 301, 303, -1, 
-  464, -1, -1, 521, 523, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7883, -1, -1, 
-  7725, -1, -1, 7881, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 505, 324, -1, 241, -1, -1, 326, 
-  -1, -1, -1, 7749, 328, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7751, 7753, 7755, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 242, 243, 244, 
-  245, 246, -1, -1, 333, 335, 491, 559, 
-  466, 337, 417, 525, 527, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7885, -1, -1, 
-  -1, -1, -1, 7887, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 249, 250, 251, 361, 252, 367, -1, 
-  363, 365, 371, -1, 468, 369, 432, 533, 
-  535, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7909, -1, 7799, 7797, -1, 7795, 7911, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7923, 253, 375, 
-  7929, 255, 7833, -1, 563, -1, -1, 7823, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7925, -1, -1, 
-  -1, -1, -1, 7927, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7696, 
-  -1, -1, -1, 7690, 270, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7692, 7694, 7698, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7697, -1, -1, -1, 7691, 
-  271, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7693, 7695, 7699, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 500, 284, -1, -1, -1, 290, 
-  7712, 286, -1, 288, 486, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 501, 285, 
-  -1, -1, -1, 291, 7713, 287, -1, 289, 
-  487, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 292, -1, 7718, -1, 7720, 
-  -1, -1, -1, 7714, 542, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7716, -1, -1, -1, 7722, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 293, 
-  -1, 7719, -1, 7721, -1, -1, -1, 7715, 
-  543, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7717, 7830, -1, 
-  -1, 7723, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 308, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 309, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  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, 7728, -1, -1, -1, -1, 310, 
-  -1, -1, -1, -1, 488, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7730, 7732, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7729, -1, 
-  -1, -1, -1, 311, -1, -1, -1, -1, 
-  489, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7731, 7733, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 313, -1, -1, -1, -1, 315, 
-  -1, -1, -1, -1, 317, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7734, 7738, 7740, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 314, -1, 
-  -1, -1, -1, 316, -1, -1, -1, -1, 
-  318, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7735, 7739, 7741, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 340, -1, -1, -1, -1, 342, 
-  -1, -1, -1, 7768, 344, -1, -1, 528, 
-  530, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7770, 7774, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 341, -1, 
-  -1, -1, -1, 343, -1, -1, -1, 7769, 
-  345, -1, -1, 529, 531, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7771, 7775, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 346, 348, -1, -1, -1, 350, 
-  -1, -1, -1, 7776, 352, -1, -1, -1, 
-  -1, 536, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7778, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 347, 349, 
-  -1, -1, -1, 351, -1, -1, -1, 7777, 
-  353, -1, -1, -1, -1, 537, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7779, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 354, 
-  -1, -1, -1, 7786, 356, -1, -1, -1, 
-  -1, 538, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7788, 7790, 7792, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7831, -1, 355, -1, -1, -1, 7787, 
-  357, -1, -1, -1, -1, 539, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7789, 7791, 7793, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7808, 7810, 372, -1, 7812, -1, -1, 
-  -1, -1, -1, 7814, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7816, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7809, 7811, 373, 
-  -1, 7813, 7832, -1, -1, -1, -1, 7815, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7817, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 377, 7824, -1, -1, -1, -1, 
-  -1, -1, -1, 379, 381, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7826, 7828, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 378, 7825, 
-  -1, -1, -1, -1, -1, -1, -1, 380, 
-  382, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7827, 7829, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 475, 471, -1, -1, -1, -1, -1, 
-  469, -1, -1, -1, 473, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 476, 472, -1, 
-  -1, -1, -1, -1, 470, -1, -1, -1, 
-  474, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  478, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 479, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -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, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 481, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 508, -1, -1, -1, -1, -1, 
-  482, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 509, -1, 
-  -1, -1, -1, -1, 483, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  492, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 493, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 494, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  495, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 506, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 507, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 510, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 511, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  554, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 555, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7756, -1, -1, 7758, -1, -1, 
-  556, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7757, -1, 
-  -1, 7759, -1, -1, 557, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  560, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8173, 901, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 8129, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8122, 902, -1, 
-  -1, -1, -1, -1, 8121, 8120, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7944, 7945, -1, 8124, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8136, 904, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7960, 7961, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8138, 905, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7976, 7977, -1, 8140, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8154, 906, -1, -1, 938, -1, -1, 
-  8153, 8152, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7992, 7993, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8184, 908, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8008, 8009, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8170, 910, -1, -1, 939, -1, -1, 
-  8169, 8168, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8025, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8186, 911, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8040, 8041, -1, 8188, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8146, 912, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 8151, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8048, 940, -1, 
-  -1, -1, -1, -1, 8113, 8112, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7936, 7937, 8118, 8115, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8050, 941, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7952, 7953, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8052, 942, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7968, 7969, 8134, 8131, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8054, 943, -1, -1, 970, -1, -1, 
-  8145, 8144, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7984, 7985, 8150, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8162, 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, 8167, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8058, 973, -1, -1, 971, -1, -1, 
-  8161, 8160, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8016, 8017, 8166, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8056, 972, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8000, 8001, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8060, 974, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8032, 8033, 8182, 8179, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 979, -1, 
-  -1, 980, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -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, 1025, -1, -1, 
-  -1, 1238, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 1027, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1031, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 1036, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1037, -1, -1, -1, 1252, -1, -1, 
-  1250, 1049, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1264, -1, -1, 1262, 1038, -1, -1, 
-  -1, 1266, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1117, -1, -1, -1, 1253, -1, -1, 
-  1251, 1081, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1104, -1, -1, 
-  -1, 1105, -1, -1, -1, 1239, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 1107, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1111, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 1116, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1265, -1, -1, 1263, 1118, -1, -1, 
-  -1, 1267, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 1142, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 1143, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1244, -1, -1, 
-  -1, 1217, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1245, -1, -1, -1, 1218, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1234, -1, -1, 
-  -1, 1232, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1235, -1, -1, -1, 1233, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1242, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1243, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1246, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1247, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1254, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1255, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1258, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1259, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1260, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1261, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1268, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1269, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 1272, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 1273, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 1570, 1571, 1573, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 1572, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 1574, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 1728, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 1730, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 1747, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 2345, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 2353, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -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, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 2507, 2508, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  2888, 2891, 2892, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 2964, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 3020, 3018, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  3019, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 3144, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 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, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 3271, 3272, 
-  3274, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 3275, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 3402, 3404, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 3403, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 3546, 3548, 3550, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 3549, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 4134, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 6918, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 6920, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 6922, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 6924, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 6926, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 6930, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 6971, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 6973, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 6976, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 6977, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 6979, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7682, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7684, 7686, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7683, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7685, 7687, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7688, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7689, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7700, 7702, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7701, 7703, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7708, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7709, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7710, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7711, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7726, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7727, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7736, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7737, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7742, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7744, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7746, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7743, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7745, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7747, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7760, 7762, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7761, 7763, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7764, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7766, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7765, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7767, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7772, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7773, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7780, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7781, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7782, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7783, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7784, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7785, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7800, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7801, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7802, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7803, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 7804, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7806, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  7805, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7807, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7820, -1, -1, 
-  -1, -1, -1, 7818, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7821, -1, -1, -1, -1, -1, 7819, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7835, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7846, 7844, -1, 
-  7850, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7848, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7847, 7845, -1, 7851, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7849, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7852, 
-  -1, -1, -1, -1, -1, 7862, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7853, -1, -1, -1, -1, 
-  -1, 7863, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7856, 7854, -1, 
-  7860, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7858, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7857, 7855, -1, 7861, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7859, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7872, 7870, -1, 
-  7876, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7874, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7873, 7871, -1, 7877, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7875, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7878, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7879, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7890, 7888, -1, 
-  7894, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7892, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7891, 7889, -1, 7895, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7893, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 7896, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 7897, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7900, 7898, -1, 
-  7904, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7906, -1, -1, 
-  -1, -1, -1, 7902, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7901, 7899, -1, 7905, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7907, -1, -1, -1, -1, -1, 7903, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7914, 7912, -1, 
-  7918, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7920, -1, -1, 
-  -1, -1, -1, 7916, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7915, 7913, -1, 7919, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7921, -1, -1, -1, -1, -1, 7917, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7938, 7940, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7942, 8064, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7939, 7941, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7943, 8065, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7946, 7948, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7950, 8072, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7947, 7949, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7951, 8073, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7954, 7956, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7955, 7957, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7962, 7964, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7963, 7965, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7970, 7972, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7974, 8080, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7971, 7973, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7975, 8081, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7978, 7980, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7982, 8088, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7979, 7981, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7983, 8089, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7986, 7988, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7990, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7987, 7989, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7991, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 7994, 7996, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 7998, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 7995, 7997, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 7999, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8002, 8004, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8003, 8005, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8010, 8012, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8011, 8013, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8018, 8020, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 8022, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8019, 8021, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 8023, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8027, 8029, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 8031, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8034, 8036, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 8038, 8096, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8035, 8037, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 8039, 8097, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8042, 8044, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 8046, 8104, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8043, 8045, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 8047, 8105, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8066, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8067, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8068, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8069, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8070, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8071, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8074, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8075, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8076, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8077, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8078, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8079, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8082, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8083, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8084, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8085, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8086, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8087, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8090, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8091, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8092, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8093, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8094, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8095, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8098, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8099, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8100, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8101, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8102, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8103, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8106, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8107, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8108, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8109, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8110, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8111, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8114, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8116, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8119, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8130, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8132, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8135, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 8141, 8142, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, 8143, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8157, 8158, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, 8159, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8164, 8165, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 8172, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8178, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 8180, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 8183, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8602, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8603, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8622, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8653, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8654, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8655, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8708, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8713, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8716, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8740, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8742, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8769, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8772, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8775, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8777, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8800, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8802, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8813, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8814, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8815, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8816, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8817, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8820, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8821, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8824, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8825, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8832, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8833, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8836, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8837, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8840, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8841, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8876, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8877, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8878, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8879, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8928, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8929, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8930, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8931, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8938, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8939, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  8940, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 8941, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  10972, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12364, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12366, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12368, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12370, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12372, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12374, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12376, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12378, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12380, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12382, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12384, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12386, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12389, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12391, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12393, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12400, 12401, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12403, 12404, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12406, 12407, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12409, 12410, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12412, 12413, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12436, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12446, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12460, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12462, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12464, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12466, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12468, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12470, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12472, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12474, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12476, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12478, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12480, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12482, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12485, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12487, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12489, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12496, 12497, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12499, 12500, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12502, 12503, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12505, 12506, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12508, 12509, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12532, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12535, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12536, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12537, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, 12538, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, 12542, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 119134, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 119135, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  119136, 119137, 119138, 119139, 119140, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, 119227, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, 119228, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, 119229, 119231, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  -1, -1, -1, -1, -1, -1, -1, -1, 
-  119230, 119232, -1, -1, -1, };
-
diff --git a/liblib/CMakeLists.txt b/liblib/CMakeLists.txt
index f1d7597..d4c0453 100644
--- a/liblib/CMakeLists.txt
+++ b/liblib/CMakeLists.txt
@@ -13,16 +13,20 @@ IF(USE_PNETCDF)
   SET(liblib_LIBS ${liblib_LIBS} netcdfp)
 ENDIF()
 
-IF(USE_DAP)
+IF(ENABLE_DAP2)
   SET(liblib_LIBS ${liblib_LIBS} oc2 dap2)
 ENDIF()
 
+IF(ENABLE_DAP4)
+  SET(liblib_LIBS ${liblib_LIBS} dap4)
+ENDIF()
 
 FOREACH(LIBS ${liblib_LIBS})
   SET(LARGS ${LARGS} $<TARGET_OBJECTS:${LIBS}>)
 ENDFOREACH()
 
 ADD_LIBRARY(netcdf nc_initialize.c ${LARGS} )
+
 IF(MOD_NETCDF_NAME)
   SET_TARGET_PROPERTIES(netcdf PROPERTIES LIBRARY_OUTPUT_NAME ${NETCDF_LIB_NAME})
   SET_TARGET_PROPERTIES(netcdf PROPERTIES ARCHIVE_OUTPUT_NAME ${NETCDF_LIB_NAME})
diff --git a/liblib/Makefile.am b/liblib/Makefile.am
old mode 100755
new mode 100644
index 5d38891..5c0949d
--- a/liblib/Makefile.am
+++ b/liblib/Makefile.am
@@ -18,7 +18,7 @@ lib_LTLIBRARIES = libnetcdf.la
 # for information regarding incrementing `-version-info`.
 ##
 
-libnetcdf_la_LDFLAGS = -version-info 11:4:0 ${NOUNDEFINED}
+libnetcdf_la_LDFLAGS = -version-info 12:0:1
 
 libnetcdf_la_CPPFLAGS = ${AM_CPPFLAGS}
 libnetcdf_la_LIBADD =
@@ -47,11 +47,16 @@ libnetcdf_la_LIBADD += ${top_builddir}/libsrcp/libnetcdfp.la
 endif # USE_PNETCDF
 
 # + dap
-if USE_DAP
+if ENABLE_DAP
 AM_CPPFLAGS += -I${top_srcdir}/libdap2 -I${top_srcdir}/oc
 libnetcdf_la_LIBADD += ${top_builddir}/libdap2/libdap2.la
 libnetcdf_la_LIBADD += ${top_builddir}/oc2/liboc.la
-endif # USE_DAP
+endif # ENABLE_DAP
+
+if ENABLE_DAP4
+AM_CPPFLAGS += -I${top_srcdir}/libdap4
+libnetcdf_la_LIBADD += ${top_builddir}/libdap4/libdap4.la
+endif # ENABLE_DAP4
 
 # NetCDF-4 ...
 if USE_NETCDF4
diff --git a/liblib/Makefile.in b/liblib/Makefile.in
index 5c9a958..660e7e1 100644
--- a/liblib/Makefile.in
+++ b/liblib/Makefile.in
@@ -121,13 +121,15 @@ target_triplet = @target@
 @USE_PNETCDF_TRUE at am__append_7 = ${top_builddir}/libsrcp/libnetcdfp.la
 
 # + dap
- at USE_DAP_TRUE@am__append_8 = -I${top_srcdir}/libdap2 -I${top_srcdir}/oc
- at USE_DAP_TRUE@am__append_9 = ${top_builddir}/libdap2/libdap2.la \
- at USE_DAP_TRUE@	${top_builddir}/oc2/liboc.la
+ at ENABLE_DAP_TRUE@am__append_8 = -I${top_srcdir}/libdap2 -I${top_srcdir}/oc
+ at ENABLE_DAP_TRUE@am__append_9 = ${top_builddir}/libdap2/libdap2.la \
+ at ENABLE_DAP_TRUE@	${top_builddir}/oc2/liboc.la
+ at ENABLE_DAP4_TRUE@am__append_10 = -I${top_srcdir}/libdap4
+ at ENABLE_DAP4_TRUE@am__append_11 = ${top_builddir}/libdap4/libdap4.la
 
 # NetCDF-4 ...
- at USE_NETCDF4_TRUE@am__append_10 = -I${top_srcdir}/libsrc4
- at USE_NETCDF4_TRUE@am__append_11 = ${top_builddir}/libsrc4/libnetcdf4.la
+ at USE_NETCDF4_TRUE@am__append_12 = -I${top_srcdir}/libsrc4
+ at USE_NETCDF4_TRUE@am__append_13 = ${top_builddir}/libsrc4/libnetcdf4.la
 subdir = liblib
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -173,7 +175,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
 libnetcdf_la_DEPENDENCIES = $(am__append_5) \
 	${top_builddir}/libdispatch/libdispatch.la \
 	${top_builddir}/libsrc/libnetcdf3.la $(am__append_7) \
-	$(am__append_9) $(am__append_11)
+	$(am__append_9) $(am__append_11) $(am__append_13)
 am_libnetcdf_la_OBJECTS = libnetcdf_la-nc_initialize.lo
 libnetcdf_la_OBJECTS = $(am_libnetcdf_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
@@ -251,7 +253,8 @@ ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_CFLAGS = @AM_CFLAGS@
 AM_CPPFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) \
-	$(am__append_6) $(am__append_8) $(am__append_10)
+	$(am__append_6) $(am__append_8) $(am__append_10) \
+	$(am__append_12)
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_LDFLAGS = 
 AR = @AR@
@@ -288,6 +291,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -315,12 +319,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -355,6 +361,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -419,6 +426,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 
@@ -428,8 +436,7 @@ lib_LTLIBRARIES = libnetcdf.la
 # These linker flags specify libtool version info.
 # See http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning
 # for information regarding incrementing `-version-info`.
-libnetcdf_la_LDFLAGS = -version-info 11:4:0 ${NOUNDEFINED} \
-	$(am__append_3)
+libnetcdf_la_LDFLAGS = -version-info 12:0:1 $(am__append_3)
 libnetcdf_la_CPPFLAGS = ${AM_CPPFLAGS} $(am__append_4)
 
 # The output library will always include netcdf3 and dispatch
@@ -437,7 +444,7 @@ libnetcdf_la_CPPFLAGS = ${AM_CPPFLAGS} $(am__append_4)
 libnetcdf_la_LIBADD = $(am__append_5) \
 	${top_builddir}/libdispatch/libdispatch.la \
 	${top_builddir}/libsrc/libnetcdf3.la $(am__append_7) \
-	$(am__append_9) $(am__append_11)
+	$(am__append_9) $(am__append_11) $(am__append_13)
 CLEANFILES = 
 
 # Not ready for prime time yet
diff --git a/liblib/nc_initialize.c b/liblib/nc_initialize.c
index 128d142..cd03f82 100644
--- a/liblib/nc_initialize.c
+++ b/liblib/nc_initialize.c
@@ -20,11 +20,16 @@ extern int NC4_initialize(void);
 extern int NC4_finalize(void);
 #endif
 
-#ifdef USE_DAP
+#ifdef ENABLE_DAP2
 extern int NCD2_initialize(void);
 extern int NCD2_finalize(void);
 #endif
 
+#ifdef ENABLE_DAP4
+extern int NCD4_initialize(void);
+extern int NCD4_finalize(void);
+#endif
+
 #ifdef USE_PNETCDF
 extern int NCP_initialize(void);
 extern int NCP_finalize(void);
@@ -59,9 +64,12 @@ nc_initialize()
 
     /* Initialize each active protocol */
     if((stat = NC3_initialize())) goto done;
-#ifdef USE_DAP
+#ifdef ENABLE_DAP
     if((stat = NCD2_initialize())) goto done;
 #endif
+#ifdef ENABLE_DAP4
+    if((stat = NCD4_initialize())) goto done;
+#endif
 #ifdef USE_PNETCDF
     if((stat = NCP_initialize())) goto done;
 #endif
@@ -94,9 +102,12 @@ nc_finalize(void)
 
     /* Finalize each active protocol */
 
-#ifdef USE_DAP
+#ifdef ENABLE_DAP2
     if((stat = NCD2_finalize())) return stat;
 #endif
+#ifdef ENABLE_DAP4
+    if((stat = NCD4_finalize())) return stat;
+#endif
 
 #ifdef USE_PNETCDF
     if((stat = NCP_finalize())) return stat;
diff --git a/libnetcdf.settings.in b/libnetcdf.settings.in
index 5d7f5e0..7284fdf 100644
--- a/libnetcdf.settings.in
+++ b/libnetcdf.settings.in
@@ -29,7 +29,8 @@ HDF4 Support:		@HAS_HDF4@
 NetCDF-4 API:		@HAS_NC4@
 NC-4 Parallel Support:	@HAS_PARALLEL4@
 PNetCDF Support:	@HAS_PNETCDF@
-DAP Support:		@HAS_DAP@
+DAP2 Support:		@HAS_DAP@
+DAP4 Support:		@HAS_DAP4@
 Diskless Support:	@HAS_DISKLESS@
 MMap Support:		@HAS_MMAP@
 JNA Support:		@HAS_JNA@
diff --git a/libsrc/CMakeLists.txt b/libsrc/CMakeLists.txt
index 76eecc8..a35af99 100644
--- a/libsrc/CMakeLists.txt
+++ b/libsrc/CMakeLists.txt
@@ -4,9 +4,9 @@
 # Process these files with m4.
 SET(m4_SOURCES attr ncx putget t_ncxx)
 foreach (f ${m4_SOURCES})
-IF(HAVE_M4)
-  GEN_m4(${f})
-ENDIF()
+  IF(HAVE_M4)
+    GEN_m4(${f})
+  ENDIF()
 endforeach(f)
 
 SET(libsrc_SOURCES v1hpg.c putget.c attr.c nc3dispatch.c
diff --git a/libsrc/Makefile.am b/libsrc/Makefile.am
index f7baf87..ab15840 100644
--- a/libsrc/Makefile.am
+++ b/libsrc/Makefile.am
@@ -47,7 +47,7 @@ EXTRA_DIST = attr.m4 ncx.m4 putget.m4 $(man_MANS) CMakeLists.txt XGetopt.c
 
 # This tells make how to turn .m4 files into .c files.
 .m4.c:
-	m4 $(AM_M4FLAGS) $(M4FLAGS) -s $< >${srcdir}/$@
+	m4 $(AM_M4FLAGS) $(M4FLAGS) -s $< > $@
 
 # The C API man page.
 man_MANS = netcdf.3
diff --git a/libsrc/Makefile.in b/libsrc/Makefile.in
index 02dc4d0..0f0c4bd 100644
--- a/libsrc/Makefile.in
+++ b/libsrc/Makefile.in
@@ -294,6 +294,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -321,12 +322,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -361,6 +364,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -425,6 +429,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 libnetcdf3_la_CPPFLAGS = ${AM_CPPFLAGS} $(am__append_3)
 
 # These files comprise the netCDF-3 classic library code.
@@ -918,7 +923,7 @@ uninstall-man: uninstall-man3
 
 # This tells make how to turn .m4 files into .c files.
 .m4.c:
-	m4 $(AM_M4FLAGS) $(M4FLAGS) -s $< >${srcdir}/$@
+	m4 $(AM_M4FLAGS) $(M4FLAGS) -s $< > $@
 
 # This rule generates the C manpage.
 netcdf.3: $(top_srcdir)/docs/netcdf.m4
diff --git a/libsrc/attr.c b/libsrc/attr.c
index f02d5b3..8375000 100644
--- a/libsrc/attr.c
+++ b/libsrc/attr.c
@@ -1,9 +1,15 @@
+#line 5 "attr.m4"
 /* Do not edit this file. It is produced from the corresponding .m4 source */
+#line 7
 /*
  *	Copyright 1996, University Corporation for Atmospheric Research
  *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include "nc3internal.h"
 #include "ncdispatch.h"
 #include "nc3dispatch.h"
@@ -13,8 +19,7 @@
 #include "ncx.h"
 #include "fbits.h"
 #include "rnd.h"
-#include "utf8proc.h"
-
+#include "ncutf8.h"
 
 /*
  * Free attr
@@ -112,9 +117,11 @@ new_NC_attr(
 {
 	NC_string *strp;
 	NC_attr *attrp;
+	char *name;
+	int stat;
 
-	char *name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
+	stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char**)&name);
+	if(stat != NC_NOERR)
 	    return NULL;
 	assert(name != NULL && *name != 0);
 
@@ -339,6 +346,7 @@ NC_findattr(const NC_attrarray *ncap, const char *uname)
 	size_t attrid;
 	size_t slen;
 	char *name;
+	int stat;
 
 	assert(ncap != NULL);
 
@@ -348,8 +356,8 @@ NC_findattr(const NC_attrarray *ncap, const char *uname)
 	attrpp = (NC_attr **) ncap->value;
 
 	/* normalized version of uname */
-	name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
+	stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char**)&name);
+	if(stat != NC_NOERR)
 	    return NULL; /* TODO: need better way to indicate no memory */
 	slen = strlen(name);
 
@@ -391,6 +399,9 @@ NC_lookupattr(int ncid,
 	if(ncap == NULL)
 		return NC_ENOTVAR;
 
+	if(name == NULL)
+		return NC_EBADNAME;
+
 	tmp = NC_findattr(ncap, name);
 	if(tmp == NULL)
 		return NC_ENOTATT;
@@ -526,9 +537,9 @@ NC3_rename_att( int ncid, int varid, const char *name, const char *unewname)
 	}
 
 	old = attrp->name;
-	newname = (char *)utf8proc_NFC((const unsigned char *)unewname);
-	if(newname == NULL)
-	    return NC_EBADNAME;
+	status = nc_utf8_normalize((const unsigned char *)unewname,(unsigned char**)&newname);
+	if(status != NC_NOERR)
+	    return status;
 	if(NC_indef(ncp))
 	{
 		newStr = new_NC_string(strlen(newname), newname);
@@ -582,11 +593,12 @@ NC3_del_att(int ncid, int varid, const char *uname)
 		return NC_ENOTVAR;
 
 	{
-	char *name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
-	    return NC_ENOMEM;
+	char* name;
+	int stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char**)&name);
+	if(stat != NC_NOERR)
+	    return stat;
 
-			/* sortof inline NC_findattr() */
+        /* sortof inline NC_findattr() */
 	slen = strlen(name);
 
 	attrpp = (NC_attr **) ncap->value;
@@ -620,753 +632,1436 @@ NC3_del_att(int ncid, int varid, const char *uname)
 	return NC_NOERR;
 }
 
+#line 713
 
 static int
-ncx_pad_putn_Iuchar(void **xpp, size_t nelems, const uchar *tp, nc_type type)
+#line 714
+ncx_pad_putn_Iuchar(void **xpp, size_t nelems, const uchar *tp, nc_type type, void *fillp)
+#line 714
 {
+#line 714
 	switch(type) {
+#line 714
 	case NC_CHAR:
+#line 714
 		return NC_ECHAR;
+#line 714
 	case NC_BYTE:
-		return ncx_pad_putn_schar_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_pad_putn_schar_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_SHORT:
-		return ncx_pad_putn_short_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_pad_putn_short_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_INT:
-		return ncx_putn_int_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_putn_int_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_FLOAT:
-		return ncx_putn_float_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_putn_float_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_DOUBLE:
-		return ncx_putn_double_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_putn_double_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_pad_putn_uchar_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_USHORT:
-		return ncx_putn_ushort_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_putn_ushort_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_UINT:
-		return ncx_putn_uint_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_putn_uint_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_INT64:
-		return ncx_putn_longlong_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_putn_longlong_uchar(xpp, nelems, tp, fillp);
+#line 714
 	case NC_UINT64:
-		return ncx_putn_ulonglong_uchar(xpp, nelems, tp);
+#line 714
+		return ncx_putn_ulonglong_uchar(xpp, nelems, tp, fillp);
+#line 714
 	default:
+#line 714
                 assert("ncx_pad_putn_Iuchar invalid type" == 0);
+#line 714
 	}
+#line 714
 	return NC_EBADTYPE;
+#line 714
 }
+#line 714
 
 static int
+#line 715
 ncx_pad_getn_Iuchar(const void **xpp, size_t nelems, uchar *tp, nc_type type)
+#line 715
 {
+#line 715
 	switch(type) {
+#line 715
 	case NC_CHAR:
+#line 715
 		return NC_ECHAR;
+#line 715
 	case NC_BYTE:
+#line 715
 		return ncx_pad_getn_schar_uchar(xpp, nelems, tp);
+#line 715
 	case NC_SHORT:
+#line 715
 		return ncx_pad_getn_short_uchar(xpp, nelems, tp);
+#line 715
 	case NC_INT:
+#line 715
 		return ncx_getn_int_uchar(xpp, nelems, tp);
+#line 715
 	case NC_FLOAT:
+#line 715
 		return ncx_getn_float_uchar(xpp, nelems, tp);
+#line 715
 	case NC_DOUBLE:
+#line 715
 		return ncx_getn_double_uchar(xpp, nelems, tp);
+#line 715
 	case NC_UBYTE:
+#line 715
 		return ncx_pad_getn_uchar_uchar(xpp, nelems, tp);
+#line 715
 	case NC_USHORT:
+#line 715
 		return ncx_getn_ushort_uchar(xpp, nelems, tp);
+#line 715
 	case NC_UINT:
+#line 715
 		return ncx_getn_uint_uchar(xpp, nelems, tp);
+#line 715
 	case NC_INT64:
+#line 715
 		return ncx_getn_longlong_uchar(xpp, nelems, tp);
+#line 715
 	case NC_UINT64:
+#line 715
 		return ncx_getn_ulonglong_uchar(xpp, nelems, tp);
+#line 715
 	default:
+#line 715
 	        assert("ncx_pad_getn_Iuchar invalid type" == 0);
+#line 715
 	}
+#line 715
 	return NC_EBADTYPE;
+#line 715
 }
+#line 715
 
 
 static int
-ncx_pad_putn_Ischar(void **xpp, size_t nelems, const schar *tp, nc_type type)
+#line 717
+ncx_pad_putn_Ischar(void **xpp, size_t nelems, const schar *tp, nc_type type, void *fillp)
+#line 717
 {
+#line 717
 	switch(type) {
+#line 717
 	case NC_CHAR:
+#line 717
 		return NC_ECHAR;
+#line 717
 	case NC_BYTE:
-		return ncx_pad_putn_schar_schar(xpp, nelems, tp);
+#line 717
+		return ncx_pad_putn_schar_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_SHORT:
-		return ncx_pad_putn_short_schar(xpp, nelems, tp);
+#line 717
+		return ncx_pad_putn_short_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_INT:
-		return ncx_putn_int_schar(xpp, nelems, tp);
+#line 717
+		return ncx_putn_int_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_FLOAT:
-		return ncx_putn_float_schar(xpp, nelems, tp);
+#line 717
+		return ncx_putn_float_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_DOUBLE:
-		return ncx_putn_double_schar(xpp, nelems, tp);
+#line 717
+		return ncx_putn_double_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_schar(xpp, nelems, tp);
+#line 717
+		return ncx_pad_putn_uchar_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_USHORT:
-		return ncx_putn_ushort_schar(xpp, nelems, tp);
+#line 717
+		return ncx_putn_ushort_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_UINT:
-		return ncx_putn_uint_schar(xpp, nelems, tp);
+#line 717
+		return ncx_putn_uint_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_INT64:
-		return ncx_putn_longlong_schar(xpp, nelems, tp);
+#line 717
+		return ncx_putn_longlong_schar(xpp, nelems, tp, fillp);
+#line 717
 	case NC_UINT64:
-		return ncx_putn_ulonglong_schar(xpp, nelems, tp);
+#line 717
+		return ncx_putn_ulonglong_schar(xpp, nelems, tp, fillp);
+#line 717
 	default:
+#line 717
                 assert("ncx_pad_putn_Ischar invalid type" == 0);
+#line 717
 	}
+#line 717
 	return NC_EBADTYPE;
+#line 717
 }
+#line 717
 
 static int
+#line 718
 ncx_pad_getn_Ischar(const void **xpp, size_t nelems, schar *tp, nc_type type)
+#line 718
 {
+#line 718
 	switch(type) {
+#line 718
 	case NC_CHAR:
+#line 718
 		return NC_ECHAR;
+#line 718
 	case NC_BYTE:
+#line 718
 		return ncx_pad_getn_schar_schar(xpp, nelems, tp);
+#line 718
 	case NC_SHORT:
+#line 718
 		return ncx_pad_getn_short_schar(xpp, nelems, tp);
+#line 718
 	case NC_INT:
+#line 718
 		return ncx_getn_int_schar(xpp, nelems, tp);
+#line 718
 	case NC_FLOAT:
+#line 718
 		return ncx_getn_float_schar(xpp, nelems, tp);
+#line 718
 	case NC_DOUBLE:
+#line 718
 		return ncx_getn_double_schar(xpp, nelems, tp);
+#line 718
 	case NC_UBYTE:
+#line 718
 		return ncx_pad_getn_uchar_schar(xpp, nelems, tp);
+#line 718
 	case NC_USHORT:
+#line 718
 		return ncx_getn_ushort_schar(xpp, nelems, tp);
+#line 718
 	case NC_UINT:
+#line 718
 		return ncx_getn_uint_schar(xpp, nelems, tp);
+#line 718
 	case NC_INT64:
+#line 718
 		return ncx_getn_longlong_schar(xpp, nelems, tp);
+#line 718
 	case NC_UINT64:
+#line 718
 		return ncx_getn_ulonglong_schar(xpp, nelems, tp);
+#line 718
 	default:
+#line 718
 	        assert("ncx_pad_getn_Ischar invalid type" == 0);
+#line 718
 	}
+#line 718
 	return NC_EBADTYPE;
+#line 718
 }
+#line 718
 
 
 static int
-ncx_pad_putn_Ishort(void **xpp, size_t nelems, const short *tp, nc_type type)
+#line 720
+ncx_pad_putn_Ishort(void **xpp, size_t nelems, const short *tp, nc_type type, void *fillp)
+#line 720
 {
+#line 720
 	switch(type) {
+#line 720
 	case NC_CHAR:
+#line 720
 		return NC_ECHAR;
+#line 720
 	case NC_BYTE:
-		return ncx_pad_putn_schar_short(xpp, nelems, tp);
+#line 720
+		return ncx_pad_putn_schar_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_SHORT:
-		return ncx_pad_putn_short_short(xpp, nelems, tp);
+#line 720
+		return ncx_pad_putn_short_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_INT:
-		return ncx_putn_int_short(xpp, nelems, tp);
+#line 720
+		return ncx_putn_int_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_FLOAT:
-		return ncx_putn_float_short(xpp, nelems, tp);
+#line 720
+		return ncx_putn_float_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_DOUBLE:
-		return ncx_putn_double_short(xpp, nelems, tp);
+#line 720
+		return ncx_putn_double_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_short(xpp, nelems, tp);
+#line 720
+		return ncx_pad_putn_uchar_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_USHORT:
-		return ncx_putn_ushort_short(xpp, nelems, tp);
+#line 720
+		return ncx_putn_ushort_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_UINT:
-		return ncx_putn_uint_short(xpp, nelems, tp);
+#line 720
+		return ncx_putn_uint_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_INT64:
-		return ncx_putn_longlong_short(xpp, nelems, tp);
+#line 720
+		return ncx_putn_longlong_short(xpp, nelems, tp, fillp);
+#line 720
 	case NC_UINT64:
-		return ncx_putn_ulonglong_short(xpp, nelems, tp);
+#line 720
+		return ncx_putn_ulonglong_short(xpp, nelems, tp, fillp);
+#line 720
 	default:
+#line 720
                 assert("ncx_pad_putn_Ishort invalid type" == 0);
+#line 720
 	}
+#line 720
 	return NC_EBADTYPE;
+#line 720
 }
+#line 720
 
 static int
+#line 721
 ncx_pad_getn_Ishort(const void **xpp, size_t nelems, short *tp, nc_type type)
+#line 721
 {
+#line 721
 	switch(type) {
+#line 721
 	case NC_CHAR:
+#line 721
 		return NC_ECHAR;
+#line 721
 	case NC_BYTE:
+#line 721
 		return ncx_pad_getn_schar_short(xpp, nelems, tp);
+#line 721
 	case NC_SHORT:
+#line 721
 		return ncx_pad_getn_short_short(xpp, nelems, tp);
+#line 721
 	case NC_INT:
+#line 721
 		return ncx_getn_int_short(xpp, nelems, tp);
+#line 721
 	case NC_FLOAT:
+#line 721
 		return ncx_getn_float_short(xpp, nelems, tp);
+#line 721
 	case NC_DOUBLE:
+#line 721
 		return ncx_getn_double_short(xpp, nelems, tp);
+#line 721
 	case NC_UBYTE:
+#line 721
 		return ncx_pad_getn_uchar_short(xpp, nelems, tp);
+#line 721
 	case NC_USHORT:
+#line 721
 		return ncx_getn_ushort_short(xpp, nelems, tp);
+#line 721
 	case NC_UINT:
+#line 721
 		return ncx_getn_uint_short(xpp, nelems, tp);
+#line 721
 	case NC_INT64:
+#line 721
 		return ncx_getn_longlong_short(xpp, nelems, tp);
+#line 721
 	case NC_UINT64:
+#line 721
 		return ncx_getn_ulonglong_short(xpp, nelems, tp);
+#line 721
 	default:
+#line 721
 	        assert("ncx_pad_getn_Ishort invalid type" == 0);
+#line 721
 	}
+#line 721
 	return NC_EBADTYPE;
+#line 721
 }
+#line 721
 
 
 static int
-ncx_pad_putn_Iint(void **xpp, size_t nelems, const int *tp, nc_type type)
+#line 723
+ncx_pad_putn_Iint(void **xpp, size_t nelems, const int *tp, nc_type type, void *fillp)
+#line 723
 {
+#line 723
 	switch(type) {
+#line 723
 	case NC_CHAR:
+#line 723
 		return NC_ECHAR;
+#line 723
 	case NC_BYTE:
-		return ncx_pad_putn_schar_int(xpp, nelems, tp);
+#line 723
+		return ncx_pad_putn_schar_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_SHORT:
-		return ncx_pad_putn_short_int(xpp, nelems, tp);
+#line 723
+		return ncx_pad_putn_short_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_INT:
-		return ncx_putn_int_int(xpp, nelems, tp);
+#line 723
+		return ncx_putn_int_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_FLOAT:
-		return ncx_putn_float_int(xpp, nelems, tp);
+#line 723
+		return ncx_putn_float_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_DOUBLE:
-		return ncx_putn_double_int(xpp, nelems, tp);
+#line 723
+		return ncx_putn_double_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_int(xpp, nelems, tp);
+#line 723
+		return ncx_pad_putn_uchar_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_USHORT:
-		return ncx_putn_ushort_int(xpp, nelems, tp);
+#line 723
+		return ncx_putn_ushort_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_UINT:
-		return ncx_putn_uint_int(xpp, nelems, tp);
+#line 723
+		return ncx_putn_uint_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_INT64:
-		return ncx_putn_longlong_int(xpp, nelems, tp);
+#line 723
+		return ncx_putn_longlong_int(xpp, nelems, tp, fillp);
+#line 723
 	case NC_UINT64:
-		return ncx_putn_ulonglong_int(xpp, nelems, tp);
+#line 723
+		return ncx_putn_ulonglong_int(xpp, nelems, tp, fillp);
+#line 723
 	default:
+#line 723
                 assert("ncx_pad_putn_Iint invalid type" == 0);
+#line 723
 	}
+#line 723
 	return NC_EBADTYPE;
+#line 723
 }
+#line 723
 
 static int
+#line 724
 ncx_pad_getn_Iint(const void **xpp, size_t nelems, int *tp, nc_type type)
+#line 724
 {
+#line 724
 	switch(type) {
+#line 724
 	case NC_CHAR:
+#line 724
 		return NC_ECHAR;
+#line 724
 	case NC_BYTE:
+#line 724
 		return ncx_pad_getn_schar_int(xpp, nelems, tp);
+#line 724
 	case NC_SHORT:
+#line 724
 		return ncx_pad_getn_short_int(xpp, nelems, tp);
+#line 724
 	case NC_INT:
+#line 724
 		return ncx_getn_int_int(xpp, nelems, tp);
+#line 724
 	case NC_FLOAT:
+#line 724
 		return ncx_getn_float_int(xpp, nelems, tp);
+#line 724
 	case NC_DOUBLE:
+#line 724
 		return ncx_getn_double_int(xpp, nelems, tp);
+#line 724
 	case NC_UBYTE:
+#line 724
 		return ncx_pad_getn_uchar_int(xpp, nelems, tp);
+#line 724
 	case NC_USHORT:
+#line 724
 		return ncx_getn_ushort_int(xpp, nelems, tp);
+#line 724
 	case NC_UINT:
+#line 724
 		return ncx_getn_uint_int(xpp, nelems, tp);
+#line 724
 	case NC_INT64:
+#line 724
 		return ncx_getn_longlong_int(xpp, nelems, tp);
+#line 724
 	case NC_UINT64:
+#line 724
 		return ncx_getn_ulonglong_int(xpp, nelems, tp);
+#line 724
 	default:
+#line 724
 	        assert("ncx_pad_getn_Iint invalid type" == 0);
+#line 724
 	}
+#line 724
 	return NC_EBADTYPE;
+#line 724
 }
+#line 724
 
 
 static int
-ncx_pad_putn_Ifloat(void **xpp, size_t nelems, const float *tp, nc_type type)
+#line 726
+ncx_pad_putn_Ifloat(void **xpp, size_t nelems, const float *tp, nc_type type, void *fillp)
+#line 726
 {
+#line 726
 	switch(type) {
+#line 726
 	case NC_CHAR:
+#line 726
 		return NC_ECHAR;
+#line 726
 	case NC_BYTE:
-		return ncx_pad_putn_schar_float(xpp, nelems, tp);
+#line 726
+		return ncx_pad_putn_schar_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_SHORT:
-		return ncx_pad_putn_short_float(xpp, nelems, tp);
+#line 726
+		return ncx_pad_putn_short_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_INT:
-		return ncx_putn_int_float(xpp, nelems, tp);
+#line 726
+		return ncx_putn_int_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_FLOAT:
-		return ncx_putn_float_float(xpp, nelems, tp);
+#line 726
+		return ncx_putn_float_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_DOUBLE:
-		return ncx_putn_double_float(xpp, nelems, tp);
+#line 726
+		return ncx_putn_double_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_float(xpp, nelems, tp);
+#line 726
+		return ncx_pad_putn_uchar_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_USHORT:
-		return ncx_putn_ushort_float(xpp, nelems, tp);
+#line 726
+		return ncx_putn_ushort_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_UINT:
-		return ncx_putn_uint_float(xpp, nelems, tp);
+#line 726
+		return ncx_putn_uint_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_INT64:
-		return ncx_putn_longlong_float(xpp, nelems, tp);
+#line 726
+		return ncx_putn_longlong_float(xpp, nelems, tp, fillp);
+#line 726
 	case NC_UINT64:
-		return ncx_putn_ulonglong_float(xpp, nelems, tp);
+#line 726
+		return ncx_putn_ulonglong_float(xpp, nelems, tp, fillp);
+#line 726
 	default:
+#line 726
                 assert("ncx_pad_putn_Ifloat invalid type" == 0);
+#line 726
 	}
+#line 726
 	return NC_EBADTYPE;
+#line 726
 }
+#line 726
 
 static int
+#line 727
 ncx_pad_getn_Ifloat(const void **xpp, size_t nelems, float *tp, nc_type type)
+#line 727
 {
+#line 727
 	switch(type) {
+#line 727
 	case NC_CHAR:
+#line 727
 		return NC_ECHAR;
+#line 727
 	case NC_BYTE:
+#line 727
 		return ncx_pad_getn_schar_float(xpp, nelems, tp);
+#line 727
 	case NC_SHORT:
+#line 727
 		return ncx_pad_getn_short_float(xpp, nelems, tp);
+#line 727
 	case NC_INT:
+#line 727
 		return ncx_getn_int_float(xpp, nelems, tp);
+#line 727
 	case NC_FLOAT:
+#line 727
 		return ncx_getn_float_float(xpp, nelems, tp);
+#line 727
 	case NC_DOUBLE:
+#line 727
 		return ncx_getn_double_float(xpp, nelems, tp);
+#line 727
 	case NC_UBYTE:
+#line 727
 		return ncx_pad_getn_uchar_float(xpp, nelems, tp);
+#line 727
 	case NC_USHORT:
+#line 727
 		return ncx_getn_ushort_float(xpp, nelems, tp);
+#line 727
 	case NC_UINT:
+#line 727
 		return ncx_getn_uint_float(xpp, nelems, tp);
+#line 727
 	case NC_INT64:
+#line 727
 		return ncx_getn_longlong_float(xpp, nelems, tp);
+#line 727
 	case NC_UINT64:
+#line 727
 		return ncx_getn_ulonglong_float(xpp, nelems, tp);
+#line 727
 	default:
+#line 727
 	        assert("ncx_pad_getn_Ifloat invalid type" == 0);
+#line 727
 	}
+#line 727
 	return NC_EBADTYPE;
+#line 727
 }
+#line 727
 
 
 static int
-ncx_pad_putn_Idouble(void **xpp, size_t nelems, const double *tp, nc_type type)
+#line 729
+ncx_pad_putn_Idouble(void **xpp, size_t nelems, const double *tp, nc_type type, void *fillp)
+#line 729
 {
+#line 729
 	switch(type) {
+#line 729
 	case NC_CHAR:
+#line 729
 		return NC_ECHAR;
+#line 729
 	case NC_BYTE:
-		return ncx_pad_putn_schar_double(xpp, nelems, tp);
+#line 729
+		return ncx_pad_putn_schar_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_SHORT:
-		return ncx_pad_putn_short_double(xpp, nelems, tp);
+#line 729
+		return ncx_pad_putn_short_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_INT:
-		return ncx_putn_int_double(xpp, nelems, tp);
+#line 729
+		return ncx_putn_int_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_FLOAT:
-		return ncx_putn_float_double(xpp, nelems, tp);
+#line 729
+		return ncx_putn_float_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_DOUBLE:
-		return ncx_putn_double_double(xpp, nelems, tp);
+#line 729
+		return ncx_putn_double_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_double(xpp, nelems, tp);
+#line 729
+		return ncx_pad_putn_uchar_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_USHORT:
-		return ncx_putn_ushort_double(xpp, nelems, tp);
+#line 729
+		return ncx_putn_ushort_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_UINT:
-		return ncx_putn_uint_double(xpp, nelems, tp);
+#line 729
+		return ncx_putn_uint_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_INT64:
-		return ncx_putn_longlong_double(xpp, nelems, tp);
+#line 729
+		return ncx_putn_longlong_double(xpp, nelems, tp, fillp);
+#line 729
 	case NC_UINT64:
-		return ncx_putn_ulonglong_double(xpp, nelems, tp);
+#line 729
+		return ncx_putn_ulonglong_double(xpp, nelems, tp, fillp);
+#line 729
 	default:
+#line 729
                 assert("ncx_pad_putn_Idouble invalid type" == 0);
+#line 729
 	}
+#line 729
 	return NC_EBADTYPE;
+#line 729
 }
+#line 729
 
 static int
+#line 730
 ncx_pad_getn_Idouble(const void **xpp, size_t nelems, double *tp, nc_type type)
+#line 730
 {
+#line 730
 	switch(type) {
+#line 730
 	case NC_CHAR:
+#line 730
 		return NC_ECHAR;
+#line 730
 	case NC_BYTE:
+#line 730
 		return ncx_pad_getn_schar_double(xpp, nelems, tp);
+#line 730
 	case NC_SHORT:
+#line 730
 		return ncx_pad_getn_short_double(xpp, nelems, tp);
+#line 730
 	case NC_INT:
+#line 730
 		return ncx_getn_int_double(xpp, nelems, tp);
+#line 730
 	case NC_FLOAT:
+#line 730
 		return ncx_getn_float_double(xpp, nelems, tp);
+#line 730
 	case NC_DOUBLE:
+#line 730
 		return ncx_getn_double_double(xpp, nelems, tp);
+#line 730
 	case NC_UBYTE:
+#line 730
 		return ncx_pad_getn_uchar_double(xpp, nelems, tp);
+#line 730
 	case NC_USHORT:
+#line 730
 		return ncx_getn_ushort_double(xpp, nelems, tp);
+#line 730
 	case NC_UINT:
+#line 730
 		return ncx_getn_uint_double(xpp, nelems, tp);
+#line 730
 	case NC_INT64:
+#line 730
 		return ncx_getn_longlong_double(xpp, nelems, tp);
+#line 730
 	case NC_UINT64:
+#line 730
 		return ncx_getn_ulonglong_double(xpp, nelems, tp);
+#line 730
 	default:
+#line 730
 	        assert("ncx_pad_getn_Idouble invalid type" == 0);
+#line 730
 	}
+#line 730
 	return NC_EBADTYPE;
+#line 730
 }
+#line 730
 
 
 #ifdef IGNORE
 static int
-ncx_pad_putn_Ilong(void **xpp, size_t nelems, const long *tp, nc_type type)
+#line 733
+ncx_pad_putn_Ilong(void **xpp, size_t nelems, const long *tp, nc_type type, void *fillp)
+#line 733
 {
+#line 733
 	switch(type) {
+#line 733
 	case NC_CHAR:
+#line 733
 		return NC_ECHAR;
+#line 733
 	case NC_BYTE:
-		return ncx_pad_putn_schar_long(xpp, nelems, tp);
+#line 733
+		return ncx_pad_putn_schar_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_SHORT:
-		return ncx_pad_putn_short_long(xpp, nelems, tp);
+#line 733
+		return ncx_pad_putn_short_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_INT:
-		return ncx_putn_int_long(xpp, nelems, tp);
+#line 733
+		return ncx_putn_int_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_FLOAT:
-		return ncx_putn_float_long(xpp, nelems, tp);
+#line 733
+		return ncx_putn_float_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_DOUBLE:
-		return ncx_putn_double_long(xpp, nelems, tp);
+#line 733
+		return ncx_putn_double_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_long(xpp, nelems, tp);
+#line 733
+		return ncx_pad_putn_uchar_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_USHORT:
-		return ncx_putn_ushort_long(xpp, nelems, tp);
+#line 733
+		return ncx_putn_ushort_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_UINT:
-		return ncx_putn_uint_long(xpp, nelems, tp);
+#line 733
+		return ncx_putn_uint_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_INT64:
-		return ncx_putn_longlong_long(xpp, nelems, tp);
+#line 733
+		return ncx_putn_longlong_long(xpp, nelems, tp, fillp);
+#line 733
 	case NC_UINT64:
-		return ncx_putn_ulonglong_long(xpp, nelems, tp);
+#line 733
+		return ncx_putn_ulonglong_long(xpp, nelems, tp, fillp);
+#line 733
 	default:
+#line 733
                 assert("ncx_pad_putn_Ilong invalid type" == 0);
+#line 733
 	}
+#line 733
 	return NC_EBADTYPE;
+#line 733
 }
+#line 733
 
 static int
+#line 734
 ncx_pad_getn_Ilong(const void **xpp, size_t nelems, long *tp, nc_type type)
+#line 734
 {
+#line 734
 	switch(type) {
+#line 734
 	case NC_CHAR:
+#line 734
 		return NC_ECHAR;
+#line 734
 	case NC_BYTE:
+#line 734
 		return ncx_pad_getn_schar_long(xpp, nelems, tp);
+#line 734
 	case NC_SHORT:
+#line 734
 		return ncx_pad_getn_short_long(xpp, nelems, tp);
+#line 734
 	case NC_INT:
+#line 734
 		return ncx_getn_int_long(xpp, nelems, tp);
+#line 734
 	case NC_FLOAT:
+#line 734
 		return ncx_getn_float_long(xpp, nelems, tp);
+#line 734
 	case NC_DOUBLE:
+#line 734
 		return ncx_getn_double_long(xpp, nelems, tp);
+#line 734
 	case NC_UBYTE:
+#line 734
 		return ncx_pad_getn_uchar_long(xpp, nelems, tp);
+#line 734
 	case NC_USHORT:
+#line 734
 		return ncx_getn_ushort_long(xpp, nelems, tp);
+#line 734
 	case NC_UINT:
+#line 734
 		return ncx_getn_uint_long(xpp, nelems, tp);
+#line 734
 	case NC_INT64:
+#line 734
 		return ncx_getn_longlong_long(xpp, nelems, tp);
+#line 734
 	case NC_UINT64:
+#line 734
 		return ncx_getn_ulonglong_long(xpp, nelems, tp);
+#line 734
 	default:
+#line 734
 	        assert("ncx_pad_getn_Ilong invalid type" == 0);
+#line 734
 	}
+#line 734
 	return NC_EBADTYPE;
+#line 734
 }
+#line 734
 
 #endif
 
 static int
-ncx_pad_putn_Ilonglong(void **xpp, size_t nelems, const longlong *tp, nc_type type)
+#line 737
+ncx_pad_putn_Ilonglong(void **xpp, size_t nelems, const longlong *tp, nc_type type, void *fillp)
+#line 737
 {
+#line 737
 	switch(type) {
+#line 737
 	case NC_CHAR:
+#line 737
 		return NC_ECHAR;
+#line 737
 	case NC_BYTE:
-		return ncx_pad_putn_schar_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_pad_putn_schar_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_SHORT:
-		return ncx_pad_putn_short_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_pad_putn_short_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_INT:
-		return ncx_putn_int_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_putn_int_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_FLOAT:
-		return ncx_putn_float_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_putn_float_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_DOUBLE:
-		return ncx_putn_double_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_putn_double_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_pad_putn_uchar_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_USHORT:
-		return ncx_putn_ushort_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_putn_ushort_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_UINT:
-		return ncx_putn_uint_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_putn_uint_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_INT64:
-		return ncx_putn_longlong_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_putn_longlong_longlong(xpp, nelems, tp, fillp);
+#line 737
 	case NC_UINT64:
-		return ncx_putn_ulonglong_longlong(xpp, nelems, tp);
+#line 737
+		return ncx_putn_ulonglong_longlong(xpp, nelems, tp, fillp);
+#line 737
 	default:
+#line 737
                 assert("ncx_pad_putn_Ilonglong invalid type" == 0);
+#line 737
 	}
+#line 737
 	return NC_EBADTYPE;
+#line 737
 }
+#line 737
 
 static int
+#line 738
 ncx_pad_getn_Ilonglong(const void **xpp, size_t nelems, longlong *tp, nc_type type)
+#line 738
 {
+#line 738
 	switch(type) {
+#line 738
 	case NC_CHAR:
+#line 738
 		return NC_ECHAR;
+#line 738
 	case NC_BYTE:
+#line 738
 		return ncx_pad_getn_schar_longlong(xpp, nelems, tp);
+#line 738
 	case NC_SHORT:
+#line 738
 		return ncx_pad_getn_short_longlong(xpp, nelems, tp);
+#line 738
 	case NC_INT:
+#line 738
 		return ncx_getn_int_longlong(xpp, nelems, tp);
+#line 738
 	case NC_FLOAT:
+#line 738
 		return ncx_getn_float_longlong(xpp, nelems, tp);
+#line 738
 	case NC_DOUBLE:
+#line 738
 		return ncx_getn_double_longlong(xpp, nelems, tp);
+#line 738
 	case NC_UBYTE:
+#line 738
 		return ncx_pad_getn_uchar_longlong(xpp, nelems, tp);
+#line 738
 	case NC_USHORT:
+#line 738
 		return ncx_getn_ushort_longlong(xpp, nelems, tp);
+#line 738
 	case NC_UINT:
+#line 738
 		return ncx_getn_uint_longlong(xpp, nelems, tp);
+#line 738
 	case NC_INT64:
+#line 738
 		return ncx_getn_longlong_longlong(xpp, nelems, tp);
+#line 738
 	case NC_UINT64:
+#line 738
 		return ncx_getn_ulonglong_longlong(xpp, nelems, tp);
+#line 738
 	default:
+#line 738
 	        assert("ncx_pad_getn_Ilonglong invalid type" == 0);
+#line 738
 	}
+#line 738
 	return NC_EBADTYPE;
+#line 738
 }
+#line 738
 
 
 static int
-ncx_pad_putn_Iushort(void **xpp, size_t nelems, const ushort *tp, nc_type type)
+#line 740
+ncx_pad_putn_Iushort(void **xpp, size_t nelems, const ushort *tp, nc_type type, void *fillp)
+#line 740
 {
+#line 740
 	switch(type) {
+#line 740
 	case NC_CHAR:
+#line 740
 		return NC_ECHAR;
+#line 740
 	case NC_BYTE:
-		return ncx_pad_putn_schar_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_pad_putn_schar_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_SHORT:
-		return ncx_pad_putn_short_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_pad_putn_short_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_INT:
-		return ncx_putn_int_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_putn_int_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_FLOAT:
-		return ncx_putn_float_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_putn_float_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_DOUBLE:
-		return ncx_putn_double_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_putn_double_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_pad_putn_uchar_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_USHORT:
-		return ncx_putn_ushort_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_putn_ushort_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_UINT:
-		return ncx_putn_uint_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_putn_uint_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_INT64:
-		return ncx_putn_longlong_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_putn_longlong_ushort(xpp, nelems, tp, fillp);
+#line 740
 	case NC_UINT64:
-		return ncx_putn_ulonglong_ushort(xpp, nelems, tp);
+#line 740
+		return ncx_putn_ulonglong_ushort(xpp, nelems, tp, fillp);
+#line 740
 	default:
+#line 740
                 assert("ncx_pad_putn_Iushort invalid type" == 0);
+#line 740
 	}
+#line 740
 	return NC_EBADTYPE;
+#line 740
 }
+#line 740
 
 static int
+#line 741
 ncx_pad_getn_Iushort(const void **xpp, size_t nelems, ushort *tp, nc_type type)
+#line 741
 {
+#line 741
 	switch(type) {
+#line 741
 	case NC_CHAR:
+#line 741
 		return NC_ECHAR;
+#line 741
 	case NC_BYTE:
+#line 741
 		return ncx_pad_getn_schar_ushort(xpp, nelems, tp);
+#line 741
 	case NC_SHORT:
+#line 741
 		return ncx_pad_getn_short_ushort(xpp, nelems, tp);
+#line 741
 	case NC_INT:
+#line 741
 		return ncx_getn_int_ushort(xpp, nelems, tp);
+#line 741
 	case NC_FLOAT:
+#line 741
 		return ncx_getn_float_ushort(xpp, nelems, tp);
+#line 741
 	case NC_DOUBLE:
+#line 741
 		return ncx_getn_double_ushort(xpp, nelems, tp);
+#line 741
 	case NC_UBYTE:
+#line 741
 		return ncx_pad_getn_uchar_ushort(xpp, nelems, tp);
+#line 741
 	case NC_USHORT:
+#line 741
 		return ncx_getn_ushort_ushort(xpp, nelems, tp);
+#line 741
 	case NC_UINT:
+#line 741
 		return ncx_getn_uint_ushort(xpp, nelems, tp);
+#line 741
 	case NC_INT64:
+#line 741
 		return ncx_getn_longlong_ushort(xpp, nelems, tp);
+#line 741
 	case NC_UINT64:
+#line 741
 		return ncx_getn_ulonglong_ushort(xpp, nelems, tp);
+#line 741
 	default:
+#line 741
 	        assert("ncx_pad_getn_Iushort invalid type" == 0);
+#line 741
 	}
+#line 741
 	return NC_EBADTYPE;
+#line 741
 }
+#line 741
 
 
 static int
-ncx_pad_putn_Iuint(void **xpp, size_t nelems, const uint *tp, nc_type type)
+#line 743
+ncx_pad_putn_Iuint(void **xpp, size_t nelems, const uint *tp, nc_type type, void *fillp)
+#line 743
 {
+#line 743
 	switch(type) {
+#line 743
 	case NC_CHAR:
+#line 743
 		return NC_ECHAR;
+#line 743
 	case NC_BYTE:
-		return ncx_pad_putn_schar_uint(xpp, nelems, tp);
+#line 743
+		return ncx_pad_putn_schar_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_SHORT:
-		return ncx_pad_putn_short_uint(xpp, nelems, tp);
+#line 743
+		return ncx_pad_putn_short_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_INT:
-		return ncx_putn_int_uint(xpp, nelems, tp);
+#line 743
+		return ncx_putn_int_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_FLOAT:
-		return ncx_putn_float_uint(xpp, nelems, tp);
+#line 743
+		return ncx_putn_float_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_DOUBLE:
-		return ncx_putn_double_uint(xpp, nelems, tp);
+#line 743
+		return ncx_putn_double_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_uint(xpp, nelems, tp);
+#line 743
+		return ncx_pad_putn_uchar_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_USHORT:
-		return ncx_putn_ushort_uint(xpp, nelems, tp);
+#line 743
+		return ncx_putn_ushort_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_UINT:
-		return ncx_putn_uint_uint(xpp, nelems, tp);
+#line 743
+		return ncx_putn_uint_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_INT64:
-		return ncx_putn_longlong_uint(xpp, nelems, tp);
+#line 743
+		return ncx_putn_longlong_uint(xpp, nelems, tp, fillp);
+#line 743
 	case NC_UINT64:
-		return ncx_putn_ulonglong_uint(xpp, nelems, tp);
+#line 743
+		return ncx_putn_ulonglong_uint(xpp, nelems, tp, fillp);
+#line 743
 	default:
+#line 743
                 assert("ncx_pad_putn_Iuint invalid type" == 0);
+#line 743
 	}
+#line 743
 	return NC_EBADTYPE;
+#line 743
 }
+#line 743
 
 static int
+#line 744
 ncx_pad_getn_Iuint(const void **xpp, size_t nelems, uint *tp, nc_type type)
+#line 744
 {
+#line 744
 	switch(type) {
+#line 744
 	case NC_CHAR:
+#line 744
 		return NC_ECHAR;
+#line 744
 	case NC_BYTE:
+#line 744
 		return ncx_pad_getn_schar_uint(xpp, nelems, tp);
+#line 744
 	case NC_SHORT:
+#line 744
 		return ncx_pad_getn_short_uint(xpp, nelems, tp);
+#line 744
 	case NC_INT:
+#line 744
 		return ncx_getn_int_uint(xpp, nelems, tp);
+#line 744
 	case NC_FLOAT:
+#line 744
 		return ncx_getn_float_uint(xpp, nelems, tp);
+#line 744
 	case NC_DOUBLE:
+#line 744
 		return ncx_getn_double_uint(xpp, nelems, tp);
+#line 744
 	case NC_UBYTE:
+#line 744
 		return ncx_pad_getn_uchar_uint(xpp, nelems, tp);
+#line 744
 	case NC_USHORT:
+#line 744
 		return ncx_getn_ushort_uint(xpp, nelems, tp);
+#line 744
 	case NC_UINT:
+#line 744
 		return ncx_getn_uint_uint(xpp, nelems, tp);
+#line 744
 	case NC_INT64:
+#line 744
 		return ncx_getn_longlong_uint(xpp, nelems, tp);
+#line 744
 	case NC_UINT64:
+#line 744
 		return ncx_getn_ulonglong_uint(xpp, nelems, tp);
+#line 744
 	default:
+#line 744
 	        assert("ncx_pad_getn_Iuint invalid type" == 0);
+#line 744
 	}
+#line 744
 	return NC_EBADTYPE;
+#line 744
 }
+#line 744
 
 
 static int
-ncx_pad_putn_Iulonglong(void **xpp, size_t nelems, const ulonglong *tp, nc_type type)
+#line 746
+ncx_pad_putn_Iulonglong(void **xpp, size_t nelems, const ulonglong *tp, nc_type type, void *fillp)
+#line 746
 {
+#line 746
 	switch(type) {
+#line 746
 	case NC_CHAR:
+#line 746
 		return NC_ECHAR;
+#line 746
 	case NC_BYTE:
-		return ncx_pad_putn_schar_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_pad_putn_schar_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_SHORT:
-		return ncx_pad_putn_short_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_pad_putn_short_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_INT:
-		return ncx_putn_int_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_putn_int_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_FLOAT:
-		return ncx_putn_float_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_putn_float_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_DOUBLE:
-		return ncx_putn_double_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_putn_double_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_pad_putn_uchar_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_USHORT:
-		return ncx_putn_ushort_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_putn_ushort_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_UINT:
-		return ncx_putn_uint_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_putn_uint_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_INT64:
-		return ncx_putn_longlong_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_putn_longlong_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	case NC_UINT64:
-		return ncx_putn_ulonglong_ulonglong(xpp, nelems, tp);
+#line 746
+		return ncx_putn_ulonglong_ulonglong(xpp, nelems, tp, fillp);
+#line 746
 	default:
+#line 746
                 assert("ncx_pad_putn_Iulonglong invalid type" == 0);
+#line 746
 	}
+#line 746
 	return NC_EBADTYPE;
+#line 746
 }
+#line 746
 
 static int
+#line 747
 ncx_pad_getn_Iulonglong(const void **xpp, size_t nelems, ulonglong *tp, nc_type type)
+#line 747
 {
+#line 747
 	switch(type) {
+#line 747
 	case NC_CHAR:
+#line 747
 		return NC_ECHAR;
+#line 747
 	case NC_BYTE:
+#line 747
 		return ncx_pad_getn_schar_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_SHORT:
+#line 747
 		return ncx_pad_getn_short_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_INT:
+#line 747
 		return ncx_getn_int_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_FLOAT:
+#line 747
 		return ncx_getn_float_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_DOUBLE:
+#line 747
 		return ncx_getn_double_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_UBYTE:
+#line 747
 		return ncx_pad_getn_uchar_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_USHORT:
+#line 747
 		return ncx_getn_ushort_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_UINT:
+#line 747
 		return ncx_getn_uint_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_INT64:
+#line 747
 		return ncx_getn_longlong_ulonglong(xpp, nelems, tp);
+#line 747
 	case NC_UINT64:
+#line 747
 		return ncx_getn_ulonglong_ulonglong(xpp, nelems, tp);
+#line 747
 	default:
+#line 747
 	        assert("ncx_pad_getn_Iulonglong invalid type" == 0);
+#line 747
 	}
+#line 747
 	return NC_EBADTYPE;
+#line 747
 }
+#line 747
 
 
 
 /* Common dispatcher for put cases */
 static int
 dispatchput(void **xpp, size_t nelems, const void* tp,
-	    nc_type atype, nc_type memtype)
+	    nc_type atype, nc_type memtype, void *fillp)
 {
     switch (memtype) {
     case NC_CHAR:
         return ncx_pad_putn_text(xpp,nelems, (char *)tp);
     case NC_BYTE:
-        return ncx_pad_putn_Ischar(xpp, nelems, (schar*)tp, atype);
+        return ncx_pad_putn_Ischar(xpp, nelems, (schar*)tp, atype, fillp);
     case NC_SHORT:
-        return ncx_pad_putn_Ishort(xpp, nelems, (short*)tp, atype);
+        return ncx_pad_putn_Ishort(xpp, nelems, (short*)tp, atype, fillp);
     case NC_INT:
-          return ncx_pad_putn_Iint(xpp, nelems, (int*)tp, atype);
+          return ncx_pad_putn_Iint(xpp, nelems, (int*)tp, atype, fillp);
     case NC_FLOAT:
-        return ncx_pad_putn_Ifloat(xpp, nelems, (float*)tp, atype);
+        return ncx_pad_putn_Ifloat(xpp, nelems, (float*)tp, atype, fillp);
     case NC_DOUBLE:
-        return ncx_pad_putn_Idouble(xpp, nelems, (double*)tp, atype);
+        return ncx_pad_putn_Idouble(xpp, nelems, (double*)tp, atype, fillp);
     case NC_UBYTE: /*Synthetic*/
-        return ncx_pad_putn_Iuchar(xpp,nelems, (uchar *)tp, atype);
+        return ncx_pad_putn_Iuchar(xpp,nelems, (uchar *)tp, atype, fillp);
     case NC_INT64:
-          return ncx_pad_putn_Ilonglong(xpp, nelems, (longlong*)tp, atype);
+          return ncx_pad_putn_Ilonglong(xpp, nelems, (longlong*)tp, atype, fillp);
     case NC_USHORT:
-          return ncx_pad_putn_Iushort(xpp, nelems, (ushort*)tp, atype);
+          return ncx_pad_putn_Iushort(xpp, nelems, (ushort*)tp, atype, fillp);
     case NC_UINT:
-          return ncx_pad_putn_Iuint(xpp, nelems, (uint*)tp, atype);
+          return ncx_pad_putn_Iuint(xpp, nelems, (uint*)tp, atype, fillp);
     case NC_UINT64:
-          return ncx_pad_putn_Iulonglong(xpp, nelems, (ulonglong*)tp, atype);
+          return ncx_pad_putn_Iulonglong(xpp, nelems, (ulonglong*)tp, atype, fillp);
     case NC_NAT:
         return NC_EBADTYPE;
     default:
@@ -1392,6 +2087,7 @@ NC3_put_att(
     NC_attr **attrpp;
     NC_attr *old = NULL;
     NC_attr *attrp;
+    unsigned char fill[8]; /* fill value in internal representation */
 
     status = NC_check_id(ncid, &nc);
     if(status != NC_NOERR)
@@ -1405,6 +2101,10 @@ NC3_put_att(
     if(ncap == NULL)
 	return NC_ENOTVAR;
 
+    if (name == NULL)
+        return NC_EBADNAME;
+
+    /* check NC_EBADTYPE */
     status = nc3_cktype(nc->mode, type);
     if(status != NC_NOERR)
 	return status;
@@ -1427,6 +2127,9 @@ NC3_put_att(
 
     /* 4 cases: exists X indef */
 
+    status = NC3_inq_default_fill_value(type, &fill);
+    if (status != NC_NOERR) return status;
+
     if(attrpp != NULL) { /* name in use */
         if(!NC_indef(ncp)) {
 	    const size_t xsz = ncx_len_NC_attrV(type, nelems);
@@ -1441,7 +2144,13 @@ NC3_put_att(
 
             if(nelems != 0) {
                 void *xp = attrp->xvalue;
-                status = dispatchput(&xp, nelems, (const void*)value, type, memtype);
+                /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+                if (!fIsSet(ncp->flags,NC_64BIT_DATA) && type == NC_BYTE && memtype == NC_UBYTE) {
+                    status = NC3_inq_default_fill_value(NC_UBYTE, &fill);
+                    if (status != NC_NOERR) return status;
+                    status = dispatchput(&xp, nelems, value, memtype, memtype, &fill);
+                } else
+                    status = dispatchput(&xp, nelems, value, type, memtype, &fill);
             }
 
             set_NC_hdirty(ncp);
@@ -1473,7 +2182,13 @@ NC3_put_att(
 
     if(nelems != 0) {
         void *xp = attrp->xvalue;
-        status = dispatchput(&xp, nelems, (const void*)value, type, memtype);
+        /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+        if (!fIsSet(ncp->flags,NC_64BIT_DATA) && type == NC_BYTE && memtype == NC_UBYTE) {
+            status = NC3_inq_default_fill_value(NC_UBYTE, &fill);
+            if (status != NC_NOERR) return status;
+            status = dispatchput(&xp, nelems, (const void*)value, memtype, memtype, &fill);
+        } else
+            status = dispatchput(&xp, nelems, (const void*)value, type, memtype, &fill);
     }
 
     if(attrpp != NULL) {
@@ -1503,9 +2218,16 @@ NC3_get_att(
 	nc_type memtype)
 {
     int status;
+    NC *nc;
+    NC3_INFO* ncp;
     NC_attr *attrp;
     const void *xp;
 
+    status = NC_check_id(ncid, &nc);
+    if(status != NC_NOERR)
+	return status;
+    ncp = NC3_DATA(nc);
+
     status = NC_lookupattr(ncid, varid, name, &attrp);
     if(status != NC_NOERR) return status;
 
@@ -1521,7 +2243,7 @@ NC3_get_att(
     xp = attrp->xvalue;
     switch (memtype) {
     case NC_CHAR:
-        return ncx_pad_getn_text(&xp, attrp->nelems , (char *)value);
+        return ncx_pad_getn_text(&xp, attrp->nelems, (char *)value);
     case NC_BYTE:
         return ncx_pad_getn_Ischar(&xp,attrp->nelems,(schar*)value,attrp->type);
     case NC_SHORT:
@@ -1535,14 +2257,17 @@ NC3_get_att(
     case NC_INT64:
           return ncx_pad_getn_Ilonglong(&xp,attrp->nelems,(longlong*)value,attrp->type);
     case NC_UBYTE: /* Synthetic */
-        return ncx_pad_getn_Iuchar(&xp, attrp->nelems , (uchar *)value, attrp->type);
+        /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+        if (!fIsSet(ncp->flags,NC_64BIT_DATA) && attrp->type == NC_BYTE)
+            return ncx_pad_getn_Iuchar(&xp, attrp->nelems, (uchar *)value, NC_UBYTE);
+        else
+            return ncx_pad_getn_Iuchar(&xp, attrp->nelems, (uchar *)value, attrp->type);
     case NC_USHORT:
           return ncx_pad_getn_Iushort(&xp,attrp->nelems,(ushort*)value,attrp->type);
     case NC_UINT:
           return ncx_pad_getn_Iuint(&xp,attrp->nelems,(uint*)value,attrp->type);
     case NC_UINT64:
           return ncx_pad_getn_Iulonglong(&xp,attrp->nelems,(ulonglong*)value,attrp->type);
-
     case NC_NAT:
         return NC_EBADTYPE;
     default:
@@ -1551,3 +2276,4 @@ NC3_get_att(
     status =  NC_EBADTYPE;
     return status;
 }
+
diff --git a/libsrc/attr.m4 b/libsrc/attr.m4
index 21f458d..bf4c6fb 100644
--- a/libsrc/attr.m4
+++ b/libsrc/attr.m4
@@ -9,6 +9,10 @@ dnl
  *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include "nc3internal.h"
 #include "ncdispatch.h"
 #include "nc3dispatch.h"
@@ -18,8 +22,7 @@ dnl
 #include "ncx.h"
 #include "fbits.h"
 #include "rnd.h"
-#include "utf8proc.h"
-
+#include "ncutf8.h"
 
 /*
  * Free attr
@@ -117,9 +120,11 @@ new_NC_attr(
 {
 	NC_string *strp;
 	NC_attr *attrp;
+	char *name;
+	int stat;
 
-	char *name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
+	stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char**)&name);
+	if(stat != NC_NOERR)
 	    return NULL;
 	assert(name != NULL && *name != 0);
 
@@ -344,6 +349,7 @@ NC_findattr(const NC_attrarray *ncap, const char *uname)
 	size_t attrid;
 	size_t slen;
 	char *name;
+	int stat;
 
 	assert(ncap != NULL);
 
@@ -353,8 +359,8 @@ NC_findattr(const NC_attrarray *ncap, const char *uname)
 	attrpp = (NC_attr **) ncap->value;
 
 	/* normalized version of uname */
-	name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
+	stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char**)&name);
+	if(stat != NC_NOERR)
 	    return NULL; /* TODO: need better way to indicate no memory */
 	slen = strlen(name);
 
@@ -396,6 +402,9 @@ NC_lookupattr(int ncid,
 	if(ncap == NULL)
 		return NC_ENOTVAR;
 
+	if(name == NULL)
+		return NC_EBADNAME;
+
 	tmp = NC_findattr(ncap, name);
 	if(tmp == NULL)
 		return NC_ENOTATT;
@@ -531,9 +540,9 @@ NC3_rename_att( int ncid, int varid, const char *name, const char *unewname)
 	}
 
 	old = attrp->name;
-	newname = (char *)utf8proc_NFC((const unsigned char *)unewname);
-	if(newname == NULL)
-	    return NC_EBADNAME;
+	status = nc_utf8_normalize((const unsigned char *)unewname,(unsigned char**)&newname);
+	if(status != NC_NOERR)
+	    return status;
 	if(NC_indef(ncp))
 	{
 		newStr = new_NC_string(strlen(newname), newname);
@@ -587,11 +596,12 @@ NC3_del_att(int ncid, int varid, const char *uname)
 		return NC_ENOTVAR;
 
 	{
-	char *name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
-	    return NC_ENOMEM;
+	char* name;
+	int stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char**)&name);
+	if(stat != NC_NOERR)
+	    return stat;
 
-			/* sortof inline NC_findattr() */
+        /* sortof inline NC_findattr() */
 	slen = strlen(name);
 
 	attrpp = (NC_attr **) ncap->value;
@@ -631,31 +641,31 @@ dnl
 define(`XNCX_PAD_PUTN',dnl
 `dnl
 static int
-ncx_pad_putn_I$1(void **xpp, size_t nelems, const $1 *tp, nc_type type)
+ncx_pad_putn_I$1(void **xpp, size_t nelems, const $1 *tp, nc_type type, void *fillp)
 {
 	switch(type) {
 	case NC_CHAR:
 		return NC_ECHAR;
 	case NC_BYTE:
-		return ncx_pad_putn_schar_$1(xpp, nelems, tp);
+		return ncx_pad_putn_schar_$1(xpp, nelems, tp, fillp);
 	case NC_SHORT:
-		return ncx_pad_putn_short_$1(xpp, nelems, tp);
+		return ncx_pad_putn_short_$1(xpp, nelems, tp, fillp);
 	case NC_INT:
-		return ncx_putn_int_$1(xpp, nelems, tp);
+		return ncx_putn_int_$1(xpp, nelems, tp, fillp);
 	case NC_FLOAT:
-		return ncx_putn_float_$1(xpp, nelems, tp);
+		return ncx_putn_float_$1(xpp, nelems, tp, fillp);
 	case NC_DOUBLE:
-		return ncx_putn_double_$1(xpp, nelems, tp);
+		return ncx_putn_double_$1(xpp, nelems, tp, fillp);
 	case NC_UBYTE:
-		return ncx_pad_putn_uchar_$1(xpp, nelems, tp);
+		return ncx_pad_putn_uchar_$1(xpp, nelems, tp, fillp);
 	case NC_USHORT:
-		return ncx_putn_ushort_$1(xpp, nelems, tp);
+		return ncx_putn_ushort_$1(xpp, nelems, tp, fillp);
 	case NC_UINT:
-		return ncx_putn_uint_$1(xpp, nelems, tp);
+		return ncx_putn_uint_$1(xpp, nelems, tp, fillp);
 	case NC_INT64:
-		return ncx_putn_longlong_$1(xpp, nelems, tp);
+		return ncx_putn_longlong_$1(xpp, nelems, tp, fillp);
 	case NC_UINT64:
-		return ncx_putn_ulonglong_$1(xpp, nelems, tp);
+		return ncx_putn_ulonglong_$1(xpp, nelems, tp, fillp);
 	default:
                 assert("ncx_pad_putn_I$1 invalid type" == 0);
 	}
@@ -740,31 +750,31 @@ XNCX_PAD_GETN(ulonglong)
 /* Common dispatcher for put cases */
 static int
 dispatchput(void **xpp, size_t nelems, const void* tp,
-	    nc_type atype, nc_type memtype)
+	    nc_type atype, nc_type memtype, void *fillp)
 {
     switch (memtype) {
     case NC_CHAR:
         return ncx_pad_putn_text(xpp,nelems, (char *)tp);
     case NC_BYTE:
-        return ncx_pad_putn_Ischar(xpp, nelems, (schar*)tp, atype);
+        return ncx_pad_putn_Ischar(xpp, nelems, (schar*)tp, atype, fillp);
     case NC_SHORT:
-        return ncx_pad_putn_Ishort(xpp, nelems, (short*)tp, atype);
+        return ncx_pad_putn_Ishort(xpp, nelems, (short*)tp, atype, fillp);
     case NC_INT:
-          return ncx_pad_putn_Iint(xpp, nelems, (int*)tp, atype);
+          return ncx_pad_putn_Iint(xpp, nelems, (int*)tp, atype, fillp);
     case NC_FLOAT:
-        return ncx_pad_putn_Ifloat(xpp, nelems, (float*)tp, atype);
+        return ncx_pad_putn_Ifloat(xpp, nelems, (float*)tp, atype, fillp);
     case NC_DOUBLE:
-        return ncx_pad_putn_Idouble(xpp, nelems, (double*)tp, atype);
+        return ncx_pad_putn_Idouble(xpp, nelems, (double*)tp, atype, fillp);
     case NC_UBYTE: /*Synthetic*/
-        return ncx_pad_putn_Iuchar(xpp,nelems, (uchar *)tp, atype);
+        return ncx_pad_putn_Iuchar(xpp,nelems, (uchar *)tp, atype, fillp);
     case NC_INT64:
-          return ncx_pad_putn_Ilonglong(xpp, nelems, (longlong*)tp, atype);
+          return ncx_pad_putn_Ilonglong(xpp, nelems, (longlong*)tp, atype, fillp);
     case NC_USHORT:
-          return ncx_pad_putn_Iushort(xpp, nelems, (ushort*)tp, atype);
+          return ncx_pad_putn_Iushort(xpp, nelems, (ushort*)tp, atype, fillp);
     case NC_UINT:
-          return ncx_pad_putn_Iuint(xpp, nelems, (uint*)tp, atype);
+          return ncx_pad_putn_Iuint(xpp, nelems, (uint*)tp, atype, fillp);
     case NC_UINT64:
-          return ncx_pad_putn_Iulonglong(xpp, nelems, (ulonglong*)tp, atype);
+          return ncx_pad_putn_Iulonglong(xpp, nelems, (ulonglong*)tp, atype, fillp);
     case NC_NAT:
         return NC_EBADTYPE;
     default:
@@ -790,6 +800,7 @@ NC3_put_att(
     NC_attr **attrpp;
     NC_attr *old = NULL;
     NC_attr *attrp;
+    unsigned char fill[8]; /* fill value in internal representation */
 
     status = NC_check_id(ncid, &nc);
     if(status != NC_NOERR)
@@ -803,6 +814,10 @@ NC3_put_att(
     if(ncap == NULL)
 	return NC_ENOTVAR;
 
+    if (name == NULL)
+        return NC_EBADNAME;
+
+    /* check NC_EBADTYPE */
     status = nc3_cktype(nc->mode, type);
     if(status != NC_NOERR)
 	return status;
@@ -825,6 +840,9 @@ NC3_put_att(
 
     /* 4 cases: exists X indef */
 
+    status = NC3_inq_default_fill_value(type, &fill);
+    if (status != NC_NOERR) return status;
+
     if(attrpp != NULL) { /* name in use */
         if(!NC_indef(ncp)) {
 	    const size_t xsz = ncx_len_NC_attrV(type, nelems);
@@ -839,7 +857,13 @@ NC3_put_att(
 
             if(nelems != 0) {
                 void *xp = attrp->xvalue;
-                status = dispatchput(&xp, nelems, (const void*)value, type, memtype);
+                /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+                if (!fIsSet(ncp->flags,NC_64BIT_DATA) && type == NC_BYTE && memtype == NC_UBYTE) {
+                    status = NC3_inq_default_fill_value(NC_UBYTE, &fill);
+                    if (status != NC_NOERR) return status;
+                    status = dispatchput(&xp, nelems, value, memtype, memtype, &fill);
+                } else
+                    status = dispatchput(&xp, nelems, value, type, memtype, &fill);
             }
 
             set_NC_hdirty(ncp);
@@ -871,7 +895,13 @@ NC3_put_att(
 
     if(nelems != 0) {
         void *xp = attrp->xvalue;
-        status = dispatchput(&xp, nelems, (const void*)value, type, memtype);
+        /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+        if (!fIsSet(ncp->flags,NC_64BIT_DATA) && type == NC_BYTE && memtype == NC_UBYTE) {
+            status = NC3_inq_default_fill_value(NC_UBYTE, &fill);
+            if (status != NC_NOERR) return status;
+            status = dispatchput(&xp, nelems, (const void*)value, memtype, memtype, &fill);
+        } else
+            status = dispatchput(&xp, nelems, (const void*)value, type, memtype, &fill);
     }
 
     if(attrpp != NULL) {
@@ -901,9 +931,16 @@ NC3_get_att(
 	nc_type memtype)
 {
     int status;
+    NC *nc;
+    NC3_INFO* ncp;
     NC_attr *attrp;
     const void *xp;
 
+    status = NC_check_id(ncid, &nc);
+    if(status != NC_NOERR)
+	return status;
+    ncp = NC3_DATA(nc);
+
     status = NC_lookupattr(ncid, varid, name, &attrp);
     if(status != NC_NOERR) return status;
 
@@ -919,7 +956,7 @@ NC3_get_att(
     xp = attrp->xvalue;
     switch (memtype) {
     case NC_CHAR:
-        return ncx_pad_getn_text(&xp, attrp->nelems , (char *)value);
+        return ncx_pad_getn_text(&xp, attrp->nelems, (char *)value);
     case NC_BYTE:
         return ncx_pad_getn_Ischar(&xp,attrp->nelems,(schar*)value,attrp->type);
     case NC_SHORT:
@@ -933,14 +970,17 @@ NC3_get_att(
     case NC_INT64:
           return ncx_pad_getn_Ilonglong(&xp,attrp->nelems,(longlong*)value,attrp->type);
     case NC_UBYTE: /* Synthetic */
-        return ncx_pad_getn_Iuchar(&xp, attrp->nelems , (uchar *)value, attrp->type);
+        /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+        if (!fIsSet(ncp->flags,NC_64BIT_DATA) && attrp->type == NC_BYTE)
+            return ncx_pad_getn_Iuchar(&xp, attrp->nelems, (uchar *)value, NC_UBYTE);
+        else
+            return ncx_pad_getn_Iuchar(&xp, attrp->nelems, (uchar *)value, attrp->type);
     case NC_USHORT:
           return ncx_pad_getn_Iushort(&xp,attrp->nelems,(ushort*)value,attrp->type);
     case NC_UINT:
           return ncx_pad_getn_Iuint(&xp,attrp->nelems,(uint*)value,attrp->type);
     case NC_UINT64:
           return ncx_pad_getn_Iulonglong(&xp,attrp->nelems,(ulonglong*)value,attrp->type);
-
     case NC_NAT:
         return NC_EBADTYPE;
     default:
@@ -949,3 +989,4 @@ NC3_get_att(
     status =  NC_EBADTYPE;
     return status;
 }
+
diff --git a/libsrc/dim.c b/libsrc/dim.c
index 7d904ee..a809fc1 100644
--- a/libsrc/dim.c
+++ b/libsrc/dim.c
@@ -4,13 +4,17 @@
  */
 /* $Id: dim.c,v 1.83 2010/05/25 17:54:15 dmh Exp $ */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include "nc3internal.h"
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
 #include "ncx.h"
 #include "fbits.h"
-#include "utf8proc.h"
+#include "ncutf8.h"
 
 /*
  * Free dim
@@ -52,9 +56,11 @@ new_NC_dim(const char *uname, size_t size)
 {
 	NC_string *strp;
 	NC_dim *dimp;
+	int stat;
+	char* name;
 
-	char *name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
+	stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char **)&name);
+	if(stat != NC_NOERR)
 	    return NULL;
 	strp = new_NC_string(strlen(name), name);
 	free(name);
@@ -135,13 +141,14 @@ NC_finddim(const NC_dimarray *ncap, const char *uname, NC_dim **dimpp)
       return -1;
 
    {
+      int stat;
       dimid = 0;
       loc = (NC_dim **) ncap->value;
 
       /* normalized version of uname */
-      name = (char *)utf8proc_NFC((const unsigned char *)uname);
-      if(name == NULL)
-	 return NC_ENOMEM;
+      stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char **)&name);
+	if(stat != NC_NOERR)
+	 return stat;
       dimid = (int)NC_hashmapGetDim(ncap, name);
       free(name);
       if (dimid >= 0) {
@@ -323,7 +330,7 @@ NC3_def_dim(int ncid, const char *name, size_t size, int *dimidp)
 	int dimid;
 	NC_dim *dimp;
 
-	status = NC_check_id(ncid, &nc); 
+	status = NC_check_id(ncid, &nc);
 	if(status != NC_NOERR)
 		return status;
 	ncp = NC3_DATA(nc);
@@ -362,7 +369,7 @@ NC3_def_dim(int ncid, const char *name, size_t size, int *dimidp)
 	dimid = NC_finddim(&ncp->dims, name, &dimp);
 	if(dimid != -1)
 		return NC_ENAMEINUSE;
-	
+
 	dimp = new_NC_dim(name, size);
 	if(dimp == NULL)
 		return NC_ENOMEM;
@@ -387,7 +394,7 @@ NC3_inq_dimid(int ncid, const char *name, int *dimid_ptr)
 	NC3_INFO* ncp;
 	int dimid;
 
-	status = NC_check_id(ncid, &nc); 
+	status = NC_check_id(ncid, &nc);
 	if(status != NC_NOERR)
 		return status;
 	ncp = NC3_DATA(nc);
@@ -410,7 +417,7 @@ NC3_inq_dim(int ncid, int dimid, char *name, size_t *sizep)
 	NC3_INFO* ncp;
 	NC_dim *dimp;
 
-	status = NC_check_id(ncid, &nc); 
+	status = NC_check_id(ncid, &nc);
 	if(status != NC_NOERR)
 		return status;
 	ncp = NC3_DATA(nc);
@@ -421,7 +428,7 @@ NC3_inq_dim(int ncid, int dimid, char *name, size_t *sizep)
 
 	if(name != NULL)
 	{
-		(void)strncpy(name, dimp->name->cp, 
+		(void)strncpy(name, dimp->name->cp,
 			dimp->name->nchars);
 		name[dimp->name->nchars] = 0;
 	}
@@ -430,7 +437,7 @@ NC3_inq_dim(int ncid, int dimid, char *name, size_t *sizep)
 		if(dimp->size == NC_UNLIMITED)
 			*sizep = NC_get_numrecs(ncp);
 		else
-			*sizep = dimp->size;	
+			*sizep = dimp->size;
 	}
 	return NC_NOERR;
 }
@@ -444,8 +451,10 @@ NC3_rename_dim( int ncid, int dimid, const char *unewname)
 	int existid;
 	NC_dim *dimp;
 	char *newname;		/* normalized */
+	NC_string *old = NULL;
+
 
-	status = NC_check_id(ncid, &nc); 
+	status = NC_check_id(ncid, &nc);
 	if(status != NC_NOERR)
 		return status;
 	ncp = NC3_DATA(nc);
@@ -465,11 +474,11 @@ NC3_rename_dim( int ncid, int dimid, const char *unewname)
 	if(dimp == NULL)
 		return NC_EBADDIM;
 
-	NC_string *old = dimp->name;
-	newname = (char *)utf8proc_NFC((const unsigned char *)unewname);
-	if(newname == NULL)
-	    return NC_ENOMEM;
-	if(NC_indef(ncp))
+    old = dimp->name;
+    status = nc_utf8_normalize((const unsigned char *)unewname,(unsigned char **)&newname);
+    if(status != NC_NOERR)
+	return status;
+    if(NC_indef(ncp))
 	{
 		NC_string *newStr = new_NC_string(strlen(newname), newname);
 		free(newname);
diff --git a/libsrc/ffio.c b/libsrc/ffio.c
index 5f43e38..e2ba64f 100644
--- a/libsrc/ffio.c
+++ b/libsrc/ffio.c
@@ -7,17 +7,28 @@
 /* added correction by John Sheldon and Hans Vahlenkamp 15.4.1998*/
 
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>	/* DEBUG */
+#include <string.h>
+#include <assert.h>
 #include <errno.h>
 #ifndef NC_NOERR
 #define NC_NOERR 0
 #endif
+#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#include <string.h>
+#endif
 #if 0
 /* Insertion by O. R. Heudecker, AWI-Bremerhaven 12.3.98 (1 line)*/
 #include <ffio.h>
@@ -55,6 +66,8 @@ blksize(int fd)
 {
 	struct ffc_stat_s sb;
 	struct ffsw sw;
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+#ifdef HAVE_FCNTL_H
 	if (fffcntl(fd, FC_STAT, &sb, &sw) > -1)
 	{
 #ifdef __crayx1
@@ -65,6 +78,8 @@ blksize(int fd)
 			return (size_t) sb.st_oblksize;
 #endif
 	}
+#endif
+#endif
 	/* else, silent in the face of error */
 	return (size_t) 32768;
 }
@@ -134,7 +149,7 @@ fgrow2(const int fd, const off_t len)
 /* Begin ffio */
 
 static int
-ffio_pgout(ncio *const nciop, 
+ffio_pgout(ncio *const nciop,
 	off_t const offset,  const size_t extent,
 	const void *const vp, off_t *posp)
 {
@@ -204,7 +219,7 @@ ffio_pgin(ncio *const nciop,
 typedef struct ncio_ffio {
 	off_t pos;
 	/* buffer */
-	off_t	bf_offset; 
+	off_t	bf_offset;
 	size_t	bf_extent;
 	size_t	bf_cnt;
 	void	*bf_base;
@@ -252,7 +267,7 @@ ncio_ffio_get(ncio *const nciop,
 #ifdef X_ALIGN
 	size_t rem;
 #endif
-	
+
 	if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE))
 		return EPERM; /* attempt to write readonly file */
 
@@ -326,7 +341,7 @@ ncio_ffio_move(ncio *const nciop, off_t to, off_t from,
 			size_t nbytes, int rflags)
 {
 	int status = NC_NOERR;
-	off_t lower = from;	
+	off_t lower = from;
 	off_t upper = to;
 	char *base;
 	size_t diff = upper - lower;
@@ -336,11 +351,11 @@ ncio_ffio_move(ncio *const nciop, off_t to, off_t from,
 
 	if(to == from)
 		return NC_NOERR; /* NOOP */
-	
+
 	if(to > from)
 	{
 		/* growing */
-		lower = from;	
+		lower = from;
 		upper = to;
 	}
 	else
@@ -360,10 +375,10 @@ ncio_ffio_move(ncio *const nciop, off_t to, off_t from,
 		return status;
 
 	if(to > from)
-		(void) memmove(base + diff, base, nbytes); 
+		(void) memmove(base + diff, base, nbytes);
 	else
-		(void) memmove(base, base + diff, nbytes); 
-		
+		(void) memmove(base, base + diff, nbytes);
+
 	(void) ncio_ffio_rel(nciop, lower, RGN_MODIFIED);
 
 	return status;
@@ -401,12 +416,14 @@ ncio_ffio_global_test(const char *ControlString)
 static int
 ncio_ffio_sync(ncio *const nciop)
 {
+	int test_flush;
 #ifdef __crayx1
 	struct ffsw stat;
-	if(ffflush(nciop->fd,&stat) < 0)
+	test_flush = ffflush(nciop->fd,&stat) < 0;
 #else
-	if(ffflush(nciop->fd) < 0)
+	test_flush = ffflush(nciop->fd) < 0;
 #endif
+	if(test_flush)
 		return errno;
 	return NC_NOERR;
 }
@@ -482,7 +499,7 @@ ncio_free(ncio *nciop)
 
 	if(nciop->free != NULL)
 		nciop->free(nciop->pvt);
-	
+
 	free(nciop);
 }
 
@@ -494,7 +511,7 @@ ncio_ffio_new(const char *path, int ioflags)
 	size_t sz_path = M_RNDUP(strlen(path) +1);
 	size_t sz_ncio_pvt;
 	ncio *nciop;
- 
+
 #if ALWAYS_NC_SHARE /* DEBUG */
 	fSet(ioflags, NC_SHARE);
 #endif
@@ -507,7 +524,7 @@ ncio_ffio_new(const char *path, int ioflags)
 	nciop = (ncio *) malloc(sz_ncio + sz_path + sz_ncio_pvt);
 	if(nciop == NULL)
 		return NULL;
-	
+
 	nciop->ioflags = ioflags;
 	*((int *)&nciop->fd) = -1; /* cast away const */
 
@@ -573,7 +590,7 @@ ncio_ffio_assign(const char *filename) {
 	if(envstr == (char *) NULL) {
 		 envstr = "bufa:336:2";		/* this should be macroized */
 	}
-	
+
 	/* Insertion by Olaf Heudecker, AWI-Bremerhaven, 12.8.1998
 	   to allow more versatile FFIO-assigns */
 	/* this is unnecessary and could have been included
@@ -790,8 +807,8 @@ unwind_new:
 }
 
 
-/* 
- * Get file size in bytes.  
+/*
+ * Get file size in bytes.
  * Is use of ffseek() really necessary, or could we use standard fstat() call
  * and get st_size member?
  */
@@ -805,7 +822,7 @@ ncio_ffio_filesize(ncio *nciop, off_t *filesizep)
 
     current = ffseek(nciop->fd, 0, SEEK_CUR);  /* save current */
     *filesizep = ffseek(nciop->fd, 0, SEEK_END); /* get size */
-    reset = ffseek(nciop->fd, current, SEEK_SET); /* reset */ 
+    reset = ffseek(nciop->fd, current, SEEK_SET); /* reset */
 
     if(reset != current)
 	return EINVAL;
@@ -842,7 +859,7 @@ ncio_ffio_pad_length(ncio *nciop, off_t length)
 }
 
 
-static int 
+static int
 ncio_ffio_close(ncio *nciop, int doUnlink)
 {
 	/*
@@ -859,7 +876,7 @@ ncio_ffio_close(ncio *nciop, int doUnlink)
 	status = nciop->sync(nciop);
 
 	(void) ffclose(nciop->fd);
-	
+
 	if(doUnlink)
 		(void) unlink(nciop->path);
 
diff --git a/libsrc/lookup3.c b/libsrc/lookup3.c
index 4464153..f31e08e 100644
--- a/libsrc/lookup3.c
+++ b/libsrc/lookup3.c
@@ -46,7 +46,10 @@ on 1 byte), but shoehorning those bytes into integers efficiently is messy.
 */
 /* #define SELF_TEST 1 */
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <stdio.h>      /* defines printf for tests */
 #include <time.h>       /* defines time_t for timings in the test */
 #ifndef HAVE_STDINT_H
diff --git a/libsrc/memio.c b/libsrc/memio.c
index efcd097..600f150 100644
--- a/libsrc/memio.c
+++ b/libsrc/memio.c
@@ -9,19 +9,24 @@
 #define lseek64 lseek
 #endif
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <assert.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
 #ifdef _MSC_VER /* Microsoft Compilers */
 #include <io.h>
-#else
+#endif
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
+
 #include "ncdispatch.h"
 #include "nc3internal.h"
 
@@ -32,7 +37,7 @@
 #endif
 
 #ifndef HAVE_SSIZE_T
-#define ssize_t int
+typedef int ssize_t;
 #endif
 
 #ifndef SEEK_SET
@@ -380,6 +385,10 @@ fprintf(stderr,"memio_open: initial memory: %lu/%lu\n",(unsigned long)memio->mem
     /* Use half the filesize as the blocksize ; why? */
     sizehint = filesize/2;
 
+    /* sizehint must be multiple of 8 */
+    sizehint = (sizehint / 8) * 8;
+    if(sizehint < 8) sizehint = 8;
+
     fd = nc__pseudofd();
     *((int* )&nciop->fd) = fd;
 
diff --git a/libsrc/mmapio.c b/libsrc/mmapio.c
index 20eeacd..17a35f2 100644
--- a/libsrc/mmapio.c
+++ b/libsrc/mmapio.c
@@ -3,20 +3,23 @@
  *	See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <assert.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
 #ifdef _MSC_VER /* Microsoft Compilers */
 #include <io.h>
 #endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
 #include "nc3internal.h"
 
 #undef DEBUG
@@ -38,13 +41,13 @@
 #error mmap not fully implemented: missing MAP_ANONYMOUS
 #endif
 
-#ifdef HAVE_MMAP
+#ifdef HAVE_MREMAP
   /* This is conditionalized by __USE_GNU ; why? */
   extern void *mremap(void*,size_t,size_t,int);
 # ifndef MREMAP_MAYMOVE
 #   define MREMAP_MAYMOVE 1
 # endif
-#endif /*HAVE_MMAP*/
+#endif /*HAVE_MREMAP*/
 
 #ifndef HAVE_SSIZE_T
 #define ssize_t int
@@ -370,6 +373,10 @@ fprintf(stderr,"mmapio_open: initial memory: %lu/%lu\n",(unsigned long)mmapio->m
     /* Use half the filesize as the blocksize */
     sizehint = filesize/2;
 
+    /* sizehint must be multiple of 8 */
+    sizehint = (sizehint / 8) * 8;
+    if(sizehint < 8) sizehint = 8;
+
     fd = nc__pseudofd();
     *((int* )&nciop->fd) = fd; 
 
@@ -443,8 +450,18 @@ mmapio_pad_length(ncio* nciop, off_t length)
 	lseek(mmapio->mapfd,pos,SEEK_SET); /* reset position */
 	}
 
+#ifdef HAVE_MREMAP
 	newmem = (char*)mremap(mmapio->memory,mmapio->alloc,newsize,MREMAP_MAYMOVE);
 	if(newmem == NULL) return NC_ENOMEM;
+#else
+        newmemory = (char*)mmap(NULL,newsize,
+                                    persist?(PROT_READ|PROT_WRITE):(PROT_READ),
+				    MAP_SHARED,
+                                    mmapio->mapfd,0);
+	if(newmem == NULL) return NC_ENOMEM;
+	memcpy(newmemory,mmapio->memory,mmapio->alloc);
+        munmap(mmapio->memory,mmapio->alloc);
+#endif
 
 #ifdef DEBUG
 fprintf(stderr,"realloc: %lu/%lu -> %lu/%lu\n",
diff --git a/libsrc/nc3dispatch.h b/libsrc/nc3dispatch.h
deleted file mode 100644
index aee43b3..0000000
--- a/libsrc/nc3dispatch.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 1993-1996 University Corporation for Atmospheric Research/Unidata
- * 
- * Portions of this software were developed by the Unidata Program at the 
- * University Corporation for Atmospheric Research.
- * 
- * Access and use of this software shall impose the following obligations
- * and understandings on the user. The user is granted the right, without
- * any fee or cost, to use, copy, modify, alter, enhance and distribute
- * this software, and any derivative works thereof, and its supporting
- * documentation for any purpose whatsoever, provided that this entire
- * notice appears in all copies of the software, derivative works and
- * supporting documentation.  Further, UCAR requests that the user credit
- * UCAR/Unidata in any publications that result from the use of this
- * software or in any product that includes this software. The names UCAR
- * and/or Unidata, however, may not be used in any advertising or publicity
- * to endorse or promote any products or commercial entity unless specific
- * written permission is obtained from UCAR/Unidata. The user also
- * understands that UCAR/Unidata is not obligated to provide the user with
- * any support, consulting, training or assistance of any kind with regard
- * to the use, operation and performance of this software nor to provide
- * the user with any updates, revisions, new versions or "bug fixes."
- * 
- * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "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 UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
- * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* "$Id: nc3dispatch.h,v 2.8 2010/05/26 18:11:08 dmh Exp $" */
-
-#ifndef _NC3DISPATCH_H
-#define _NC3DISPATCH_H
-
-#include <stddef.h> /* size_t, ptrdiff_t */
-#include "netcdf.h"
-#include "ncdispatch.h"
-
-
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/*
- * The Interface
- */
-
-/* WARNING: this signature differs from external nc_create API*/
-EXTERNL int
-NC3_create(const char *path, int cmode,
-           size_t initialsz, int basepe, size_t *chunksizehintp,
-	   int useparallel, void* mpidata,
-           struct NC_Dispatch*, NC* ncp);
-
-/* WARNING: this signature differs from external nc_open API*/
-EXTERNL int
-NC3_open(const char *path, int mode,
-         int basepe, size_t *chunksizehintp,
-         int use_parallel, void* mpidata,
-         NC_Dispatch*, NC* ncp);
-
-EXTERNL int
-NC3_new_nc(NC**);
-
-EXTERNL int
-NC3_redef(int ncid);
-
-EXTERNL int
-NC3__enddef(int ncid, size_t h_minfree, size_t v_align,
-	size_t v_minfree, size_t r_align);
-
-EXTERNL int
-NC3_sync(int ncid);
-
-EXTERNL int
-NC3_abort(int ncid);
-
-EXTERNL int
-NC3_close(int ncid);
-
-EXTERNL int
-NC3_set_fill(int ncid, int fillmode, int *old_modep);
-
-EXTERNL int
-NC3_set_base_pe(int ncid, int pe);
-
-EXTERNL int
-NC3_inq_base_pe(int ncid, int *pe);
-
-EXTERNL int
-NC3_inq_format(int ncid, int *formatp);
-
-EXTERNL int
-NC3_inq_format_extended(int ncid, int *formatp, int *modep);
-
-EXTERNL int
-NC3_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp);
-
-EXTERNL int
-NC3_inq_type(int, nc_type, char *, size_t *);
-
-/* Begin _dim */
-
-EXTERNL int
-NC3_def_dim(int ncid, const char *name, size_t len, int *idp);
-
-EXTERNL int
-NC3_inq_dimid(int ncid, const char *name, int *idp);
-
-EXTERNL int
-NC3_inq_dim(int ncid, int dimid, char *name, size_t *lenp);
-
-EXTERNL int
-NC3_inq_unlimdim(int ncid, int *unlimdimidp);
-
-EXTERNL int
-NC3_rename_dim(int ncid, int dimid, const char *name);
-
-/* End _dim */
-/* Begin _att */
-
-EXTERNL int
-NC3_inq_att(int ncid, int varid, const char *name,
-	 nc_type *xtypep, size_t *lenp);
-
-EXTERNL int 
-NC3_inq_attid(int ncid, int varid, const char *name, int *idp);
-
-EXTERNL int
-NC3_inq_attname(int ncid, int varid, int attnum, char *name);
-
-EXTERNL int
-NC3_rename_att(int ncid, int varid, const char *name, const char *newname);
-
-EXTERNL int
-NC3_del_att(int ncid, int varid, const char*);
-
-/* End _att */
-/* Begin {put,get}_att */
-
-EXTERNL int
-NC3_get_att(int ncid, int varid, const char *name, void *value, nc_type);
-
-EXTERNL int
-NC3_put_att(int ncid, int varid, const char *name, nc_type datatype,
-	   size_t len, const void *value, nc_type);
-
-/* End {put,get}_att */
-/* Begin _var */
-
-EXTERNL int
-NC3_def_var(int ncid, const char *name,
-	 nc_type xtype, int ndims, const int *dimidsp, int *varidp);
-
-EXTERNL int
-NC3_inq_var(int ncid, int varid, char *name,
-	 nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp);
-
-EXTERNL int
-NC3_inq_varid(int ncid, const char *name, int *varidp);
-
-EXTERNL int
-NC3_rename_var(int ncid, int varid, const char *name);
-
-
-EXTERNL int
-NC3_put_vara(int ncid, int varid,
-   	     const size_t *start, const size_t *count,
-             const void *value, nc_type);
-
-EXTERNL int
-NC3_get_vara(int ncid, int varid,
-	     const size_t *start, const size_t *count,
-             void *value, nc_type);
-
-/* End _var */
-
-extern int NC3_initialize();
-extern int NC3_finalize();
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif /*_NC3DISPATCH_H*/
diff --git a/libsrc/nc3internal.c b/libsrc/nc3internal.c
index 13e83ce..3363828 100644
--- a/libsrc/nc3internal.c
+++ b/libsrc/nc3internal.c
@@ -3,7 +3,10 @@
  *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 
+#if HAVE_CONFIG_H
 #include <config.h>
+#endif
+
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
@@ -351,9 +354,9 @@ read_numrecs(NC3_INFO *ncp)
 		return status;
 
 	if (fIsSet(ncp->flags, NC_64BIT_DATA)) {
-	    long long tmp=0;
-	    status = ncx_get_int64(&xp, &tmp);
-	    new_nrecs = tmp;
+	    unsigned long long tmp=0;
+	    status = ncx_get_uint64(&xp, &tmp);
+	    new_nrecs = (size_t)tmp;
         } else
 	    status = ncx_get_size_t(&xp, &new_nrecs);
 
@@ -394,7 +397,7 @@ write_numrecs(NC3_INFO *ncp)
 	{
 		const size_t nrecs = NC_get_numrecs(ncp);
 		if (fIsSet(ncp->flags, NC_64BIT_DATA))
-		    status = ncx_put_int64(&xp, nrecs);
+		    status = ncx_put_uint64(&xp, (unsigned long long)nrecs);
 		else
  		    status = ncx_put_size_t(&xp, &nrecs);
 	}
@@ -680,7 +683,7 @@ move_vars_r(NC3_INFO *gnu, NC3_INFO *old)
  * Given a valid ncp, return NC_EVARSIZE if any variable has a bad len
  * (product of non-rec dim sizes too large), else return NC_NOERR.
  */
-static int
+int
 NC_check_vlens(NC3_INFO *ncp)
 {
     NC_var **vpp;
@@ -1724,3 +1727,95 @@ nc_delete(const char * path)
 {
         return nc_delete_mp(path, 0);
 }
+
+/*----< NC3_inq_default_fill_value() >---------------------------------------*/
+/* copy the default fill value to the memory space pointed by fillp */
+int
+NC3_inq_default_fill_value(int xtype, void *fillp)
+{
+    if (fillp == NULL) return NC_NOERR;
+
+    switch(xtype) {
+        case NC_CHAR   :               *(char*)fillp = NC_FILL_CHAR;   break;
+        case NC_BYTE   :        *(signed char*)fillp = NC_FILL_BYTE;   break;
+        case NC_SHORT  :              *(short*)fillp = NC_FILL_SHORT;  break;
+        case NC_INT    :                *(int*)fillp = NC_FILL_INT;    break;
+        case NC_FLOAT  :              *(float*)fillp = NC_FILL_FLOAT;  break;
+        case NC_DOUBLE :             *(double*)fillp = NC_FILL_DOUBLE; break;
+        case NC_UBYTE  :      *(unsigned char*)fillp = NC_FILL_UBYTE;  break;
+        case NC_USHORT :     *(unsigned short*)fillp = NC_FILL_USHORT; break;
+        case NC_UINT   :       *(unsigned int*)fillp = NC_FILL_UINT;   break;
+        case NC_INT64  :          *(long long*)fillp = NC_FILL_INT64;  break;
+        case NC_UINT64 : *(unsigned long long*)fillp = NC_FILL_UINT64; break;
+        default : return NC_EBADTYPE;
+    }
+    return NC_NOERR;
+}
+
+
+/*----< NC3_inq_var_fill() >-------------------------------------------------*/
+/* inquire the fill value of a variable */
+int
+NC3_inq_var_fill(const NC_var *varp, void *fill_value)
+{
+    NC_attr **attrpp = NULL;
+
+    if (fill_value == NULL) return NC_EINVAL;
+
+    /*
+     * find fill value
+     */
+    attrpp = NC_findattr(&varp->attrs, _FillValue);
+    if ( attrpp != NULL ) {
+        /* User defined fill value */
+        if ( (*attrpp)->type != varp->type || (*attrpp)->nelems != 1 )
+            return NC_EBADTYPE;
+
+        const void *xp = (*attrpp)->xvalue;
+        /* value stored in xvalue is in external representation, may need byte-swap */
+        switch(varp->type) {
+            case NC_CHAR:   return ncx_getn_text               (&xp, 1,               (char*)fill_value);
+            case NC_BYTE:   return ncx_getn_schar_schar        (&xp, 1,        (signed char*)fill_value);
+            case NC_UBYTE:  return ncx_getn_uchar_uchar        (&xp, 1,      (unsigned char*)fill_value);
+            case NC_SHORT:  return ncx_getn_short_short        (&xp, 1,              (short*)fill_value);
+            case NC_USHORT: return ncx_getn_ushort_ushort      (&xp, 1,     (unsigned short*)fill_value);
+            case NC_INT:    return ncx_getn_int_int            (&xp, 1,                (int*)fill_value);
+            case NC_UINT:   return ncx_getn_uint_uint          (&xp, 1,       (unsigned int*)fill_value);
+            case NC_FLOAT:  return ncx_getn_float_float        (&xp, 1,              (float*)fill_value);
+            case NC_DOUBLE: return ncx_getn_double_double      (&xp, 1,             (double*)fill_value);
+            case NC_INT64:  return ncx_getn_longlong_longlong  (&xp, 1,          (long long*)fill_value);
+            case NC_UINT64: return ncx_getn_ulonglong_ulonglong(&xp, 1, (unsigned long long*)fill_value);
+            default: return NC_EBADTYPE;
+        }
+    }
+    else {
+        /* use the default */
+        switch(varp->type){
+            case NC_CHAR:                *(char *)fill_value = NC_FILL_CHAR;
+                 break;
+            case NC_BYTE:          *(signed char *)fill_value = NC_FILL_BYTE;
+                 break;
+            case NC_SHORT:               *(short *)fill_value = NC_FILL_SHORT;
+                 break;
+            case NC_INT:                   *(int *)fill_value = NC_FILL_INT;
+                 break;
+            case NC_UBYTE:       *(unsigned char *)fill_value = NC_FILL_UBYTE;
+                 break;
+            case NC_USHORT:     *(unsigned short *)fill_value = NC_FILL_USHORT;
+                 break;
+            case NC_UINT:         *(unsigned int *)fill_value = NC_FILL_UINT;
+                 break;
+            case NC_INT64:           *(long long *)fill_value = NC_FILL_INT64;
+                 break;
+            case NC_UINT64: *(unsigned long long *)fill_value = NC_FILL_UINT64;
+                 break;
+            case NC_FLOAT:               *(float *)fill_value = NC_FILL_FLOAT;
+                 break;
+            case NC_DOUBLE:             *(double *)fill_value = NC_FILL_DOUBLE;
+                 break;
+            default:
+                 return NC_EINVAL;
+        }
+    }
+    return NC_NOERR;
+}
diff --git a/libsrc/ncio.c b/libsrc/ncio.c
index f46e28f..fb77569 100644
--- a/libsrc/ncio.c
+++ b/libsrc/ncio.c
@@ -3,7 +3,10 @@
  *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 
+#if HAVE_CONFIG_H
 #include <config.h>
+#endif
+
 #include <stdlib.h>
 
 #include "netcdf.h"
@@ -94,44 +97,44 @@ ncio_open(const char *path, int ioflags,
 /* wrapper functions for the ncio dispatch table */
 
 int
-ncio_rel(ncio *const nciop, off_t offset, int rflags)
+ncio_rel(ncio* const nciop, off_t offset, int rflags)
 {
     return nciop->rel(nciop,offset,rflags);
 }
 
 int
-ncio_get(ncio *const nciop, off_t offset, size_t extent,
+ncio_get(ncio* const nciop, off_t offset, size_t extent,
 			int rflags, void **const vpp)
 {
     return nciop->get(nciop,offset,extent,rflags,vpp);
 }
 
 int
-ncio_move(ncio *const nciop, off_t to, off_t from, size_t nbytes, int rflags)
+ncio_move(ncio* const nciop, off_t to, off_t from, size_t nbytes, int rflags)
 {
     return nciop->move(nciop,to,from,nbytes,rflags);
 }
 
 int
-ncio_sync(ncio *const nciop)
+ncio_sync(ncio* const nciop)
 {
     return nciop->sync(nciop);
 }
 
 int
-ncio_filesize(ncio *nciop, off_t *filesizep)
+ncio_filesize(ncio* const nciop, off_t *filesizep)
 {
     return nciop->filesize(nciop,filesizep);
 }
 
 int
-ncio_pad_length(ncio* nciop, off_t length)
+ncio_pad_length(ncio* const nciop, off_t length)
 {
     return nciop->pad_length(nciop,length);
 }
 
 int
-ncio_close(ncio *nciop, int doUnlink)
+ncio_close(ncio* const nciop, int doUnlink)
 {
     /* close and release all resources associated
        with nciop, including nciop
diff --git a/libsrc/ncx.c b/libsrc/ncx.c
index 20902a1..a30fe4f 100644
--- a/libsrc/ncx.c
+++ b/libsrc/ncx.c
@@ -1,39 +1,69 @@
+#line 6 "ncx.m4"
 /* Do not edit this file. It is produced from the corresponding .m4 source */
+#line 8
 /*
- *	Copyright 1996, University Corporation for Atmospheric Research
- *	See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *
- * 	This file contains some routines derived from code
- *	which is copyrighted by Sun Microsystems, Inc.
- *	The "#ifdef vax" versions of
- *		 ncx_put_float_float()
- *		 ncx_get_float_float()
- *		 ncx_put_double_double()
- *		 ncx_get_double_double()
- *		 ncx_putn_float_float()
- *		 ncx_getn_float_float()
- *		 ncx_putn_double_double()
- *		 ncx_getn_double_double()
- * 	are derived from xdr_float() and xdr_double() routines
- *	in the freely available, copyrighted Sun RPCSRC 3.9
- *	distribution, xdr_float.c.
- * 	Our "value added" is that these are always memory to memory,
- *	they handle IEEE subnormals properly, and their "n" versions
- *	operate speedily on arrays.
+ *  Copyright (C) 2014, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
  */
-/* $Id: ncx.m4 2795 2014-10-27 23:12:51Z wkliao $ */
+/* $Id: ncx.m4 2601 2016-11-07 04:54:42Z wkliao $ */
 
-/*
- * An external data representation interface.
- */
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#endif
 
-#pragma GCC diagnostic ignored "-Wdeprecated"
+#line 22
 
-#include "ncx.h"
-#include "nc3dispatch.h"
+
+
+#line 31
+
+#line 38
+
+#line 38
+#if HAVE_CONFIG_H
+#line 38
+#include <config.h>
+#line 38
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 
+#line 50
+
+#line 50
+#pragma GCC diagnostic ignored "-Wdeprecated"
+#line 50
+#include "ncx.h"
+#line 50
+#include "nc3dispatch.h"
+
+#line 69
+
+
+
+
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h> /* uint16_t, uint32_t, uint64_t */
+#elif defined(HAVE_STDINT_H)
+#include <stdint.h>   /* uint16_t, uint32_t, uint64_t */
+#endif
+
+#line 97
+
+#line 115
+
+/*
+ * The only error code returned from subroutines in this file is NC_ERANGE,
+ * if errors are detected.
+ */
+
+/*
+ * An external data representation interface.
+ */
+
 /* alias poorly named limits.h macros */
 #define  SHORT_MAX  SHRT_MAX
 #define  SHORT_MIN  SHRT_MIN
@@ -81,14 +111,66 @@
 #define Min(a,b) ((a) < (b) ? (a) : (b))
 #define Max(a,b) ((a) > (b) ? (a) : (b))
 
+#ifndef SIZEOF_UCHAR
+#ifdef  SIZEOF_UNSIGNED_CHAR
+#define SIZEOF_UCHAR SIZEOF_UNSIGNED_CHAR
+#else
+#error "unknown SIZEOF_UCHAR"
+#endif
+#endif
+
 #ifndef SIZEOF_USHORT
+#ifdef  SIZEOF_UNSIGNED_SHORT_INT
 #define SIZEOF_USHORT SIZEOF_UNSIGNED_SHORT_INT
+#elif defined(SIZEOF_UNSIGNED_SHORT)
+#define SIZEOF_USHORT SIZEOF_UNSIGNED_SHORT
+#else
+#error "unknown SIZEOF_USHORT"
+#endif
 #endif
+
 #ifndef SIZEOF_UINT
+#ifdef  SIZEOF_UNSIGNED_INT
 #define SIZEOF_UINT SIZEOF_UNSIGNED_INT
+#else
+#error "unknown SIZEOF_UINT"
+#endif
+#endif
+
+#ifndef SIZEOF_LONGLONG
+#ifdef  SIZEOF_LONG_LONG
+#define SIZEOF_LONGLONG SIZEOF_LONG_LONG
+#else
+#error "unknown SIZEOF_LONGLONG"
+#endif
+#endif
+
+#ifndef SIZEOF_INT64
+#ifdef  SIZEOF_LONG_LONG
+#define SIZEOF_INT64 SIZEOF_LONG_LONG
+#elif defined(SIZEOF_LONGLONG)
+#define SIZEOF_INT64 SIZEOF_LONGLONG
+#else
+#error "unknown SIZEOF_INT64"
+#endif
+#endif
+
+#ifndef SIZEOF_ULONGLONG
+#ifdef  SIZEOF_UNSIGNED_LONG_LONG
+#define SIZEOF_ULONGLONG SIZEOF_UNSIGNED_LONG_LONG
+#else
+#error "unknown SIZEOF_ULONGLONG"
+#endif
+#endif
+
+#ifndef SIZEOF_UINT64
+#ifdef  SIZEOF_UNSIGNED_LONG_LONG
+#define SIZEOF_UINT64 SIZEOF_UNSIGNED_LONG_LONG
+#elif defined(SIZEOF_ULONGLONG)
+#define SIZEOF_UINT64 SIZEOF_ULONGLONG
+#else
+#error "unknown SIZEOF_UINT64"
 #endif
-#ifndef SIZEOF_ULONG_LONG
-#define SIZEOF_ULONG_LONG SIZEOF_UNSIGNED_LONG_LONG
 #endif
 
 /*
@@ -102,7 +184,7 @@
 # define X_FLOAT_MIN (-X_FLOAT_MAX)
 #endif
 
-#if _SX /* NEC SUPER UX */
+#if defined(_SX) && _SX != 0 /* NEC SUPER UX */
 #define LOOPCNT 256    /* must be no longer than hardware vector length */
 #if _INT64
 #undef  INT_MAX /* workaround cpp bug */
@@ -129,34 +211,52 @@ static const char nada[X_ALIGN] = {0, 0, 0, 0};
 #ifndef WORDS_BIGENDIAN
 /* LITTLE_ENDIAN: DEC and intel */
 /*
- * Routines to convert to BIGENDIAN.
- * Optimize the swapn?b() and swap?b() routines aggressivly.
+ * Routines to convert to BIG ENDIAN.
+ * Optimize the swapn?b() and swap?b() routines aggressively.
  */
 
 #define SWAP2(a) ( (((a) & 0xff) << 8) | \
-		(((a) >> 8) & 0xff) )
+                   (((a) >> 8) & 0xff) )
 
 #define SWAP4(a) ( ((a) << 24) | \
-		(((a) <<  8) & 0x00ff0000) | \
-		(((a) >>  8) & 0x0000ff00) | \
-		(((a) >> 24) & 0x000000ff) )
+                  (((a) <<  8) & 0x00ff0000) | \
+                  (((a) >>  8) & 0x0000ff00) | \
+                  (((a) >> 24) & 0x000000ff) )
 
+#define SWAP8(a) ( (((a) & 0x00000000000000FFULL) << 56) | \
+                   (((a) & 0x000000000000FF00ULL) << 40) | \
+                   (((a) & 0x0000000000FF0000ULL) << 24) | \
+                   (((a) & 0x00000000FF000000ULL) <<  8) | \
+                   (((a) & 0x000000FF00000000ULL) >>  8) | \
+                   (((a) & 0x0000FF0000000000ULL) >> 24) | \
+                   (((a) & 0x00FF000000000000ULL) >> 40) | \
+                   (((a) & 0xFF00000000000000ULL) >> 56) )
 
-static void
+
+inline static void
 swapn2b(void *dst, const void *src, size_t nn)
 {
+    /* it is OK if dst == src */
+    int i;
+    uint16_t *op = (uint16_t*) dst;
+    uint16_t *ip = (uint16_t*) src;
+    for (i=0; i<nn; i++) {
+        op[i] = ip[i];
+        op[i] = (uint16_t)SWAP2(op[i]);
+    }
+#if 0
 	char *op = dst;
 	const char *ip = src;
 
 /* unroll the following to reduce loop overhead
  *
- *	while(nn-- != 0)
+ *	while (nn-- > 0)
  *	{
  *		*op++ = *(++ip);
  *		*op++ = *(ip++ -1);
  *	}
  */
-	while(nn > 3)
+	while (nn > 3)
 	{
 		*op++ = *(++ip);
 		*op++ = *(ip++ -1);
@@ -168,41 +268,79 @@ swapn2b(void *dst, const void *src, size_t nn)
 		*op++ = *(ip++ -1);
 		nn -= 4;
 	}
-	while(nn-- > 0)
+	while (nn-- > 0)
 	{
 		*op++ = *(++ip);
 		*op++ = *(ip++ -1);
 	}
+#endif
 }
 
 # ifndef vax
-void
+inline static void
 swap4b(void *dst, const void *src)
 {
-    unsigned int *op = dst;
-    const char *ip = src;
-    unsigned int tempIn;
-    unsigned int tempOut;
+    /* copy over, make the below swap in-place */
+    uint32_t tmp = *(uint32_t*)src;
+    tmp = SWAP4(tmp);
+    memcpy(dst, &tmp, 4);
+
+    /* Codes below will cause "break strict-aliasing rules" in gcc
+    uint32_t *op = (uint32_t*)dst;
+    *op = *(uint32_t*)src;
+    *op = SWAP4(*op);
+    */
+
+    /* Below are copied from netCDF-4.
+     * See https://bugtracking.unidata.ucar.edu/browse/NCF-338
+     * Quote "One issue we are wrestling with is how compilers optimize this
+     * code.  For some reason, we are actually needing to add an artificial
+     * move to a 4 byte space to get it to work.  I think what is happening is
+     * that the optimizer is bit shifting within a double, which is incorrect.
+     * The following code actually does work correctly.
+     *  This is in Linux land, gcc.
+     *
+     * However, the above in-place byte-swap does not appear affected by this.
+     */
+#if 0
+    uint32_t *ip = (uint32_t*)src;
+    uint32_t tempOut;  /* cannot use pointer when gcc O2 optimizer is used */
+    tempOut = SWAP4(*ip);
+
+    *(float *)dst = *(float *)(&tempOut);
+#endif
 
-    tempIn = *(unsigned int *)(ip+0);
-    tempOut =
-    ( tempIn << 24) |
-    ((tempIn & 0x0000ff00) << 8) |
-    ((tempIn & 0x00ff0000) >> 8) |
-    ( tempIn >> 24);
+    /* OLD implementation that results in four load and four store CPU
+       instructions
+    char *op = dst;
+    const char *ip = src;
+    op[0] = ip[3];
+    op[1] = ip[2];
+    op[2] = ip[1];
+    op[3] = ip[0];
+    */
 
-    *(float *)op = *(float *)(&tempOut);
 }
 # endif /* !vax */
 
-static void
+inline static void
 swapn4b(void *dst, const void *src, size_t nn)
 {
+    int i;
+    uint32_t *op = (uint32_t*) dst;
+    uint32_t *ip = (uint32_t*) src;
+    for (i=0; i<nn; i++) {
+        /* copy over, make the below swap in-place */
+        op[i] = ip[i];
+        op[i] = SWAP4(op[i]);
+    }
+
+#if 0
 	char *op = dst;
 	const char *ip = src;
 
 /* unroll the following to reduce loop overhead
- *	while(nn-- != 0)
+ *	while (nn-- > 0)
  *	{
  *		op[0] = ip[3];
  *		op[1] = ip[2];
@@ -212,7 +350,7 @@ swapn4b(void *dst, const void *src, size_t nn)
  *		ip += 4;
  *	}
  */
-	while(nn > 3)
+	while (nn > 3)
 	{
 		op[0] = ip[3];
 		op[1] = ip[2];
@@ -234,7 +372,7 @@ swapn4b(void *dst, const void *src, size_t nn)
 		ip += 16;
 		nn -= 4;
 	}
-	while(nn-- > 0)
+	while (nn-- > 0)
 	{
 		op[0] = ip[3];
 		op[1] = ip[2];
@@ -243,12 +381,29 @@ swapn4b(void *dst, const void *src, size_t nn)
 		op += 4;
 		ip += 4;
 	}
+#endif
 }
 
 # ifndef vax
-static void
+inline static void
 swap8b(void *dst, const void *src)
 {
+#ifdef FLOAT_WORDS_BIGENDIAN
+    /* copy over, make the below swap in-place */
+    *(uint64_t*)dst = *(uint64_t*)src;
+
+    uint32_t *op = (uint32_t*)dst;
+    *op = SWAP4(*op);
+    op = (uint32_t*)((char*)dst+4);
+    *op = SWAP4(*op);
+#else
+    uint64_t *op = (uint64_t*)dst;
+    /* copy over, make the below swap in-place */
+    *op = *(uint64_t*)src;
+    *op = SWAP8(*op);
+#endif
+
+#if 0
 	char *op = dst;
 	const char *ip = src;
 #  ifndef FLOAT_WORDS_BIGENDIAN
@@ -269,19 +424,44 @@ swap8b(void *dst, const void *src)
 	op[5] = ip[6];
 	op[6] = ip[5];
 	op[7] = ip[4];
-#  endif
+#endif
+#endif
 }
 # endif /* !vax */
 
 # ifndef vax
-static void
+inline static void
 swapn8b(void *dst, const void *src, size_t nn)
 {
+#ifdef FLOAT_WORDS_BIGENDIAN
+    int i;
+    uint64_t *dst_p = (uint64_t*) dst;
+    uint64_t *src_p = (uint64_t*) src;
+    for (i=0; i<nn; i++) {
+        /* copy over, make the below swap in-place */
+        dst_p[i] = src_p[i];
+        uint32_t *op = (uint32_t*)(&dst_p[i]);
+        *op = SWAP4(*op);
+        op = (uint32_t*)((char*)op+4);
+        *op = SWAP4(*op);
+    }
+#else
+    int i;
+    uint64_t *op = (uint64_t*) dst;
+    uint64_t *ip = (uint64_t*) src;
+    for (i=0; i<nn; i++) {
+        /* copy over, make the below swap in-place */
+        op[i] = ip[i];
+        op[i] = SWAP8(op[i]);
+    }
+#endif
+
+#if 0
 	char *op = dst;
 	const char *ip = src;
 
 /* unroll the following to reduce loop overhead
- *	while(nn-- != 0)
+ *	while (nn-- > 0)
  *	{
  *		op[0] = ip[7];
  *		op[1] = ip[6];
@@ -296,7 +476,7 @@ swapn8b(void *dst, const void *src, size_t nn)
  *	}
  */
 #  ifndef FLOAT_WORDS_BIGENDIAN
-	while(nn > 1)
+	while (nn > 1)
 	{
 		op[0] = ip[7];
 		op[1] = ip[6];
@@ -318,7 +498,7 @@ swapn8b(void *dst, const void *src, size_t nn)
 		ip += 16;
 		nn -= 2;
 	}
-	while(nn-- != 0)
+	while (nn-- > 0)
 	{
 		op[0] = ip[7];
 		op[1] = ip[6];
@@ -332,7 +512,7 @@ swapn8b(void *dst, const void *src, size_t nn)
 		ip += 8;
 	}
 #  else
-	while(nn-- != 0)
+	while (nn-- > 0)
 	{
 		op[0] = ip[3];
 		op[1] = ip[2];
@@ -345,30 +525,33 @@ swapn8b(void *dst, const void *src, size_t nn)
 		op += 8;
 		ip += 8;
 	}
-#  endif
+#endif
+#endif
 }
 # endif /* !vax */
 
 #endif /* LITTLE_ENDIAN */
 
+#line 616
 
+#line 620
 
+#line 630
 
-
-
-
-
-
-
+#line 643
 
 
 /*
  * Primitive numeric conversion functions.
  */
 
+#line 671
 
+#line 715
 
+#line 742
 
+#line 782
 
 /* x_schar */
 /* x_uchar */
@@ -376,7 +559,7 @@ swapn8b(void *dst, const void *src, size_t nn)
 /* We don't implement any x_schar and x_uchar primitives. */
 
 
-/* x_short -------------------------------------------------------------------*/
+/* external NC_SHORT --------------------------------------------------------*/
 
 #if SHORT_MAX == X_SHORT_MAX
 typedef short ix_short;
@@ -392,7 +575,7 @@ typedef long ix_short;
 #define IX_SHORT_MAX LONG_MAX
 #elif LLONG_MAX >= X_SHORT_MAX
 typedef long long ix_short;
-#define SIZEOF_IX_SHORT SIZEOF_LONG_LONG
+#define SIZEOF_IX_SHORT SIZEOF_LONGLONG
 #define IX_SHORT_MAX LLONG_MAX
 #else
 #error "ix_short implementation"
@@ -402,179 +585,463 @@ static void
 get_ix_short(const void *xp, ix_short *ip)
 {
 	const uchar *cp = (const uchar *) xp;
-	*ip = *cp++ << 8;
+	*ip = (ix_short)(*cp++ << 8);
 #if SIZEOF_IX_SHORT > X_SIZEOF_SHORT
-	if(*ip & 0x8000)
+	if (*ip & 0x8000)
 	{
 		/* extern is negative */
 		*ip |= (~(0xffff)); /* N.B. Assumes "twos complement" */
 	}
 #endif
-	*ip |= *cp;
+	*ip = (ix_short)(*ip | *cp);
 }
 
 static void
 put_ix_short(void *xp, const ix_short *ip)
 {
 	uchar *cp = (uchar *) xp;
-	*cp++ = (*ip) >> 8;
-	*cp = (*ip) & 0xff;
+	*cp++ = (uchar)((*ip) >> 8);
+	*cp   = (uchar)((*ip) & 0xff);
 }
 
 static int
+#line 834
 ncx_get_short_schar(const void *xp, schar *ip)
+#line 834
 {
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (schar) xx;
+#line 834
+    int err=NC_NOERR;
+#line 834
+    ix_short xx;
+#line 834
+    get_ix_short(xp, &xx);
+#line 834
+
+#line 834
 #if IX_SHORT_MAX > SCHAR_MAX
-	if (xx > SCHAR_MAX || xx < SCHAR_MIN) return NC_ERANGE;
+#line 834
+    if (xx > SCHAR_MAX || xx < SCHAR_MIN) {
+#line 834
+
+#line 834
+        err = NC_ERANGE;
+#line 834
+    }
+#line 834
 #endif
+#line 834
 
-	return NC_NOERR;
+#line 834
+
+#line 834
+    *ip = (schar) xx;
+#line 834
+    return err;
+#line 834
 }
+#line 834
 
 static int
+#line 835
 ncx_get_short_short(const void *xp, short *ip)
+#line 835
 {
+#line 835
+    int err=NC_NOERR;
+#line 835
 #if SIZEOF_IX_SHORT == SIZEOF_SHORT && IX_SHORT_MAX == SHORT_MAX
-	get_ix_short(xp, (ix_short *)ip);
-	return NC_NOERR;
+#line 835
+    get_ix_short(xp, (ix_short *)ip);
+#line 835
 #else
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (short) xx;
+#line 835
+    ix_short xx;
+#line 835
+    get_ix_short(xp, &xx);
+#line 835
+
+#line 835
 #if IX_SHORT_MAX > SHORT_MAX
-	if (xx > SHORT_MAX || xx < SHORT_MIN) return NC_ERANGE;
+#line 835
+    if (xx > SHORT_MAX || xx < SHORT_MIN) {
+#line 835
+
+#line 835
+        err = NC_ERANGE;
+#line 835
+    }
+#line 835
 #endif
+#line 835
 
+#line 835
+
+#line 835
+    *ip = (short) xx;
+#line 835
 #endif
-	return NC_NOERR;
+#line 835
+    return err;
+#line 835
 }
+#line 835
 
 static int
+#line 836
 ncx_get_short_int(const void *xp, int *ip)
+#line 836
 {
+#line 836
+    int err=NC_NOERR;
+#line 836
 #if SIZEOF_IX_SHORT == SIZEOF_INT && IX_SHORT_MAX == INT_MAX
-	get_ix_short(xp, (ix_short *)ip);
-	return NC_NOERR;
+#line 836
+    get_ix_short(xp, (ix_short *)ip);
+#line 836
 #else
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (int) xx;
+#line 836
+    ix_short xx;
+#line 836
+    get_ix_short(xp, &xx);
+#line 836
+
+#line 836
 #if IX_SHORT_MAX > INT_MAX
-	if (xx > INT_MAX || xx < INT_MIN) return NC_ERANGE;
+#line 836
+    if (xx > INT_MAX || xx < INT_MIN) {
+#line 836
+
+#line 836
+        err = NC_ERANGE;
+#line 836
+    }
+#line 836
 #endif
+#line 836
 
+#line 836
+
+#line 836
+    *ip = (int) xx;
+#line 836
 #endif
-	return NC_NOERR;
+#line 836
+    return err;
+#line 836
+}
+#line 836
+
+static int
+#line 837
+ncx_get_short_long(const void *xp, long *ip)
+#line 837
+{
+#line 837
+    int err=NC_NOERR;
+#line 837
+#if SIZEOF_IX_SHORT == SIZEOF_LONG && IX_SHORT_MAX == LONG_MAX
+#line 837
+    get_ix_short(xp, (ix_short *)ip);
+#line 837
+#else
+#line 837
+    ix_short xx;
+#line 837
+    get_ix_short(xp, &xx);
+#line 837
+
+#line 837
+#if IX_SHORT_MAX > LONG_MAX
+#line 837
+    if (xx > LONG_MAX || xx < LONG_MIN) {
+#line 837
+
+#line 837
+        err = NC_ERANGE;
+#line 837
+    }
+#line 837
+#endif
+#line 837
+
+#line 837
+
+#line 837
+    *ip = (long) xx;
+#line 837
+#endif
+#line 837
+    return err;
+#line 837
 }
+#line 837
 
 static int
+#line 838
 ncx_get_short_longlong(const void *xp, longlong *ip)
+#line 838
 {
+#line 838
+    int err=NC_NOERR;
+#line 838
 #if SIZEOF_IX_SHORT == SIZEOF_LONGLONG && IX_SHORT_MAX == LONGLONG_MAX
-	get_ix_short(xp, (ix_short *)ip);
-	return NC_NOERR;
+#line 838
+    get_ix_short(xp, (ix_short *)ip);
+#line 838
 #else
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (longlong) xx;
+#line 838
+    ix_short xx;
+#line 838
+    get_ix_short(xp, &xx);
+#line 838
+
+#line 838
 #if IX_SHORT_MAX > LONGLONG_MAX
-	if (xx > LONGLONG_MAX || xx < LONGLONG_MIN) return NC_ERANGE;
+#line 838
+    if (xx > LONGLONG_MAX || xx < LONGLONG_MIN) {
+#line 838
+
+#line 838
+        err = NC_ERANGE;
+#line 838
+    }
+#line 838
 #endif
+#line 838
+
+#line 838
 
+#line 838
+    *ip = (longlong) xx;
+#line 838
 #endif
-	return NC_NOERR;
+#line 838
+    return err;
+#line 838
 }
+#line 838
 
 static int
+#line 839
 ncx_get_short_ushort(const void *xp, ushort *ip)
+#line 839
 {
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (ushort) xx;
+#line 839
+    int err=NC_NOERR;
+#line 839
+    ix_short xx;
+#line 839
+    get_ix_short(xp, &xx);
+#line 839
+
+#line 839
 #if IX_SHORT_MAX > USHORT_MAX
-	if (xx > USHORT_MAX) return NC_ERANGE;
+#line 839
+    if (xx > USHORT_MAX) {
+#line 839
+
+#line 839
+        err = NC_ERANGE;
+#line 839
+    }
+#line 839
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 839
+
+#line 839
+    if (xx < 0) {
+#line 839
+
+#line 839
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 839
+    }
+#line 839
+    *ip = (ushort) xx;
+#line 839
+    return err;
+#line 839
 }
+#line 839
 
 static int
+#line 840
 ncx_get_short_uchar(const void *xp, uchar *ip)
+#line 840
 {
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (uchar) xx;
+#line 840
+    int err=NC_NOERR;
+#line 840
+    ix_short xx;
+#line 840
+    get_ix_short(xp, &xx);
+#line 840
+
+#line 840
 #if IX_SHORT_MAX > UCHAR_MAX
-	if (xx > UCHAR_MAX) return NC_ERANGE;
+#line 840
+    if (xx > UCHAR_MAX) {
+#line 840
+
+#line 840
+        err = NC_ERANGE;
+#line 840
+    }
+#line 840
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 840
+
+#line 840
+    if (xx < 0) {
+#line 840
+
+#line 840
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 840
+    }
+#line 840
+    *ip = (uchar) xx;
+#line 840
+    return err;
+#line 840
 }
+#line 840
 
 static int
+#line 841
 ncx_get_short_uint(const void *xp, uint *ip)
+#line 841
 {
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (uint) xx;
+#line 841
+    int err=NC_NOERR;
+#line 841
+    ix_short xx;
+#line 841
+    get_ix_short(xp, &xx);
+#line 841
+
+#line 841
 #if IX_SHORT_MAX > UINT_MAX
-	if (xx > UINT_MAX) return NC_ERANGE;
+#line 841
+    if (xx > UINT_MAX) {
+#line 841
+
+#line 841
+        err = NC_ERANGE;
+#line 841
+    }
+#line 841
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 841
+
+#line 841
+    if (xx < 0) {
+#line 841
+
+#line 841
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 841
+    }
+#line 841
+    *ip = (uint) xx;
+#line 841
+    return err;
+#line 841
 }
+#line 841
 
 static int
+#line 842
 ncx_get_short_ulonglong(const void *xp, ulonglong *ip)
+#line 842
 {
-	ix_short xx;
-	get_ix_short(xp, &xx);
-	*ip = (ulonglong) xx;
+#line 842
+    int err=NC_NOERR;
+#line 842
+    ix_short xx;
+#line 842
+    get_ix_short(xp, &xx);
+#line 842
+
+#line 842
 #if IX_SHORT_MAX > ULONGLONG_MAX
-	if (xx > ULONGLONG_MAX) return NC_ERANGE;
+#line 842
+    if (xx > ULONGLONG_MAX) {
+#line 842
+
+#line 842
+        err = NC_ERANGE;
+#line 842
+    }
+#line 842
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 842
+
+#line 842
+    if (xx < 0) {
+#line 842
+
+#line 842
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 842
+    }
+#line 842
+    *ip = (ulonglong) xx;
+#line 842
+    return err;
+#line 842
 }
+#line 842
 
 static int
+#line 843
 ncx_get_short_float(const void *xp, float *ip)
+#line 843
 {
+#line 843
 	ix_short xx;
+#line 843
 	get_ix_short(xp, &xx);
-	*ip = (float) xx;
-
+#line 843
+	*ip = (float)xx;
+#line 843
 	return NC_NOERR;
+#line 843
 }
+#line 843
 
 static int
+#line 844
 ncx_get_short_double(const void *xp, double *ip)
+#line 844
 {
+#line 844
 	ix_short xx;
+#line 844
 	get_ix_short(xp, &xx);
-	*ip = (double) xx;
-
+#line 844
+	*ip = (double)xx;
+#line 844
 	return NC_NOERR;
+#line 844
 }
+#line 844
 
 
 static int
-ncx_put_short_schar(void *xp, const schar *ip)
+ncx_put_short_schar(void *xp, const schar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
-	if(*ip & 0x80)
+	if (*ip & 0x80)
 		*cp++ = 0xff;
 	else
 		*cp++ = 0;
-	*cp = (uchar)(signed)*ip;
+	*cp = (uchar)*ip;
 	return NC_NOERR;
 }
 
 static int
-ncx_put_short_uchar(void *xp, const uchar *ip)
+ncx_put_short_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0;
@@ -583,112 +1050,346 @@ ncx_put_short_uchar(void *xp, const uchar *ip)
 }
 
 static int
-ncx_put_short_short(void *xp, const short *ip)
+#line 867
+ncx_put_short_short(void *xp, const short *ip, void *fillp)
+#line 867
 {
+#line 867
+    int err=NC_NOERR;
+#line 867
 #if SIZEOF_IX_SHORT == SIZEOF_SHORT && IX_SHORT_MAX == SHORT_MAX
-	put_ix_short(xp, (const ix_short *)ip);
-	return NC_NOERR;
+#line 867
+    put_ix_short(xp, (const ix_short *)ip);
+#line 867
 #else
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
-#if IX_SHORT_MAX < SHORT_MAX
-	if (*ip > IX_SHORT_MAX || *ip < X_SHORT_MIN) return NC_ERANGE;
-#endif
+#line 867
+    ix_short xx = NC_FILL_SHORT;
+#line 867
 
-#endif
-	return NC_NOERR;
-}
+#line 867
+#if IX_SHORT_MAX < SHORT_MAX
+#line 867
+    if (*ip > IX_SHORT_MAX || *ip < X_SHORT_MIN) {
+#line 867
+        
+#line 867
+        err = NC_ERANGE;
+#line 867
+    } 
+#line 867
+#endif
+#line 867
+        xx = (ix_short)*ip;
+#line 867
+
+#line 867
+    put_ix_short(xp, &xx);
+#line 867
+#endif
+#line 867
+    return err;
+#line 867
+}
+#line 867
 
 static int
-ncx_put_short_int(void *xp, const int *ip)
+#line 868
+ncx_put_short_int(void *xp, const int *ip, void *fillp)
+#line 868
 {
+#line 868
+    int err=NC_NOERR;
+#line 868
 #if SIZEOF_IX_SHORT == SIZEOF_INT && IX_SHORT_MAX == INT_MAX
-	put_ix_short(xp, (const ix_short *)ip);
-	return NC_NOERR;
+#line 868
+    put_ix_short(xp, (const ix_short *)ip);
+#line 868
 #else
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
+#line 868
+    ix_short xx = NC_FILL_SHORT;
+#line 868
+
+#line 868
 #if IX_SHORT_MAX < INT_MAX
-	if (*ip > IX_SHORT_MAX || *ip < X_SHORT_MIN) return NC_ERANGE;
-#endif
+#line 868
+    if (*ip > IX_SHORT_MAX || *ip < X_SHORT_MIN) {
+#line 868
+        
+#line 868
+        err = NC_ERANGE;
+#line 868
+    } 
+#line 868
+#endif
+#line 868
+        xx = (ix_short)*ip;
+#line 868
+
+#line 868
+    put_ix_short(xp, &xx);
+#line 868
+#endif
+#line 868
+    return err;
+#line 868
+}
+#line 868
 
-#endif
-	return NC_NOERR;
-}
+static int
+#line 869
+ncx_put_short_long(void *xp, const long *ip, void *fillp)
+#line 869
+{
+#line 869
+    int err=NC_NOERR;
+#line 869
+#if SIZEOF_IX_SHORT == SIZEOF_LONG && IX_SHORT_MAX == LONG_MAX
+#line 869
+    put_ix_short(xp, (const ix_short *)ip);
+#line 869
+#else
+#line 869
+    ix_short xx = NC_FILL_SHORT;
+#line 869
+
+#line 869
+#if IX_SHORT_MAX < LONG_MAX
+#line 869
+    if (*ip > IX_SHORT_MAX || *ip < X_SHORT_MIN) {
+#line 869
+        
+#line 869
+        err = NC_ERANGE;
+#line 869
+    } 
+#line 869
+#endif
+#line 869
+        xx = (ix_short)*ip;
+#line 869
+
+#line 869
+    put_ix_short(xp, &xx);
+#line 869
+#endif
+#line 869
+    return err;
+#line 869
+}
+#line 869
 
 static int
-ncx_put_short_longlong(void *xp, const longlong *ip)
+#line 870
+ncx_put_short_longlong(void *xp, const longlong *ip, void *fillp)
+#line 870
 {
+#line 870
+    int err=NC_NOERR;
+#line 870
 #if SIZEOF_IX_SHORT == SIZEOF_LONGLONG && IX_SHORT_MAX == LONGLONG_MAX
-	put_ix_short(xp, (const ix_short *)ip);
-	return NC_NOERR;
+#line 870
+    put_ix_short(xp, (const ix_short *)ip);
+#line 870
 #else
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
-#if IX_SHORT_MAX < LONGLONG_MAX
-	if (*ip > IX_SHORT_MAX || *ip < X_SHORT_MIN) return NC_ERANGE;
-#endif
+#line 870
+    ix_short xx = NC_FILL_SHORT;
+#line 870
 
-#endif
-	return NC_NOERR;
-}
+#line 870
+#if IX_SHORT_MAX < LONGLONG_MAX
+#line 870
+    if (*ip > IX_SHORT_MAX || *ip < X_SHORT_MIN) {
+#line 870
+        
+#line 870
+        err = NC_ERANGE;
+#line 870
+    } 
+#line 870
+#endif
+#line 870
+        xx = (ix_short)*ip;
+#line 870
+
+#line 870
+    put_ix_short(xp, &xx);
+#line 870
+#endif
+#line 870
+    return err;
+#line 870
+}
+#line 870
 
 static int
-ncx_put_short_ushort(void *xp, const ushort *ip)
+#line 871
+ncx_put_short_ushort(void *xp, const ushort *ip, void *fillp)
+#line 871
 {
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
-#if IX_SHORT_MAX < USHORT_MAX
-	if (*ip > IX_SHORT_MAX) return NC_ERANGE;
-#endif
+#line 871
+    int err=NC_NOERR;
+#line 871
+    ix_short xx = NC_FILL_SHORT;
+#line 871
 
-	return NC_NOERR;
-}
+#line 871
+#if IX_SHORT_MAX < USHORT_MAX
+#line 871
+    if (*ip > IX_SHORT_MAX) {
+#line 871
+        
+#line 871
+        err = NC_ERANGE;
+#line 871
+    } 
+#line 871
+#endif
+#line 871
+        xx = (ix_short)*ip;
+#line 871
+
+#line 871
+    put_ix_short(xp, &xx);
+#line 871
+    return err;
+#line 871
+}
+#line 871
 
 static int
-ncx_put_short_uint(void *xp, const uint *ip)
+#line 872
+ncx_put_short_uint(void *xp, const uint *ip, void *fillp)
+#line 872
 {
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
-#if IX_SHORT_MAX < UINT_MAX
-	if (*ip > IX_SHORT_MAX) return NC_ERANGE;
-#endif
+#line 872
+    int err=NC_NOERR;
+#line 872
+    ix_short xx = NC_FILL_SHORT;
+#line 872
 
-	return NC_NOERR;
-}
+#line 872
+#if IX_SHORT_MAX < UINT_MAX
+#line 872
+    if (*ip > IX_SHORT_MAX) {
+#line 872
+        
+#line 872
+        err = NC_ERANGE;
+#line 872
+    } 
+#line 872
+#endif
+#line 872
+        xx = (ix_short)*ip;
+#line 872
+
+#line 872
+    put_ix_short(xp, &xx);
+#line 872
+    return err;
+#line 872
+}
+#line 872
 
 static int
-ncx_put_short_ulonglong(void *xp, const ulonglong *ip)
+#line 873
+ncx_put_short_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 873
 {
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
-#if IX_SHORT_MAX < ULONGLONG_MAX
-	if (*ip > IX_SHORT_MAX) return NC_ERANGE;
-#endif
+#line 873
+    int err=NC_NOERR;
+#line 873
+    ix_short xx = NC_FILL_SHORT;
+#line 873
 
-	return NC_NOERR;
-}
+#line 873
+#if IX_SHORT_MAX < ULONGLONG_MAX
+#line 873
+    if (*ip > IX_SHORT_MAX) {
+#line 873
+        
+#line 873
+        err = NC_ERANGE;
+#line 873
+    } 
+#line 873
+#endif
+#line 873
+        xx = (ix_short)*ip;
+#line 873
+
+#line 873
+    put_ix_short(xp, &xx);
+#line 873
+    return err;
+#line 873
+}
+#line 873
 
 static int
-ncx_put_short_float(void *xp, const float *ip)
-{
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
-	if(*ip > (double)X_SHORT_MAX || *ip < (double)X_SHORT_MIN) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 874
+ncx_put_short_float(void *xp, const float *ip, void *fillp)
+#line 874
+{
+#line 874
+    int err=NC_NOERR;
+#line 874
+    ix_short xx = NC_FILL_SHORT;
+#line 874
+
+#line 874
+    if (*ip > (double)X_SHORT_MAX || *ip < (double)X_SHORT_MIN) {
+#line 874
+        
+#line 874
+        err = NC_ERANGE;
+#line 874
+    } 
+#line 874
+        xx = (ix_short)*ip;
+#line 874
+
+#line 874
+    put_ix_short(xp, &xx);
+#line 874
+    return err;
+#line 874
+}
+#line 874
 
 static int
-ncx_put_short_double(void *xp, const double *ip)
-{
-	ix_short xx = (ix_short)*ip;
-	put_ix_short(xp, &xx);
-	if(*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) return NC_ERANGE;
-	return NC_NOERR;
-}
-
-
-/* x_ushort ------------------------------------------------------------------*/
+#line 875
+ncx_put_short_double(void *xp, const double *ip, void *fillp)
+#line 875
+{
+#line 875
+    int err=NC_NOERR;
+#line 875
+    ix_short xx = NC_FILL_SHORT;
+#line 875
+
+#line 875
+    if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) {
+#line 875
+        
+#line 875
+        err = NC_ERANGE;
+#line 875
+    } 
+#line 875
+        xx = (ix_short)*ip;
+#line 875
+
+#line 875
+    put_ix_short(xp, &xx);
+#line 875
+    return err;
+#line 875
+}
+#line 875
+
+
+/* external NC_USHORT -------------------------------------------------------*/
 
 #if USHORT_MAX == X_USHORT_MAX
 typedef unsigned short ix_ushort;
@@ -704,7 +1405,7 @@ typedef unsigned long ix_ushort;
 #define IX_USHORT_MAX ULONG_MAX
 #elif ULLONG_MAX >= X_USHORT_MAX
 typedef unsigned long long ix_ushort;
-#define SIZEOF_IX_USHORT SIZEOF_ULONG_LONG
+#define SIZEOF_IX_USHORT SIZEOF_ULONGLONG
 #define IX_USHORT_MAX ULLONG_MAX
 #else
 #error "ix_ushort implementation"
@@ -714,186 +1415,447 @@ static void
 get_ix_ushort(const void *xp, ix_ushort *ip)
 {
 	const uchar *cp = (const uchar *) xp;
-	*ip = *cp++ << 8;
+	*ip = (ix_ushort)(*cp++ << 8);
 #if SIZEOF_IX_SHORT > X_SIZEOF_SHORT
-	if(*ip & 0x8000)
+	if (*ip & 0x8000)
 	{
 		/* extern is negative */
 		*ip |= (~(0xffff)); /* N.B. Assumes "twos complement" */
 	}
 #endif
-	*ip |= *cp;
+	*ip = (ix_ushort)(*ip | *cp);
 }
 
 static void
 put_ix_ushort(void *xp, const ix_ushort *ip)
 {
 	uchar *cp = (uchar *) xp;
-	*cp++ = (*ip) >> 8;
-	*cp = (*ip) & 0xff;
+	*cp++ = (uchar)((*ip) >> 8);
+	*cp   = (uchar)((*ip) & 0xff);
 }
 
 static int
+#line 922
 ncx_get_ushort_schar(const void *xp, schar *ip)
+#line 922
 {
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (schar) xx;
+#line 922
+    int err=NC_NOERR;
+#line 922
+    ix_ushort xx;
+#line 922
+    get_ix_ushort(xp, &xx);
+#line 922
+
+#line 922
 #if IX_USHORT_MAX > SCHAR_MAX
-	if (xx > SCHAR_MAX) return NC_ERANGE;
+#line 922
+    if (xx > SCHAR_MAX) {
+#line 922
+
+#line 922
+        err = NC_ERANGE;
+#line 922
+    }
+#line 922
 #endif
+#line 922
 
-	return NC_NOERR;
+#line 922
+
+#line 922
+    *ip = (schar) xx;
+#line 922
+    return err;
+#line 922
 }
+#line 922
 
 static int
+#line 923
 ncx_get_ushort_short(const void *xp, short *ip)
+#line 923
 {
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (short) xx;
+#line 923
+    int err=NC_NOERR;
+#line 923
+    ix_ushort xx;
+#line 923
+    get_ix_ushort(xp, &xx);
+#line 923
+
+#line 923
 #if IX_USHORT_MAX > SHORT_MAX
-	if (xx > SHORT_MAX) return NC_ERANGE;
+#line 923
+    if (xx > SHORT_MAX) {
+#line 923
+
+#line 923
+        err = NC_ERANGE;
+#line 923
+    }
+#line 923
 #endif
+#line 923
 
-	return NC_NOERR;
+#line 923
+
+#line 923
+    *ip = (short) xx;
+#line 923
+    return err;
+#line 923
 }
+#line 923
 
 static int
+#line 924
 ncx_get_ushort_int(const void *xp, int *ip)
+#line 924
 {
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (int) xx;
+#line 924
+    int err=NC_NOERR;
+#line 924
+    ix_ushort xx;
+#line 924
+    get_ix_ushort(xp, &xx);
+#line 924
+
+#line 924
 #if IX_USHORT_MAX > INT_MAX
-	if (xx > INT_MAX) return NC_ERANGE;
+#line 924
+    if (xx > INT_MAX) {
+#line 924
+
+#line 924
+        err = NC_ERANGE;
+#line 924
+    }
+#line 924
 #endif
+#line 924
 
-	return NC_NOERR;
+#line 924
+
+#line 924
+    *ip = (int) xx;
+#line 924
+    return err;
+#line 924
 }
+#line 924
 
 static int
-ncx_get_ushort_longlong(const void *xp, longlong *ip)
+#line 925
+ncx_get_ushort_long(const void *xp, long *ip)
+#line 925
 {
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (longlong) xx;
-#if IX_USHORT_MAX > LONGLONG_MAX
-	if (xx > LONGLONG_MAX) return NC_ERANGE;
+#line 925
+    int err=NC_NOERR;
+#line 925
+    ix_ushort xx;
+#line 925
+    get_ix_ushort(xp, &xx);
+#line 925
+
+#line 925
+#if IX_USHORT_MAX > LONG_MAX
+#line 925
+    if (xx > LONG_MAX) {
+#line 925
+
+#line 925
+        err = NC_ERANGE;
+#line 925
+    }
+#line 925
 #endif
+#line 925
 
-	return NC_NOERR;
+#line 925
+
+#line 925
+    *ip = (long) xx;
+#line 925
+    return err;
+#line 925
 }
+#line 925
 
 static int
-ncx_get_ushort_ushort(const void *xp, ushort *ip)
+#line 926
+ncx_get_ushort_longlong(const void *xp, longlong *ip)
+#line 926
 {
-#if SIZEOF_IX_USHORT == SIZEOF_USHORT && IX_USHORT_MAX == USHORT_MAX
-	get_ix_ushort(xp, (ix_ushort *)ip);
-	return NC_NOERR;
+#line 926
+    int err=NC_NOERR;
+#line 926
+    ix_ushort xx;
+#line 926
+    get_ix_ushort(xp, &xx);
+#line 926
+
+#line 926
+#if IX_USHORT_MAX > LONGLONG_MAX
+#line 926
+    if (xx > LONGLONG_MAX) {
+#line 926
+
+#line 926
+        err = NC_ERANGE;
+#line 926
+    }
+#line 926
+#endif
+#line 926
+
+#line 926
+
+#line 926
+    *ip = (longlong) xx;
+#line 926
+    return err;
+#line 926
+}
+#line 926
+
+static int
+#line 927
+ncx_get_ushort_ushort(const void *xp, ushort *ip)
+#line 927
+{
+#line 927
+    int err=NC_NOERR;
+#line 927
+#if SIZEOF_IX_USHORT == SIZEOF_USHORT && IX_USHORT_MAX == USHORT_MAX
+#line 927
+    get_ix_ushort(xp, (ix_ushort *)ip);
+#line 927
 #else
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (ushort) xx;
+#line 927
+    ix_ushort xx;
+#line 927
+    get_ix_ushort(xp, &xx);
+#line 927
+
+#line 927
 #if IX_USHORT_MAX > USHORT_MAX
-	if (xx > USHORT_MAX) return NC_ERANGE;
+#line 927
+    if (xx > USHORT_MAX) {
+#line 927
+
+#line 927
+        err = NC_ERANGE;
+#line 927
+    }
+#line 927
 #endif
+#line 927
+
+#line 927
 
+#line 927
+    *ip = (ushort) xx;
+#line 927
 #endif
-	return NC_NOERR;
+#line 927
+    return err;
+#line 927
 }
+#line 927
 
 static int
+#line 928
 ncx_get_ushort_uchar(const void *xp, uchar *ip)
+#line 928
 {
+#line 928
+    int err=NC_NOERR;
+#line 928
 #if SIZEOF_IX_USHORT == SIZEOF_UCHAR && IX_USHORT_MAX == UCHAR_MAX
-	get_ix_ushort(xp, (ix_ushort *)ip);
-	return NC_NOERR;
+#line 928
+    get_ix_ushort(xp, (ix_ushort *)ip);
+#line 928
 #else
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (uchar) xx;
+#line 928
+    ix_ushort xx;
+#line 928
+    get_ix_ushort(xp, &xx);
+#line 928
+
+#line 928
 #if IX_USHORT_MAX > UCHAR_MAX
-	if (xx > UCHAR_MAX) return NC_ERANGE;
+#line 928
+    if (xx > UCHAR_MAX) {
+#line 928
+
+#line 928
+        err = NC_ERANGE;
+#line 928
+    }
+#line 928
 #endif
+#line 928
+
+#line 928
 
+#line 928
+    *ip = (uchar) xx;
+#line 928
 #endif
-	return NC_NOERR;
+#line 928
+    return err;
+#line 928
 }
+#line 928
 
 static int
+#line 929
 ncx_get_ushort_uint(const void *xp, uint *ip)
+#line 929
 {
+#line 929
+    int err=NC_NOERR;
+#line 929
 #if SIZEOF_IX_USHORT == SIZEOF_UINT && IX_USHORT_MAX == UINT_MAX
-	get_ix_ushort(xp, (ix_ushort *)ip);
-	return NC_NOERR;
+#line 929
+    get_ix_ushort(xp, (ix_ushort *)ip);
+#line 929
 #else
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (uint) xx;
+#line 929
+    ix_ushort xx;
+#line 929
+    get_ix_ushort(xp, &xx);
+#line 929
+
+#line 929
 #if IX_USHORT_MAX > UINT_MAX
-	if (xx > UINT_MAX) return NC_ERANGE;
+#line 929
+    if (xx > UINT_MAX) {
+#line 929
+
+#line 929
+        err = NC_ERANGE;
+#line 929
+    }
+#line 929
 #endif
+#line 929
+
+#line 929
 
+#line 929
+    *ip = (uint) xx;
+#line 929
 #endif
-	return NC_NOERR;
+#line 929
+    return err;
+#line 929
 }
+#line 929
 
 static int
+#line 930
 ncx_get_ushort_ulonglong(const void *xp, ulonglong *ip)
+#line 930
 {
+#line 930
+    int err=NC_NOERR;
+#line 930
 #if SIZEOF_IX_USHORT == SIZEOF_ULONGLONG && IX_USHORT_MAX == ULONGLONG_MAX
-	get_ix_ushort(xp, (ix_ushort *)ip);
-	return NC_NOERR;
+#line 930
+    get_ix_ushort(xp, (ix_ushort *)ip);
+#line 930
 #else
-	ix_ushort xx;
-	get_ix_ushort(xp, &xx);
-	*ip = (ulonglong) xx;
+#line 930
+    ix_ushort xx;
+#line 930
+    get_ix_ushort(xp, &xx);
+#line 930
+
+#line 930
 #if IX_USHORT_MAX > ULONGLONG_MAX
-	if (xx > ULONGLONG_MAX) return NC_ERANGE;
+#line 930
+    if (xx > ULONGLONG_MAX) {
+#line 930
+
+#line 930
+        err = NC_ERANGE;
+#line 930
+    }
+#line 930
 #endif
+#line 930
+
+#line 930
 
+#line 930
+    *ip = (ulonglong) xx;
+#line 930
 #endif
-	return NC_NOERR;
+#line 930
+    return err;
+#line 930
 }
+#line 930
 
 static int
+#line 931
 ncx_get_ushort_float(const void *xp, float *ip)
+#line 931
 {
+#line 931
 	ix_ushort xx;
+#line 931
 	get_ix_ushort(xp, &xx);
-	*ip = (float) xx;
-
+#line 931
+	*ip = (float)xx;
+#line 931
 	return NC_NOERR;
+#line 931
 }
+#line 931
 
 static int
+#line 932
 ncx_get_ushort_double(const void *xp, double *ip)
+#line 932
 {
+#line 932
 	ix_ushort xx;
+#line 932
 	get_ix_ushort(xp, &xx);
-	*ip = (double) xx;
-
+#line 932
+	*ip = (double)xx;
+#line 932
 	return NC_NOERR;
+#line 932
 }
+#line 932
 
 
 static int
-ncx_put_ushort_schar(void *xp, const schar *ip)
+ncx_put_ushort_schar(void *xp, const schar *ip, void *fillp)
 {
-	uchar *cp = (uchar *) xp;
-	if(*ip & 0x80)
-		*cp++ = 0xff;
-	else
-		*cp++ = 0;
-	*cp = (uchar)(signed)*ip;
-        if (*ip < 0) return NC_ERANGE;
+    int err=NC_NOERR;
+    uchar *cp;
+    if (*ip < 0) {
+#line 946
+        err = NC_ERANGE;
+    }
 
-	return NC_NOERR;
+    cp = (uchar *) xp;
+    if (*ip & 0x80)
+        *cp++ = 0xff;
+    else
+        *cp++ = 0;
+    *cp = (uchar)*ip;
+
+    return err;
 }
 
 static int
-ncx_put_ushort_uchar(void *xp, const uchar *ip)
+ncx_put_ushort_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0;
@@ -902,112 +1864,370 @@ ncx_put_ushort_uchar(void *xp, const uchar *ip)
 }
 
 static int
-ncx_put_ushort_short(void *xp, const short *ip)
+#line 968
+ncx_put_ushort_short(void *xp, const short *ip, void *fillp)
+#line 968
 {
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
+#line 968
+    int err=NC_NOERR;
+#line 968
+    ix_ushort xx = NC_FILL_USHORT;
+#line 968
+
+#line 968
 #if IX_USHORT_MAX < SHORT_MAX
-	if (*ip > IX_USHORT_MAX) return NC_ERANGE;
-#endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 968
+    if (*ip > IX_USHORT_MAX) {
+#line 968
+        
+#line 968
+        err = NC_ERANGE;
+#line 968
+    } 
+#line 968
+#endif
+#line 968
+    if (*ip < 0) {
+#line 968
+        
+#line 968
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 968
+    } 
+#line 968
+        xx = (ix_ushort)*ip;
+#line 968
+
+#line 968
+    put_ix_ushort(xp, &xx);
+#line 968
+    return err;
+#line 968
+}
+#line 968
 
 static int
-ncx_put_ushort_int(void *xp, const int *ip)
+#line 969
+ncx_put_ushort_int(void *xp, const int *ip, void *fillp)
+#line 969
 {
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
+#line 969
+    int err=NC_NOERR;
+#line 969
+    ix_ushort xx = NC_FILL_USHORT;
+#line 969
+
+#line 969
 #if IX_USHORT_MAX < INT_MAX
-	if (*ip > IX_USHORT_MAX) return NC_ERANGE;
-#endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 969
+    if (*ip > IX_USHORT_MAX) {
+#line 969
+        
+#line 969
+        err = NC_ERANGE;
+#line 969
+    } 
+#line 969
+#endif
+#line 969
+    if (*ip < 0) {
+#line 969
+        
+#line 969
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 969
+    } 
+#line 969
+        xx = (ix_ushort)*ip;
+#line 969
+
+#line 969
+    put_ix_ushort(xp, &xx);
+#line 969
+    return err;
+#line 969
+}
+#line 969
+
+static int
+#line 970
+ncx_put_ushort_long(void *xp, const long *ip, void *fillp)
+#line 970
+{
+#line 970
+    int err=NC_NOERR;
+#line 970
+    ix_ushort xx = NC_FILL_USHORT;
+#line 970
+
+#line 970
+#if IX_USHORT_MAX < LONG_MAX
+#line 970
+    if (*ip > IX_USHORT_MAX) {
+#line 970
+        
+#line 970
+        err = NC_ERANGE;
+#line 970
+    } 
+#line 970
+#endif
+#line 970
+    if (*ip < 0) {
+#line 970
+        
+#line 970
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 970
+    } 
+#line 970
+        xx = (ix_ushort)*ip;
+#line 970
+
+#line 970
+    put_ix_ushort(xp, &xx);
+#line 970
+    return err;
+#line 970
+}
+#line 970
 
 static int
-ncx_put_ushort_longlong(void *xp, const longlong *ip)
+#line 971
+ncx_put_ushort_longlong(void *xp, const longlong *ip, void *fillp)
+#line 971
 {
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
+#line 971
+    int err=NC_NOERR;
+#line 971
+    ix_ushort xx = NC_FILL_USHORT;
+#line 971
+
+#line 971
 #if IX_USHORT_MAX < LONGLONG_MAX
-	if (*ip > IX_USHORT_MAX) return NC_ERANGE;
-#endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 971
+    if (*ip > IX_USHORT_MAX) {
+#line 971
+        
+#line 971
+        err = NC_ERANGE;
+#line 971
+    } 
+#line 971
+#endif
+#line 971
+    if (*ip < 0) {
+#line 971
+        
+#line 971
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 971
+    } 
+#line 971
+        xx = (ix_ushort)*ip;
+#line 971
+
+#line 971
+    put_ix_ushort(xp, &xx);
+#line 971
+    return err;
+#line 971
+}
+#line 971
 
 static int
-ncx_put_ushort_ushort(void *xp, const ushort *ip)
+#line 972
+ncx_put_ushort_ushort(void *xp, const ushort *ip, void *fillp)
+#line 972
 {
+#line 972
+    int err=NC_NOERR;
+#line 972
 #if SIZEOF_IX_USHORT == SIZEOF_USHORT && IX_USHORT_MAX == USHORT_MAX
-	put_ix_ushort(xp, (const ix_ushort *)ip);
-	return NC_NOERR;
+#line 972
+    put_ix_ushort(xp, (const ix_ushort *)ip);
+#line 972
 #else
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
-#if IX_USHORT_MAX < USHORT_MAX
-	if (*ip > IX_USHORT_MAX) return NC_ERANGE;
-#endif
+#line 972
+    ix_ushort xx = NC_FILL_USHORT;
+#line 972
 
-#endif
-	return NC_NOERR;
-}
+#line 972
+#if IX_USHORT_MAX < USHORT_MAX
+#line 972
+    if (*ip > IX_USHORT_MAX) {
+#line 972
+        
+#line 972
+        err = NC_ERANGE;
+#line 972
+    } 
+#line 972
+#endif
+#line 972
+        xx = (ix_ushort)*ip;
+#line 972
+
+#line 972
+    put_ix_ushort(xp, &xx);
+#line 972
+#endif
+#line 972
+    return err;
+#line 972
+}
+#line 972
 
 static int
-ncx_put_ushort_uint(void *xp, const uint *ip)
+#line 973
+ncx_put_ushort_uint(void *xp, const uint *ip, void *fillp)
+#line 973
 {
+#line 973
+    int err=NC_NOERR;
+#line 973
 #if SIZEOF_IX_USHORT == SIZEOF_UINT && IX_USHORT_MAX == UINT_MAX
-	put_ix_ushort(xp, (const ix_ushort *)ip);
-	return NC_NOERR;
+#line 973
+    put_ix_ushort(xp, (const ix_ushort *)ip);
+#line 973
 #else
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
-#if IX_USHORT_MAX < UINT_MAX
-	if (*ip > IX_USHORT_MAX) return NC_ERANGE;
-#endif
+#line 973
+    ix_ushort xx = NC_FILL_USHORT;
+#line 973
 
-#endif
-	return NC_NOERR;
-}
+#line 973
+#if IX_USHORT_MAX < UINT_MAX
+#line 973
+    if (*ip > IX_USHORT_MAX) {
+#line 973
+        
+#line 973
+        err = NC_ERANGE;
+#line 973
+    } 
+#line 973
+#endif
+#line 973
+        xx = (ix_ushort)*ip;
+#line 973
+
+#line 973
+    put_ix_ushort(xp, &xx);
+#line 973
+#endif
+#line 973
+    return err;
+#line 973
+}
+#line 973
 
 static int
-ncx_put_ushort_ulonglong(void *xp, const ulonglong *ip)
+#line 974
+ncx_put_ushort_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 974
 {
+#line 974
+    int err=NC_NOERR;
+#line 974
 #if SIZEOF_IX_USHORT == SIZEOF_ULONGLONG && IX_USHORT_MAX == ULONGLONG_MAX
-	put_ix_ushort(xp, (const ix_ushort *)ip);
-	return NC_NOERR;
+#line 974
+    put_ix_ushort(xp, (const ix_ushort *)ip);
+#line 974
 #else
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
-#if IX_USHORT_MAX < ULONGLONG_MAX
-	if (*ip > IX_USHORT_MAX) return NC_ERANGE;
-#endif
+#line 974
+    ix_ushort xx = NC_FILL_USHORT;
+#line 974
 
-#endif
-	return NC_NOERR;
-}
+#line 974
+#if IX_USHORT_MAX < ULONGLONG_MAX
+#line 974
+    if (*ip > IX_USHORT_MAX) {
+#line 974
+        
+#line 974
+        err = NC_ERANGE;
+#line 974
+    } 
+#line 974
+#endif
+#line 974
+        xx = (ix_ushort)*ip;
+#line 974
+
+#line 974
+    put_ix_ushort(xp, &xx);
+#line 974
+#endif
+#line 974
+    return err;
+#line 974
+}
+#line 974
 
 static int
-ncx_put_ushort_float(void *xp, const float *ip)
-{
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
-	if(*ip > (double)X_USHORT_MAX || *ip < 0) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 975
+ncx_put_ushort_float(void *xp, const float *ip, void *fillp)
+#line 975
+{
+#line 975
+    int err=NC_NOERR;
+#line 975
+    ix_ushort xx = NC_FILL_USHORT;
+#line 975
+
+#line 975
+    if (*ip > (double)X_USHORT_MAX || *ip < 0) {
+#line 975
+        
+#line 975
+        err = NC_ERANGE;
+#line 975
+    } 
+#line 975
+        xx = (ix_ushort)*ip;
+#line 975
+
+#line 975
+    put_ix_ushort(xp, &xx);
+#line 975
+    return err;
+#line 975
+}
+#line 975
 
 static int
-ncx_put_ushort_double(void *xp, const double *ip)
-{
-	ix_ushort xx = (ix_ushort)*ip;
-	put_ix_ushort(xp, &xx);
-	if(*ip > X_USHORT_MAX || *ip < 0) return NC_ERANGE;
-	return NC_NOERR;
-}
-
-
-/* x_int ---------------------------------------------------------------------*/
+#line 976
+ncx_put_ushort_double(void *xp, const double *ip, void *fillp)
+#line 976
+{
+#line 976
+    int err=NC_NOERR;
+#line 976
+    ix_ushort xx = NC_FILL_USHORT;
+#line 976
+
+#line 976
+    if (*ip > X_USHORT_MAX || *ip < 0) {
+#line 976
+        
+#line 976
+        err = NC_ERANGE;
+#line 976
+    } 
+#line 976
+        xx = (ix_ushort)*ip;
+#line 976
+
+#line 976
+    put_ix_ushort(xp, &xx);
+#line 976
+    return err;
+#line 976
+}
+#line 976
+
+
+/* external NC_INT ----------------------------------------------------------*/
 
 #if SHORT_MAX == X_INT_MAX
 typedef short ix_int;
@@ -1033,7 +2253,7 @@ get_ix_int(const void *xp, ix_int *ip)
 
 	*ip = *cp++ << 24;
 #if SIZEOF_IX_INT > X_SIZEOF_INT
-	if(*ip & 0x80000000)
+	if (*ip & 0x80000000)
 	{
 		/* extern is negative */
 		*ip |= (~(0xffffffff)); /* N.B. Assumes "twos complement" */
@@ -1049,157 +2269,443 @@ put_ix_int(void *xp, const ix_int *ip)
 {
 	uchar *cp = (uchar *) xp;
 
-	*cp++ = (*ip) >> 24;
-	*cp++ = ((*ip) & 0x00ff0000) >> 16;
-	*cp++ = ((*ip) & 0x0000ff00) >>  8;
-	*cp   = ((*ip) & 0x000000ff);
+	*cp++ = (uchar)( (*ip) >> 24);
+	*cp++ = (uchar)(((*ip) & 0x00ff0000) >> 16);
+	*cp++ = (uchar)(((*ip) & 0x0000ff00) >>  8);
+	*cp   = (uchar)( (*ip) & 0x000000ff);
+}
+
+#if X_SIZEOF_INT != SIZEOF_INT
+static int
+#line 1027
+ncx_get_int_int(const void *xp, int *ip)
+#line 1027
+{
+#line 1027
+    int err=NC_NOERR;
+#line 1027
+#if SIZEOF_IX_INT == SIZEOF_INT && IX_INT_MAX == INT_MAX
+#line 1027
+    get_ix_int(xp, (ix_int *)ip);
+#line 1027
+#else
+#line 1027
+    ix_int xx;
+#line 1027
+    get_ix_int(xp, &xx);
+#line 1027
+
+#line 1027
+#if IX_INT_MAX > INT_MAX
+#line 1027
+    if (xx > INT_MAX || xx < INT_MIN) {
+#line 1027
+
+#line 1027
+        err = NC_ERANGE;
+#line 1027
+    }
+#line 1027
+#endif
+#line 1027
+
+#line 1027
+
+#line 1027
+    *ip = (int) xx;
+#line 1027
+#endif
+#line 1027
+    return err;
+#line 1027
 }
+#line 1027
 
+#endif
 static int
+#line 1029
 ncx_get_int_schar(const void *xp, schar *ip)
+#line 1029
 {
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (schar) xx;
+#line 1029
+    int err=NC_NOERR;
+#line 1029
+    ix_int xx;
+#line 1029
+    get_ix_int(xp, &xx);
+#line 1029
+
+#line 1029
 #if IX_INT_MAX > SCHAR_MAX
-	if (xx > SCHAR_MAX || xx < SCHAR_MIN) return NC_ERANGE;
+#line 1029
+    if (xx > SCHAR_MAX || xx < SCHAR_MIN) {
+#line 1029
+
+#line 1029
+        err = NC_ERANGE;
+#line 1029
+    }
+#line 1029
 #endif
+#line 1029
 
-	return NC_NOERR;
+#line 1029
+
+#line 1029
+    *ip = (schar) xx;
+#line 1029
+    return err;
+#line 1029
 }
+#line 1029
 
 static int
+#line 1030
 ncx_get_int_short(const void *xp, short *ip)
+#line 1030
 {
+#line 1030
+    int err=NC_NOERR;
+#line 1030
 #if SIZEOF_IX_INT == SIZEOF_SHORT && IX_INT_MAX == SHORT_MAX
-	get_ix_int(xp, (ix_int *)ip);
-	return NC_NOERR;
+#line 1030
+    get_ix_int(xp, (ix_int *)ip);
+#line 1030
 #else
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (short) xx;
+#line 1030
+    ix_int xx;
+#line 1030
+    get_ix_int(xp, &xx);
+#line 1030
+
+#line 1030
 #if IX_INT_MAX > SHORT_MAX
-	if (xx > SHORT_MAX || xx < SHORT_MIN) return NC_ERANGE;
+#line 1030
+    if (xx > SHORT_MAX || xx < SHORT_MIN) {
+#line 1030
+
+#line 1030
+        err = NC_ERANGE;
+#line 1030
+    }
+#line 1030
 #endif
+#line 1030
 
+#line 1030
+
+#line 1030
+    *ip = (short) xx;
+#line 1030
 #endif
-	return NC_NOERR;
+#line 1030
+    return err;
+#line 1030
 }
+#line 1030
 
-       int
-ncx_get_int_int(const void *xp, int *ip)
-{
-#if SIZEOF_IX_INT == SIZEOF_INT && IX_INT_MAX == INT_MAX
-	get_ix_int(xp, (ix_int *)ip);
-	return NC_NOERR;
+static int
+#line 1031
+ncx_get_int_long(const void *xp, long *ip)
+#line 1031
+{
+#line 1031
+    int err=NC_NOERR;
+#line 1031
+#if SIZEOF_IX_INT == SIZEOF_LONG && IX_INT_MAX == LONG_MAX
+#line 1031
+    get_ix_int(xp, (ix_int *)ip);
+#line 1031
 #else
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (int) xx;
-#if IX_INT_MAX > INT_MAX
-	if (xx > INT_MAX || xx < INT_MIN) return NC_ERANGE;
+#line 1031
+    ix_int xx;
+#line 1031
+    get_ix_int(xp, &xx);
+#line 1031
+
+#line 1031
+#if IX_INT_MAX > LONG_MAX
+#line 1031
+    if (xx > LONG_MAX || xx < LONG_MIN) {
+#line 1031
+
+#line 1031
+        err = NC_ERANGE;
+#line 1031
+    }
+#line 1031
 #endif
+#line 1031
+
+#line 1031
 
+#line 1031
+    *ip = (long) xx;
+#line 1031
 #endif
-	return NC_NOERR;
+#line 1031
+    return err;
+#line 1031
 }
+#line 1031
 
 static int
+#line 1032
 ncx_get_int_longlong(const void *xp, longlong *ip)
+#line 1032
 {
+#line 1032
+    int err=NC_NOERR;
+#line 1032
 #if SIZEOF_IX_INT == SIZEOF_LONGLONG && IX_INT_MAX == LONGLONG_MAX
-	get_ix_int(xp, (ix_int *)ip);
-	return NC_NOERR;
+#line 1032
+    get_ix_int(xp, (ix_int *)ip);
+#line 1032
 #else
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (longlong) xx;
+#line 1032
+    ix_int xx;
+#line 1032
+    get_ix_int(xp, &xx);
+#line 1032
+
+#line 1032
 #if IX_INT_MAX > LONGLONG_MAX
-	if (xx > LONGLONG_MAX || xx < LONGLONG_MIN) return NC_ERANGE;
+#line 1032
+    if (xx > LONGLONG_MAX || xx < LONGLONG_MIN) {
+#line 1032
+
+#line 1032
+        err = NC_ERANGE;
+#line 1032
+    }
+#line 1032
 #endif
+#line 1032
+
+#line 1032
 
+#line 1032
+    *ip = (longlong) xx;
+#line 1032
 #endif
-	return NC_NOERR;
+#line 1032
+    return err;
+#line 1032
 }
+#line 1032
 
 static int
+#line 1033
 ncx_get_int_ushort(const void *xp, ushort *ip)
+#line 1033
 {
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (ushort) xx;
+#line 1033
+    int err=NC_NOERR;
+#line 1033
+    ix_int xx;
+#line 1033
+    get_ix_int(xp, &xx);
+#line 1033
+
+#line 1033
 #if IX_INT_MAX > USHORT_MAX
-	if (xx > USHORT_MAX) return NC_ERANGE;
+#line 1033
+    if (xx > USHORT_MAX) {
+#line 1033
+
+#line 1033
+        err = NC_ERANGE;
+#line 1033
+    }
+#line 1033
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 1033
+
+#line 1033
+    if (xx < 0) {
+#line 1033
+
+#line 1033
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 1033
+    }
+#line 1033
+    *ip = (ushort) xx;
+#line 1033
+    return err;
+#line 1033
 }
+#line 1033
 
 static int
+#line 1034
 ncx_get_int_uchar(const void *xp, uchar *ip)
+#line 1034
 {
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (uchar) xx;
+#line 1034
+    int err=NC_NOERR;
+#line 1034
+    ix_int xx;
+#line 1034
+    get_ix_int(xp, &xx);
+#line 1034
+
+#line 1034
 #if IX_INT_MAX > UCHAR_MAX
-	if (xx > UCHAR_MAX) return NC_ERANGE;
+#line 1034
+    if (xx > UCHAR_MAX) {
+#line 1034
+
+#line 1034
+        err = NC_ERANGE;
+#line 1034
+    }
+#line 1034
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 1034
+
+#line 1034
+    if (xx < 0) {
+#line 1034
+
+#line 1034
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 1034
+    }
+#line 1034
+    *ip = (uchar) xx;
+#line 1034
+    return err;
+#line 1034
 }
+#line 1034
 
 static int
+#line 1035
 ncx_get_int_uint(const void *xp, uint *ip)
+#line 1035
 {
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (uint) xx;
+#line 1035
+    int err=NC_NOERR;
+#line 1035
+    ix_int xx;
+#line 1035
+    get_ix_int(xp, &xx);
+#line 1035
+
+#line 1035
 #if IX_INT_MAX > UINT_MAX
-	if (xx > UINT_MAX) return NC_ERANGE;
+#line 1035
+    if (xx > UINT_MAX) {
+#line 1035
+
+#line 1035
+        err = NC_ERANGE;
+#line 1035
+    }
+#line 1035
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 1035
+
+#line 1035
+    if (xx < 0) {
+#line 1035
+
+#line 1035
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 1035
+    }
+#line 1035
+    *ip = (uint) xx;
+#line 1035
+    return err;
+#line 1035
 }
+#line 1035
 
 static int
+#line 1036
 ncx_get_int_ulonglong(const void *xp, ulonglong *ip)
+#line 1036
 {
-	ix_int xx;
-	get_ix_int(xp, &xx);
-	*ip = (ulonglong) xx;
+#line 1036
+    int err=NC_NOERR;
+#line 1036
+    ix_int xx;
+#line 1036
+    get_ix_int(xp, &xx);
+#line 1036
+
+#line 1036
 #if IX_INT_MAX > ULONGLONG_MAX
-	if (xx > ULONGLONG_MAX) return NC_ERANGE;
+#line 1036
+    if (xx > ULONGLONG_MAX) {
+#line 1036
+
+#line 1036
+        err = NC_ERANGE;
+#line 1036
+    }
+#line 1036
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 1036
+
+#line 1036
+    if (xx < 0) {
+#line 1036
+
+#line 1036
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 1036
+    }
+#line 1036
+    *ip = (ulonglong) xx;
+#line 1036
+    return err;
+#line 1036
 }
+#line 1036
 
 static int
+#line 1037
 ncx_get_int_float(const void *xp, float *ip)
+#line 1037
 {
+#line 1037
 	ix_int xx;
+#line 1037
 	get_ix_int(xp, &xx);
-	*ip = (float) xx;
-
+#line 1037
+	*ip = (float)xx;
+#line 1037
 	return NC_NOERR;
+#line 1037
 }
+#line 1037
 
 static int
+#line 1038
 ncx_get_int_double(const void *xp, double *ip)
+#line 1038
 {
+#line 1038
 	ix_int xx;
+#line 1038
 	get_ix_int(xp, &xx);
-	*ip = (double) xx;
-
+#line 1038
+	*ip = (double)xx;
+#line 1038
 	return NC_NOERR;
+#line 1038
 }
+#line 1038
 
 
 static int
-ncx_put_int_schar(void *xp, const schar *ip)
+ncx_put_int_schar(void *xp, const schar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
-	if(*ip & 0x80)
+	if (*ip & 0x80)
 	{
 		*cp++ = 0xff;
 		*cp++ = 0xff;
@@ -1211,12 +2717,12 @@ ncx_put_int_schar(void *xp, const schar *ip)
 		*cp++ = 0x00;
 		*cp++ = 0x00;
 	}
-	*cp = (uchar)(signed)*ip;
+	*cp = (uchar)*ip;
 	return NC_NOERR;
 }
 
 static int
-ncx_put_int_uchar(void *xp, const uchar *ip)
+ncx_put_int_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0x00;
@@ -1226,114 +2732,350 @@ ncx_put_int_uchar(void *xp, const uchar *ip)
 	return NC_NOERR;
 }
 
+#if X_SIZEOF_INT != SIZEOF_INT
 static int
-ncx_put_int_short(void *xp, const short *ip)
+#line 1072
+ncx_put_int_int(void *xp, const int *ip, void *fillp)
+#line 1072
 {
-#if SIZEOF_IX_INT == SIZEOF_SHORT && IX_INT_MAX == SHORT_MAX
-	put_ix_int(xp, (const ix_int *)ip);
-	return NC_NOERR;
+#line 1072
+    int err=NC_NOERR;
+#line 1072
+#if SIZEOF_IX_INT == SIZEOF_INT && IX_INT_MAX == INT_MAX
+#line 1072
+    put_ix_int(xp, (const ix_int *)ip);
+#line 1072
 #else
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-#if IX_INT_MAX < SHORT_MAX
-	if (*ip > IX_INT_MAX || *ip < X_INT_MIN) return NC_ERANGE;
+#line 1072
+    ix_int xx = NC_FILL_INT;
+#line 1072
+
+#line 1072
+#if IX_INT_MAX < INT_MAX
+#line 1072
+    if (*ip > IX_INT_MAX || *ip < X_INT_MIN) {
+#line 1072
+        
+#line 1072
+        err = NC_ERANGE;
+#line 1072
+    } 
+#line 1072
 #endif
+#line 1072
+        xx = (ix_int)*ip;
+#line 1072
 
+#line 1072
+    put_ix_int(xp, &xx);
+#line 1072
 #endif
-	return NC_NOERR;
+#line 1072
+    return err;
+#line 1072
 }
+#line 1072
 
-       int
-ncx_put_int_int(void *xp, const int *ip)
+#endif
+static int
+#line 1074
+ncx_put_int_short(void *xp, const short *ip, void *fillp)
+#line 1074
 {
-#if SIZEOF_IX_INT == SIZEOF_INT && IX_INT_MAX == INT_MAX
-	put_ix_int(xp, (const ix_int *)ip);
-	return NC_NOERR;
+#line 1074
+    int err=NC_NOERR;
+#line 1074
+#if SIZEOF_IX_INT == SIZEOF_SHORT && IX_INT_MAX == SHORT_MAX
+#line 1074
+    put_ix_int(xp, (const ix_int *)ip);
+#line 1074
 #else
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-#if IX_INT_MAX < INT_MAX
-	if (*ip > IX_INT_MAX || *ip < X_INT_MIN) return NC_ERANGE;
-#endif
+#line 1074
+    ix_int xx = NC_FILL_INT;
+#line 1074
 
-#endif
-	return NC_NOERR;
-}
+#line 1074
+#if IX_INT_MAX < SHORT_MAX
+#line 1074
+    if (*ip > IX_INT_MAX || *ip < X_INT_MIN) {
+#line 1074
+        
+#line 1074
+        err = NC_ERANGE;
+#line 1074
+    } 
+#line 1074
+#endif
+#line 1074
+        xx = (ix_int)*ip;
+#line 1074
+
+#line 1074
+    put_ix_int(xp, &xx);
+#line 1074
+#endif
+#line 1074
+    return err;
+#line 1074
+}
+#line 1074
+
+static int
+#line 1075
+ncx_put_int_long(void *xp, const long *ip, void *fillp)
+#line 1075
+{
+#line 1075
+    int err=NC_NOERR;
+#line 1075
+#if SIZEOF_IX_INT == SIZEOF_LONG && IX_INT_MAX == LONG_MAX
+#line 1075
+    put_ix_int(xp, (const ix_int *)ip);
+#line 1075
+#else
+#line 1075
+    ix_int xx = NC_FILL_INT;
+#line 1075
+
+#line 1075
+#if IX_INT_MAX < LONG_MAX
+#line 1075
+    if (*ip > IX_INT_MAX || *ip < X_INT_MIN) {
+#line 1075
+        
+#line 1075
+        err = NC_ERANGE;
+#line 1075
+    } 
+#line 1075
+#endif
+#line 1075
+        xx = (ix_int)*ip;
+#line 1075
+
+#line 1075
+    put_ix_int(xp, &xx);
+#line 1075
+#endif
+#line 1075
+    return err;
+#line 1075
+}
+#line 1075
 
 static int
-ncx_put_int_longlong(void *xp, const longlong *ip)
+#line 1076
+ncx_put_int_longlong(void *xp, const longlong *ip, void *fillp)
+#line 1076
 {
+#line 1076
+    int err=NC_NOERR;
+#line 1076
 #if SIZEOF_IX_INT == SIZEOF_LONGLONG && IX_INT_MAX == LONGLONG_MAX
-	put_ix_int(xp, (const ix_int *)ip);
-	return NC_NOERR;
+#line 1076
+    put_ix_int(xp, (const ix_int *)ip);
+#line 1076
 #else
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-#if IX_INT_MAX < LONGLONG_MAX
-	if (*ip > IX_INT_MAX || *ip < X_INT_MIN) return NC_ERANGE;
-#endif
+#line 1076
+    ix_int xx = NC_FILL_INT;
+#line 1076
 
-#endif
-	return NC_NOERR;
-}
+#line 1076
+#if IX_INT_MAX < LONGLONG_MAX
+#line 1076
+    if (*ip > IX_INT_MAX || *ip < X_INT_MIN) {
+#line 1076
+        
+#line 1076
+        err = NC_ERANGE;
+#line 1076
+    } 
+#line 1076
+#endif
+#line 1076
+        xx = (ix_int)*ip;
+#line 1076
+
+#line 1076
+    put_ix_int(xp, &xx);
+#line 1076
+#endif
+#line 1076
+    return err;
+#line 1076
+}
+#line 1076
 
 static int
-ncx_put_int_ushort(void *xp, const ushort *ip)
+#line 1077
+ncx_put_int_ushort(void *xp, const ushort *ip, void *fillp)
+#line 1077
 {
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-#if IX_INT_MAX < USHORT_MAX
-	if (*ip > IX_INT_MAX) return NC_ERANGE;
-#endif
+#line 1077
+    int err=NC_NOERR;
+#line 1077
+    ix_int xx = NC_FILL_INT;
+#line 1077
 
-	return NC_NOERR;
-}
+#line 1077
+#if IX_INT_MAX < USHORT_MAX
+#line 1077
+    if (*ip > IX_INT_MAX) {
+#line 1077
+        
+#line 1077
+        err = NC_ERANGE;
+#line 1077
+    } 
+#line 1077
+#endif
+#line 1077
+        xx = (ix_int)*ip;
+#line 1077
+
+#line 1077
+    put_ix_int(xp, &xx);
+#line 1077
+    return err;
+#line 1077
+}
+#line 1077
 
 static int
-ncx_put_int_uint(void *xp, const uint *ip)
+#line 1078
+ncx_put_int_uint(void *xp, const uint *ip, void *fillp)
+#line 1078
 {
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-#if IX_INT_MAX < UINT_MAX
-	if (*ip > IX_INT_MAX) return NC_ERANGE;
-#endif
+#line 1078
+    int err=NC_NOERR;
+#line 1078
+    ix_int xx = NC_FILL_INT;
+#line 1078
 
-	return NC_NOERR;
-}
+#line 1078
+#if IX_INT_MAX < UINT_MAX
+#line 1078
+    if (*ip > IX_INT_MAX) {
+#line 1078
+        
+#line 1078
+        err = NC_ERANGE;
+#line 1078
+    } 
+#line 1078
+#endif
+#line 1078
+        xx = (ix_int)*ip;
+#line 1078
+
+#line 1078
+    put_ix_int(xp, &xx);
+#line 1078
+    return err;
+#line 1078
+}
+#line 1078
 
 static int
-ncx_put_int_ulonglong(void *xp, const ulonglong *ip)
+#line 1079
+ncx_put_int_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 1079
 {
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-#if IX_INT_MAX < ULONGLONG_MAX
-	if (*ip > IX_INT_MAX) return NC_ERANGE;
-#endif
+#line 1079
+    int err=NC_NOERR;
+#line 1079
+    ix_int xx = NC_FILL_INT;
+#line 1079
 
-	return NC_NOERR;
-}
+#line 1079
+#if IX_INT_MAX < ULONGLONG_MAX
+#line 1079
+    if (*ip > IX_INT_MAX) {
+#line 1079
+        
+#line 1079
+        err = NC_ERANGE;
+#line 1079
+    } 
+#line 1079
+#endif
+#line 1079
+        xx = (ix_int)*ip;
+#line 1079
+
+#line 1079
+    put_ix_int(xp, &xx);
+#line 1079
+    return err;
+#line 1079
+}
+#line 1079
 
 static int
-ncx_put_int_float(void *xp, const float *ip)
-{
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-	if(*ip > (double)X_INT_MAX || *ip < (double)X_INT_MIN) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 1080
+ncx_put_int_float(void *xp, const float *ip, void *fillp)
+#line 1080
+{
+#line 1080
+    int err=NC_NOERR;
+#line 1080
+    ix_int xx = NC_FILL_INT;
+#line 1080
+
+#line 1080
+    if (*ip > (double)X_INT_MAX || *ip < (double)X_INT_MIN) {
+#line 1080
+        
+#line 1080
+        err = NC_ERANGE;
+#line 1080
+    } 
+#line 1080
+        xx = (ix_int)*ip;
+#line 1080
+
+#line 1080
+    put_ix_int(xp, &xx);
+#line 1080
+    return err;
+#line 1080
+}
+#line 1080
 
 static int
-ncx_put_int_double(void *xp, const double *ip)
+#line 1081
+ncx_put_int_double(void *xp, const double *ip, void *fillp)
+#line 1081
 {
-	ix_int xx = (ix_int)*ip;
-	put_ix_int(xp, &xx);
-	if(*ip > X_INT_MAX || *ip < X_INT_MIN) return NC_ERANGE;
-	return NC_NOERR;
+#line 1081
+    int err=NC_NOERR;
+#line 1081
+    ix_int xx = NC_FILL_INT;
+#line 1081
+
+#line 1081
+    if (*ip > X_INT_MAX || *ip < X_INT_MIN) {
+#line 1081
+        
+#line 1081
+        err = NC_ERANGE;
+#line 1081
+    } 
+#line 1081
+        xx = (ix_int)*ip;
+#line 1081
+
+#line 1081
+    put_ix_int(xp, &xx);
+#line 1081
+    return err;
+#line 1081
 }
+#line 1081
 
 
 
-/* x_uint --------------------------------------------------------------------*/
+/* external NC_UINT ---------------------------------------------------------*/
 
 #if USHORT_MAX == X_UINT_MAX
 typedef ushort ix_uint;
@@ -1357,10 +3099,10 @@ get_ix_uint(const void *xp, ix_uint *ip)
 {
 	const uchar *cp = (const uchar *) xp;
 
-	*ip = *cp++ << 24;
-	*ip |= (*cp++ << 16);
-	*ip |= (*cp++ << 8);
-	*ip |= *cp;
+	*ip = (ix_uint)(*cp++ << 24);
+	*ip = (ix_uint)(*ip | (ix_uint)(*cp++ << 16));
+	*ip = (ix_uint)(*ip | (ix_uint)(*cp++ << 8));
+	*ip = (ix_uint)(*ip | *cp);
 }
 
 static void
@@ -1368,176 +3110,436 @@ put_ix_uint(void *xp, const ix_uint *ip)
 {
 	uchar *cp = (uchar *) xp;
 
-	*cp++ = (*ip) >> 24;
-	*cp++ = ((*ip) & 0x00ff0000) >> 16;
-	*cp++ = ((*ip) & 0x0000ff00) >>  8;
-	*cp   = ((*ip) & 0x000000ff);
+	*cp++ = (uchar)((*ip) >> 24);
+	*cp++ = (uchar)(((*ip) & 0x00ff0000) >> 16);
+	*cp++ = (uchar)(((*ip) & 0x0000ff00) >>  8);
+	*cp   = (uchar)( (*ip) & 0x000000ff);
 }
 
 #if X_SIZEOF_UINT != SIZEOF_UINT
 static int
+#line 1126
 ncx_get_uint_uint(const void *xp, uint *ip)
+#line 1126
 {
+#line 1126
+    int err=NC_NOERR;
+#line 1126
 #if SIZEOF_IX_UINT == SIZEOF_UINT && IX_UINT_MAX == UINT_MAX
-	get_ix_uint(xp, (ix_uint *)ip);
-	return NC_NOERR;
+#line 1126
+    get_ix_uint(xp, (ix_uint *)ip);
+#line 1126
 #else
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (uint) xx;
+#line 1126
+    ix_uint xx;
+#line 1126
+    get_ix_uint(xp, &xx);
+#line 1126
+
+#line 1126
 #if IX_UINT_MAX > UINT_MAX
-	if (xx > UINT_MAX) return NC_ERANGE;
+#line 1126
+    if (xx > UINT_MAX) {
+#line 1126
+
+#line 1126
+        err = NC_ERANGE;
+#line 1126
+    }
+#line 1126
 #endif
+#line 1126
 
+#line 1126
+
+#line 1126
+    *ip = (uint) xx;
+#line 1126
 #endif
-	return NC_NOERR;
+#line 1126
+    return err;
+#line 1126
 }
+#line 1126
 
 #endif
 
 static int
+#line 1129
 ncx_get_uint_schar(const void *xp, schar *ip)
+#line 1129
 {
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (schar) xx;
+#line 1129
+    int err=NC_NOERR;
+#line 1129
+    ix_uint xx;
+#line 1129
+    get_ix_uint(xp, &xx);
+#line 1129
+
+#line 1129
 #if IX_UINT_MAX > SCHAR_MAX
-	if (xx > SCHAR_MAX) return NC_ERANGE;
+#line 1129
+    if (xx > SCHAR_MAX) {
+#line 1129
+
+#line 1129
+        err = NC_ERANGE;
+#line 1129
+    }
+#line 1129
 #endif
+#line 1129
 
-	return NC_NOERR;
+#line 1129
+
+#line 1129
+    *ip = (schar) xx;
+#line 1129
+    return err;
+#line 1129
 }
+#line 1129
 
 static int
+#line 1130
 ncx_get_uint_short(const void *xp, short *ip)
+#line 1130
 {
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (short) xx;
+#line 1130
+    int err=NC_NOERR;
+#line 1130
+    ix_uint xx;
+#line 1130
+    get_ix_uint(xp, &xx);
+#line 1130
+
+#line 1130
 #if IX_UINT_MAX > SHORT_MAX
-	if (xx > SHORT_MAX) return NC_ERANGE;
+#line 1130
+    if (xx > SHORT_MAX) {
+#line 1130
+
+#line 1130
+        err = NC_ERANGE;
+#line 1130
+    }
+#line 1130
 #endif
+#line 1130
 
-	return NC_NOERR;
+#line 1130
+
+#line 1130
+    *ip = (short) xx;
+#line 1130
+    return err;
+#line 1130
 }
+#line 1130
 
 static int
+#line 1131
 ncx_get_uint_int(const void *xp, int *ip)
+#line 1131
 {
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (int) xx;
+#line 1131
+    int err=NC_NOERR;
+#line 1131
+    ix_uint xx;
+#line 1131
+    get_ix_uint(xp, &xx);
+#line 1131
+
+#line 1131
 #if IX_UINT_MAX > INT_MAX
-	if (xx > INT_MAX) return NC_ERANGE;
+#line 1131
+    if (xx > INT_MAX) {
+#line 1131
+
+#line 1131
+        err = NC_ERANGE;
+#line 1131
+    }
+#line 1131
 #endif
+#line 1131
 
-	return NC_NOERR;
+#line 1131
+
+#line 1131
+    *ip = (int) xx;
+#line 1131
+    return err;
+#line 1131
+}
+#line 1131
+
+static int
+#line 1132
+ncx_get_uint_long(const void *xp, long *ip)
+#line 1132
+{
+#line 1132
+    int err=NC_NOERR;
+#line 1132
+    ix_uint xx;
+#line 1132
+    get_ix_uint(xp, &xx);
+#line 1132
+
+#line 1132
+#if IX_UINT_MAX > LONG_MAX
+#line 1132
+    if (xx > LONG_MAX) {
+#line 1132
+
+#line 1132
+        err = NC_ERANGE;
+#line 1132
+    }
+#line 1132
+#endif
+#line 1132
+
+#line 1132
+
+#line 1132
+    *ip = (long) xx;
+#line 1132
+    return err;
+#line 1132
 }
+#line 1132
 
 static int
+#line 1133
 ncx_get_uint_longlong(const void *xp, longlong *ip)
+#line 1133
 {
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (longlong) xx;
+#line 1133
+    int err=NC_NOERR;
+#line 1133
+    ix_uint xx;
+#line 1133
+    get_ix_uint(xp, &xx);
+#line 1133
+
+#line 1133
 #if IX_UINT_MAX > LONGLONG_MAX
-	if (xx > LONGLONG_MAX) return NC_ERANGE;
+#line 1133
+    if (xx > LONGLONG_MAX) {
+#line 1133
+
+#line 1133
+        err = NC_ERANGE;
+#line 1133
+    }
+#line 1133
 #endif
+#line 1133
 
-	return NC_NOERR;
+#line 1133
+
+#line 1133
+    *ip = (longlong) xx;
+#line 1133
+    return err;
+#line 1133
 }
+#line 1133
 
 static int
+#line 1134
 ncx_get_uint_ushort(const void *xp, ushort *ip)
+#line 1134
 {
+#line 1134
+    int err=NC_NOERR;
+#line 1134
 #if SIZEOF_IX_UINT == SIZEOF_USHORT && IX_UINT_MAX == USHORT_MAX
-	get_ix_uint(xp, (ix_uint *)ip);
-	return NC_NOERR;
+#line 1134
+    get_ix_uint(xp, (ix_uint *)ip);
+#line 1134
 #else
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (ushort) xx;
+#line 1134
+    ix_uint xx;
+#line 1134
+    get_ix_uint(xp, &xx);
+#line 1134
+
+#line 1134
 #if IX_UINT_MAX > USHORT_MAX
-	if (xx > USHORT_MAX) return NC_ERANGE;
+#line 1134
+    if (xx > USHORT_MAX) {
+#line 1134
+
+#line 1134
+        err = NC_ERANGE;
+#line 1134
+    }
+#line 1134
 #endif
+#line 1134
 
+#line 1134
+
+#line 1134
+    *ip = (ushort) xx;
+#line 1134
 #endif
-	return NC_NOERR;
+#line 1134
+    return err;
+#line 1134
 }
+#line 1134
 
 static int
+#line 1135
 ncx_get_uint_uchar(const void *xp, uchar *ip)
+#line 1135
 {
+#line 1135
+    int err=NC_NOERR;
+#line 1135
 #if SIZEOF_IX_UINT == SIZEOF_UCHAR && IX_UINT_MAX == UCHAR_MAX
-	get_ix_uint(xp, (ix_uint *)ip);
-	return NC_NOERR;
+#line 1135
+    get_ix_uint(xp, (ix_uint *)ip);
+#line 1135
 #else
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (uchar) xx;
+#line 1135
+    ix_uint xx;
+#line 1135
+    get_ix_uint(xp, &xx);
+#line 1135
+
+#line 1135
 #if IX_UINT_MAX > UCHAR_MAX
-	if (xx > UCHAR_MAX) return NC_ERANGE;
+#line 1135
+    if (xx > UCHAR_MAX) {
+#line 1135
+
+#line 1135
+        err = NC_ERANGE;
+#line 1135
+    }
+#line 1135
 #endif
+#line 1135
 
+#line 1135
+
+#line 1135
+    *ip = (uchar) xx;
+#line 1135
 #endif
-	return NC_NOERR;
+#line 1135
+    return err;
+#line 1135
 }
+#line 1135
 
 static int
+#line 1136
 ncx_get_uint_ulonglong(const void *xp, ulonglong *ip)
+#line 1136
 {
+#line 1136
+    int err=NC_NOERR;
+#line 1136
 #if SIZEOF_IX_UINT == SIZEOF_ULONGLONG && IX_UINT_MAX == ULONGLONG_MAX
-	get_ix_uint(xp, (ix_uint *)ip);
-	return NC_NOERR;
+#line 1136
+    get_ix_uint(xp, (ix_uint *)ip);
+#line 1136
 #else
-	ix_uint xx;
-	get_ix_uint(xp, &xx);
-	*ip = (ulonglong) xx;
+#line 1136
+    ix_uint xx;
+#line 1136
+    get_ix_uint(xp, &xx);
+#line 1136
+
+#line 1136
 #if IX_UINT_MAX > ULONGLONG_MAX
-	if (xx > ULONGLONG_MAX) return NC_ERANGE;
+#line 1136
+    if (xx > ULONGLONG_MAX) {
+#line 1136
+
+#line 1136
+        err = NC_ERANGE;
+#line 1136
+    }
+#line 1136
 #endif
+#line 1136
 
+#line 1136
+
+#line 1136
+    *ip = (ulonglong) xx;
+#line 1136
 #endif
-	return NC_NOERR;
+#line 1136
+    return err;
+#line 1136
 }
+#line 1136
 
 static int
+#line 1137
 ncx_get_uint_float(const void *xp, float *ip)
+#line 1137
 {
+#line 1137
 	ix_uint xx;
+#line 1137
 	get_ix_uint(xp, &xx);
-	*ip = (float) xx;
-
+#line 1137
+	*ip = (float)xx;
+#line 1137
 	return NC_NOERR;
+#line 1137
 }
+#line 1137
 
 static int
+#line 1138
 ncx_get_uint_double(const void *xp, double *ip)
+#line 1138
 {
+#line 1138
 	ix_uint xx;
+#line 1138
 	get_ix_uint(xp, &xx);
-	*ip = (double) xx;
-
+#line 1138
+	*ip = (double)xx;
+#line 1138
 	return NC_NOERR;
+#line 1138
 }
+#line 1138
 
 
 static int
-ncx_put_uint_schar(void *xp, const schar *ip)
+ncx_put_uint_schar(void *xp, const schar *ip, void *fillp)
 {
-	uchar *cp = (uchar *) xp;
-	*cp++ = 0x00;
-	*cp++ = 0x00;
-	*cp++ = 0x00;
-	*cp = (uchar)(signed)*ip;
+    uchar *cp;
+    if (*ip < 0) {
+#line 1149
 
-	if (*ip < 0) return NC_ERANGE;
+        return NC_ERANGE;
+    }
 
-	return NC_NOERR;
+    cp = (uchar *) xp;
+    *cp++ = 0x00;
+    *cp++ = 0x00;
+    *cp++ = 0x00;
+    *cp = (uchar)*ip;
+
+    return NC_NOERR;
 }
 
 static int
-ncx_put_uint_uchar(void *xp, const uchar *ip)
+ncx_put_uint_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0x00;
@@ -1549,128 +3551,387 @@ ncx_put_uint_uchar(void *xp, const uchar *ip)
 
 #if X_SIZEOF_UINT != SIZEOF_UINT
 static int
-ncx_put_uint_uint(void *xp, const uint *ip)
+#line 1174
+ncx_put_uint_uint(void *xp, const uint *ip, void *fillp)
+#line 1174
 {
+#line 1174
+    int err=NC_NOERR;
+#line 1174
 #if SIZEOF_IX_UINT == SIZEOF_UINT && IX_UINT_MAX == UINT_MAX
-	put_ix_uint(xp, (const ix_uint *)ip);
-	return NC_NOERR;
+#line 1174
+    put_ix_uint(xp, (const ix_uint *)ip);
+#line 1174
 #else
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
+#line 1174
+    ix_uint xx = NC_FILL_UINT;
+#line 1174
+
+#line 1174
 #if IX_UINT_MAX < UINT_MAX
-	if (*ip > IX_UINT_MAX) return NC_ERANGE;
+#line 1174
+    if (*ip > IX_UINT_MAX) {
+#line 1174
+        
+#line 1174
+        err = NC_ERANGE;
+#line 1174
+    } 
+#line 1174
 #endif
+#line 1174
+        xx = (ix_uint)*ip;
+#line 1174
 
+#line 1174
+    put_ix_uint(xp, &xx);
+#line 1174
 #endif
-	return NC_NOERR;
+#line 1174
+    return err;
+#line 1174
 }
+#line 1174
 
 #endif
 
 static int
-ncx_put_uint_short(void *xp, const short *ip)
+#line 1177
+ncx_put_uint_short(void *xp, const short *ip, void *fillp)
+#line 1177
 {
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
+#line 1177
+    int err=NC_NOERR;
+#line 1177
+    ix_uint xx = NC_FILL_UINT;
+#line 1177
+
+#line 1177
 #if IX_UINT_MAX < SHORT_MAX
-	if (*ip > IX_UINT_MAX) return NC_ERANGE;
-#endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 1177
+    if (*ip > IX_UINT_MAX) {
+#line 1177
+        
+#line 1177
+        err = NC_ERANGE;
+#line 1177
+    } 
+#line 1177
+#endif
+#line 1177
+    if (*ip < 0) {
+#line 1177
+        
+#line 1177
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 1177
+    } 
+#line 1177
+        xx = (ix_uint)*ip;
+#line 1177
+
+#line 1177
+    put_ix_uint(xp, &xx);
+#line 1177
+    return err;
+#line 1177
+}
+#line 1177
 
 static int
-ncx_put_uint_int(void *xp, const int *ip)
+#line 1178
+ncx_put_uint_int(void *xp, const int *ip, void *fillp)
+#line 1178
 {
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
+#line 1178
+    int err=NC_NOERR;
+#line 1178
+    ix_uint xx = NC_FILL_UINT;
+#line 1178
+
+#line 1178
 #if IX_UINT_MAX < INT_MAX
-	if (*ip > IX_UINT_MAX) return NC_ERANGE;
-#endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 1178
+    if (*ip > IX_UINT_MAX) {
+#line 1178
+        
+#line 1178
+        err = NC_ERANGE;
+#line 1178
+    } 
+#line 1178
+#endif
+#line 1178
+    if (*ip < 0) {
+#line 1178
+        
+#line 1178
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 1178
+    } 
+#line 1178
+        xx = (ix_uint)*ip;
+#line 1178
+
+#line 1178
+    put_ix_uint(xp, &xx);
+#line 1178
+    return err;
+#line 1178
+}
+#line 1178
+
+static int
+#line 1179
+ncx_put_uint_long(void *xp, const long *ip, void *fillp)
+#line 1179
+{
+#line 1179
+    int err=NC_NOERR;
+#line 1179
+    ix_uint xx = NC_FILL_UINT;
+#line 1179
+
+#line 1179
+#if IX_UINT_MAX < LONG_MAX
+#line 1179
+    if (*ip > IX_UINT_MAX) {
+#line 1179
+        
+#line 1179
+        err = NC_ERANGE;
+#line 1179
+    } 
+#line 1179
+#endif
+#line 1179
+    if (*ip < 0) {
+#line 1179
+        
+#line 1179
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 1179
+    } 
+#line 1179
+        xx = (ix_uint)*ip;
+#line 1179
+
+#line 1179
+    put_ix_uint(xp, &xx);
+#line 1179
+    return err;
+#line 1179
+}
+#line 1179
 
 static int
-ncx_put_uint_longlong(void *xp, const longlong *ip)
+#line 1180
+ncx_put_uint_longlong(void *xp, const longlong *ip, void *fillp)
+#line 1180
 {
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
+#line 1180
+    int err=NC_NOERR;
+#line 1180
+    ix_uint xx = NC_FILL_UINT;
+#line 1180
+
+#line 1180
 #if IX_UINT_MAX < LONGLONG_MAX
-	if (*ip > IX_UINT_MAX) return NC_ERANGE;
-#endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 1180
+    if (*ip > IX_UINT_MAX) {
+#line 1180
+        
+#line 1180
+        err = NC_ERANGE;
+#line 1180
+    } 
+#line 1180
+#endif
+#line 1180
+    if (*ip < 0) {
+#line 1180
+        
+#line 1180
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 1180
+    } 
+#line 1180
+        xx = (ix_uint)*ip;
+#line 1180
+
+#line 1180
+    put_ix_uint(xp, &xx);
+#line 1180
+    return err;
+#line 1180
+}
+#line 1180
 
 static int
-ncx_put_uint_ushort(void *xp, const ushort *ip)
+#line 1181
+ncx_put_uint_ushort(void *xp, const ushort *ip, void *fillp)
+#line 1181
 {
+#line 1181
+    int err=NC_NOERR;
+#line 1181
 #if SIZEOF_IX_UINT == SIZEOF_USHORT && IX_UINT_MAX == USHORT_MAX
-	put_ix_uint(xp, (const ix_uint *)ip);
-	return NC_NOERR;
+#line 1181
+    put_ix_uint(xp, (const ix_uint *)ip);
+#line 1181
 #else
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
-#if IX_UINT_MAX < USHORT_MAX
-	if (*ip > IX_UINT_MAX) return NC_ERANGE;
-#endif
+#line 1181
+    ix_uint xx = NC_FILL_UINT;
+#line 1181
 
-#endif
-	return NC_NOERR;
-}
+#line 1181
+#if IX_UINT_MAX < USHORT_MAX
+#line 1181
+    if (*ip > IX_UINT_MAX) {
+#line 1181
+        
+#line 1181
+        err = NC_ERANGE;
+#line 1181
+    } 
+#line 1181
+#endif
+#line 1181
+        xx = (ix_uint)*ip;
+#line 1181
+
+#line 1181
+    put_ix_uint(xp, &xx);
+#line 1181
+#endif
+#line 1181
+    return err;
+#line 1181
+}
+#line 1181
 
 static int
-ncx_put_uint_ulonglong(void *xp, const ulonglong *ip)
+#line 1182
+ncx_put_uint_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 1182
 {
+#line 1182
+    int err=NC_NOERR;
+#line 1182
 #if SIZEOF_IX_UINT == SIZEOF_ULONGLONG && IX_UINT_MAX == ULONGLONG_MAX
-	put_ix_uint(xp, (const ix_uint *)ip);
-	return NC_NOERR;
+#line 1182
+    put_ix_uint(xp, (const ix_uint *)ip);
+#line 1182
 #else
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
-#if IX_UINT_MAX < ULONGLONG_MAX
-	if (*ip > IX_UINT_MAX) return NC_ERANGE;
-#endif
+#line 1182
+    ix_uint xx = NC_FILL_UINT;
+#line 1182
 
-#endif
-	return NC_NOERR;
-}
+#line 1182
+#if IX_UINT_MAX < ULONGLONG_MAX
+#line 1182
+    if (*ip > IX_UINT_MAX) {
+#line 1182
+        
+#line 1182
+        err = NC_ERANGE;
+#line 1182
+    } 
+#line 1182
+#endif
+#line 1182
+        xx = (ix_uint)*ip;
+#line 1182
+
+#line 1182
+    put_ix_uint(xp, &xx);
+#line 1182
+#endif
+#line 1182
+    return err;
+#line 1182
+}
+#line 1182
 
 static int
-ncx_put_uint_float(void *xp, const float *ip)
-{
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
-	if(*ip > (double)X_UINT_MAX || *ip < 0) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 1183
+ncx_put_uint_float(void *xp, const float *ip, void *fillp)
+#line 1183
+{
+#line 1183
+    int err=NC_NOERR;
+#line 1183
+    ix_uint xx = NC_FILL_UINT;
+#line 1183
+
+#line 1183
+    if (*ip > (double)X_UINT_MAX || *ip < 0) {
+#line 1183
+        
+#line 1183
+        err = NC_ERANGE;
+#line 1183
+    } 
+#line 1183
+        xx = (ix_uint)*ip;
+#line 1183
+
+#line 1183
+    put_ix_uint(xp, &xx);
+#line 1183
+    return err;
+#line 1183
+}
+#line 1183
 
 static int
-ncx_put_uint_double(void *xp, const double *ip)
+#line 1184
+ncx_put_uint_double(void *xp, const double *ip, void *fillp)
+#line 1184
 {
-	ix_uint xx = (ix_uint)*ip;
-	put_ix_uint(xp, &xx);
-	if(*ip > X_UINT_MAX || *ip < 0) return NC_ERANGE;
-	return NC_NOERR;
+#line 1184
+    int err=NC_NOERR;
+#line 1184
+    ix_uint xx = NC_FILL_UINT;
+#line 1184
+
+#line 1184
+    if (*ip > X_UINT_MAX || *ip < 0) {
+#line 1184
+        
+#line 1184
+        err = NC_ERANGE;
+#line 1184
+    } 
+#line 1184
+        xx = (ix_uint)*ip;
+#line 1184
+
+#line 1184
+    put_ix_uint(xp, &xx);
+#line 1184
+    return err;
+#line 1184
 }
+#line 1184
+
 
 
-/* x_float -------------------------------------------------------------------*/
+/* external NC_FLOAT --------------------------------------------------------*/
 
 #if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT)
 
-static void
+inline static void
 get_ix_float(const void *xp, float *ip)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(ip, xp, sizeof(float));
+	(void) memcpy(ip, xp, SIZEOF_FLOAT);
 #else
 	swap4b(ip, xp);
 #endif
 }
 
-static void
+inline static void
 put_ix_float(void *xp, const float *ip)
 {
 #ifdef WORDS_BIGENDIAN
@@ -1680,7 +3941,7 @@ put_ix_float(void *xp, const float *ip)
 #endif
 }
 
-#elif vax
+#elif defined(vax) && vax != 0
 
 /* What IEEE single precision floating point looks like on a Vax */
 struct	ieee_single {
@@ -1715,105 +3976,196 @@ static struct sgl_limits min = {
 	{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }		/* Min IEEE */
 };
 
+#line 1298
 static void
 get_ix_float(const void *xp, float *ip)
 {
 		struct vax_single *const vsp = (struct vax_single *) ip;
+#line 1301
 		const struct ieee_single *const isp =
+#line 1301
 			 (const struct ieee_single *) xp;
+#line 1301
 		unsigned exp = isp->exp_hi << 1 | isp->exp_lo;
+#line 1301
 
+#line 1301
 		switch(exp) {
+#line 1301
 		case 0 :
+#line 1301
 			/* ieee subnormal */
-			if(isp->mant_hi == min.ieee.mant_hi
+#line 1301
+			if (isp->mant_hi == min.ieee.mant_hi
+#line 1301
 				&& isp->mant_lo_hi == min.ieee.mant_lo_hi
+#line 1301
 				&& isp->mant_lo_lo == min.ieee.mant_lo_lo)
+#line 1301
 			{
+#line 1301
 				*vsp = min.s;
+#line 1301
 			}
+#line 1301
 			else
+#line 1301
 			{
+#line 1301
 				unsigned mantissa = (isp->mant_hi << 16)
+#line 1301
 					 | isp->mant_lo_hi << 8
+#line 1301
 					 | isp->mant_lo_lo;
+#line 1301
 				unsigned tmp = mantissa >> 20;
-				if(tmp >= 4) {
+#line 1301
+				if (tmp >= 4) {
+#line 1301
 					vsp->exp = 2;
+#line 1301
 				} else if (tmp >= 2) {
+#line 1301
 					vsp->exp = 1;
+#line 1301
 				} else {
+#line 1301
 					*vsp = min.s;
+#line 1301
 					break;
+#line 1301
 				} /* else */
+#line 1301
 				tmp = mantissa - (1 << (20 + vsp->exp ));
+#line 1301
 				tmp <<= 3 - vsp->exp;
+#line 1301
 				vsp->mantissa2 = tmp;
+#line 1301
 				vsp->mantissa1 = (tmp >> 16);
+#line 1301
 			}
+#line 1301
 			break;
+#line 1301
 		case 0xfe :
+#line 1301
 		case 0xff :
+#line 1301
 			*vsp = max.s;
+#line 1301
 			break;
+#line 1301
 		default :
+#line 1301
 			vsp->exp = exp - IEEE_SNG_BIAS + VAX_SNG_BIAS;
+#line 1301
 			vsp->mantissa2 = isp->mant_lo_hi << 8 | isp->mant_lo_lo;
+#line 1301
 			vsp->mantissa1 = isp->mant_hi;
+#line 1301
 		}
+#line 1301
 
+#line 1301
 		vsp->sign = isp->sign;
+#line 1301
 
 }
 
+#line 1355
 
 static void
 put_ix_float(void *xp, const float *ip)
 {
 		const struct vax_single *const vsp =
+#line 1359
 			 (const struct vax_single *)ip;
+#line 1359
 		struct ieee_single *const isp = (struct ieee_single *) xp;
+#line 1359
 
+#line 1359
 		switch(vsp->exp){
+#line 1359
 		case 0 :
+#line 1359
 			/* all vax float with zero exponent map to zero */
+#line 1359
 			*isp = min.ieee;
+#line 1359
 			break;
+#line 1359
 		case 2 :
+#line 1359
 		case 1 :
+#line 1359
 		{
+#line 1359
 			/* These will map to subnormals */
+#line 1359
 			unsigned mantissa = (vsp->mantissa1 << 16)
+#line 1359
 					 | vsp->mantissa2;
+#line 1359
 			mantissa >>= 3 - vsp->exp;
+#line 1359
 			mantissa += (1 << (20 + vsp->exp));
+#line 1359
 			isp->mant_lo_lo = mantissa;
+#line 1359
 			isp->mant_lo_hi = mantissa >> 8;
+#line 1359
 			isp->mant_hi = mantissa >> 16;
+#line 1359
 			isp->exp_lo = 0;
+#line 1359
 			isp->exp_hi = 0;
+#line 1359
 		}
+#line 1359
 			break;
+#line 1359
 		case 0xff : /* max.s.exp */
-			if( vsp->mantissa2 == max.s.mantissa2
-				&& vsp->mantissa1 == max.s.mantissa1)
+#line 1359
+			if (vsp->mantissa2 == max.s.mantissa2 &&
+#line 1359
+			    vsp->mantissa1 == max.s.mantissa1)
+#line 1359
 			{
+#line 1359
 				/* map largest vax float to ieee infinity */
+#line 1359
 				*isp = max.ieee;
+#line 1359
 				break;
+#line 1359
 			} /* else, fall thru */
+#line 1359
 		default :
+#line 1359
 		{
+#line 1359
 			unsigned exp = vsp->exp - VAX_SNG_BIAS + IEEE_SNG_BIAS;
+#line 1359
 			isp->exp_hi = exp >> 1;
+#line 1359
 			isp->exp_lo = exp;
+#line 1359
 			isp->mant_lo_lo = vsp->mantissa2;
+#line 1359
 			isp->mant_lo_hi = vsp->mantissa2 >> 8;
+#line 1359
 			isp->mant_hi = vsp->mantissa1;
+#line 1359
 		}
+#line 1359
 		}
+#line 1359
 
+#line 1359
 		isp->sign = vsp->sign;
+#line 1359
 
 }
 
@@ -1873,57 +4225,96 @@ static const int cs_ieis_bias = 0x4000 - 0x7f;
 
 static const int cs_id_bias = 0x4000 - 0x3ff;
 
+#line 1494
 
 static void
 get_ix_float(const void *xp, float *ip)
 {
 
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		const ieee_single_hi *isp = (const ieee_single_hi *) xp;
 		cray_single *csp = (cray_single *) ip;
+#line 1502
 
-		if(isp->exp == 0)
+#line 1502
+		if (isp->exp == 0)
+#line 1502
 		{
+#line 1502
 			/* ieee subnormal */
+#line 1502
 			*ip = (double)isp->mant;
-			if(isp->mant != 0)
+#line 1502
+			if (isp->mant != 0)
+#line 1502
 			{
+#line 1502
 				csp->exp -= (ieee_single_bias + 22);
+#line 1502
 			}
+#line 1502
 		}
+#line 1502
 		else
+#line 1502
 		{
+#line 1502
 			csp->exp  = isp->exp + cs_ieis_bias + 1;
+#line 1502
 			csp->mant = isp->mant << (48 - 1 - 23);
+#line 1502
 			csp->mant |= (1 << (48 - 1));
+#line 1502
 		}
+#line 1502
 		csp->sign = isp->sign;
+#line 1502
 
+#line 1502
 
 	}
 	else
 	{
 		const ieee_single_lo *isp = (const ieee_single_lo *) xp;
 		cray_single *csp = (cray_single *) ip;
+#line 1507
 
-		if(isp->exp == 0)
+#line 1507
+		if (isp->exp == 0)
+#line 1507
 		{
+#line 1507
 			/* ieee subnormal */
+#line 1507
 			*ip = (double)isp->mant;
-			if(isp->mant != 0)
+#line 1507
+			if (isp->mant != 0)
+#line 1507
 			{
+#line 1507
 				csp->exp -= (ieee_single_bias + 22);
+#line 1507
 			}
+#line 1507
 		}
+#line 1507
 		else
+#line 1507
 		{
+#line 1507
 			csp->exp  = isp->exp + cs_ieis_bias + 1;
+#line 1507
 			csp->mant = isp->mant << (48 - 1 - 23);
+#line 1507
 			csp->mant |= (1 << (48 - 1));
+#line 1507
 		}
+#line 1507
 		csp->sign = isp->sign;
+#line 1507
 
+#line 1507
 
 	}
 }
@@ -1931,100 +4322,186 @@ get_ix_float(const void *xp, float *ip)
 static void
 put_ix_float(void *xp, const float *ip)
 {
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		ieee_single_hi *isp = (ieee_single_hi*)xp;
 	const cray_single *csp = (const cray_single *) ip;
+#line 1517
 	int ieee_exp = csp->exp - cs_ieis_bias -1;
+#line 1517
 
+#line 1517
 	isp->sign = csp->sign;
+#line 1517
 
-	if(ieee_exp >= 0xff)
+#line 1517
+	if (ieee_exp >= 0xff)
+#line 1517
 	{
+#line 1517
 		/* NC_ERANGE => ieee Inf */
+#line 1517
 		isp->exp = 0xff;
+#line 1517
 		isp->mant = 0x0;
+#line 1517
 	}
-	else if(ieee_exp > 0)
+#line 1517
+	else if (ieee_exp > 0)
+#line 1517
 	{
+#line 1517
 		/* normal ieee representation */
+#line 1517
 		isp->exp  = ieee_exp;
+#line 1517
 		/* assumes cray rep is in normal form */
+#line 1517
 		assert(csp->mant & 0x800000000000);
+#line 1517
 		isp->mant = (((csp->mant << 1) &
+#line 1517
 				0xffffffffffff) >> (48 - 23));
+#line 1517
 	}
-	else if(ieee_exp > -23)
+#line 1517
+	else if (ieee_exp > -23)
+#line 1517
 	{
+#line 1517
 		/* ieee subnormal, right shift */
+#line 1517
 		const int rshift = (48 - 23 - ieee_exp);
+#line 1517
 
+#line 1517
 		isp->mant = csp->mant >> rshift;
+#line 1517
 
+#line 1517
 #if 0
-		if(csp->mant & (1 << (rshift -1)))
+#line 1517
+		if (csp->mant & (1 << (rshift -1)))
+#line 1517
 		{
+#line 1517
 			/* round up */
+#line 1517
 			isp->mant++;
+#line 1517
 		}
+#line 1517
 #endif
+#line 1517
 
+#line 1517
 		isp->exp  = 0;
+#line 1517
 	}
+#line 1517
 	else
+#line 1517
 	{
+#line 1517
 		/* smaller than ieee can represent */
+#line 1517
 		isp->exp = 0;
+#line 1517
 		isp->mant = 0;
+#line 1517
 	}
+#line 1517
 
 	}
 	else
 	{
 		ieee_single_lo *isp = (ieee_single_lo*)xp;
 	const cray_single *csp = (const cray_single *) ip;
+#line 1522
 	int ieee_exp = csp->exp - cs_ieis_bias -1;
+#line 1522
 
+#line 1522
 	isp->sign = csp->sign;
+#line 1522
 
-	if(ieee_exp >= 0xff)
+#line 1522
+	if (ieee_exp >= 0xff)
+#line 1522
 	{
+#line 1522
 		/* NC_ERANGE => ieee Inf */
+#line 1522
 		isp->exp = 0xff;
+#line 1522
 		isp->mant = 0x0;
+#line 1522
 	}
-	else if(ieee_exp > 0)
+#line 1522
+	else if (ieee_exp > 0)
+#line 1522
 	{
+#line 1522
 		/* normal ieee representation */
+#line 1522
 		isp->exp  = ieee_exp;
+#line 1522
 		/* assumes cray rep is in normal form */
+#line 1522
 		assert(csp->mant & 0x800000000000);
+#line 1522
 		isp->mant = (((csp->mant << 1) &
+#line 1522
 				0xffffffffffff) >> (48 - 23));
+#line 1522
 	}
-	else if(ieee_exp > -23)
+#line 1522
+	else if (ieee_exp > -23)
+#line 1522
 	{
+#line 1522
 		/* ieee subnormal, right shift */
+#line 1522
 		const int rshift = (48 - 23 - ieee_exp);
+#line 1522
 
+#line 1522
 		isp->mant = csp->mant >> rshift;
+#line 1522
 
+#line 1522
 #if 0
-		if(csp->mant & (1 << (rshift -1)))
+#line 1522
+		if (csp->mant & (1 << (rshift -1)))
+#line 1522
 		{
+#line 1522
 			/* round up */
+#line 1522
 			isp->mant++;
+#line 1522
 		}
+#line 1522
 #endif
+#line 1522
 
+#line 1522
 		isp->exp  = 0;
+#line 1522
 	}
+#line 1522
 	else
+#line 1522
 	{
+#line 1522
 		/* smaller than ieee can represent */
+#line 1522
 		isp->exp = 0;
+#line 1522
 		isp->mant = 0;
+#line 1522
 	}
+#line 1522
 
 	}
 }
@@ -2037,10 +4514,10 @@ get_ix_float(const void *xp, float *ip)
 
 	ieee_double *idp = (ieee_double *) ip;
 
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		const ieee_single_hi *isp = (const ieee_single_hi *) xp;
-		if(isp->exp == 0 && isp->mant == 0)
+		if (isp->exp == 0 && isp->mant == 0)
 		{
 			idp->exp = 0;
 			idp->mant = 0;
@@ -2055,7 +4532,7 @@ get_ix_float(const void *xp, float *ip)
 	else
 	{
 		const ieee_single_lo *isp = (const ieee_single_lo *) xp;
-		if(isp->exp == 0 && isp->mant == 0)
+		if (isp->exp == 0 && isp->mant == 0)
 		{
 			idp->exp = 0;
 			idp->mant = 0;
@@ -2073,10 +4550,10 @@ static void
 put_ix_float(void *xp, const float *ip)
 {
 	const ieee_double *idp = (const ieee_double *) ip;
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		ieee_single_hi *isp = (ieee_single_hi*)xp;
-		if(idp->exp > (ieee_double_bias - ieee_single_bias))
+		if (idp->exp > (ieee_double_bias - ieee_single_bias))
 			isp->exp = idp->exp - (ieee_double_bias - ieee_single_bias);
 		else
 			isp->exp = 0;
@@ -2086,7 +4563,7 @@ put_ix_float(void *xp, const float *ip)
 	else
 	{
 		ieee_single_lo *isp = (ieee_single_lo*)xp;
-		if(idp->exp > (ieee_double_bias - ieee_single_bias))
+		if (idp->exp > (ieee_double_bias - ieee_single_bias))
 			isp->exp = idp->exp - (ieee_double_bias - ieee_single_bias);
 		else
 			isp->exp = 0;
@@ -2102,7 +4579,7 @@ put_ix_float(void *xp, const float *ip)
 
 #if X_SIZEOF_FLOAT != SIZEOF_FLOAT || defined(NO_IEEE_FLOAT)
 static int
-ncx_get_float_float(const void *xp, float *ip)
+ncx_get_float_float(const void *xp, float *ip, void *fillp)
 {
 	/* TODO */
 	get_ix_float(xp, ip);
@@ -2113,193 +4590,532 @@ ncx_get_float_float(const void *xp, float *ip)
 #define ix_float float
 
 static int
+#line 1609
 ncx_get_float_schar(const void *xp, schar *ip)
+#line 1609
 {
+#line 1609
 	ix_float xx;
+#line 1609
 	get_ix_float(xp, &xx);
-	*ip = (schar) xx;
-	if(xx > (double)SCHAR_MAX || xx < (double)SCHAR_MIN) return NC_ERANGE;
+#line 1609
+	if (xx > (double)SCHAR_MAX || xx < (double)SCHAR_MIN) {
+#line 1609
+            
+#line 1609
+            return NC_ERANGE;
+#line 1609
+        }
+#line 1609
+	*ip = (schar)xx;
+#line 1609
 	return NC_NOERR;
+#line 1609
 }
+#line 1609
 
 static int
+#line 1610
 ncx_get_float_short(const void *xp, short *ip)
+#line 1610
 {
+#line 1610
 	ix_float xx;
+#line 1610
 	get_ix_float(xp, &xx);
-	*ip = (short) xx;
-	if(xx > (double)SHORT_MAX || xx < (double)SHORT_MIN) return NC_ERANGE;
+#line 1610
+	if (xx > (double)SHORT_MAX || xx < (double)SHORT_MIN) {
+#line 1610
+            
+#line 1610
+            return NC_ERANGE;
+#line 1610
+        }
+#line 1610
+	*ip = (short)xx;
+#line 1610
 	return NC_NOERR;
+#line 1610
 }
+#line 1610
 
 static int
+#line 1611
 ncx_get_float_int(const void *xp, int *ip)
+#line 1611
 {
+#line 1611
 	ix_float xx;
+#line 1611
 	get_ix_float(xp, &xx);
-	*ip = (int) xx;
-	if(xx > (double)INT_MAX || xx < (double)INT_MIN) return NC_ERANGE;
+#line 1611
+	if (xx > (double)INT_MAX || xx < (double)INT_MIN) {
+#line 1611
+            
+#line 1611
+            return NC_ERANGE;
+#line 1611
+        }
+#line 1611
+	*ip = (int)xx;
+#line 1611
 	return NC_NOERR;
+#line 1611
 }
+#line 1611
 
 static int
-ncx_get_float_double(const void *xp, double *ip)
+#line 1612
+ncx_get_float_long(const void *xp, long *ip)
+#line 1612
 {
+#line 1612
 	ix_float xx;
+#line 1612
 	get_ix_float(xp, &xx);
-	*ip = (double) xx;
+#line 1612
+	if (xx > (double)LONG_MAX || xx < (double)LONG_MIN) {
+#line 1612
+            
+#line 1612
+            return NC_ERANGE;
+#line 1612
+        }
+#line 1612
+	*ip = (long)xx;
+#line 1612
+	return NC_NOERR;
+#line 1612
+}
+#line 1612
 
+static int
+#line 1613
+ncx_get_float_double(const void *xp, double *ip)
+#line 1613
+{
+#line 1613
+	ix_float xx;
+#line 1613
+	get_ix_float(xp, &xx);
+#line 1613
+	*ip = (double)xx;
+#line 1613
 	return NC_NOERR;
+#line 1613
 }
+#line 1613
 
 static int
+#line 1614
 ncx_get_float_longlong(const void *xp, longlong *ip)
+#line 1614
 {
+#line 1614
 	ix_float xx;
+#line 1614
 	get_ix_float(xp, &xx);
-	*ip = (longlong) xx;
-	if(xx > (double)LONGLONG_MAX || xx < (double)LONGLONG_MIN) return NC_ERANGE;
+#line 1614
+	if (xx == LONGLONG_MAX)      *ip = LONGLONG_MAX;
+#line 1614
+	else if (xx == LONGLONG_MIN) *ip = LONGLONG_MIN;
+#line 1614
+	else if (xx > (double)LONGLONG_MAX || xx < (double)LONGLONG_MIN) {
+#line 1614
+            
+#line 1614
+            return NC_ERANGE;
+#line 1614
+        }
+#line 1614
+	else *ip = (longlong)xx;
+#line 1614
 	return NC_NOERR;
+#line 1614
 }
+#line 1614
 
 static int
+#line 1615
 ncx_get_float_uchar(const void *xp, uchar *ip)
+#line 1615
 {
+#line 1615
 	ix_float xx;
+#line 1615
 	get_ix_float(xp, &xx);
-	*ip = (uchar) xx;
-	if(xx > (double)UCHAR_MAX || xx < 0) return NC_ERANGE;
+#line 1615
+	if (xx > (double)UCHAR_MAX || xx < 0) {
+#line 1615
+            
+#line 1615
+            return NC_ERANGE;
+#line 1615
+        }
+#line 1615
+	*ip = (uchar)xx;
+#line 1615
 	return NC_NOERR;
+#line 1615
 }
+#line 1615
 
 static int
+#line 1616
 ncx_get_float_ushort(const void *xp, ushort *ip)
+#line 1616
 {
+#line 1616
 	ix_float xx;
+#line 1616
 	get_ix_float(xp, &xx);
-	*ip = (ushort) xx;
-	if(xx > (double)USHORT_MAX || xx < 0) return NC_ERANGE;
+#line 1616
+	if (xx > (double)USHORT_MAX || xx < 0) {
+#line 1616
+            
+#line 1616
+            return NC_ERANGE;
+#line 1616
+        }
+#line 1616
+	*ip = (ushort)xx;
+#line 1616
 	return NC_NOERR;
+#line 1616
 }
+#line 1616
 
 static int
+#line 1617
 ncx_get_float_uint(const void *xp, uint *ip)
+#line 1617
 {
+#line 1617
 	ix_float xx;
+#line 1617
 	get_ix_float(xp, &xx);
-	*ip = (uint) xx;
-	if(xx > (double)UINT_MAX || xx < 0) return NC_ERANGE;
+#line 1617
+	if (xx > (double)UINT_MAX || xx < 0) {
+#line 1617
+            
+#line 1617
+            return NC_ERANGE;
+#line 1617
+        }
+#line 1617
+	*ip = (uint)xx;
+#line 1617
 	return NC_NOERR;
+#line 1617
 }
+#line 1617
 
 static int
+#line 1618
 ncx_get_float_ulonglong(const void *xp, ulonglong *ip)
+#line 1618
 {
+#line 1618
 	ix_float xx;
+#line 1618
 	get_ix_float(xp, &xx);
-	*ip = (ulonglong) xx;
-	if(xx > (double)ULONGLONG_MAX || xx < 0) return NC_ERANGE;
+#line 1618
+	if (xx == ULONGLONG_MAX)      *ip = ULONGLONG_MAX;
+#line 1618
+	else if (xx > (double)ULONGLONG_MAX || xx < 0) {
+#line 1618
+            
+#line 1618
+            return NC_ERANGE;
+#line 1618
+        }
+#line 1618
+	else *ip = (ulonglong)xx;
+#line 1618
 	return NC_NOERR;
+#line 1618
 }
+#line 1618
 
 
 #if X_SIZEOF_FLOAT != SIZEOF_FLOAT || defined(NO_IEEE_FLOAT)
 static int
-ncx_put_float_float(void *xp, const float *ip)
+ncx_put_float_float(void *xp, const float *ip, void *fillp)
 {
-	put_ix_float(xp, ip);
+    int err=NC_NOERR;
+    float *_ip=ip;
 #ifdef NO_IEEE_FLOAT
-	if(*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN)
-		return NC_ERANGE;
+    
+    if (*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN) {
+        
+        
+        err = NC_ERANGE;
+    }
 #endif
-	return NC_NOERR;
+    put_ix_float(xp, _ip);
+    return err;
 }
 #endif
 
 static int
-ncx_put_float_schar(void *xp, const schar *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1639
+ncx_put_float_schar(void *xp, const schar *ip, void *fillp)
+#line 1639
+{
+#line 1639
+    int err=NC_NOERR;
+#line 1639
+    ix_float xx = NC_FILL_FLOAT;
+#line 1639
+
+#line 1639
+    
+#line 1639
+        xx = (ix_float)*ip;
+#line 1639
+
+#line 1639
+    put_ix_float(xp, &xx);
+#line 1639
+    return err;
+#line 1639
+}
+#line 1639
 
 static int
-ncx_put_float_short(void *xp, const short *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1640
+ncx_put_float_short(void *xp, const short *ip, void *fillp)
+#line 1640
+{
+#line 1640
+    int err=NC_NOERR;
+#line 1640
+    ix_float xx = NC_FILL_FLOAT;
+#line 1640
+
+#line 1640
+    
+#line 1640
+        xx = (ix_float)*ip;
+#line 1640
+
+#line 1640
+    put_ix_float(xp, &xx);
+#line 1640
+    return err;
+#line 1640
+}
+#line 1640
 
 static int
-ncx_put_float_int(void *xp, const int *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1641
+ncx_put_float_int(void *xp, const int *ip, void *fillp)
+#line 1641
+{
+#line 1641
+    int err=NC_NOERR;
+#line 1641
+    ix_float xx = NC_FILL_FLOAT;
+#line 1641
+
+#line 1641
+    
+#line 1641
+        xx = (ix_float)*ip;
+#line 1641
+
+#line 1641
+    put_ix_float(xp, &xx);
+#line 1641
+    return err;
+#line 1641
+}
+#line 1641
 
 static int
-ncx_put_float_double(void *xp, const double *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
-	if(*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 1642
+ncx_put_float_long(void *xp, const long *ip, void *fillp)
+#line 1642
+{
+#line 1642
+    int err=NC_NOERR;
+#line 1642
+    ix_float xx = NC_FILL_FLOAT;
+#line 1642
+
+#line 1642
+    
+#line 1642
+        xx = (ix_float)*ip;
+#line 1642
+
+#line 1642
+    put_ix_float(xp, &xx);
+#line 1642
+    return err;
+#line 1642
+}
+#line 1642
 
 static int
-ncx_put_float_longlong(void *xp, const longlong *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1643
+ncx_put_float_double(void *xp, const double *ip, void *fillp)
+#line 1643
+{
+#line 1643
+    int err=NC_NOERR;
+#line 1643
+    ix_float xx = NC_FILL_FLOAT;
+#line 1643
+
+#line 1643
+    if (*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN) {
+#line 1643
+        
+#line 1643
+        err = NC_ERANGE;
+#line 1643
+    } 
+#line 1643
+        xx = (ix_float)*ip;
+#line 1643
+
+#line 1643
+    put_ix_float(xp, &xx);
+#line 1643
+    return err;
+#line 1643
+}
+#line 1643
 
 static int
-ncx_put_float_uchar(void *xp, const uchar *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1644
+ncx_put_float_longlong(void *xp, const longlong *ip, void *fillp)
+#line 1644
+{
+#line 1644
+    int err=NC_NOERR;
+#line 1644
+    ix_float xx = NC_FILL_FLOAT;
+#line 1644
+
+#line 1644
+    
+#line 1644
+        xx = (ix_float)*ip;
+#line 1644
+
+#line 1644
+    put_ix_float(xp, &xx);
+#line 1644
+    return err;
+#line 1644
+}
+#line 1644
 
 static int
-ncx_put_float_ushort(void *xp, const ushort *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1645
+ncx_put_float_uchar(void *xp, const uchar *ip, void *fillp)
+#line 1645
+{
+#line 1645
+    int err=NC_NOERR;
+#line 1645
+    ix_float xx = NC_FILL_FLOAT;
+#line 1645
+
+#line 1645
+    
+#line 1645
+        xx = (ix_float)*ip;
+#line 1645
+
+#line 1645
+    put_ix_float(xp, &xx);
+#line 1645
+    return err;
+#line 1645
+}
+#line 1645
 
 static int
-ncx_put_float_uint(void *xp, const uint *ip)
-{
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
+#line 1646
+ncx_put_float_ushort(void *xp, const ushort *ip, void *fillp)
+#line 1646
+{
+#line 1646
+    int err=NC_NOERR;
+#line 1646
+    ix_float xx = NC_FILL_FLOAT;
+#line 1646
+
+#line 1646
+    
+#line 1646
+        xx = (ix_float)*ip;
+#line 1646
+
+#line 1646
+    put_ix_float(xp, &xx);
+#line 1646
+    return err;
+#line 1646
+}
+#line 1646
 
-	return NC_NOERR;
-}
+static int
+#line 1647
+ncx_put_float_uint(void *xp, const uint *ip, void *fillp)
+#line 1647
+{
+#line 1647
+    int err=NC_NOERR;
+#line 1647
+    ix_float xx = NC_FILL_FLOAT;
+#line 1647
+
+#line 1647
+    
+#line 1647
+        xx = (ix_float)*ip;
+#line 1647
+
+#line 1647
+    put_ix_float(xp, &xx);
+#line 1647
+    return err;
+#line 1647
+}
+#line 1647
 
 static int
-ncx_put_float_ulonglong(void *xp, const ulonglong *ip)
+#line 1648
+ncx_put_float_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 1648
 {
-	ix_float xx = (ix_float)*ip;
-	put_ix_float(xp, &xx);
+#line 1648
+    int err=NC_NOERR;
+#line 1648
+    ix_float xx = NC_FILL_FLOAT;
+#line 1648
 
-	return NC_NOERR;
+#line 1648
+    
+#line 1648
+        xx = (ix_float)*ip;
+#line 1648
+
+#line 1648
+    put_ix_float(xp, &xx);
+#line 1648
+    return err;
+#line 1648
 }
+#line 1648
 
 
 
-/* x_double ------------------------------------------------------------------*/
+/* external NC_DOUBLE -------------------------------------------------------*/
 
 #if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE  && !defined(NO_IEEE_FLOAT)
 
@@ -2307,7 +5123,7 @@ static void
 get_ix_double(const void *xp, double *ip)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(ip, xp, sizeof(double));
+	(void) memcpy(ip, xp, SIZEOF_DOUBLE);
 #else
 	swap8b(ip, xp);
 #endif
@@ -2323,7 +5139,7 @@ put_ix_double(void *xp, const double *ip)
 #endif
 }
 
-#elif vax
+#elif defined(vax) && vax != 0
 
 /* What IEEE double precision floating point looks like on a Vax */
 struct	ieee_double {
@@ -2362,116 +5178,218 @@ static const struct dbl_limits {
 };
 
 
+#line 1762
 static void
 get_ix_double(const void *xp, double *ip)
 {
 	struct vax_double *const vdp =
+#line 1765
 			 (struct vax_double *)ip;
+#line 1765
 	const struct ieee_double *const idp =
+#line 1765
 			 (const struct ieee_double *) xp;
+#line 1765
 	{
+#line 1765
 		const struct dbl_limits *lim;
+#line 1765
 		int ii;
+#line 1765
 		for (ii = 0, lim = dbl_limits;
+#line 1765
 			ii < sizeof(dbl_limits)/sizeof(struct dbl_limits);
+#line 1765
 			ii++, lim++)
+#line 1765
 		{
+#line 1765
 			if ((idp->mant_lo == lim->ieee.mant_lo)
+#line 1765
 				&& (idp->mant_4 == lim->ieee.mant_4)
+#line 1765
 				&& (idp->mant_5 == lim->ieee.mant_5)
+#line 1765
 				&& (idp->mant_6 == lim->ieee.mant_6)
+#line 1765
 				&& (idp->exp_lo == lim->ieee.exp_lo)
+#line 1765
 				&& (idp->exp_hi == lim->ieee.exp_hi)
+#line 1765
 				)
+#line 1765
 			{
+#line 1765
 				*vdp = lim->d;
+#line 1765
 				goto doneit;
+#line 1765
 			}
+#line 1765
 		}
+#line 1765
 	}
+#line 1765
 	{
+#line 1765
 		unsigned exp = idp->exp_hi << 4 | idp->exp_lo;
+#line 1765
 		vdp->exp = exp - IEEE_DBL_BIAS + VAX_DBL_BIAS;
+#line 1765
 	}
+#line 1765
 	{
+#line 1765
 		unsigned mant_hi = ((idp->mant_6 << 16)
+#line 1765
 				 | (idp->mant_5 << 8)
+#line 1765
 				 | idp->mant_4);
+#line 1765
 		unsigned mant_lo = SWAP4(idp->mant_lo);
+#line 1765
 		vdp->mantissa1 = (mant_hi >> 13);
+#line 1765
 		vdp->mantissa2 = ((mant_hi & MASK(13)) << 3)
+#line 1765
 				| (mant_lo >> 29);
+#line 1765
 		vdp->mantissa3 = (mant_lo >> 13);
+#line 1765
 		vdp->mantissa4 = (mant_lo << 3);
+#line 1765
 	}
+#line 1765
 	doneit:
+#line 1765
 		vdp->sign = idp->sign;
+#line 1765
 
 }
 
 
+#line 1835
 static void
 put_ix_double(void *xp, const double *ip)
 {
 	const struct vax_double *const vdp =
+#line 1838
 			(const struct vax_double *)ip;
+#line 1838
 	struct ieee_double *const idp =
+#line 1838
 			 (struct ieee_double *) xp;
+#line 1838
 
+#line 1838
 	if ((vdp->mantissa4 > (dbl_limits[0].d.mantissa4 - 3)) &&
+#line 1838
 		(vdp->mantissa3 == dbl_limits[0].d.mantissa3) &&
+#line 1838
 		(vdp->mantissa2 == dbl_limits[0].d.mantissa2) &&
+#line 1838
 		(vdp->mantissa1 == dbl_limits[0].d.mantissa1) &&
+#line 1838
 		(vdp->exp == dbl_limits[0].d.exp))
+#line 1838
 	{
+#line 1838
 		*idp = dbl_limits[0].ieee;
+#line 1838
 		goto shipit;
+#line 1838
 	}
+#line 1838
 	if ((vdp->mantissa4 == dbl_limits[1].d.mantissa4) &&
+#line 1838
 		(vdp->mantissa3 == dbl_limits[1].d.mantissa3) &&
+#line 1838
 		(vdp->mantissa2 == dbl_limits[1].d.mantissa2) &&
+#line 1838
 		(vdp->mantissa1 == dbl_limits[1].d.mantissa1) &&
+#line 1838
 		(vdp->exp == dbl_limits[1].d.exp))
+#line 1838
 	{
+#line 1838
 		*idp = dbl_limits[1].ieee;
+#line 1838
 		goto shipit;
+#line 1838
 	}
+#line 1838
 
+#line 1838
 	{
+#line 1838
 		unsigned exp = vdp->exp - VAX_DBL_BIAS + IEEE_DBL_BIAS;
+#line 1838
 
+#line 1838
 		unsigned mant_lo = ((vdp->mantissa2 & MASK(3)) << 29) |
+#line 1838
 			(vdp->mantissa3 << 13) |
+#line 1838
 			((vdp->mantissa4 >> 3) & MASK(13));
+#line 1838
 
+#line 1838
 		unsigned mant_hi = (vdp->mantissa1 << 13)
+#line 1838
 				 | (vdp->mantissa2 >> 3);
+#line 1838
 
-		if((vdp->mantissa4 & 7) > 4)
+#line 1838
+		if ((vdp->mantissa4 & 7) > 4)
+#line 1838
 		{
+#line 1838
 			/* round up */
+#line 1838
 			mant_lo++;
-			if(mant_lo == 0)
+#line 1838
+			if (mant_lo == 0)
+#line 1838
 			{
+#line 1838
 				mant_hi++;
-				if(mant_hi > 0xffffff)
+#line 1838
+				if (mant_hi > 0xffffff)
+#line 1838
 				{
+#line 1838
 					mant_hi = 0;
+#line 1838
 					exp++;
+#line 1838
 				}
+#line 1838
 			}
+#line 1838
 		}
+#line 1838
 
+#line 1838
 		idp->mant_lo = SWAP4(mant_lo);
+#line 1838
 		idp->mant_6 = mant_hi >> 16;
+#line 1838
 		idp->mant_5 = (mant_hi & 0xff00) >> 8;
+#line 1838
 		idp->mant_4 = mant_hi;
+#line 1838
 		idp->exp_hi = exp >> 4;
+#line 1838
 		idp->exp_lo = exp;
+#line 1838
 	}
+#line 1838
 
+#line 1838
 	shipit:
+#line 1838
 		idp->sign = vdp->sign;
+#line 1838
 
 }
 
@@ -2484,11 +5402,11 @@ get_ix_double(const void *xp, double *ip)
 	const ieee_double *idp = (const ieee_double *) xp;
 	cray_single *csp = (cray_single *) ip;
 
-	if(idp->exp == 0)
+	if (idp->exp == 0)
 	{
 		/* ieee subnormal */
 		*ip = (double)idp->mant;
-		if(idp->mant != 0)
+		if (idp->mant != 0)
 		{
 			csp->exp -= (ieee_double_bias + 51);
 		}
@@ -2512,13 +5430,13 @@ put_ix_double(void *xp, const double *ip)
 
 	idp->sign = csp->sign;
 
-	if(ieee_exp >= 0x7ff)
+	if (ieee_exp >= 0x7ff)
 	{
 		/* NC_ERANGE => ieee Inf */
 		idp->exp = 0x7ff;
 		idp->mant = 0x0;
 	}
-	else if(ieee_exp > 0)
+	else if (ieee_exp > 0)
 	{
 		/* normal ieee representation */
 		idp->exp  = ieee_exp;
@@ -2527,14 +5445,14 @@ put_ix_double(void *xp, const double *ip)
 		idp->mant = (((csp->mant << 1) &
 				0xffffffffffff) << (52 - 48));
 	}
-	else if(ieee_exp >= (-(52 -48)))
+	else if (ieee_exp >= (-(52 -48)))
 	{
 		/* ieee subnormal, left shift */
 		const int lshift = (52 - 48) + ieee_exp;
 		idp->mant = csp->mant << lshift;
 		idp->exp  = 0;
 	}
-	else if(ieee_exp >= -52)
+	else if (ieee_exp >= -52)
 	{
 		/* ieee subnormal, right shift */
 		const int rshift = (- (52 - 48) - ieee_exp);
@@ -2542,7 +5460,7 @@ put_ix_double(void *xp, const double *ip)
 		idp->mant = csp->mant >> rshift;
 
 #if 0
-		if(csp->mant & (1 << (rshift -1)))
+		if (csp->mant & (1 << (rshift -1)))
 		{
 			/* round up */
 			idp->mant++;
@@ -2565,109 +5483,257 @@ put_ix_double(void *xp, const double *ip)
 #define ix_double double
 
 static int
+#line 1930
 ncx_get_double_schar(const void *xp, schar *ip)
+#line 1930
 {
+#line 1930
 	ix_double xx;
+#line 1930
 	get_ix_double(xp, &xx);
-	*ip = (schar) xx;
-	if(xx > SCHAR_MAX || xx < SCHAR_MIN) return NC_ERANGE;
+#line 1930
+	if (xx > (double)SCHAR_MAX || xx < (double)SCHAR_MIN) {
+#line 1930
+            
+#line 1930
+            return NC_ERANGE;
+#line 1930
+        }
+#line 1930
+	*ip = (schar)xx;
+#line 1930
 	return NC_NOERR;
+#line 1930
 }
+#line 1930
 
 static int
+#line 1931
 ncx_get_double_short(const void *xp, short *ip)
+#line 1931
 {
+#line 1931
 	ix_double xx;
+#line 1931
 	get_ix_double(xp, &xx);
-	*ip = (short) xx;
-	if(xx > SHORT_MAX || xx < SHORT_MIN) return NC_ERANGE;
+#line 1931
+	if (xx > (double)SHORT_MAX || xx < (double)SHORT_MIN) {
+#line 1931
+            
+#line 1931
+            return NC_ERANGE;
+#line 1931
+        }
+#line 1931
+	*ip = (short)xx;
+#line 1931
 	return NC_NOERR;
+#line 1931
 }
+#line 1931
 
 static int
+#line 1932
 ncx_get_double_int(const void *xp, int *ip)
+#line 1932
+{
+#line 1932
+	ix_double xx;
+#line 1932
+	get_ix_double(xp, &xx);
+#line 1932
+	if (xx > (double)INT_MAX || xx < (double)INT_MIN) {
+#line 1932
+            
+#line 1932
+            return NC_ERANGE;
+#line 1932
+        }
+#line 1932
+	*ip = (int)xx;
+#line 1932
+	return NC_NOERR;
+#line 1932
+}
+#line 1932
+
+static int
+#line 1933
+ncx_get_double_long(const void *xp, long *ip)
+#line 1933
 {
+#line 1933
 	ix_double xx;
+#line 1933
 	get_ix_double(xp, &xx);
-	*ip = (int) xx;
-	if(xx > INT_MAX || xx < INT_MIN) return NC_ERANGE;
+#line 1933
+	if (xx > (double)LONG_MAX || xx < (double)LONG_MIN) {
+#line 1933
+            
+#line 1933
+            return NC_ERANGE;
+#line 1933
+        }
+#line 1933
+	*ip = (long)xx;
+#line 1933
 	return NC_NOERR;
+#line 1933
 }
+#line 1933
 
 static int
+#line 1934
 ncx_get_double_longlong(const void *xp, longlong *ip)
+#line 1934
 {
+#line 1934
 	ix_double xx;
+#line 1934
 	get_ix_double(xp, &xx);
-	*ip = (longlong) xx;
-	if(xx > LONGLONG_MAX || xx < LONGLONG_MIN) return NC_ERANGE;
+#line 1934
+	if (xx == LONGLONG_MAX)      *ip = LONGLONG_MAX;
+#line 1934
+	else if (xx == LONGLONG_MIN) *ip = LONGLONG_MIN;
+#line 1934
+	else if (xx > (double)LONGLONG_MAX || xx < (double)LONGLONG_MIN) {
+#line 1934
+            
+#line 1934
+            return NC_ERANGE;
+#line 1934
+        }
+#line 1934
+	else *ip = (longlong)xx;
+#line 1934
 	return NC_NOERR;
+#line 1934
 }
+#line 1934
 
 static int
+#line 1935
 ncx_get_double_uchar(const void *xp, uchar *ip)
+#line 1935
 {
+#line 1935
 	ix_double xx;
+#line 1935
 	get_ix_double(xp, &xx);
-	*ip = (uchar) xx;
-	if(xx > UCHAR_MAX || xx < 0) return NC_ERANGE;
+#line 1935
+	if (xx > (double)UCHAR_MAX || xx < 0) {
+#line 1935
+            
+#line 1935
+            return NC_ERANGE;
+#line 1935
+        }
+#line 1935
+	*ip = (uchar)xx;
+#line 1935
 	return NC_NOERR;
+#line 1935
 }
+#line 1935
 
 static int
+#line 1936
 ncx_get_double_ushort(const void *xp, ushort *ip)
+#line 1936
 {
+#line 1936
 	ix_double xx;
+#line 1936
 	get_ix_double(xp, &xx);
-	*ip = (ushort) xx;
-	if(xx > USHORT_MAX || xx < 0) return NC_ERANGE;
+#line 1936
+	if (xx > (double)USHORT_MAX || xx < 0) {
+#line 1936
+            
+#line 1936
+            return NC_ERANGE;
+#line 1936
+        }
+#line 1936
+	*ip = (ushort)xx;
+#line 1936
 	return NC_NOERR;
+#line 1936
 }
+#line 1936
 
 static int
+#line 1937
 ncx_get_double_uint(const void *xp, uint *ip)
+#line 1937
 {
+#line 1937
 	ix_double xx;
+#line 1937
 	get_ix_double(xp, &xx);
-	*ip = (uint) xx;
-	if(xx > UINT_MAX || xx < 0) return NC_ERANGE;
+#line 1937
+	if (xx > (double)UINT_MAX || xx < 0) {
+#line 1937
+            
+#line 1937
+            return NC_ERANGE;
+#line 1937
+        }
+#line 1937
+	*ip = (uint)xx;
+#line 1937
 	return NC_NOERR;
+#line 1937
 }
+#line 1937
 
-
-int
-ncx_get_double_ulonglong(const void *xp, unsigned long long *ip)
+static int
+#line 1938
+ncx_get_double_ulonglong(const void *xp, ulonglong *ip)
+#line 1938
 {
-	double xx;
+#line 1938
+	ix_double xx;
+#line 1938
 	get_ix_double(xp, &xx);
-	*ip = (unsigned long long) xx;
-	if(xx > ULONG_LONG_MAX || xx < 0)
-		return NC_ERANGE;
+#line 1938
+	if (xx == ULONGLONG_MAX)      *ip = ULONGLONG_MAX;
+#line 1938
+	else if (xx > (double)ULONGLONG_MAX || xx < 0) {
+#line 1938
+            
+#line 1938
+            return NC_ERANGE;
+#line 1938
+        }
+#line 1938
+	else *ip = (ulonglong)xx;
+#line 1938
 	return NC_NOERR;
+#line 1938
 }
+#line 1938
+
 
 static int
 ncx_get_double_float(const void *xp, float *ip)
 {
-	double xx;
-	get_ix_double(xp, &xx);
-	if(xx > FLT_MAX)
-	{
-		*ip = FLT_MAX;
-		return NC_ERANGE;
-	}
-	if(xx < (-FLT_MAX))
-	{
-		*ip = (-FLT_MAX);
-		return NC_ERANGE;
-	}
-	*ip = (float) xx;
-	return NC_NOERR;
+    double xx;
+    get_ix_double(xp, &xx);
+    if (xx > FLT_MAX) {
+        *ip = FLT_MAX;
+        return NC_ERANGE;
+    }
+    if (xx < (-FLT_MAX)) {
+        *ip = (-FLT_MAX);
+        return NC_ERANGE;
+    }
+    *ip = (float) xx;
+    return NC_NOERR;
 }
 
 #if X_SIZEOF_DOUBLE != SIZEOF_DOUBLE  || defined(NO_IEEE_FLOAT)
 static int
-ncx_get_double_double(const void *xp, double *ip)
+ncx_get_double_double(const void *xp, double *ip, void *fillp)
 {
 	/* TODO */
 	get_ix_double(xp, ip);
@@ -2676,750 +5742,2058 @@ ncx_get_double_double(const void *xp, double *ip)
 #endif
 
 static int
-ncx_put_double_schar(void *xp, const schar *ip)
-{
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1967
+ncx_put_double_schar(void *xp, const schar *ip, void *fillp)
+#line 1967
+{
+#line 1967
+    int err=NC_NOERR;
+#line 1967
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1967
+
+#line 1967
+    
+#line 1967
+        xx = (ix_double)*ip;
+#line 1967
+
+#line 1967
+    put_ix_double(xp, &xx);
+#line 1967
+    return err;
+#line 1967
+}
+#line 1967
 
 static int
-ncx_put_double_uchar(void *xp, const uchar *ip)
-{
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1968
+ncx_put_double_uchar(void *xp, const uchar *ip, void *fillp)
+#line 1968
+{
+#line 1968
+    int err=NC_NOERR;
+#line 1968
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1968
+
+#line 1968
+    
+#line 1968
+        xx = (ix_double)*ip;
+#line 1968
+
+#line 1968
+    put_ix_double(xp, &xx);
+#line 1968
+    return err;
+#line 1968
+}
+#line 1968
 
 static int
-ncx_put_double_short(void *xp, const short *ip)
-{
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1969
+ncx_put_double_short(void *xp, const short *ip, void *fillp)
+#line 1969
+{
+#line 1969
+    int err=NC_NOERR;
+#line 1969
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1969
+
+#line 1969
+    
+#line 1969
+        xx = (ix_double)*ip;
+#line 1969
+
+#line 1969
+    put_ix_double(xp, &xx);
+#line 1969
+    return err;
+#line 1969
+}
+#line 1969
 
 static int
-ncx_put_double_ushort(void *xp, const ushort *ip)
-{
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1970
+ncx_put_double_ushort(void *xp, const ushort *ip, void *fillp)
+#line 1970
+{
+#line 1970
+    int err=NC_NOERR;
+#line 1970
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1970
+
+#line 1970
+    
+#line 1970
+        xx = (ix_double)*ip;
+#line 1970
+
+#line 1970
+    put_ix_double(xp, &xx);
+#line 1970
+    return err;
+#line 1970
+}
+#line 1970
 
 static int
-ncx_put_double_int(void *xp, const int *ip)
-{
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1971
+ncx_put_double_int(void *xp, const int *ip, void *fillp)
+#line 1971
+{
+#line 1971
+    int err=NC_NOERR;
+#line 1971
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1971
+
+#line 1971
+    
+#line 1971
+        xx = (ix_double)*ip;
+#line 1971
+
+#line 1971
+    put_ix_double(xp, &xx);
+#line 1971
+    return err;
+#line 1971
+}
+#line 1971
 
 static int
-ncx_put_double_uint(void *xp, const uint *ip)
-{
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
-
-	return NC_NOERR;
-}
+#line 1972
+ncx_put_double_long(void *xp, const long *ip, void *fillp)
+#line 1972
+{
+#line 1972
+    int err=NC_NOERR;
+#line 1972
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1972
+
+#line 1972
+    
+#line 1972
+        xx = (ix_double)*ip;
+#line 1972
+
+#line 1972
+    put_ix_double(xp, &xx);
+#line 1972
+    return err;
+#line 1972
+}
+#line 1972
 
 static int
-ncx_put_double_longlong(void *xp, const longlong *ip)
-{
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
+#line 1973
+ncx_put_double_uint(void *xp, const uint *ip, void *fillp)
+#line 1973
+{
+#line 1973
+    int err=NC_NOERR;
+#line 1973
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1973
+
+#line 1973
+    
+#line 1973
+        xx = (ix_double)*ip;
+#line 1973
+
+#line 1973
+    put_ix_double(xp, &xx);
+#line 1973
+    return err;
+#line 1973
+}
+#line 1973
 
-	return NC_NOERR;
-}
+static int
+#line 1974
+ncx_put_double_longlong(void *xp, const longlong *ip, void *fillp)
+#line 1974
+{
+#line 1974
+    int err=NC_NOERR;
+#line 1974
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1974
+
+#line 1974
+    
+#line 1974
+        xx = (ix_double)*ip;
+#line 1974
+
+#line 1974
+    put_ix_double(xp, &xx);
+#line 1974
+    return err;
+#line 1974
+}
+#line 1974
 
 static int
-ncx_put_double_ulonglong(void *xp, const ulonglong *ip)
+#line 1975
+ncx_put_double_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 1975
 {
-	ix_double xx = (ix_double)*ip;
-	put_ix_double(xp, &xx);
+#line 1975
+    int err=NC_NOERR;
+#line 1975
+    ix_double xx = NC_FILL_DOUBLE;
+#line 1975
 
-	return NC_NOERR;
+#line 1975
+    
+#line 1975
+        xx = (ix_double)*ip;
+#line 1975
+
+#line 1975
+    put_ix_double(xp, &xx);
+#line 1975
+    return err;
+#line 1975
 }
+#line 1975
 
 
 static int
-ncx_put_double_float(void *xp, const float *ip)
+ncx_put_double_float(void *xp, const float *ip, void *fillp)
 {
-	double xx = (double) *ip;
-	put_ix_double(xp, &xx);
-#if 1	/* TODO: figure this out */
-	if((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN)
-		return NC_ERANGE;
+    int err=NC_NOERR;
+    double xx = NC_FILL_DOUBLE;
+#if 1	/* TODO: figure this out (if condition below will never be true)*/
+    if ((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN) {
+        
+        err = NC_ERANGE;
+    } 
 #endif
-	return NC_NOERR;
+        xx = (double) *ip;
+
+    put_ix_double(xp, &xx);
+    return err;
 }
 
 #if X_SIZEOF_DOUBLE != SIZEOF_DOUBLE  || defined(NO_IEEE_FLOAT)
 static int
-ncx_put_double_double(void *xp, const double *ip)
+ncx_put_double_double(void *xp, const double *ip, void *fillp)
 {
-	put_ix_double(xp, ip);
+    int err=NC_NOERR;
+    double *_ip = ip;
 #ifdef NO_IEEE_FLOAT
-	if(*ip > X_DOUBLE_MAX || *ip < X_DOUBLE_MIN)
-		return NC_ERANGE;
+    
+    if (*ip > X_DOUBLE_MAX || *ip < X_DOUBLE_MIN) {
+        
+        
+        err = NC_ERANGE;
+    }
 #endif
-	return NC_NOERR;
+    put_ix_double(xp, _ip);
+    return err;
 }
 #endif
 
 
-/* x_longlong ---------------------------------------------------------------------*/
+/* external NC_INT64 --------------------------------------------------------*/
 
-#if SHORT_MAX == X_LONGLONG_MAX
-typedef short ix_longlong;
-#define SIZEOF_IX_LONGLONG SIZEOF_SHORT
-#define IX_LONGLONG_MAX SHORT_MAX
-#elif LONG_LONG_MAX  >= X_LONGLONG_MAX
-typedef longlong ix_longlong;
-#define SIZEOF_IX_LONGLONG SIZEOF_LONGLONG
-#define IX_LONGLONG_MAX LONG_LONG_MAX
-#elif LONG_MAX  >= X_LONGLONG_MAX
-typedef long ix_longlong;
-#define SIZEOF_IX_LONGLONG SIZEOF_LONG
-#define IX_LONGLONG_MAX LONG_MAX
+#if SHORT_MAX == X_INT64_MAX
+typedef short ix_int64;
+#define SIZEOF_IX_INT64 SIZEOF_SHORT
+#define IX_INT64_MAX SHORT_MAX
+#elif LONG_LONG_MAX  >= X_INT64_MAX
+typedef longlong ix_int64;
+#define SIZEOF_IX_INT64 SIZEOF_LONGLONG
+#define IX_INT64_MAX LONG_LONG_MAX
+#elif LONG_MAX  >= X_INT64_MAX
+typedef long ix_int64;
+#define SIZEOF_IX_INT64 SIZEOF_LONG
+#define IX_INT64_MAX LONG_MAX
 #else
-#error "ix_longlong implementation"
+#error "ix_int64 implementation"
 #endif
 
 
 static void
-get_ix_longlong(const void *xp, ix_longlong *ip)
+get_ix_int64(const void *xp, ix_int64 *ip)
 {
     const uchar *cp = (const uchar *) xp;
 
-    *ip  = ((long long)(*cp++) << 56);
-    *ip |= ((long long)(*cp++) << 48);
-    *ip |= ((long long)(*cp++) << 40);
-    *ip |= ((long long)(*cp++) << 32);
-    *ip |= ((long long)(*cp++) << 24);
-    *ip |= ((long long)(*cp++) << 16);
-    *ip |= ((long long)(*cp++) <<  8);
-    *ip |=  (long long)*cp;
+    *ip  = ((ix_int64)(*cp++) << 56);
+    *ip |= ((ix_int64)(*cp++) << 48);
+    *ip |= ((ix_int64)(*cp++) << 40);
+    *ip |= ((ix_int64)(*cp++) << 32);
+    *ip |= ((ix_int64)(*cp++) << 24);
+    *ip |= ((ix_int64)(*cp++) << 16);
+    *ip |= ((ix_int64)(*cp++) <<  8);
+    *ip |=  (ix_int64)*cp;
 }
 
 static void
-put_ix_longlong(void *xp, const ix_longlong *ip)
+put_ix_int64(void *xp, const ix_int64 *ip)
 {
     uchar *cp = (uchar *) xp;
 
-    *cp++ = (*ip) >> 56;
-    *cp++ = ((*ip) & 0x00ff000000000000LL) >> 48;
-    *cp++ = ((*ip) & 0x0000ff0000000000LL) >> 40;
-    *cp++ = ((*ip) & 0x000000ff00000000LL) >> 32;
-    *cp++ = ((*ip) & 0x00000000ff000000LL) >> 24;
-    *cp++ = ((*ip) & 0x0000000000ff0000LL) >> 16;
-    *cp++ = ((*ip) & 0x000000000000ff00LL) >>  8;
-    *cp   = ((*ip) & 0x00000000000000ffLL);
+    *cp++ = (uchar)((*ip) >> 56);
+    *cp++ = (uchar)(((*ip) & 0x00ff000000000000LL) >> 48);
+    *cp++ = (uchar)(((*ip) & 0x0000ff0000000000LL) >> 40);
+    *cp++ = (uchar)(((*ip) & 0x000000ff00000000LL) >> 32);
+    *cp++ = (uchar)(((*ip) & 0x00000000ff000000LL) >> 24);
+    *cp++ = (uchar)(((*ip) & 0x0000000000ff0000LL) >> 16);
+    *cp++ = (uchar)(((*ip) & 0x000000000000ff00LL) >>  8);
+    *cp   = (uchar)( (*ip) & 0x00000000000000ffLL);
+}
+
+#if X_SIZEOF_INT64 != SIZEOF_LONGLONG
+static int
+#line 2064
+ncx_get_longlong_longlong(const void *xp, longlong *ip)
+#line 2064
+{
+#line 2064
+    int err=NC_NOERR;
+#line 2064
+#if SIZEOF_IX_INT64 == SIZEOF_LONGLONG && IX_INT64_MAX == LONGLONG_MAX
+#line 2064
+    get_ix_int64(xp, (ix_int64 *)ip);
+#line 2064
+#else
+#line 2064
+    ix_int64 xx;
+#line 2064
+    get_ix_int64(xp, &xx);
+#line 2064
+
+#line 2064
+#if IX_INT64_MAX > LONGLONG_MAX
+#line 2064
+    if (xx > LONGLONG_MAX || xx < LONGLONG_MIN) {
+#line 2064
+
+#line 2064
+        err = NC_ERANGE;
+#line 2064
+    }
+#line 2064
+#endif
+#line 2064
+
+#line 2064
+
+#line 2064
+    *ip = (longlong) xx;
+#line 2064
+#endif
+#line 2064
+    return err;
+#line 2064
 }
+#line 2064
 
+#endif
 static int
+#line 2066
 ncx_get_longlong_schar(const void *xp, schar *ip)
+#line 2066
 {
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (schar) xx;
-#if IX_LONGLONG_MAX > SCHAR_MAX
-	if (xx > SCHAR_MAX || xx < SCHAR_MIN) return NC_ERANGE;
+#line 2066
+    int err=NC_NOERR;
+#line 2066
+    ix_int64 xx;
+#line 2066
+    get_ix_int64(xp, &xx);
+#line 2066
+
+#line 2066
+#if IX_INT64_MAX > SCHAR_MAX
+#line 2066
+    if (xx > SCHAR_MAX || xx < SCHAR_MIN) {
+#line 2066
+
+#line 2066
+        err = NC_ERANGE;
+#line 2066
+    }
+#line 2066
 #endif
+#line 2066
 
-	return NC_NOERR;
+#line 2066
+
+#line 2066
+    *ip = (schar) xx;
+#line 2066
+    return err;
+#line 2066
 }
+#line 2066
 
 static int
+#line 2067
 ncx_get_longlong_short(const void *xp, short *ip)
-{
-#if SIZEOF_IX_LONGLONG == SIZEOF_SHORT && IX_LONGLONG_MAX == SHORT_MAX
-	get_ix_longlong(xp, (ix_longlong *)ip);
-	return NC_NOERR;
+#line 2067
+{
+#line 2067
+    int err=NC_NOERR;
+#line 2067
+#if SIZEOF_IX_INT64 == SIZEOF_SHORT && IX_INT64_MAX == SHORT_MAX
+#line 2067
+    get_ix_int64(xp, (ix_int64 *)ip);
+#line 2067
 #else
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (short) xx;
-#if IX_LONGLONG_MAX > SHORT_MAX
-	if (xx > SHORT_MAX || xx < SHORT_MIN) return NC_ERANGE;
+#line 2067
+    ix_int64 xx;
+#line 2067
+    get_ix_int64(xp, &xx);
+#line 2067
+
+#line 2067
+#if IX_INT64_MAX > SHORT_MAX
+#line 2067
+    if (xx > SHORT_MAX || xx < SHORT_MIN) {
+#line 2067
+
+#line 2067
+        err = NC_ERANGE;
+#line 2067
+    }
+#line 2067
 #endif
+#line 2067
+
+#line 2067
 
+#line 2067
+    *ip = (short) xx;
+#line 2067
 #endif
-	return NC_NOERR;
+#line 2067
+    return err;
+#line 2067
 }
+#line 2067
 
 static int
+#line 2068
 ncx_get_longlong_int(const void *xp, int *ip)
-{
-#if SIZEOF_IX_LONGLONG == SIZEOF_INT && IX_LONGLONG_MAX == INT_MAX
-	get_ix_longlong(xp, (ix_longlong *)ip);
-	return NC_NOERR;
+#line 2068
+{
+#line 2068
+    int err=NC_NOERR;
+#line 2068
+#if SIZEOF_IX_INT64 == SIZEOF_INT && IX_INT64_MAX == INT_MAX
+#line 2068
+    get_ix_int64(xp, (ix_int64 *)ip);
+#line 2068
 #else
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (int) xx;
-#if IX_LONGLONG_MAX > INT_MAX
-	if (xx > INT_MAX || xx < INT_MIN) return NC_ERANGE;
+#line 2068
+    ix_int64 xx;
+#line 2068
+    get_ix_int64(xp, &xx);
+#line 2068
+
+#line 2068
+#if IX_INT64_MAX > INT_MAX
+#line 2068
+    if (xx > INT_MAX || xx < INT_MIN) {
+#line 2068
+
+#line 2068
+        err = NC_ERANGE;
+#line 2068
+    }
+#line 2068
 #endif
+#line 2068
 
+#line 2068
+
+#line 2068
+    *ip = (int) xx;
+#line 2068
 #endif
-	return NC_NOERR;
+#line 2068
+    return err;
+#line 2068
 }
+#line 2068
 
 static int
-ncx_get_longlong_longlong(const void *xp, longlong *ip)
-{
-#if SIZEOF_IX_LONGLONG == SIZEOF_LONGLONG && IX_LONGLONG_MAX == LONGLONG_MAX
-	get_ix_longlong(xp, (ix_longlong *)ip);
-	return NC_NOERR;
+#line 2069
+ncx_get_longlong_long(const void *xp, long *ip)
+#line 2069
+{
+#line 2069
+    int err=NC_NOERR;
+#line 2069
+#if SIZEOF_IX_INT64 == SIZEOF_LONG && IX_INT64_MAX == LONG_MAX
+#line 2069
+    get_ix_int64(xp, (ix_int64 *)ip);
+#line 2069
 #else
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (longlong) xx;
-#if IX_LONGLONG_MAX > LONGLONG_MAX
-	if (xx > LONGLONG_MAX || xx < LONGLONG_MIN) return NC_ERANGE;
+#line 2069
+    ix_int64 xx;
+#line 2069
+    get_ix_int64(xp, &xx);
+#line 2069
+
+#line 2069
+#if IX_INT64_MAX > LONG_MAX
+#line 2069
+    if (xx > LONG_MAX || xx < LONG_MIN) {
+#line 2069
+
+#line 2069
+        err = NC_ERANGE;
+#line 2069
+    }
+#line 2069
 #endif
+#line 2069
 
+#line 2069
+
+#line 2069
+    *ip = (long) xx;
+#line 2069
 #endif
-	return NC_NOERR;
+#line 2069
+    return err;
+#line 2069
 }
+#line 2069
 
 static int
+#line 2070
 ncx_get_longlong_ushort(const void *xp, ushort *ip)
+#line 2070
 {
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (ushort) xx;
-#if IX_LONGLONG_MAX > USHORT_MAX
-	if (xx > USHORT_MAX) return NC_ERANGE;
+#line 2070
+    int err=NC_NOERR;
+#line 2070
+    ix_int64 xx;
+#line 2070
+    get_ix_int64(xp, &xx);
+#line 2070
+
+#line 2070
+#if IX_INT64_MAX > USHORT_MAX
+#line 2070
+    if (xx > USHORT_MAX) {
+#line 2070
+
+#line 2070
+        err = NC_ERANGE;
+#line 2070
+    }
+#line 2070
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 2070
+
+#line 2070
+    if (xx < 0) {
+#line 2070
+
+#line 2070
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 2070
+    }
+#line 2070
+    *ip = (ushort) xx;
+#line 2070
+    return err;
+#line 2070
 }
+#line 2070
 
 static int
+#line 2071
 ncx_get_longlong_uchar(const void *xp, uchar *ip)
+#line 2071
 {
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (uchar) xx;
-#if IX_LONGLONG_MAX > UCHAR_MAX
-	if (xx > UCHAR_MAX) return NC_ERANGE;
+#line 2071
+    int err=NC_NOERR;
+#line 2071
+    ix_int64 xx;
+#line 2071
+    get_ix_int64(xp, &xx);
+#line 2071
+
+#line 2071
+#if IX_INT64_MAX > UCHAR_MAX
+#line 2071
+    if (xx > UCHAR_MAX) {
+#line 2071
+
+#line 2071
+        err = NC_ERANGE;
+#line 2071
+    }
+#line 2071
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 2071
+
+#line 2071
+    if (xx < 0) {
+#line 2071
+
+#line 2071
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 2071
+    }
+#line 2071
+    *ip = (uchar) xx;
+#line 2071
+    return err;
+#line 2071
 }
+#line 2071
 
 static int
+#line 2072
 ncx_get_longlong_uint(const void *xp, uint *ip)
+#line 2072
 {
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (uint) xx;
-#if IX_LONGLONG_MAX > UINT_MAX
-	if (xx > UINT_MAX) return NC_ERANGE;
+#line 2072
+    int err=NC_NOERR;
+#line 2072
+    ix_int64 xx;
+#line 2072
+    get_ix_int64(xp, &xx);
+#line 2072
+
+#line 2072
+#if IX_INT64_MAX > UINT_MAX
+#line 2072
+    if (xx > UINT_MAX) {
+#line 2072
+
+#line 2072
+        err = NC_ERANGE;
+#line 2072
+    }
+#line 2072
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 2072
+
+#line 2072
+    if (xx < 0) {
+#line 2072
+
+#line 2072
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 2072
+    }
+#line 2072
+    *ip = (uint) xx;
+#line 2072
+    return err;
+#line 2072
 }
+#line 2072
 
 static int
+#line 2073
 ncx_get_longlong_ulonglong(const void *xp, ulonglong *ip)
+#line 2073
 {
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (ulonglong) xx;
-#if IX_LONGLONG_MAX > ULONGLONG_MAX
-	if (xx > ULONGLONG_MAX) return NC_ERANGE;
+#line 2073
+    int err=NC_NOERR;
+#line 2073
+    ix_int64 xx;
+#line 2073
+    get_ix_int64(xp, &xx);
+#line 2073
+
+#line 2073
+#if IX_INT64_MAX > ULONGLONG_MAX
+#line 2073
+    if (xx > ULONGLONG_MAX) {
+#line 2073
+
+#line 2073
+        err = NC_ERANGE;
+#line 2073
+    }
+#line 2073
 #endif
-	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */
-	return NC_NOERR;
+#line 2073
+
+#line 2073
+    if (xx < 0) {
+#line 2073
+
+#line 2073
+        err = NC_ERANGE; /* because ip is unsigned */
+#line 2073
+    }
+#line 2073
+    *ip = (ulonglong) xx;
+#line 2073
+    return err;
+#line 2073
 }
+#line 2073
 
 static int
+#line 2074
 ncx_get_longlong_float(const void *xp, float *ip)
-{
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (float) xx;
-
+#line 2074
+{
+#line 2074
+	ix_int64 xx;
+#line 2074
+	get_ix_int64(xp, &xx);
+#line 2074
+	*ip = (float)xx;
+#line 2074
 	return NC_NOERR;
+#line 2074
 }
+#line 2074
 
 static int
+#line 2075
 ncx_get_longlong_double(const void *xp, double *ip)
-{
-	ix_longlong xx;
-	get_ix_longlong(xp, &xx);
-	*ip = (double) xx;
-
+#line 2075
+{
+#line 2075
+	ix_int64 xx;
+#line 2075
+	get_ix_int64(xp, &xx);
+#line 2075
+	*ip = (double)xx;
+#line 2075
 	return NC_NOERR;
+#line 2075
 }
+#line 2075
 
 
+#if X_SIZEOF_INT64 != SIZEOF_LONGLONG
 static int
-ncx_put_longlong_schar(void *xp, const schar *ip)
-{
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < SCHAR_MAX
-	if (*ip > IX_LONGLONG_MAX || *ip < X_LONGLONG_MIN) return NC_ERANGE;
-#endif
-
-	return NC_NOERR;
-}
-
-static int
-ncx_put_longlong_short(void *xp, const short *ip)
-{
-#if SIZEOF_IX_LONGLONG == SIZEOF_SHORT && IX_LONGLONG_MAX == SHORT_MAX
-	put_ix_longlong(xp, (const ix_longlong *)ip);
-	return NC_NOERR;
+#line 2078
+ncx_put_longlong_longlong(void *xp, const longlong *ip, void *fillp)
+#line 2078
+{
+#line 2078
+    int err=NC_NOERR;
+#line 2078
+#if SIZEOF_IX_INT64 == SIZEOF_LONGLONG && IX_INT64_MAX == LONGLONG_MAX
+#line 2078
+    put_ix_int64(xp, (const ix_int64 *)ip);
+#line 2078
 #else
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < SHORT_MAX
-	if (*ip > IX_LONGLONG_MAX || *ip < X_LONGLONG_MIN) return NC_ERANGE;
-#endif
+#line 2078
+    ix_int64 xx = NC_FILL_INT64;
+#line 2078
 
+#line 2078
+#if IX_INT64_MAX < LONGLONG_MAX
+#line 2078
+    if (*ip > IX_INT64_MAX || *ip < X_INT64_MIN) {
+#line 2078
+        
+#line 2078
+        err = NC_ERANGE;
+#line 2078
+    } 
+#line 2078
 #endif
-	return NC_NOERR;
-}
+#line 2078
+        xx = (ix_int64)*ip;
+#line 2078
 
-static int
-ncx_put_longlong_int(void *xp, const int *ip)
-{
-#if SIZEOF_IX_LONGLONG == SIZEOF_INT && IX_LONGLONG_MAX == INT_MAX
-	put_ix_longlong(xp, (const ix_longlong *)ip);
-	return NC_NOERR;
-#else
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < INT_MAX
-	if (*ip > IX_LONGLONG_MAX || *ip < X_LONGLONG_MIN) return NC_ERANGE;
+#line 2078
+    put_ix_int64(xp, &xx);
+#line 2078
 #endif
+#line 2078
+    return err;
+#line 2078
+}
+#line 2078
 
 #endif
-	return NC_NOERR;
-}
+static int
+#line 2080
+ncx_put_longlong_schar(void *xp, const schar *ip, void *fillp)
+#line 2080
+{
+#line 2080
+    int err=NC_NOERR;
+#line 2080
+    ix_int64 xx = NC_FILL_INT64;
+#line 2080
+
+#line 2080
+#if IX_INT64_MAX < SCHAR_MAX
+#line 2080
+    if (*ip > IX_INT64_MAX || *ip < X_INT64_MIN) {
+#line 2080
+        
+#line 2080
+        err = NC_ERANGE;
+#line 2080
+    } 
+#line 2080
+#endif
+#line 2080
+        xx = (ix_int64)*ip;
+#line 2080
+
+#line 2080
+    put_ix_int64(xp, &xx);
+#line 2080
+    return err;
+#line 2080
+}
+#line 2080
 
 static int
-ncx_put_longlong_longlong(void *xp, const longlong *ip)
-{
-#if SIZEOF_IX_LONGLONG == SIZEOF_LONGLONG && IX_LONGLONG_MAX == LONGLONG_MAX
-	put_ix_longlong(xp, (const ix_longlong *)ip);
-	return NC_NOERR;
+#line 2081
+ncx_put_longlong_short(void *xp, const short *ip, void *fillp)
+#line 2081
+{
+#line 2081
+    int err=NC_NOERR;
+#line 2081
+#if SIZEOF_IX_INT64 == SIZEOF_SHORT && IX_INT64_MAX == SHORT_MAX
+#line 2081
+    put_ix_int64(xp, (const ix_int64 *)ip);
+#line 2081
 #else
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < LONGLONG_MAX
-	if (*ip > IX_LONGLONG_MAX || *ip < X_LONGLONG_MIN) return NC_ERANGE;
-#endif
-
-#endif
-	return NC_NOERR;
-}
+#line 2081
+    ix_int64 xx = NC_FILL_INT64;
+#line 2081
+
+#line 2081
+#if IX_INT64_MAX < SHORT_MAX
+#line 2081
+    if (*ip > IX_INT64_MAX || *ip < X_INT64_MIN) {
+#line 2081
+        
+#line 2081
+        err = NC_ERANGE;
+#line 2081
+    } 
+#line 2081
+#endif
+#line 2081
+        xx = (ix_int64)*ip;
+#line 2081
+
+#line 2081
+    put_ix_int64(xp, &xx);
+#line 2081
+#endif
+#line 2081
+    return err;
+#line 2081
+}
+#line 2081
 
 static int
-ncx_put_longlong_ushort(void *xp, const ushort *ip)
-{
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < USHORT_MAX
-	if (*ip > IX_LONGLONG_MAX) return NC_ERANGE;
-#endif
-
-	return NC_NOERR;
-}
+#line 2082
+ncx_put_longlong_int(void *xp, const int *ip, void *fillp)
+#line 2082
+{
+#line 2082
+    int err=NC_NOERR;
+#line 2082
+#if SIZEOF_IX_INT64 == SIZEOF_INT && IX_INT64_MAX == INT_MAX
+#line 2082
+    put_ix_int64(xp, (const ix_int64 *)ip);
+#line 2082
+#else
+#line 2082
+    ix_int64 xx = NC_FILL_INT64;
+#line 2082
+
+#line 2082
+#if IX_INT64_MAX < INT_MAX
+#line 2082
+    if (*ip > IX_INT64_MAX || *ip < X_INT64_MIN) {
+#line 2082
+        
+#line 2082
+        err = NC_ERANGE;
+#line 2082
+    } 
+#line 2082
+#endif
+#line 2082
+        xx = (ix_int64)*ip;
+#line 2082
+
+#line 2082
+    put_ix_int64(xp, &xx);
+#line 2082
+#endif
+#line 2082
+    return err;
+#line 2082
+}
+#line 2082
 
 static int
-ncx_put_longlong_uchar(void *xp, const uchar *ip)
-{
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < UCHAR_MAX
-	if (*ip > IX_LONGLONG_MAX) return NC_ERANGE;
-#endif
-
-	return NC_NOERR;
-}
+#line 2083
+ncx_put_longlong_long(void *xp, const long *ip, void *fillp)
+#line 2083
+{
+#line 2083
+    int err=NC_NOERR;
+#line 2083
+#if SIZEOF_IX_INT64 == SIZEOF_LONG && IX_INT64_MAX == LONG_MAX
+#line 2083
+    put_ix_int64(xp, (const ix_int64 *)ip);
+#line 2083
+#else
+#line 2083
+    ix_int64 xx = NC_FILL_INT64;
+#line 2083
+
+#line 2083
+#if IX_INT64_MAX < LONG_MAX
+#line 2083
+    if (*ip > IX_INT64_MAX || *ip < X_INT64_MIN) {
+#line 2083
+        
+#line 2083
+        err = NC_ERANGE;
+#line 2083
+    } 
+#line 2083
+#endif
+#line 2083
+        xx = (ix_int64)*ip;
+#line 2083
+
+#line 2083
+    put_ix_int64(xp, &xx);
+#line 2083
+#endif
+#line 2083
+    return err;
+#line 2083
+}
+#line 2083
 
 static int
-ncx_put_longlong_uint(void *xp, const uint *ip)
-{
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < UINT_MAX
-	if (*ip > IX_LONGLONG_MAX) return NC_ERANGE;
-#endif
-
-	return NC_NOERR;
-}
+#line 2084
+ncx_put_longlong_ushort(void *xp, const ushort *ip, void *fillp)
+#line 2084
+{
+#line 2084
+    int err=NC_NOERR;
+#line 2084
+    ix_int64 xx = NC_FILL_INT64;
+#line 2084
+
+#line 2084
+#if IX_INT64_MAX < USHORT_MAX
+#line 2084
+    if (*ip > IX_INT64_MAX) {
+#line 2084
+        
+#line 2084
+        err = NC_ERANGE;
+#line 2084
+    } 
+#line 2084
+#endif
+#line 2084
+        xx = (ix_int64)*ip;
+#line 2084
+
+#line 2084
+    put_ix_int64(xp, &xx);
+#line 2084
+    return err;
+#line 2084
+}
+#line 2084
 
 static int
-ncx_put_longlong_ulonglong(void *xp, const ulonglong *ip)
-{
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-#if IX_LONGLONG_MAX < ULONGLONG_MAX
-	if (*ip > IX_LONGLONG_MAX) return NC_ERANGE;
-#endif
-
-	return NC_NOERR;
-}
+#line 2085
+ncx_put_longlong_uchar(void *xp, const uchar *ip, void *fillp)
+#line 2085
+{
+#line 2085
+    int err=NC_NOERR;
+#line 2085
+    ix_int64 xx = NC_FILL_INT64;
+#line 2085
+
+#line 2085
+#if IX_INT64_MAX < UCHAR_MAX
+#line 2085
+    if (*ip > IX_INT64_MAX) {
+#line 2085
+        
+#line 2085
+        err = NC_ERANGE;
+#line 2085
+    } 
+#line 2085
+#endif
+#line 2085
+        xx = (ix_int64)*ip;
+#line 2085
+
+#line 2085
+    put_ix_int64(xp, &xx);
+#line 2085
+    return err;
+#line 2085
+}
+#line 2085
 
 static int
-ncx_put_longlong_float(void *xp, const float *ip)
-{
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-	if(*ip > (double)X_LONGLONG_MAX || *ip < (double)X_LONGLONG_MIN) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 2086
+ncx_put_longlong_uint(void *xp, const uint *ip, void *fillp)
+#line 2086
+{
+#line 2086
+    int err=NC_NOERR;
+#line 2086
+    ix_int64 xx = NC_FILL_INT64;
+#line 2086
+
+#line 2086
+#if IX_INT64_MAX < UINT_MAX
+#line 2086
+    if (*ip > IX_INT64_MAX) {
+#line 2086
+        
+#line 2086
+        err = NC_ERANGE;
+#line 2086
+    } 
+#line 2086
+#endif
+#line 2086
+        xx = (ix_int64)*ip;
+#line 2086
+
+#line 2086
+    put_ix_int64(xp, &xx);
+#line 2086
+    return err;
+#line 2086
+}
+#line 2086
 
 static int
-ncx_put_longlong_double(void *xp, const double *ip)
-{
-	ix_longlong xx = (ix_longlong)*ip;
-	put_ix_longlong(xp, &xx);
-	if(*ip > X_LONGLONG_MAX || *ip < X_LONGLONG_MIN) return NC_ERANGE;
-	return NC_NOERR;
-}
-
+#line 2087
+ncx_put_longlong_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 2087
+{
+#line 2087
+    int err=NC_NOERR;
+#line 2087
+    ix_int64 xx = NC_FILL_INT64;
+#line 2087
+
+#line 2087
+#if IX_INT64_MAX < ULONGLONG_MAX
+#line 2087
+    if (*ip > IX_INT64_MAX) {
+#line 2087
+        
+#line 2087
+        err = NC_ERANGE;
+#line 2087
+    } 
+#line 2087
+#endif
+#line 2087
+        xx = (ix_int64)*ip;
+#line 2087
+
+#line 2087
+    put_ix_int64(xp, &xx);
+#line 2087
+    return err;
+#line 2087
+}
+#line 2087
 
-/* x_ulonglong --------------------------------------------------------------------*/
+static int
+#line 2088
+ncx_put_longlong_float(void *xp, const float *ip, void *fillp)
+#line 2088
+{
+#line 2088
+    int err=NC_NOERR;
+#line 2088
+    ix_int64 xx = NC_FILL_INT64;
+#line 2088
+
+#line 2088
+    if (*ip > (double)X_INT64_MAX || *ip < (double)X_INT64_MIN) {
+#line 2088
+        
+#line 2088
+        err = NC_ERANGE;
+#line 2088
+    } 
+#line 2088
+        xx = (ix_int64)*ip;
+#line 2088
+
+#line 2088
+    put_ix_int64(xp, &xx);
+#line 2088
+    return err;
+#line 2088
+}
+#line 2088
 
-#if USHORT_MAX == X_ULONGLONG_MAX
-typedef ushort ix_ulonglong;
-#define SIZEOF_IX_ULONGLONG SIZEOF_USHORT
-#define IX_ULONGLONG_MAX USHORT_MAX
-#elif ULONG_LONG_MAX  >= X_ULONGLONG_MAX
-typedef ulonglong ix_ulonglong;
-#define SIZEOF_IX_ULONGLONG SIZEOF_ULONGLONG
-#define IX_ULONGLONG_MAX ULONG_LONG_MAX
-#elif ULONG_MAX  >= X_ULONGLONG_MAX
-typedef ulong ix_ulonglong;
-#define SIZEOF_IX_ULONGLONG SIZEOF_ULONG
-#define IX_ULONGLONG_MAX ULONG_MAX
+static int
+#line 2089
+ncx_put_longlong_double(void *xp, const double *ip, void *fillp)
+#line 2089
+{
+#line 2089
+    int err=NC_NOERR;
+#line 2089
+    ix_int64 xx = NC_FILL_INT64;
+#line 2089
+
+#line 2089
+    if (*ip > X_INT64_MAX || *ip < X_INT64_MIN) {
+#line 2089
+        
+#line 2089
+        err = NC_ERANGE;
+#line 2089
+    } 
+#line 2089
+        xx = (ix_int64)*ip;
+#line 2089
+
+#line 2089
+    put_ix_int64(xp, &xx);
+#line 2089
+    return err;
+#line 2089
+}
+#line 2089
+
+
+
+/* external NC_UINT64 -------------------------------------------------------*/
+
+#if USHORT_MAX == X_UINT64_MAX
+typedef ushort ix_uint64;
+#define SIZEOF_IX_UINT64 SIZEOF_USHORT
+#define IX_UINT64_MAX USHORT_MAX
+#elif ULONG_LONG_MAX  >= X_UINT64_MAX
+typedef ulonglong ix_uint64;
+#define SIZEOF_IX_UINT64 SIZEOF_ULONGLONG
+#define IX_UINT64_MAX ULONG_LONG_MAX
+#elif ULONG_MAX  >= X_UINT64_MAX
+typedef ulong ix_uint64;
+#define SIZEOF_IX_UINT64 SIZEOF_ULONG
+#define IX_UINT64_MAX ULONG_MAX
 #else
-#error "ix_ulonglong implementation"
+#error "ix_uint64 implementation"
 #endif
 
 
 static void
-get_ix_ulonglong(const void *xp, ix_ulonglong *ip)
+get_ix_uint64(const void *xp, ix_uint64 *ip)
 {
     const uchar *cp = (const uchar *) xp;
 
-    *ip  = ((unsigned long long)(*cp++) << 56);
-    *ip |= ((unsigned long long)(*cp++) << 48);
-    *ip |= ((unsigned long long)(*cp++) << 40);
-    *ip |= ((unsigned long long)(*cp++) << 32);
-    *ip |= ((unsigned long long)(*cp++) << 24);
-    *ip |= ((unsigned long long)(*cp++) << 16);
-    *ip |= ((unsigned long long)(*cp++) <<  8);
-    *ip |=  (unsigned long long)*cp;
+    *ip  = ((ix_uint64)(*cp++) << 56);
+    *ip |= ((ix_uint64)(*cp++) << 48);
+    *ip |= ((ix_uint64)(*cp++) << 40);
+    *ip |= ((ix_uint64)(*cp++) << 32);
+    *ip |= ((ix_uint64)(*cp++) << 24);
+    *ip |= ((ix_uint64)(*cp++) << 16);
+    *ip |= ((ix_uint64)(*cp++) <<  8);
+    *ip |=  (ix_uint64)*cp;
 }
 
 static void
-put_ix_ulonglong(void *xp, const ix_ulonglong *ip)
+put_ix_uint64(void *xp, const ix_uint64 *ip)
 {
     uchar *cp = (uchar *) xp;
 
-    *cp++ = (*ip) >> 56;
-    *cp++ = ((*ip) & 0x00ff000000000000ULL) >> 48;
-    *cp++ = ((*ip) & 0x0000ff0000000000ULL) >> 40;
-    *cp++ = ((*ip) & 0x000000ff00000000ULL) >> 32;
-    *cp++ = ((*ip) & 0x00000000ff000000ULL) >> 24;
-    *cp++ = ((*ip) & 0x0000000000ff0000ULL) >> 16;
-    *cp++ = ((*ip) & 0x000000000000ff00ULL) >>  8;
-    *cp   = ((*ip) & 0x00000000000000ffULL);
+    *cp++ = (uchar)((*ip) >> 56);
+    *cp++ = (uchar)(((*ip) & 0x00ff000000000000ULL) >> 48);
+    *cp++ = (uchar)(((*ip) & 0x0000ff0000000000ULL) >> 40);
+    *cp++ = (uchar)(((*ip) & 0x000000ff00000000ULL) >> 32);
+    *cp++ = (uchar)(((*ip) & 0x00000000ff000000ULL) >> 24);
+    *cp++ = (uchar)(((*ip) & 0x0000000000ff0000ULL) >> 16);
+    *cp++ = (uchar)(((*ip) & 0x000000000000ff00ULL) >>  8);
+    *cp   = (uchar)( (*ip) & 0x00000000000000ffULL);
+}
+
+#if X_SIZEOF_UINT64 != SIZEOF_ULONGLONG
+static int
+#line 2142
+ncx_get_ulonglong_ulonglong(const void *xp, ulonglong *ip)
+#line 2142
+{
+#line 2142
+    int err=NC_NOERR;
+#line 2142
+#if SIZEOF_IX_UINT64 == SIZEOF_ULONGLONG && IX_UINT64_MAX == ULONGLONG_MAX
+#line 2142
+    get_ix_uint64(xp, (ix_uint64 *)ip);
+#line 2142
+#else
+#line 2142
+    ix_uint64 xx;
+#line 2142
+    get_ix_uint64(xp, &xx);
+#line 2142
+
+#line 2142
+#if IX_UINT64_MAX > ULONGLONG_MAX
+#line 2142
+    if (xx > ULONGLONG_MAX) {
+#line 2142
+
+#line 2142
+        err = NC_ERANGE;
+#line 2142
+    }
+#line 2142
+#endif
+#line 2142
+
+#line 2142
+
+#line 2142
+    *ip = (ulonglong) xx;
+#line 2142
+#endif
+#line 2142
+    return err;
+#line 2142
 }
+#line 2142
 
+#endif
 static int
+#line 2144
 ncx_get_ulonglong_schar(const void *xp, schar *ip)
+#line 2144
 {
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (schar) xx;
-#if IX_ULONGLONG_MAX > SCHAR_MAX
-	if (xx > SCHAR_MAX) return NC_ERANGE;
+#line 2144
+    int err=NC_NOERR;
+#line 2144
+    ix_uint64 xx;
+#line 2144
+    get_ix_uint64(xp, &xx);
+#line 2144
+
+#line 2144
+#if IX_UINT64_MAX > SCHAR_MAX
+#line 2144
+    if (xx > SCHAR_MAX) {
+#line 2144
+
+#line 2144
+        err = NC_ERANGE;
+#line 2144
+    }
+#line 2144
 #endif
+#line 2144
 
-	return NC_NOERR;
+#line 2144
+
+#line 2144
+    *ip = (schar) xx;
+#line 2144
+    return err;
+#line 2144
 }
+#line 2144
 
 static int
+#line 2145
 ncx_get_ulonglong_short(const void *xp, short *ip)
+#line 2145
 {
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (short) xx;
-#if IX_ULONGLONG_MAX > SHORT_MAX
-	if (xx > SHORT_MAX) return NC_ERANGE;
+#line 2145
+    int err=NC_NOERR;
+#line 2145
+    ix_uint64 xx;
+#line 2145
+    get_ix_uint64(xp, &xx);
+#line 2145
+
+#line 2145
+#if IX_UINT64_MAX > SHORT_MAX
+#line 2145
+    if (xx > SHORT_MAX) {
+#line 2145
+
+#line 2145
+        err = NC_ERANGE;
+#line 2145
+    }
+#line 2145
 #endif
+#line 2145
 
-	return NC_NOERR;
+#line 2145
+
+#line 2145
+    *ip = (short) xx;
+#line 2145
+    return err;
+#line 2145
 }
+#line 2145
 
 static int
+#line 2146
 ncx_get_ulonglong_int(const void *xp, int *ip)
+#line 2146
 {
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (int) xx;
-#if IX_ULONGLONG_MAX > INT_MAX
-	if (xx > INT_MAX) return NC_ERANGE;
+#line 2146
+    int err=NC_NOERR;
+#line 2146
+    ix_uint64 xx;
+#line 2146
+    get_ix_uint64(xp, &xx);
+#line 2146
+
+#line 2146
+#if IX_UINT64_MAX > INT_MAX
+#line 2146
+    if (xx > INT_MAX) {
+#line 2146
+
+#line 2146
+        err = NC_ERANGE;
+#line 2146
+    }
+#line 2146
 #endif
+#line 2146
 
-	return NC_NOERR;
+#line 2146
+
+#line 2146
+    *ip = (int) xx;
+#line 2146
+    return err;
+#line 2146
 }
+#line 2146
 
 static int
-ncx_get_ulonglong_longlong(const void *xp, longlong *ip)
+#line 2147
+ncx_get_ulonglong_long(const void *xp, long *ip)
+#line 2147
 {
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (longlong) xx;
-#if IX_ULONGLONG_MAX > LONGLONG_MAX
-	if (xx > LONGLONG_MAX) return NC_ERANGE;
+#line 2147
+    int err=NC_NOERR;
+#line 2147
+    ix_uint64 xx;
+#line 2147
+    get_ix_uint64(xp, &xx);
+#line 2147
+
+#line 2147
+#if IX_UINT64_MAX > LONG_MAX
+#line 2147
+    if (xx > LONG_MAX) {
+#line 2147
+
+#line 2147
+        err = NC_ERANGE;
+#line 2147
+    }
+#line 2147
 #endif
+#line 2147
 
-	return NC_NOERR;
+#line 2147
+
+#line 2147
+    *ip = (long) xx;
+#line 2147
+    return err;
+#line 2147
 }
+#line 2147
 
 static int
-ncx_get_ulonglong_ushort(const void *xp, ushort *ip)
+#line 2148
+ncx_get_ulonglong_longlong(const void *xp, longlong *ip)
+#line 2148
 {
-#if SIZEOF_IX_ULONGLONG == SIZEOF_USHORT && IX_ULONGLONG_MAX == USHORT_MAX
-	get_ix_ulonglong(xp, (ix_ulonglong *)ip);
-	return NC_NOERR;
-#else
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (ushort) xx;
-#if IX_ULONGLONG_MAX > USHORT_MAX
-	if (xx > USHORT_MAX) return NC_ERANGE;
-#endif
+#line 2148
+    int err=NC_NOERR;
+#line 2148
+    ix_uint64 xx;
+#line 2148
+    get_ix_uint64(xp, &xx);
+#line 2148
+
+#line 2148
+#if IX_UINT64_MAX > LONGLONG_MAX
+#line 2148
+    if (xx > LONGLONG_MAX) {
+#line 2148
 
+#line 2148
+        err = NC_ERANGE;
+#line 2148
+    }
+#line 2148
 #endif
-	return NC_NOERR;
+#line 2148
+
+#line 2148
+
+#line 2148
+    *ip = (longlong) xx;
+#line 2148
+    return err;
+#line 2148
 }
+#line 2148
 
 static int
-ncx_get_ulonglong_uchar(const void *xp, uchar *ip)
-{
-#if SIZEOF_IX_ULONGLONG == SIZEOF_UCHAR && IX_ULONGLONG_MAX == UCHAR_MAX
-	get_ix_ulonglong(xp, (ix_ulonglong *)ip);
-	return NC_NOERR;
+#line 2149
+ncx_get_ulonglong_ushort(const void *xp, ushort *ip)
+#line 2149
+{
+#line 2149
+    int err=NC_NOERR;
+#line 2149
+#if SIZEOF_IX_UINT64 == SIZEOF_USHORT && IX_UINT64_MAX == USHORT_MAX
+#line 2149
+    get_ix_uint64(xp, (ix_uint64 *)ip);
+#line 2149
 #else
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (uchar) xx;
-#if IX_ULONGLONG_MAX > UCHAR_MAX
-	if (xx > UCHAR_MAX) return NC_ERANGE;
+#line 2149
+    ix_uint64 xx;
+#line 2149
+    get_ix_uint64(xp, &xx);
+#line 2149
+
+#line 2149
+#if IX_UINT64_MAX > USHORT_MAX
+#line 2149
+    if (xx > USHORT_MAX) {
+#line 2149
+
+#line 2149
+        err = NC_ERANGE;
+#line 2149
+    }
+#line 2149
 #endif
+#line 2149
+
+#line 2149
 
+#line 2149
+    *ip = (ushort) xx;
+#line 2149
 #endif
-	return NC_NOERR;
+#line 2149
+    return err;
+#line 2149
 }
+#line 2149
 
 static int
-ncx_get_ulonglong_uint(const void *xp, uint *ip)
-{
-#if SIZEOF_IX_ULONGLONG == SIZEOF_UINT && IX_ULONGLONG_MAX == UINT_MAX
-	get_ix_ulonglong(xp, (ix_ulonglong *)ip);
-	return NC_NOERR;
+#line 2150
+ncx_get_ulonglong_uchar(const void *xp, uchar *ip)
+#line 2150
+{
+#line 2150
+    int err=NC_NOERR;
+#line 2150
+#if SIZEOF_IX_UINT64 == SIZEOF_UCHAR && IX_UINT64_MAX == UCHAR_MAX
+#line 2150
+    get_ix_uint64(xp, (ix_uint64 *)ip);
+#line 2150
 #else
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (uint) xx;
-#if IX_ULONGLONG_MAX > UINT_MAX
-	if (xx > UINT_MAX) return NC_ERANGE;
+#line 2150
+    ix_uint64 xx;
+#line 2150
+    get_ix_uint64(xp, &xx);
+#line 2150
+
+#line 2150
+#if IX_UINT64_MAX > UCHAR_MAX
+#line 2150
+    if (xx > UCHAR_MAX) {
+#line 2150
+
+#line 2150
+        err = NC_ERANGE;
+#line 2150
+    }
+#line 2150
 #endif
+#line 2150
 
+#line 2150
+
+#line 2150
+    *ip = (uchar) xx;
+#line 2150
 #endif
-	return NC_NOERR;
+#line 2150
+    return err;
+#line 2150
 }
+#line 2150
 
 static int
-ncx_get_ulonglong_ulonglong(const void *xp, ulonglong *ip)
-{
-#if SIZEOF_IX_ULONGLONG == SIZEOF_ULONGLONG && IX_ULONGLONG_MAX == ULONGLONG_MAX
-	get_ix_ulonglong(xp, (ix_ulonglong *)ip);
-	return NC_NOERR;
+#line 2151
+ncx_get_ulonglong_uint(const void *xp, uint *ip)
+#line 2151
+{
+#line 2151
+    int err=NC_NOERR;
+#line 2151
+#if SIZEOF_IX_UINT64 == SIZEOF_UINT && IX_UINT64_MAX == UINT_MAX
+#line 2151
+    get_ix_uint64(xp, (ix_uint64 *)ip);
+#line 2151
 #else
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (ulonglong) xx;
-#if IX_ULONGLONG_MAX > ULONGLONG_MAX
-	if (xx > ULONGLONG_MAX) return NC_ERANGE;
+#line 2151
+    ix_uint64 xx;
+#line 2151
+    get_ix_uint64(xp, &xx);
+#line 2151
+
+#line 2151
+#if IX_UINT64_MAX > UINT_MAX
+#line 2151
+    if (xx > UINT_MAX) {
+#line 2151
+
+#line 2151
+        err = NC_ERANGE;
+#line 2151
+    }
+#line 2151
 #endif
+#line 2151
+
+#line 2151
 
+#line 2151
+    *ip = (uint) xx;
+#line 2151
 #endif
-	return NC_NOERR;
+#line 2151
+    return err;
+#line 2151
 }
+#line 2151
 
 static int
+#line 2152
 ncx_get_ulonglong_float(const void *xp, float *ip)
-{
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (float) xx;
-
+#line 2152
+{
+#line 2152
+	ix_uint64 xx;
+#line 2152
+	get_ix_uint64(xp, &xx);
+#line 2152
+	*ip = (float)xx;
+#line 2152
 	return NC_NOERR;
+#line 2152
 }
+#line 2152
 
 static int
+#line 2153
 ncx_get_ulonglong_double(const void *xp, double *ip)
-{
-	ix_ulonglong xx;
-	get_ix_ulonglong(xp, &xx);
-	*ip = (double) xx;
-
+#line 2153
+{
+#line 2153
+	ix_uint64 xx;
+#line 2153
+	get_ix_uint64(xp, &xx);
+#line 2153
+	*ip = (double)xx;
+#line 2153
 	return NC_NOERR;
+#line 2153
 }
+#line 2153
 
 
+#if X_SIZEOF_UINT64 != SIZEOF_ULONGLONG
 static int
-ncx_put_ulonglong_schar(void *xp, const schar *ip)
-{
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < SCHAR_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
-#endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 2156
+ncx_put_ulonglong_ulonglong(void *xp, const ulonglong *ip, void *fillp)
+#line 2156
+{
+#line 2156
+    int err=NC_NOERR;
+#line 2156
+#if SIZEOF_IX_UINT64 == SIZEOF_ULONGLONG && IX_UINT64_MAX == ULONGLONG_MAX
+#line 2156
+    put_ix_uint64(xp, (const ix_uint64 *)ip);
+#line 2156
+#else
+#line 2156
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2156
 
-static int
-ncx_put_ulonglong_short(void *xp, const short *ip)
-{
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < SHORT_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
+#line 2156
+#if IX_UINT64_MAX < ULONGLONG_MAX
+#line 2156
+    if (*ip > IX_UINT64_MAX) {
+#line 2156
+        
+#line 2156
+        err = NC_ERANGE;
+#line 2156
+    } 
+#line 2156
 #endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+#line 2156
+        xx = (ix_uint64)*ip;
+#line 2156
 
-static int
-ncx_put_ulonglong_int(void *xp, const int *ip)
-{
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < INT_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
+#line 2156
+    put_ix_uint64(xp, &xx);
+#line 2156
 #endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
+#line 2156
+    return err;
+#line 2156
 }
+#line 2156
 
-static int
-ncx_put_ulonglong_longlong(void *xp, const longlong *ip)
-{
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < LONGLONG_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
 #endif
-	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */
-	return NC_NOERR;
-}
+static int
+#line 2158
+ncx_put_ulonglong_schar(void *xp, const schar *ip, void *fillp)
+#line 2158
+{
+#line 2158
+    int err=NC_NOERR;
+#line 2158
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2158
+
+#line 2158
+#if IX_UINT64_MAX < SCHAR_MAX
+#line 2158
+    if (*ip > IX_UINT64_MAX) {
+#line 2158
+        
+#line 2158
+        err = NC_ERANGE;
+#line 2158
+    } 
+#line 2158
+#endif
+#line 2158
+    if (*ip < 0) {
+#line 2158
+        
+#line 2158
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 2158
+    } 
+#line 2158
+        xx = (ix_uint64)*ip;
+#line 2158
+
+#line 2158
+    put_ix_uint64(xp, &xx);
+#line 2158
+    return err;
+#line 2158
+}
+#line 2158
 
 static int
-ncx_put_ulonglong_uchar(void *xp, const uchar *ip)
-{
-#if SIZEOF_IX_ULONGLONG == SIZEOF_UCHAR && IX_ULONGLONG_MAX == UCHAR_MAX
-	put_ix_ulonglong(xp, (const ix_ulonglong *)ip);
-	return NC_NOERR;
-#else
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < UCHAR_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
-#endif
+#line 2159
+ncx_put_ulonglong_short(void *xp, const short *ip, void *fillp)
+#line 2159
+{
+#line 2159
+    int err=NC_NOERR;
+#line 2159
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2159
+
+#line 2159
+#if IX_UINT64_MAX < SHORT_MAX
+#line 2159
+    if (*ip > IX_UINT64_MAX) {
+#line 2159
+        
+#line 2159
+        err = NC_ERANGE;
+#line 2159
+    } 
+#line 2159
+#endif
+#line 2159
+    if (*ip < 0) {
+#line 2159
+        
+#line 2159
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 2159
+    } 
+#line 2159
+        xx = (ix_uint64)*ip;
+#line 2159
+
+#line 2159
+    put_ix_uint64(xp, &xx);
+#line 2159
+    return err;
+#line 2159
+}
+#line 2159
 
-#endif
-	return NC_NOERR;
-}
+static int
+#line 2160
+ncx_put_ulonglong_int(void *xp, const int *ip, void *fillp)
+#line 2160
+{
+#line 2160
+    int err=NC_NOERR;
+#line 2160
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2160
+
+#line 2160
+#if IX_UINT64_MAX < INT_MAX
+#line 2160
+    if (*ip > IX_UINT64_MAX) {
+#line 2160
+        
+#line 2160
+        err = NC_ERANGE;
+#line 2160
+    } 
+#line 2160
+#endif
+#line 2160
+    if (*ip < 0) {
+#line 2160
+        
+#line 2160
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 2160
+    } 
+#line 2160
+        xx = (ix_uint64)*ip;
+#line 2160
+
+#line 2160
+    put_ix_uint64(xp, &xx);
+#line 2160
+    return err;
+#line 2160
+}
+#line 2160
 
 static int
-ncx_put_ulonglong_ushort(void *xp, const ushort *ip)
-{
-#if SIZEOF_IX_ULONGLONG == SIZEOF_USHORT && IX_ULONGLONG_MAX == USHORT_MAX
-	put_ix_ulonglong(xp, (const ix_ulonglong *)ip);
-	return NC_NOERR;
-#else
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < USHORT_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
-#endif
+#line 2161
+ncx_put_ulonglong_long(void *xp, const long *ip, void *fillp)
+#line 2161
+{
+#line 2161
+    int err=NC_NOERR;
+#line 2161
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2161
+
+#line 2161
+#if IX_UINT64_MAX < LONG_MAX
+#line 2161
+    if (*ip > IX_UINT64_MAX) {
+#line 2161
+        
+#line 2161
+        err = NC_ERANGE;
+#line 2161
+    } 
+#line 2161
+#endif
+#line 2161
+    if (*ip < 0) {
+#line 2161
+        
+#line 2161
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 2161
+    } 
+#line 2161
+        xx = (ix_uint64)*ip;
+#line 2161
+
+#line 2161
+    put_ix_uint64(xp, &xx);
+#line 2161
+    return err;
+#line 2161
+}
+#line 2161
 
-#endif
-	return NC_NOERR;
-}
+static int
+#line 2162
+ncx_put_ulonglong_longlong(void *xp, const longlong *ip, void *fillp)
+#line 2162
+{
+#line 2162
+    int err=NC_NOERR;
+#line 2162
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2162
+
+#line 2162
+#if IX_UINT64_MAX < LONGLONG_MAX
+#line 2162
+    if (*ip > IX_UINT64_MAX) {
+#line 2162
+        
+#line 2162
+        err = NC_ERANGE;
+#line 2162
+    } 
+#line 2162
+#endif
+#line 2162
+    if (*ip < 0) {
+#line 2162
+        
+#line 2162
+        err = NC_ERANGE; /* because xp is unsigned */
+#line 2162
+    } 
+#line 2162
+        xx = (ix_uint64)*ip;
+#line 2162
+
+#line 2162
+    put_ix_uint64(xp, &xx);
+#line 2162
+    return err;
+#line 2162
+}
+#line 2162
 
 static int
-ncx_put_ulonglong_uint(void *xp, const uint *ip)
-{
-#if SIZEOF_IX_ULONGLONG == SIZEOF_UINT && IX_ULONGLONG_MAX == UINT_MAX
-	put_ix_ulonglong(xp, (const ix_ulonglong *)ip);
-	return NC_NOERR;
+#line 2163
+ncx_put_ulonglong_uchar(void *xp, const uchar *ip, void *fillp)
+#line 2163
+{
+#line 2163
+    int err=NC_NOERR;
+#line 2163
+#if SIZEOF_IX_UINT64 == SIZEOF_UCHAR && IX_UINT64_MAX == UCHAR_MAX
+#line 2163
+    put_ix_uint64(xp, (const ix_uint64 *)ip);
+#line 2163
 #else
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < UINT_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
-#endif
-
-#endif
-	return NC_NOERR;
-}
+#line 2163
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2163
+
+#line 2163
+#if IX_UINT64_MAX < UCHAR_MAX
+#line 2163
+    if (*ip > IX_UINT64_MAX) {
+#line 2163
+        
+#line 2163
+        err = NC_ERANGE;
+#line 2163
+    } 
+#line 2163
+#endif
+#line 2163
+        xx = (ix_uint64)*ip;
+#line 2163
+
+#line 2163
+    put_ix_uint64(xp, &xx);
+#line 2163
+#endif
+#line 2163
+    return err;
+#line 2163
+}
+#line 2163
 
 static int
-ncx_put_ulonglong_ulonglong(void *xp, const ulonglong *ip)
-{
-#if SIZEOF_IX_ULONGLONG == SIZEOF_ULONGLONG && IX_ULONGLONG_MAX == ULONGLONG_MAX
-	put_ix_ulonglong(xp, (const ix_ulonglong *)ip);
-	return NC_NOERR;
+#line 2164
+ncx_put_ulonglong_ushort(void *xp, const ushort *ip, void *fillp)
+#line 2164
+{
+#line 2164
+    int err=NC_NOERR;
+#line 2164
+#if SIZEOF_IX_UINT64 == SIZEOF_USHORT && IX_UINT64_MAX == USHORT_MAX
+#line 2164
+    put_ix_uint64(xp, (const ix_uint64 *)ip);
+#line 2164
 #else
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-#if IX_ULONGLONG_MAX < ULONGLONG_MAX
-	if (*ip > IX_ULONGLONG_MAX) return NC_ERANGE;
-#endif
+#line 2164
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2164
+
+#line 2164
+#if IX_UINT64_MAX < USHORT_MAX
+#line 2164
+    if (*ip > IX_UINT64_MAX) {
+#line 2164
+        
+#line 2164
+        err = NC_ERANGE;
+#line 2164
+    } 
+#line 2164
+#endif
+#line 2164
+        xx = (ix_uint64)*ip;
+#line 2164
+
+#line 2164
+    put_ix_uint64(xp, &xx);
+#line 2164
+#endif
+#line 2164
+    return err;
+#line 2164
+}
+#line 2164
 
-#endif
-	return NC_NOERR;
-}
+static int
+#line 2165
+ncx_put_ulonglong_uint(void *xp, const uint *ip, void *fillp)
+#line 2165
+{
+#line 2165
+    int err=NC_NOERR;
+#line 2165
+#if SIZEOF_IX_UINT64 == SIZEOF_UINT && IX_UINT64_MAX == UINT_MAX
+#line 2165
+    put_ix_uint64(xp, (const ix_uint64 *)ip);
+#line 2165
+#else
+#line 2165
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2165
+
+#line 2165
+#if IX_UINT64_MAX < UINT_MAX
+#line 2165
+    if (*ip > IX_UINT64_MAX) {
+#line 2165
+        
+#line 2165
+        err = NC_ERANGE;
+#line 2165
+    } 
+#line 2165
+#endif
+#line 2165
+        xx = (ix_uint64)*ip;
+#line 2165
+
+#line 2165
+    put_ix_uint64(xp, &xx);
+#line 2165
+#endif
+#line 2165
+    return err;
+#line 2165
+}
+#line 2165
 
 static int
-ncx_put_ulonglong_float(void *xp, const float *ip)
-{
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-	if(*ip > (double)X_ULONGLONG_MAX || *ip < 0) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 2166
+ncx_put_ulonglong_float(void *xp, const float *ip, void *fillp)
+#line 2166
+{
+#line 2166
+    int err=NC_NOERR;
+#line 2166
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2166
+
+#line 2166
+    if (*ip > (double)X_UINT64_MAX || *ip < 0) {
+#line 2166
+        
+#line 2166
+        err = NC_ERANGE;
+#line 2166
+    } 
+#line 2166
+        xx = (ix_uint64)*ip;
+#line 2166
+
+#line 2166
+    put_ix_uint64(xp, &xx);
+#line 2166
+    return err;
+#line 2166
+}
+#line 2166
 
 static int
-ncx_put_ulonglong_double(void *xp, const double *ip)
-{
-	ix_ulonglong xx = (ix_ulonglong)*ip;
-	put_ix_ulonglong(xp, &xx);
-	if(*ip > X_ULONGLONG_MAX || *ip < 0) return NC_ERANGE;
-	return NC_NOERR;
-}
+#line 2167
+ncx_put_ulonglong_double(void *xp, const double *ip, void *fillp)
+#line 2167
+{
+#line 2167
+    int err=NC_NOERR;
+#line 2167
+    ix_uint64 xx = NC_FILL_UINT64;
+#line 2167
+
+#line 2167
+    if (*ip > X_UINT64_MAX || *ip < 0) {
+#line 2167
+        
+#line 2167
+        err = NC_ERANGE;
+#line 2167
+    } 
+#line 2167
+        xx = (ix_uint64)*ip;
+#line 2167
+
+#line 2167
+    put_ix_uint64(xp, &xx);
+#line 2167
+    return err;
+#line 2167
+}
+#line 2167
+
 
 
 /* x_size_t */
@@ -3451,7 +7825,7 @@ ncx_get_size_t(const void **xpp,  size_t *ulp)
 	/* similar to get_ix_int */
 	const uchar *cp = (const uchar *) *xpp;
 
-	*ulp = (unsigned)(*cp++ << 24);
+	*ulp  = (unsigned)(*cp++ << 24);
 	*ulp |= (*cp++ << 16);
 	*ulp |= (*cp++ << 8);
 	*ulp |= *cp;
@@ -3465,9 +7839,7 @@ ncx_get_size_t(const void **xpp,  size_t *ulp)
 int
 ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t)
 {
-	/* similar to put_ix_int() */
-	uchar *cp = (uchar *) *xpp;
-		/* No negative offsets stored in netcdf */
+	/* No negative offsets stored in netcdf */
 	if (*lp < 0) {
 	  /* Assume this is an overflow of a 32-bit int... */
 	  return NC_ERANGE;
@@ -3475,6 +7847,9 @@ ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t)
 
 	assert(sizeof_off_t == 4 || sizeof_off_t == 8);
 
+	/* similar to put_ix_int() */
+	uchar *cp = (uchar *) *xpp;
+
 	if (sizeof_off_t == 4) {
 		*cp++ = (uchar) ((*lp)               >> 24);
 		*cp++ = (uchar)(((*lp) & 0x00ff0000) >> 16);
@@ -3494,13 +7869,13 @@ ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t)
 		*cp   = (uchar)( (*lp) & 0x000000ff);
 #else
 		*cp++ = (uchar) ((*lp)                          >> 56);
-		*cp++ = (uchar)(((*lp) & 0x00ff000000000000ULL) >> 48);
-		*cp++ = (uchar)(((*lp) & 0x0000ff0000000000ULL) >> 40);
-		*cp++ = (uchar)(((*lp) & 0x000000ff00000000ULL) >> 32);
-		*cp++ = (uchar)(((*lp) & 0x00000000ff000000ULL) >> 24);
-		*cp++ = (uchar)(((*lp) & 0x0000000000ff0000ULL) >> 16);
-		*cp++ = (uchar)(((*lp) & 0x000000000000ff00ULL) >>  8);
-		*cp   = (uchar)( (*lp) & 0x00000000000000ffULL);
+		*cp++ = (uchar)(((*lp) & 0x00ff000000000000LL) >> 48);
+		*cp++ = (uchar)(((*lp) & 0x0000ff0000000000LL) >> 40);
+		*cp++ = (uchar)(((*lp) & 0x000000ff00000000LL) >> 32);
+		*cp++ = (uchar)(((*lp) & 0x00000000ff000000LL) >> 24);
+		*cp++ = (uchar)(((*lp) & 0x0000000000ff0000LL) >> 16);
+		*cp++ = (uchar)(((*lp) & 0x000000000000ff00LL) >>  8);
+		*cp   = (uchar)( (*lp) & 0x00000000000000ffLL);
 #endif
 	}
 	*xpp = (void *)((char *)(*xpp) + sizeof_off_t);
@@ -3564,62 +7939,68 @@ ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t)
 	return NC_NOERR;
 }
 
-/*----< ncx_get_int32() >--------------------------------------------------*/
+/*----< ncx_get_uint32() >------------------------------------------*/
 int
-ncx_get_int32(const void **xpp,
-              int         *ip)
+ncx_get_uint32(const void **xpp, uint *ip)
 {
+#ifdef WORDS_BIGENDIAN
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(ip, *xpp, SIZEOF_UINT);
+#else
     const uchar *cp = (const uchar *) *xpp;
 
-    /* cannot call swap4b(), as lp is 8-byte */
-    *ip  = (*cp++ << 24);
-    *ip |= (*cp++ << 16);
-    *ip |= (*cp++ <<  8);
-    *ip |=  *cp;
-
+    *ip = (uint)(*cp++ << 24);
+    *ip = (uint)(*ip | (uint)(*cp++ << 16));
+    *ip = (uint)(*ip | (uint)(*cp++ <<  8));
+    *ip = (uint)(*ip | *cp);
+#endif
     /* advance *xpp 4 bytes */
     *xpp = (void *)((const char *)(*xpp) + 4);
 
     return NC_NOERR;
 }
 
-/*----< ncx_get_int64() >-------------------------------------------------*/
+/*----< ncx_get_uint64() >------------------------------------------*/
 int
-ncx_get_int64(const void **xpp,
-              long long   *llp)
+ncx_get_uint64(const void **xpp, unsigned long long *ullp)
 {
+#ifdef WORDS_BIGENDIAN
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(ullp, *xpp, SIZEOF_UINT64);
+#else
     const uchar *cp = (const uchar *) *xpp;
 
-    /* below is the same as calling swap8b(llp, *xpp) */
-    *llp  = ((long long)(*cp++) << 56);
-    *llp |= ((long long)(*cp++) << 48);
-    *llp |= ((long long)(*cp++) << 40);
-    *llp |= ((long long)(*cp++) << 32);
-    *llp |= ((long long)(*cp++) << 24);
-    *llp |= ((long long)(*cp++) << 16);
-    *llp |= ((long long)(*cp++) <<  8);
-    *llp |=  (long long)*cp;
-
+    /* below is the same as calling swap8b(ullp, *xpp) */
+    *ullp = (unsigned long long)(*cp++) << 56;
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 48);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 40);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 32);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 24);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 16);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) <<  8);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp));
+#endif
     /* advance *xpp 8 bytes */
     *xpp = (void *)((const char *)(*xpp) + 8);
 
     return NC_NOERR;
 }
 
-/*---< ncx_put_int32() >-----------------------------------------------------*/
-/* copy the contents of lp (a signed 32-bit integer) to xpp in Big Endian
+/*---< ncx_put_uint32() >-------------------------------------------*/
+/* copy the contents of ip (an unsigned 32-bit integer) to xpp in Big Endian
  * form and advance *xpp 4 bytes
  */
 int
-ncx_put_int32(void      **xpp,
-              const int   ip)
+ncx_put_uint32(void **xpp, const unsigned int ip)
 {
 #ifdef WORDS_BIGENDIAN
-    int *ptr = (int*) (*xpp); /* typecast to 4-byte integer */
-    *ptr = ip;
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(*xpp, &ip, X_SIZEOF_UINT);
 #else
     /* bitwise shifts below are to produce an integer in Big Endian */
-    /* cannot call swap4b(), as lp is 8-byte */
     uchar *cp = (uchar *) *xpp;
     *cp++ = (uchar)((ip & 0xff000000) >> 24);
     *cp++ = (uchar)((ip & 0x00ff0000) >> 16);
@@ -3632,28 +8013,28 @@ ncx_put_int32(void      **xpp,
     return NC_NOERR;
 }
 
-/*---< ncx_put_int64() >-----------------------------------------------------*/
-/* copy the contents of lp (a signed 64-bit integer) to xpp in Big Endian
+/*---< ncx_put_uint64() >-------------------------------------------*/
+/* copy the contents of ip (an unsigned 64-bit integer) to xpp in Big Endian
  * form and advance *xpp 8 bytes
  */
 int
-ncx_put_int64(void             **xpp,
-              const long long    ip)
+ncx_put_uint64(void **xpp, const unsigned long long ip)
 {
 #ifdef WORDS_BIGENDIAN
-    long long *ptr = (long long*) (*xpp); /* typecast to 8-byte integer */
-    *ptr = ip;
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(*xpp, &ip, X_SIZEOF_UINT64);
 #else
     uchar *cp = (uchar *) *xpp;
     /* below is the same as calling swap8b(*xpp, &ip) */
-    *cp++ = (uchar)((ip & 0xff00000000000000ULL) >> 56);
-    *cp++ = (uchar)((ip & 0x00ff000000000000ULL) >> 48);
-    *cp++ = (uchar)((ip & 0x0000ff0000000000ULL) >> 40);
-    *cp++ = (uchar)((ip & 0x000000ff00000000ULL) >> 32);
-    *cp++ = (uchar)((ip & 0x00000000ff000000ULL) >> 24);
-    *cp++ = (uchar)((ip & 0x0000000000ff0000ULL) >> 16);
-    *cp++ = (uchar)((ip & 0x000000000000ff00ULL) >>  8);
-    *cp   = (uchar)( ip & 0x00000000000000ffULL);
+    *cp++ = (uchar) (ip                         >> 56);
+    *cp++ = (uchar)((ip & 0x00ff000000000000LL) >> 48);
+    *cp++ = (uchar)((ip & 0x0000ff0000000000LL) >> 40);
+    *cp++ = (uchar)((ip & 0x000000ff00000000LL) >> 32);
+    *cp++ = (uchar)((ip & 0x00000000ff000000LL) >> 24);
+    *cp++ = (uchar)((ip & 0x0000000000ff0000LL) >> 16);
+    *cp++ = (uchar)((ip & 0x000000000000ff00LL) >>  8);
+    *cp   = (uchar) (ip & 0x00000000000000ffLL);
 #endif
     /* advance *xpp 8 bytes */
     *xpp  = (void *)((char *)(*xpp) + 8);
@@ -3665,2407 +8046,5283 @@ ncx_put_int64(void             **xpp,
 /*
  * Aggregate numeric conversion functions.
  */
+#line 2423
 
+#line 2822
 
+#line 2828
 
 /* schar ---------------------------------------------------------------------*/
 
+#line 2832
 int
 ncx_getn_schar_schar(const void **xpp, size_t nelems, schar *tp)
 {
-		(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((schar *)(*xpp) + nelems);
+		(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 2835
+	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 2835
 	return NC_NOERR;
+#line 2835
 
 }
 int
+#line 2837
 ncx_getn_schar_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 2837
+{
+#line 2837
+    int status = NC_NOERR;
+#line 2837
+    schar *xp = (schar *)(*xpp);
+#line 2837
+
+#line 2837
+    while (nelems-- != 0) {
+#line 2837
+        
+#line 2837
+        if (*xp < 0) {
+#line 2837
+            
+#line 2837
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2837
+            
+#line 2837
+        }
+#line 2837
+        *tp++ = (uchar) (signed) (*xp++);  /* type cast from schar to uchar */
+#line 2837
+    }
+#line 2837
+
+#line 2837
+    *xpp = (const void *)xp;
+#line 2837
+    return status;
+#line 2837
+}
+#line 2837
+
+int
+#line 2838
+ncx_getn_schar_short(const void **xpp, size_t nelems, short *tp)
+#line 2838
 {
-		(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((schar *)(*xpp) + nelems);
-	return NC_NOERR;
+#line 2838
+    int status = NC_NOERR;
+#line 2838
+    schar *xp = (schar *)(*xpp);
+#line 2838
+
+#line 2838
+    while (nelems-- != 0) {
+#line 2838
+        
+#line 2838
+        *tp++ = (short)  (*xp++);  /* type cast from schar to short */
+#line 2838
+    }
+#line 2838
 
+#line 2838
+    *xpp = (const void *)xp;
+#line 2838
+    return status;
+#line 2838
 }
+#line 2838
+
 int
-ncx_getn_schar_short(const void **xpp, size_t nelems, short *tp)
+#line 2839
+ncx_getn_schar_int(const void **xpp, size_t nelems, int *tp)
+#line 2839
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
+#line 2839
+    int status = NC_NOERR;
+#line 2839
+    schar *xp = (schar *)(*xpp);
+#line 2839
 
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
+#line 2839
+    while (nelems-- != 0) {
+#line 2839
+        
+#line 2839
+        *tp++ = (int)  (*xp++);  /* type cast from schar to int */
+#line 2839
+    }
+#line 2839
 
-	*xpp = (const void *)xp;
-	return status;
+#line 2839
+    *xpp = (const void *)xp;
+#line 2839
+    return status;
+#line 2839
 }
+#line 2839
 
 int
-ncx_getn_schar_int(const void **xpp, size_t nelems, int *tp)
+#line 2840
+ncx_getn_schar_long(const void **xpp, size_t nelems, long *tp)
+#line 2840
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
+#line 2840
+    int status = NC_NOERR;
+#line 2840
+    schar *xp = (schar *)(*xpp);
+#line 2840
 
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
+#line 2840
+    while (nelems-- != 0) {
+#line 2840
+        
+#line 2840
+        *tp++ = (long)  (*xp++);  /* type cast from schar to long */
+#line 2840
+    }
+#line 2840
 
-	*xpp = (const void *)xp;
-	return status;
+#line 2840
+    *xpp = (const void *)xp;
+#line 2840
+    return status;
+#line 2840
 }
+#line 2840
 
 int
+#line 2841
 ncx_getn_schar_float(const void **xpp, size_t nelems, float *tp)
+#line 2841
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
+#line 2841
+    int status = NC_NOERR;
+#line 2841
+    schar *xp = (schar *)(*xpp);
+#line 2841
 
-		*tp++ = *xp++;
-	}
+#line 2841
+    while (nelems-- != 0) {
+#line 2841
+        
+#line 2841
+        *tp++ = (float)  (*xp++);  /* type cast from schar to float */
+#line 2841
+    }
+#line 2841
 
-	*xpp = (const void *)xp;
-	return status;
+#line 2841
+    *xpp = (const void *)xp;
+#line 2841
+    return status;
+#line 2841
 }
+#line 2841
 
 int
+#line 2842
 ncx_getn_schar_double(const void **xpp, size_t nelems, double *tp)
+#line 2842
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
+#line 2842
+    int status = NC_NOERR;
+#line 2842
+    schar *xp = (schar *)(*xpp);
+#line 2842
 
-		*tp++ = *xp++;
-	}
+#line 2842
+    while (nelems-- != 0) {
+#line 2842
+        
+#line 2842
+        *tp++ = (double)  (*xp++);  /* type cast from schar to double */
+#line 2842
+    }
+#line 2842
 
-	*xpp = (const void *)xp;
-	return status;
+#line 2842
+    *xpp = (const void *)xp;
+#line 2842
+    return status;
+#line 2842
 }
+#line 2842
 
 int
+#line 2843
 ncx_getn_schar_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 2843
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
+#line 2843
+    int status = NC_NOERR;
+#line 2843
+    schar *xp = (schar *)(*xpp);
+#line 2843
 
-		*tp++ = *xp++;
-	}
+#line 2843
+    while (nelems-- != 0) {
+#line 2843
+        
+#line 2843
+        *tp++ = (longlong)  (*xp++);  /* type cast from schar to longlong */
+#line 2843
+    }
+#line 2843
 
-	*xpp = (const void *)xp;
-	return status;
+#line 2843
+    *xpp = (const void *)xp;
+#line 2843
+    return status;
+#line 2843
 }
+#line 2843
 
 int
+#line 2844
 ncx_getn_schar_ushort(const void **xpp, size_t nelems, ushort *tp)
-{
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-		if (*xp < 0) status = NC_ERANGE;
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
+#line 2844
+{
+#line 2844
+    int status = NC_NOERR;
+#line 2844
+    schar *xp = (schar *)(*xpp);
+#line 2844
+
+#line 2844
+    while (nelems-- != 0) {
+#line 2844
+        
+#line 2844
+        if (*xp < 0) {
+#line 2844
+            
+#line 2844
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2844
+            
+#line 2844
+        }
+#line 2844
+        *tp++ = (ushort) (signed) (*xp++);  /* type cast from schar to ushort */
+#line 2844
+    }
+#line 2844
+
+#line 2844
+    *xpp = (const void *)xp;
+#line 2844
+    return status;
+#line 2844
+}
+#line 2844
+
+int
+#line 2845
 ncx_getn_schar_uint(const void **xpp, size_t nelems, uint *tp)
-{
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-		if (*xp < 0) status = NC_ERANGE;
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
+#line 2845
+{
+#line 2845
+    int status = NC_NOERR;
+#line 2845
+    schar *xp = (schar *)(*xpp);
+#line 2845
+
+#line 2845
+    while (nelems-- != 0) {
+#line 2845
+        
+#line 2845
+        if (*xp < 0) {
+#line 2845
+            
+#line 2845
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2845
+            
+#line 2845
+        }
+#line 2845
+        *tp++ = (uint) (signed) (*xp++);  /* type cast from schar to uint */
+#line 2845
+    }
+#line 2845
+
+#line 2845
+    *xpp = (const void *)xp;
+#line 2845
+    return status;
+#line 2845
+}
+#line 2845
+
+int
+#line 2846
 ncx_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
-{
-	int status = NC_NOERR;
-	schar *xp = (schar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-		if (*xp < 0) status = NC_ERANGE;
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-
+#line 2846
+{
+#line 2846
+    int status = NC_NOERR;
+#line 2846
+    schar *xp = (schar *)(*xpp);
+#line 2846
+
+#line 2846
+    while (nelems-- != 0) {
+#line 2846
+        
+#line 2846
+        if (*xp < 0) {
+#line 2846
+            
+#line 2846
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2846
+            
+#line 2846
+        }
+#line 2846
+        *tp++ = (ulonglong) (signed) (*xp++);  /* type cast from schar to ulonglong */
+#line 2846
+    }
+#line 2846
+
+#line 2846
+    *xpp = (const void *)xp;
+#line 2846
+    return status;
+#line 2846
+}
+#line 2846
+
+
+#line 2849
 int
 ncx_pad_getn_schar_schar(const void **xpp, size_t nelems, schar *tp)
 {
 		size_t rndup = nelems % X_ALIGN;
+#line 2852
 
-	if(rndup)
+#line 2852
+	if (rndup)
+#line 2852
 		rndup = X_ALIGN - rndup;
+#line 2852
 
-	(void) memcpy(tp, *xpp, nelems);
+#line 2852
+	(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 2852
 	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
+#line 2852
 
+#line 2852
 	return NC_NOERR;
+#line 2852
 
 }
 int
+#line 2854
 ncx_pad_getn_schar_uchar(const void **xpp, size_t nelems, uchar *tp)
-{
-		size_t rndup = nelems % X_ALIGN;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
+#line 2854
+{
+#line 2854
+    int status = NC_NOERR;
+#line 2854
+    size_t rndup = nelems % X_ALIGN;
+#line 2854
+    schar *xp = (schar *) *xpp;
+#line 2854
+
+#line 2854
+    if (rndup)
+#line 2854
+        rndup = X_ALIGN - rndup;
+#line 2854
+
+#line 2854
+    while (nelems-- != 0) {
+#line 2854
+        
+#line 2854
+        if (*xp < 0) {
+#line 2854
+            
+#line 2854
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2854
+            
+#line 2854
+        }
+#line 2854
+        *tp++ = (uchar) (signed) (*xp++);  /* type cast from schar to uchar */
+#line 2854
+    }
+#line 2854
+
+#line 2854
+    *xpp = (void *)(xp + rndup);
+#line 2854
+    return status;
+#line 2854
+}
+#line 2854
+
+int
+#line 2855
+ncx_pad_getn_schar_short(const void **xpp, size_t nelems, short *tp)
+#line 2855
+{
+#line 2855
+    int status = NC_NOERR;
+#line 2855
+    size_t rndup = nelems % X_ALIGN;
+#line 2855
+    schar *xp = (schar *) *xpp;
+#line 2855
+
+#line 2855
+    if (rndup)
+#line 2855
+        rndup = X_ALIGN - rndup;
+#line 2855
+
+#line 2855
+    while (nelems-- != 0) {
+#line 2855
+        
+#line 2855
+        *tp++ = (short)  (*xp++);  /* type cast from schar to short */
+#line 2855
+    }
+#line 2855
+
+#line 2855
+    *xpp = (void *)(xp + rndup);
+#line 2855
+    return status;
+#line 2855
+}
+#line 2855
+
+int
+#line 2856
+ncx_pad_getn_schar_int(const void **xpp, size_t nelems, int *tp)
+#line 2856
+{
+#line 2856
+    int status = NC_NOERR;
+#line 2856
+    size_t rndup = nelems % X_ALIGN;
+#line 2856
+    schar *xp = (schar *) *xpp;
+#line 2856
+
+#line 2856
+    if (rndup)
+#line 2856
+        rndup = X_ALIGN - rndup;
+#line 2856
+
+#line 2856
+    while (nelems-- != 0) {
+#line 2856
+        
+#line 2856
+        *tp++ = (int)  (*xp++);  /* type cast from schar to int */
+#line 2856
+    }
+#line 2856
+
+#line 2856
+    *xpp = (void *)(xp + rndup);
+#line 2856
+    return status;
+#line 2856
+}
+#line 2856
+
+int
+#line 2857
+ncx_pad_getn_schar_long(const void **xpp, size_t nelems, long *tp)
+#line 2857
+{
+#line 2857
+    int status = NC_NOERR;
+#line 2857
+    size_t rndup = nelems % X_ALIGN;
+#line 2857
+    schar *xp = (schar *) *xpp;
+#line 2857
+
+#line 2857
+    if (rndup)
+#line 2857
+        rndup = X_ALIGN - rndup;
+#line 2857
+
+#line 2857
+    while (nelems-- != 0) {
+#line 2857
+        
+#line 2857
+        *tp++ = (long)  (*xp++);  /* type cast from schar to long */
+#line 2857
+    }
+#line 2857
+
+#line 2857
+    *xpp = (void *)(xp + rndup);
+#line 2857
+    return status;
+#line 2857
+}
+#line 2857
+
+int
+#line 2858
+ncx_pad_getn_schar_float(const void **xpp, size_t nelems, float *tp)
+#line 2858
+{
+#line 2858
+    int status = NC_NOERR;
+#line 2858
+    size_t rndup = nelems % X_ALIGN;
+#line 2858
+    schar *xp = (schar *) *xpp;
+#line 2858
+
+#line 2858
+    if (rndup)
+#line 2858
+        rndup = X_ALIGN - rndup;
+#line 2858
+
+#line 2858
+    while (nelems-- != 0) {
+#line 2858
+        
+#line 2858
+        *tp++ = (float)  (*xp++);  /* type cast from schar to float */
+#line 2858
+    }
+#line 2858
+
+#line 2858
+    *xpp = (void *)(xp + rndup);
+#line 2858
+    return status;
+#line 2858
+}
+#line 2858
+
+int
+#line 2859
+ncx_pad_getn_schar_double(const void **xpp, size_t nelems, double *tp)
+#line 2859
+{
+#line 2859
+    int status = NC_NOERR;
+#line 2859
+    size_t rndup = nelems % X_ALIGN;
+#line 2859
+    schar *xp = (schar *) *xpp;
+#line 2859
+
+#line 2859
+    if (rndup)
+#line 2859
+        rndup = X_ALIGN - rndup;
+#line 2859
+
+#line 2859
+    while (nelems-- != 0) {
+#line 2859
+        
+#line 2859
+        *tp++ = (double)  (*xp++);  /* type cast from schar to double */
+#line 2859
+    }
+#line 2859
+
+#line 2859
+    *xpp = (void *)(xp + rndup);
+#line 2859
+    return status;
+#line 2859
+}
+#line 2859
+
+int
+#line 2860
+ncx_pad_getn_schar_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 2860
+{
+#line 2860
+    int status = NC_NOERR;
+#line 2860
+    size_t rndup = nelems % X_ALIGN;
+#line 2860
+    schar *xp = (schar *) *xpp;
+#line 2860
+
+#line 2860
+    if (rndup)
+#line 2860
+        rndup = X_ALIGN - rndup;
+#line 2860
+
+#line 2860
+    while (nelems-- != 0) {
+#line 2860
+        
+#line 2860
+        *tp++ = (longlong)  (*xp++);  /* type cast from schar to longlong */
+#line 2860
+    }
+#line 2860
+
+#line 2860
+    *xpp = (void *)(xp + rndup);
+#line 2860
+    return status;
+#line 2860
+}
+#line 2860
+
+int
+#line 2861
+ncx_pad_getn_schar_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 2861
+{
+#line 2861
+    int status = NC_NOERR;
+#line 2861
+    size_t rndup = nelems % X_ALIGN;
+#line 2861
+    schar *xp = (schar *) *xpp;
+#line 2861
+
+#line 2861
+    if (rndup)
+#line 2861
+        rndup = X_ALIGN - rndup;
+#line 2861
+
+#line 2861
+    while (nelems-- != 0) {
+#line 2861
+        
+#line 2861
+        if (*xp < 0) {
+#line 2861
+            
+#line 2861
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2861
+            
+#line 2861
+        }
+#line 2861
+        *tp++ = (ushort) (signed) (*xp++);  /* type cast from schar to ushort */
+#line 2861
+    }
+#line 2861
+
+#line 2861
+    *xpp = (void *)(xp + rndup);
+#line 2861
+    return status;
+#line 2861
+}
+#line 2861
+
+int
+#line 2862
+ncx_pad_getn_schar_uint(const void **xpp, size_t nelems, uint *tp)
+#line 2862
+{
+#line 2862
+    int status = NC_NOERR;
+#line 2862
+    size_t rndup = nelems % X_ALIGN;
+#line 2862
+    schar *xp = (schar *) *xpp;
+#line 2862
+
+#line 2862
+    if (rndup)
+#line 2862
+        rndup = X_ALIGN - rndup;
+#line 2862
+
+#line 2862
+    while (nelems-- != 0) {
+#line 2862
+        
+#line 2862
+        if (*xp < 0) {
+#line 2862
+            
+#line 2862
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2862
+            
+#line 2862
+        }
+#line 2862
+        *tp++ = (uint) (signed) (*xp++);  /* type cast from schar to uint */
+#line 2862
+    }
+#line 2862
+
+#line 2862
+    *xpp = (void *)(xp + rndup);
+#line 2862
+    return status;
+#line 2862
+}
+#line 2862
+
+int
+#line 2863
+ncx_pad_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 2863
+{
+#line 2863
+    int status = NC_NOERR;
+#line 2863
+    size_t rndup = nelems % X_ALIGN;
+#line 2863
+    schar *xp = (schar *) *xpp;
+#line 2863
+
+#line 2863
+    if (rndup)
+#line 2863
+        rndup = X_ALIGN - rndup;
+#line 2863
+
+#line 2863
+    while (nelems-- != 0) {
+#line 2863
+        
+#line 2863
+        if (*xp < 0) {
+#line 2863
+            
+#line 2863
+            status = NC_ERANGE; /* because tp is unsigned */
+#line 2863
+            
+#line 2863
+        }
+#line 2863
+        *tp++ = (ulonglong) (signed) (*xp++);  /* type cast from schar to ulonglong */
+#line 2863
+    }
+#line 2863
+
+#line 2863
+    *xpp = (void *)(xp + rndup);
+#line 2863
+    return status;
+#line 2863
+}
+#line 2863
+
+
+#line 2866
+int
+ncx_putn_schar_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+{
+		(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 2869
+	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 2869
 
+#line 2869
 	return NC_NOERR;
-
-}
-int
-ncx_pad_getn_schar_short(const void **xpp, size_t nelems, short *tp)
+#line 2869
+
+}
+int
+#line 2871
+ncx_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 2871
+{
+#line 2871
+    int status = NC_NOERR;
+#line 2871
+    schar *xp = (schar *) *xpp;
+#line 2871
+
+#line 2871
+    while (nelems-- != 0) {
+#line 2871
+        if (*tp > (uchar)X_SCHAR_MAX ) {
+#line 2871
+            
+#line 2871
+            status = NC_ERANGE;
+#line 2871
+            
+#line 2871
+        }
+#line 2871
+        *xp++ = (schar)  *tp++; /* type cast from uchar to schar */
+#line 2871
+    }
+#line 2871
+
+#line 2871
+    *xpp = (void *)xp;
+#line 2871
+    return status;
+#line 2871
+}
+#line 2871
+
+int
+#line 2872
+ncx_putn_schar_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 2872
+{
+#line 2872
+    int status = NC_NOERR;
+#line 2872
+    schar *xp = (schar *) *xpp;
+#line 2872
+
+#line 2872
+    while (nelems-- != 0) {
+#line 2872
+        if (*tp > (short)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2872
+            
+#line 2872
+            status = NC_ERANGE;
+#line 2872
+            
+#line 2872
+        }
+#line 2872
+        *xp++ = (schar)  *tp++; /* type cast from short to schar */
+#line 2872
+    }
+#line 2872
+
+#line 2872
+    *xpp = (void *)xp;
+#line 2872
+    return status;
+#line 2872
+}
+#line 2872
+
+int
+#line 2873
+ncx_putn_schar_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 2873
+{
+#line 2873
+    int status = NC_NOERR;
+#line 2873
+    schar *xp = (schar *) *xpp;
+#line 2873
+
+#line 2873
+    while (nelems-- != 0) {
+#line 2873
+        if (*tp > (int)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2873
+            
+#line 2873
+            status = NC_ERANGE;
+#line 2873
+            
+#line 2873
+        }
+#line 2873
+        *xp++ = (schar)  *tp++; /* type cast from int to schar */
+#line 2873
+    }
+#line 2873
+
+#line 2873
+    *xpp = (void *)xp;
+#line 2873
+    return status;
+#line 2873
+}
+#line 2873
+
+int
+#line 2874
+ncx_putn_schar_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 2874
+{
+#line 2874
+    int status = NC_NOERR;
+#line 2874
+    schar *xp = (schar *) *xpp;
+#line 2874
+
+#line 2874
+    while (nelems-- != 0) {
+#line 2874
+        if (*tp > (long)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2874
+            
+#line 2874
+            status = NC_ERANGE;
+#line 2874
+            
+#line 2874
+        }
+#line 2874
+        *xp++ = (schar)  *tp++; /* type cast from long to schar */
+#line 2874
+    }
+#line 2874
+
+#line 2874
+    *xpp = (void *)xp;
+#line 2874
+    return status;
+#line 2874
+}
+#line 2874
+
+int
+#line 2875
+ncx_putn_schar_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 2875
+{
+#line 2875
+    int status = NC_NOERR;
+#line 2875
+    schar *xp = (schar *) *xpp;
+#line 2875
+
+#line 2875
+    while (nelems-- != 0) {
+#line 2875
+        if (*tp > (float)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2875
+            
+#line 2875
+            status = NC_ERANGE;
+#line 2875
+            
+#line 2875
+        }
+#line 2875
+        *xp++ = (schar)  *tp++; /* type cast from float to schar */
+#line 2875
+    }
+#line 2875
+
+#line 2875
+    *xpp = (void *)xp;
+#line 2875
+    return status;
+#line 2875
+}
+#line 2875
+
+int
+#line 2876
+ncx_putn_schar_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 2876
+{
+#line 2876
+    int status = NC_NOERR;
+#line 2876
+    schar *xp = (schar *) *xpp;
+#line 2876
+
+#line 2876
+    while (nelems-- != 0) {
+#line 2876
+        if (*tp > (double)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2876
+            
+#line 2876
+            status = NC_ERANGE;
+#line 2876
+            
+#line 2876
+        }
+#line 2876
+        *xp++ = (schar)  *tp++; /* type cast from double to schar */
+#line 2876
+    }
+#line 2876
+
+#line 2876
+    *xpp = (void *)xp;
+#line 2876
+    return status;
+#line 2876
+}
+#line 2876
+
+int
+#line 2877
+ncx_putn_schar_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 2877
+{
+#line 2877
+    int status = NC_NOERR;
+#line 2877
+    schar *xp = (schar *) *xpp;
+#line 2877
+
+#line 2877
+    while (nelems-- != 0) {
+#line 2877
+        if (*tp > (longlong)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2877
+            
+#line 2877
+            status = NC_ERANGE;
+#line 2877
+            
+#line 2877
+        }
+#line 2877
+        *xp++ = (schar)  *tp++; /* type cast from longlong to schar */
+#line 2877
+    }
+#line 2877
+
+#line 2877
+    *xpp = (void *)xp;
+#line 2877
+    return status;
+#line 2877
+}
+#line 2877
+
+int
+#line 2878
+ncx_putn_schar_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 2878
+{
+#line 2878
+    int status = NC_NOERR;
+#line 2878
+    schar *xp = (schar *) *xpp;
+#line 2878
+
+#line 2878
+    while (nelems-- != 0) {
+#line 2878
+        if (*tp > (ushort)X_SCHAR_MAX ) {
+#line 2878
+            
+#line 2878
+            status = NC_ERANGE;
+#line 2878
+            
+#line 2878
+        }
+#line 2878
+        *xp++ = (schar)  *tp++; /* type cast from ushort to schar */
+#line 2878
+    }
+#line 2878
+
+#line 2878
+    *xpp = (void *)xp;
+#line 2878
+    return status;
+#line 2878
+}
+#line 2878
+
+int
+#line 2879
+ncx_putn_schar_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 2879
+{
+#line 2879
+    int status = NC_NOERR;
+#line 2879
+    schar *xp = (schar *) *xpp;
+#line 2879
+
+#line 2879
+    while (nelems-- != 0) {
+#line 2879
+        if (*tp > (uint)X_SCHAR_MAX ) {
+#line 2879
+            
+#line 2879
+            status = NC_ERANGE;
+#line 2879
+            
+#line 2879
+        }
+#line 2879
+        *xp++ = (schar)  *tp++; /* type cast from uint to schar */
+#line 2879
+    }
+#line 2879
+
+#line 2879
+    *xpp = (void *)xp;
+#line 2879
+    return status;
+#line 2879
+}
+#line 2879
+
+int
+#line 2880
+ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 2880
+{
+#line 2880
+    int status = NC_NOERR;
+#line 2880
+    schar *xp = (schar *) *xpp;
+#line 2880
+
+#line 2880
+    while (nelems-- != 0) {
+#line 2880
+        if (*tp > (ulonglong)X_SCHAR_MAX ) {
+#line 2880
+            
+#line 2880
+            status = NC_ERANGE;
+#line 2880
+            
+#line 2880
+        }
+#line 2880
+        *xp++ = (schar)  *tp++; /* type cast from ulonglong to schar */
+#line 2880
+    }
+#line 2880
+
+#line 2880
+    *xpp = (void *)xp;
+#line 2880
+    return status;
+#line 2880
+}
+#line 2880
+
+
+#line 2883
+int
+ncx_pad_putn_schar_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
+		size_t rndup = nelems % X_ALIGN;
+#line 2886
 
-	if(rndup)
+#line 2886
+	if (rndup)
+#line 2886
 		rndup = X_ALIGN - rndup;
+#line 2886
 
-	while(nelems-- != 0)
-	{
+#line 2886
+	(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 2886
+	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 2886
 
-		*tp++ = *xp++;
+#line 2886
+	if (rndup)
+#line 2886
+	{
+#line 2886
+		(void) memcpy(*xpp, nada, (size_t)rndup);
+#line 2886
+		*xpp = (void *)((char *)(*xpp) + rndup);
+#line 2886
 	}
+#line 2886
 
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_schar_int(const void **xpp, size_t nelems, int *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
+#line 2886
+	return NC_NOERR;
+#line 2886
+
+}
+int
+#line 2888
+ncx_pad_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 2888
+{
+#line 2888
+    int status = NC_NOERR;
+#line 2888
+    size_t rndup = nelems % X_ALIGN;
+#line 2888
+    schar *xp = (schar *) *xpp;
+#line 2888
+
+#line 2888
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2888
+
+#line 2888
+    while (nelems-- != 0) {
+#line 2888
+        if (*tp > (uchar)X_SCHAR_MAX ) {
+#line 2888
+            
+#line 2888
+            status = NC_ERANGE;
+#line 2888
+            
+#line 2888
+        }
+#line 2888
+        *xp++ = (schar)  *tp++; /* type cast from uchar to schar */
+#line 2888
+    }
+#line 2888
+
+#line 2888
+
+#line 2888
+    if (rndup) {
+#line 2888
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2888
+        xp += rndup;
+#line 2888
+    }
+#line 2888
+
+#line 2888
+    *xpp = (void *)xp;
+#line 2888
+    return status;
+#line 2888
+}
+#line 2888
+
+int
+#line 2889
+ncx_pad_putn_schar_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 2889
+{
+#line 2889
+    int status = NC_NOERR;
+#line 2889
+    size_t rndup = nelems % X_ALIGN;
+#line 2889
+    schar *xp = (schar *) *xpp;
+#line 2889
+
+#line 2889
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2889
+
+#line 2889
+    while (nelems-- != 0) {
+#line 2889
+        if (*tp > (short)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2889
+            
+#line 2889
+            status = NC_ERANGE;
+#line 2889
+            
+#line 2889
+        }
+#line 2889
+        *xp++ = (schar)  *tp++; /* type cast from short to schar */
+#line 2889
+    }
+#line 2889
+
+#line 2889
+
+#line 2889
+    if (rndup) {
+#line 2889
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2889
+        xp += rndup;
+#line 2889
+    }
+#line 2889
+
+#line 2889
+    *xpp = (void *)xp;
+#line 2889
+    return status;
+#line 2889
+}
+#line 2889
+
+int
+#line 2890
+ncx_pad_putn_schar_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 2890
+{
+#line 2890
+    int status = NC_NOERR;
+#line 2890
+    size_t rndup = nelems % X_ALIGN;
+#line 2890
+    schar *xp = (schar *) *xpp;
+#line 2890
+
+#line 2890
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2890
+
+#line 2890
+    while (nelems-- != 0) {
+#line 2890
+        if (*tp > (int)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2890
+            
+#line 2890
+            status = NC_ERANGE;
+#line 2890
+            
+#line 2890
+        }
+#line 2890
+        *xp++ = (schar)  *tp++; /* type cast from int to schar */
+#line 2890
+    }
+#line 2890
+
+#line 2890
+
+#line 2890
+    if (rndup) {
+#line 2890
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2890
+        xp += rndup;
+#line 2890
+    }
+#line 2890
+
+#line 2890
+    *xpp = (void *)xp;
+#line 2890
+    return status;
+#line 2890
+}
+#line 2890
+
+int
+#line 2891
+ncx_pad_putn_schar_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 2891
+{
+#line 2891
+    int status = NC_NOERR;
+#line 2891
+    size_t rndup = nelems % X_ALIGN;
+#line 2891
+    schar *xp = (schar *) *xpp;
+#line 2891
+
+#line 2891
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2891
+
+#line 2891
+    while (nelems-- != 0) {
+#line 2891
+        if (*tp > (long)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2891
+            
+#line 2891
+            status = NC_ERANGE;
+#line 2891
+            
+#line 2891
+        }
+#line 2891
+        *xp++ = (schar)  *tp++; /* type cast from long to schar */
+#line 2891
+    }
+#line 2891
+
+#line 2891
+
+#line 2891
+    if (rndup) {
+#line 2891
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2891
+        xp += rndup;
+#line 2891
+    }
+#line 2891
+
+#line 2891
+    *xpp = (void *)xp;
+#line 2891
+    return status;
+#line 2891
+}
+#line 2891
+
+int
+#line 2892
+ncx_pad_putn_schar_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 2892
+{
+#line 2892
+    int status = NC_NOERR;
+#line 2892
+    size_t rndup = nelems % X_ALIGN;
+#line 2892
+    schar *xp = (schar *) *xpp;
+#line 2892
+
+#line 2892
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2892
+
+#line 2892
+    while (nelems-- != 0) {
+#line 2892
+        if (*tp > (float)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2892
+            
+#line 2892
+            status = NC_ERANGE;
+#line 2892
+            
+#line 2892
+        }
+#line 2892
+        *xp++ = (schar)  *tp++; /* type cast from float to schar */
+#line 2892
+    }
+#line 2892
+
+#line 2892
+
+#line 2892
+    if (rndup) {
+#line 2892
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2892
+        xp += rndup;
+#line 2892
+    }
+#line 2892
+
+#line 2892
+    *xpp = (void *)xp;
+#line 2892
+    return status;
+#line 2892
+}
+#line 2892
+
+int
+#line 2893
+ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 2893
+{
+#line 2893
+    int status = NC_NOERR;
+#line 2893
+    size_t rndup = nelems % X_ALIGN;
+#line 2893
+    schar *xp = (schar *) *xpp;
+#line 2893
+
+#line 2893
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2893
+
+#line 2893
+    while (nelems-- != 0) {
+#line 2893
+        if (*tp > (double)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2893
+            
+#line 2893
+            status = NC_ERANGE;
+#line 2893
+            
+#line 2893
+        }
+#line 2893
+        *xp++ = (schar)  *tp++; /* type cast from double to schar */
+#line 2893
+    }
+#line 2893
+
+#line 2893
+
+#line 2893
+    if (rndup) {
+#line 2893
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2893
+        xp += rndup;
+#line 2893
+    }
+#line 2893
+
+#line 2893
+    *xpp = (void *)xp;
+#line 2893
+    return status;
+#line 2893
+}
+#line 2893
+
+int
+#line 2894
+ncx_pad_putn_schar_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 2894
+{
+#line 2894
+    int status = NC_NOERR;
+#line 2894
+    size_t rndup = nelems % X_ALIGN;
+#line 2894
+    schar *xp = (schar *) *xpp;
+#line 2894
+
+#line 2894
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2894
+
+#line 2894
+    while (nelems-- != 0) {
+#line 2894
+        if (*tp > (longlong)X_SCHAR_MAX || *tp < X_SCHAR_MIN) {
+#line 2894
+            
+#line 2894
+            status = NC_ERANGE;
+#line 2894
+            
+#line 2894
+        }
+#line 2894
+        *xp++ = (schar)  *tp++; /* type cast from longlong to schar */
+#line 2894
+    }
+#line 2894
+
+#line 2894
+
+#line 2894
+    if (rndup) {
+#line 2894
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2894
+        xp += rndup;
+#line 2894
+    }
+#line 2894
+
+#line 2894
+    *xpp = (void *)xp;
+#line 2894
+    return status;
+#line 2894
+}
+#line 2894
+
+int
+#line 2895
+ncx_pad_putn_schar_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 2895
+{
+#line 2895
+    int status = NC_NOERR;
+#line 2895
+    size_t rndup = nelems % X_ALIGN;
+#line 2895
+    schar *xp = (schar *) *xpp;
+#line 2895
+
+#line 2895
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2895
+
+#line 2895
+    while (nelems-- != 0) {
+#line 2895
+        if (*tp > (ushort)X_SCHAR_MAX ) {
+#line 2895
+            
+#line 2895
+            status = NC_ERANGE;
+#line 2895
+            
+#line 2895
+        }
+#line 2895
+        *xp++ = (schar)  *tp++; /* type cast from ushort to schar */
+#line 2895
+    }
+#line 2895
+
+#line 2895
+
+#line 2895
+    if (rndup) {
+#line 2895
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2895
+        xp += rndup;
+#line 2895
+    }
+#line 2895
+
+#line 2895
+    *xpp = (void *)xp;
+#line 2895
+    return status;
+#line 2895
+}
+#line 2895
+
+int
+#line 2896
+ncx_pad_putn_schar_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 2896
+{
+#line 2896
+    int status = NC_NOERR;
+#line 2896
+    size_t rndup = nelems % X_ALIGN;
+#line 2896
+    schar *xp = (schar *) *xpp;
+#line 2896
+
+#line 2896
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2896
+
+#line 2896
+    while (nelems-- != 0) {
+#line 2896
+        if (*tp > (uint)X_SCHAR_MAX ) {
+#line 2896
+            
+#line 2896
+            status = NC_ERANGE;
+#line 2896
+            
+#line 2896
+        }
+#line 2896
+        *xp++ = (schar)  *tp++; /* type cast from uint to schar */
+#line 2896
+    }
+#line 2896
+
+#line 2896
+
+#line 2896
+    if (rndup) {
+#line 2896
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2896
+        xp += rndup;
+#line 2896
+    }
+#line 2896
+
+#line 2896
+    *xpp = (void *)xp;
+#line 2896
+    return status;
+#line 2896
+}
+#line 2896
+
+int
+#line 2897
+ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 2897
+{
+#line 2897
+    int status = NC_NOERR;
+#line 2897
+    size_t rndup = nelems % X_ALIGN;
+#line 2897
+    schar *xp = (schar *) *xpp;
+#line 2897
+
+#line 2897
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 2897
+
+#line 2897
+    while (nelems-- != 0) {
+#line 2897
+        if (*tp > (ulonglong)X_SCHAR_MAX ) {
+#line 2897
+            
+#line 2897
+            status = NC_ERANGE;
+#line 2897
+            
+#line 2897
+        }
+#line 2897
+        *xp++ = (schar)  *tp++; /* type cast from ulonglong to schar */
+#line 2897
+    }
+#line 2897
+
+#line 2897
+
+#line 2897
+    if (rndup) {
+#line 2897
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 2897
+        xp += rndup;
+#line 2897
+    }
+#line 2897
+
+#line 2897
+    *xpp = (void *)xp;
+#line 2897
+    return status;
+#line 2897
+}
+#line 2897
 
-		*tp++ = *xp++;
-	}
 
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
 
+/* uchar ---------------------------------------------------------------------*/
+#line 2903
 int
-ncx_pad_getn_schar_float(const void **xpp, size_t nelems, float *tp)
+ncx_getn_uchar_schar(const void **xpp, size_t nelems, schar *tp)
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
+    int status = NC_NOERR;
+    uchar *xp = (uchar *)(*xpp);
 
-		*tp++ = *xp++;
-	}
+    while (nelems-- != 0) {
+        if (*xp > SCHAR_MAX) {
+            *tp = NC_FILL_BYTE;
+       	    status = NC_ERANGE;
+            
+        }
+	*tp++ = (schar) *xp++; /* type cast from uchar to schar */
+    }
 
-	*xpp = (void *)(xp + rndup);
-	return status;
+    *xpp = (const void *)xp;
+    return status;
 }
-
+#line 2922
 int
-ncx_pad_getn_schar_double(const void **xpp, size_t nelems, double *tp)
+ncx_getn_uchar_uchar(const void **xpp, size_t nelems, uchar *tp)
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
+		(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 2925
+	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 2925
+	return NC_NOERR;
+#line 2925
 
-	*xpp = (void *)(xp + rndup);
-	return status;
 }
-
 int
-ncx_pad_getn_schar_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 2927
+ncx_getn_uchar_short(const void **xpp, size_t nelems, short *tp)
+#line 2927
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
+#line 2927
+    int status = NC_NOERR;
+#line 2927
+    uchar *xp = (uchar *)(*xpp);
+#line 2927
 
-		*tp++ = *xp++;
-	}
+#line 2927
+    while (nelems-- != 0) {
+#line 2927
+        
+#line 2927
+        *tp++ = (short)  (*xp++);  /* type cast from uchar to short */
+#line 2927
+    }
+#line 2927
 
-	*xpp = (void *)(xp + rndup);
-	return status;
+#line 2927
+    *xpp = (const void *)xp;
+#line 2927
+    return status;
+#line 2927
 }
+#line 2927
 
 int
-ncx_pad_getn_schar_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 2928
+ncx_getn_uchar_int(const void **xpp, size_t nelems, int *tp)
+#line 2928
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
+#line 2928
+    int status = NC_NOERR;
+#line 2928
+    uchar *xp = (uchar *)(*xpp);
+#line 2928
 
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if (*xp < 0) status = NC_ERANGE;
-		*tp++ = *xp++;
-	}
+#line 2928
+    while (nelems-- != 0) {
+#line 2928
+        
+#line 2928
+        *tp++ = (int)  (*xp++);  /* type cast from uchar to int */
+#line 2928
+    }
+#line 2928
 
-	*xpp = (void *)(xp + rndup);
-	return status;
+#line 2928
+    *xpp = (const void *)xp;
+#line 2928
+    return status;
+#line 2928
 }
+#line 2928
 
 int
-ncx_pad_getn_schar_uint(const void **xpp, size_t nelems, uint *tp)
+#line 2929
+ncx_getn_uchar_long(const void **xpp, size_t nelems, long *tp)
+#line 2929
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
+#line 2929
+    int status = NC_NOERR;
+#line 2929
+    uchar *xp = (uchar *)(*xpp);
+#line 2929
 
-	while(nelems-- != 0)
-	{
-		if (*xp < 0) status = NC_ERANGE;
-		*tp++ = *xp++;
-	}
+#line 2929
+    while (nelems-- != 0) {
+#line 2929
+        
+#line 2929
+        *tp++ = (long)  (*xp++);  /* type cast from uchar to long */
+#line 2929
+    }
+#line 2929
 
-	*xpp = (void *)(xp + rndup);
-	return status;
+#line 2929
+    *xpp = (const void *)xp;
+#line 2929
+    return status;
+#line 2929
 }
+#line 2929
 
 int
-ncx_pad_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 2930
+ncx_getn_uchar_float(const void **xpp, size_t nelems, float *tp)
+#line 2930
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
+#line 2930
+    int status = NC_NOERR;
+#line 2930
+    uchar *xp = (uchar *)(*xpp);
+#line 2930
 
-	while(nelems-- != 0)
-	{
-		if (*xp < 0) status = NC_ERANGE;
-		*tp++ = *xp++;
-	}
+#line 2930
+    while (nelems-- != 0) {
+#line 2930
+        
+#line 2930
+        *tp++ = (float)  (*xp++);  /* type cast from uchar to float */
+#line 2930
+    }
+#line 2930
 
-	*xpp = (void *)(xp + rndup);
-	return status;
+#line 2930
+    *xpp = (const void *)xp;
+#line 2930
+    return status;
+#line 2930
 }
-
+#line 2930
 
 int
-ncx_putn_schar_schar(void **xpp, size_t nelems, const schar *tp)
+#line 2931
+ncx_getn_uchar_double(const void **xpp, size_t nelems, double *tp)
+#line 2931
 {
-		(void) memcpy(*xpp, tp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 2931
+    int status = NC_NOERR;
+#line 2931
+    uchar *xp = (uchar *)(*xpp);
+#line 2931
 
-	return NC_NOERR;
+#line 2931
+    while (nelems-- != 0) {
+#line 2931
+        
+#line 2931
+        *tp++ = (double)  (*xp++);  /* type cast from uchar to double */
+#line 2931
+    }
+#line 2931
 
+#line 2931
+    *xpp = (const void *)xp;
+#line 2931
+    return status;
+#line 2931
 }
-int
-ncx_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp)
-{
-		(void) memcpy(*xpp, tp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems);
-
-	return NC_NOERR;
+#line 2931
 
-}
 int
-ncx_putn_schar_short(void **xpp, size_t nelems, const short *tp)
+#line 2932
+ncx_getn_uchar_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 2932
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
+#line 2932
+    int status = NC_NOERR;
+#line 2932
+    uchar *xp = (uchar *)(*xpp);
+#line 2932
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+#line 2932
+    while (nelems-- != 0) {
+#line 2932
+        
+#line 2932
+        *tp++ = (longlong)  (*xp++);  /* type cast from uchar to longlong */
+#line 2932
+    }
+#line 2932
 
-	*xpp = (void *)xp;
-	return status;
+#line 2932
+    *xpp = (const void *)xp;
+#line 2932
+    return status;
+#line 2932
 }
+#line 2932
 
 int
-ncx_putn_schar_int(void **xpp, size_t nelems, const int *tp)
+#line 2933
+ncx_getn_uchar_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 2933
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
+#line 2933
+    int status = NC_NOERR;
+#line 2933
+    uchar *xp = (uchar *)(*xpp);
+#line 2933
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+#line 2933
+    while (nelems-- != 0) {
+#line 2933
+        
+#line 2933
+        *tp++ = (ushort)  (*xp++);  /* type cast from uchar to ushort */
+#line 2933
+    }
+#line 2933
 
-	*xpp = (void *)xp;
-	return status;
+#line 2933
+    *xpp = (const void *)xp;
+#line 2933
+    return status;
+#line 2933
 }
+#line 2933
 
 int
-ncx_putn_schar_float(void **xpp, size_t nelems, const float *tp)
+#line 2934
+ncx_getn_uchar_uint(const void **xpp, size_t nelems, uint *tp)
+#line 2934
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
+#line 2934
+    int status = NC_NOERR;
+#line 2934
+    uchar *xp = (uchar *)(*xpp);
+#line 2934
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+#line 2934
+    while (nelems-- != 0) {
+#line 2934
+        
+#line 2934
+        *tp++ = (uint)  (*xp++);  /* type cast from uchar to uint */
+#line 2934
+    }
+#line 2934
 
-	*xpp = (void *)xp;
-	return status;
+#line 2934
+    *xpp = (const void *)xp;
+#line 2934
+    return status;
+#line 2934
 }
+#line 2934
 
 int
-ncx_putn_schar_double(void **xpp, size_t nelems, const double *tp)
+#line 2935
+ncx_getn_uchar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 2935
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
+#line 2935
+    int status = NC_NOERR;
+#line 2935
+    uchar *xp = (uchar *)(*xpp);
+#line 2935
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+#line 2935
+    while (nelems-- != 0) {
+#line 2935
+        
+#line 2935
+        *tp++ = (ulonglong)  (*xp++);  /* type cast from uchar to ulonglong */
+#line 2935
+    }
+#line 2935
 
-	*xpp = (void *)xp;
-	return status;
+#line 2935
+    *xpp = (const void *)xp;
+#line 2935
+    return status;
+#line 2935
 }
+#line 2935
 
+
+#line 2938
 int
-ncx_putn_schar_longlong(void **xpp, size_t nelems, const longlong *tp)
+ncx_pad_getn_uchar_schar(const void **xpp, size_t nelems, schar *tp)
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
+    int status = NC_NOERR;
+    size_t rndup = nelems % X_ALIGN;
+    uchar *xp = (uchar *) *xpp;
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+    if (rndup) rndup = X_ALIGN - rndup;
 
-	*xpp = (void *)xp;
-	return status;
-}
+    while (nelems-- != 0) {
+        if (*xp > SCHAR_MAX) {
+            *tp = NC_FILL_BYTE;
+            status = NC_ERANGE;
+            
+        }
+        *tp++ = (schar) *xp++; /* type cast from uchar to schar */
+    }
 
+    *xpp = (void *)(xp + rndup);
+    return status;
+}
+#line 2960
 int
-ncx_putn_schar_ushort(void **xpp, size_t nelems, const ushort *tp)
+ncx_pad_getn_uchar_uchar(const void **xpp, size_t nelems, uchar *tp)
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+		size_t rndup = nelems % X_ALIGN;
+#line 2963
 
-	*xpp = (void *)xp;
-	return status;
-}
+#line 2963
+	if (rndup)
+#line 2963
+		rndup = X_ALIGN - rndup;
+#line 2963
 
-int
-ncx_putn_schar_uint(void **xpp, size_t nelems, const uint *tp)
-{
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
+#line 2963
+	(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 2963
+	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
+#line 2963
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+#line 2963
+	return NC_NOERR;
+#line 2963
 
-	*xpp = (void *)xp;
-	return status;
 }
-
 int
-ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 2965
+ncx_pad_getn_uchar_short(const void **xpp, size_t nelems, short *tp)
+#line 2965
+{
+#line 2965
+    int status = NC_NOERR;
+#line 2965
+    size_t rndup = nelems % X_ALIGN;
+#line 2965
+    uchar *xp = (uchar *) *xpp;
+#line 2965
+
+#line 2965
+    if (rndup)
+#line 2965
+        rndup = X_ALIGN - rndup;
+#line 2965
+
+#line 2965
+    while (nelems-- != 0) {
+#line 2965
+        
+#line 2965
+        *tp++ = (short)  (*xp++);  /* type cast from uchar to short */
+#line 2965
+    }
+#line 2965
+
+#line 2965
+    *xpp = (void *)(xp + rndup);
+#line 2965
+    return status;
+#line 2965
+}
+#line 2965
+
+int
+#line 2966
+ncx_pad_getn_uchar_int(const void **xpp, size_t nelems, int *tp)
+#line 2966
+{
+#line 2966
+    int status = NC_NOERR;
+#line 2966
+    size_t rndup = nelems % X_ALIGN;
+#line 2966
+    uchar *xp = (uchar *) *xpp;
+#line 2966
+
+#line 2966
+    if (rndup)
+#line 2966
+        rndup = X_ALIGN - rndup;
+#line 2966
+
+#line 2966
+    while (nelems-- != 0) {
+#line 2966
+        
+#line 2966
+        *tp++ = (int)  (*xp++);  /* type cast from uchar to int */
+#line 2966
+    }
+#line 2966
+
+#line 2966
+    *xpp = (void *)(xp + rndup);
+#line 2966
+    return status;
+#line 2966
+}
+#line 2966
+
+int
+#line 2967
+ncx_pad_getn_uchar_long(const void **xpp, size_t nelems, long *tp)
+#line 2967
+{
+#line 2967
+    int status = NC_NOERR;
+#line 2967
+    size_t rndup = nelems % X_ALIGN;
+#line 2967
+    uchar *xp = (uchar *) *xpp;
+#line 2967
+
+#line 2967
+    if (rndup)
+#line 2967
+        rndup = X_ALIGN - rndup;
+#line 2967
+
+#line 2967
+    while (nelems-- != 0) {
+#line 2967
+        
+#line 2967
+        *tp++ = (long)  (*xp++);  /* type cast from uchar to long */
+#line 2967
+    }
+#line 2967
+
+#line 2967
+    *xpp = (void *)(xp + rndup);
+#line 2967
+    return status;
+#line 2967
+}
+#line 2967
+
+int
+#line 2968
+ncx_pad_getn_uchar_float(const void **xpp, size_t nelems, float *tp)
+#line 2968
+{
+#line 2968
+    int status = NC_NOERR;
+#line 2968
+    size_t rndup = nelems % X_ALIGN;
+#line 2968
+    uchar *xp = (uchar *) *xpp;
+#line 2968
+
+#line 2968
+    if (rndup)
+#line 2968
+        rndup = X_ALIGN - rndup;
+#line 2968
+
+#line 2968
+    while (nelems-- != 0) {
+#line 2968
+        
+#line 2968
+        *tp++ = (float)  (*xp++);  /* type cast from uchar to float */
+#line 2968
+    }
+#line 2968
+
+#line 2968
+    *xpp = (void *)(xp + rndup);
+#line 2968
+    return status;
+#line 2968
+}
+#line 2968
+
+int
+#line 2969
+ncx_pad_getn_uchar_double(const void **xpp, size_t nelems, double *tp)
+#line 2969
+{
+#line 2969
+    int status = NC_NOERR;
+#line 2969
+    size_t rndup = nelems % X_ALIGN;
+#line 2969
+    uchar *xp = (uchar *) *xpp;
+#line 2969
+
+#line 2969
+    if (rndup)
+#line 2969
+        rndup = X_ALIGN - rndup;
+#line 2969
+
+#line 2969
+    while (nelems-- != 0) {
+#line 2969
+        
+#line 2969
+        *tp++ = (double)  (*xp++);  /* type cast from uchar to double */
+#line 2969
+    }
+#line 2969
+
+#line 2969
+    *xpp = (void *)(xp + rndup);
+#line 2969
+    return status;
+#line 2969
+}
+#line 2969
+
+int
+#line 2970
+ncx_pad_getn_uchar_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 2970
+{
+#line 2970
+    int status = NC_NOERR;
+#line 2970
+    size_t rndup = nelems % X_ALIGN;
+#line 2970
+    uchar *xp = (uchar *) *xpp;
+#line 2970
+
+#line 2970
+    if (rndup)
+#line 2970
+        rndup = X_ALIGN - rndup;
+#line 2970
+
+#line 2970
+    while (nelems-- != 0) {
+#line 2970
+        
+#line 2970
+        *tp++ = (longlong)  (*xp++);  /* type cast from uchar to longlong */
+#line 2970
+    }
+#line 2970
+
+#line 2970
+    *xpp = (void *)(xp + rndup);
+#line 2970
+    return status;
+#line 2970
+}
+#line 2970
+
+int
+#line 2971
+ncx_pad_getn_uchar_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 2971
+{
+#line 2971
+    int status = NC_NOERR;
+#line 2971
+    size_t rndup = nelems % X_ALIGN;
+#line 2971
+    uchar *xp = (uchar *) *xpp;
+#line 2971
+
+#line 2971
+    if (rndup)
+#line 2971
+        rndup = X_ALIGN - rndup;
+#line 2971
+
+#line 2971
+    while (nelems-- != 0) {
+#line 2971
+        
+#line 2971
+        *tp++ = (ushort)  (*xp++);  /* type cast from uchar to ushort */
+#line 2971
+    }
+#line 2971
+
+#line 2971
+    *xpp = (void *)(xp + rndup);
+#line 2971
+    return status;
+#line 2971
+}
+#line 2971
+
+int
+#line 2972
+ncx_pad_getn_uchar_uint(const void **xpp, size_t nelems, uint *tp)
+#line 2972
+{
+#line 2972
+    int status = NC_NOERR;
+#line 2972
+    size_t rndup = nelems % X_ALIGN;
+#line 2972
+    uchar *xp = (uchar *) *xpp;
+#line 2972
+
+#line 2972
+    if (rndup)
+#line 2972
+        rndup = X_ALIGN - rndup;
+#line 2972
+
+#line 2972
+    while (nelems-- != 0) {
+#line 2972
+        
+#line 2972
+        *tp++ = (uint)  (*xp++);  /* type cast from uchar to uint */
+#line 2972
+    }
+#line 2972
+
+#line 2972
+    *xpp = (void *)(xp + rndup);
+#line 2972
+    return status;
+#line 2972
+}
+#line 2972
+
+int
+#line 2973
+ncx_pad_getn_uchar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 2973
 {
-	int status = NC_NOERR;
-	schar *xp = (schar *) *xpp;
+#line 2973
+    int status = NC_NOERR;
+#line 2973
+    size_t rndup = nelems % X_ALIGN;
+#line 2973
+    uchar *xp = (uchar *) *xpp;
+#line 2973
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed)*tp++;
-	}
+#line 2973
+    if (rndup)
+#line 2973
+        rndup = X_ALIGN - rndup;
+#line 2973
 
-	*xpp = (void *)xp;
-	return status;
+#line 2973
+    while (nelems-- != 0) {
+#line 2973
+        
+#line 2973
+        *tp++ = (ulonglong)  (*xp++);  /* type cast from uchar to ulonglong */
+#line 2973
+    }
+#line 2973
+
+#line 2973
+    *xpp = (void *)(xp + rndup);
+#line 2973
+    return status;
+#line 2973
 }
+#line 2973
 
 
+#line 2976
 int
-ncx_pad_putn_schar_schar(void **xpp, size_t nelems, const schar *tp)
+ncx_putn_uchar_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
 {
-		size_t rndup = nelems % X_ALIGN;
+    int status = NC_NOERR;
+    uchar *xp = (uchar *) *xpp;
 
-	if(rndup)
-		rndup = X_ALIGN - rndup;
+    while (nelems-- != 0) {
+        if (*tp < 0) {
+            
+            status = NC_ERANGE;
+            
+        }
+        *xp++ = (uchar) (signed) *tp++; /* type cast from schar to uchar */
+    }
 
-	(void) memcpy(*xpp, tp, nelems);
+    *xpp = (void *)xp;
+    return status;
+}
+#line 2995
+int
+ncx_putn_uchar_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+{
+		(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 2998
 	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 2998
 
-	if(rndup)
-	{
-		(void) memcpy(*xpp, nada, rndup);
-		*xpp = (void *)((char *)(*xpp) + rndup);
-	}
-
+#line 2998
 	return NC_NOERR;
+#line 2998
+
+}
+int
+#line 3000
+ncx_putn_uchar_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3000
+{
+#line 3000
+    int status = NC_NOERR;
+#line 3000
+    uchar *xp = (uchar *) *xpp;
+#line 3000
+
+#line 3000
+    while (nelems-- != 0) {
+#line 3000
+        if (*tp > (short)X_UCHAR_MAX || *tp < 0) {
+#line 3000
+            
+#line 3000
+            status = NC_ERANGE;
+#line 3000
+            
+#line 3000
+        }
+#line 3000
+        *xp++ = (uchar) (signed) *tp++; /* type cast from short to uchar */
+#line 3000
+    }
+#line 3000
+
+#line 3000
+    *xpp = (void *)xp;
+#line 3000
+    return status;
+#line 3000
+}
+#line 3000
+
+int
+#line 3001
+ncx_putn_uchar_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3001
+{
+#line 3001
+    int status = NC_NOERR;
+#line 3001
+    uchar *xp = (uchar *) *xpp;
+#line 3001
+
+#line 3001
+    while (nelems-- != 0) {
+#line 3001
+        if (*tp > (int)X_UCHAR_MAX || *tp < 0) {
+#line 3001
+            
+#line 3001
+            status = NC_ERANGE;
+#line 3001
+            
+#line 3001
+        }
+#line 3001
+        *xp++ = (uchar) (signed) *tp++; /* type cast from int to uchar */
+#line 3001
+    }
+#line 3001
+
+#line 3001
+    *xpp = (void *)xp;
+#line 3001
+    return status;
+#line 3001
+}
+#line 3001
+
+int
+#line 3002
+ncx_putn_uchar_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3002
+{
+#line 3002
+    int status = NC_NOERR;
+#line 3002
+    uchar *xp = (uchar *) *xpp;
+#line 3002
+
+#line 3002
+    while (nelems-- != 0) {
+#line 3002
+        if (*tp > (long)X_UCHAR_MAX || *tp < 0) {
+#line 3002
+            
+#line 3002
+            status = NC_ERANGE;
+#line 3002
+            
+#line 3002
+        }
+#line 3002
+        *xp++ = (uchar) (signed) *tp++; /* type cast from long to uchar */
+#line 3002
+    }
+#line 3002
+
+#line 3002
+    *xpp = (void *)xp;
+#line 3002
+    return status;
+#line 3002
+}
+#line 3002
+
+int
+#line 3003
+ncx_putn_uchar_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3003
+{
+#line 3003
+    int status = NC_NOERR;
+#line 3003
+    uchar *xp = (uchar *) *xpp;
+#line 3003
+
+#line 3003
+    while (nelems-- != 0) {
+#line 3003
+        if (*tp > (float)X_UCHAR_MAX || *tp < 0) {
+#line 3003
+            
+#line 3003
+            status = NC_ERANGE;
+#line 3003
+            
+#line 3003
+        }
+#line 3003
+        *xp++ = (uchar) (signed) *tp++; /* type cast from float to uchar */
+#line 3003
+    }
+#line 3003
+
+#line 3003
+    *xpp = (void *)xp;
+#line 3003
+    return status;
+#line 3003
+}
+#line 3003
+
+int
+#line 3004
+ncx_putn_uchar_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3004
+{
+#line 3004
+    int status = NC_NOERR;
+#line 3004
+    uchar *xp = (uchar *) *xpp;
+#line 3004
+
+#line 3004
+    while (nelems-- != 0) {
+#line 3004
+        if (*tp > (double)X_UCHAR_MAX || *tp < 0) {
+#line 3004
+            
+#line 3004
+            status = NC_ERANGE;
+#line 3004
+            
+#line 3004
+        }
+#line 3004
+        *xp++ = (uchar) (signed) *tp++; /* type cast from double to uchar */
+#line 3004
+    }
+#line 3004
+
+#line 3004
+    *xpp = (void *)xp;
+#line 3004
+    return status;
+#line 3004
+}
+#line 3004
+
+int
+#line 3005
+ncx_putn_uchar_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3005
+{
+#line 3005
+    int status = NC_NOERR;
+#line 3005
+    uchar *xp = (uchar *) *xpp;
+#line 3005
+
+#line 3005
+    while (nelems-- != 0) {
+#line 3005
+        if (*tp > (longlong)X_UCHAR_MAX || *tp < 0) {
+#line 3005
+            
+#line 3005
+            status = NC_ERANGE;
+#line 3005
+            
+#line 3005
+        }
+#line 3005
+        *xp++ = (uchar) (signed) *tp++; /* type cast from longlong to uchar */
+#line 3005
+    }
+#line 3005
+
+#line 3005
+    *xpp = (void *)xp;
+#line 3005
+    return status;
+#line 3005
+}
+#line 3005
+
+int
+#line 3006
+ncx_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3006
+{
+#line 3006
+    int status = NC_NOERR;
+#line 3006
+    uchar *xp = (uchar *) *xpp;
+#line 3006
+
+#line 3006
+    while (nelems-- != 0) {
+#line 3006
+        if (*tp > (ushort)X_UCHAR_MAX ) {
+#line 3006
+            
+#line 3006
+            status = NC_ERANGE;
+#line 3006
+            
+#line 3006
+        }
+#line 3006
+        *xp++ = (uchar)  *tp++; /* type cast from ushort to uchar */
+#line 3006
+    }
+#line 3006
+
+#line 3006
+    *xpp = (void *)xp;
+#line 3006
+    return status;
+#line 3006
+}
+#line 3006
+
+int
+#line 3007
+ncx_putn_uchar_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3007
+{
+#line 3007
+    int status = NC_NOERR;
+#line 3007
+    uchar *xp = (uchar *) *xpp;
+#line 3007
+
+#line 3007
+    while (nelems-- != 0) {
+#line 3007
+        if (*tp > (uint)X_UCHAR_MAX ) {
+#line 3007
+            
+#line 3007
+            status = NC_ERANGE;
+#line 3007
+            
+#line 3007
+        }
+#line 3007
+        *xp++ = (uchar)  *tp++; /* type cast from uint to uchar */
+#line 3007
+    }
+#line 3007
+
+#line 3007
+    *xpp = (void *)xp;
+#line 3007
+    return status;
+#line 3007
+}
+#line 3007
+
+int
+#line 3008
+ncx_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3008
+{
+#line 3008
+    int status = NC_NOERR;
+#line 3008
+    uchar *xp = (uchar *) *xpp;
+#line 3008
+
+#line 3008
+    while (nelems-- != 0) {
+#line 3008
+        if (*tp > (ulonglong)X_UCHAR_MAX ) {
+#line 3008
+            
+#line 3008
+            status = NC_ERANGE;
+#line 3008
+            
+#line 3008
+        }
+#line 3008
+        *xp++ = (uchar)  *tp++; /* type cast from ulonglong to uchar */
+#line 3008
+    }
+#line 3008
+
+#line 3008
+    *xpp = (void *)xp;
+#line 3008
+    return status;
+#line 3008
+}
+#line 3008
+
+
+#line 3011
+int
+ncx_pad_putn_uchar_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+{
+    int status = NC_NOERR;
+    size_t rndup = nelems % X_ALIGN;
+    uchar *xp = (uchar *) *xpp;
+
+    if (rndup) rndup = X_ALIGN - rndup;
 
-}
+    while (nelems-- != 0) {
+        if (*tp < 0) {
+            
+            status = NC_ERANGE;
+            
+        }
+        *xp++ = (uchar) (signed) *tp++; /* type cast from schar to uchar */
+    }
+
+    if (rndup) {
+        (void) memcpy(xp, nada, (size_t)rndup);
+        xp += rndup;
+    }
+
+    *xpp = (void *)xp;
+    return status;
+}
+#line 3038
 int
-ncx_pad_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp)
+ncx_pad_putn_uchar_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
 {
 		size_t rndup = nelems % X_ALIGN;
+#line 3041
 
-	if(rndup)
+#line 3041
+	if (rndup)
+#line 3041
 		rndup = X_ALIGN - rndup;
+#line 3041
 
-	(void) memcpy(*xpp, tp, nelems);
+#line 3041
+	(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 3041
 	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 3041
 
-	if(rndup)
+#line 3041
+	if (rndup)
+#line 3041
 	{
-		(void) memcpy(*xpp, nada, rndup);
+#line 3041
+		(void) memcpy(*xpp, nada, (size_t)rndup);
+#line 3041
 		*xpp = (void *)((char *)(*xpp) + rndup);
+#line 3041
 	}
+#line 3041
 
+#line 3041
 	return NC_NOERR;
+#line 3041
+
+}
+int
+#line 3043
+ncx_pad_putn_uchar_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3043
+{
+#line 3043
+    int status = NC_NOERR;
+#line 3043
+    size_t rndup = nelems % X_ALIGN;
+#line 3043
+    uchar *xp = (uchar *) *xpp;
+#line 3043
+
+#line 3043
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3043
+
+#line 3043
+    while (nelems-- != 0) {
+#line 3043
+        if (*tp > (short)X_UCHAR_MAX || *tp < 0) {
+#line 3043
+            
+#line 3043
+            status = NC_ERANGE;
+#line 3043
+            
+#line 3043
+        }
+#line 3043
+        *xp++ = (uchar) (signed) *tp++; /* type cast from short to uchar */
+#line 3043
+    }
+#line 3043
+
+#line 3043
+
+#line 3043
+    if (rndup) {
+#line 3043
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3043
+        xp += rndup;
+#line 3043
+    }
+#line 3043
+
+#line 3043
+    *xpp = (void *)xp;
+#line 3043
+    return status;
+#line 3043
+}
+#line 3043
+
+int
+#line 3044
+ncx_pad_putn_uchar_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3044
+{
+#line 3044
+    int status = NC_NOERR;
+#line 3044
+    size_t rndup = nelems % X_ALIGN;
+#line 3044
+    uchar *xp = (uchar *) *xpp;
+#line 3044
+
+#line 3044
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3044
+
+#line 3044
+    while (nelems-- != 0) {
+#line 3044
+        if (*tp > (int)X_UCHAR_MAX || *tp < 0) {
+#line 3044
+            
+#line 3044
+            status = NC_ERANGE;
+#line 3044
+            
+#line 3044
+        }
+#line 3044
+        *xp++ = (uchar) (signed) *tp++; /* type cast from int to uchar */
+#line 3044
+    }
+#line 3044
+
+#line 3044
+
+#line 3044
+    if (rndup) {
+#line 3044
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3044
+        xp += rndup;
+#line 3044
+    }
+#line 3044
+
+#line 3044
+    *xpp = (void *)xp;
+#line 3044
+    return status;
+#line 3044
+}
+#line 3044
+
+int
+#line 3045
+ncx_pad_putn_uchar_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3045
+{
+#line 3045
+    int status = NC_NOERR;
+#line 3045
+    size_t rndup = nelems % X_ALIGN;
+#line 3045
+    uchar *xp = (uchar *) *xpp;
+#line 3045
+
+#line 3045
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3045
+
+#line 3045
+    while (nelems-- != 0) {
+#line 3045
+        if (*tp > (long)X_UCHAR_MAX || *tp < 0) {
+#line 3045
+            
+#line 3045
+            status = NC_ERANGE;
+#line 3045
+            
+#line 3045
+        }
+#line 3045
+        *xp++ = (uchar) (signed) *tp++; /* type cast from long to uchar */
+#line 3045
+    }
+#line 3045
+
+#line 3045
+
+#line 3045
+    if (rndup) {
+#line 3045
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3045
+        xp += rndup;
+#line 3045
+    }
+#line 3045
+
+#line 3045
+    *xpp = (void *)xp;
+#line 3045
+    return status;
+#line 3045
+}
+#line 3045
+
+int
+#line 3046
+ncx_pad_putn_uchar_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3046
+{
+#line 3046
+    int status = NC_NOERR;
+#line 3046
+    size_t rndup = nelems % X_ALIGN;
+#line 3046
+    uchar *xp = (uchar *) *xpp;
+#line 3046
+
+#line 3046
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3046
+
+#line 3046
+    while (nelems-- != 0) {
+#line 3046
+        if (*tp > (float)X_UCHAR_MAX || *tp < 0) {
+#line 3046
+            
+#line 3046
+            status = NC_ERANGE;
+#line 3046
+            
+#line 3046
+        }
+#line 3046
+        *xp++ = (uchar) (signed) *tp++; /* type cast from float to uchar */
+#line 3046
+    }
+#line 3046
+
+#line 3046
+
+#line 3046
+    if (rndup) {
+#line 3046
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3046
+        xp += rndup;
+#line 3046
+    }
+#line 3046
+
+#line 3046
+    *xpp = (void *)xp;
+#line 3046
+    return status;
+#line 3046
+}
+#line 3046
+
+int
+#line 3047
+ncx_pad_putn_uchar_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3047
+{
+#line 3047
+    int status = NC_NOERR;
+#line 3047
+    size_t rndup = nelems % X_ALIGN;
+#line 3047
+    uchar *xp = (uchar *) *xpp;
+#line 3047
+
+#line 3047
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3047
+
+#line 3047
+    while (nelems-- != 0) {
+#line 3047
+        if (*tp > (double)X_UCHAR_MAX || *tp < 0) {
+#line 3047
+            
+#line 3047
+            status = NC_ERANGE;
+#line 3047
+            
+#line 3047
+        }
+#line 3047
+        *xp++ = (uchar) (signed) *tp++; /* type cast from double to uchar */
+#line 3047
+    }
+#line 3047
+
+#line 3047
+
+#line 3047
+    if (rndup) {
+#line 3047
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3047
+        xp += rndup;
+#line 3047
+    }
+#line 3047
+
+#line 3047
+    *xpp = (void *)xp;
+#line 3047
+    return status;
+#line 3047
+}
+#line 3047
+
+int
+#line 3048
+ncx_pad_putn_uchar_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3048
+{
+#line 3048
+    int status = NC_NOERR;
+#line 3048
+    size_t rndup = nelems % X_ALIGN;
+#line 3048
+    uchar *xp = (uchar *) *xpp;
+#line 3048
+
+#line 3048
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3048
+
+#line 3048
+    while (nelems-- != 0) {
+#line 3048
+        if (*tp > (longlong)X_UCHAR_MAX || *tp < 0) {
+#line 3048
+            
+#line 3048
+            status = NC_ERANGE;
+#line 3048
+            
+#line 3048
+        }
+#line 3048
+        *xp++ = (uchar) (signed) *tp++; /* type cast from longlong to uchar */
+#line 3048
+    }
+#line 3048
+
+#line 3048
+
+#line 3048
+    if (rndup) {
+#line 3048
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3048
+        xp += rndup;
+#line 3048
+    }
+#line 3048
+
+#line 3048
+    *xpp = (void *)xp;
+#line 3048
+    return status;
+#line 3048
+}
+#line 3048
+
+int
+#line 3049
+ncx_pad_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3049
+{
+#line 3049
+    int status = NC_NOERR;
+#line 3049
+    size_t rndup = nelems % X_ALIGN;
+#line 3049
+    uchar *xp = (uchar *) *xpp;
+#line 3049
+
+#line 3049
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3049
+
+#line 3049
+    while (nelems-- != 0) {
+#line 3049
+        if (*tp > (ushort)X_UCHAR_MAX ) {
+#line 3049
+            
+#line 3049
+            status = NC_ERANGE;
+#line 3049
+            
+#line 3049
+        }
+#line 3049
+        *xp++ = (uchar)  *tp++; /* type cast from ushort to uchar */
+#line 3049
+    }
+#line 3049
+
+#line 3049
+
+#line 3049
+    if (rndup) {
+#line 3049
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3049
+        xp += rndup;
+#line 3049
+    }
+#line 3049
+
+#line 3049
+    *xpp = (void *)xp;
+#line 3049
+    return status;
+#line 3049
+}
+#line 3049
+
+int
+#line 3050
+ncx_pad_putn_uchar_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3050
+{
+#line 3050
+    int status = NC_NOERR;
+#line 3050
+    size_t rndup = nelems % X_ALIGN;
+#line 3050
+    uchar *xp = (uchar *) *xpp;
+#line 3050
+
+#line 3050
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3050
+
+#line 3050
+    while (nelems-- != 0) {
+#line 3050
+        if (*tp > (uint)X_UCHAR_MAX ) {
+#line 3050
+            
+#line 3050
+            status = NC_ERANGE;
+#line 3050
+            
+#line 3050
+        }
+#line 3050
+        *xp++ = (uchar)  *tp++; /* type cast from uint to uchar */
+#line 3050
+    }
+#line 3050
+
+#line 3050
+
+#line 3050
+    if (rndup) {
+#line 3050
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3050
+        xp += rndup;
+#line 3050
+    }
+#line 3050
+
+#line 3050
+    *xpp = (void *)xp;
+#line 3050
+    return status;
+#line 3050
+}
+#line 3050
+
+int
+#line 3051
+ncx_pad_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3051
+{
+#line 3051
+    int status = NC_NOERR;
+#line 3051
+    size_t rndup = nelems % X_ALIGN;
+#line 3051
+    uchar *xp = (uchar *) *xpp;
+#line 3051
+
+#line 3051
+    if (rndup) rndup = X_ALIGN - rndup;
+#line 3051
+
+#line 3051
+    while (nelems-- != 0) {
+#line 3051
+        if (*tp > (ulonglong)X_UCHAR_MAX ) {
+#line 3051
+            
+#line 3051
+            status = NC_ERANGE;
+#line 3051
+            
+#line 3051
+        }
+#line 3051
+        *xp++ = (uchar)  *tp++; /* type cast from ulonglong to uchar */
+#line 3051
+    }
+#line 3051
+
+#line 3051
+
+#line 3051
+    if (rndup) {
+#line 3051
+        (void) memcpy(xp, nada, (size_t)rndup);
+#line 3051
+        xp += rndup;
+#line 3051
+    }
+#line 3051
+
+#line 3051
+    *xpp = (void *)xp;
+#line 3051
+    return status;
+#line 3051
+}
+#line 3051
 
-}
-int
-ncx_pad_putn_schar_short(void **xpp, size_t nelems, const short *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
 
-	if(rndup)
-		rndup = X_ALIGN - rndup;
+/* short ---------------------------------------------------------------------*/
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_schar_int(void **xpp, size_t nelems, const int *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_schar_float(void **xpp, size_t nelems, const float *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_schar_longlong(void **xpp, size_t nelems, const longlong *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN)
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_schar_ushort(void **xpp, size_t nelems, const ushort *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_schar_uint(void **xpp, size_t nelems, const uint *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	schar *xp = (schar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_SCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (schar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-
-
-/* uchar ---------------------------------------------------------------------*/
-int
-ncx_getn_uchar_schar(const void **xpp, size_t nelems, schar *tp)
-{
-		(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((schar *)(*xpp) + nelems);
-	return NC_NOERR;
-
-}
-int
-ncx_getn_uchar_uchar(const void **xpp, size_t nelems, uchar *tp)
-{
-		(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((schar *)(*xpp) + nelems);
-	return NC_NOERR;
-
-}
-int
-ncx_getn_uchar_short(const void **xpp, size_t nelems, short *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
-ncx_getn_uchar_int(const void **xpp, size_t nelems, int *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
-ncx_getn_uchar_float(const void **xpp, size_t nelems, float *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
-ncx_getn_uchar_double(const void **xpp, size_t nelems, double *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
-ncx_getn_uchar_longlong(const void **xpp, size_t nelems, longlong *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
-ncx_getn_uchar_ushort(const void **xpp, size_t nelems, ushort *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
-ncx_getn_uchar_uint(const void **xpp, size_t nelems, uint *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-int
-ncx_getn_uchar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *)(*xpp);
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (const void *)xp;
-	return status;
-}
-
-
-int
-ncx_pad_getn_uchar_schar(const void **xpp, size_t nelems, schar *tp)
-{
-		size_t rndup = nelems % X_ALIGN;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
-
-	return NC_NOERR;
-
-}
-int
-ncx_pad_getn_uchar_uchar(const void **xpp, size_t nelems, uchar *tp)
-{
-		size_t rndup = nelems % X_ALIGN;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
-
-	return NC_NOERR;
-
-}
-int
-ncx_pad_getn_uchar_short(const void **xpp, size_t nelems, short *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_uchar_int(const void **xpp, size_t nelems, int *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_uchar_float(const void **xpp, size_t nelems, float *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_uchar_double(const void **xpp, size_t nelems, double *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_uchar_longlong(const void **xpp, size_t nelems, longlong *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_uchar_ushort(const void **xpp, size_t nelems, ushort *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_uchar_uint(const void **xpp, size_t nelems, uint *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-int
-ncx_pad_getn_uchar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-
-		*tp++ = *xp++;
-	}
-
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-
-
-int
-ncx_putn_uchar_schar(void **xpp, size_t nelems, const schar *tp)
-{
-		(void) memcpy(*xpp, tp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems);
-
-	return NC_NOERR;
-
-}
-int
-ncx_putn_uchar_uchar(void **xpp, size_t nelems, const uchar *tp)
-{
-		(void) memcpy(*xpp, tp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems);
-
-	return NC_NOERR;
-
-}
-int
-ncx_putn_uchar_short(void **xpp, size_t nelems, const short *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_putn_uchar_int(void **xpp, size_t nelems, const int *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_putn_uchar_float(void **xpp, size_t nelems, const float *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_putn_uchar_double(void **xpp, size_t nelems, const double *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_putn_uchar_longlong(void **xpp, size_t nelems, const longlong *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_putn_uchar_uint(void **xpp, size_t nelems, const uint *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
-{
-	int status = NC_NOERR;
-	uchar *xp = (uchar *) *xpp;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed)*tp++;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-
-int
-ncx_pad_putn_uchar_schar(void **xpp, size_t nelems, const schar *tp)
-{
-		size_t rndup = nelems % X_ALIGN;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	(void) memcpy(*xpp, tp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems);
-
-	if(rndup)
-	{
-		(void) memcpy(*xpp, nada, rndup);
-		*xpp = (void *)((char *)(*xpp) + rndup);
-	}
-
-	return NC_NOERR;
-
-}
+#if X_SIZEOF_SHORT == SIZEOF_SHORT
+/* optimized version */
 int
-ncx_pad_putn_uchar_uchar(void **xpp, size_t nelems, const uchar *tp)
+ncx_getn_short_short(const void **xpp, size_t nelems, short *tp)
 {
-		size_t rndup = nelems % X_ALIGN;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	(void) memcpy(*xpp, tp, nelems);
-	*xpp = (void *)((char *)(*xpp) + nelems);
-
-	if(rndup)
-	{
-		(void) memcpy(*xpp, nada, rndup);
-		*xpp = (void *)((char *)(*xpp) + rndup);
-	}
-
+#ifdef WORDS_BIGENDIAN
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_SHORT);
+# else
+	swapn2b(tp, *xpp, nelems);
+# endif
+	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_SHORT);
 	return NC_NOERR;
-
-}
-int
-ncx_pad_putn_uchar_short(void **xpp, size_t nelems, const short *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_uchar_int(void **xpp, size_t nelems, const int *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_uchar_float(void **xpp, size_t nelems, const float *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_uchar_double(void **xpp, size_t nelems, const double *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_uchar_longlong(void **xpp, size_t nelems, const longlong *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX || *tp < 0)
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
-}
-
-int
-ncx_pad_putn_uchar_uint(void **xpp, size_t nelems, const uint *tp)
-{
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
-
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
-
-
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
-
-	*xpp = (void *)xp;
-	return status;
 }
-
+#else
 int
-ncx_pad_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3069
+ncx_getn_short_short(const void **xpp, size_t nelems, short *tp)
+#line 3069
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	uchar *xp = (uchar *) *xpp;
+#line 3069
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3069
 
-	if(rndup)
-		rndup = X_ALIGN - rndup;
+#line 3069
+ /* basic algorithm is:
+#line 3069
+  *   - ensure sane alignment of input data
+#line 3069
+  *   - copy (conversion happens automatically) input data
+#line 3069
+  *     to output
+#line 3069
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3069
+  *     at next location for converted output
+#line 3069
+  */
+#line 3069
+  long i, j, ni;
+#line 3069
+  short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3069
+  short *xp;
+#line 3069
+  int nrange = 0;         /* number of range errors */
+#line 3069
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3069
+  long cxp = (long) *((char**)xpp);
+#line 3069
 
-	while(nelems-- != 0)
-	{
-		if(*tp > X_UCHAR_MAX )
-			status = NC_ERANGE;
-		*xp++ = (uchar) (signed) *tp++;
-	}
+#line 3069
+  realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3069
+  /* sjl: manually stripmine so we can limit amount of
+#line 3069
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3069
+   * makes vectorisation easy */
+#line 3069
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3069
+    ni=Min(nelems-j,LOOPCNT);
+#line 3069
+    if (realign) {
+#line 3069
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3069
+      xp = tmp;
+#line 3069
+    } else {
+#line 3069
+      xp = (short *) *xpp;
+#line 3069
+    }
+#line 3069
+   /* copy the next block */
+#line 3069
+#pragma cdir loopcnt=LOOPCNT
+#line 3069
+#pragma cdir shortloop
+#line 3069
+    for (i=0; i<ni; i++) {
+#line 3069
+      tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3069
+     /* test for range errors (not always needed but do it anyway) */
+#line 3069
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3069
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3069
+      nrange += xp[i] > SHORT_MAX || xp[i] < SHORT_MIN;
+#line 3069
+    }
+#line 3069
+   /* update xpp and tp */
+#line 3069
+    if (realign) xp = (short *) *xpp;
+#line 3069
+    xp += ni;
+#line 3069
+    tp += ni;
+#line 3069
+    *xpp = (void*)xp;
+#line 3069
+  }
+#line 3069
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3069
 
+#line 3069
+#else   /* not SX */
+#line 3069
+	const char *xp = (const char *) *xpp;
+#line 3069
+	int status = NC_NOERR;
+#line 3069
 
-	if(rndup)
+#line 3069
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3069
 	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
+#line 3069
+		const int lstatus = ncx_get_short_short(xp, tp);
+#line 3069
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3069
+			status = lstatus;
+#line 3069
 	}
+#line 3069
 
-	*xpp = (void *)xp;
+#line 3069
+	*xpp = (const void *)xp;
+#line 3069
 	return status;
+#line 3069
+#endif
+#line 3069
 }
+#line 3069
 
-
-/* short ---------------------------------------------------------------------*/
-
-#if X_SIZEOF_SHORT == SIZEOF_SHORT
-/* optimized version */
-int
-ncx_getn_short_short(const void **xpp, size_t nelems, short *tp)
-{
-#ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(short));
-# else
-	swapn2b(tp, *xpp, nelems);
-# endif
-	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_SHORT);
-	return NC_NOERR;
-}
-#else
+#endif
 int
-ncx_getn_short_short(const void **xpp, size_t nelems, short *tp)
+#line 3071
+ncx_getn_short_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3071
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3071
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3071
 
+#line 3071
  /* basic algorithm is:
+#line 3071
   *   - ensure sane alignment of input data
+#line 3071
   *   - copy (conversion happens automatically) input data
+#line 3071
   *     to output
+#line 3071
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3071
   *     at next location for converted output
+#line 3071
   */
+#line 3071
   long i, j, ni;
+#line 3071
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3071
   short *xp;
+#line 3071
   int nrange = 0;         /* number of range errors */
+#line 3071
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3071
   long cxp = (long) *((char**)xpp);
+#line 3071
 
+#line 3071
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3071
   /* sjl: manually stripmine so we can limit amount of
+#line 3071
    * vector work space reserved to LOOPCNT elements. Also
+#line 3071
    * makes vectorisation easy */
+#line 3071
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3071
     ni=Min(nelems-j,LOOPCNT);
+#line 3071
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3071
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3071
       xp = tmp;
+#line 3071
     } else {
+#line 3071
       xp = (short *) *xpp;
+#line 3071
     }
+#line 3071
    /* copy the next block */
+#line 3071
 #pragma cdir loopcnt=LOOPCNT
+#line 3071
 #pragma cdir shortloop
+#line 3071
     for (i=0; i<ni; i++) {
-      tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3071
+      tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3071
      /* test for range errors (not always needed but do it anyway) */
+#line 3071
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3071
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > SHORT_MAX || xp[i] < SHORT_MIN;
+#line 3071
+      nrange += xp[i] > SCHAR_MAX || xp[i] < SCHAR_MIN;
+#line 3071
     }
+#line 3071
    /* update xpp and tp */
+#line 3071
     if (realign) xp = (short *) *xpp;
+#line 3071
     xp += ni;
+#line 3071
     tp += ni;
+#line 3071
     *xpp = (void*)xp;
+#line 3071
   }
+#line 3071
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3071
 
+#line 3071
 #else   /* not SX */
+#line 3071
 	const char *xp = (const char *) *xpp;
+#line 3071
 	int status = NC_NOERR;
+#line 3071
 
+#line 3071
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3071
 	{
-		const int lstatus = ncx_get_short_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3071
+		const int lstatus = ncx_get_short_schar(xp, tp);
+#line 3071
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3071
 			status = lstatus;
+#line 3071
 	}
+#line 3071
 
+#line 3071
 	*xpp = (const void *)xp;
+#line 3071
 	return status;
-#  endif
+#line 3071
+#endif
+#line 3071
 }
+#line 3071
 
-#endif
 int
-ncx_getn_short_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3072
+ncx_getn_short_int(const void **xpp, size_t nelems, int *tp)
+#line 3072
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3072
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3072
 
+#line 3072
  /* basic algorithm is:
+#line 3072
   *   - ensure sane alignment of input data
+#line 3072
   *   - copy (conversion happens automatically) input data
+#line 3072
   *     to output
+#line 3072
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3072
   *     at next location for converted output
+#line 3072
   */
+#line 3072
   long i, j, ni;
+#line 3072
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3072
   short *xp;
+#line 3072
   int nrange = 0;         /* number of range errors */
+#line 3072
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3072
   long cxp = (long) *((char**)xpp);
+#line 3072
 
+#line 3072
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3072
   /* sjl: manually stripmine so we can limit amount of
+#line 3072
    * vector work space reserved to LOOPCNT elements. Also
+#line 3072
    * makes vectorisation easy */
+#line 3072
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3072
     ni=Min(nelems-j,LOOPCNT);
+#line 3072
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3072
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3072
       xp = tmp;
+#line 3072
     } else {
+#line 3072
       xp = (short *) *xpp;
+#line 3072
     }
+#line 3072
    /* copy the next block */
+#line 3072
 #pragma cdir loopcnt=LOOPCNT
+#line 3072
 #pragma cdir shortloop
+#line 3072
     for (i=0; i<ni; i++) {
-      tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3072
+      tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3072
      /* test for range errors (not always needed but do it anyway) */
+#line 3072
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3072
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > SCHAR_MAX || xp[i] < SCHAR_MIN;
+#line 3072
+      nrange += xp[i] > INT_MAX || xp[i] < INT_MIN;
+#line 3072
     }
+#line 3072
    /* update xpp and tp */
+#line 3072
     if (realign) xp = (short *) *xpp;
+#line 3072
     xp += ni;
+#line 3072
     tp += ni;
+#line 3072
     *xpp = (void*)xp;
+#line 3072
   }
+#line 3072
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3072
 
+#line 3072
 #else   /* not SX */
+#line 3072
 	const char *xp = (const char *) *xpp;
+#line 3072
 	int status = NC_NOERR;
+#line 3072
 
+#line 3072
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3072
 	{
-		const int lstatus = ncx_get_short_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3072
+		const int lstatus = ncx_get_short_int(xp, tp);
+#line 3072
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3072
 			status = lstatus;
+#line 3072
 	}
+#line 3072
 
+#line 3072
 	*xpp = (const void *)xp;
+#line 3072
 	return status;
-#  endif
+#line 3072
+#endif
+#line 3072
 }
+#line 3072
 
 int
-ncx_getn_short_int(const void **xpp, size_t nelems, int *tp)
+#line 3073
+ncx_getn_short_long(const void **xpp, size_t nelems, long *tp)
+#line 3073
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3073
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3073
 
+#line 3073
  /* basic algorithm is:
+#line 3073
   *   - ensure sane alignment of input data
+#line 3073
   *   - copy (conversion happens automatically) input data
+#line 3073
   *     to output
+#line 3073
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3073
   *     at next location for converted output
+#line 3073
   */
+#line 3073
   long i, j, ni;
+#line 3073
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3073
   short *xp;
+#line 3073
   int nrange = 0;         /* number of range errors */
+#line 3073
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3073
   long cxp = (long) *((char**)xpp);
+#line 3073
 
+#line 3073
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3073
   /* sjl: manually stripmine so we can limit amount of
+#line 3073
    * vector work space reserved to LOOPCNT elements. Also
+#line 3073
    * makes vectorisation easy */
+#line 3073
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3073
     ni=Min(nelems-j,LOOPCNT);
+#line 3073
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3073
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3073
       xp = tmp;
+#line 3073
     } else {
+#line 3073
       xp = (short *) *xpp;
+#line 3073
     }
+#line 3073
    /* copy the next block */
+#line 3073
 #pragma cdir loopcnt=LOOPCNT
+#line 3073
 #pragma cdir shortloop
+#line 3073
     for (i=0; i<ni; i++) {
-      tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3073
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3073
      /* test for range errors (not always needed but do it anyway) */
+#line 3073
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3073
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > INT_MAX || xp[i] < INT_MIN;
+#line 3073
+      nrange += xp[i] > LONG_MAX || xp[i] < LONG_MIN;
+#line 3073
     }
+#line 3073
    /* update xpp and tp */
+#line 3073
     if (realign) xp = (short *) *xpp;
+#line 3073
     xp += ni;
+#line 3073
     tp += ni;
+#line 3073
     *xpp = (void*)xp;
+#line 3073
   }
+#line 3073
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3073
 
+#line 3073
 #else   /* not SX */
+#line 3073
 	const char *xp = (const char *) *xpp;
+#line 3073
 	int status = NC_NOERR;
+#line 3073
 
+#line 3073
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3073
 	{
-		const int lstatus = ncx_get_short_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3073
+		const int lstatus = ncx_get_short_long(xp, tp);
+#line 3073
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3073
 			status = lstatus;
+#line 3073
 	}
+#line 3073
 
+#line 3073
 	*xpp = (const void *)xp;
+#line 3073
 	return status;
-#  endif
+#line 3073
+#endif
+#line 3073
 }
+#line 3073
 
 int
+#line 3074
 ncx_getn_short_float(const void **xpp, size_t nelems, float *tp)
+#line 3074
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3074
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3074
 
+#line 3074
  /* basic algorithm is:
+#line 3074
   *   - ensure sane alignment of input data
+#line 3074
   *   - copy (conversion happens automatically) input data
+#line 3074
   *     to output
+#line 3074
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3074
   *     at next location for converted output
+#line 3074
   */
+#line 3074
   long i, j, ni;
+#line 3074
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3074
   short *xp;
+#line 3074
   int nrange = 0;         /* number of range errors */
+#line 3074
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3074
   long cxp = (long) *((char**)xpp);
+#line 3074
 
+#line 3074
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3074
   /* sjl: manually stripmine so we can limit amount of
+#line 3074
    * vector work space reserved to LOOPCNT elements. Also
+#line 3074
    * makes vectorisation easy */
+#line 3074
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3074
     ni=Min(nelems-j,LOOPCNT);
+#line 3074
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3074
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3074
       xp = tmp;
+#line 3074
     } else {
+#line 3074
       xp = (short *) *xpp;
+#line 3074
     }
+#line 3074
    /* copy the next block */
+#line 3074
 #pragma cdir loopcnt=LOOPCNT
+#line 3074
 #pragma cdir shortloop
+#line 3074
     for (i=0; i<ni; i++) {
+#line 3074
       tp[i] = (float) Max( FLOAT_MIN, Min(FLOAT_MAX, (float) xp[i]));
+#line 3074
      /* test for range errors (not always needed but do it anyway) */
+#line 3074
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3074
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3074
       nrange += xp[i] > FLOAT_MAX || xp[i] < FLOAT_MIN;
+#line 3074
     }
+#line 3074
    /* update xpp and tp */
+#line 3074
     if (realign) xp = (short *) *xpp;
+#line 3074
     xp += ni;
+#line 3074
     tp += ni;
+#line 3074
     *xpp = (void*)xp;
+#line 3074
   }
+#line 3074
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3074
 
+#line 3074
 #else   /* not SX */
+#line 3074
 	const char *xp = (const char *) *xpp;
+#line 3074
 	int status = NC_NOERR;
+#line 3074
 
+#line 3074
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3074
 	{
+#line 3074
 		const int lstatus = ncx_get_short_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3074
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3074
 			status = lstatus;
+#line 3074
 	}
+#line 3074
 
+#line 3074
 	*xpp = (const void *)xp;
+#line 3074
 	return status;
-#  endif
+#line 3074
+#endif
+#line 3074
 }
+#line 3074
 
 int
+#line 3075
 ncx_getn_short_double(const void **xpp, size_t nelems, double *tp)
+#line 3075
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3075
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3075
 
+#line 3075
  /* basic algorithm is:
+#line 3075
   *   - ensure sane alignment of input data
+#line 3075
   *   - copy (conversion happens automatically) input data
+#line 3075
   *     to output
+#line 3075
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3075
   *     at next location for converted output
+#line 3075
   */
+#line 3075
   long i, j, ni;
+#line 3075
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3075
   short *xp;
+#line 3075
   int nrange = 0;         /* number of range errors */
+#line 3075
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3075
   long cxp = (long) *((char**)xpp);
+#line 3075
 
+#line 3075
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3075
   /* sjl: manually stripmine so we can limit amount of
+#line 3075
    * vector work space reserved to LOOPCNT elements. Also
+#line 3075
    * makes vectorisation easy */
+#line 3075
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3075
     ni=Min(nelems-j,LOOPCNT);
+#line 3075
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3075
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3075
       xp = tmp;
+#line 3075
     } else {
+#line 3075
       xp = (short *) *xpp;
+#line 3075
     }
+#line 3075
    /* copy the next block */
+#line 3075
 #pragma cdir loopcnt=LOOPCNT
+#line 3075
 #pragma cdir shortloop
+#line 3075
     for (i=0; i<ni; i++) {
+#line 3075
       tp[i] = (double) Max( DOUBLE_MIN, Min(DOUBLE_MAX, (double) xp[i]));
+#line 3075
      /* test for range errors (not always needed but do it anyway) */
+#line 3075
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3075
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3075
       nrange += xp[i] > DOUBLE_MAX || xp[i] < DOUBLE_MIN;
+#line 3075
     }
+#line 3075
    /* update xpp and tp */
+#line 3075
     if (realign) xp = (short *) *xpp;
+#line 3075
     xp += ni;
+#line 3075
     tp += ni;
+#line 3075
     *xpp = (void*)xp;
+#line 3075
   }
+#line 3075
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3075
 
+#line 3075
 #else   /* not SX */
+#line 3075
 	const char *xp = (const char *) *xpp;
+#line 3075
 	int status = NC_NOERR;
+#line 3075
 
+#line 3075
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3075
 	{
+#line 3075
 		const int lstatus = ncx_get_short_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3075
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3075
 			status = lstatus;
+#line 3075
 	}
+#line 3075
 
+#line 3075
 	*xpp = (const void *)xp;
+#line 3075
 	return status;
-#  endif
+#line 3075
+#endif
+#line 3075
 }
+#line 3075
 
 int
+#line 3076
 ncx_getn_short_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3076
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3076
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3076
 
+#line 3076
  /* basic algorithm is:
+#line 3076
   *   - ensure sane alignment of input data
+#line 3076
   *   - copy (conversion happens automatically) input data
+#line 3076
   *     to output
+#line 3076
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3076
   *     at next location for converted output
+#line 3076
   */
+#line 3076
   long i, j, ni;
+#line 3076
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3076
   short *xp;
+#line 3076
   int nrange = 0;         /* number of range errors */
+#line 3076
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3076
   long cxp = (long) *((char**)xpp);
+#line 3076
 
+#line 3076
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3076
   /* sjl: manually stripmine so we can limit amount of
+#line 3076
    * vector work space reserved to LOOPCNT elements. Also
+#line 3076
    * makes vectorisation easy */
+#line 3076
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3076
     ni=Min(nelems-j,LOOPCNT);
+#line 3076
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3076
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3076
       xp = tmp;
+#line 3076
     } else {
+#line 3076
       xp = (short *) *xpp;
+#line 3076
     }
+#line 3076
    /* copy the next block */
+#line 3076
 #pragma cdir loopcnt=LOOPCNT
+#line 3076
 #pragma cdir shortloop
+#line 3076
     for (i=0; i<ni; i++) {
+#line 3076
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3076
      /* test for range errors (not always needed but do it anyway) */
+#line 3076
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3076
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3076
       nrange += xp[i] > LONGLONG_MAX || xp[i] < LONGLONG_MIN;
+#line 3076
     }
+#line 3076
    /* update xpp and tp */
+#line 3076
     if (realign) xp = (short *) *xpp;
+#line 3076
     xp += ni;
+#line 3076
     tp += ni;
+#line 3076
     *xpp = (void*)xp;
+#line 3076
   }
+#line 3076
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3076
 
+#line 3076
 #else   /* not SX */
+#line 3076
 	const char *xp = (const char *) *xpp;
+#line 3076
 	int status = NC_NOERR;
+#line 3076
 
+#line 3076
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3076
 	{
+#line 3076
 		const int lstatus = ncx_get_short_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3076
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3076
 			status = lstatus;
+#line 3076
 	}
+#line 3076
 
+#line 3076
 	*xpp = (const void *)xp;
+#line 3076
 	return status;
-#  endif
+#line 3076
+#endif
+#line 3076
 }
+#line 3076
 
 int
+#line 3077
 ncx_getn_short_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3077
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3077
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3077
 
+#line 3077
  /* basic algorithm is:
+#line 3077
   *   - ensure sane alignment of input data
+#line 3077
   *   - copy (conversion happens automatically) input data
+#line 3077
   *     to output
+#line 3077
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3077
   *     at next location for converted output
+#line 3077
   */
+#line 3077
   long i, j, ni;
+#line 3077
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3077
   short *xp;
+#line 3077
   int nrange = 0;         /* number of range errors */
+#line 3077
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3077
   long cxp = (long) *((char**)xpp);
+#line 3077
 
+#line 3077
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3077
   /* sjl: manually stripmine so we can limit amount of
+#line 3077
    * vector work space reserved to LOOPCNT elements. Also
+#line 3077
    * makes vectorisation easy */
+#line 3077
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3077
     ni=Min(nelems-j,LOOPCNT);
+#line 3077
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3077
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3077
       xp = tmp;
+#line 3077
     } else {
+#line 3077
       xp = (short *) *xpp;
+#line 3077
     }
+#line 3077
    /* copy the next block */
+#line 3077
 #pragma cdir loopcnt=LOOPCNT
+#line 3077
 #pragma cdir shortloop
+#line 3077
     for (i=0; i<ni; i++) {
+#line 3077
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3077
      /* test for range errors (not always needed but do it anyway) */
+#line 3077
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3077
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3077
       nrange += xp[i] > UCHAR_MAX || xp[i] < 0;
+#line 3077
     }
+#line 3077
    /* update xpp and tp */
+#line 3077
     if (realign) xp = (short *) *xpp;
+#line 3077
     xp += ni;
+#line 3077
     tp += ni;
+#line 3077
     *xpp = (void*)xp;
+#line 3077
   }
+#line 3077
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3077
 
+#line 3077
 #else   /* not SX */
+#line 3077
 	const char *xp = (const char *) *xpp;
+#line 3077
 	int status = NC_NOERR;
+#line 3077
 
+#line 3077
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3077
 	{
+#line 3077
 		const int lstatus = ncx_get_short_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3077
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3077
 			status = lstatus;
+#line 3077
 	}
+#line 3077
 
+#line 3077
 	*xpp = (const void *)xp;
+#line 3077
 	return status;
-#  endif
+#line 3077
+#endif
+#line 3077
 }
+#line 3077
 
 int
+#line 3078
 ncx_getn_short_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3078
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3078
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3078
 
+#line 3078
  /* basic algorithm is:
+#line 3078
   *   - ensure sane alignment of input data
+#line 3078
   *   - copy (conversion happens automatically) input data
+#line 3078
   *     to output
+#line 3078
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3078
   *     at next location for converted output
+#line 3078
   */
+#line 3078
   long i, j, ni;
+#line 3078
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3078
   short *xp;
+#line 3078
   int nrange = 0;         /* number of range errors */
+#line 3078
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3078
   long cxp = (long) *((char**)xpp);
+#line 3078
 
+#line 3078
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3078
   /* sjl: manually stripmine so we can limit amount of
+#line 3078
    * vector work space reserved to LOOPCNT elements. Also
+#line 3078
    * makes vectorisation easy */
+#line 3078
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3078
     ni=Min(nelems-j,LOOPCNT);
+#line 3078
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3078
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3078
       xp = tmp;
+#line 3078
     } else {
+#line 3078
       xp = (short *) *xpp;
+#line 3078
     }
+#line 3078
    /* copy the next block */
+#line 3078
 #pragma cdir loopcnt=LOOPCNT
+#line 3078
 #pragma cdir shortloop
+#line 3078
     for (i=0; i<ni; i++) {
+#line 3078
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3078
      /* test for range errors (not always needed but do it anyway) */
+#line 3078
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3078
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3078
       nrange += xp[i] > USHORT_MAX || xp[i] < 0;
+#line 3078
     }
+#line 3078
    /* update xpp and tp */
+#line 3078
     if (realign) xp = (short *) *xpp;
+#line 3078
     xp += ni;
+#line 3078
     tp += ni;
+#line 3078
     *xpp = (void*)xp;
+#line 3078
   }
+#line 3078
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3078
 
+#line 3078
 #else   /* not SX */
+#line 3078
 	const char *xp = (const char *) *xpp;
+#line 3078
 	int status = NC_NOERR;
+#line 3078
 
+#line 3078
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3078
 	{
+#line 3078
 		const int lstatus = ncx_get_short_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3078
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3078
 			status = lstatus;
+#line 3078
 	}
+#line 3078
 
+#line 3078
 	*xpp = (const void *)xp;
+#line 3078
 	return status;
-#  endif
+#line 3078
+#endif
+#line 3078
 }
+#line 3078
 
 int
+#line 3079
 ncx_getn_short_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3079
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3079
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3079
 
+#line 3079
  /* basic algorithm is:
+#line 3079
   *   - ensure sane alignment of input data
+#line 3079
   *   - copy (conversion happens automatically) input data
+#line 3079
   *     to output
+#line 3079
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3079
   *     at next location for converted output
+#line 3079
   */
+#line 3079
   long i, j, ni;
+#line 3079
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3079
   short *xp;
+#line 3079
   int nrange = 0;         /* number of range errors */
+#line 3079
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3079
   long cxp = (long) *((char**)xpp);
+#line 3079
 
+#line 3079
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3079
   /* sjl: manually stripmine so we can limit amount of
+#line 3079
    * vector work space reserved to LOOPCNT elements. Also
+#line 3079
    * makes vectorisation easy */
+#line 3079
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3079
     ni=Min(nelems-j,LOOPCNT);
+#line 3079
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3079
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3079
       xp = tmp;
+#line 3079
     } else {
+#line 3079
       xp = (short *) *xpp;
+#line 3079
     }
+#line 3079
    /* copy the next block */
+#line 3079
 #pragma cdir loopcnt=LOOPCNT
+#line 3079
 #pragma cdir shortloop
+#line 3079
     for (i=0; i<ni; i++) {
+#line 3079
       tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3079
      /* test for range errors (not always needed but do it anyway) */
+#line 3079
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3079
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3079
       nrange += xp[i] > UINT_MAX || xp[i] < 0;
+#line 3079
     }
+#line 3079
    /* update xpp and tp */
+#line 3079
     if (realign) xp = (short *) *xpp;
+#line 3079
     xp += ni;
+#line 3079
     tp += ni;
+#line 3079
     *xpp = (void*)xp;
+#line 3079
   }
+#line 3079
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3079
 
+#line 3079
 #else   /* not SX */
+#line 3079
 	const char *xp = (const char *) *xpp;
+#line 3079
 	int status = NC_NOERR;
+#line 3079
 
+#line 3079
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3079
 	{
+#line 3079
 		const int lstatus = ncx_get_short_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3079
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3079
 			status = lstatus;
+#line 3079
 	}
+#line 3079
 
+#line 3079
 	*xpp = (const void *)xp;
+#line 3079
 	return status;
-#  endif
+#line 3079
+#endif
+#line 3079
 }
+#line 3079
 
 int
+#line 3080
 ncx_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3080
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3080
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3080
 
+#line 3080
  /* basic algorithm is:
+#line 3080
   *   - ensure sane alignment of input data
+#line 3080
   *   - copy (conversion happens automatically) input data
+#line 3080
   *     to output
+#line 3080
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3080
   *     at next location for converted output
+#line 3080
   */
+#line 3080
   long i, j, ni;
+#line 3080
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3080
   short *xp;
+#line 3080
   int nrange = 0;         /* number of range errors */
+#line 3080
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3080
   long cxp = (long) *((char**)xpp);
+#line 3080
 
+#line 3080
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3080
   /* sjl: manually stripmine so we can limit amount of
+#line 3080
    * vector work space reserved to LOOPCNT elements. Also
+#line 3080
    * makes vectorisation easy */
+#line 3080
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3080
     ni=Min(nelems-j,LOOPCNT);
+#line 3080
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_SHORT);
+#line 3080
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_SHORT));
+#line 3080
       xp = tmp;
+#line 3080
     } else {
+#line 3080
       xp = (short *) *xpp;
+#line 3080
     }
+#line 3080
    /* copy the next block */
+#line 3080
 #pragma cdir loopcnt=LOOPCNT
+#line 3080
 #pragma cdir shortloop
+#line 3080
     for (i=0; i<ni; i++) {
+#line 3080
       tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3080
      /* test for range errors (not always needed but do it anyway) */
+#line 3080
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3080
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3080
       nrange += xp[i] > ULONGLONG_MAX || xp[i] < 0;
+#line 3080
     }
+#line 3080
    /* update xpp and tp */
+#line 3080
     if (realign) xp = (short *) *xpp;
+#line 3080
     xp += ni;
+#line 3080
     tp += ni;
+#line 3080
     *xpp = (void*)xp;
+#line 3080
   }
+#line 3080
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3080
 
+#line 3080
 #else   /* not SX */
+#line 3080
 	const char *xp = (const char *) *xpp;
+#line 3080
 	int status = NC_NOERR;
+#line 3080
 
+#line 3080
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3080
 	{
+#line 3080
 		const int lstatus = ncx_get_short_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3080
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3080
 			status = lstatus;
+#line 3080
 	}
+#line 3080
 
+#line 3080
 	*xpp = (const void *)xp;
+#line 3080
 	return status;
-#  endif
+#line 3080
+#endif
+#line 3080
 }
+#line 3080
 
 
 int
+#line 3082
 ncx_pad_getn_short_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3082
 {
-	const size_t rndup = nelems % 2;
+#line 3082
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3082
 
+#line 3082
 	const char *xp = (const char *) *xpp;
+#line 3082
 	int status = NC_NOERR;
+#line 3082
 
+#line 3082
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3082
 	{
+#line 3082
 		const int lstatus = ncx_get_short_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3082
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3082
 			status = lstatus;
+#line 3082
 	}
+#line 3082
 
-	if(rndup != 0)
+#line 3082
+	if (rndup != 0)
+#line 3082
 		xp += X_SIZEOF_SHORT;
+#line 3082
+
+#line 3082
 	*xpp = (void *)xp;
+#line 3082
 	return status;
+#line 3082
 }
+#line 3082
 
 int
+#line 3083
 ncx_pad_getn_short_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3083
 {
-	const size_t rndup = nelems % 2;
+#line 3083
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3083
 
+#line 3083
 	const char *xp = (const char *) *xpp;
+#line 3083
 	int status = NC_NOERR;
+#line 3083
 
+#line 3083
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3083
 	{
+#line 3083
 		const int lstatus = ncx_get_short_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3083
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3083
 			status = lstatus;
+#line 3083
 	}
+#line 3083
 
-	if(rndup != 0)
+#line 3083
+	if (rndup != 0)
+#line 3083
 		xp += X_SIZEOF_SHORT;
+#line 3083
+
+#line 3083
 	*xpp = (void *)xp;
+#line 3083
 	return status;
+#line 3083
 }
+#line 3083
 
 int
+#line 3084
 ncx_pad_getn_short_short(const void **xpp, size_t nelems, short *tp)
+#line 3084
 {
-	const size_t rndup = nelems % 2;
+#line 3084
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3084
 
+#line 3084
 	const char *xp = (const char *) *xpp;
+#line 3084
 	int status = NC_NOERR;
+#line 3084
 
+#line 3084
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3084
 	{
+#line 3084
 		const int lstatus = ncx_get_short_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3084
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3084
 			status = lstatus;
+#line 3084
 	}
+#line 3084
 
-	if(rndup != 0)
+#line 3084
+	if (rndup != 0)
+#line 3084
 		xp += X_SIZEOF_SHORT;
+#line 3084
+
+#line 3084
 	*xpp = (void *)xp;
+#line 3084
 	return status;
+#line 3084
 }
+#line 3084
 
 int
+#line 3085
 ncx_pad_getn_short_int(const void **xpp, size_t nelems, int *tp)
+#line 3085
 {
-	const size_t rndup = nelems % 2;
+#line 3085
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3085
 
+#line 3085
 	const char *xp = (const char *) *xpp;
+#line 3085
 	int status = NC_NOERR;
+#line 3085
 
+#line 3085
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3085
 	{
+#line 3085
 		const int lstatus = ncx_get_short_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3085
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3085
+			status = lstatus;
+#line 3085
+	}
+#line 3085
+
+#line 3085
+	if (rndup != 0)
+#line 3085
+		xp += X_SIZEOF_SHORT;
+#line 3085
+
+#line 3085
+	*xpp = (void *)xp;
+#line 3085
+	return status;
+#line 3085
+}
+#line 3085
+
+int
+#line 3086
+ncx_pad_getn_short_long(const void **xpp, size_t nelems, long *tp)
+#line 3086
+{
+#line 3086
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3086
+
+#line 3086
+	const char *xp = (const char *) *xpp;
+#line 3086
+	int status = NC_NOERR;
+#line 3086
+
+#line 3086
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3086
+	{
+#line 3086
+		const int lstatus = ncx_get_short_long(xp, tp);
+#line 3086
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3086
 			status = lstatus;
+#line 3086
 	}
+#line 3086
 
-	if(rndup != 0)
+#line 3086
+	if (rndup != 0)
+#line 3086
 		xp += X_SIZEOF_SHORT;
+#line 3086
+
+#line 3086
 	*xpp = (void *)xp;
+#line 3086
 	return status;
+#line 3086
 }
+#line 3086
 
 int
+#line 3087
 ncx_pad_getn_short_float(const void **xpp, size_t nelems, float *tp)
+#line 3087
 {
-	const size_t rndup = nelems % 2;
+#line 3087
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3087
 
+#line 3087
 	const char *xp = (const char *) *xpp;
+#line 3087
 	int status = NC_NOERR;
+#line 3087
 
+#line 3087
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3087
 	{
+#line 3087
 		const int lstatus = ncx_get_short_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3087
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3087
 			status = lstatus;
+#line 3087
 	}
+#line 3087
 
-	if(rndup != 0)
+#line 3087
+	if (rndup != 0)
+#line 3087
 		xp += X_SIZEOF_SHORT;
+#line 3087
+
+#line 3087
 	*xpp = (void *)xp;
+#line 3087
 	return status;
+#line 3087
 }
+#line 3087
 
 int
+#line 3088
 ncx_pad_getn_short_double(const void **xpp, size_t nelems, double *tp)
+#line 3088
 {
-	const size_t rndup = nelems % 2;
+#line 3088
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3088
 
+#line 3088
 	const char *xp = (const char *) *xpp;
+#line 3088
 	int status = NC_NOERR;
+#line 3088
 
+#line 3088
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3088
 	{
+#line 3088
 		const int lstatus = ncx_get_short_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3088
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3088
 			status = lstatus;
+#line 3088
 	}
+#line 3088
 
-	if(rndup != 0)
+#line 3088
+	if (rndup != 0)
+#line 3088
 		xp += X_SIZEOF_SHORT;
+#line 3088
+
+#line 3088
 	*xpp = (void *)xp;
+#line 3088
 	return status;
+#line 3088
 }
+#line 3088
 
 int
+#line 3089
 ncx_pad_getn_short_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3089
 {
-	const size_t rndup = nelems % 2;
+#line 3089
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3089
 
+#line 3089
 	const char *xp = (const char *) *xpp;
+#line 3089
 	int status = NC_NOERR;
+#line 3089
 
+#line 3089
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3089
 	{
+#line 3089
 		const int lstatus = ncx_get_short_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3089
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3089
 			status = lstatus;
+#line 3089
 	}
+#line 3089
 
-	if(rndup != 0)
+#line 3089
+	if (rndup != 0)
+#line 3089
 		xp += X_SIZEOF_SHORT;
+#line 3089
+
+#line 3089
 	*xpp = (void *)xp;
+#line 3089
 	return status;
+#line 3089
 }
+#line 3089
 
 int
+#line 3090
 ncx_pad_getn_short_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3090
 {
-	const size_t rndup = nelems % 2;
+#line 3090
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3090
 
+#line 3090
 	const char *xp = (const char *) *xpp;
+#line 3090
 	int status = NC_NOERR;
+#line 3090
 
+#line 3090
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3090
 	{
+#line 3090
 		const int lstatus = ncx_get_short_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3090
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3090
 			status = lstatus;
+#line 3090
 	}
+#line 3090
 
-	if(rndup != 0)
+#line 3090
+	if (rndup != 0)
+#line 3090
 		xp += X_SIZEOF_SHORT;
+#line 3090
+
+#line 3090
 	*xpp = (void *)xp;
+#line 3090
 	return status;
+#line 3090
 }
+#line 3090
 
 int
+#line 3091
 ncx_pad_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3091
 {
-	const size_t rndup = nelems % 2;
+#line 3091
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3091
 
+#line 3091
 	const char *xp = (const char *) *xpp;
+#line 3091
 	int status = NC_NOERR;
+#line 3091
 
+#line 3091
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3091
 	{
+#line 3091
 		const int lstatus = ncx_get_short_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3091
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3091
 			status = lstatus;
+#line 3091
 	}
+#line 3091
 
-	if(rndup != 0)
+#line 3091
+	if (rndup != 0)
+#line 3091
 		xp += X_SIZEOF_SHORT;
+#line 3091
+
+#line 3091
 	*xpp = (void *)xp;
+#line 3091
 	return status;
+#line 3091
 }
+#line 3091
 
 int
+#line 3092
 ncx_pad_getn_short_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3092
 {
-	const size_t rndup = nelems % 2;
+#line 3092
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3092
 
+#line 3092
 	const char *xp = (const char *) *xpp;
+#line 3092
 	int status = NC_NOERR;
+#line 3092
 
+#line 3092
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3092
 	{
+#line 3092
 		const int lstatus = ncx_get_short_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3092
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3092
 			status = lstatus;
+#line 3092
 	}
+#line 3092
 
-	if(rndup != 0)
+#line 3092
+	if (rndup != 0)
+#line 3092
 		xp += X_SIZEOF_SHORT;
+#line 3092
+
+#line 3092
 	*xpp = (void *)xp;
+#line 3092
 	return status;
+#line 3092
 }
+#line 3092
 
 
 #if X_SIZEOF_SHORT == SIZEOF_SHORT
 /* optimized version */
 int
-ncx_putn_short_short(void **xpp, size_t nelems, const short *tp)
+ncx_putn_short_short(void **xpp, size_t nelems, const short *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_SHORT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_SHORT);
 # else
 	swapn2b(*xpp, tp, nelems);
 # endif
@@ -6074,956 +13331,2074 @@ ncx_putn_short_short(void **xpp, size_t nelems, const short *tp)
 }
 #else
 int
-ncx_putn_short_short(void **xpp, size_t nelems, const short *tp)
+#line 3108
+ncx_putn_short_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3108
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3108
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3108
 
+#line 3108
  /* basic algorithm is:
+#line 3108
   *   - ensure sane alignment of output data
+#line 3108
   *   - copy (conversion happens automatically) input data
+#line 3108
   *     to output
+#line 3108
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3108
   *     at next location for converted output
+#line 3108
   */
+#line 3108
   long i, j, ni;
+#line 3108
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3108
   short *xp;
+#line 3108
   int nrange = 0;         /* number of range errors */
+#line 3108
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3108
   long cxp = (long) *((char**)xpp);
+#line 3108
 
+#line 3108
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3108
   /* sjl: manually stripmine so we can limit amount of
+#line 3108
    * vector work space reserved to LOOPCNT elements. Also
+#line 3108
    * makes vectorisation easy */
+#line 3108
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3108
     ni=Min(nelems-j,LOOPCNT);
+#line 3108
     if (realign) {
+#line 3108
       xp = tmp;
+#line 3108
     } else {
+#line 3108
       xp = (short *) *xpp;
+#line 3108
     }
+#line 3108
    /* copy the next block */
+#line 3108
 #pragma cdir loopcnt=LOOPCNT
+#line 3108
 #pragma cdir shortloop
+#line 3108
     for (i=0; i<ni; i++) {
+#line 3108
       /* the normal case: */
+#line 3108
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3108
      /* test for range errors (not always needed but do it anyway) */
+#line 3108
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3108
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3108
       nrange += tp[i] > X_SHORT_MAX || tp[i] < X_SHORT_MIN;
+#line 3108
     }
+#line 3108
    /* copy workspace back if necessary */
+#line 3108
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3108
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3108
       xp = (short *) *xpp;
+#line 3108
     }
+#line 3108
    /* update xpp and tp */
+#line 3108
     xp += ni;
+#line 3108
     tp += ni;
+#line 3108
     *xpp = (void*)xp;
+#line 3108
   }
+#line 3108
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3108
 
+#line 3108
 #else   /* not SX */
+#line 3108
 
+#line 3108
 	char *xp = (char *) *xpp;
+#line 3108
 	int status = NC_NOERR;
+#line 3108
 
+#line 3108
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3108
 	{
-		int lstatus = ncx_put_short_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3108
+		int lstatus = ncx_put_short_short(xp, tp, fillp);
+#line 3108
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3108
 			status = lstatus;
+#line 3108
 	}
+#line 3108
 
+#line 3108
 	*xpp = (void *)xp;
+#line 3108
 	return status;
+#line 3108
 #endif
+#line 3108
 }
+#line 3108
+
+#endif
+int
+#line 3110
+ncx_putn_short_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3110
+{
+#line 3110
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3110
+
+#line 3110
+ /* basic algorithm is:
+#line 3110
+  *   - ensure sane alignment of output data
+#line 3110
+  *   - copy (conversion happens automatically) input data
+#line 3110
+  *     to output
+#line 3110
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3110
+  *     at next location for converted output
+#line 3110
+  */
+#line 3110
+  long i, j, ni;
+#line 3110
+  short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3110
+  short *xp;
+#line 3110
+  int nrange = 0;         /* number of range errors */
+#line 3110
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3110
+  long cxp = (long) *((char**)xpp);
+#line 3110
+
+#line 3110
+  realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3110
+  /* sjl: manually stripmine so we can limit amount of
+#line 3110
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3110
+   * makes vectorisation easy */
+#line 3110
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3110
+    ni=Min(nelems-j,LOOPCNT);
+#line 3110
+    if (realign) {
+#line 3110
+      xp = tmp;
+#line 3110
+    } else {
+#line 3110
+      xp = (short *) *xpp;
+#line 3110
+    }
+#line 3110
+   /* copy the next block */
+#line 3110
+#pragma cdir loopcnt=LOOPCNT
+#line 3110
+#pragma cdir shortloop
+#line 3110
+    for (i=0; i<ni; i++) {
+#line 3110
+      /* the normal case: */
+#line 3110
+      xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3110
+     /* test for range errors (not always needed but do it anyway) */
+#line 3110
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3110
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3110
+      nrange += tp[i] > X_SHORT_MAX || tp[i] < X_SHORT_MIN;
+#line 3110
+    }
+#line 3110
+   /* copy workspace back if necessary */
+#line 3110
+    if (realign) {
+#line 3110
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3110
+      xp = (short *) *xpp;
+#line 3110
+    }
+#line 3110
+   /* update xpp and tp */
+#line 3110
+    xp += ni;
+#line 3110
+    tp += ni;
+#line 3110
+    *xpp = (void*)xp;
+#line 3110
+  }
+#line 3110
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3110
+
+#line 3110
+#else   /* not SX */
+#line 3110
+
+#line 3110
+	char *xp = (char *) *xpp;
+#line 3110
+	int status = NC_NOERR;
+#line 3110
+
+#line 3110
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3110
+	{
+#line 3110
+		int lstatus = ncx_put_short_schar(xp, tp, fillp);
+#line 3110
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3110
+			status = lstatus;
+#line 3110
+	}
+#line 3110
 
+#line 3110
+	*xpp = (void *)xp;
+#line 3110
+	return status;
+#line 3110
 #endif
+#line 3110
+}
+#line 3110
+
 int
-ncx_putn_short_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3111
+ncx_putn_short_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3111
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3111
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3111
 
+#line 3111
  /* basic algorithm is:
+#line 3111
   *   - ensure sane alignment of output data
+#line 3111
   *   - copy (conversion happens automatically) input data
+#line 3111
   *     to output
+#line 3111
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3111
   *     at next location for converted output
+#line 3111
   */
+#line 3111
   long i, j, ni;
+#line 3111
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3111
   short *xp;
+#line 3111
   int nrange = 0;         /* number of range errors */
+#line 3111
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3111
   long cxp = (long) *((char**)xpp);
+#line 3111
 
+#line 3111
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3111
   /* sjl: manually stripmine so we can limit amount of
+#line 3111
    * vector work space reserved to LOOPCNT elements. Also
+#line 3111
    * makes vectorisation easy */
+#line 3111
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3111
     ni=Min(nelems-j,LOOPCNT);
+#line 3111
     if (realign) {
+#line 3111
       xp = tmp;
+#line 3111
     } else {
+#line 3111
       xp = (short *) *xpp;
+#line 3111
     }
+#line 3111
    /* copy the next block */
+#line 3111
 #pragma cdir loopcnt=LOOPCNT
+#line 3111
 #pragma cdir shortloop
+#line 3111
     for (i=0; i<ni; i++) {
+#line 3111
       /* the normal case: */
+#line 3111
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3111
      /* test for range errors (not always needed but do it anyway) */
+#line 3111
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3111
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3111
       nrange += tp[i] > X_SHORT_MAX || tp[i] < X_SHORT_MIN;
+#line 3111
     }
+#line 3111
    /* copy workspace back if necessary */
+#line 3111
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3111
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3111
       xp = (short *) *xpp;
+#line 3111
     }
+#line 3111
    /* update xpp and tp */
+#line 3111
     xp += ni;
+#line 3111
     tp += ni;
+#line 3111
     *xpp = (void*)xp;
+#line 3111
   }
+#line 3111
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3111
 
+#line 3111
 #else   /* not SX */
+#line 3111
 
+#line 3111
 	char *xp = (char *) *xpp;
+#line 3111
 	int status = NC_NOERR;
+#line 3111
 
+#line 3111
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3111
 	{
-		int lstatus = ncx_put_short_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3111
+		int lstatus = ncx_put_short_int(xp, tp, fillp);
+#line 3111
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3111
 			status = lstatus;
+#line 3111
 	}
+#line 3111
 
+#line 3111
 	*xpp = (void *)xp;
+#line 3111
 	return status;
+#line 3111
 #endif
+#line 3111
 }
+#line 3111
 
 int
-ncx_putn_short_int(void **xpp, size_t nelems, const int *tp)
+#line 3112
+ncx_putn_short_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3112
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3112
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3112
 
+#line 3112
  /* basic algorithm is:
+#line 3112
   *   - ensure sane alignment of output data
+#line 3112
   *   - copy (conversion happens automatically) input data
+#line 3112
   *     to output
+#line 3112
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3112
   *     at next location for converted output
+#line 3112
   */
+#line 3112
   long i, j, ni;
+#line 3112
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3112
   short *xp;
+#line 3112
   int nrange = 0;         /* number of range errors */
+#line 3112
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3112
   long cxp = (long) *((char**)xpp);
+#line 3112
 
+#line 3112
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3112
   /* sjl: manually stripmine so we can limit amount of
+#line 3112
    * vector work space reserved to LOOPCNT elements. Also
+#line 3112
    * makes vectorisation easy */
+#line 3112
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3112
     ni=Min(nelems-j,LOOPCNT);
+#line 3112
     if (realign) {
+#line 3112
       xp = tmp;
+#line 3112
     } else {
+#line 3112
       xp = (short *) *xpp;
+#line 3112
     }
+#line 3112
    /* copy the next block */
+#line 3112
 #pragma cdir loopcnt=LOOPCNT
+#line 3112
 #pragma cdir shortloop
+#line 3112
     for (i=0; i<ni; i++) {
+#line 3112
       /* the normal case: */
+#line 3112
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3112
      /* test for range errors (not always needed but do it anyway) */
+#line 3112
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3112
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3112
       nrange += tp[i] > X_SHORT_MAX || tp[i] < X_SHORT_MIN;
+#line 3112
     }
+#line 3112
    /* copy workspace back if necessary */
+#line 3112
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3112
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3112
       xp = (short *) *xpp;
+#line 3112
     }
+#line 3112
    /* update xpp and tp */
+#line 3112
     xp += ni;
+#line 3112
     tp += ni;
+#line 3112
     *xpp = (void*)xp;
+#line 3112
   }
+#line 3112
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3112
 
+#line 3112
 #else   /* not SX */
+#line 3112
 
+#line 3112
 	char *xp = (char *) *xpp;
+#line 3112
 	int status = NC_NOERR;
+#line 3112
 
+#line 3112
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3112
 	{
-		int lstatus = ncx_put_short_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3112
+		int lstatus = ncx_put_short_long(xp, tp, fillp);
+#line 3112
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3112
 			status = lstatus;
+#line 3112
 	}
+#line 3112
 
+#line 3112
 	*xpp = (void *)xp;
+#line 3112
 	return status;
+#line 3112
 #endif
+#line 3112
 }
+#line 3112
 
 int
-ncx_putn_short_float(void **xpp, size_t nelems, const float *tp)
+#line 3113
+ncx_putn_short_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3113
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3113
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3113
 
+#line 3113
  /* basic algorithm is:
+#line 3113
   *   - ensure sane alignment of output data
+#line 3113
   *   - copy (conversion happens automatically) input data
+#line 3113
   *     to output
+#line 3113
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3113
   *     at next location for converted output
+#line 3113
   */
+#line 3113
   long i, j, ni;
+#line 3113
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3113
   short *xp;
+#line 3113
   int nrange = 0;         /* number of range errors */
+#line 3113
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3113
   long cxp = (long) *((char**)xpp);
+#line 3113
 
+#line 3113
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3113
   /* sjl: manually stripmine so we can limit amount of
+#line 3113
    * vector work space reserved to LOOPCNT elements. Also
+#line 3113
    * makes vectorisation easy */
+#line 3113
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3113
     ni=Min(nelems-j,LOOPCNT);
+#line 3113
     if (realign) {
+#line 3113
       xp = tmp;
+#line 3113
     } else {
+#line 3113
       xp = (short *) *xpp;
+#line 3113
     }
+#line 3113
    /* copy the next block */
+#line 3113
 #pragma cdir loopcnt=LOOPCNT
+#line 3113
 #pragma cdir shortloop
+#line 3113
     for (i=0; i<ni; i++) {
+#line 3113
       /* the normal case: */
+#line 3113
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3113
      /* test for range errors (not always needed but do it anyway) */
+#line 3113
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3113
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3113
       nrange += tp[i] > X_SHORT_MAX || tp[i] < X_SHORT_MIN;
+#line 3113
     }
+#line 3113
    /* copy workspace back if necessary */
+#line 3113
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3113
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3113
       xp = (short *) *xpp;
+#line 3113
     }
+#line 3113
    /* update xpp and tp */
+#line 3113
     xp += ni;
+#line 3113
     tp += ni;
+#line 3113
     *xpp = (void*)xp;
+#line 3113
   }
+#line 3113
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3113
 
+#line 3113
 #else   /* not SX */
+#line 3113
 
+#line 3113
 	char *xp = (char *) *xpp;
+#line 3113
 	int status = NC_NOERR;
+#line 3113
 
+#line 3113
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3113
 	{
-		int lstatus = ncx_put_short_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3113
+		int lstatus = ncx_put_short_float(xp, tp, fillp);
+#line 3113
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3113
 			status = lstatus;
+#line 3113
 	}
+#line 3113
 
+#line 3113
 	*xpp = (void *)xp;
+#line 3113
 	return status;
+#line 3113
 #endif
+#line 3113
 }
+#line 3113
 
 int
-ncx_putn_short_double(void **xpp, size_t nelems, const double *tp)
+#line 3114
+ncx_putn_short_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3114
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3114
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3114
 
+#line 3114
  /* basic algorithm is:
+#line 3114
   *   - ensure sane alignment of output data
+#line 3114
   *   - copy (conversion happens automatically) input data
+#line 3114
   *     to output
+#line 3114
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3114
   *     at next location for converted output
+#line 3114
   */
+#line 3114
   long i, j, ni;
+#line 3114
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3114
   short *xp;
+#line 3114
   int nrange = 0;         /* number of range errors */
+#line 3114
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3114
   long cxp = (long) *((char**)xpp);
+#line 3114
 
+#line 3114
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3114
   /* sjl: manually stripmine so we can limit amount of
+#line 3114
    * vector work space reserved to LOOPCNT elements. Also
+#line 3114
    * makes vectorisation easy */
+#line 3114
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3114
     ni=Min(nelems-j,LOOPCNT);
+#line 3114
     if (realign) {
+#line 3114
       xp = tmp;
+#line 3114
     } else {
+#line 3114
       xp = (short *) *xpp;
+#line 3114
     }
+#line 3114
    /* copy the next block */
+#line 3114
 #pragma cdir loopcnt=LOOPCNT
+#line 3114
 #pragma cdir shortloop
+#line 3114
     for (i=0; i<ni; i++) {
+#line 3114
       /* the normal case: */
+#line 3114
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3114
      /* test for range errors (not always needed but do it anyway) */
+#line 3114
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3114
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3114
       nrange += tp[i] > X_SHORT_MAX || tp[i] < X_SHORT_MIN;
+#line 3114
     }
+#line 3114
    /* copy workspace back if necessary */
+#line 3114
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3114
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3114
       xp = (short *) *xpp;
+#line 3114
     }
+#line 3114
    /* update xpp and tp */
+#line 3114
     xp += ni;
+#line 3114
     tp += ni;
+#line 3114
     *xpp = (void*)xp;
+#line 3114
   }
+#line 3114
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3114
 
+#line 3114
 #else   /* not SX */
+#line 3114
 
+#line 3114
 	char *xp = (char *) *xpp;
+#line 3114
 	int status = NC_NOERR;
+#line 3114
 
+#line 3114
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3114
 	{
-		int lstatus = ncx_put_short_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3114
+		int lstatus = ncx_put_short_double(xp, tp, fillp);
+#line 3114
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3114
 			status = lstatus;
+#line 3114
 	}
+#line 3114
 
+#line 3114
 	*xpp = (void *)xp;
+#line 3114
 	return status;
+#line 3114
 #endif
+#line 3114
 }
+#line 3114
 
 int
-ncx_putn_short_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3115
+ncx_putn_short_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3115
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3115
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3115
 
+#line 3115
  /* basic algorithm is:
+#line 3115
   *   - ensure sane alignment of output data
+#line 3115
   *   - copy (conversion happens automatically) input data
+#line 3115
   *     to output
+#line 3115
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3115
   *     at next location for converted output
+#line 3115
   */
+#line 3115
   long i, j, ni;
+#line 3115
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3115
   short *xp;
+#line 3115
   int nrange = 0;         /* number of range errors */
+#line 3115
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3115
   long cxp = (long) *((char**)xpp);
+#line 3115
 
+#line 3115
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3115
   /* sjl: manually stripmine so we can limit amount of
+#line 3115
    * vector work space reserved to LOOPCNT elements. Also
+#line 3115
    * makes vectorisation easy */
+#line 3115
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3115
     ni=Min(nelems-j,LOOPCNT);
+#line 3115
     if (realign) {
+#line 3115
       xp = tmp;
+#line 3115
     } else {
+#line 3115
       xp = (short *) *xpp;
+#line 3115
     }
+#line 3115
    /* copy the next block */
+#line 3115
 #pragma cdir loopcnt=LOOPCNT
+#line 3115
 #pragma cdir shortloop
+#line 3115
     for (i=0; i<ni; i++) {
+#line 3115
       /* the normal case: */
+#line 3115
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3115
      /* test for range errors (not always needed but do it anyway) */
+#line 3115
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3115
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3115
       nrange += tp[i] > X_SHORT_MAX || tp[i] < X_SHORT_MIN;
+#line 3115
     }
+#line 3115
    /* copy workspace back if necessary */
+#line 3115
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3115
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3115
       xp = (short *) *xpp;
+#line 3115
     }
+#line 3115
    /* update xpp and tp */
+#line 3115
     xp += ni;
+#line 3115
     tp += ni;
+#line 3115
     *xpp = (void*)xp;
+#line 3115
   }
+#line 3115
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3115
 
+#line 3115
 #else   /* not SX */
+#line 3115
 
+#line 3115
 	char *xp = (char *) *xpp;
+#line 3115
 	int status = NC_NOERR;
+#line 3115
 
+#line 3115
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3115
 	{
-		int lstatus = ncx_put_short_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3115
+		int lstatus = ncx_put_short_longlong(xp, tp, fillp);
+#line 3115
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3115
 			status = lstatus;
+#line 3115
 	}
+#line 3115
 
+#line 3115
 	*xpp = (void *)xp;
+#line 3115
 	return status;
+#line 3115
 #endif
+#line 3115
 }
+#line 3115
 
 int
-ncx_putn_short_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3116
+ncx_putn_short_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3116
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3116
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3116
 
+#line 3116
  /* basic algorithm is:
+#line 3116
   *   - ensure sane alignment of output data
+#line 3116
   *   - copy (conversion happens automatically) input data
+#line 3116
   *     to output
+#line 3116
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3116
   *     at next location for converted output
+#line 3116
   */
+#line 3116
   long i, j, ni;
+#line 3116
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3116
   short *xp;
+#line 3116
   int nrange = 0;         /* number of range errors */
+#line 3116
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3116
   long cxp = (long) *((char**)xpp);
+#line 3116
 
+#line 3116
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3116
   /* sjl: manually stripmine so we can limit amount of
+#line 3116
    * vector work space reserved to LOOPCNT elements. Also
+#line 3116
    * makes vectorisation easy */
+#line 3116
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3116
     ni=Min(nelems-j,LOOPCNT);
+#line 3116
     if (realign) {
+#line 3116
       xp = tmp;
+#line 3116
     } else {
+#line 3116
       xp = (short *) *xpp;
+#line 3116
     }
+#line 3116
    /* copy the next block */
+#line 3116
 #pragma cdir loopcnt=LOOPCNT
+#line 3116
 #pragma cdir shortloop
+#line 3116
     for (i=0; i<ni; i++) {
+#line 3116
       /* the normal case: */
+#line 3116
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3116
      /* test for range errors (not always needed but do it anyway) */
+#line 3116
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3116
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3116
       nrange += tp[i] > X_SHORT_MAX ;
+#line 3116
     }
+#line 3116
    /* copy workspace back if necessary */
+#line 3116
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3116
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3116
       xp = (short *) *xpp;
+#line 3116
     }
+#line 3116
    /* update xpp and tp */
+#line 3116
     xp += ni;
+#line 3116
     tp += ni;
+#line 3116
     *xpp = (void*)xp;
+#line 3116
   }
+#line 3116
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3116
 
+#line 3116
 #else   /* not SX */
+#line 3116
 
+#line 3116
 	char *xp = (char *) *xpp;
+#line 3116
 	int status = NC_NOERR;
+#line 3116
 
+#line 3116
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3116
 	{
-		int lstatus = ncx_put_short_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3116
+		int lstatus = ncx_put_short_uchar(xp, tp, fillp);
+#line 3116
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3116
 			status = lstatus;
+#line 3116
 	}
+#line 3116
 
+#line 3116
 	*xpp = (void *)xp;
+#line 3116
 	return status;
+#line 3116
 #endif
+#line 3116
 }
+#line 3116
 
 int
-ncx_putn_short_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3117
+ncx_putn_short_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3117
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3117
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3117
 
+#line 3117
  /* basic algorithm is:
+#line 3117
   *   - ensure sane alignment of output data
+#line 3117
   *   - copy (conversion happens automatically) input data
+#line 3117
   *     to output
+#line 3117
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3117
   *     at next location for converted output
+#line 3117
   */
+#line 3117
   long i, j, ni;
+#line 3117
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3117
   short *xp;
+#line 3117
   int nrange = 0;         /* number of range errors */
+#line 3117
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3117
   long cxp = (long) *((char**)xpp);
+#line 3117
 
+#line 3117
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3117
   /* sjl: manually stripmine so we can limit amount of
+#line 3117
    * vector work space reserved to LOOPCNT elements. Also
+#line 3117
    * makes vectorisation easy */
+#line 3117
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3117
     ni=Min(nelems-j,LOOPCNT);
+#line 3117
     if (realign) {
+#line 3117
       xp = tmp;
+#line 3117
     } else {
+#line 3117
       xp = (short *) *xpp;
+#line 3117
     }
+#line 3117
    /* copy the next block */
+#line 3117
 #pragma cdir loopcnt=LOOPCNT
+#line 3117
 #pragma cdir shortloop
+#line 3117
     for (i=0; i<ni; i++) {
+#line 3117
       /* the normal case: */
+#line 3117
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3117
      /* test for range errors (not always needed but do it anyway) */
+#line 3117
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3117
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3117
       nrange += tp[i] > X_SHORT_MAX ;
+#line 3117
     }
+#line 3117
    /* copy workspace back if necessary */
+#line 3117
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3117
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3117
       xp = (short *) *xpp;
+#line 3117
     }
+#line 3117
    /* update xpp and tp */
+#line 3117
     xp += ni;
+#line 3117
     tp += ni;
+#line 3117
     *xpp = (void*)xp;
+#line 3117
   }
+#line 3117
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3117
 
+#line 3117
 #else   /* not SX */
+#line 3117
 
+#line 3117
 	char *xp = (char *) *xpp;
+#line 3117
 	int status = NC_NOERR;
+#line 3117
 
+#line 3117
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3117
 	{
-		int lstatus = ncx_put_short_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3117
+		int lstatus = ncx_put_short_uint(xp, tp, fillp);
+#line 3117
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3117
 			status = lstatus;
+#line 3117
 	}
+#line 3117
 
+#line 3117
 	*xpp = (void *)xp;
+#line 3117
 	return status;
+#line 3117
 #endif
+#line 3117
 }
+#line 3117
 
 int
-ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3118
+ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3118
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3118
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3118
 
+#line 3118
  /* basic algorithm is:
+#line 3118
   *   - ensure sane alignment of output data
+#line 3118
   *   - copy (conversion happens automatically) input data
+#line 3118
   *     to output
+#line 3118
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3118
   *     at next location for converted output
+#line 3118
   */
+#line 3118
   long i, j, ni;
+#line 3118
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3118
   short *xp;
+#line 3118
   int nrange = 0;         /* number of range errors */
+#line 3118
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3118
   long cxp = (long) *((char**)xpp);
+#line 3118
 
+#line 3118
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3118
   /* sjl: manually stripmine so we can limit amount of
+#line 3118
    * vector work space reserved to LOOPCNT elements. Also
+#line 3118
    * makes vectorisation easy */
+#line 3118
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3118
     ni=Min(nelems-j,LOOPCNT);
+#line 3118
     if (realign) {
+#line 3118
       xp = tmp;
+#line 3118
     } else {
+#line 3118
       xp = (short *) *xpp;
+#line 3118
     }
+#line 3118
    /* copy the next block */
+#line 3118
 #pragma cdir loopcnt=LOOPCNT
+#line 3118
 #pragma cdir shortloop
+#line 3118
     for (i=0; i<ni; i++) {
+#line 3118
       /* the normal case: */
+#line 3118
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3118
      /* test for range errors (not always needed but do it anyway) */
+#line 3118
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3118
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3118
       nrange += tp[i] > X_SHORT_MAX ;
+#line 3118
     }
+#line 3118
    /* copy workspace back if necessary */
+#line 3118
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3118
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3118
       xp = (short *) *xpp;
+#line 3118
     }
+#line 3118
    /* update xpp and tp */
+#line 3118
     xp += ni;
+#line 3118
     tp += ni;
+#line 3118
     *xpp = (void*)xp;
+#line 3118
   }
+#line 3118
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3118
 
+#line 3118
 #else   /* not SX */
+#line 3118
 
+#line 3118
 	char *xp = (char *) *xpp;
+#line 3118
 	int status = NC_NOERR;
+#line 3118
 
+#line 3118
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3118
 	{
-		int lstatus = ncx_put_short_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3118
+		int lstatus = ncx_put_short_ulonglong(xp, tp, fillp);
+#line 3118
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3118
 			status = lstatus;
+#line 3118
 	}
+#line 3118
 
+#line 3118
 	*xpp = (void *)xp;
+#line 3118
 	return status;
+#line 3118
 #endif
+#line 3118
 }
+#line 3118
 
 int
-ncx_putn_short_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3119
+ncx_putn_short_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3119
 {
-#if _SX && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3119
+#if defined(_SX) && _SX != 0 && X_SIZEOF_SHORT == SIZEOF_SHORT
+#line 3119
 
+#line 3119
  /* basic algorithm is:
+#line 3119
   *   - ensure sane alignment of output data
+#line 3119
   *   - copy (conversion happens automatically) input data
+#line 3119
   *     to output
+#line 3119
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3119
   *     at next location for converted output
+#line 3119
   */
+#line 3119
   long i, j, ni;
+#line 3119
   short tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3119
   short *xp;
+#line 3119
   int nrange = 0;         /* number of range errors */
+#line 3119
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3119
   long cxp = (long) *((char**)xpp);
+#line 3119
 
+#line 3119
   realign = (cxp & 7) % SIZEOF_SHORT;
+#line 3119
   /* sjl: manually stripmine so we can limit amount of
+#line 3119
    * vector work space reserved to LOOPCNT elements. Also
+#line 3119
    * makes vectorisation easy */
+#line 3119
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3119
     ni=Min(nelems-j,LOOPCNT);
+#line 3119
     if (realign) {
+#line 3119
       xp = tmp;
+#line 3119
     } else {
+#line 3119
       xp = (short *) *xpp;
+#line 3119
     }
+#line 3119
    /* copy the next block */
+#line 3119
 #pragma cdir loopcnt=LOOPCNT
+#line 3119
 #pragma cdir shortloop
+#line 3119
     for (i=0; i<ni; i++) {
+#line 3119
       /* the normal case: */
+#line 3119
       xp[i] = (short) Max( X_SHORT_MIN, Min(X_SHORT_MAX, (short) tp[i]));
+#line 3119
      /* test for range errors (not always needed but do it anyway) */
+#line 3119
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3119
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3119
       nrange += tp[i] > X_SHORT_MAX ;
+#line 3119
     }
+#line 3119
    /* copy workspace back if necessary */
+#line 3119
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT);
+#line 3119
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_SHORT);
+#line 3119
       xp = (short *) *xpp;
+#line 3119
     }
+#line 3119
    /* update xpp and tp */
+#line 3119
     xp += ni;
+#line 3119
     tp += ni;
+#line 3119
     *xpp = (void*)xp;
+#line 3119
   }
+#line 3119
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3119
 
+#line 3119
 #else   /* not SX */
+#line 3119
 
+#line 3119
 	char *xp = (char *) *xpp;
+#line 3119
 	int status = NC_NOERR;
+#line 3119
 
+#line 3119
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3119
 	{
-		int lstatus = ncx_put_short_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3119
+		int lstatus = ncx_put_short_ushort(xp, tp, fillp);
+#line 3119
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3119
 			status = lstatus;
+#line 3119
 	}
+#line 3119
 
+#line 3119
 	*xpp = (void *)xp;
+#line 3119
 	return status;
+#line 3119
 #endif
+#line 3119
 }
+#line 3119
+
+
+int
+#line 3121
+ncx_pad_putn_short_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3121
+{
+#line 3121
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3121
+
+#line 3121
+	char *xp = (char *) *xpp;
+#line 3121
+	int status = NC_NOERR;
+#line 3121
+
+#line 3121
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3121
+	{
+#line 3121
+		int lstatus = ncx_put_short_schar(xp, tp, fillp);
+#line 3121
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3121
+			status = lstatus;
+#line 3121
+	}
+#line 3121
+
+#line 3121
+	if (rndup != 0)
+#line 3121
+	{
+#line 3121
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3121
+		xp += X_SIZEOF_SHORT;
+#line 3121
+	}
+#line 3121
 
+#line 3121
+	*xpp = (void *)xp;
+#line 3121
+	return status;
+#line 3121
+}
+#line 3121
 
 int
-ncx_pad_putn_short_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3122
+ncx_pad_putn_short_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3122
 {
-	const size_t rndup = nelems % 2;
+#line 3122
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3122
 
+#line 3122
 	char *xp = (char *) *xpp;
+#line 3122
 	int status = NC_NOERR;
+#line 3122
 
+#line 3122
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3122
 	{
-		int lstatus = ncx_put_short_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3122
+		int lstatus = ncx_put_short_uchar(xp, tp, fillp);
+#line 3122
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3122
 			status = lstatus;
+#line 3122
 	}
+#line 3122
 
-	if(rndup != 0)
+#line 3122
+	if (rndup != 0)
+#line 3122
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3122
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3122
 		xp += X_SIZEOF_SHORT;
+#line 3122
 	}
+#line 3122
 
+#line 3122
 	*xpp = (void *)xp;
+#line 3122
 	return status;
+#line 3122
 }
+#line 3122
 
 int
-ncx_pad_putn_short_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3123
+ncx_pad_putn_short_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3123
 {
-	const size_t rndup = nelems % 2;
+#line 3123
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3123
 
+#line 3123
 	char *xp = (char *) *xpp;
+#line 3123
 	int status = NC_NOERR;
+#line 3123
 
+#line 3123
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3123
 	{
-		int lstatus = ncx_put_short_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3123
+		int lstatus = ncx_put_short_short(xp, tp, fillp);
+#line 3123
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3123
 			status = lstatus;
+#line 3123
 	}
+#line 3123
 
-	if(rndup != 0)
+#line 3123
+	if (rndup != 0)
+#line 3123
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3123
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3123
 		xp += X_SIZEOF_SHORT;
+#line 3123
 	}
+#line 3123
 
+#line 3123
 	*xpp = (void *)xp;
+#line 3123
 	return status;
+#line 3123
 }
+#line 3123
 
 int
-ncx_pad_putn_short_short(void **xpp, size_t nelems, const short *tp)
+#line 3124
+ncx_pad_putn_short_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3124
 {
-	const size_t rndup = nelems % 2;
+#line 3124
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3124
 
+#line 3124
 	char *xp = (char *) *xpp;
+#line 3124
 	int status = NC_NOERR;
+#line 3124
 
+#line 3124
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3124
 	{
-		int lstatus = ncx_put_short_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3124
+		int lstatus = ncx_put_short_int(xp, tp, fillp);
+#line 3124
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3124
 			status = lstatus;
+#line 3124
 	}
+#line 3124
 
-	if(rndup != 0)
+#line 3124
+	if (rndup != 0)
+#line 3124
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3124
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3124
 		xp += X_SIZEOF_SHORT;
+#line 3124
 	}
+#line 3124
 
+#line 3124
 	*xpp = (void *)xp;
+#line 3124
 	return status;
+#line 3124
 }
+#line 3124
 
 int
-ncx_pad_putn_short_int(void **xpp, size_t nelems, const int *tp)
+#line 3125
+ncx_pad_putn_short_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3125
 {
-	const size_t rndup = nelems % 2;
+#line 3125
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3125
 
+#line 3125
 	char *xp = (char *) *xpp;
+#line 3125
 	int status = NC_NOERR;
+#line 3125
 
+#line 3125
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3125
 	{
-		int lstatus = ncx_put_short_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3125
+		int lstatus = ncx_put_short_long(xp, tp, fillp);
+#line 3125
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3125
 			status = lstatus;
+#line 3125
 	}
+#line 3125
 
-	if(rndup != 0)
+#line 3125
+	if (rndup != 0)
+#line 3125
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3125
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3125
 		xp += X_SIZEOF_SHORT;
+#line 3125
 	}
+#line 3125
 
+#line 3125
 	*xpp = (void *)xp;
+#line 3125
 	return status;
+#line 3125
 }
+#line 3125
 
 int
-ncx_pad_putn_short_float(void **xpp, size_t nelems, const float *tp)
+#line 3126
+ncx_pad_putn_short_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3126
 {
-	const size_t rndup = nelems % 2;
+#line 3126
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3126
 
+#line 3126
 	char *xp = (char *) *xpp;
+#line 3126
 	int status = NC_NOERR;
+#line 3126
 
+#line 3126
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3126
 	{
-		int lstatus = ncx_put_short_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3126
+		int lstatus = ncx_put_short_float(xp, tp, fillp);
+#line 3126
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3126
 			status = lstatus;
+#line 3126
 	}
+#line 3126
 
-	if(rndup != 0)
+#line 3126
+	if (rndup != 0)
+#line 3126
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3126
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3126
 		xp += X_SIZEOF_SHORT;
+#line 3126
 	}
+#line 3126
 
+#line 3126
 	*xpp = (void *)xp;
+#line 3126
 	return status;
+#line 3126
 }
+#line 3126
 
 int
-ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *tp)
+#line 3127
+ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3127
 {
-	const size_t rndup = nelems % 2;
+#line 3127
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3127
 
+#line 3127
 	char *xp = (char *) *xpp;
+#line 3127
 	int status = NC_NOERR;
+#line 3127
 
+#line 3127
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3127
 	{
-		int lstatus = ncx_put_short_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3127
+		int lstatus = ncx_put_short_double(xp, tp, fillp);
+#line 3127
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3127
 			status = lstatus;
+#line 3127
 	}
+#line 3127
 
-	if(rndup != 0)
+#line 3127
+	if (rndup != 0)
+#line 3127
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3127
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3127
 		xp += X_SIZEOF_SHORT;
+#line 3127
 	}
+#line 3127
 
+#line 3127
 	*xpp = (void *)xp;
+#line 3127
 	return status;
+#line 3127
 }
+#line 3127
 
 int
-ncx_pad_putn_short_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3128
+ncx_pad_putn_short_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3128
 {
-	const size_t rndup = nelems % 2;
+#line 3128
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3128
 
+#line 3128
 	char *xp = (char *) *xpp;
+#line 3128
 	int status = NC_NOERR;
+#line 3128
 
+#line 3128
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3128
 	{
-		int lstatus = ncx_put_short_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3128
+		int lstatus = ncx_put_short_uint(xp, tp, fillp);
+#line 3128
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3128
 			status = lstatus;
+#line 3128
 	}
+#line 3128
 
-	if(rndup != 0)
+#line 3128
+	if (rndup != 0)
+#line 3128
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3128
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3128
 		xp += X_SIZEOF_SHORT;
+#line 3128
 	}
+#line 3128
 
+#line 3128
 	*xpp = (void *)xp;
+#line 3128
 	return status;
+#line 3128
 }
+#line 3128
 
 int
-ncx_pad_putn_short_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3129
+ncx_pad_putn_short_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3129
 {
-	const size_t rndup = nelems % 2;
+#line 3129
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3129
 
+#line 3129
 	char *xp = (char *) *xpp;
+#line 3129
 	int status = NC_NOERR;
+#line 3129
 
+#line 3129
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3129
 	{
-		int lstatus = ncx_put_short_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3129
+		int lstatus = ncx_put_short_longlong(xp, tp, fillp);
+#line 3129
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3129
 			status = lstatus;
+#line 3129
 	}
+#line 3129
 
-	if(rndup != 0)
+#line 3129
+	if (rndup != 0)
+#line 3129
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3129
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3129
 		xp += X_SIZEOF_SHORT;
+#line 3129
 	}
+#line 3129
 
+#line 3129
 	*xpp = (void *)xp;
+#line 3129
 	return status;
+#line 3129
 }
+#line 3129
 
 int
-ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3130
+ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3130
 {
-	const size_t rndup = nelems % 2;
+#line 3130
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3130
 
+#line 3130
 	char *xp = (char *) *xpp;
+#line 3130
 	int status = NC_NOERR;
+#line 3130
 
+#line 3130
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3130
 	{
-		int lstatus = ncx_put_short_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3130
+		int lstatus = ncx_put_short_ulonglong(xp, tp, fillp);
+#line 3130
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3130
 			status = lstatus;
+#line 3130
 	}
+#line 3130
 
-	if(rndup != 0)
+#line 3130
+	if (rndup != 0)
+#line 3130
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3130
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3130
 		xp += X_SIZEOF_SHORT;
+#line 3130
 	}
+#line 3130
 
+#line 3130
 	*xpp = (void *)xp;
+#line 3130
 	return status;
+#line 3130
 }
+#line 3130
 
 int
-ncx_pad_putn_short_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3131
+ncx_pad_putn_short_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3131
 {
-	const size_t rndup = nelems % 2;
+#line 3131
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3131
 
+#line 3131
 	char *xp = (char *) *xpp;
+#line 3131
 	int status = NC_NOERR;
+#line 3131
 
+#line 3131
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++)
+#line 3131
 	{
-		int lstatus = ncx_put_short_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3131
+		int lstatus = ncx_put_short_ushort(xp, tp, fillp);
+#line 3131
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3131
 			status = lstatus;
+#line 3131
 	}
+#line 3131
 
-	if(rndup != 0)
+#line 3131
+	if (rndup != 0)
+#line 3131
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_SHORT);
+#line 3131
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_SHORT));
+#line 3131
 		xp += X_SIZEOF_SHORT;
+#line 3131
 	}
+#line 3131
 
+#line 3131
 	*xpp = (void *)xp;
+#line 3131
 	return status;
+#line 3131
 }
+#line 3131
 
 
 
@@ -7035,7 +15410,7 @@ int
 ncx_getn_ushort_ushort(const void **xpp, size_t nelems, unsigned short *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(unsigned short));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_USHORT);
 # else
 	swapn2b(tp, *xpp, nelems);
 # endif
@@ -7044,875 +15419,1907 @@ ncx_getn_ushort_ushort(const void **xpp, size_t nelems, unsigned short *tp)
 }
 #else
 int
+#line 3150
 ncx_getn_ushort_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3150
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3150
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3150
 
+#line 3150
  /* basic algorithm is:
+#line 3150
   *   - ensure sane alignment of input data
+#line 3150
   *   - copy (conversion happens automatically) input data
+#line 3150
   *     to output
+#line 3150
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3150
   *     at next location for converted output
+#line 3150
   */
+#line 3150
   long i, j, ni;
+#line 3150
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3150
   ushort *xp;
+#line 3150
   int nrange = 0;         /* number of range errors */
+#line 3150
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3150
   long cxp = (long) *((char**)xpp);
+#line 3150
 
+#line 3150
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3150
   /* sjl: manually stripmine so we can limit amount of
+#line 3150
    * vector work space reserved to LOOPCNT elements. Also
+#line 3150
    * makes vectorisation easy */
+#line 3150
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3150
     ni=Min(nelems-j,LOOPCNT);
+#line 3150
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3150
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3150
       xp = tmp;
+#line 3150
     } else {
+#line 3150
       xp = (ushort *) *xpp;
+#line 3150
     }
+#line 3150
    /* copy the next block */
+#line 3150
 #pragma cdir loopcnt=LOOPCNT
+#line 3150
 #pragma cdir shortloop
+#line 3150
     for (i=0; i<ni; i++) {
+#line 3150
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3150
      /* test for range errors (not always needed but do it anyway) */
+#line 3150
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3150
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3150
       nrange += xp[i] > USHORT_MAX ;
+#line 3150
     }
+#line 3150
    /* update xpp and tp */
+#line 3150
     if (realign) xp = (ushort *) *xpp;
+#line 3150
     xp += ni;
+#line 3150
     tp += ni;
+#line 3150
     *xpp = (void*)xp;
+#line 3150
   }
+#line 3150
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3150
 
+#line 3150
 #else   /* not SX */
+#line 3150
 	const char *xp = (const char *) *xpp;
+#line 3150
 	int status = NC_NOERR;
+#line 3150
 
+#line 3150
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3150
 	{
+#line 3150
 		const int lstatus = ncx_get_ushort_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3150
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3150
 			status = lstatus;
+#line 3150
 	}
+#line 3150
 
+#line 3150
 	*xpp = (const void *)xp;
+#line 3150
 	return status;
-#  endif
+#line 3150
+#endif
+#line 3150
 }
+#line 3150
 
 #endif
 int
+#line 3152
 ncx_getn_ushort_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3152
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3152
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3152
 
+#line 3152
  /* basic algorithm is:
+#line 3152
   *   - ensure sane alignment of input data
+#line 3152
   *   - copy (conversion happens automatically) input data
+#line 3152
   *     to output
+#line 3152
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3152
   *     at next location for converted output
+#line 3152
   */
+#line 3152
   long i, j, ni;
+#line 3152
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3152
   ushort *xp;
+#line 3152
   int nrange = 0;         /* number of range errors */
+#line 3152
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3152
   long cxp = (long) *((char**)xpp);
+#line 3152
 
+#line 3152
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3152
   /* sjl: manually stripmine so we can limit amount of
+#line 3152
    * vector work space reserved to LOOPCNT elements. Also
+#line 3152
    * makes vectorisation easy */
+#line 3152
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3152
     ni=Min(nelems-j,LOOPCNT);
+#line 3152
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3152
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3152
       xp = tmp;
+#line 3152
     } else {
+#line 3152
       xp = (ushort *) *xpp;
+#line 3152
     }
+#line 3152
    /* copy the next block */
+#line 3152
 #pragma cdir loopcnt=LOOPCNT
+#line 3152
 #pragma cdir shortloop
+#line 3152
     for (i=0; i<ni; i++) {
+#line 3152
       tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3152
      /* test for range errors (not always needed but do it anyway) */
+#line 3152
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3152
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3152
       nrange += xp[i] > SCHAR_MAX ;
+#line 3152
     }
+#line 3152
    /* update xpp and tp */
+#line 3152
     if (realign) xp = (ushort *) *xpp;
+#line 3152
     xp += ni;
+#line 3152
     tp += ni;
+#line 3152
     *xpp = (void*)xp;
+#line 3152
   }
+#line 3152
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3152
 
+#line 3152
 #else   /* not SX */
+#line 3152
 	const char *xp = (const char *) *xpp;
+#line 3152
 	int status = NC_NOERR;
+#line 3152
 
+#line 3152
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3152
 	{
+#line 3152
 		const int lstatus = ncx_get_ushort_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3152
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3152
 			status = lstatus;
+#line 3152
 	}
+#line 3152
 
+#line 3152
 	*xpp = (const void *)xp;
+#line 3152
 	return status;
-#  endif
+#line 3152
+#endif
+#line 3152
 }
+#line 3152
 
 int
+#line 3153
 ncx_getn_ushort_short(const void **xpp, size_t nelems, short *tp)
+#line 3153
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3153
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3153
 
+#line 3153
  /* basic algorithm is:
+#line 3153
   *   - ensure sane alignment of input data
+#line 3153
   *   - copy (conversion happens automatically) input data
+#line 3153
   *     to output
+#line 3153
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3153
   *     at next location for converted output
+#line 3153
   */
+#line 3153
   long i, j, ni;
+#line 3153
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3153
   ushort *xp;
+#line 3153
   int nrange = 0;         /* number of range errors */
+#line 3153
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3153
   long cxp = (long) *((char**)xpp);
+#line 3153
 
+#line 3153
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3153
   /* sjl: manually stripmine so we can limit amount of
+#line 3153
    * vector work space reserved to LOOPCNT elements. Also
+#line 3153
    * makes vectorisation easy */
+#line 3153
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3153
     ni=Min(nelems-j,LOOPCNT);
+#line 3153
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3153
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3153
       xp = tmp;
+#line 3153
     } else {
+#line 3153
       xp = (ushort *) *xpp;
+#line 3153
     }
+#line 3153
    /* copy the next block */
+#line 3153
 #pragma cdir loopcnt=LOOPCNT
+#line 3153
 #pragma cdir shortloop
+#line 3153
     for (i=0; i<ni; i++) {
+#line 3153
       tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3153
      /* test for range errors (not always needed but do it anyway) */
+#line 3153
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3153
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3153
       nrange += xp[i] > SHORT_MAX ;
+#line 3153
     }
+#line 3153
    /* update xpp and tp */
+#line 3153
     if (realign) xp = (ushort *) *xpp;
+#line 3153
     xp += ni;
+#line 3153
     tp += ni;
+#line 3153
     *xpp = (void*)xp;
+#line 3153
   }
+#line 3153
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3153
 
+#line 3153
 #else   /* not SX */
+#line 3153
 	const char *xp = (const char *) *xpp;
+#line 3153
 	int status = NC_NOERR;
+#line 3153
 
+#line 3153
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3153
 	{
+#line 3153
 		const int lstatus = ncx_get_ushort_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3153
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3153
 			status = lstatus;
+#line 3153
 	}
+#line 3153
 
+#line 3153
 	*xpp = (const void *)xp;
+#line 3153
 	return status;
-#  endif
+#line 3153
+#endif
+#line 3153
 }
+#line 3153
 
 int
+#line 3154
 ncx_getn_ushort_int(const void **xpp, size_t nelems, int *tp)
+#line 3154
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3154
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3154
 
+#line 3154
  /* basic algorithm is:
+#line 3154
   *   - ensure sane alignment of input data
+#line 3154
   *   - copy (conversion happens automatically) input data
+#line 3154
   *     to output
+#line 3154
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3154
   *     at next location for converted output
+#line 3154
   */
+#line 3154
   long i, j, ni;
+#line 3154
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3154
   ushort *xp;
+#line 3154
   int nrange = 0;         /* number of range errors */
+#line 3154
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3154
   long cxp = (long) *((char**)xpp);
+#line 3154
 
+#line 3154
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3154
   /* sjl: manually stripmine so we can limit amount of
+#line 3154
    * vector work space reserved to LOOPCNT elements. Also
+#line 3154
    * makes vectorisation easy */
+#line 3154
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3154
     ni=Min(nelems-j,LOOPCNT);
+#line 3154
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3154
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3154
       xp = tmp;
+#line 3154
     } else {
+#line 3154
       xp = (ushort *) *xpp;
+#line 3154
     }
+#line 3154
    /* copy the next block */
+#line 3154
 #pragma cdir loopcnt=LOOPCNT
+#line 3154
 #pragma cdir shortloop
+#line 3154
     for (i=0; i<ni; i++) {
+#line 3154
       tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3154
      /* test for range errors (not always needed but do it anyway) */
+#line 3154
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3154
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3154
       nrange += xp[i] > INT_MAX ;
+#line 3154
     }
+#line 3154
    /* update xpp and tp */
+#line 3154
     if (realign) xp = (ushort *) *xpp;
+#line 3154
     xp += ni;
+#line 3154
     tp += ni;
+#line 3154
     *xpp = (void*)xp;
+#line 3154
   }
+#line 3154
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3154
 
+#line 3154
 #else   /* not SX */
+#line 3154
 	const char *xp = (const char *) *xpp;
+#line 3154
 	int status = NC_NOERR;
+#line 3154
 
+#line 3154
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3154
 	{
+#line 3154
 		const int lstatus = ncx_get_ushort_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3154
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3154
+			status = lstatus;
+#line 3154
+	}
+#line 3154
+
+#line 3154
+	*xpp = (const void *)xp;
+#line 3154
+	return status;
+#line 3154
+#endif
+#line 3154
+}
+#line 3154
+
+int
+#line 3155
+ncx_getn_ushort_long(const void **xpp, size_t nelems, long *tp)
+#line 3155
+{
+#line 3155
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3155
+
+#line 3155
+ /* basic algorithm is:
+#line 3155
+  *   - ensure sane alignment of input data
+#line 3155
+  *   - copy (conversion happens automatically) input data
+#line 3155
+  *     to output
+#line 3155
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3155
+  *     at next location for converted output
+#line 3155
+  */
+#line 3155
+  long i, j, ni;
+#line 3155
+  ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3155
+  ushort *xp;
+#line 3155
+  int nrange = 0;         /* number of range errors */
+#line 3155
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3155
+  long cxp = (long) *((char**)xpp);
+#line 3155
+
+#line 3155
+  realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3155
+  /* sjl: manually stripmine so we can limit amount of
+#line 3155
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3155
+   * makes vectorisation easy */
+#line 3155
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3155
+    ni=Min(nelems-j,LOOPCNT);
+#line 3155
+    if (realign) {
+#line 3155
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3155
+      xp = tmp;
+#line 3155
+    } else {
+#line 3155
+      xp = (ushort *) *xpp;
+#line 3155
+    }
+#line 3155
+   /* copy the next block */
+#line 3155
+#pragma cdir loopcnt=LOOPCNT
+#line 3155
+#pragma cdir shortloop
+#line 3155
+    for (i=0; i<ni; i++) {
+#line 3155
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3155
+     /* test for range errors (not always needed but do it anyway) */
+#line 3155
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3155
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3155
+      nrange += xp[i] > LONG_MAX ;
+#line 3155
+    }
+#line 3155
+   /* update xpp and tp */
+#line 3155
+    if (realign) xp = (ushort *) *xpp;
+#line 3155
+    xp += ni;
+#line 3155
+    tp += ni;
+#line 3155
+    *xpp = (void*)xp;
+#line 3155
+  }
+#line 3155
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3155
+
+#line 3155
+#else   /* not SX */
+#line 3155
+	const char *xp = (const char *) *xpp;
+#line 3155
+	int status = NC_NOERR;
+#line 3155
+
+#line 3155
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3155
+	{
+#line 3155
+		const int lstatus = ncx_get_ushort_long(xp, tp);
+#line 3155
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3155
 			status = lstatus;
+#line 3155
 	}
+#line 3155
 
+#line 3155
 	*xpp = (const void *)xp;
+#line 3155
 	return status;
-#  endif
+#line 3155
+#endif
+#line 3155
 }
+#line 3155
 
 int
+#line 3156
 ncx_getn_ushort_float(const void **xpp, size_t nelems, float *tp)
+#line 3156
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3156
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3156
 
+#line 3156
  /* basic algorithm is:
+#line 3156
   *   - ensure sane alignment of input data
+#line 3156
   *   - copy (conversion happens automatically) input data
+#line 3156
   *     to output
+#line 3156
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3156
   *     at next location for converted output
+#line 3156
   */
+#line 3156
   long i, j, ni;
+#line 3156
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3156
   ushort *xp;
+#line 3156
   int nrange = 0;         /* number of range errors */
+#line 3156
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3156
   long cxp = (long) *((char**)xpp);
+#line 3156
 
+#line 3156
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3156
   /* sjl: manually stripmine so we can limit amount of
+#line 3156
    * vector work space reserved to LOOPCNT elements. Also
+#line 3156
    * makes vectorisation easy */
+#line 3156
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3156
     ni=Min(nelems-j,LOOPCNT);
+#line 3156
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3156
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3156
       xp = tmp;
+#line 3156
     } else {
+#line 3156
       xp = (ushort *) *xpp;
+#line 3156
     }
+#line 3156
    /* copy the next block */
+#line 3156
 #pragma cdir loopcnt=LOOPCNT
+#line 3156
 #pragma cdir shortloop
+#line 3156
     for (i=0; i<ni; i++) {
+#line 3156
       tp[i] = (float) Max( FLOAT_MIN, Min(FLOAT_MAX, (float) xp[i]));
+#line 3156
      /* test for range errors (not always needed but do it anyway) */
+#line 3156
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3156
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3156
       nrange += xp[i] > FLOAT_MAX ;
+#line 3156
     }
+#line 3156
    /* update xpp and tp */
+#line 3156
     if (realign) xp = (ushort *) *xpp;
+#line 3156
     xp += ni;
+#line 3156
     tp += ni;
+#line 3156
     *xpp = (void*)xp;
+#line 3156
   }
+#line 3156
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3156
 
+#line 3156
 #else   /* not SX */
+#line 3156
 	const char *xp = (const char *) *xpp;
+#line 3156
 	int status = NC_NOERR;
+#line 3156
 
+#line 3156
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3156
 	{
+#line 3156
 		const int lstatus = ncx_get_ushort_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3156
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3156
 			status = lstatus;
+#line 3156
 	}
+#line 3156
 
+#line 3156
 	*xpp = (const void *)xp;
+#line 3156
 	return status;
-#  endif
+#line 3156
+#endif
+#line 3156
 }
+#line 3156
 
 int
+#line 3157
 ncx_getn_ushort_double(const void **xpp, size_t nelems, double *tp)
+#line 3157
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3157
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3157
 
+#line 3157
  /* basic algorithm is:
+#line 3157
   *   - ensure sane alignment of input data
+#line 3157
   *   - copy (conversion happens automatically) input data
+#line 3157
   *     to output
+#line 3157
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3157
   *     at next location for converted output
+#line 3157
   */
+#line 3157
   long i, j, ni;
+#line 3157
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3157
   ushort *xp;
+#line 3157
   int nrange = 0;         /* number of range errors */
+#line 3157
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3157
   long cxp = (long) *((char**)xpp);
+#line 3157
 
+#line 3157
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3157
   /* sjl: manually stripmine so we can limit amount of
+#line 3157
    * vector work space reserved to LOOPCNT elements. Also
+#line 3157
    * makes vectorisation easy */
+#line 3157
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3157
     ni=Min(nelems-j,LOOPCNT);
+#line 3157
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3157
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3157
       xp = tmp;
+#line 3157
     } else {
+#line 3157
       xp = (ushort *) *xpp;
+#line 3157
     }
+#line 3157
    /* copy the next block */
+#line 3157
 #pragma cdir loopcnt=LOOPCNT
+#line 3157
 #pragma cdir shortloop
+#line 3157
     for (i=0; i<ni; i++) {
+#line 3157
       tp[i] = (double) Max( DOUBLE_MIN, Min(DOUBLE_MAX, (double) xp[i]));
+#line 3157
      /* test for range errors (not always needed but do it anyway) */
+#line 3157
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3157
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3157
       nrange += xp[i] > DOUBLE_MAX ;
+#line 3157
     }
+#line 3157
    /* update xpp and tp */
+#line 3157
     if (realign) xp = (ushort *) *xpp;
+#line 3157
     xp += ni;
+#line 3157
     tp += ni;
+#line 3157
     *xpp = (void*)xp;
+#line 3157
   }
+#line 3157
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3157
 
+#line 3157
 #else   /* not SX */
+#line 3157
 	const char *xp = (const char *) *xpp;
+#line 3157
 	int status = NC_NOERR;
+#line 3157
 
+#line 3157
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3157
 	{
+#line 3157
 		const int lstatus = ncx_get_ushort_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3157
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3157
 			status = lstatus;
+#line 3157
 	}
+#line 3157
 
+#line 3157
 	*xpp = (const void *)xp;
+#line 3157
 	return status;
-#  endif
+#line 3157
+#endif
+#line 3157
 }
+#line 3157
 
 int
+#line 3158
 ncx_getn_ushort_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3158
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3158
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3158
 
+#line 3158
  /* basic algorithm is:
+#line 3158
   *   - ensure sane alignment of input data
+#line 3158
   *   - copy (conversion happens automatically) input data
+#line 3158
   *     to output
+#line 3158
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3158
   *     at next location for converted output
+#line 3158
   */
+#line 3158
   long i, j, ni;
+#line 3158
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3158
   ushort *xp;
+#line 3158
   int nrange = 0;         /* number of range errors */
+#line 3158
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3158
   long cxp = (long) *((char**)xpp);
+#line 3158
 
+#line 3158
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3158
   /* sjl: manually stripmine so we can limit amount of
+#line 3158
    * vector work space reserved to LOOPCNT elements. Also
+#line 3158
    * makes vectorisation easy */
+#line 3158
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3158
     ni=Min(nelems-j,LOOPCNT);
+#line 3158
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3158
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3158
       xp = tmp;
+#line 3158
     } else {
+#line 3158
       xp = (ushort *) *xpp;
+#line 3158
     }
+#line 3158
    /* copy the next block */
+#line 3158
 #pragma cdir loopcnt=LOOPCNT
+#line 3158
 #pragma cdir shortloop
+#line 3158
     for (i=0; i<ni; i++) {
+#line 3158
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3158
      /* test for range errors (not always needed but do it anyway) */
+#line 3158
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3158
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3158
       nrange += xp[i] > LONGLONG_MAX ;
+#line 3158
     }
+#line 3158
    /* update xpp and tp */
+#line 3158
     if (realign) xp = (ushort *) *xpp;
+#line 3158
     xp += ni;
+#line 3158
     tp += ni;
+#line 3158
     *xpp = (void*)xp;
+#line 3158
   }
+#line 3158
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3158
 
+#line 3158
 #else   /* not SX */
+#line 3158
 	const char *xp = (const char *) *xpp;
+#line 3158
 	int status = NC_NOERR;
+#line 3158
 
+#line 3158
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3158
 	{
+#line 3158
 		const int lstatus = ncx_get_ushort_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3158
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3158
 			status = lstatus;
+#line 3158
 	}
+#line 3158
 
+#line 3158
 	*xpp = (const void *)xp;
+#line 3158
 	return status;
-#  endif
+#line 3158
+#endif
+#line 3158
 }
+#line 3158
 
 int
+#line 3159
 ncx_getn_ushort_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3159
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3159
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3159
 
+#line 3159
  /* basic algorithm is:
+#line 3159
   *   - ensure sane alignment of input data
+#line 3159
   *   - copy (conversion happens automatically) input data
+#line 3159
   *     to output
+#line 3159
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3159
   *     at next location for converted output
+#line 3159
   */
+#line 3159
   long i, j, ni;
+#line 3159
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3159
   ushort *xp;
+#line 3159
   int nrange = 0;         /* number of range errors */
+#line 3159
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3159
   long cxp = (long) *((char**)xpp);
+#line 3159
 
+#line 3159
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3159
   /* sjl: manually stripmine so we can limit amount of
+#line 3159
    * vector work space reserved to LOOPCNT elements. Also
+#line 3159
    * makes vectorisation easy */
+#line 3159
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3159
     ni=Min(nelems-j,LOOPCNT);
+#line 3159
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3159
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3159
       xp = tmp;
+#line 3159
     } else {
+#line 3159
       xp = (ushort *) *xpp;
+#line 3159
     }
+#line 3159
    /* copy the next block */
+#line 3159
 #pragma cdir loopcnt=LOOPCNT
+#line 3159
 #pragma cdir shortloop
+#line 3159
     for (i=0; i<ni; i++) {
+#line 3159
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3159
      /* test for range errors (not always needed but do it anyway) */
+#line 3159
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3159
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3159
       nrange += xp[i] > UCHAR_MAX ;
+#line 3159
     }
+#line 3159
    /* update xpp and tp */
+#line 3159
     if (realign) xp = (ushort *) *xpp;
+#line 3159
     xp += ni;
+#line 3159
     tp += ni;
+#line 3159
     *xpp = (void*)xp;
+#line 3159
   }
+#line 3159
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3159
 
+#line 3159
 #else   /* not SX */
+#line 3159
 	const char *xp = (const char *) *xpp;
+#line 3159
 	int status = NC_NOERR;
+#line 3159
 
+#line 3159
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3159
 	{
+#line 3159
 		const int lstatus = ncx_get_ushort_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3159
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3159
 			status = lstatus;
+#line 3159
 	}
+#line 3159
 
+#line 3159
 	*xpp = (const void *)xp;
+#line 3159
 	return status;
-#  endif
+#line 3159
+#endif
+#line 3159
 }
+#line 3159
 
 int
+#line 3160
 ncx_getn_ushort_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3160
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3160
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3160
 
+#line 3160
  /* basic algorithm is:
+#line 3160
   *   - ensure sane alignment of input data
+#line 3160
   *   - copy (conversion happens automatically) input data
+#line 3160
   *     to output
+#line 3160
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3160
   *     at next location for converted output
+#line 3160
   */
+#line 3160
   long i, j, ni;
+#line 3160
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3160
   ushort *xp;
+#line 3160
   int nrange = 0;         /* number of range errors */
+#line 3160
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3160
   long cxp = (long) *((char**)xpp);
+#line 3160
 
+#line 3160
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3160
   /* sjl: manually stripmine so we can limit amount of
+#line 3160
    * vector work space reserved to LOOPCNT elements. Also
+#line 3160
    * makes vectorisation easy */
+#line 3160
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3160
     ni=Min(nelems-j,LOOPCNT);
+#line 3160
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3160
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3160
       xp = tmp;
+#line 3160
     } else {
+#line 3160
       xp = (ushort *) *xpp;
+#line 3160
     }
+#line 3160
    /* copy the next block */
+#line 3160
 #pragma cdir loopcnt=LOOPCNT
+#line 3160
 #pragma cdir shortloop
+#line 3160
     for (i=0; i<ni; i++) {
+#line 3160
       tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3160
      /* test for range errors (not always needed but do it anyway) */
+#line 3160
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3160
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3160
       nrange += xp[i] > UINT_MAX ;
+#line 3160
     }
+#line 3160
    /* update xpp and tp */
+#line 3160
     if (realign) xp = (ushort *) *xpp;
+#line 3160
     xp += ni;
+#line 3160
     tp += ni;
+#line 3160
     *xpp = (void*)xp;
+#line 3160
   }
+#line 3160
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3160
 
+#line 3160
 #else   /* not SX */
+#line 3160
 	const char *xp = (const char *) *xpp;
+#line 3160
 	int status = NC_NOERR;
+#line 3160
 
+#line 3160
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3160
 	{
+#line 3160
 		const int lstatus = ncx_get_ushort_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3160
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3160
 			status = lstatus;
+#line 3160
 	}
+#line 3160
 
+#line 3160
 	*xpp = (const void *)xp;
+#line 3160
 	return status;
-#  endif
+#line 3160
+#endif
+#line 3160
 }
+#line 3160
 
 int
+#line 3161
 ncx_getn_ushort_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3161
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3161
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3161
 
+#line 3161
  /* basic algorithm is:
+#line 3161
   *   - ensure sane alignment of input data
+#line 3161
   *   - copy (conversion happens automatically) input data
+#line 3161
   *     to output
+#line 3161
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3161
   *     at next location for converted output
+#line 3161
   */
+#line 3161
   long i, j, ni;
+#line 3161
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3161
   ushort *xp;
+#line 3161
   int nrange = 0;         /* number of range errors */
+#line 3161
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3161
   long cxp = (long) *((char**)xpp);
+#line 3161
 
+#line 3161
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3161
   /* sjl: manually stripmine so we can limit amount of
+#line 3161
    * vector work space reserved to LOOPCNT elements. Also
+#line 3161
    * makes vectorisation easy */
+#line 3161
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3161
     ni=Min(nelems-j,LOOPCNT);
+#line 3161
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_USHORT);
+#line 3161
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_USHORT));
+#line 3161
       xp = tmp;
+#line 3161
     } else {
+#line 3161
       xp = (ushort *) *xpp;
+#line 3161
     }
+#line 3161
    /* copy the next block */
+#line 3161
 #pragma cdir loopcnt=LOOPCNT
+#line 3161
 #pragma cdir shortloop
+#line 3161
     for (i=0; i<ni; i++) {
+#line 3161
       tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3161
      /* test for range errors (not always needed but do it anyway) */
+#line 3161
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3161
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3161
       nrange += xp[i] > ULONGLONG_MAX ;
+#line 3161
     }
+#line 3161
    /* update xpp and tp */
+#line 3161
     if (realign) xp = (ushort *) *xpp;
+#line 3161
     xp += ni;
+#line 3161
     tp += ni;
+#line 3161
     *xpp = (void*)xp;
+#line 3161
   }
+#line 3161
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3161
 
+#line 3161
 #else   /* not SX */
+#line 3161
 	const char *xp = (const char *) *xpp;
+#line 3161
 	int status = NC_NOERR;
+#line 3161
 
+#line 3161
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3161
 	{
+#line 3161
 		const int lstatus = ncx_get_ushort_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3161
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3161
+			status = lstatus;
+#line 3161
+	}
+#line 3161
+
+#line 3161
+	*xpp = (const void *)xp;
+#line 3161
+	return status;
+#line 3161
+#endif
+#line 3161
+}
+#line 3161
+
+
+int
+#line 3163
+ncx_pad_getn_ushort_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3163
+{
+#line 3163
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3163
+
+#line 3163
+	const char *xp = (const char *) *xpp;
+#line 3163
+	int status = NC_NOERR;
+#line 3163
+
+#line 3163
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3163
+	{
+#line 3163
+		const int lstatus = ncx_get_ushort_schar(xp, tp);
+#line 3163
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3163
 			status = lstatus;
+#line 3163
 	}
+#line 3163
+
+#line 3163
+	if (rndup != 0)
+#line 3163
+		xp += X_SIZEOF_USHORT;
+#line 3163
 
-	*xpp = (const void *)xp;
+#line 3163
+	*xpp = (void *)xp;
+#line 3163
 	return status;
-#  endif
+#line 3163
 }
-
+#line 3163
 
 int
-ncx_pad_getn_ushort_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3164
+ncx_pad_getn_ushort_short(const void **xpp, size_t nelems, short *tp)
+#line 3164
 {
-	const size_t rndup = nelems % 2;
+#line 3164
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3164
 
+#line 3164
 	const char *xp = (const char *) *xpp;
+#line 3164
 	int status = NC_NOERR;
+#line 3164
 
+#line 3164
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3164
 	{
-		const int lstatus = ncx_get_ushort_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3164
+		const int lstatus = ncx_get_ushort_short(xp, tp);
+#line 3164
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3164
 			status = lstatus;
+#line 3164
 	}
+#line 3164
 
-	if(rndup != 0)
+#line 3164
+	if (rndup != 0)
+#line 3164
 		xp += X_SIZEOF_USHORT;
+#line 3164
+
+#line 3164
 	*xpp = (void *)xp;
+#line 3164
 	return status;
+#line 3164
 }
+#line 3164
 
 int
-ncx_pad_getn_ushort_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3165
+ncx_pad_getn_ushort_int(const void **xpp, size_t nelems, int *tp)
+#line 3165
 {
-	const size_t rndup = nelems % 2;
+#line 3165
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3165
 
+#line 3165
 	const char *xp = (const char *) *xpp;
+#line 3165
 	int status = NC_NOERR;
+#line 3165
 
+#line 3165
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3165
 	{
-		const int lstatus = ncx_get_ushort_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3165
+		const int lstatus = ncx_get_ushort_int(xp, tp);
+#line 3165
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3165
 			status = lstatus;
+#line 3165
 	}
+#line 3165
 
-	if(rndup != 0)
+#line 3165
+	if (rndup != 0)
+#line 3165
 		xp += X_SIZEOF_USHORT;
+#line 3165
+
+#line 3165
 	*xpp = (void *)xp;
+#line 3165
 	return status;
+#line 3165
 }
+#line 3165
 
 int
-ncx_pad_getn_ushort_short(const void **xpp, size_t nelems, short *tp)
+#line 3166
+ncx_pad_getn_ushort_long(const void **xpp, size_t nelems, long *tp)
+#line 3166
 {
-	const size_t rndup = nelems % 2;
+#line 3166
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3166
 
+#line 3166
 	const char *xp = (const char *) *xpp;
+#line 3166
 	int status = NC_NOERR;
+#line 3166
 
+#line 3166
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3166
 	{
-		const int lstatus = ncx_get_ushort_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3166
+		const int lstatus = ncx_get_ushort_long(xp, tp);
+#line 3166
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3166
 			status = lstatus;
+#line 3166
 	}
+#line 3166
 
-	if(rndup != 0)
+#line 3166
+	if (rndup != 0)
+#line 3166
 		xp += X_SIZEOF_USHORT;
+#line 3166
+
+#line 3166
 	*xpp = (void *)xp;
+#line 3166
 	return status;
+#line 3166
 }
+#line 3166
 
 int
-ncx_pad_getn_ushort_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3167
+ncx_pad_getn_ushort_float(const void **xpp, size_t nelems, float *tp)
+#line 3167
 {
-	const size_t rndup = nelems % 2;
+#line 3167
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3167
 
+#line 3167
 	const char *xp = (const char *) *xpp;
+#line 3167
 	int status = NC_NOERR;
+#line 3167
 
+#line 3167
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3167
 	{
-		const int lstatus = ncx_get_ushort_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3167
+		const int lstatus = ncx_get_ushort_float(xp, tp);
+#line 3167
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3167
 			status = lstatus;
+#line 3167
 	}
+#line 3167
 
-	if(rndup != 0)
+#line 3167
+	if (rndup != 0)
+#line 3167
 		xp += X_SIZEOF_USHORT;
+#line 3167
+
+#line 3167
 	*xpp = (void *)xp;
+#line 3167
 	return status;
+#line 3167
 }
+#line 3167
 
 int
-ncx_pad_getn_ushort_int(const void **xpp, size_t nelems, int *tp)
+#line 3168
+ncx_pad_getn_ushort_double(const void **xpp, size_t nelems, double *tp)
+#line 3168
 {
-	const size_t rndup = nelems % 2;
+#line 3168
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3168
 
+#line 3168
 	const char *xp = (const char *) *xpp;
+#line 3168
 	int status = NC_NOERR;
+#line 3168
 
+#line 3168
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3168
 	{
-		const int lstatus = ncx_get_ushort_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3168
+		const int lstatus = ncx_get_ushort_double(xp, tp);
+#line 3168
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3168
 			status = lstatus;
+#line 3168
 	}
+#line 3168
 
-	if(rndup != 0)
+#line 3168
+	if (rndup != 0)
+#line 3168
 		xp += X_SIZEOF_USHORT;
+#line 3168
+
+#line 3168
 	*xpp = (void *)xp;
+#line 3168
 	return status;
+#line 3168
 }
+#line 3168
 
 int
-ncx_pad_getn_ushort_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3169
+ncx_pad_getn_ushort_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3169
 {
-	const size_t rndup = nelems % 2;
+#line 3169
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3169
 
+#line 3169
 	const char *xp = (const char *) *xpp;
+#line 3169
 	int status = NC_NOERR;
+#line 3169
 
+#line 3169
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3169
 	{
-		const int lstatus = ncx_get_ushort_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3169
+		const int lstatus = ncx_get_ushort_uchar(xp, tp);
+#line 3169
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3169
 			status = lstatus;
+#line 3169
 	}
+#line 3169
 
-	if(rndup != 0)
+#line 3169
+	if (rndup != 0)
+#line 3169
 		xp += X_SIZEOF_USHORT;
+#line 3169
+
+#line 3169
 	*xpp = (void *)xp;
+#line 3169
 	return status;
+#line 3169
 }
+#line 3169
 
 int
-ncx_pad_getn_ushort_float(const void **xpp, size_t nelems, float *tp)
+#line 3170
+ncx_pad_getn_ushort_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3170
 {
-	const size_t rndup = nelems % 2;
+#line 3170
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3170
 
+#line 3170
 	const char *xp = (const char *) *xpp;
+#line 3170
 	int status = NC_NOERR;
+#line 3170
 
+#line 3170
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3170
 	{
-		const int lstatus = ncx_get_ushort_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3170
+		const int lstatus = ncx_get_ushort_ushort(xp, tp);
+#line 3170
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3170
 			status = lstatus;
+#line 3170
 	}
+#line 3170
 
-	if(rndup != 0)
+#line 3170
+	if (rndup != 0)
+#line 3170
 		xp += X_SIZEOF_USHORT;
+#line 3170
+
+#line 3170
 	*xpp = (void *)xp;
+#line 3170
 	return status;
+#line 3170
 }
+#line 3170
 
 int
-ncx_pad_getn_ushort_double(const void **xpp, size_t nelems, double *tp)
+#line 3171
+ncx_pad_getn_ushort_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3171
 {
-	const size_t rndup = nelems % 2;
+#line 3171
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3171
 
+#line 3171
 	const char *xp = (const char *) *xpp;
+#line 3171
 	int status = NC_NOERR;
+#line 3171
 
+#line 3171
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3171
 	{
-		const int lstatus = ncx_get_ushort_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3171
+		const int lstatus = ncx_get_ushort_uint(xp, tp);
+#line 3171
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3171
 			status = lstatus;
+#line 3171
 	}
+#line 3171
 
-	if(rndup != 0)
+#line 3171
+	if (rndup != 0)
+#line 3171
 		xp += X_SIZEOF_USHORT;
+#line 3171
+
+#line 3171
 	*xpp = (void *)xp;
+#line 3171
 	return status;
+#line 3171
 }
+#line 3171
 
 int
+#line 3172
 ncx_pad_getn_ushort_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3172
 {
-	const size_t rndup = nelems % 2;
+#line 3172
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3172
 
+#line 3172
 	const char *xp = (const char *) *xpp;
+#line 3172
 	int status = NC_NOERR;
+#line 3172
 
+#line 3172
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3172
 	{
+#line 3172
 		const int lstatus = ncx_get_ushort_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3172
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3172
 			status = lstatus;
+#line 3172
 	}
+#line 3172
 
-	if(rndup != 0)
+#line 3172
+	if (rndup != 0)
+#line 3172
 		xp += X_SIZEOF_USHORT;
+#line 3172
+
+#line 3172
 	*xpp = (void *)xp;
+#line 3172
 	return status;
+#line 3172
 }
+#line 3172
 
 int
+#line 3173
 ncx_pad_getn_ushort_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3173
 {
-	const size_t rndup = nelems % 2;
+#line 3173
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3173
 
+#line 3173
 	const char *xp = (const char *) *xpp;
+#line 3173
 	int status = NC_NOERR;
+#line 3173
 
+#line 3173
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3173
 	{
+#line 3173
 		const int lstatus = ncx_get_ushort_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3173
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3173
 			status = lstatus;
+#line 3173
 	}
+#line 3173
 
-	if(rndup != 0)
+#line 3173
+	if (rndup != 0)
+#line 3173
 		xp += X_SIZEOF_USHORT;
+#line 3173
+
+#line 3173
 	*xpp = (void *)xp;
+#line 3173
 	return status;
+#line 3173
 }
+#line 3173
 
 
 #if X_SIZEOF_USHORT == SIZEOF_USHORT
 /* optimized version */
 int
-ncx_putn_ushort_ushort(void **xpp, size_t nelems, const unsigned short *tp)
+ncx_putn_ushort_ushort(void **xpp, size_t nelems, const unsigned short *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_USHORT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_USHORT);
 # else
 	swapn2b(*xpp, tp, nelems);
 # endif
@@ -7921,956 +17328,2074 @@ ncx_putn_ushort_ushort(void **xpp, size_t nelems, const unsigned short *tp)
 }
 #else
 int
-ncx_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3189
+ncx_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3189
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3189
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3189
 
+#line 3189
  /* basic algorithm is:
+#line 3189
   *   - ensure sane alignment of output data
+#line 3189
   *   - copy (conversion happens automatically) input data
+#line 3189
   *     to output
+#line 3189
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3189
   *     at next location for converted output
+#line 3189
   */
+#line 3189
   long i, j, ni;
+#line 3189
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3189
   ushort *xp;
+#line 3189
   int nrange = 0;         /* number of range errors */
+#line 3189
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3189
   long cxp = (long) *((char**)xpp);
+#line 3189
 
+#line 3189
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3189
   /* sjl: manually stripmine so we can limit amount of
+#line 3189
    * vector work space reserved to LOOPCNT elements. Also
+#line 3189
    * makes vectorisation easy */
+#line 3189
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3189
     ni=Min(nelems-j,LOOPCNT);
+#line 3189
     if (realign) {
+#line 3189
       xp = tmp;
+#line 3189
     } else {
+#line 3189
       xp = (ushort *) *xpp;
+#line 3189
     }
+#line 3189
    /* copy the next block */
+#line 3189
 #pragma cdir loopcnt=LOOPCNT
+#line 3189
 #pragma cdir shortloop
+#line 3189
     for (i=0; i<ni; i++) {
+#line 3189
       /* the normal case: */
+#line 3189
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3189
      /* test for range errors (not always needed but do it anyway) */
+#line 3189
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3189
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3189
       nrange += tp[i] > X_USHORT_MAX ;
+#line 3189
     }
+#line 3189
    /* copy workspace back if necessary */
+#line 3189
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3189
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3189
       xp = (ushort *) *xpp;
+#line 3189
     }
+#line 3189
    /* update xpp and tp */
+#line 3189
     xp += ni;
+#line 3189
     tp += ni;
+#line 3189
     *xpp = (void*)xp;
+#line 3189
   }
+#line 3189
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3189
 
+#line 3189
 #else   /* not SX */
+#line 3189
 
+#line 3189
 	char *xp = (char *) *xpp;
+#line 3189
 	int status = NC_NOERR;
+#line 3189
 
+#line 3189
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3189
 	{
-		int lstatus = ncx_put_ushort_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3189
+		int lstatus = ncx_put_ushort_ushort(xp, tp, fillp);
+#line 3189
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3189
 			status = lstatus;
+#line 3189
 	}
+#line 3189
 
+#line 3189
 	*xpp = (void *)xp;
+#line 3189
 	return status;
+#line 3189
 #endif
+#line 3189
 }
+#line 3189
+
+#endif
+int
+#line 3191
+ncx_putn_ushort_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3191
+{
+#line 3191
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3191
+
+#line 3191
+ /* basic algorithm is:
+#line 3191
+  *   - ensure sane alignment of output data
+#line 3191
+  *   - copy (conversion happens automatically) input data
+#line 3191
+  *     to output
+#line 3191
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3191
+  *     at next location for converted output
+#line 3191
+  */
+#line 3191
+  long i, j, ni;
+#line 3191
+  ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3191
+  ushort *xp;
+#line 3191
+  int nrange = 0;         /* number of range errors */
+#line 3191
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3191
+  long cxp = (long) *((char**)xpp);
+#line 3191
+
+#line 3191
+  realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3191
+  /* sjl: manually stripmine so we can limit amount of
+#line 3191
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3191
+   * makes vectorisation easy */
+#line 3191
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3191
+    ni=Min(nelems-j,LOOPCNT);
+#line 3191
+    if (realign) {
+#line 3191
+      xp = tmp;
+#line 3191
+    } else {
+#line 3191
+      xp = (ushort *) *xpp;
+#line 3191
+    }
+#line 3191
+   /* copy the next block */
+#line 3191
+#pragma cdir loopcnt=LOOPCNT
+#line 3191
+#pragma cdir shortloop
+#line 3191
+    for (i=0; i<ni; i++) {
+#line 3191
+      /* the normal case: */
+#line 3191
+      xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3191
+     /* test for range errors (not always needed but do it anyway) */
+#line 3191
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3191
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3191
+      nrange += tp[i] > X_USHORT_MAX || tp[i] < 0;
+#line 3191
+    }
+#line 3191
+   /* copy workspace back if necessary */
+#line 3191
+    if (realign) {
+#line 3191
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3191
+      xp = (ushort *) *xpp;
+#line 3191
+    }
+#line 3191
+   /* update xpp and tp */
+#line 3191
+    xp += ni;
+#line 3191
+    tp += ni;
+#line 3191
+    *xpp = (void*)xp;
+#line 3191
+  }
+#line 3191
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3191
+
+#line 3191
+#else   /* not SX */
+#line 3191
+
+#line 3191
+	char *xp = (char *) *xpp;
+#line 3191
+	int status = NC_NOERR;
+#line 3191
+
+#line 3191
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3191
+	{
+#line 3191
+		int lstatus = ncx_put_ushort_schar(xp, tp, fillp);
+#line 3191
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3191
+			status = lstatus;
+#line 3191
+	}
+#line 3191
 
+#line 3191
+	*xpp = (void *)xp;
+#line 3191
+	return status;
+#line 3191
 #endif
+#line 3191
+}
+#line 3191
+
 int
-ncx_putn_ushort_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3192
+ncx_putn_ushort_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3192
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3192
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3192
 
+#line 3192
  /* basic algorithm is:
+#line 3192
   *   - ensure sane alignment of output data
+#line 3192
   *   - copy (conversion happens automatically) input data
+#line 3192
   *     to output
+#line 3192
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3192
   *     at next location for converted output
+#line 3192
   */
+#line 3192
   long i, j, ni;
+#line 3192
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3192
   ushort *xp;
+#line 3192
   int nrange = 0;         /* number of range errors */
+#line 3192
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3192
   long cxp = (long) *((char**)xpp);
+#line 3192
 
+#line 3192
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3192
   /* sjl: manually stripmine so we can limit amount of
+#line 3192
    * vector work space reserved to LOOPCNT elements. Also
+#line 3192
    * makes vectorisation easy */
+#line 3192
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3192
     ni=Min(nelems-j,LOOPCNT);
+#line 3192
     if (realign) {
+#line 3192
       xp = tmp;
+#line 3192
     } else {
+#line 3192
       xp = (ushort *) *xpp;
+#line 3192
     }
+#line 3192
    /* copy the next block */
+#line 3192
 #pragma cdir loopcnt=LOOPCNT
+#line 3192
 #pragma cdir shortloop
+#line 3192
     for (i=0; i<ni; i++) {
+#line 3192
       /* the normal case: */
+#line 3192
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3192
      /* test for range errors (not always needed but do it anyway) */
+#line 3192
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3192
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3192
       nrange += tp[i] > X_USHORT_MAX || tp[i] < 0;
+#line 3192
     }
+#line 3192
    /* copy workspace back if necessary */
+#line 3192
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3192
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3192
       xp = (ushort *) *xpp;
+#line 3192
     }
+#line 3192
    /* update xpp and tp */
+#line 3192
     xp += ni;
+#line 3192
     tp += ni;
+#line 3192
     *xpp = (void*)xp;
+#line 3192
   }
+#line 3192
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3192
 
+#line 3192
 #else   /* not SX */
+#line 3192
 
+#line 3192
 	char *xp = (char *) *xpp;
+#line 3192
 	int status = NC_NOERR;
+#line 3192
 
+#line 3192
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3192
 	{
-		int lstatus = ncx_put_ushort_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3192
+		int lstatus = ncx_put_ushort_short(xp, tp, fillp);
+#line 3192
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3192
 			status = lstatus;
+#line 3192
 	}
+#line 3192
 
+#line 3192
 	*xpp = (void *)xp;
+#line 3192
 	return status;
+#line 3192
 #endif
+#line 3192
 }
+#line 3192
 
 int
-ncx_putn_ushort_short(void **xpp, size_t nelems, const short *tp)
+#line 3193
+ncx_putn_ushort_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3193
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3193
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3193
 
+#line 3193
  /* basic algorithm is:
+#line 3193
   *   - ensure sane alignment of output data
+#line 3193
   *   - copy (conversion happens automatically) input data
+#line 3193
   *     to output
+#line 3193
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3193
   *     at next location for converted output
+#line 3193
   */
+#line 3193
   long i, j, ni;
+#line 3193
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3193
   ushort *xp;
+#line 3193
   int nrange = 0;         /* number of range errors */
+#line 3193
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3193
   long cxp = (long) *((char**)xpp);
+#line 3193
 
+#line 3193
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3193
   /* sjl: manually stripmine so we can limit amount of
+#line 3193
    * vector work space reserved to LOOPCNT elements. Also
+#line 3193
    * makes vectorisation easy */
+#line 3193
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3193
     ni=Min(nelems-j,LOOPCNT);
+#line 3193
     if (realign) {
+#line 3193
       xp = tmp;
+#line 3193
     } else {
+#line 3193
       xp = (ushort *) *xpp;
+#line 3193
     }
+#line 3193
    /* copy the next block */
+#line 3193
 #pragma cdir loopcnt=LOOPCNT
+#line 3193
 #pragma cdir shortloop
+#line 3193
     for (i=0; i<ni; i++) {
+#line 3193
       /* the normal case: */
+#line 3193
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3193
      /* test for range errors (not always needed but do it anyway) */
+#line 3193
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3193
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3193
       nrange += tp[i] > X_USHORT_MAX || tp[i] < 0;
+#line 3193
     }
+#line 3193
    /* copy workspace back if necessary */
+#line 3193
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3193
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3193
       xp = (ushort *) *xpp;
+#line 3193
     }
+#line 3193
    /* update xpp and tp */
+#line 3193
     xp += ni;
+#line 3193
     tp += ni;
+#line 3193
     *xpp = (void*)xp;
+#line 3193
   }
+#line 3193
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3193
 
+#line 3193
 #else   /* not SX */
+#line 3193
 
+#line 3193
 	char *xp = (char *) *xpp;
+#line 3193
 	int status = NC_NOERR;
+#line 3193
 
+#line 3193
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3193
 	{
-		int lstatus = ncx_put_ushort_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3193
+		int lstatus = ncx_put_ushort_int(xp, tp, fillp);
+#line 3193
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3193
 			status = lstatus;
+#line 3193
 	}
+#line 3193
 
+#line 3193
 	*xpp = (void *)xp;
+#line 3193
 	return status;
+#line 3193
 #endif
+#line 3193
 }
+#line 3193
 
 int
-ncx_putn_ushort_int(void **xpp, size_t nelems, const int *tp)
+#line 3194
+ncx_putn_ushort_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3194
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3194
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3194
 
+#line 3194
  /* basic algorithm is:
+#line 3194
   *   - ensure sane alignment of output data
+#line 3194
   *   - copy (conversion happens automatically) input data
+#line 3194
   *     to output
+#line 3194
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3194
   *     at next location for converted output
+#line 3194
   */
+#line 3194
   long i, j, ni;
+#line 3194
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3194
   ushort *xp;
+#line 3194
   int nrange = 0;         /* number of range errors */
+#line 3194
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3194
   long cxp = (long) *((char**)xpp);
+#line 3194
 
+#line 3194
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3194
   /* sjl: manually stripmine so we can limit amount of
+#line 3194
    * vector work space reserved to LOOPCNT elements. Also
+#line 3194
    * makes vectorisation easy */
+#line 3194
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3194
     ni=Min(nelems-j,LOOPCNT);
+#line 3194
     if (realign) {
+#line 3194
       xp = tmp;
+#line 3194
     } else {
+#line 3194
       xp = (ushort *) *xpp;
+#line 3194
     }
+#line 3194
    /* copy the next block */
+#line 3194
 #pragma cdir loopcnt=LOOPCNT
+#line 3194
 #pragma cdir shortloop
+#line 3194
     for (i=0; i<ni; i++) {
+#line 3194
       /* the normal case: */
+#line 3194
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3194
      /* test for range errors (not always needed but do it anyway) */
+#line 3194
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3194
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3194
       nrange += tp[i] > X_USHORT_MAX || tp[i] < 0;
+#line 3194
     }
+#line 3194
    /* copy workspace back if necessary */
+#line 3194
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3194
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3194
       xp = (ushort *) *xpp;
+#line 3194
     }
+#line 3194
    /* update xpp and tp */
+#line 3194
     xp += ni;
+#line 3194
     tp += ni;
+#line 3194
     *xpp = (void*)xp;
+#line 3194
   }
+#line 3194
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3194
 
+#line 3194
 #else   /* not SX */
+#line 3194
 
+#line 3194
 	char *xp = (char *) *xpp;
+#line 3194
 	int status = NC_NOERR;
+#line 3194
 
+#line 3194
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3194
 	{
-		int lstatus = ncx_put_ushort_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3194
+		int lstatus = ncx_put_ushort_long(xp, tp, fillp);
+#line 3194
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3194
 			status = lstatus;
+#line 3194
 	}
+#line 3194
 
+#line 3194
 	*xpp = (void *)xp;
+#line 3194
 	return status;
+#line 3194
 #endif
+#line 3194
 }
+#line 3194
 
 int
-ncx_putn_ushort_float(void **xpp, size_t nelems, const float *tp)
+#line 3195
+ncx_putn_ushort_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3195
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3195
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3195
 
+#line 3195
  /* basic algorithm is:
+#line 3195
   *   - ensure sane alignment of output data
+#line 3195
   *   - copy (conversion happens automatically) input data
+#line 3195
   *     to output
+#line 3195
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3195
   *     at next location for converted output
+#line 3195
   */
+#line 3195
   long i, j, ni;
+#line 3195
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3195
   ushort *xp;
+#line 3195
   int nrange = 0;         /* number of range errors */
+#line 3195
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3195
   long cxp = (long) *((char**)xpp);
+#line 3195
 
+#line 3195
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3195
   /* sjl: manually stripmine so we can limit amount of
+#line 3195
    * vector work space reserved to LOOPCNT elements. Also
+#line 3195
    * makes vectorisation easy */
+#line 3195
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3195
     ni=Min(nelems-j,LOOPCNT);
+#line 3195
     if (realign) {
+#line 3195
       xp = tmp;
+#line 3195
     } else {
+#line 3195
       xp = (ushort *) *xpp;
+#line 3195
     }
+#line 3195
    /* copy the next block */
+#line 3195
 #pragma cdir loopcnt=LOOPCNT
+#line 3195
 #pragma cdir shortloop
+#line 3195
     for (i=0; i<ni; i++) {
+#line 3195
       /* the normal case: */
+#line 3195
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3195
      /* test for range errors (not always needed but do it anyway) */
+#line 3195
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3195
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3195
       nrange += tp[i] > X_USHORT_MAX || tp[i] < 0;
+#line 3195
     }
+#line 3195
    /* copy workspace back if necessary */
+#line 3195
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3195
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3195
       xp = (ushort *) *xpp;
+#line 3195
     }
+#line 3195
    /* update xpp and tp */
+#line 3195
     xp += ni;
+#line 3195
     tp += ni;
+#line 3195
     *xpp = (void*)xp;
+#line 3195
   }
+#line 3195
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3195
 
+#line 3195
 #else   /* not SX */
+#line 3195
 
+#line 3195
 	char *xp = (char *) *xpp;
+#line 3195
 	int status = NC_NOERR;
+#line 3195
 
+#line 3195
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3195
 	{
-		int lstatus = ncx_put_ushort_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3195
+		int lstatus = ncx_put_ushort_float(xp, tp, fillp);
+#line 3195
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3195
 			status = lstatus;
+#line 3195
 	}
+#line 3195
 
+#line 3195
 	*xpp = (void *)xp;
+#line 3195
 	return status;
+#line 3195
 #endif
+#line 3195
 }
+#line 3195
 
 int
-ncx_putn_ushort_double(void **xpp, size_t nelems, const double *tp)
+#line 3196
+ncx_putn_ushort_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3196
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3196
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3196
 
+#line 3196
  /* basic algorithm is:
+#line 3196
   *   - ensure sane alignment of output data
+#line 3196
   *   - copy (conversion happens automatically) input data
+#line 3196
   *     to output
+#line 3196
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3196
   *     at next location for converted output
+#line 3196
   */
+#line 3196
   long i, j, ni;
+#line 3196
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3196
   ushort *xp;
+#line 3196
   int nrange = 0;         /* number of range errors */
+#line 3196
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3196
   long cxp = (long) *((char**)xpp);
+#line 3196
 
+#line 3196
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3196
   /* sjl: manually stripmine so we can limit amount of
+#line 3196
    * vector work space reserved to LOOPCNT elements. Also
+#line 3196
    * makes vectorisation easy */
+#line 3196
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3196
     ni=Min(nelems-j,LOOPCNT);
+#line 3196
     if (realign) {
+#line 3196
       xp = tmp;
+#line 3196
     } else {
+#line 3196
       xp = (ushort *) *xpp;
+#line 3196
     }
+#line 3196
    /* copy the next block */
+#line 3196
 #pragma cdir loopcnt=LOOPCNT
+#line 3196
 #pragma cdir shortloop
+#line 3196
     for (i=0; i<ni; i++) {
+#line 3196
       /* the normal case: */
+#line 3196
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3196
      /* test for range errors (not always needed but do it anyway) */
+#line 3196
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3196
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3196
       nrange += tp[i] > X_USHORT_MAX || tp[i] < 0;
+#line 3196
     }
+#line 3196
    /* copy workspace back if necessary */
+#line 3196
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3196
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3196
       xp = (ushort *) *xpp;
+#line 3196
     }
+#line 3196
    /* update xpp and tp */
+#line 3196
     xp += ni;
+#line 3196
     tp += ni;
+#line 3196
     *xpp = (void*)xp;
+#line 3196
   }
+#line 3196
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3196
 
+#line 3196
 #else   /* not SX */
+#line 3196
 
+#line 3196
 	char *xp = (char *) *xpp;
+#line 3196
 	int status = NC_NOERR;
+#line 3196
 
+#line 3196
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3196
 	{
-		int lstatus = ncx_put_ushort_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3196
+		int lstatus = ncx_put_ushort_double(xp, tp, fillp);
+#line 3196
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3196
 			status = lstatus;
+#line 3196
 	}
+#line 3196
 
+#line 3196
 	*xpp = (void *)xp;
+#line 3196
 	return status;
+#line 3196
 #endif
+#line 3196
 }
+#line 3196
 
 int
-ncx_putn_ushort_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3197
+ncx_putn_ushort_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3197
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3197
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3197
 
+#line 3197
  /* basic algorithm is:
+#line 3197
   *   - ensure sane alignment of output data
+#line 3197
   *   - copy (conversion happens automatically) input data
+#line 3197
   *     to output
+#line 3197
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3197
   *     at next location for converted output
+#line 3197
   */
+#line 3197
   long i, j, ni;
+#line 3197
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3197
   ushort *xp;
+#line 3197
   int nrange = 0;         /* number of range errors */
+#line 3197
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3197
   long cxp = (long) *((char**)xpp);
+#line 3197
 
+#line 3197
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3197
   /* sjl: manually stripmine so we can limit amount of
+#line 3197
    * vector work space reserved to LOOPCNT elements. Also
+#line 3197
    * makes vectorisation easy */
+#line 3197
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3197
     ni=Min(nelems-j,LOOPCNT);
+#line 3197
     if (realign) {
+#line 3197
       xp = tmp;
+#line 3197
     } else {
+#line 3197
       xp = (ushort *) *xpp;
+#line 3197
     }
+#line 3197
    /* copy the next block */
+#line 3197
 #pragma cdir loopcnt=LOOPCNT
+#line 3197
 #pragma cdir shortloop
+#line 3197
     for (i=0; i<ni; i++) {
+#line 3197
       /* the normal case: */
+#line 3197
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3197
      /* test for range errors (not always needed but do it anyway) */
+#line 3197
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3197
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3197
       nrange += tp[i] > X_USHORT_MAX || tp[i] < 0;
+#line 3197
     }
+#line 3197
    /* copy workspace back if necessary */
+#line 3197
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3197
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3197
       xp = (ushort *) *xpp;
+#line 3197
     }
+#line 3197
    /* update xpp and tp */
+#line 3197
     xp += ni;
+#line 3197
     tp += ni;
+#line 3197
     *xpp = (void*)xp;
+#line 3197
   }
+#line 3197
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3197
 
+#line 3197
 #else   /* not SX */
+#line 3197
 
+#line 3197
 	char *xp = (char *) *xpp;
+#line 3197
 	int status = NC_NOERR;
+#line 3197
 
+#line 3197
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3197
 	{
-		int lstatus = ncx_put_ushort_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3197
+		int lstatus = ncx_put_ushort_longlong(xp, tp, fillp);
+#line 3197
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3197
 			status = lstatus;
+#line 3197
 	}
+#line 3197
 
+#line 3197
 	*xpp = (void *)xp;
+#line 3197
 	return status;
+#line 3197
 #endif
+#line 3197
 }
+#line 3197
 
 int
-ncx_putn_ushort_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3198
+ncx_putn_ushort_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3198
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3198
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3198
 
+#line 3198
  /* basic algorithm is:
+#line 3198
   *   - ensure sane alignment of output data
+#line 3198
   *   - copy (conversion happens automatically) input data
+#line 3198
   *     to output
+#line 3198
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3198
   *     at next location for converted output
+#line 3198
   */
+#line 3198
   long i, j, ni;
+#line 3198
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3198
   ushort *xp;
+#line 3198
   int nrange = 0;         /* number of range errors */
+#line 3198
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3198
   long cxp = (long) *((char**)xpp);
+#line 3198
 
+#line 3198
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3198
   /* sjl: manually stripmine so we can limit amount of
+#line 3198
    * vector work space reserved to LOOPCNT elements. Also
+#line 3198
    * makes vectorisation easy */
+#line 3198
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3198
     ni=Min(nelems-j,LOOPCNT);
+#line 3198
     if (realign) {
+#line 3198
       xp = tmp;
+#line 3198
     } else {
+#line 3198
       xp = (ushort *) *xpp;
+#line 3198
     }
+#line 3198
    /* copy the next block */
+#line 3198
 #pragma cdir loopcnt=LOOPCNT
+#line 3198
 #pragma cdir shortloop
+#line 3198
     for (i=0; i<ni; i++) {
+#line 3198
       /* the normal case: */
+#line 3198
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3198
      /* test for range errors (not always needed but do it anyway) */
+#line 3198
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3198
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3198
       nrange += tp[i] > X_USHORT_MAX ;
+#line 3198
     }
+#line 3198
    /* copy workspace back if necessary */
+#line 3198
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3198
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3198
       xp = (ushort *) *xpp;
+#line 3198
     }
+#line 3198
    /* update xpp and tp */
+#line 3198
     xp += ni;
+#line 3198
     tp += ni;
+#line 3198
     *xpp = (void*)xp;
+#line 3198
   }
+#line 3198
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3198
 
+#line 3198
 #else   /* not SX */
+#line 3198
 
+#line 3198
 	char *xp = (char *) *xpp;
+#line 3198
 	int status = NC_NOERR;
+#line 3198
 
+#line 3198
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3198
 	{
-		int lstatus = ncx_put_ushort_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3198
+		int lstatus = ncx_put_ushort_uchar(xp, tp, fillp);
+#line 3198
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3198
 			status = lstatus;
+#line 3198
 	}
+#line 3198
 
+#line 3198
 	*xpp = (void *)xp;
+#line 3198
 	return status;
+#line 3198
 #endif
+#line 3198
 }
+#line 3198
 
 int
-ncx_putn_ushort_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3199
+ncx_putn_ushort_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3199
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3199
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3199
 
+#line 3199
  /* basic algorithm is:
+#line 3199
   *   - ensure sane alignment of output data
+#line 3199
   *   - copy (conversion happens automatically) input data
+#line 3199
   *     to output
+#line 3199
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3199
   *     at next location for converted output
+#line 3199
   */
+#line 3199
   long i, j, ni;
+#line 3199
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3199
   ushort *xp;
+#line 3199
   int nrange = 0;         /* number of range errors */
+#line 3199
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3199
   long cxp = (long) *((char**)xpp);
+#line 3199
 
+#line 3199
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3199
   /* sjl: manually stripmine so we can limit amount of
+#line 3199
    * vector work space reserved to LOOPCNT elements. Also
+#line 3199
    * makes vectorisation easy */
+#line 3199
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3199
     ni=Min(nelems-j,LOOPCNT);
+#line 3199
     if (realign) {
+#line 3199
       xp = tmp;
+#line 3199
     } else {
+#line 3199
       xp = (ushort *) *xpp;
+#line 3199
     }
+#line 3199
    /* copy the next block */
+#line 3199
 #pragma cdir loopcnt=LOOPCNT
+#line 3199
 #pragma cdir shortloop
+#line 3199
     for (i=0; i<ni; i++) {
+#line 3199
       /* the normal case: */
+#line 3199
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3199
      /* test for range errors (not always needed but do it anyway) */
+#line 3199
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3199
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3199
       nrange += tp[i] > X_USHORT_MAX ;
+#line 3199
     }
+#line 3199
    /* copy workspace back if necessary */
+#line 3199
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3199
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3199
       xp = (ushort *) *xpp;
+#line 3199
     }
+#line 3199
    /* update xpp and tp */
+#line 3199
     xp += ni;
+#line 3199
     tp += ni;
+#line 3199
     *xpp = (void*)xp;
+#line 3199
   }
+#line 3199
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3199
 
+#line 3199
 #else   /* not SX */
+#line 3199
 
+#line 3199
 	char *xp = (char *) *xpp;
+#line 3199
 	int status = NC_NOERR;
+#line 3199
 
+#line 3199
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3199
 	{
-		int lstatus = ncx_put_ushort_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3199
+		int lstatus = ncx_put_ushort_uint(xp, tp, fillp);
+#line 3199
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3199
 			status = lstatus;
+#line 3199
 	}
+#line 3199
 
+#line 3199
 	*xpp = (void *)xp;
+#line 3199
 	return status;
+#line 3199
 #endif
+#line 3199
 }
+#line 3199
 
 int
-ncx_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3200
+ncx_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3200
 {
-#if _SX && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3200
+#if defined(_SX) && _SX != 0 && X_SIZEOF_USHORT == SIZEOF_USHORT
+#line 3200
 
+#line 3200
  /* basic algorithm is:
+#line 3200
   *   - ensure sane alignment of output data
+#line 3200
   *   - copy (conversion happens automatically) input data
+#line 3200
   *     to output
+#line 3200
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3200
   *     at next location for converted output
+#line 3200
   */
+#line 3200
   long i, j, ni;
+#line 3200
   ushort tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3200
   ushort *xp;
+#line 3200
   int nrange = 0;         /* number of range errors */
+#line 3200
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3200
   long cxp = (long) *((char**)xpp);
+#line 3200
 
+#line 3200
   realign = (cxp & 7) % SIZEOF_USHORT;
+#line 3200
   /* sjl: manually stripmine so we can limit amount of
+#line 3200
    * vector work space reserved to LOOPCNT elements. Also
+#line 3200
    * makes vectorisation easy */
+#line 3200
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3200
     ni=Min(nelems-j,LOOPCNT);
+#line 3200
     if (realign) {
+#line 3200
       xp = tmp;
+#line 3200
     } else {
+#line 3200
       xp = (ushort *) *xpp;
+#line 3200
     }
+#line 3200
    /* copy the next block */
+#line 3200
 #pragma cdir loopcnt=LOOPCNT
+#line 3200
 #pragma cdir shortloop
+#line 3200
     for (i=0; i<ni; i++) {
+#line 3200
       /* the normal case: */
+#line 3200
       xp[i] = (ushort) Max( X_USHORT_MIN, Min(X_USHORT_MAX, (ushort) tp[i]));
+#line 3200
      /* test for range errors (not always needed but do it anyway) */
+#line 3200
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3200
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3200
       nrange += tp[i] > X_USHORT_MAX ;
+#line 3200
     }
+#line 3200
    /* copy workspace back if necessary */
+#line 3200
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_USHORT);
+#line 3200
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_USHORT);
+#line 3200
       xp = (ushort *) *xpp;
+#line 3200
     }
+#line 3200
    /* update xpp and tp */
+#line 3200
     xp += ni;
+#line 3200
     tp += ni;
+#line 3200
     *xpp = (void*)xp;
+#line 3200
   }
+#line 3200
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3200
 
+#line 3200
 #else   /* not SX */
+#line 3200
 
+#line 3200
 	char *xp = (char *) *xpp;
+#line 3200
 	int status = NC_NOERR;
+#line 3200
 
+#line 3200
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3200
 	{
-		int lstatus = ncx_put_ushort_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3200
+		int lstatus = ncx_put_ushort_ulonglong(xp, tp, fillp);
+#line 3200
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3200
 			status = lstatus;
+#line 3200
 	}
+#line 3200
 
+#line 3200
 	*xpp = (void *)xp;
+#line 3200
 	return status;
+#line 3200
 #endif
+#line 3200
 }
+#line 3200
+
+
+int
+#line 3202
+ncx_pad_putn_ushort_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3202
+{
+#line 3202
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3202
+
+#line 3202
+	char *xp = (char *) *xpp;
+#line 3202
+	int status = NC_NOERR;
+#line 3202
+
+#line 3202
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3202
+	{
+#line 3202
+		int lstatus = ncx_put_ushort_schar(xp, tp, fillp);
+#line 3202
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3202
+			status = lstatus;
+#line 3202
+	}
+#line 3202
+
+#line 3202
+	if (rndup != 0)
+#line 3202
+	{
+#line 3202
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3202
+		xp += X_SIZEOF_USHORT;
+#line 3202
+	}
+#line 3202
 
+#line 3202
+	*xpp = (void *)xp;
+#line 3202
+	return status;
+#line 3202
+}
+#line 3202
 
 int
-ncx_pad_putn_ushort_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3203
+ncx_pad_putn_ushort_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3203
 {
-	const size_t rndup = nelems % 2;
+#line 3203
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3203
 
+#line 3203
 	char *xp = (char *) *xpp;
+#line 3203
 	int status = NC_NOERR;
+#line 3203
 
+#line 3203
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3203
 	{
-		int lstatus = ncx_put_ushort_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3203
+		int lstatus = ncx_put_ushort_uchar(xp, tp, fillp);
+#line 3203
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3203
 			status = lstatus;
+#line 3203
 	}
+#line 3203
 
-	if(rndup != 0)
+#line 3203
+	if (rndup != 0)
+#line 3203
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3203
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3203
 		xp += X_SIZEOF_USHORT;
+#line 3203
 	}
+#line 3203
 
+#line 3203
 	*xpp = (void *)xp;
+#line 3203
 	return status;
+#line 3203
 }
+#line 3203
 
 int
-ncx_pad_putn_ushort_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3204
+ncx_pad_putn_ushort_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3204
 {
-	const size_t rndup = nelems % 2;
+#line 3204
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3204
 
+#line 3204
 	char *xp = (char *) *xpp;
+#line 3204
 	int status = NC_NOERR;
+#line 3204
 
+#line 3204
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3204
 	{
-		int lstatus = ncx_put_ushort_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3204
+		int lstatus = ncx_put_ushort_short(xp, tp, fillp);
+#line 3204
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3204
 			status = lstatus;
+#line 3204
 	}
+#line 3204
 
-	if(rndup != 0)
+#line 3204
+	if (rndup != 0)
+#line 3204
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3204
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3204
 		xp += X_SIZEOF_USHORT;
+#line 3204
 	}
+#line 3204
 
+#line 3204
 	*xpp = (void *)xp;
+#line 3204
 	return status;
+#line 3204
 }
+#line 3204
 
 int
-ncx_pad_putn_ushort_short(void **xpp, size_t nelems, const short *tp)
+#line 3205
+ncx_pad_putn_ushort_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3205
 {
-	const size_t rndup = nelems % 2;
+#line 3205
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3205
 
+#line 3205
 	char *xp = (char *) *xpp;
+#line 3205
 	int status = NC_NOERR;
+#line 3205
 
+#line 3205
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3205
 	{
-		int lstatus = ncx_put_ushort_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3205
+		int lstatus = ncx_put_ushort_int(xp, tp, fillp);
+#line 3205
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3205
 			status = lstatus;
+#line 3205
 	}
+#line 3205
 
-	if(rndup != 0)
+#line 3205
+	if (rndup != 0)
+#line 3205
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3205
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3205
 		xp += X_SIZEOF_USHORT;
+#line 3205
 	}
+#line 3205
 
+#line 3205
 	*xpp = (void *)xp;
+#line 3205
 	return status;
+#line 3205
 }
+#line 3205
 
 int
-ncx_pad_putn_ushort_int(void **xpp, size_t nelems, const int *tp)
+#line 3206
+ncx_pad_putn_ushort_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3206
 {
-	const size_t rndup = nelems % 2;
+#line 3206
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3206
 
+#line 3206
 	char *xp = (char *) *xpp;
+#line 3206
 	int status = NC_NOERR;
+#line 3206
 
+#line 3206
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3206
 	{
-		int lstatus = ncx_put_ushort_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3206
+		int lstatus = ncx_put_ushort_long(xp, tp, fillp);
+#line 3206
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3206
 			status = lstatus;
+#line 3206
 	}
+#line 3206
 
-	if(rndup != 0)
+#line 3206
+	if (rndup != 0)
+#line 3206
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3206
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3206
 		xp += X_SIZEOF_USHORT;
+#line 3206
 	}
+#line 3206
 
+#line 3206
 	*xpp = (void *)xp;
+#line 3206
 	return status;
+#line 3206
 }
+#line 3206
 
 int
-ncx_pad_putn_ushort_float(void **xpp, size_t nelems, const float *tp)
+#line 3207
+ncx_pad_putn_ushort_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3207
 {
-	const size_t rndup = nelems % 2;
+#line 3207
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3207
 
+#line 3207
 	char *xp = (char *) *xpp;
+#line 3207
 	int status = NC_NOERR;
+#line 3207
 
+#line 3207
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3207
 	{
-		int lstatus = ncx_put_ushort_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3207
+		int lstatus = ncx_put_ushort_float(xp, tp, fillp);
+#line 3207
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3207
 			status = lstatus;
+#line 3207
 	}
+#line 3207
 
-	if(rndup != 0)
+#line 3207
+	if (rndup != 0)
+#line 3207
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3207
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3207
 		xp += X_SIZEOF_USHORT;
+#line 3207
 	}
+#line 3207
 
+#line 3207
 	*xpp = (void *)xp;
+#line 3207
 	return status;
+#line 3207
 }
+#line 3207
 
 int
-ncx_pad_putn_ushort_double(void **xpp, size_t nelems, const double *tp)
+#line 3208
+ncx_pad_putn_ushort_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3208
 {
-	const size_t rndup = nelems % 2;
+#line 3208
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3208
 
+#line 3208
 	char *xp = (char *) *xpp;
+#line 3208
 	int status = NC_NOERR;
+#line 3208
 
+#line 3208
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3208
 	{
-		int lstatus = ncx_put_ushort_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3208
+		int lstatus = ncx_put_ushort_double(xp, tp, fillp);
+#line 3208
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3208
 			status = lstatus;
+#line 3208
 	}
+#line 3208
 
-	if(rndup != 0)
+#line 3208
+	if (rndup != 0)
+#line 3208
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3208
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3208
 		xp += X_SIZEOF_USHORT;
+#line 3208
 	}
+#line 3208
 
+#line 3208
 	*xpp = (void *)xp;
+#line 3208
 	return status;
+#line 3208
 }
+#line 3208
 
 int
-ncx_pad_putn_ushort_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3209
+ncx_pad_putn_ushort_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3209
 {
-	const size_t rndup = nelems % 2;
+#line 3209
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3209
 
+#line 3209
 	char *xp = (char *) *xpp;
+#line 3209
 	int status = NC_NOERR;
+#line 3209
 
+#line 3209
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3209
 	{
-		int lstatus = ncx_put_ushort_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3209
+		int lstatus = ncx_put_ushort_uint(xp, tp, fillp);
+#line 3209
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3209
 			status = lstatus;
+#line 3209
 	}
+#line 3209
 
-	if(rndup != 0)
+#line 3209
+	if (rndup != 0)
+#line 3209
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3209
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3209
 		xp += X_SIZEOF_USHORT;
+#line 3209
 	}
+#line 3209
 
+#line 3209
 	*xpp = (void *)xp;
+#line 3209
 	return status;
+#line 3209
 }
+#line 3209
 
 int
-ncx_pad_putn_ushort_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3210
+ncx_pad_putn_ushort_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3210
 {
-	const size_t rndup = nelems % 2;
+#line 3210
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3210
 
+#line 3210
 	char *xp = (char *) *xpp;
+#line 3210
 	int status = NC_NOERR;
+#line 3210
 
+#line 3210
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3210
 	{
-		int lstatus = ncx_put_ushort_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3210
+		int lstatus = ncx_put_ushort_longlong(xp, tp, fillp);
+#line 3210
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3210
 			status = lstatus;
+#line 3210
 	}
+#line 3210
 
-	if(rndup != 0)
+#line 3210
+	if (rndup != 0)
+#line 3210
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3210
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3210
 		xp += X_SIZEOF_USHORT;
+#line 3210
 	}
+#line 3210
 
+#line 3210
 	*xpp = (void *)xp;
+#line 3210
 	return status;
+#line 3210
 }
+#line 3210
 
 int
-ncx_pad_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3211
+ncx_pad_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3211
 {
-	const size_t rndup = nelems % 2;
+#line 3211
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3211
 
+#line 3211
 	char *xp = (char *) *xpp;
+#line 3211
 	int status = NC_NOERR;
+#line 3211
 
+#line 3211
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3211
 	{
-		int lstatus = ncx_put_ushort_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3211
+		int lstatus = ncx_put_ushort_ulonglong(xp, tp, fillp);
+#line 3211
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3211
 			status = lstatus;
+#line 3211
 	}
+#line 3211
 
-	if(rndup != 0)
+#line 3211
+	if (rndup != 0)
+#line 3211
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3211
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3211
 		xp += X_SIZEOF_USHORT;
+#line 3211
 	}
+#line 3211
 
+#line 3211
 	*xpp = (void *)xp;
+#line 3211
 	return status;
+#line 3211
 }
+#line 3211
 
 int
-ncx_pad_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3212
+ncx_pad_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3212
 {
-	const size_t rndup = nelems % 2;
+#line 3212
+	const size_t rndup = nelems % X_SIZEOF_SHORT;
+#line 3212
 
+#line 3212
 	char *xp = (char *) *xpp;
+#line 3212
 	int status = NC_NOERR;
+#line 3212
 
+#line 3212
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_USHORT, tp++)
+#line 3212
 	{
-		int lstatus = ncx_put_ushort_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3212
+		int lstatus = ncx_put_ushort_ushort(xp, tp, fillp);
+#line 3212
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3212
 			status = lstatus;
+#line 3212
 	}
+#line 3212
 
-	if(rndup != 0)
+#line 3212
+	if (rndup != 0)
+#line 3212
 	{
-		(void) memcpy(xp, nada, X_SIZEOF_USHORT);
+#line 3212
+		(void) memcpy(xp, nada, (size_t)(X_SIZEOF_USHORT));
+#line 3212
 		xp += X_SIZEOF_USHORT;
+#line 3212
 	}
+#line 3212
 
+#line 3212
 	*xpp = (void *)xp;
+#line 3212
 	return status;
+#line 3212
 }
+#line 3212
 
 
 
@@ -8882,7 +19407,7 @@ int
 ncx_getn_int_int(const void **xpp, size_t nelems, int *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(int));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_INT);
 # else
 	swapn4b(tp, *xpp, nelems);
 # endif
@@ -8891,1370 +19416,2967 @@ ncx_getn_int_int(const void **xpp, size_t nelems, int *tp)
 }
 #else
 int
+#line 3231
 ncx_getn_int_int(const void **xpp, size_t nelems, int *tp)
+#line 3231
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3231
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3231
 
+#line 3231
  /* basic algorithm is:
+#line 3231
   *   - ensure sane alignment of input data
+#line 3231
   *   - copy (conversion happens automatically) input data
+#line 3231
   *     to output
+#line 3231
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3231
   *     at next location for converted output
+#line 3231
   */
+#line 3231
   long i, j, ni;
+#line 3231
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3231
   int *xp;
+#line 3231
   int nrange = 0;         /* number of range errors */
+#line 3231
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3231
   long cxp = (long) *((char**)xpp);
+#line 3231
 
+#line 3231
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3231
   /* sjl: manually stripmine so we can limit amount of
+#line 3231
    * vector work space reserved to LOOPCNT elements. Also
+#line 3231
    * makes vectorisation easy */
+#line 3231
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3231
     ni=Min(nelems-j,LOOPCNT);
+#line 3231
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3231
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3231
       xp = tmp;
+#line 3231
     } else {
+#line 3231
       xp = (int *) *xpp;
+#line 3231
     }
+#line 3231
    /* copy the next block */
+#line 3231
 #pragma cdir loopcnt=LOOPCNT
+#line 3231
 #pragma cdir shortloop
+#line 3231
     for (i=0; i<ni; i++) {
+#line 3231
       tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3231
      /* test for range errors (not always needed but do it anyway) */
+#line 3231
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3231
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3231
       nrange += xp[i] > INT_MAX || xp[i] < INT_MIN;
+#line 3231
     }
+#line 3231
    /* update xpp and tp */
+#line 3231
     if (realign) xp = (int *) *xpp;
+#line 3231
     xp += ni;
+#line 3231
     tp += ni;
+#line 3231
     *xpp = (void*)xp;
+#line 3231
   }
+#line 3231
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3231
 
+#line 3231
 #else   /* not SX */
+#line 3231
 	const char *xp = (const char *) *xpp;
+#line 3231
 	int status = NC_NOERR;
+#line 3231
 
+#line 3231
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3231
 	{
+#line 3231
 		const int lstatus = ncx_get_int_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3231
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3231
 			status = lstatus;
+#line 3231
 	}
+#line 3231
 
+#line 3231
 	*xpp = (const void *)xp;
+#line 3231
 	return status;
-#  endif
+#line 3231
+#endif
+#line 3231
 }
+#line 3231
 
 #endif
 int
+#line 3233
 ncx_getn_int_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3233
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3233
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3233
 
+#line 3233
  /* basic algorithm is:
+#line 3233
   *   - ensure sane alignment of input data
+#line 3233
   *   - copy (conversion happens automatically) input data
+#line 3233
   *     to output
+#line 3233
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3233
   *     at next location for converted output
+#line 3233
   */
+#line 3233
   long i, j, ni;
+#line 3233
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3233
   int *xp;
+#line 3233
   int nrange = 0;         /* number of range errors */
+#line 3233
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3233
   long cxp = (long) *((char**)xpp);
+#line 3233
 
+#line 3233
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3233
   /* sjl: manually stripmine so we can limit amount of
+#line 3233
    * vector work space reserved to LOOPCNT elements. Also
+#line 3233
    * makes vectorisation easy */
+#line 3233
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3233
     ni=Min(nelems-j,LOOPCNT);
+#line 3233
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3233
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3233
       xp = tmp;
+#line 3233
     } else {
+#line 3233
       xp = (int *) *xpp;
+#line 3233
     }
+#line 3233
    /* copy the next block */
+#line 3233
 #pragma cdir loopcnt=LOOPCNT
+#line 3233
 #pragma cdir shortloop
+#line 3233
     for (i=0; i<ni; i++) {
+#line 3233
       tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3233
      /* test for range errors (not always needed but do it anyway) */
+#line 3233
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3233
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3233
       nrange += xp[i] > SCHAR_MAX || xp[i] < SCHAR_MIN;
+#line 3233
     }
+#line 3233
    /* update xpp and tp */
+#line 3233
     if (realign) xp = (int *) *xpp;
+#line 3233
     xp += ni;
+#line 3233
     tp += ni;
+#line 3233
     *xpp = (void*)xp;
+#line 3233
   }
+#line 3233
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3233
 
+#line 3233
 #else   /* not SX */
+#line 3233
 	const char *xp = (const char *) *xpp;
+#line 3233
 	int status = NC_NOERR;
+#line 3233
 
+#line 3233
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3233
 	{
+#line 3233
 		const int lstatus = ncx_get_int_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3233
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3233
 			status = lstatus;
+#line 3233
 	}
+#line 3233
 
+#line 3233
 	*xpp = (const void *)xp;
+#line 3233
 	return status;
-#  endif
+#line 3233
+#endif
+#line 3233
 }
+#line 3233
 
 int
+#line 3234
 ncx_getn_int_short(const void **xpp, size_t nelems, short *tp)
+#line 3234
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3234
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3234
 
+#line 3234
  /* basic algorithm is:
+#line 3234
   *   - ensure sane alignment of input data
+#line 3234
   *   - copy (conversion happens automatically) input data
+#line 3234
   *     to output
+#line 3234
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3234
   *     at next location for converted output
+#line 3234
   */
+#line 3234
   long i, j, ni;
+#line 3234
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3234
   int *xp;
+#line 3234
   int nrange = 0;         /* number of range errors */
+#line 3234
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3234
   long cxp = (long) *((char**)xpp);
+#line 3234
 
+#line 3234
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3234
   /* sjl: manually stripmine so we can limit amount of
+#line 3234
    * vector work space reserved to LOOPCNT elements. Also
+#line 3234
    * makes vectorisation easy */
+#line 3234
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3234
     ni=Min(nelems-j,LOOPCNT);
+#line 3234
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3234
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3234
       xp = tmp;
+#line 3234
     } else {
+#line 3234
       xp = (int *) *xpp;
+#line 3234
     }
+#line 3234
    /* copy the next block */
+#line 3234
 #pragma cdir loopcnt=LOOPCNT
+#line 3234
 #pragma cdir shortloop
+#line 3234
     for (i=0; i<ni; i++) {
+#line 3234
       tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3234
      /* test for range errors (not always needed but do it anyway) */
+#line 3234
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3234
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3234
       nrange += xp[i] > SHORT_MAX || xp[i] < SHORT_MIN;
+#line 3234
     }
+#line 3234
    /* update xpp and tp */
+#line 3234
     if (realign) xp = (int *) *xpp;
+#line 3234
     xp += ni;
+#line 3234
     tp += ni;
+#line 3234
     *xpp = (void*)xp;
+#line 3234
   }
+#line 3234
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3234
 
+#line 3234
 #else   /* not SX */
+#line 3234
 	const char *xp = (const char *) *xpp;
+#line 3234
 	int status = NC_NOERR;
+#line 3234
 
+#line 3234
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3234
 	{
+#line 3234
 		const int lstatus = ncx_get_int_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3234
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3234
+			status = lstatus;
+#line 3234
+	}
+#line 3234
+
+#line 3234
+	*xpp = (const void *)xp;
+#line 3234
+	return status;
+#line 3234
+#endif
+#line 3234
+}
+#line 3234
+
+int
+#line 3235
+ncx_getn_int_long(const void **xpp, size_t nelems, long *tp)
+#line 3235
+{
+#line 3235
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3235
+
+#line 3235
+ /* basic algorithm is:
+#line 3235
+  *   - ensure sane alignment of input data
+#line 3235
+  *   - copy (conversion happens automatically) input data
+#line 3235
+  *     to output
+#line 3235
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3235
+  *     at next location for converted output
+#line 3235
+  */
+#line 3235
+  long i, j, ni;
+#line 3235
+  int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3235
+  int *xp;
+#line 3235
+  int nrange = 0;         /* number of range errors */
+#line 3235
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3235
+  long cxp = (long) *((char**)xpp);
+#line 3235
+
+#line 3235
+  realign = (cxp & 7) % SIZEOF_INT;
+#line 3235
+  /* sjl: manually stripmine so we can limit amount of
+#line 3235
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3235
+   * makes vectorisation easy */
+#line 3235
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3235
+    ni=Min(nelems-j,LOOPCNT);
+#line 3235
+    if (realign) {
+#line 3235
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3235
+      xp = tmp;
+#line 3235
+    } else {
+#line 3235
+      xp = (int *) *xpp;
+#line 3235
+    }
+#line 3235
+   /* copy the next block */
+#line 3235
+#pragma cdir loopcnt=LOOPCNT
+#line 3235
+#pragma cdir shortloop
+#line 3235
+    for (i=0; i<ni; i++) {
+#line 3235
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3235
+     /* test for range errors (not always needed but do it anyway) */
+#line 3235
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3235
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3235
+      nrange += xp[i] > LONG_MAX || xp[i] < LONG_MIN;
+#line 3235
+    }
+#line 3235
+   /* update xpp and tp */
+#line 3235
+    if (realign) xp = (int *) *xpp;
+#line 3235
+    xp += ni;
+#line 3235
+    tp += ni;
+#line 3235
+    *xpp = (void*)xp;
+#line 3235
+  }
+#line 3235
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3235
+
+#line 3235
+#else   /* not SX */
+#line 3235
+	const char *xp = (const char *) *xpp;
+#line 3235
+	int status = NC_NOERR;
+#line 3235
+
+#line 3235
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3235
+	{
+#line 3235
+		const int lstatus = ncx_get_int_long(xp, tp);
+#line 3235
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3235
 			status = lstatus;
+#line 3235
 	}
+#line 3235
 
+#line 3235
 	*xpp = (const void *)xp;
+#line 3235
 	return status;
-#  endif
+#line 3235
+#endif
+#line 3235
 }
+#line 3235
 
 int
+#line 3236
 ncx_getn_int_float(const void **xpp, size_t nelems, float *tp)
+#line 3236
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3236
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3236
 
+#line 3236
  /* basic algorithm is:
+#line 3236
   *   - ensure sane alignment of input data
+#line 3236
   *   - copy (conversion happens automatically) input data
+#line 3236
   *     to output
+#line 3236
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3236
   *     at next location for converted output
+#line 3236
   */
+#line 3236
   long i, j, ni;
+#line 3236
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3236
   int *xp;
+#line 3236
   int nrange = 0;         /* number of range errors */
+#line 3236
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3236
   long cxp = (long) *((char**)xpp);
+#line 3236
 
+#line 3236
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3236
   /* sjl: manually stripmine so we can limit amount of
+#line 3236
    * vector work space reserved to LOOPCNT elements. Also
+#line 3236
    * makes vectorisation easy */
+#line 3236
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3236
     ni=Min(nelems-j,LOOPCNT);
+#line 3236
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3236
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3236
       xp = tmp;
+#line 3236
     } else {
+#line 3236
       xp = (int *) *xpp;
+#line 3236
     }
+#line 3236
    /* copy the next block */
+#line 3236
 #pragma cdir loopcnt=LOOPCNT
+#line 3236
 #pragma cdir shortloop
+#line 3236
     for (i=0; i<ni; i++) {
+#line 3236
       tp[i] = (float) Max( FLOAT_MIN, Min(FLOAT_MAX, (float) xp[i]));
+#line 3236
      /* test for range errors (not always needed but do it anyway) */
+#line 3236
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3236
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3236
       nrange += xp[i] > FLOAT_MAX || xp[i] < FLOAT_MIN;
+#line 3236
     }
+#line 3236
    /* update xpp and tp */
+#line 3236
     if (realign) xp = (int *) *xpp;
+#line 3236
     xp += ni;
+#line 3236
     tp += ni;
+#line 3236
     *xpp = (void*)xp;
+#line 3236
   }
+#line 3236
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3236
 
+#line 3236
 #else   /* not SX */
+#line 3236
 	const char *xp = (const char *) *xpp;
+#line 3236
 	int status = NC_NOERR;
+#line 3236
 
+#line 3236
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3236
 	{
+#line 3236
 		const int lstatus = ncx_get_int_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3236
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3236
 			status = lstatus;
+#line 3236
 	}
+#line 3236
 
+#line 3236
 	*xpp = (const void *)xp;
+#line 3236
 	return status;
-#  endif
+#line 3236
+#endif
+#line 3236
 }
+#line 3236
 
 int
+#line 3237
 ncx_getn_int_double(const void **xpp, size_t nelems, double *tp)
+#line 3237
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3237
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3237
 
+#line 3237
  /* basic algorithm is:
+#line 3237
   *   - ensure sane alignment of input data
+#line 3237
   *   - copy (conversion happens automatically) input data
+#line 3237
   *     to output
+#line 3237
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3237
   *     at next location for converted output
+#line 3237
   */
+#line 3237
   long i, j, ni;
+#line 3237
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3237
   int *xp;
+#line 3237
   int nrange = 0;         /* number of range errors */
+#line 3237
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3237
   long cxp = (long) *((char**)xpp);
+#line 3237
 
+#line 3237
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3237
   /* sjl: manually stripmine so we can limit amount of
+#line 3237
    * vector work space reserved to LOOPCNT elements. Also
+#line 3237
    * makes vectorisation easy */
+#line 3237
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3237
     ni=Min(nelems-j,LOOPCNT);
+#line 3237
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3237
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3237
       xp = tmp;
+#line 3237
     } else {
+#line 3237
       xp = (int *) *xpp;
+#line 3237
     }
+#line 3237
    /* copy the next block */
+#line 3237
 #pragma cdir loopcnt=LOOPCNT
+#line 3237
 #pragma cdir shortloop
+#line 3237
     for (i=0; i<ni; i++) {
+#line 3237
       tp[i] = (double) Max( DOUBLE_MIN, Min(DOUBLE_MAX, (double) xp[i]));
+#line 3237
      /* test for range errors (not always needed but do it anyway) */
+#line 3237
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3237
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3237
       nrange += xp[i] > DOUBLE_MAX || xp[i] < DOUBLE_MIN;
+#line 3237
     }
+#line 3237
    /* update xpp and tp */
+#line 3237
     if (realign) xp = (int *) *xpp;
+#line 3237
     xp += ni;
+#line 3237
     tp += ni;
+#line 3237
     *xpp = (void*)xp;
+#line 3237
   }
+#line 3237
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3237
 
+#line 3237
 #else   /* not SX */
+#line 3237
 	const char *xp = (const char *) *xpp;
+#line 3237
 	int status = NC_NOERR;
+#line 3237
 
+#line 3237
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3237
 	{
+#line 3237
 		const int lstatus = ncx_get_int_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3237
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3237
 			status = lstatus;
+#line 3237
 	}
+#line 3237
 
+#line 3237
 	*xpp = (const void *)xp;
+#line 3237
 	return status;
-#  endif
+#line 3237
+#endif
+#line 3237
 }
+#line 3237
 
 int
+#line 3238
 ncx_getn_int_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3238
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3238
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3238
 
+#line 3238
  /* basic algorithm is:
+#line 3238
   *   - ensure sane alignment of input data
+#line 3238
   *   - copy (conversion happens automatically) input data
+#line 3238
   *     to output
+#line 3238
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3238
   *     at next location for converted output
+#line 3238
   */
+#line 3238
   long i, j, ni;
+#line 3238
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3238
   int *xp;
+#line 3238
   int nrange = 0;         /* number of range errors */
+#line 3238
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3238
   long cxp = (long) *((char**)xpp);
+#line 3238
 
+#line 3238
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3238
   /* sjl: manually stripmine so we can limit amount of
+#line 3238
    * vector work space reserved to LOOPCNT elements. Also
+#line 3238
    * makes vectorisation easy */
+#line 3238
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3238
     ni=Min(nelems-j,LOOPCNT);
+#line 3238
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3238
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3238
       xp = tmp;
+#line 3238
     } else {
+#line 3238
       xp = (int *) *xpp;
+#line 3238
     }
+#line 3238
    /* copy the next block */
+#line 3238
 #pragma cdir loopcnt=LOOPCNT
+#line 3238
 #pragma cdir shortloop
+#line 3238
     for (i=0; i<ni; i++) {
+#line 3238
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3238
      /* test for range errors (not always needed but do it anyway) */
+#line 3238
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3238
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3238
       nrange += xp[i] > LONGLONG_MAX || xp[i] < LONGLONG_MIN;
+#line 3238
     }
+#line 3238
    /* update xpp and tp */
+#line 3238
     if (realign) xp = (int *) *xpp;
+#line 3238
     xp += ni;
+#line 3238
     tp += ni;
+#line 3238
     *xpp = (void*)xp;
+#line 3238
   }
+#line 3238
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3238
 
+#line 3238
 #else   /* not SX */
+#line 3238
 	const char *xp = (const char *) *xpp;
+#line 3238
 	int status = NC_NOERR;
+#line 3238
 
+#line 3238
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3238
 	{
+#line 3238
 		const int lstatus = ncx_get_int_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3238
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3238
 			status = lstatus;
+#line 3238
 	}
+#line 3238
 
+#line 3238
 	*xpp = (const void *)xp;
+#line 3238
 	return status;
-#  endif
+#line 3238
+#endif
+#line 3238
 }
+#line 3238
 
 int
+#line 3239
 ncx_getn_int_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3239
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3239
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3239
 
+#line 3239
  /* basic algorithm is:
+#line 3239
   *   - ensure sane alignment of input data
+#line 3239
   *   - copy (conversion happens automatically) input data
+#line 3239
   *     to output
+#line 3239
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3239
   *     at next location for converted output
+#line 3239
   */
+#line 3239
   long i, j, ni;
+#line 3239
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3239
   int *xp;
+#line 3239
   int nrange = 0;         /* number of range errors */
+#line 3239
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3239
   long cxp = (long) *((char**)xpp);
+#line 3239
 
+#line 3239
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3239
   /* sjl: manually stripmine so we can limit amount of
+#line 3239
    * vector work space reserved to LOOPCNT elements. Also
+#line 3239
    * makes vectorisation easy */
+#line 3239
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3239
     ni=Min(nelems-j,LOOPCNT);
+#line 3239
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3239
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3239
       xp = tmp;
+#line 3239
     } else {
+#line 3239
       xp = (int *) *xpp;
+#line 3239
     }
+#line 3239
    /* copy the next block */
+#line 3239
 #pragma cdir loopcnt=LOOPCNT
+#line 3239
 #pragma cdir shortloop
+#line 3239
     for (i=0; i<ni; i++) {
+#line 3239
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3239
      /* test for range errors (not always needed but do it anyway) */
+#line 3239
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3239
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3239
       nrange += xp[i] > UCHAR_MAX || xp[i] < 0;
+#line 3239
     }
+#line 3239
    /* update xpp and tp */
+#line 3239
     if (realign) xp = (int *) *xpp;
+#line 3239
     xp += ni;
+#line 3239
     tp += ni;
+#line 3239
     *xpp = (void*)xp;
+#line 3239
   }
+#line 3239
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3239
 
+#line 3239
 #else   /* not SX */
+#line 3239
 	const char *xp = (const char *) *xpp;
+#line 3239
 	int status = NC_NOERR;
+#line 3239
 
+#line 3239
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3239
 	{
+#line 3239
 		const int lstatus = ncx_get_int_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3239
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3239
 			status = lstatus;
+#line 3239
 	}
+#line 3239
 
+#line 3239
 	*xpp = (const void *)xp;
+#line 3239
 	return status;
-#  endif
+#line 3239
+#endif
+#line 3239
 }
+#line 3239
 
 int
+#line 3240
 ncx_getn_int_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3240
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3240
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3240
 
+#line 3240
  /* basic algorithm is:
+#line 3240
   *   - ensure sane alignment of input data
+#line 3240
   *   - copy (conversion happens automatically) input data
+#line 3240
   *     to output
+#line 3240
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3240
   *     at next location for converted output
+#line 3240
   */
+#line 3240
   long i, j, ni;
+#line 3240
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3240
   int *xp;
+#line 3240
   int nrange = 0;         /* number of range errors */
+#line 3240
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3240
   long cxp = (long) *((char**)xpp);
+#line 3240
 
+#line 3240
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3240
   /* sjl: manually stripmine so we can limit amount of
+#line 3240
    * vector work space reserved to LOOPCNT elements. Also
+#line 3240
    * makes vectorisation easy */
+#line 3240
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3240
     ni=Min(nelems-j,LOOPCNT);
+#line 3240
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3240
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3240
       xp = tmp;
+#line 3240
     } else {
+#line 3240
       xp = (int *) *xpp;
+#line 3240
     }
+#line 3240
    /* copy the next block */
+#line 3240
 #pragma cdir loopcnt=LOOPCNT
+#line 3240
 #pragma cdir shortloop
+#line 3240
     for (i=0; i<ni; i++) {
+#line 3240
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3240
      /* test for range errors (not always needed but do it anyway) */
+#line 3240
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3240
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3240
       nrange += xp[i] > USHORT_MAX || xp[i] < 0;
+#line 3240
     }
+#line 3240
    /* update xpp and tp */
+#line 3240
     if (realign) xp = (int *) *xpp;
+#line 3240
     xp += ni;
+#line 3240
     tp += ni;
+#line 3240
     *xpp = (void*)xp;
+#line 3240
   }
+#line 3240
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3240
 
+#line 3240
 #else   /* not SX */
+#line 3240
 	const char *xp = (const char *) *xpp;
+#line 3240
 	int status = NC_NOERR;
+#line 3240
 
+#line 3240
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3240
 	{
+#line 3240
 		const int lstatus = ncx_get_int_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3240
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3240
+			status = lstatus;
+#line 3240
+	}
+#line 3240
+
+#line 3240
+	*xpp = (const void *)xp;
+#line 3240
+	return status;
+#line 3240
+#endif
+#line 3240
+}
+#line 3240
+
+int
+#line 3241
+ncx_getn_int_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3241
+{
+#line 3241
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3241
+
+#line 3241
+ /* basic algorithm is:
+#line 3241
+  *   - ensure sane alignment of input data
+#line 3241
+  *   - copy (conversion happens automatically) input data
+#line 3241
+  *     to output
+#line 3241
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3241
+  *     at next location for converted output
+#line 3241
+  */
+#line 3241
+  long i, j, ni;
+#line 3241
+  int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3241
+  int *xp;
+#line 3241
+  int nrange = 0;         /* number of range errors */
+#line 3241
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3241
+  long cxp = (long) *((char**)xpp);
+#line 3241
+
+#line 3241
+  realign = (cxp & 7) % SIZEOF_INT;
+#line 3241
+  /* sjl: manually stripmine so we can limit amount of
+#line 3241
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3241
+   * makes vectorisation easy */
+#line 3241
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3241
+    ni=Min(nelems-j,LOOPCNT);
+#line 3241
+    if (realign) {
+#line 3241
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3241
+      xp = tmp;
+#line 3241
+    } else {
+#line 3241
+      xp = (int *) *xpp;
+#line 3241
+    }
+#line 3241
+   /* copy the next block */
+#line 3241
+#pragma cdir loopcnt=LOOPCNT
+#line 3241
+#pragma cdir shortloop
+#line 3241
+    for (i=0; i<ni; i++) {
+#line 3241
+      tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3241
+     /* test for range errors (not always needed but do it anyway) */
+#line 3241
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3241
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3241
+      nrange += xp[i] > UINT_MAX || xp[i] < 0;
+#line 3241
+    }
+#line 3241
+   /* update xpp and tp */
+#line 3241
+    if (realign) xp = (int *) *xpp;
+#line 3241
+    xp += ni;
+#line 3241
+    tp += ni;
+#line 3241
+    *xpp = (void*)xp;
+#line 3241
+  }
+#line 3241
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3241
+
+#line 3241
+#else   /* not SX */
+#line 3241
+	const char *xp = (const char *) *xpp;
+#line 3241
+	int status = NC_NOERR;
+#line 3241
+
+#line 3241
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3241
+	{
+#line 3241
+		const int lstatus = ncx_get_int_uint(xp, tp);
+#line 3241
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3241
 			status = lstatus;
+#line 3241
 	}
+#line 3241
 
+#line 3241
 	*xpp = (const void *)xp;
+#line 3241
 	return status;
-#  endif
+#line 3241
+#endif
+#line 3241
 }
+#line 3241
 
 int
-ncx_getn_int_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3242
+ncx_getn_int_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3242
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3242
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3242
 
+#line 3242
  /* basic algorithm is:
+#line 3242
   *   - ensure sane alignment of input data
+#line 3242
   *   - copy (conversion happens automatically) input data
+#line 3242
   *     to output
+#line 3242
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3242
   *     at next location for converted output
+#line 3242
   */
+#line 3242
   long i, j, ni;
+#line 3242
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3242
   int *xp;
+#line 3242
   int nrange = 0;         /* number of range errors */
+#line 3242
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3242
   long cxp = (long) *((char**)xpp);
+#line 3242
 
+#line 3242
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3242
   /* sjl: manually stripmine so we can limit amount of
+#line 3242
    * vector work space reserved to LOOPCNT elements. Also
+#line 3242
    * makes vectorisation easy */
+#line 3242
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3242
     ni=Min(nelems-j,LOOPCNT);
+#line 3242
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3242
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT));
+#line 3242
       xp = tmp;
+#line 3242
     } else {
+#line 3242
       xp = (int *) *xpp;
+#line 3242
     }
+#line 3242
    /* copy the next block */
+#line 3242
 #pragma cdir loopcnt=LOOPCNT
+#line 3242
 #pragma cdir shortloop
+#line 3242
     for (i=0; i<ni; i++) {
-      tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3242
+      tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3242
      /* test for range errors (not always needed but do it anyway) */
+#line 3242
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3242
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > UINT_MAX || xp[i] < 0;
+#line 3242
+      nrange += xp[i] > ULONGLONG_MAX || xp[i] < 0;
+#line 3242
     }
+#line 3242
    /* update xpp and tp */
+#line 3242
     if (realign) xp = (int *) *xpp;
+#line 3242
     xp += ni;
+#line 3242
     tp += ni;
+#line 3242
     *xpp = (void*)xp;
+#line 3242
   }
+#line 3242
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3242
 
+#line 3242
 #else   /* not SX */
+#line 3242
 	const char *xp = (const char *) *xpp;
+#line 3242
 	int status = NC_NOERR;
+#line 3242
 
+#line 3242
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3242
 	{
-		const int lstatus = ncx_get_int_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3242
+		const int lstatus = ncx_get_int_ulonglong(xp, tp);
+#line 3242
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3242
 			status = lstatus;
+#line 3242
 	}
+#line 3242
 
+#line 3242
 	*xpp = (const void *)xp;
+#line 3242
 	return status;
-#  endif
+#line 3242
+#endif
+#line 3242
 }
+#line 3242
+
 
+#if X_SIZEOF_INT == SIZEOF_INT
+/* optimized version */
 int
-ncx_getn_int_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+ncx_putn_int_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+{
+#ifdef WORDS_BIGENDIAN
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_INT);
+# else
+	swapn4b(*xpp, tp, nelems);
+# endif
+	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_INT);
+	return NC_NOERR;
+}
+#else
+int
+#line 3258
+ncx_putn_int_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3258
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3258
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3258
 
+#line 3258
  /* basic algorithm is:
-  *   - ensure sane alignment of input data
+#line 3258
+  *   - ensure sane alignment of output data
+#line 3258
   *   - copy (conversion happens automatically) input data
+#line 3258
   *     to output
-  *   - update xpp to point at next unconverted input, and tp to point
+#line 3258
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3258
   *     at next location for converted output
+#line 3258
   */
+#line 3258
   long i, j, ni;
+#line 3258
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3258
   int *xp;
+#line 3258
   int nrange = 0;         /* number of range errors */
+#line 3258
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3258
   long cxp = (long) *((char**)xpp);
+#line 3258
 
+#line 3258
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3258
   /* sjl: manually stripmine so we can limit amount of
+#line 3258
    * vector work space reserved to LOOPCNT elements. Also
+#line 3258
    * makes vectorisation easy */
+#line 3258
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3258
     ni=Min(nelems-j,LOOPCNT);
+#line 3258
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_INT);
+#line 3258
       xp = tmp;
+#line 3258
     } else {
+#line 3258
       xp = (int *) *xpp;
+#line 3258
     }
+#line 3258
    /* copy the next block */
+#line 3258
 #pragma cdir loopcnt=LOOPCNT
+#line 3258
 #pragma cdir shortloop
+#line 3258
     for (i=0; i<ni; i++) {
-      tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3258
+      /* the normal case: */
+#line 3258
+      xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3258
      /* test for range errors (not always needed but do it anyway) */
-     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
-     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > ULONGLONG_MAX || xp[i] < 0;
+#line 3258
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3258
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3258
+      nrange += tp[i] > X_INT_MAX || tp[i] < X_INT_MIN;
+#line 3258
+    }
+#line 3258
+   /* copy workspace back if necessary */
+#line 3258
+    if (realign) {
+#line 3258
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3258
+      xp = (int *) *xpp;
+#line 3258
     }
+#line 3258
    /* update xpp and tp */
-    if (realign) xp = (int *) *xpp;
+#line 3258
     xp += ni;
+#line 3258
     tp += ni;
+#line 3258
     *xpp = (void*)xp;
+#line 3258
   }
+#line 3258
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3258
 
+#line 3258
 #else   /* not SX */
-	const char *xp = (const char *) *xpp;
+#line 3258
+
+#line 3258
+	char *xp = (char *) *xpp;
+#line 3258
 	int status = NC_NOERR;
+#line 3258
 
+#line 3258
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3258
 	{
-		const int lstatus = ncx_get_int_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3258
+		int lstatus = ncx_put_int_int(xp, tp, fillp);
+#line 3258
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3258
 			status = lstatus;
+#line 3258
 	}
+#line 3258
 
-	*xpp = (const void *)xp;
+#line 3258
+	*xpp = (void *)xp;
+#line 3258
 	return status;
-#  endif
+#line 3258
+#endif
+#line 3258
 }
+#line 3258
 
-
-#if X_SIZEOF_INT == SIZEOF_INT
-/* optimized version */
-int
-ncx_putn_int_int(void **xpp, size_t nelems, const int *tp)
-{
-#ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_INT);
-# else
-	swapn4b(*xpp, tp, nelems);
-# endif
-	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_INT);
-	return NC_NOERR;
-}
-#else
+#endif
 int
-ncx_putn_int_int(void **xpp, size_t nelems, const int *tp)
+#line 3260
+ncx_putn_int_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3260
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3260
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3260
 
+#line 3260
  /* basic algorithm is:
+#line 3260
   *   - ensure sane alignment of output data
+#line 3260
   *   - copy (conversion happens automatically) input data
+#line 3260
   *     to output
+#line 3260
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3260
   *     at next location for converted output
+#line 3260
   */
+#line 3260
   long i, j, ni;
+#line 3260
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3260
   int *xp;
+#line 3260
   int nrange = 0;         /* number of range errors */
+#line 3260
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3260
   long cxp = (long) *((char**)xpp);
+#line 3260
 
+#line 3260
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3260
   /* sjl: manually stripmine so we can limit amount of
+#line 3260
    * vector work space reserved to LOOPCNT elements. Also
+#line 3260
    * makes vectorisation easy */
+#line 3260
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3260
     ni=Min(nelems-j,LOOPCNT);
+#line 3260
     if (realign) {
+#line 3260
       xp = tmp;
+#line 3260
     } else {
+#line 3260
       xp = (int *) *xpp;
+#line 3260
     }
+#line 3260
    /* copy the next block */
+#line 3260
 #pragma cdir loopcnt=LOOPCNT
+#line 3260
 #pragma cdir shortloop
+#line 3260
     for (i=0; i<ni; i++) {
+#line 3260
       /* the normal case: */
+#line 3260
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3260
      /* test for range errors (not always needed but do it anyway) */
+#line 3260
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3260
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3260
       nrange += tp[i] > X_INT_MAX || tp[i] < X_INT_MIN;
+#line 3260
     }
+#line 3260
    /* copy workspace back if necessary */
+#line 3260
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3260
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3260
       xp = (int *) *xpp;
+#line 3260
     }
+#line 3260
    /* update xpp and tp */
+#line 3260
     xp += ni;
+#line 3260
     tp += ni;
+#line 3260
     *xpp = (void*)xp;
+#line 3260
   }
+#line 3260
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3260
 
+#line 3260
 #else   /* not SX */
+#line 3260
 
+#line 3260
 	char *xp = (char *) *xpp;
+#line 3260
 	int status = NC_NOERR;
+#line 3260
 
+#line 3260
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3260
 	{
-		int lstatus = ncx_put_int_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3260
+		int lstatus = ncx_put_int_schar(xp, tp, fillp);
+#line 3260
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3260
 			status = lstatus;
+#line 3260
 	}
+#line 3260
 
+#line 3260
 	*xpp = (void *)xp;
+#line 3260
 	return status;
+#line 3260
 #endif
+#line 3260
 }
+#line 3260
 
-#endif
 int
-ncx_putn_int_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3261
+ncx_putn_int_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3261
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3261
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3261
 
+#line 3261
  /* basic algorithm is:
+#line 3261
   *   - ensure sane alignment of output data
+#line 3261
   *   - copy (conversion happens automatically) input data
+#line 3261
   *     to output
+#line 3261
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3261
   *     at next location for converted output
+#line 3261
   */
+#line 3261
   long i, j, ni;
+#line 3261
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3261
   int *xp;
+#line 3261
   int nrange = 0;         /* number of range errors */
+#line 3261
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3261
   long cxp = (long) *((char**)xpp);
+#line 3261
 
+#line 3261
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3261
   /* sjl: manually stripmine so we can limit amount of
+#line 3261
    * vector work space reserved to LOOPCNT elements. Also
+#line 3261
    * makes vectorisation easy */
+#line 3261
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3261
     ni=Min(nelems-j,LOOPCNT);
+#line 3261
     if (realign) {
+#line 3261
       xp = tmp;
+#line 3261
     } else {
+#line 3261
       xp = (int *) *xpp;
+#line 3261
     }
+#line 3261
    /* copy the next block */
+#line 3261
 #pragma cdir loopcnt=LOOPCNT
+#line 3261
 #pragma cdir shortloop
+#line 3261
     for (i=0; i<ni; i++) {
+#line 3261
       /* the normal case: */
+#line 3261
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3261
      /* test for range errors (not always needed but do it anyway) */
+#line 3261
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3261
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3261
       nrange += tp[i] > X_INT_MAX || tp[i] < X_INT_MIN;
+#line 3261
     }
+#line 3261
    /* copy workspace back if necessary */
+#line 3261
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3261
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3261
       xp = (int *) *xpp;
+#line 3261
     }
+#line 3261
    /* update xpp and tp */
+#line 3261
     xp += ni;
+#line 3261
     tp += ni;
+#line 3261
     *xpp = (void*)xp;
+#line 3261
   }
+#line 3261
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3261
 
+#line 3261
 #else   /* not SX */
+#line 3261
 
+#line 3261
 	char *xp = (char *) *xpp;
+#line 3261
 	int status = NC_NOERR;
+#line 3261
 
+#line 3261
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3261
 	{
-		int lstatus = ncx_put_int_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3261
+		int lstatus = ncx_put_int_short(xp, tp, fillp);
+#line 3261
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3261
 			status = lstatus;
+#line 3261
 	}
+#line 3261
 
+#line 3261
 	*xpp = (void *)xp;
+#line 3261
 	return status;
+#line 3261
 #endif
+#line 3261
 }
+#line 3261
 
 int
-ncx_putn_int_short(void **xpp, size_t nelems, const short *tp)
+#line 3262
+ncx_putn_int_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3262
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3262
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3262
 
+#line 3262
  /* basic algorithm is:
+#line 3262
   *   - ensure sane alignment of output data
+#line 3262
   *   - copy (conversion happens automatically) input data
+#line 3262
   *     to output
+#line 3262
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3262
   *     at next location for converted output
+#line 3262
   */
+#line 3262
   long i, j, ni;
+#line 3262
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3262
   int *xp;
+#line 3262
   int nrange = 0;         /* number of range errors */
+#line 3262
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3262
   long cxp = (long) *((char**)xpp);
+#line 3262
 
+#line 3262
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3262
   /* sjl: manually stripmine so we can limit amount of
+#line 3262
    * vector work space reserved to LOOPCNT elements. Also
+#line 3262
    * makes vectorisation easy */
+#line 3262
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3262
     ni=Min(nelems-j,LOOPCNT);
+#line 3262
     if (realign) {
+#line 3262
       xp = tmp;
+#line 3262
     } else {
+#line 3262
       xp = (int *) *xpp;
+#line 3262
     }
+#line 3262
    /* copy the next block */
+#line 3262
 #pragma cdir loopcnt=LOOPCNT
+#line 3262
 #pragma cdir shortloop
+#line 3262
     for (i=0; i<ni; i++) {
+#line 3262
       /* the normal case: */
+#line 3262
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3262
      /* test for range errors (not always needed but do it anyway) */
+#line 3262
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3262
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3262
       nrange += tp[i] > X_INT_MAX || tp[i] < X_INT_MIN;
+#line 3262
     }
+#line 3262
    /* copy workspace back if necessary */
+#line 3262
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3262
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3262
       xp = (int *) *xpp;
+#line 3262
     }
+#line 3262
    /* update xpp and tp */
+#line 3262
     xp += ni;
+#line 3262
     tp += ni;
+#line 3262
     *xpp = (void*)xp;
+#line 3262
   }
+#line 3262
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3262
 
+#line 3262
 #else   /* not SX */
+#line 3262
 
+#line 3262
 	char *xp = (char *) *xpp;
+#line 3262
 	int status = NC_NOERR;
+#line 3262
 
+#line 3262
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3262
 	{
-		int lstatus = ncx_put_int_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3262
+		int lstatus = ncx_put_int_long(xp, tp, fillp);
+#line 3262
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3262
 			status = lstatus;
+#line 3262
 	}
+#line 3262
 
+#line 3262
 	*xpp = (void *)xp;
+#line 3262
 	return status;
+#line 3262
 #endif
+#line 3262
 }
+#line 3262
 
 int
-ncx_putn_int_float(void **xpp, size_t nelems, const float *tp)
+#line 3263
+ncx_putn_int_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3263
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3263
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3263
 
+#line 3263
  /* basic algorithm is:
+#line 3263
   *   - ensure sane alignment of output data
+#line 3263
   *   - copy (conversion happens automatically) input data
+#line 3263
   *     to output
+#line 3263
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3263
   *     at next location for converted output
+#line 3263
   */
+#line 3263
   long i, j, ni;
+#line 3263
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3263
   int *xp;
+#line 3263
   double d;               /* special case for ncx_putn_int_float */
+#line 3263
   int nrange = 0;         /* number of range errors */
+#line 3263
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3263
   long cxp = (long) *((char**)xpp);
+#line 3263
 
+#line 3263
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3263
   /* sjl: manually stripmine so we can limit amount of
+#line 3263
    * vector work space reserved to LOOPCNT elements. Also
+#line 3263
    * makes vectorisation easy */
+#line 3263
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3263
     ni=Min(nelems-j,LOOPCNT);
+#line 3263
     if (realign) {
+#line 3263
       xp = tmp;
+#line 3263
     } else {
+#line 3263
       xp = (int *) *xpp;
+#line 3263
     }
+#line 3263
    /* copy the next block */
+#line 3263
 #pragma cdir loopcnt=LOOPCNT
+#line 3263
 #pragma cdir shortloop
+#line 3263
     for (i=0; i<ni; i++) {
+#line 3263
       /* for some reason int to float, for putn, requires a special case */
+#line 3263
       d = tp[i];
+#line 3263
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) d));
+#line 3263
       nrange += tp[i] > X_INT_MAX || tp[i] < X_INT_MIN;
+#line 3263
     }
+#line 3263
    /* copy workspace back if necessary */
+#line 3263
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3263
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3263
       xp = (int *) *xpp;
+#line 3263
     }
+#line 3263
    /* update xpp and tp */
+#line 3263
     xp += ni;
+#line 3263
     tp += ni;
+#line 3263
     *xpp = (void*)xp;
+#line 3263
   }
+#line 3263
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3263
 
+#line 3263
 #else   /* not SX */
+#line 3263
 
+#line 3263
 	char *xp = (char *) *xpp;
+#line 3263
 	int status = NC_NOERR;
+#line 3263
 
+#line 3263
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3263
 	{
-		int lstatus = ncx_put_int_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3263
+		int lstatus = ncx_put_int_float(xp, tp, fillp);
+#line 3263
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3263
 			status = lstatus;
+#line 3263
 	}
+#line 3263
 
+#line 3263
 	*xpp = (void *)xp;
+#line 3263
 	return status;
+#line 3263
 #endif
+#line 3263
 }
+#line 3263
 
 int
-ncx_putn_int_double(void **xpp, size_t nelems, const double *tp)
+#line 3264
+ncx_putn_int_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3264
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3264
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3264
 
+#line 3264
  /* basic algorithm is:
+#line 3264
   *   - ensure sane alignment of output data
+#line 3264
   *   - copy (conversion happens automatically) input data
+#line 3264
   *     to output
+#line 3264
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3264
   *     at next location for converted output
+#line 3264
   */
+#line 3264
   long i, j, ni;
+#line 3264
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3264
   int *xp;
+#line 3264
   int nrange = 0;         /* number of range errors */
+#line 3264
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3264
   long cxp = (long) *((char**)xpp);
+#line 3264
 
+#line 3264
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3264
   /* sjl: manually stripmine so we can limit amount of
+#line 3264
    * vector work space reserved to LOOPCNT elements. Also
+#line 3264
    * makes vectorisation easy */
+#line 3264
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3264
     ni=Min(nelems-j,LOOPCNT);
+#line 3264
     if (realign) {
+#line 3264
       xp = tmp;
+#line 3264
     } else {
+#line 3264
       xp = (int *) *xpp;
+#line 3264
     }
+#line 3264
    /* copy the next block */
+#line 3264
 #pragma cdir loopcnt=LOOPCNT
+#line 3264
 #pragma cdir shortloop
+#line 3264
     for (i=0; i<ni; i++) {
+#line 3264
       /* the normal case: */
+#line 3264
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3264
      /* test for range errors (not always needed but do it anyway) */
+#line 3264
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3264
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3264
       nrange += tp[i] > X_INT_MAX || tp[i] < X_INT_MIN;
+#line 3264
     }
+#line 3264
    /* copy workspace back if necessary */
+#line 3264
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3264
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3264
       xp = (int *) *xpp;
+#line 3264
     }
+#line 3264
    /* update xpp and tp */
+#line 3264
     xp += ni;
+#line 3264
     tp += ni;
+#line 3264
     *xpp = (void*)xp;
+#line 3264
   }
+#line 3264
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3264
 
+#line 3264
 #else   /* not SX */
+#line 3264
 
+#line 3264
 	char *xp = (char *) *xpp;
+#line 3264
 	int status = NC_NOERR;
+#line 3264
 
+#line 3264
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3264
 	{
-		int lstatus = ncx_put_int_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3264
+		int lstatus = ncx_put_int_double(xp, tp, fillp);
+#line 3264
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3264
 			status = lstatus;
+#line 3264
 	}
+#line 3264
 
+#line 3264
 	*xpp = (void *)xp;
+#line 3264
 	return status;
+#line 3264
 #endif
+#line 3264
 }
+#line 3264
 
 int
-ncx_putn_int_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3265
+ncx_putn_int_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3265
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3265
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3265
 
+#line 3265
  /* basic algorithm is:
+#line 3265
   *   - ensure sane alignment of output data
+#line 3265
   *   - copy (conversion happens automatically) input data
+#line 3265
   *     to output
+#line 3265
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3265
   *     at next location for converted output
+#line 3265
   */
+#line 3265
   long i, j, ni;
+#line 3265
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3265
   int *xp;
+#line 3265
   int nrange = 0;         /* number of range errors */
+#line 3265
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3265
   long cxp = (long) *((char**)xpp);
+#line 3265
 
+#line 3265
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3265
   /* sjl: manually stripmine so we can limit amount of
+#line 3265
    * vector work space reserved to LOOPCNT elements. Also
+#line 3265
    * makes vectorisation easy */
+#line 3265
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3265
     ni=Min(nelems-j,LOOPCNT);
+#line 3265
     if (realign) {
+#line 3265
       xp = tmp;
+#line 3265
     } else {
+#line 3265
       xp = (int *) *xpp;
+#line 3265
     }
+#line 3265
    /* copy the next block */
+#line 3265
 #pragma cdir loopcnt=LOOPCNT
+#line 3265
 #pragma cdir shortloop
+#line 3265
     for (i=0; i<ni; i++) {
+#line 3265
       /* the normal case: */
+#line 3265
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3265
      /* test for range errors (not always needed but do it anyway) */
+#line 3265
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3265
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3265
       nrange += tp[i] > X_INT_MAX || tp[i] < X_INT_MIN;
+#line 3265
     }
+#line 3265
    /* copy workspace back if necessary */
+#line 3265
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3265
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3265
       xp = (int *) *xpp;
+#line 3265
     }
+#line 3265
    /* update xpp and tp */
+#line 3265
     xp += ni;
+#line 3265
     tp += ni;
+#line 3265
     *xpp = (void*)xp;
+#line 3265
   }
+#line 3265
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3265
 
+#line 3265
 #else   /* not SX */
+#line 3265
 
+#line 3265
 	char *xp = (char *) *xpp;
+#line 3265
 	int status = NC_NOERR;
+#line 3265
 
+#line 3265
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3265
 	{
-		int lstatus = ncx_put_int_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3265
+		int lstatus = ncx_put_int_longlong(xp, tp, fillp);
+#line 3265
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3265
 			status = lstatus;
+#line 3265
 	}
+#line 3265
 
+#line 3265
 	*xpp = (void *)xp;
+#line 3265
 	return status;
+#line 3265
 #endif
+#line 3265
 }
+#line 3265
 
 int
-ncx_putn_int_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3266
+ncx_putn_int_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3266
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3266
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3266
 
+#line 3266
  /* basic algorithm is:
+#line 3266
   *   - ensure sane alignment of output data
+#line 3266
   *   - copy (conversion happens automatically) input data
+#line 3266
   *     to output
+#line 3266
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3266
   *     at next location for converted output
+#line 3266
   */
+#line 3266
   long i, j, ni;
+#line 3266
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3266
   int *xp;
+#line 3266
   int nrange = 0;         /* number of range errors */
+#line 3266
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3266
   long cxp = (long) *((char**)xpp);
+#line 3266
 
+#line 3266
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3266
   /* sjl: manually stripmine so we can limit amount of
+#line 3266
    * vector work space reserved to LOOPCNT elements. Also
+#line 3266
    * makes vectorisation easy */
+#line 3266
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3266
     ni=Min(nelems-j,LOOPCNT);
+#line 3266
     if (realign) {
+#line 3266
       xp = tmp;
+#line 3266
     } else {
+#line 3266
       xp = (int *) *xpp;
+#line 3266
     }
+#line 3266
    /* copy the next block */
+#line 3266
 #pragma cdir loopcnt=LOOPCNT
+#line 3266
 #pragma cdir shortloop
+#line 3266
     for (i=0; i<ni; i++) {
+#line 3266
       /* the normal case: */
+#line 3266
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3266
      /* test for range errors (not always needed but do it anyway) */
+#line 3266
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3266
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3266
       nrange += tp[i] > X_INT_MAX ;
+#line 3266
     }
+#line 3266
    /* copy workspace back if necessary */
+#line 3266
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3266
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3266
       xp = (int *) *xpp;
+#line 3266
     }
+#line 3266
    /* update xpp and tp */
+#line 3266
     xp += ni;
+#line 3266
     tp += ni;
+#line 3266
     *xpp = (void*)xp;
+#line 3266
   }
+#line 3266
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3266
 
+#line 3266
 #else   /* not SX */
+#line 3266
 
+#line 3266
 	char *xp = (char *) *xpp;
+#line 3266
 	int status = NC_NOERR;
+#line 3266
 
+#line 3266
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3266
 	{
-		int lstatus = ncx_put_int_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3266
+		int lstatus = ncx_put_int_uchar(xp, tp, fillp);
+#line 3266
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3266
 			status = lstatus;
+#line 3266
 	}
+#line 3266
 
+#line 3266
 	*xpp = (void *)xp;
+#line 3266
 	return status;
+#line 3266
 #endif
+#line 3266
 }
+#line 3266
 
 int
-ncx_putn_int_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3267
+ncx_putn_int_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3267
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3267
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3267
 
+#line 3267
  /* basic algorithm is:
+#line 3267
   *   - ensure sane alignment of output data
+#line 3267
   *   - copy (conversion happens automatically) input data
+#line 3267
   *     to output
+#line 3267
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3267
   *     at next location for converted output
+#line 3267
   */
+#line 3267
   long i, j, ni;
+#line 3267
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3267
   int *xp;
+#line 3267
   int nrange = 0;         /* number of range errors */
+#line 3267
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3267
   long cxp = (long) *((char**)xpp);
+#line 3267
 
+#line 3267
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3267
   /* sjl: manually stripmine so we can limit amount of
+#line 3267
    * vector work space reserved to LOOPCNT elements. Also
+#line 3267
    * makes vectorisation easy */
+#line 3267
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3267
     ni=Min(nelems-j,LOOPCNT);
+#line 3267
     if (realign) {
+#line 3267
       xp = tmp;
+#line 3267
     } else {
+#line 3267
       xp = (int *) *xpp;
+#line 3267
     }
+#line 3267
    /* copy the next block */
+#line 3267
 #pragma cdir loopcnt=LOOPCNT
+#line 3267
 #pragma cdir shortloop
+#line 3267
     for (i=0; i<ni; i++) {
+#line 3267
       /* the normal case: */
+#line 3267
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3267
      /* test for range errors (not always needed but do it anyway) */
+#line 3267
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3267
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3267
       nrange += tp[i] > X_INT_MAX ;
+#line 3267
     }
+#line 3267
    /* copy workspace back if necessary */
+#line 3267
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3267
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3267
       xp = (int *) *xpp;
+#line 3267
     }
+#line 3267
    /* update xpp and tp */
+#line 3267
     xp += ni;
+#line 3267
     tp += ni;
+#line 3267
     *xpp = (void*)xp;
+#line 3267
   }
+#line 3267
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3267
 
+#line 3267
 #else   /* not SX */
+#line 3267
 
+#line 3267
 	char *xp = (char *) *xpp;
+#line 3267
 	int status = NC_NOERR;
+#line 3267
 
+#line 3267
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3267
 	{
-		int lstatus = ncx_put_int_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3267
+		int lstatus = ncx_put_int_ushort(xp, tp, fillp);
+#line 3267
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3267
 			status = lstatus;
+#line 3267
 	}
+#line 3267
 
+#line 3267
 	*xpp = (void *)xp;
+#line 3267
 	return status;
+#line 3267
 #endif
+#line 3267
 }
+#line 3267
 
 int
-ncx_putn_int_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3268
+ncx_putn_int_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3268
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3268
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3268
 
+#line 3268
  /* basic algorithm is:
+#line 3268
   *   - ensure sane alignment of output data
+#line 3268
   *   - copy (conversion happens automatically) input data
+#line 3268
   *     to output
+#line 3268
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3268
   *     at next location for converted output
+#line 3268
   */
+#line 3268
   long i, j, ni;
+#line 3268
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3268
   int *xp;
+#line 3268
   int nrange = 0;         /* number of range errors */
+#line 3268
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3268
   long cxp = (long) *((char**)xpp);
+#line 3268
 
+#line 3268
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3268
   /* sjl: manually stripmine so we can limit amount of
+#line 3268
    * vector work space reserved to LOOPCNT elements. Also
+#line 3268
    * makes vectorisation easy */
+#line 3268
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3268
     ni=Min(nelems-j,LOOPCNT);
+#line 3268
     if (realign) {
+#line 3268
       xp = tmp;
+#line 3268
     } else {
+#line 3268
       xp = (int *) *xpp;
+#line 3268
     }
+#line 3268
    /* copy the next block */
+#line 3268
 #pragma cdir loopcnt=LOOPCNT
+#line 3268
 #pragma cdir shortloop
+#line 3268
     for (i=0; i<ni; i++) {
+#line 3268
       /* the normal case: */
+#line 3268
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3268
      /* test for range errors (not always needed but do it anyway) */
+#line 3268
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3268
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3268
       nrange += tp[i] > X_INT_MAX ;
+#line 3268
     }
+#line 3268
    /* copy workspace back if necessary */
+#line 3268
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3268
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3268
       xp = (int *) *xpp;
+#line 3268
     }
+#line 3268
    /* update xpp and tp */
+#line 3268
     xp += ni;
+#line 3268
     tp += ni;
+#line 3268
     *xpp = (void*)xp;
+#line 3268
   }
+#line 3268
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3268
 
+#line 3268
 #else   /* not SX */
+#line 3268
 
+#line 3268
 	char *xp = (char *) *xpp;
+#line 3268
 	int status = NC_NOERR;
+#line 3268
 
+#line 3268
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3268
 	{
-		int lstatus = ncx_put_int_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3268
+		int lstatus = ncx_put_int_uint(xp, tp, fillp);
+#line 3268
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3268
 			status = lstatus;
+#line 3268
 	}
+#line 3268
 
+#line 3268
 	*xpp = (void *)xp;
+#line 3268
 	return status;
+#line 3268
 #endif
+#line 3268
 }
+#line 3268
 
 int
-ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3269
+ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3269
 {
-#if _SX && X_SIZEOF_INT == SIZEOF_INT
+#line 3269
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT == SIZEOF_INT
+#line 3269
 
+#line 3269
  /* basic algorithm is:
+#line 3269
   *   - ensure sane alignment of output data
+#line 3269
   *   - copy (conversion happens automatically) input data
+#line 3269
   *     to output
+#line 3269
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3269
   *     at next location for converted output
+#line 3269
   */
+#line 3269
   long i, j, ni;
+#line 3269
   int tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3269
   int *xp;
+#line 3269
   int nrange = 0;         /* number of range errors */
+#line 3269
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3269
   long cxp = (long) *((char**)xpp);
+#line 3269
 
+#line 3269
   realign = (cxp & 7) % SIZEOF_INT;
+#line 3269
   /* sjl: manually stripmine so we can limit amount of
+#line 3269
    * vector work space reserved to LOOPCNT elements. Also
+#line 3269
    * makes vectorisation easy */
+#line 3269
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3269
     ni=Min(nelems-j,LOOPCNT);
+#line 3269
     if (realign) {
+#line 3269
       xp = tmp;
+#line 3269
     } else {
+#line 3269
       xp = (int *) *xpp;
+#line 3269
     }
+#line 3269
    /* copy the next block */
+#line 3269
 #pragma cdir loopcnt=LOOPCNT
+#line 3269
 #pragma cdir shortloop
+#line 3269
     for (i=0; i<ni; i++) {
+#line 3269
       /* the normal case: */
+#line 3269
       xp[i] = (int) Max( X_INT_MIN, Min(X_INT_MAX, (int) tp[i]));
+#line 3269
      /* test for range errors (not always needed but do it anyway) */
+#line 3269
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3269
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3269
       nrange += tp[i] > X_INT_MAX ;
+#line 3269
     }
+#line 3269
    /* copy workspace back if necessary */
+#line 3269
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_INT);
+#line 3269
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT);
+#line 3269
       xp = (int *) *xpp;
+#line 3269
     }
+#line 3269
    /* update xpp and tp */
+#line 3269
     xp += ni;
+#line 3269
     tp += ni;
+#line 3269
     *xpp = (void*)xp;
+#line 3269
   }
+#line 3269
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3269
 
+#line 3269
 #else   /* not SX */
+#line 3269
 
+#line 3269
 	char *xp = (char *) *xpp;
+#line 3269
 	int status = NC_NOERR;
+#line 3269
 
+#line 3269
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++)
+#line 3269
 	{
-		int lstatus = ncx_put_int_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3269
+		int lstatus = ncx_put_int_ulonglong(xp, tp, fillp);
+#line 3269
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3269
 			status = lstatus;
+#line 3269
 	}
+#line 3269
 
+#line 3269
 	*xpp = (void *)xp;
+#line 3269
 	return status;
+#line 3269
 #endif
+#line 3269
 }
+#line 3269
 
 
 /* uint ----------------------------------------------------------------------*/
@@ -10265,7 +22387,7 @@ int
 ncx_getn_uint_uint(const void **xpp, size_t nelems, unsigned int *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(uint));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_UINT);
 # else
 	swapn4b(tp, *xpp, nelems);
 # endif
@@ -10274,664 +22396,1433 @@ ncx_getn_uint_uint(const void **xpp, size_t nelems, unsigned int *tp)
 }
 #else
 int
+#line 3287
 ncx_getn_uint_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3287
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3287
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3287
 
+#line 3287
  /* basic algorithm is:
+#line 3287
   *   - ensure sane alignment of input data
+#line 3287
   *   - copy (conversion happens automatically) input data
+#line 3287
   *     to output
+#line 3287
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3287
   *     at next location for converted output
+#line 3287
   */
+#line 3287
   long i, j, ni;
+#line 3287
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3287
   uint *xp;
+#line 3287
   int nrange = 0;         /* number of range errors */
+#line 3287
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3287
   long cxp = (long) *((char**)xpp);
+#line 3287
 
+#line 3287
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3287
   /* sjl: manually stripmine so we can limit amount of
+#line 3287
    * vector work space reserved to LOOPCNT elements. Also
+#line 3287
    * makes vectorisation easy */
+#line 3287
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3287
     ni=Min(nelems-j,LOOPCNT);
+#line 3287
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3287
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3287
       xp = tmp;
+#line 3287
     } else {
+#line 3287
       xp = (uint *) *xpp;
+#line 3287
     }
+#line 3287
    /* copy the next block */
+#line 3287
 #pragma cdir loopcnt=LOOPCNT
+#line 3287
 #pragma cdir shortloop
+#line 3287
     for (i=0; i<ni; i++) {
+#line 3287
       tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3287
      /* test for range errors (not always needed but do it anyway) */
+#line 3287
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3287
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3287
       nrange += xp[i] > UINT_MAX ;
+#line 3287
     }
+#line 3287
    /* update xpp and tp */
+#line 3287
     if (realign) xp = (uint *) *xpp;
+#line 3287
     xp += ni;
+#line 3287
     tp += ni;
+#line 3287
     *xpp = (void*)xp;
+#line 3287
   }
+#line 3287
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3287
 
+#line 3287
 #else   /* not SX */
+#line 3287
 	const char *xp = (const char *) *xpp;
+#line 3287
 	int status = NC_NOERR;
+#line 3287
 
+#line 3287
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3287
 	{
+#line 3287
 		const int lstatus = ncx_get_uint_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3287
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3287
 			status = lstatus;
+#line 3287
 	}
+#line 3287
 
+#line 3287
 	*xpp = (const void *)xp;
+#line 3287
 	return status;
-#  endif
+#line 3287
+#endif
+#line 3287
 }
+#line 3287
 
 #endif
 int
+#line 3289
 ncx_getn_uint_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3289
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3289
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3289
 
+#line 3289
  /* basic algorithm is:
+#line 3289
   *   - ensure sane alignment of input data
+#line 3289
   *   - copy (conversion happens automatically) input data
+#line 3289
   *     to output
+#line 3289
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3289
   *     at next location for converted output
+#line 3289
   */
+#line 3289
   long i, j, ni;
+#line 3289
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3289
   uint *xp;
+#line 3289
   int nrange = 0;         /* number of range errors */
+#line 3289
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3289
   long cxp = (long) *((char**)xpp);
+#line 3289
 
+#line 3289
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3289
   /* sjl: manually stripmine so we can limit amount of
+#line 3289
    * vector work space reserved to LOOPCNT elements. Also
+#line 3289
    * makes vectorisation easy */
+#line 3289
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3289
     ni=Min(nelems-j,LOOPCNT);
+#line 3289
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3289
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3289
       xp = tmp;
+#line 3289
     } else {
+#line 3289
       xp = (uint *) *xpp;
+#line 3289
     }
+#line 3289
    /* copy the next block */
+#line 3289
 #pragma cdir loopcnt=LOOPCNT
+#line 3289
 #pragma cdir shortloop
+#line 3289
     for (i=0; i<ni; i++) {
+#line 3289
       tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3289
      /* test for range errors (not always needed but do it anyway) */
+#line 3289
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3289
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3289
       nrange += xp[i] > SCHAR_MAX ;
+#line 3289
     }
+#line 3289
    /* update xpp and tp */
+#line 3289
     if (realign) xp = (uint *) *xpp;
+#line 3289
     xp += ni;
+#line 3289
     tp += ni;
+#line 3289
     *xpp = (void*)xp;
+#line 3289
   }
+#line 3289
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3289
 
+#line 3289
 #else   /* not SX */
+#line 3289
 	const char *xp = (const char *) *xpp;
+#line 3289
 	int status = NC_NOERR;
+#line 3289
 
+#line 3289
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3289
 	{
+#line 3289
 		const int lstatus = ncx_get_uint_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3289
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3289
 			status = lstatus;
+#line 3289
 	}
+#line 3289
 
+#line 3289
 	*xpp = (const void *)xp;
+#line 3289
 	return status;
-#  endif
+#line 3289
+#endif
+#line 3289
 }
+#line 3289
 
 int
+#line 3290
 ncx_getn_uint_short(const void **xpp, size_t nelems, short *tp)
+#line 3290
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3290
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3290
 
+#line 3290
  /* basic algorithm is:
+#line 3290
   *   - ensure sane alignment of input data
+#line 3290
   *   - copy (conversion happens automatically) input data
+#line 3290
   *     to output
+#line 3290
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3290
   *     at next location for converted output
+#line 3290
   */
+#line 3290
   long i, j, ni;
+#line 3290
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3290
   uint *xp;
+#line 3290
   int nrange = 0;         /* number of range errors */
+#line 3290
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3290
   long cxp = (long) *((char**)xpp);
+#line 3290
 
+#line 3290
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3290
   /* sjl: manually stripmine so we can limit amount of
+#line 3290
    * vector work space reserved to LOOPCNT elements. Also
+#line 3290
    * makes vectorisation easy */
+#line 3290
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3290
     ni=Min(nelems-j,LOOPCNT);
+#line 3290
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3290
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3290
       xp = tmp;
+#line 3290
     } else {
+#line 3290
       xp = (uint *) *xpp;
+#line 3290
     }
+#line 3290
    /* copy the next block */
+#line 3290
 #pragma cdir loopcnt=LOOPCNT
+#line 3290
 #pragma cdir shortloop
+#line 3290
     for (i=0; i<ni; i++) {
+#line 3290
       tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3290
      /* test for range errors (not always needed but do it anyway) */
+#line 3290
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3290
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3290
       nrange += xp[i] > SHORT_MAX ;
+#line 3290
     }
+#line 3290
    /* update xpp and tp */
+#line 3290
     if (realign) xp = (uint *) *xpp;
+#line 3290
     xp += ni;
+#line 3290
     tp += ni;
+#line 3290
     *xpp = (void*)xp;
+#line 3290
   }
+#line 3290
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3290
 
+#line 3290
 #else   /* not SX */
+#line 3290
 	const char *xp = (const char *) *xpp;
+#line 3290
 	int status = NC_NOERR;
+#line 3290
 
+#line 3290
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3290
 	{
+#line 3290
 		const int lstatus = ncx_get_uint_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3290
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3290
 			status = lstatus;
+#line 3290
 	}
+#line 3290
 
+#line 3290
 	*xpp = (const void *)xp;
+#line 3290
 	return status;
-#  endif
+#line 3290
+#endif
+#line 3290
 }
+#line 3290
 
 int
+#line 3291
 ncx_getn_uint_int(const void **xpp, size_t nelems, int *tp)
+#line 3291
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3291
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3291
 
+#line 3291
  /* basic algorithm is:
+#line 3291
   *   - ensure sane alignment of input data
+#line 3291
   *   - copy (conversion happens automatically) input data
+#line 3291
   *     to output
+#line 3291
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3291
   *     at next location for converted output
+#line 3291
   */
+#line 3291
   long i, j, ni;
+#line 3291
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3291
   uint *xp;
+#line 3291
   int nrange = 0;         /* number of range errors */
+#line 3291
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3291
   long cxp = (long) *((char**)xpp);
+#line 3291
 
+#line 3291
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3291
   /* sjl: manually stripmine so we can limit amount of
+#line 3291
    * vector work space reserved to LOOPCNT elements. Also
+#line 3291
    * makes vectorisation easy */
+#line 3291
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3291
     ni=Min(nelems-j,LOOPCNT);
+#line 3291
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3291
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3291
       xp = tmp;
+#line 3291
     } else {
+#line 3291
       xp = (uint *) *xpp;
+#line 3291
     }
+#line 3291
    /* copy the next block */
+#line 3291
 #pragma cdir loopcnt=LOOPCNT
+#line 3291
 #pragma cdir shortloop
+#line 3291
     for (i=0; i<ni; i++) {
+#line 3291
       tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3291
      /* test for range errors (not always needed but do it anyway) */
+#line 3291
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3291
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3291
       nrange += xp[i] > INT_MAX ;
+#line 3291
     }
+#line 3291
    /* update xpp and tp */
+#line 3291
     if (realign) xp = (uint *) *xpp;
+#line 3291
     xp += ni;
+#line 3291
     tp += ni;
+#line 3291
     *xpp = (void*)xp;
+#line 3291
   }
+#line 3291
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3291
 
+#line 3291
 #else   /* not SX */
+#line 3291
 	const char *xp = (const char *) *xpp;
+#line 3291
 	int status = NC_NOERR;
+#line 3291
 
+#line 3291
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3291
 	{
+#line 3291
 		const int lstatus = ncx_get_uint_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3291
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3291
+			status = lstatus;
+#line 3291
+	}
+#line 3291
+
+#line 3291
+	*xpp = (const void *)xp;
+#line 3291
+	return status;
+#line 3291
+#endif
+#line 3291
+}
+#line 3291
+
+int
+#line 3292
+ncx_getn_uint_long(const void **xpp, size_t nelems, long *tp)
+#line 3292
+{
+#line 3292
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3292
+
+#line 3292
+ /* basic algorithm is:
+#line 3292
+  *   - ensure sane alignment of input data
+#line 3292
+  *   - copy (conversion happens automatically) input data
+#line 3292
+  *     to output
+#line 3292
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3292
+  *     at next location for converted output
+#line 3292
+  */
+#line 3292
+  long i, j, ni;
+#line 3292
+  uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3292
+  uint *xp;
+#line 3292
+  int nrange = 0;         /* number of range errors */
+#line 3292
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3292
+  long cxp = (long) *((char**)xpp);
+#line 3292
+
+#line 3292
+  realign = (cxp & 7) % SIZEOF_UINT;
+#line 3292
+  /* sjl: manually stripmine so we can limit amount of
+#line 3292
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3292
+   * makes vectorisation easy */
+#line 3292
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3292
+    ni=Min(nelems-j,LOOPCNT);
+#line 3292
+    if (realign) {
+#line 3292
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3292
+      xp = tmp;
+#line 3292
+    } else {
+#line 3292
+      xp = (uint *) *xpp;
+#line 3292
+    }
+#line 3292
+   /* copy the next block */
+#line 3292
+#pragma cdir loopcnt=LOOPCNT
+#line 3292
+#pragma cdir shortloop
+#line 3292
+    for (i=0; i<ni; i++) {
+#line 3292
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3292
+     /* test for range errors (not always needed but do it anyway) */
+#line 3292
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3292
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3292
+      nrange += xp[i] > LONG_MAX ;
+#line 3292
+    }
+#line 3292
+   /* update xpp and tp */
+#line 3292
+    if (realign) xp = (uint *) *xpp;
+#line 3292
+    xp += ni;
+#line 3292
+    tp += ni;
+#line 3292
+    *xpp = (void*)xp;
+#line 3292
+  }
+#line 3292
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3292
+
+#line 3292
+#else   /* not SX */
+#line 3292
+	const char *xp = (const char *) *xpp;
+#line 3292
+	int status = NC_NOERR;
+#line 3292
+
+#line 3292
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3292
+	{
+#line 3292
+		const int lstatus = ncx_get_uint_long(xp, tp);
+#line 3292
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3292
 			status = lstatus;
+#line 3292
 	}
+#line 3292
 
+#line 3292
 	*xpp = (const void *)xp;
+#line 3292
 	return status;
-#  endif
+#line 3292
+#endif
+#line 3292
 }
+#line 3292
 
 int
+#line 3293
 ncx_getn_uint_float(const void **xpp, size_t nelems, float *tp)
+#line 3293
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3293
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3293
 
+#line 3293
  /* basic algorithm is:
+#line 3293
   *   - ensure sane alignment of input data
+#line 3293
   *   - copy (conversion happens automatically) input data
+#line 3293
   *     to output
+#line 3293
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3293
   *     at next location for converted output
+#line 3293
   */
+#line 3293
   long i, j, ni;
+#line 3293
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3293
   uint *xp;
+#line 3293
   int nrange = 0;         /* number of range errors */
+#line 3293
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3293
   long cxp = (long) *((char**)xpp);
+#line 3293
 
+#line 3293
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3293
   /* sjl: manually stripmine so we can limit amount of
+#line 3293
    * vector work space reserved to LOOPCNT elements. Also
+#line 3293
    * makes vectorisation easy */
+#line 3293
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3293
     ni=Min(nelems-j,LOOPCNT);
+#line 3293
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3293
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3293
       xp = tmp;
+#line 3293
     } else {
+#line 3293
       xp = (uint *) *xpp;
+#line 3293
     }
+#line 3293
    /* copy the next block */
+#line 3293
 #pragma cdir loopcnt=LOOPCNT
+#line 3293
 #pragma cdir shortloop
+#line 3293
     for (i=0; i<ni; i++) {
+#line 3293
       tp[i] = (float) Max( FLOAT_MIN, Min(FLOAT_MAX, (float) xp[i]));
+#line 3293
      /* test for range errors (not always needed but do it anyway) */
+#line 3293
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3293
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3293
       nrange += xp[i] > FLOAT_MAX ;
+#line 3293
     }
+#line 3293
    /* update xpp and tp */
+#line 3293
     if (realign) xp = (uint *) *xpp;
+#line 3293
     xp += ni;
+#line 3293
     tp += ni;
+#line 3293
     *xpp = (void*)xp;
+#line 3293
   }
+#line 3293
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3293
 
+#line 3293
 #else   /* not SX */
+#line 3293
 	const char *xp = (const char *) *xpp;
+#line 3293
 	int status = NC_NOERR;
+#line 3293
 
+#line 3293
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3293
 	{
+#line 3293
 		const int lstatus = ncx_get_uint_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3293
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3293
 			status = lstatus;
+#line 3293
 	}
+#line 3293
 
+#line 3293
 	*xpp = (const void *)xp;
+#line 3293
 	return status;
-#  endif
+#line 3293
+#endif
+#line 3293
 }
+#line 3293
 
 int
+#line 3294
 ncx_getn_uint_double(const void **xpp, size_t nelems, double *tp)
+#line 3294
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3294
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3294
 
+#line 3294
  /* basic algorithm is:
+#line 3294
   *   - ensure sane alignment of input data
+#line 3294
   *   - copy (conversion happens automatically) input data
+#line 3294
   *     to output
+#line 3294
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3294
   *     at next location for converted output
+#line 3294
   */
+#line 3294
   long i, j, ni;
+#line 3294
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3294
   uint *xp;
+#line 3294
   int nrange = 0;         /* number of range errors */
+#line 3294
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3294
   long cxp = (long) *((char**)xpp);
+#line 3294
 
+#line 3294
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3294
   /* sjl: manually stripmine so we can limit amount of
+#line 3294
    * vector work space reserved to LOOPCNT elements. Also
+#line 3294
    * makes vectorisation easy */
+#line 3294
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3294
     ni=Min(nelems-j,LOOPCNT);
+#line 3294
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3294
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3294
       xp = tmp;
+#line 3294
     } else {
+#line 3294
       xp = (uint *) *xpp;
+#line 3294
     }
+#line 3294
    /* copy the next block */
+#line 3294
 #pragma cdir loopcnt=LOOPCNT
+#line 3294
 #pragma cdir shortloop
+#line 3294
     for (i=0; i<ni; i++) {
+#line 3294
       tp[i] = (double) Max( DOUBLE_MIN, Min(DOUBLE_MAX, (double) xp[i]));
+#line 3294
      /* test for range errors (not always needed but do it anyway) */
+#line 3294
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3294
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3294
       nrange += xp[i] > DOUBLE_MAX ;
+#line 3294
     }
+#line 3294
    /* update xpp and tp */
+#line 3294
     if (realign) xp = (uint *) *xpp;
+#line 3294
     xp += ni;
+#line 3294
     tp += ni;
+#line 3294
     *xpp = (void*)xp;
+#line 3294
   }
+#line 3294
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3294
 
+#line 3294
 #else   /* not SX */
+#line 3294
 	const char *xp = (const char *) *xpp;
+#line 3294
 	int status = NC_NOERR;
+#line 3294
 
+#line 3294
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3294
 	{
+#line 3294
 		const int lstatus = ncx_get_uint_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3294
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3294
 			status = lstatus;
+#line 3294
 	}
+#line 3294
 
+#line 3294
 	*xpp = (const void *)xp;
+#line 3294
 	return status;
-#  endif
+#line 3294
+#endif
+#line 3294
 }
+#line 3294
 
 int
+#line 3295
 ncx_getn_uint_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3295
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3295
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3295
 
+#line 3295
  /* basic algorithm is:
+#line 3295
   *   - ensure sane alignment of input data
+#line 3295
   *   - copy (conversion happens automatically) input data
+#line 3295
   *     to output
+#line 3295
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3295
   *     at next location for converted output
+#line 3295
   */
+#line 3295
   long i, j, ni;
+#line 3295
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3295
   uint *xp;
+#line 3295
   int nrange = 0;         /* number of range errors */
+#line 3295
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3295
   long cxp = (long) *((char**)xpp);
+#line 3295
 
+#line 3295
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3295
   /* sjl: manually stripmine so we can limit amount of
+#line 3295
    * vector work space reserved to LOOPCNT elements. Also
+#line 3295
    * makes vectorisation easy */
+#line 3295
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3295
     ni=Min(nelems-j,LOOPCNT);
+#line 3295
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3295
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3295
       xp = tmp;
+#line 3295
     } else {
+#line 3295
       xp = (uint *) *xpp;
+#line 3295
     }
+#line 3295
    /* copy the next block */
+#line 3295
 #pragma cdir loopcnt=LOOPCNT
+#line 3295
 #pragma cdir shortloop
+#line 3295
     for (i=0; i<ni; i++) {
+#line 3295
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3295
      /* test for range errors (not always needed but do it anyway) */
+#line 3295
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3295
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3295
       nrange += xp[i] > LONGLONG_MAX ;
+#line 3295
     }
+#line 3295
    /* update xpp and tp */
+#line 3295
     if (realign) xp = (uint *) *xpp;
+#line 3295
     xp += ni;
+#line 3295
     tp += ni;
+#line 3295
     *xpp = (void*)xp;
+#line 3295
   }
+#line 3295
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3295
 
+#line 3295
 #else   /* not SX */
+#line 3295
 	const char *xp = (const char *) *xpp;
+#line 3295
 	int status = NC_NOERR;
+#line 3295
 
+#line 3295
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3295
 	{
+#line 3295
 		const int lstatus = ncx_get_uint_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3295
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3295
 			status = lstatus;
+#line 3295
 	}
+#line 3295
 
+#line 3295
 	*xpp = (const void *)xp;
+#line 3295
 	return status;
-#  endif
+#line 3295
+#endif
+#line 3295
 }
+#line 3295
 
 int
+#line 3296
 ncx_getn_uint_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3296
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3296
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3296
 
+#line 3296
  /* basic algorithm is:
+#line 3296
   *   - ensure sane alignment of input data
+#line 3296
   *   - copy (conversion happens automatically) input data
+#line 3296
   *     to output
+#line 3296
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3296
   *     at next location for converted output
+#line 3296
   */
+#line 3296
   long i, j, ni;
+#line 3296
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3296
   uint *xp;
+#line 3296
   int nrange = 0;         /* number of range errors */
+#line 3296
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3296
   long cxp = (long) *((char**)xpp);
+#line 3296
 
+#line 3296
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3296
   /* sjl: manually stripmine so we can limit amount of
+#line 3296
    * vector work space reserved to LOOPCNT elements. Also
+#line 3296
    * makes vectorisation easy */
+#line 3296
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3296
     ni=Min(nelems-j,LOOPCNT);
+#line 3296
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3296
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3296
       xp = tmp;
+#line 3296
     } else {
+#line 3296
       xp = (uint *) *xpp;
+#line 3296
     }
+#line 3296
    /* copy the next block */
+#line 3296
 #pragma cdir loopcnt=LOOPCNT
+#line 3296
 #pragma cdir shortloop
+#line 3296
     for (i=0; i<ni; i++) {
+#line 3296
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3296
      /* test for range errors (not always needed but do it anyway) */
+#line 3296
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3296
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3296
       nrange += xp[i] > UCHAR_MAX ;
+#line 3296
     }
+#line 3296
    /* update xpp and tp */
+#line 3296
     if (realign) xp = (uint *) *xpp;
+#line 3296
     xp += ni;
+#line 3296
     tp += ni;
+#line 3296
     *xpp = (void*)xp;
+#line 3296
   }
+#line 3296
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3296
 
+#line 3296
 #else   /* not SX */
+#line 3296
 	const char *xp = (const char *) *xpp;
+#line 3296
 	int status = NC_NOERR;
+#line 3296
 
+#line 3296
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3296
 	{
+#line 3296
 		const int lstatus = ncx_get_uint_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3296
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3296
 			status = lstatus;
+#line 3296
 	}
+#line 3296
 
+#line 3296
 	*xpp = (const void *)xp;
+#line 3296
 	return status;
-#  endif
+#line 3296
+#endif
+#line 3296
 }
+#line 3296
 
 int
+#line 3297
 ncx_getn_uint_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3297
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3297
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3297
 
+#line 3297
  /* basic algorithm is:
+#line 3297
   *   - ensure sane alignment of input data
+#line 3297
   *   - copy (conversion happens automatically) input data
+#line 3297
   *     to output
+#line 3297
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3297
   *     at next location for converted output
+#line 3297
   */
+#line 3297
   long i, j, ni;
+#line 3297
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3297
   uint *xp;
+#line 3297
   int nrange = 0;         /* number of range errors */
+#line 3297
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3297
   long cxp = (long) *((char**)xpp);
+#line 3297
 
+#line 3297
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3297
   /* sjl: manually stripmine so we can limit amount of
+#line 3297
    * vector work space reserved to LOOPCNT elements. Also
+#line 3297
    * makes vectorisation easy */
+#line 3297
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3297
     ni=Min(nelems-j,LOOPCNT);
+#line 3297
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3297
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3297
       xp = tmp;
+#line 3297
     } else {
+#line 3297
       xp = (uint *) *xpp;
+#line 3297
     }
+#line 3297
    /* copy the next block */
+#line 3297
 #pragma cdir loopcnt=LOOPCNT
+#line 3297
 #pragma cdir shortloop
+#line 3297
     for (i=0; i<ni; i++) {
+#line 3297
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3297
      /* test for range errors (not always needed but do it anyway) */
+#line 3297
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3297
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3297
       nrange += xp[i] > USHORT_MAX ;
+#line 3297
     }
+#line 3297
    /* update xpp and tp */
+#line 3297
     if (realign) xp = (uint *) *xpp;
+#line 3297
     xp += ni;
+#line 3297
     tp += ni;
+#line 3297
     *xpp = (void*)xp;
+#line 3297
   }
+#line 3297
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3297
 
+#line 3297
 #else   /* not SX */
+#line 3297
 	const char *xp = (const char *) *xpp;
+#line 3297
 	int status = NC_NOERR;
+#line 3297
 
+#line 3297
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3297
 	{
+#line 3297
 		const int lstatus = ncx_get_uint_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3297
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3297
 			status = lstatus;
+#line 3297
 	}
+#line 3297
 
+#line 3297
 	*xpp = (const void *)xp;
+#line 3297
 	return status;
-#  endif
+#line 3297
+#endif
+#line 3297
 }
+#line 3297
 
 int
+#line 3298
 ncx_getn_uint_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3298
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3298
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3298
 
+#line 3298
  /* basic algorithm is:
+#line 3298
   *   - ensure sane alignment of input data
+#line 3298
   *   - copy (conversion happens automatically) input data
+#line 3298
   *     to output
+#line 3298
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3298
   *     at next location for converted output
+#line 3298
   */
+#line 3298
   long i, j, ni;
+#line 3298
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3298
   uint *xp;
+#line 3298
   int nrange = 0;         /* number of range errors */
+#line 3298
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3298
   long cxp = (long) *((char**)xpp);
+#line 3298
 
+#line 3298
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3298
   /* sjl: manually stripmine so we can limit amount of
+#line 3298
    * vector work space reserved to LOOPCNT elements. Also
+#line 3298
    * makes vectorisation easy */
+#line 3298
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3298
     ni=Min(nelems-j,LOOPCNT);
+#line 3298
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_UINT);
+#line 3298
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT));
+#line 3298
       xp = tmp;
+#line 3298
     } else {
+#line 3298
       xp = (uint *) *xpp;
+#line 3298
     }
+#line 3298
    /* copy the next block */
+#line 3298
 #pragma cdir loopcnt=LOOPCNT
+#line 3298
 #pragma cdir shortloop
+#line 3298
     for (i=0; i<ni; i++) {
+#line 3298
       tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3298
      /* test for range errors (not always needed but do it anyway) */
+#line 3298
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3298
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3298
       nrange += xp[i] > ULONGLONG_MAX ;
+#line 3298
     }
+#line 3298
    /* update xpp and tp */
+#line 3298
     if (realign) xp = (uint *) *xpp;
+#line 3298
     xp += ni;
+#line 3298
     tp += ni;
+#line 3298
     *xpp = (void*)xp;
+#line 3298
   }
+#line 3298
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3298
 
+#line 3298
 #else   /* not SX */
+#line 3298
 	const char *xp = (const char *) *xpp;
+#line 3298
 	int status = NC_NOERR;
+#line 3298
 
+#line 3298
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3298
 	{
+#line 3298
 		const int lstatus = ncx_get_uint_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3298
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3298
 			status = lstatus;
+#line 3298
 	}
+#line 3298
 
+#line 3298
 	*xpp = (const void *)xp;
+#line 3298
 	return status;
-#  endif
+#line 3298
+#endif
+#line 3298
 }
+#line 3298
 
 
 #if X_SIZEOF_UINT == SIZEOF_UINT
 /* optimized version */
 int
-ncx_putn_uint_uint(void **xpp, size_t nelems, const unsigned int *tp)
+ncx_putn_uint_uint(void **xpp, size_t nelems, const unsigned int *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_UINT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_UINT);
 # else
 	swapn4b(*xpp, tp, nelems);
 # endif
@@ -10940,705 +23831,1534 @@ ncx_putn_uint_uint(void **xpp, size_t nelems, const unsigned int *tp)
 }
 #else
 int
-ncx_putn_uint_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3314
+ncx_putn_uint_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3314
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3314
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3314
 
+#line 3314
  /* basic algorithm is:
+#line 3314
   *   - ensure sane alignment of output data
+#line 3314
   *   - copy (conversion happens automatically) input data
+#line 3314
   *     to output
+#line 3314
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3314
   *     at next location for converted output
+#line 3314
   */
+#line 3314
   long i, j, ni;
+#line 3314
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3314
   uint *xp;
+#line 3314
   int nrange = 0;         /* number of range errors */
+#line 3314
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3314
   long cxp = (long) *((char**)xpp);
+#line 3314
 
+#line 3314
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3314
   /* sjl: manually stripmine so we can limit amount of
+#line 3314
    * vector work space reserved to LOOPCNT elements. Also
+#line 3314
    * makes vectorisation easy */
+#line 3314
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3314
     ni=Min(nelems-j,LOOPCNT);
+#line 3314
     if (realign) {
+#line 3314
       xp = tmp;
+#line 3314
     } else {
+#line 3314
       xp = (uint *) *xpp;
+#line 3314
     }
+#line 3314
    /* copy the next block */
+#line 3314
 #pragma cdir loopcnt=LOOPCNT
+#line 3314
 #pragma cdir shortloop
+#line 3314
     for (i=0; i<ni; i++) {
+#line 3314
       /* the normal case: */
+#line 3314
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3314
      /* test for range errors (not always needed but do it anyway) */
+#line 3314
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3314
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3314
       nrange += tp[i] > X_UINT_MAX ;
+#line 3314
     }
+#line 3314
    /* copy workspace back if necessary */
+#line 3314
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3314
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3314
       xp = (uint *) *xpp;
+#line 3314
     }
+#line 3314
    /* update xpp and tp */
+#line 3314
     xp += ni;
+#line 3314
     tp += ni;
+#line 3314
     *xpp = (void*)xp;
+#line 3314
   }
+#line 3314
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3314
 
+#line 3314
 #else   /* not SX */
+#line 3314
 
+#line 3314
 	char *xp = (char *) *xpp;
+#line 3314
 	int status = NC_NOERR;
+#line 3314
 
+#line 3314
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3314
 	{
-		int lstatus = ncx_put_uint_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3314
+		int lstatus = ncx_put_uint_uint(xp, tp, fillp);
+#line 3314
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3314
 			status = lstatus;
+#line 3314
 	}
+#line 3314
 
+#line 3314
 	*xpp = (void *)xp;
+#line 3314
 	return status;
+#line 3314
 #endif
+#line 3314
 }
+#line 3314
+
+#endif
+int
+#line 3316
+ncx_putn_uint_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3316
+{
+#line 3316
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3316
+
+#line 3316
+ /* basic algorithm is:
+#line 3316
+  *   - ensure sane alignment of output data
+#line 3316
+  *   - copy (conversion happens automatically) input data
+#line 3316
+  *     to output
+#line 3316
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3316
+  *     at next location for converted output
+#line 3316
+  */
+#line 3316
+  long i, j, ni;
+#line 3316
+  uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3316
+  uint *xp;
+#line 3316
+  int nrange = 0;         /* number of range errors */
+#line 3316
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3316
+  long cxp = (long) *((char**)xpp);
+#line 3316
+
+#line 3316
+  realign = (cxp & 7) % SIZEOF_UINT;
+#line 3316
+  /* sjl: manually stripmine so we can limit amount of
+#line 3316
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3316
+   * makes vectorisation easy */
+#line 3316
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3316
+    ni=Min(nelems-j,LOOPCNT);
+#line 3316
+    if (realign) {
+#line 3316
+      xp = tmp;
+#line 3316
+    } else {
+#line 3316
+      xp = (uint *) *xpp;
+#line 3316
+    }
+#line 3316
+   /* copy the next block */
+#line 3316
+#pragma cdir loopcnt=LOOPCNT
+#line 3316
+#pragma cdir shortloop
+#line 3316
+    for (i=0; i<ni; i++) {
+#line 3316
+      /* the normal case: */
+#line 3316
+      xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3316
+     /* test for range errors (not always needed but do it anyway) */
+#line 3316
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3316
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3316
+      nrange += tp[i] > X_UINT_MAX || tp[i] < 0;
+#line 3316
+    }
+#line 3316
+   /* copy workspace back if necessary */
+#line 3316
+    if (realign) {
+#line 3316
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3316
+      xp = (uint *) *xpp;
+#line 3316
+    }
+#line 3316
+   /* update xpp and tp */
+#line 3316
+    xp += ni;
+#line 3316
+    tp += ni;
+#line 3316
+    *xpp = (void*)xp;
+#line 3316
+  }
+#line 3316
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3316
+
+#line 3316
+#else   /* not SX */
+#line 3316
+
+#line 3316
+	char *xp = (char *) *xpp;
+#line 3316
+	int status = NC_NOERR;
+#line 3316
+
+#line 3316
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3316
+	{
+#line 3316
+		int lstatus = ncx_put_uint_schar(xp, tp, fillp);
+#line 3316
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3316
+			status = lstatus;
+#line 3316
+	}
+#line 3316
 
+#line 3316
+	*xpp = (void *)xp;
+#line 3316
+	return status;
+#line 3316
 #endif
+#line 3316
+}
+#line 3316
+
 int
-ncx_putn_uint_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3317
+ncx_putn_uint_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3317
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3317
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3317
 
+#line 3317
  /* basic algorithm is:
+#line 3317
   *   - ensure sane alignment of output data
+#line 3317
   *   - copy (conversion happens automatically) input data
+#line 3317
   *     to output
+#line 3317
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3317
   *     at next location for converted output
+#line 3317
   */
+#line 3317
   long i, j, ni;
+#line 3317
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3317
   uint *xp;
+#line 3317
   int nrange = 0;         /* number of range errors */
+#line 3317
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3317
   long cxp = (long) *((char**)xpp);
+#line 3317
 
+#line 3317
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3317
   /* sjl: manually stripmine so we can limit amount of
+#line 3317
    * vector work space reserved to LOOPCNT elements. Also
+#line 3317
    * makes vectorisation easy */
+#line 3317
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3317
     ni=Min(nelems-j,LOOPCNT);
+#line 3317
     if (realign) {
+#line 3317
       xp = tmp;
+#line 3317
     } else {
+#line 3317
       xp = (uint *) *xpp;
+#line 3317
     }
+#line 3317
    /* copy the next block */
+#line 3317
 #pragma cdir loopcnt=LOOPCNT
+#line 3317
 #pragma cdir shortloop
+#line 3317
     for (i=0; i<ni; i++) {
+#line 3317
       /* the normal case: */
+#line 3317
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3317
      /* test for range errors (not always needed but do it anyway) */
+#line 3317
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3317
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3317
       nrange += tp[i] > X_UINT_MAX || tp[i] < 0;
+#line 3317
     }
+#line 3317
    /* copy workspace back if necessary */
+#line 3317
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3317
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3317
       xp = (uint *) *xpp;
+#line 3317
     }
+#line 3317
    /* update xpp and tp */
+#line 3317
     xp += ni;
+#line 3317
     tp += ni;
+#line 3317
     *xpp = (void*)xp;
+#line 3317
   }
+#line 3317
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3317
 
+#line 3317
 #else   /* not SX */
+#line 3317
 
+#line 3317
 	char *xp = (char *) *xpp;
+#line 3317
 	int status = NC_NOERR;
+#line 3317
 
+#line 3317
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3317
 	{
-		int lstatus = ncx_put_uint_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3317
+		int lstatus = ncx_put_uint_short(xp, tp, fillp);
+#line 3317
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3317
 			status = lstatus;
+#line 3317
 	}
+#line 3317
 
+#line 3317
 	*xpp = (void *)xp;
+#line 3317
 	return status;
+#line 3317
 #endif
+#line 3317
 }
+#line 3317
 
 int
-ncx_putn_uint_short(void **xpp, size_t nelems, const short *tp)
+#line 3318
+ncx_putn_uint_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3318
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3318
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3318
 
+#line 3318
  /* basic algorithm is:
+#line 3318
   *   - ensure sane alignment of output data
+#line 3318
   *   - copy (conversion happens automatically) input data
+#line 3318
   *     to output
+#line 3318
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3318
   *     at next location for converted output
+#line 3318
   */
+#line 3318
   long i, j, ni;
+#line 3318
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3318
   uint *xp;
+#line 3318
   int nrange = 0;         /* number of range errors */
+#line 3318
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3318
   long cxp = (long) *((char**)xpp);
+#line 3318
 
+#line 3318
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3318
   /* sjl: manually stripmine so we can limit amount of
+#line 3318
    * vector work space reserved to LOOPCNT elements. Also
+#line 3318
    * makes vectorisation easy */
+#line 3318
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3318
     ni=Min(nelems-j,LOOPCNT);
+#line 3318
     if (realign) {
+#line 3318
       xp = tmp;
+#line 3318
     } else {
+#line 3318
       xp = (uint *) *xpp;
+#line 3318
     }
+#line 3318
    /* copy the next block */
+#line 3318
 #pragma cdir loopcnt=LOOPCNT
+#line 3318
 #pragma cdir shortloop
+#line 3318
     for (i=0; i<ni; i++) {
+#line 3318
       /* the normal case: */
+#line 3318
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3318
      /* test for range errors (not always needed but do it anyway) */
+#line 3318
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3318
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3318
       nrange += tp[i] > X_UINT_MAX || tp[i] < 0;
+#line 3318
     }
+#line 3318
    /* copy workspace back if necessary */
+#line 3318
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3318
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3318
       xp = (uint *) *xpp;
+#line 3318
     }
+#line 3318
    /* update xpp and tp */
+#line 3318
     xp += ni;
+#line 3318
     tp += ni;
+#line 3318
     *xpp = (void*)xp;
+#line 3318
   }
+#line 3318
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3318
 
+#line 3318
 #else   /* not SX */
+#line 3318
 
+#line 3318
 	char *xp = (char *) *xpp;
+#line 3318
 	int status = NC_NOERR;
+#line 3318
 
+#line 3318
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3318
 	{
-		int lstatus = ncx_put_uint_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3318
+		int lstatus = ncx_put_uint_int(xp, tp, fillp);
+#line 3318
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3318
 			status = lstatus;
+#line 3318
 	}
+#line 3318
 
+#line 3318
 	*xpp = (void *)xp;
+#line 3318
 	return status;
+#line 3318
 #endif
+#line 3318
 }
+#line 3318
 
 int
-ncx_putn_uint_int(void **xpp, size_t nelems, const int *tp)
+#line 3319
+ncx_putn_uint_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3319
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3319
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3319
 
+#line 3319
  /* basic algorithm is:
+#line 3319
   *   - ensure sane alignment of output data
+#line 3319
   *   - copy (conversion happens automatically) input data
+#line 3319
   *     to output
+#line 3319
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3319
   *     at next location for converted output
+#line 3319
   */
+#line 3319
   long i, j, ni;
+#line 3319
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3319
   uint *xp;
+#line 3319
   int nrange = 0;         /* number of range errors */
+#line 3319
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3319
   long cxp = (long) *((char**)xpp);
+#line 3319
 
+#line 3319
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3319
   /* sjl: manually stripmine so we can limit amount of
+#line 3319
    * vector work space reserved to LOOPCNT elements. Also
+#line 3319
    * makes vectorisation easy */
+#line 3319
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3319
     ni=Min(nelems-j,LOOPCNT);
+#line 3319
     if (realign) {
+#line 3319
       xp = tmp;
+#line 3319
     } else {
+#line 3319
       xp = (uint *) *xpp;
+#line 3319
     }
+#line 3319
    /* copy the next block */
+#line 3319
 #pragma cdir loopcnt=LOOPCNT
+#line 3319
 #pragma cdir shortloop
+#line 3319
     for (i=0; i<ni; i++) {
+#line 3319
       /* the normal case: */
+#line 3319
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3319
      /* test for range errors (not always needed but do it anyway) */
+#line 3319
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3319
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3319
       nrange += tp[i] > X_UINT_MAX || tp[i] < 0;
+#line 3319
     }
+#line 3319
    /* copy workspace back if necessary */
+#line 3319
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3319
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3319
       xp = (uint *) *xpp;
+#line 3319
     }
+#line 3319
    /* update xpp and tp */
+#line 3319
     xp += ni;
+#line 3319
     tp += ni;
+#line 3319
     *xpp = (void*)xp;
+#line 3319
   }
+#line 3319
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3319
 
+#line 3319
 #else   /* not SX */
+#line 3319
 
+#line 3319
 	char *xp = (char *) *xpp;
+#line 3319
 	int status = NC_NOERR;
+#line 3319
 
+#line 3319
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3319
 	{
-		int lstatus = ncx_put_uint_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3319
+		int lstatus = ncx_put_uint_long(xp, tp, fillp);
+#line 3319
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3319
 			status = lstatus;
+#line 3319
 	}
+#line 3319
 
+#line 3319
 	*xpp = (void *)xp;
+#line 3319
 	return status;
+#line 3319
 #endif
+#line 3319
 }
+#line 3319
 
 int
-ncx_putn_uint_float(void **xpp, size_t nelems, const float *tp)
+#line 3320
+ncx_putn_uint_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3320
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3320
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3320
 
+#line 3320
  /* basic algorithm is:
+#line 3320
   *   - ensure sane alignment of output data
+#line 3320
   *   - copy (conversion happens automatically) input data
+#line 3320
   *     to output
+#line 3320
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3320
   *     at next location for converted output
+#line 3320
   */
+#line 3320
   long i, j, ni;
+#line 3320
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3320
   uint *xp;
+#line 3320
   int nrange = 0;         /* number of range errors */
+#line 3320
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3320
   long cxp = (long) *((char**)xpp);
+#line 3320
 
+#line 3320
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3320
   /* sjl: manually stripmine so we can limit amount of
+#line 3320
    * vector work space reserved to LOOPCNT elements. Also
+#line 3320
    * makes vectorisation easy */
+#line 3320
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3320
     ni=Min(nelems-j,LOOPCNT);
+#line 3320
     if (realign) {
+#line 3320
       xp = tmp;
+#line 3320
     } else {
+#line 3320
       xp = (uint *) *xpp;
+#line 3320
     }
+#line 3320
    /* copy the next block */
+#line 3320
 #pragma cdir loopcnt=LOOPCNT
+#line 3320
 #pragma cdir shortloop
+#line 3320
     for (i=0; i<ni; i++) {
+#line 3320
       /* the normal case: */
+#line 3320
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3320
      /* test for range errors (not always needed but do it anyway) */
+#line 3320
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3320
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3320
       nrange += tp[i] > X_UINT_MAX || tp[i] < 0;
+#line 3320
     }
+#line 3320
    /* copy workspace back if necessary */
+#line 3320
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3320
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3320
       xp = (uint *) *xpp;
+#line 3320
     }
+#line 3320
    /* update xpp and tp */
+#line 3320
     xp += ni;
+#line 3320
     tp += ni;
+#line 3320
     *xpp = (void*)xp;
+#line 3320
   }
+#line 3320
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3320
 
+#line 3320
 #else   /* not SX */
+#line 3320
 
+#line 3320
 	char *xp = (char *) *xpp;
+#line 3320
 	int status = NC_NOERR;
+#line 3320
 
+#line 3320
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3320
 	{
-		int lstatus = ncx_put_uint_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3320
+		int lstatus = ncx_put_uint_float(xp, tp, fillp);
+#line 3320
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3320
 			status = lstatus;
+#line 3320
 	}
+#line 3320
 
+#line 3320
 	*xpp = (void *)xp;
+#line 3320
 	return status;
+#line 3320
 #endif
+#line 3320
 }
+#line 3320
 
 int
-ncx_putn_uint_double(void **xpp, size_t nelems, const double *tp)
+#line 3321
+ncx_putn_uint_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3321
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3321
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3321
 
+#line 3321
  /* basic algorithm is:
+#line 3321
   *   - ensure sane alignment of output data
+#line 3321
   *   - copy (conversion happens automatically) input data
+#line 3321
   *     to output
+#line 3321
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3321
   *     at next location for converted output
+#line 3321
   */
+#line 3321
   long i, j, ni;
+#line 3321
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3321
   uint *xp;
+#line 3321
   int nrange = 0;         /* number of range errors */
+#line 3321
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3321
   long cxp = (long) *((char**)xpp);
+#line 3321
 
+#line 3321
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3321
   /* sjl: manually stripmine so we can limit amount of
+#line 3321
    * vector work space reserved to LOOPCNT elements. Also
+#line 3321
    * makes vectorisation easy */
+#line 3321
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3321
     ni=Min(nelems-j,LOOPCNT);
+#line 3321
     if (realign) {
+#line 3321
       xp = tmp;
+#line 3321
     } else {
+#line 3321
       xp = (uint *) *xpp;
+#line 3321
     }
+#line 3321
    /* copy the next block */
+#line 3321
 #pragma cdir loopcnt=LOOPCNT
+#line 3321
 #pragma cdir shortloop
+#line 3321
     for (i=0; i<ni; i++) {
+#line 3321
       /* the normal case: */
+#line 3321
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3321
      /* test for range errors (not always needed but do it anyway) */
+#line 3321
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3321
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3321
       nrange += tp[i] > X_UINT_MAX || tp[i] < 0;
+#line 3321
     }
+#line 3321
    /* copy workspace back if necessary */
+#line 3321
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3321
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3321
       xp = (uint *) *xpp;
+#line 3321
     }
+#line 3321
    /* update xpp and tp */
+#line 3321
     xp += ni;
+#line 3321
     tp += ni;
+#line 3321
     *xpp = (void*)xp;
+#line 3321
   }
+#line 3321
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3321
 
+#line 3321
 #else   /* not SX */
+#line 3321
 
+#line 3321
 	char *xp = (char *) *xpp;
+#line 3321
 	int status = NC_NOERR;
+#line 3321
 
+#line 3321
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3321
 	{
-		int lstatus = ncx_put_uint_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3321
+		int lstatus = ncx_put_uint_double(xp, tp, fillp);
+#line 3321
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3321
 			status = lstatus;
+#line 3321
 	}
+#line 3321
 
+#line 3321
 	*xpp = (void *)xp;
+#line 3321
 	return status;
+#line 3321
 #endif
+#line 3321
 }
+#line 3321
 
 int
-ncx_putn_uint_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3322
+ncx_putn_uint_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3322
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3322
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3322
 
+#line 3322
  /* basic algorithm is:
+#line 3322
   *   - ensure sane alignment of output data
+#line 3322
   *   - copy (conversion happens automatically) input data
+#line 3322
   *     to output
+#line 3322
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3322
   *     at next location for converted output
+#line 3322
   */
+#line 3322
   long i, j, ni;
+#line 3322
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3322
   uint *xp;
+#line 3322
   int nrange = 0;         /* number of range errors */
+#line 3322
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3322
   long cxp = (long) *((char**)xpp);
+#line 3322
 
+#line 3322
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3322
   /* sjl: manually stripmine so we can limit amount of
+#line 3322
    * vector work space reserved to LOOPCNT elements. Also
+#line 3322
    * makes vectorisation easy */
+#line 3322
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3322
     ni=Min(nelems-j,LOOPCNT);
+#line 3322
     if (realign) {
+#line 3322
       xp = tmp;
+#line 3322
     } else {
+#line 3322
       xp = (uint *) *xpp;
+#line 3322
     }
+#line 3322
    /* copy the next block */
+#line 3322
 #pragma cdir loopcnt=LOOPCNT
+#line 3322
 #pragma cdir shortloop
+#line 3322
     for (i=0; i<ni; i++) {
+#line 3322
       /* the normal case: */
+#line 3322
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3322
      /* test for range errors (not always needed but do it anyway) */
+#line 3322
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3322
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3322
       nrange += tp[i] > X_UINT_MAX || tp[i] < 0;
+#line 3322
     }
+#line 3322
    /* copy workspace back if necessary */
+#line 3322
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3322
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3322
       xp = (uint *) *xpp;
+#line 3322
     }
+#line 3322
    /* update xpp and tp */
+#line 3322
     xp += ni;
+#line 3322
     tp += ni;
+#line 3322
     *xpp = (void*)xp;
+#line 3322
   }
+#line 3322
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3322
 
+#line 3322
 #else   /* not SX */
+#line 3322
 
+#line 3322
 	char *xp = (char *) *xpp;
+#line 3322
 	int status = NC_NOERR;
+#line 3322
 
+#line 3322
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3322
 	{
-		int lstatus = ncx_put_uint_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3322
+		int lstatus = ncx_put_uint_longlong(xp, tp, fillp);
+#line 3322
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3322
 			status = lstatus;
+#line 3322
 	}
+#line 3322
 
+#line 3322
 	*xpp = (void *)xp;
+#line 3322
 	return status;
+#line 3322
 #endif
+#line 3322
 }
+#line 3322
 
 int
-ncx_putn_uint_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3323
+ncx_putn_uint_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3323
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3323
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3323
 
+#line 3323
  /* basic algorithm is:
+#line 3323
   *   - ensure sane alignment of output data
+#line 3323
   *   - copy (conversion happens automatically) input data
+#line 3323
   *     to output
+#line 3323
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3323
   *     at next location for converted output
+#line 3323
   */
+#line 3323
   long i, j, ni;
+#line 3323
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3323
   uint *xp;
+#line 3323
   int nrange = 0;         /* number of range errors */
+#line 3323
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3323
   long cxp = (long) *((char**)xpp);
+#line 3323
 
+#line 3323
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3323
   /* sjl: manually stripmine so we can limit amount of
+#line 3323
    * vector work space reserved to LOOPCNT elements. Also
+#line 3323
    * makes vectorisation easy */
+#line 3323
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3323
     ni=Min(nelems-j,LOOPCNT);
+#line 3323
     if (realign) {
+#line 3323
       xp = tmp;
+#line 3323
     } else {
+#line 3323
       xp = (uint *) *xpp;
+#line 3323
     }
+#line 3323
    /* copy the next block */
+#line 3323
 #pragma cdir loopcnt=LOOPCNT
+#line 3323
 #pragma cdir shortloop
+#line 3323
     for (i=0; i<ni; i++) {
+#line 3323
       /* the normal case: */
+#line 3323
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3323
      /* test for range errors (not always needed but do it anyway) */
+#line 3323
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3323
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3323
       nrange += tp[i] > X_UINT_MAX ;
+#line 3323
     }
+#line 3323
    /* copy workspace back if necessary */
+#line 3323
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3323
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3323
       xp = (uint *) *xpp;
+#line 3323
     }
+#line 3323
    /* update xpp and tp */
+#line 3323
     xp += ni;
+#line 3323
     tp += ni;
+#line 3323
     *xpp = (void*)xp;
+#line 3323
   }
+#line 3323
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3323
 
+#line 3323
 #else   /* not SX */
+#line 3323
 
+#line 3323
 	char *xp = (char *) *xpp;
+#line 3323
 	int status = NC_NOERR;
+#line 3323
 
+#line 3323
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3323
 	{
-		int lstatus = ncx_put_uint_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3323
+		int lstatus = ncx_put_uint_uchar(xp, tp, fillp);
+#line 3323
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3323
 			status = lstatus;
+#line 3323
 	}
+#line 3323
 
+#line 3323
 	*xpp = (void *)xp;
+#line 3323
 	return status;
+#line 3323
 #endif
+#line 3323
 }
+#line 3323
 
 int
-ncx_putn_uint_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3324
+ncx_putn_uint_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3324
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3324
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3324
 
+#line 3324
  /* basic algorithm is:
+#line 3324
   *   - ensure sane alignment of output data
+#line 3324
   *   - copy (conversion happens automatically) input data
+#line 3324
   *     to output
+#line 3324
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3324
   *     at next location for converted output
+#line 3324
   */
+#line 3324
   long i, j, ni;
+#line 3324
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3324
   uint *xp;
+#line 3324
   int nrange = 0;         /* number of range errors */
+#line 3324
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3324
   long cxp = (long) *((char**)xpp);
+#line 3324
 
+#line 3324
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3324
   /* sjl: manually stripmine so we can limit amount of
+#line 3324
    * vector work space reserved to LOOPCNT elements. Also
+#line 3324
    * makes vectorisation easy */
+#line 3324
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3324
     ni=Min(nelems-j,LOOPCNT);
+#line 3324
     if (realign) {
+#line 3324
       xp = tmp;
+#line 3324
     } else {
+#line 3324
       xp = (uint *) *xpp;
+#line 3324
     }
+#line 3324
    /* copy the next block */
+#line 3324
 #pragma cdir loopcnt=LOOPCNT
+#line 3324
 #pragma cdir shortloop
+#line 3324
     for (i=0; i<ni; i++) {
+#line 3324
       /* the normal case: */
+#line 3324
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3324
      /* test for range errors (not always needed but do it anyway) */
+#line 3324
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3324
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3324
       nrange += tp[i] > X_UINT_MAX ;
+#line 3324
     }
+#line 3324
    /* copy workspace back if necessary */
+#line 3324
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3324
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3324
       xp = (uint *) *xpp;
+#line 3324
     }
+#line 3324
    /* update xpp and tp */
+#line 3324
     xp += ni;
+#line 3324
     tp += ni;
+#line 3324
     *xpp = (void*)xp;
+#line 3324
   }
+#line 3324
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3324
 
+#line 3324
 #else   /* not SX */
+#line 3324
 
+#line 3324
 	char *xp = (char *) *xpp;
+#line 3324
 	int status = NC_NOERR;
+#line 3324
 
+#line 3324
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3324
 	{
-		int lstatus = ncx_put_uint_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3324
+		int lstatus = ncx_put_uint_ushort(xp, tp, fillp);
+#line 3324
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3324
 			status = lstatus;
+#line 3324
 	}
+#line 3324
 
+#line 3324
 	*xpp = (void *)xp;
+#line 3324
 	return status;
+#line 3324
 #endif
+#line 3324
 }
+#line 3324
 
 int
-ncx_putn_uint_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3325
+ncx_putn_uint_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3325
 {
-#if _SX && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3325
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT == SIZEOF_UINT
+#line 3325
 
+#line 3325
  /* basic algorithm is:
+#line 3325
   *   - ensure sane alignment of output data
+#line 3325
   *   - copy (conversion happens automatically) input data
+#line 3325
   *     to output
+#line 3325
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3325
   *     at next location for converted output
+#line 3325
   */
+#line 3325
   long i, j, ni;
+#line 3325
   uint tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3325
   uint *xp;
+#line 3325
   int nrange = 0;         /* number of range errors */
+#line 3325
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3325
   long cxp = (long) *((char**)xpp);
+#line 3325
 
+#line 3325
   realign = (cxp & 7) % SIZEOF_UINT;
+#line 3325
   /* sjl: manually stripmine so we can limit amount of
+#line 3325
    * vector work space reserved to LOOPCNT elements. Also
+#line 3325
    * makes vectorisation easy */
+#line 3325
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3325
     ni=Min(nelems-j,LOOPCNT);
+#line 3325
     if (realign) {
+#line 3325
       xp = tmp;
+#line 3325
     } else {
+#line 3325
       xp = (uint *) *xpp;
+#line 3325
     }
+#line 3325
    /* copy the next block */
+#line 3325
 #pragma cdir loopcnt=LOOPCNT
+#line 3325
 #pragma cdir shortloop
+#line 3325
     for (i=0; i<ni; i++) {
+#line 3325
       /* the normal case: */
+#line 3325
       xp[i] = (uint) Max( X_UINT_MIN, Min(X_UINT_MAX, (uint) tp[i]));
+#line 3325
      /* test for range errors (not always needed but do it anyway) */
+#line 3325
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3325
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3325
       nrange += tp[i] > X_UINT_MAX ;
+#line 3325
     }
+#line 3325
    /* copy workspace back if necessary */
+#line 3325
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_UINT);
+#line 3325
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT);
+#line 3325
       xp = (uint *) *xpp;
+#line 3325
     }
+#line 3325
    /* update xpp and tp */
+#line 3325
     xp += ni;
+#line 3325
     tp += ni;
+#line 3325
     *xpp = (void*)xp;
+#line 3325
   }
+#line 3325
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3325
 
+#line 3325
 #else   /* not SX */
+#line 3325
 
+#line 3325
 	char *xp = (char *) *xpp;
+#line 3325
 	int status = NC_NOERR;
+#line 3325
 
+#line 3325
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT, tp++)
+#line 3325
 	{
-		int lstatus = ncx_put_uint_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3325
+		int lstatus = ncx_put_uint_ulonglong(xp, tp, fillp);
+#line 3325
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3325
 			status = lstatus;
+#line 3325
 	}
+#line 3325
 
+#line 3325
 	*xpp = (void *)xp;
+#line 3325
 	return status;
+#line 3325
 #endif
+#line 3325
 }
+#line 3325
 
 
 
@@ -11650,1397 +25370,2944 @@ int
 ncx_getn_float_float(const void **xpp, size_t nelems, float *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(float));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_FLOAT);
 # else
 	swapn4b(tp, *xpp, nelems);
 # endif
 	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_FLOAT);
 	return NC_NOERR;
 }
-#elif vax
+#elif defined(vax) && vax != 0
 int
 ncx_getn_float_float(const void **xpp, size_t nfloats, float *ip)
 {
 	float *const end = ip + nfloats;
 
-	while(ip < end)
+	while (ip < end)
 	{
 		struct vax_single *const vsp = (struct vax_single *) ip;
+#line 3351
 		const struct ieee_single *const isp =
+#line 3351
 			 (const struct ieee_single *) (*xpp);
+#line 3351
 		unsigned exp = isp->exp_hi << 1 | isp->exp_lo;
+#line 3351
 
+#line 3351
 		switch(exp) {
+#line 3351
 		case 0 :
+#line 3351
 			/* ieee subnormal */
-			if(isp->mant_hi == min.ieee.mant_hi
+#line 3351
+			if (isp->mant_hi == min.ieee.mant_hi
+#line 3351
 				&& isp->mant_lo_hi == min.ieee.mant_lo_hi
+#line 3351
 				&& isp->mant_lo_lo == min.ieee.mant_lo_lo)
+#line 3351
 			{
+#line 3351
 				*vsp = min.s;
+#line 3351
 			}
+#line 3351
 			else
+#line 3351
 			{
+#line 3351
 				unsigned mantissa = (isp->mant_hi << 16)
+#line 3351
 					 | isp->mant_lo_hi << 8
+#line 3351
 					 | isp->mant_lo_lo;
+#line 3351
 				unsigned tmp = mantissa >> 20;
-				if(tmp >= 4) {
+#line 3351
+				if (tmp >= 4) {
+#line 3351
 					vsp->exp = 2;
+#line 3351
 				} else if (tmp >= 2) {
+#line 3351
 					vsp->exp = 1;
+#line 3351
 				} else {
+#line 3351
 					*vsp = min.s;
+#line 3351
 					break;
+#line 3351
 				} /* else */
+#line 3351
 				tmp = mantissa - (1 << (20 + vsp->exp ));
+#line 3351
 				tmp <<= 3 - vsp->exp;
+#line 3351
 				vsp->mantissa2 = tmp;
+#line 3351
 				vsp->mantissa1 = (tmp >> 16);
+#line 3351
 			}
+#line 3351
 			break;
+#line 3351
 		case 0xfe :
+#line 3351
 		case 0xff :
+#line 3351
 			*vsp = max.s;
+#line 3351
 			break;
+#line 3351
 		default :
+#line 3351
 			vsp->exp = exp - IEEE_SNG_BIAS + VAX_SNG_BIAS;
+#line 3351
 			vsp->mantissa2 = isp->mant_lo_hi << 8 | isp->mant_lo_lo;
+#line 3351
 			vsp->mantissa1 = isp->mant_hi;
+#line 3351
 		}
+#line 3351
 
+#line 3351
 		vsp->sign = isp->sign;
+#line 3351
+
+
+		ip++;
+		*xpp = (char *)(*xpp) + X_SIZEOF_FLOAT;
+	}
+	return NC_NOERR;
+}
+#else
+int
+ncx_getn_float_float(const void **xpp, size_t nelems, float *tp)
+{
+	const char *xp = *xpp;
+	int status = NC_NOERR;
+
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+	{
+		const int lstatus = ncx_get_float_float(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
+			status = lstatus;
+	}
+
+	*xpp = (const void *)xp;
+	return status;
+}
+
+#endif
+int
+#line 3377
+ncx_getn_float_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3377
+{
+#line 3377
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3377
+
+#line 3377
+ /* basic algorithm is:
+#line 3377
+  *   - ensure sane alignment of input data
+#line 3377
+  *   - copy (conversion happens automatically) input data
+#line 3377
+  *     to output
+#line 3377
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3377
+  *     at next location for converted output
+#line 3377
+  */
+#line 3377
+  long i, j, ni;
+#line 3377
+  float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3377
+  float *xp;
+#line 3377
+  int nrange = 0;         /* number of range errors */
+#line 3377
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3377
+  long cxp = (long) *((char**)xpp);
+#line 3377
 
+#line 3377
+  realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3377
+  /* sjl: manually stripmine so we can limit amount of
+#line 3377
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3377
+   * makes vectorisation easy */
+#line 3377
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3377
+    ni=Min(nelems-j,LOOPCNT);
+#line 3377
+    if (realign) {
+#line 3377
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3377
+      xp = tmp;
+#line 3377
+    } else {
+#line 3377
+      xp = (float *) *xpp;
+#line 3377
+    }
+#line 3377
+   /* copy the next block */
+#line 3377
+#pragma cdir loopcnt=LOOPCNT
+#line 3377
+#pragma cdir shortloop
+#line 3377
+    for (i=0; i<ni; i++) {
+#line 3377
+      tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3377
+     /* test for range errors (not always needed but do it anyway) */
+#line 3377
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3377
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3377
+      nrange += xp[i] > SCHAR_MAX || xp[i] < SCHAR_MIN;
+#line 3377
+    }
+#line 3377
+   /* update xpp and tp */
+#line 3377
+    if (realign) xp = (float *) *xpp;
+#line 3377
+    xp += ni;
+#line 3377
+    tp += ni;
+#line 3377
+    *xpp = (void*)xp;
+#line 3377
+  }
+#line 3377
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3377
 
-		ip++;
-		*xpp = (char *)(*xpp) + X_SIZEOF_FLOAT;
-	}
-	return NC_NOERR;
-}
-#else
-int
-ncx_getn_float_float(const void **xpp, size_t nelems, float *tp)
-{
-	const char *xp = *xpp;
+#line 3377
+#else   /* not SX */
+#line 3377
+	const char *xp = (const char *) *xpp;
+#line 3377
 	int status = NC_NOERR;
+#line 3377
 
+#line 3377
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3377
 	{
-		const int lstatus = ncx_get_float_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3377
+		const int lstatus = ncx_get_float_schar(xp, tp);
+#line 3377
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3377
 			status = lstatus;
+#line 3377
 	}
+#line 3377
 
+#line 3377
 	*xpp = (const void *)xp;
+#line 3377
 	return status;
+#line 3377
+#endif
+#line 3377
 }
+#line 3377
 
-#endif
 int
-ncx_getn_float_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3378
+ncx_getn_float_short(const void **xpp, size_t nelems, short *tp)
+#line 3378
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3378
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3378
 
+#line 3378
  /* basic algorithm is:
+#line 3378
   *   - ensure sane alignment of input data
+#line 3378
   *   - copy (conversion happens automatically) input data
+#line 3378
   *     to output
+#line 3378
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3378
   *     at next location for converted output
+#line 3378
   */
+#line 3378
   long i, j, ni;
+#line 3378
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3378
   float *xp;
+#line 3378
   int nrange = 0;         /* number of range errors */
+#line 3378
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3378
   long cxp = (long) *((char**)xpp);
+#line 3378
 
+#line 3378
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3378
   /* sjl: manually stripmine so we can limit amount of
+#line 3378
    * vector work space reserved to LOOPCNT elements. Also
+#line 3378
    * makes vectorisation easy */
+#line 3378
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3378
     ni=Min(nelems-j,LOOPCNT);
+#line 3378
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3378
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3378
       xp = tmp;
+#line 3378
     } else {
+#line 3378
       xp = (float *) *xpp;
+#line 3378
     }
+#line 3378
    /* copy the next block */
+#line 3378
 #pragma cdir loopcnt=LOOPCNT
+#line 3378
 #pragma cdir shortloop
+#line 3378
     for (i=0; i<ni; i++) {
-      tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3378
+      tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3378
      /* test for range errors (not always needed but do it anyway) */
+#line 3378
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3378
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > SCHAR_MAX || xp[i] < SCHAR_MIN;
+#line 3378
+      nrange += xp[i] > SHORT_MAX || xp[i] < SHORT_MIN;
+#line 3378
     }
+#line 3378
    /* update xpp and tp */
+#line 3378
     if (realign) xp = (float *) *xpp;
+#line 3378
     xp += ni;
+#line 3378
     tp += ni;
+#line 3378
     *xpp = (void*)xp;
+#line 3378
   }
+#line 3378
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3378
 
+#line 3378
 #else   /* not SX */
+#line 3378
 	const char *xp = (const char *) *xpp;
+#line 3378
 	int status = NC_NOERR;
+#line 3378
 
+#line 3378
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3378
 	{
-		const int lstatus = ncx_get_float_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3378
+		const int lstatus = ncx_get_float_short(xp, tp);
+#line 3378
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3378
 			status = lstatus;
+#line 3378
 	}
+#line 3378
 
+#line 3378
 	*xpp = (const void *)xp;
+#line 3378
 	return status;
-#  endif
+#line 3378
+#endif
+#line 3378
 }
+#line 3378
 
 int
-ncx_getn_float_short(const void **xpp, size_t nelems, short *tp)
+#line 3379
+ncx_getn_float_int(const void **xpp, size_t nelems, int *tp)
+#line 3379
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3379
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3379
 
+#line 3379
  /* basic algorithm is:
+#line 3379
   *   - ensure sane alignment of input data
+#line 3379
   *   - copy (conversion happens automatically) input data
+#line 3379
   *     to output
+#line 3379
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3379
   *     at next location for converted output
+#line 3379
   */
+#line 3379
   long i, j, ni;
+#line 3379
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3379
   float *xp;
+#line 3379
   int nrange = 0;         /* number of range errors */
+#line 3379
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3379
   long cxp = (long) *((char**)xpp);
+#line 3379
 
+#line 3379
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3379
   /* sjl: manually stripmine so we can limit amount of
+#line 3379
    * vector work space reserved to LOOPCNT elements. Also
+#line 3379
    * makes vectorisation easy */
+#line 3379
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3379
     ni=Min(nelems-j,LOOPCNT);
+#line 3379
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3379
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3379
       xp = tmp;
+#line 3379
     } else {
+#line 3379
       xp = (float *) *xpp;
+#line 3379
     }
+#line 3379
    /* copy the next block */
+#line 3379
 #pragma cdir loopcnt=LOOPCNT
+#line 3379
 #pragma cdir shortloop
+#line 3379
     for (i=0; i<ni; i++) {
-      tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3379
+      tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3379
      /* test for range errors (not always needed but do it anyway) */
+#line 3379
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3379
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > SHORT_MAX || xp[i] < SHORT_MIN;
+#line 3379
+      nrange += xp[i] > INT_MAX || xp[i] < INT_MIN;
+#line 3379
     }
+#line 3379
    /* update xpp and tp */
+#line 3379
     if (realign) xp = (float *) *xpp;
+#line 3379
     xp += ni;
+#line 3379
     tp += ni;
+#line 3379
     *xpp = (void*)xp;
+#line 3379
   }
+#line 3379
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3379
 
+#line 3379
 #else   /* not SX */
+#line 3379
 	const char *xp = (const char *) *xpp;
+#line 3379
 	int status = NC_NOERR;
+#line 3379
 
+#line 3379
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3379
 	{
-		const int lstatus = ncx_get_float_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3379
+		const int lstatus = ncx_get_float_int(xp, tp);
+#line 3379
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3379
 			status = lstatus;
+#line 3379
 	}
+#line 3379
 
+#line 3379
 	*xpp = (const void *)xp;
+#line 3379
 	return status;
-#  endif
+#line 3379
+#endif
+#line 3379
 }
+#line 3379
 
 int
-ncx_getn_float_int(const void **xpp, size_t nelems, int *tp)
+#line 3380
+ncx_getn_float_long(const void **xpp, size_t nelems, long *tp)
+#line 3380
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3380
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3380
 
+#line 3380
  /* basic algorithm is:
+#line 3380
   *   - ensure sane alignment of input data
+#line 3380
   *   - copy (conversion happens automatically) input data
+#line 3380
   *     to output
+#line 3380
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3380
   *     at next location for converted output
+#line 3380
   */
+#line 3380
   long i, j, ni;
+#line 3380
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3380
   float *xp;
+#line 3380
   int nrange = 0;         /* number of range errors */
+#line 3380
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3380
   long cxp = (long) *((char**)xpp);
+#line 3380
 
+#line 3380
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3380
   /* sjl: manually stripmine so we can limit amount of
+#line 3380
    * vector work space reserved to LOOPCNT elements. Also
+#line 3380
    * makes vectorisation easy */
+#line 3380
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3380
     ni=Min(nelems-j,LOOPCNT);
+#line 3380
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3380
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3380
       xp = tmp;
+#line 3380
     } else {
+#line 3380
       xp = (float *) *xpp;
+#line 3380
     }
+#line 3380
    /* copy the next block */
+#line 3380
 #pragma cdir loopcnt=LOOPCNT
+#line 3380
 #pragma cdir shortloop
+#line 3380
     for (i=0; i<ni; i++) {
-      tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3380
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3380
      /* test for range errors (not always needed but do it anyway) */
+#line 3380
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3380
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
-      nrange += xp[i] > INT_MAX || xp[i] < INT_MIN;
+#line 3380
+      nrange += xp[i] > LONG_MAX || xp[i] < LONG_MIN;
+#line 3380
     }
+#line 3380
    /* update xpp and tp */
+#line 3380
     if (realign) xp = (float *) *xpp;
+#line 3380
     xp += ni;
+#line 3380
     tp += ni;
+#line 3380
     *xpp = (void*)xp;
+#line 3380
   }
+#line 3380
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3380
 
+#line 3380
 #else   /* not SX */
+#line 3380
 	const char *xp = (const char *) *xpp;
+#line 3380
 	int status = NC_NOERR;
+#line 3380
 
+#line 3380
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3380
 	{
-		const int lstatus = ncx_get_float_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3380
+		const int lstatus = ncx_get_float_long(xp, tp);
+#line 3380
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3380
 			status = lstatus;
+#line 3380
 	}
+#line 3380
 
+#line 3380
 	*xpp = (const void *)xp;
+#line 3380
 	return status;
-#  endif
+#line 3380
+#endif
+#line 3380
 }
+#line 3380
 
 int
+#line 3381
 ncx_getn_float_double(const void **xpp, size_t nelems, double *tp)
+#line 3381
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3381
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3381
 
+#line 3381
  /* basic algorithm is:
+#line 3381
   *   - ensure sane alignment of input data
+#line 3381
   *   - copy (conversion happens automatically) input data
+#line 3381
   *     to output
+#line 3381
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3381
   *     at next location for converted output
+#line 3381
   */
+#line 3381
   long i, j, ni;
+#line 3381
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3381
   float *xp;
+#line 3381
   int nrange = 0;         /* number of range errors */
+#line 3381
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3381
   long cxp = (long) *((char**)xpp);
+#line 3381
 
+#line 3381
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3381
   /* sjl: manually stripmine so we can limit amount of
+#line 3381
    * vector work space reserved to LOOPCNT elements. Also
+#line 3381
    * makes vectorisation easy */
+#line 3381
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3381
     ni=Min(nelems-j,LOOPCNT);
+#line 3381
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3381
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3381
       xp = tmp;
+#line 3381
     } else {
+#line 3381
       xp = (float *) *xpp;
+#line 3381
     }
+#line 3381
    /* copy the next block */
+#line 3381
 #pragma cdir loopcnt=LOOPCNT
+#line 3381
 #pragma cdir shortloop
+#line 3381
     for (i=0; i<ni; i++) {
+#line 3381
       tp[i] = (double) Max( DOUBLE_MIN, Min(DOUBLE_MAX, (double) xp[i]));
+#line 3381
      /* test for range errors (not always needed but do it anyway) */
+#line 3381
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3381
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3381
       nrange += xp[i] > DOUBLE_MAX || xp[i] < DOUBLE_MIN;
+#line 3381
     }
+#line 3381
    /* update xpp and tp */
+#line 3381
     if (realign) xp = (float *) *xpp;
+#line 3381
     xp += ni;
+#line 3381
     tp += ni;
+#line 3381
     *xpp = (void*)xp;
+#line 3381
   }
+#line 3381
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3381
 
+#line 3381
 #else   /* not SX */
+#line 3381
 	const char *xp = (const char *) *xpp;
+#line 3381
 	int status = NC_NOERR;
+#line 3381
 
+#line 3381
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3381
 	{
+#line 3381
 		const int lstatus = ncx_get_float_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3381
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3381
 			status = lstatus;
+#line 3381
 	}
+#line 3381
 
+#line 3381
 	*xpp = (const void *)xp;
+#line 3381
 	return status;
-#  endif
+#line 3381
+#endif
+#line 3381
 }
+#line 3381
 
 int
+#line 3382
 ncx_getn_float_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3382
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3382
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3382
 
+#line 3382
  /* basic algorithm is:
+#line 3382
   *   - ensure sane alignment of input data
+#line 3382
   *   - copy (conversion happens automatically) input data
+#line 3382
   *     to output
+#line 3382
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3382
   *     at next location for converted output
+#line 3382
   */
+#line 3382
   long i, j, ni;
+#line 3382
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3382
   float *xp;
+#line 3382
   int nrange = 0;         /* number of range errors */
+#line 3382
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3382
   long cxp = (long) *((char**)xpp);
+#line 3382
 
+#line 3382
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3382
   /* sjl: manually stripmine so we can limit amount of
+#line 3382
    * vector work space reserved to LOOPCNT elements. Also
+#line 3382
    * makes vectorisation easy */
+#line 3382
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3382
     ni=Min(nelems-j,LOOPCNT);
+#line 3382
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3382
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3382
       xp = tmp;
+#line 3382
     } else {
+#line 3382
       xp = (float *) *xpp;
+#line 3382
     }
+#line 3382
    /* copy the next block */
+#line 3382
 #pragma cdir loopcnt=LOOPCNT
+#line 3382
 #pragma cdir shortloop
+#line 3382
     for (i=0; i<ni; i++) {
+#line 3382
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3382
      /* test for range errors (not always needed but do it anyway) */
+#line 3382
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3382
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3382
       nrange += xp[i] > LONGLONG_MAX || xp[i] < LONGLONG_MIN;
+#line 3382
     }
+#line 3382
    /* update xpp and tp */
+#line 3382
     if (realign) xp = (float *) *xpp;
+#line 3382
     xp += ni;
+#line 3382
     tp += ni;
+#line 3382
     *xpp = (void*)xp;
+#line 3382
   }
+#line 3382
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3382
 
+#line 3382
 #else   /* not SX */
+#line 3382
 	const char *xp = (const char *) *xpp;
+#line 3382
 	int status = NC_NOERR;
+#line 3382
 
+#line 3382
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3382
 	{
+#line 3382
 		const int lstatus = ncx_get_float_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3382
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3382
 			status = lstatus;
+#line 3382
 	}
+#line 3382
 
+#line 3382
 	*xpp = (const void *)xp;
+#line 3382
 	return status;
-#  endif
+#line 3382
+#endif
+#line 3382
 }
+#line 3382
 
 int
+#line 3383
 ncx_getn_float_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3383
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3383
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3383
 
+#line 3383
  /* basic algorithm is:
+#line 3383
   *   - ensure sane alignment of input data
+#line 3383
   *   - copy (conversion happens automatically) input data
+#line 3383
   *     to output
+#line 3383
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3383
   *     at next location for converted output
+#line 3383
   */
+#line 3383
   long i, j, ni;
+#line 3383
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3383
   float *xp;
+#line 3383
   int nrange = 0;         /* number of range errors */
+#line 3383
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3383
   long cxp = (long) *((char**)xpp);
+#line 3383
 
+#line 3383
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3383
   /* sjl: manually stripmine so we can limit amount of
+#line 3383
    * vector work space reserved to LOOPCNT elements. Also
+#line 3383
    * makes vectorisation easy */
+#line 3383
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3383
     ni=Min(nelems-j,LOOPCNT);
+#line 3383
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3383
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3383
       xp = tmp;
+#line 3383
     } else {
+#line 3383
       xp = (float *) *xpp;
+#line 3383
     }
+#line 3383
    /* copy the next block */
+#line 3383
 #pragma cdir loopcnt=LOOPCNT
+#line 3383
 #pragma cdir shortloop
+#line 3383
     for (i=0; i<ni; i++) {
+#line 3383
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3383
      /* test for range errors (not always needed but do it anyway) */
+#line 3383
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3383
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3383
       nrange += xp[i] > USHORT_MAX || xp[i] < 0;
+#line 3383
     }
+#line 3383
    /* update xpp and tp */
+#line 3383
     if (realign) xp = (float *) *xpp;
+#line 3383
     xp += ni;
+#line 3383
     tp += ni;
+#line 3383
     *xpp = (void*)xp;
+#line 3383
   }
+#line 3383
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3383
 
+#line 3383
 #else   /* not SX */
+#line 3383
 	const char *xp = (const char *) *xpp;
+#line 3383
 	int status = NC_NOERR;
+#line 3383
 
+#line 3383
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3383
 	{
+#line 3383
 		const int lstatus = ncx_get_float_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3383
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3383
 			status = lstatus;
+#line 3383
 	}
+#line 3383
 
+#line 3383
 	*xpp = (const void *)xp;
+#line 3383
 	return status;
-#  endif
+#line 3383
+#endif
+#line 3383
 }
+#line 3383
 
 int
+#line 3384
 ncx_getn_float_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3384
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3384
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3384
 
+#line 3384
  /* basic algorithm is:
+#line 3384
   *   - ensure sane alignment of input data
+#line 3384
   *   - copy (conversion happens automatically) input data
+#line 3384
   *     to output
+#line 3384
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3384
   *     at next location for converted output
+#line 3384
   */
+#line 3384
   long i, j, ni;
+#line 3384
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3384
   float *xp;
+#line 3384
   int nrange = 0;         /* number of range errors */
+#line 3384
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3384
   long cxp = (long) *((char**)xpp);
+#line 3384
 
+#line 3384
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3384
   /* sjl: manually stripmine so we can limit amount of
+#line 3384
    * vector work space reserved to LOOPCNT elements. Also
+#line 3384
    * makes vectorisation easy */
+#line 3384
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3384
     ni=Min(nelems-j,LOOPCNT);
+#line 3384
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3384
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3384
       xp = tmp;
+#line 3384
     } else {
+#line 3384
       xp = (float *) *xpp;
+#line 3384
     }
+#line 3384
    /* copy the next block */
+#line 3384
 #pragma cdir loopcnt=LOOPCNT
+#line 3384
 #pragma cdir shortloop
+#line 3384
     for (i=0; i<ni; i++) {
+#line 3384
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3384
      /* test for range errors (not always needed but do it anyway) */
+#line 3384
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3384
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3384
       nrange += xp[i] > UCHAR_MAX || xp[i] < 0;
+#line 3384
     }
+#line 3384
    /* update xpp and tp */
+#line 3384
     if (realign) xp = (float *) *xpp;
+#line 3384
     xp += ni;
+#line 3384
     tp += ni;
+#line 3384
     *xpp = (void*)xp;
+#line 3384
   }
+#line 3384
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3384
 
+#line 3384
 #else   /* not SX */
+#line 3384
 	const char *xp = (const char *) *xpp;
+#line 3384
 	int status = NC_NOERR;
+#line 3384
 
+#line 3384
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3384
 	{
+#line 3384
 		const int lstatus = ncx_get_float_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3384
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3384
 			status = lstatus;
+#line 3384
 	}
+#line 3384
 
+#line 3384
 	*xpp = (const void *)xp;
+#line 3384
 	return status;
-#  endif
+#line 3384
+#endif
+#line 3384
 }
+#line 3384
 
 int
+#line 3385
 ncx_getn_float_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3385
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3385
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3385
 
+#line 3385
  /* basic algorithm is:
+#line 3385
   *   - ensure sane alignment of input data
+#line 3385
   *   - copy (conversion happens automatically) input data
+#line 3385
   *     to output
+#line 3385
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3385
   *     at next location for converted output
+#line 3385
   */
+#line 3385
   long i, j, ni;
+#line 3385
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3385
   float *xp;
+#line 3385
   int nrange = 0;         /* number of range errors */
+#line 3385
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3385
   long cxp = (long) *((char**)xpp);
+#line 3385
 
+#line 3385
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3385
   /* sjl: manually stripmine so we can limit amount of
+#line 3385
    * vector work space reserved to LOOPCNT elements. Also
+#line 3385
    * makes vectorisation easy */
+#line 3385
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3385
     ni=Min(nelems-j,LOOPCNT);
+#line 3385
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3385
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3385
       xp = tmp;
+#line 3385
     } else {
+#line 3385
       xp = (float *) *xpp;
+#line 3385
     }
+#line 3385
    /* copy the next block */
+#line 3385
 #pragma cdir loopcnt=LOOPCNT
+#line 3385
 #pragma cdir shortloop
+#line 3385
     for (i=0; i<ni; i++) {
+#line 3385
       tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3385
      /* test for range errors (not always needed but do it anyway) */
+#line 3385
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3385
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3385
       nrange += xp[i] > UINT_MAX || xp[i] < 0;
+#line 3385
     }
+#line 3385
    /* update xpp and tp */
+#line 3385
     if (realign) xp = (float *) *xpp;
+#line 3385
     xp += ni;
+#line 3385
     tp += ni;
+#line 3385
     *xpp = (void*)xp;
+#line 3385
   }
+#line 3385
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3385
 
+#line 3385
 #else   /* not SX */
+#line 3385
 	const char *xp = (const char *) *xpp;
+#line 3385
 	int status = NC_NOERR;
+#line 3385
 
+#line 3385
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3385
 	{
+#line 3385
 		const int lstatus = ncx_get_float_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3385
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3385
 			status = lstatus;
+#line 3385
 	}
+#line 3385
 
+#line 3385
 	*xpp = (const void *)xp;
+#line 3385
 	return status;
-#  endif
+#line 3385
+#endif
+#line 3385
 }
+#line 3385
 
 int
+#line 3386
 ncx_getn_float_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3386
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3386
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3386
 
+#line 3386
  /* basic algorithm is:
+#line 3386
   *   - ensure sane alignment of input data
+#line 3386
   *   - copy (conversion happens automatically) input data
+#line 3386
   *     to output
+#line 3386
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3386
   *     at next location for converted output
+#line 3386
   */
+#line 3386
   long i, j, ni;
+#line 3386
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3386
   float *xp;
+#line 3386
   int nrange = 0;         /* number of range errors */
+#line 3386
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3386
   long cxp = (long) *((char**)xpp);
+#line 3386
 
+#line 3386
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3386
   /* sjl: manually stripmine so we can limit amount of
+#line 3386
    * vector work space reserved to LOOPCNT elements. Also
+#line 3386
    * makes vectorisation easy */
+#line 3386
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3386
     ni=Min(nelems-j,LOOPCNT);
+#line 3386
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_FLOAT);
+#line 3386
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_FLOAT));
+#line 3386
       xp = tmp;
+#line 3386
     } else {
+#line 3386
       xp = (float *) *xpp;
+#line 3386
     }
+#line 3386
    /* copy the next block */
+#line 3386
 #pragma cdir loopcnt=LOOPCNT
+#line 3386
 #pragma cdir shortloop
+#line 3386
     for (i=0; i<ni; i++) {
+#line 3386
       tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3386
      /* test for range errors (not always needed but do it anyway) */
+#line 3386
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3386
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3386
       nrange += xp[i] > ULONGLONG_MAX || xp[i] < 0;
+#line 3386
     }
+#line 3386
    /* update xpp and tp */
+#line 3386
     if (realign) xp = (float *) *xpp;
+#line 3386
     xp += ni;
+#line 3386
     tp += ni;
+#line 3386
     *xpp = (void*)xp;
+#line 3386
   }
+#line 3386
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3386
 
+#line 3386
 #else   /* not SX */
+#line 3386
 	const char *xp = (const char *) *xpp;
+#line 3386
 	int status = NC_NOERR;
+#line 3386
 
+#line 3386
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3386
 	{
+#line 3386
 		const int lstatus = ncx_get_float_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3386
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3386
 			status = lstatus;
+#line 3386
 	}
+#line 3386
 
+#line 3386
 	*xpp = (const void *)xp;
+#line 3386
 	return status;
-#  endif
+#line 3386
+#endif
+#line 3386
 }
+#line 3386
 
 
+int
+ncx_putn_float_float(void **xpp, size_t nelems, const float *tp, void *fillp)
 #if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT)
 /* optimized version */
-int
-ncx_putn_float_float(void **xpp, size_t nelems, const float *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_FLOAT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_FLOAT);
 # else
 	swapn4b(*xpp, tp, nelems);
 # endif
 	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_FLOAT);
 	return NC_NOERR;
 }
-#elif vax
-int
-ncx_putn_float_float(void **xpp, size_t nfloats, const float *ip)
+#elif defined(vax) && vax != 0
 {
-	const float *const end = ip + nfloats;
+	const float *const end = tp + nelems;
 
-	while(ip < end)
-	{
-		const struct vax_single *const vsp =
+	while (tp < end) {
+				const struct vax_single *const vsp =
+#line 3406
 			 (const struct vax_single *)ip;
+#line 3406
 		struct ieee_single *const isp = (struct ieee_single *) (*xpp);
+#line 3406
 
+#line 3406
 		switch(vsp->exp){
+#line 3406
 		case 0 :
+#line 3406
 			/* all vax float with zero exponent map to zero */
+#line 3406
 			*isp = min.ieee;
+#line 3406
 			break;
+#line 3406
 		case 2 :
+#line 3406
 		case 1 :
+#line 3406
 		{
+#line 3406
 			/* These will map to subnormals */
+#line 3406
 			unsigned mantissa = (vsp->mantissa1 << 16)
+#line 3406
 					 | vsp->mantissa2;
+#line 3406
 			mantissa >>= 3 - vsp->exp;
+#line 3406
 			mantissa += (1 << (20 + vsp->exp));
+#line 3406
 			isp->mant_lo_lo = mantissa;
+#line 3406
 			isp->mant_lo_hi = mantissa >> 8;
+#line 3406
 			isp->mant_hi = mantissa >> 16;
+#line 3406
 			isp->exp_lo = 0;
+#line 3406
 			isp->exp_hi = 0;
+#line 3406
 		}
+#line 3406
 			break;
+#line 3406
 		case 0xff : /* max.s.exp */
-			if( vsp->mantissa2 == max.s.mantissa2
-				&& vsp->mantissa1 == max.s.mantissa1)
+#line 3406
+			if (vsp->mantissa2 == max.s.mantissa2 &&
+#line 3406
+			    vsp->mantissa1 == max.s.mantissa1)
+#line 3406
 			{
+#line 3406
 				/* map largest vax float to ieee infinity */
+#line 3406
 				*isp = max.ieee;
+#line 3406
 				break;
+#line 3406
 			} /* else, fall thru */
+#line 3406
 		default :
+#line 3406
 		{
+#line 3406
 			unsigned exp = vsp->exp - VAX_SNG_BIAS + IEEE_SNG_BIAS;
+#line 3406
 			isp->exp_hi = exp >> 1;
+#line 3406
 			isp->exp_lo = exp;
+#line 3406
 			isp->mant_lo_lo = vsp->mantissa2;
+#line 3406
 			isp->mant_lo_hi = vsp->mantissa2 >> 8;
+#line 3406
 			isp->mant_hi = vsp->mantissa1;
+#line 3406
 		}
+#line 3406
 		}
+#line 3406
 
+#line 3406
 		isp->sign = vsp->sign;
+#line 3406
 
-
-		ip++;
+		tp++;
 		*xpp = (char *)(*xpp) + X_SIZEOF_FLOAT;
 	}
 	return NC_NOERR;
 }
 #else
-int
-ncx_putn_float_float(void **xpp, size_t nelems, const float *tp)
 {
 	char *xp = *xpp;
 	int status = NC_NOERR;
 
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) {
+		int lstatus = ncx_put_float_float(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
+			status = lstatus;
+	}
+
+	*xpp = (void *)xp;
+	return status;
+}
+#endif
+int
+#line 3427
+ncx_putn_float_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3427
+{
+#line 3427
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3427
+
+#line 3427
+ /* basic algorithm is:
+#line 3427
+  *   - ensure sane alignment of output data
+#line 3427
+  *   - copy (conversion happens automatically) input data
+#line 3427
+  *     to output
+#line 3427
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3427
+  *     at next location for converted output
+#line 3427
+  */
+#line 3427
+  long i, j, ni;
+#line 3427
+  float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3427
+  float *xp;
+#line 3427
+  int nrange = 0;         /* number of range errors */
+#line 3427
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3427
+  long cxp = (long) *((char**)xpp);
+#line 3427
+
+#line 3427
+  realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3427
+  /* sjl: manually stripmine so we can limit amount of
+#line 3427
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3427
+   * makes vectorisation easy */
+#line 3427
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3427
+    ni=Min(nelems-j,LOOPCNT);
+#line 3427
+    if (realign) {
+#line 3427
+      xp = tmp;
+#line 3427
+    } else {
+#line 3427
+      xp = (float *) *xpp;
+#line 3427
+    }
+#line 3427
+   /* copy the next block */
+#line 3427
+#pragma cdir loopcnt=LOOPCNT
+#line 3427
+#pragma cdir shortloop
+#line 3427
+    for (i=0; i<ni; i++) {
+#line 3427
+      /* the normal case: */
+#line 3427
+      xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3427
+     /* test for range errors (not always needed but do it anyway) */
+#line 3427
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3427
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3427
+      nrange += tp[i] > X_FLOAT_MAX || tp[i] < X_FLOAT_MIN;
+#line 3427
+    }
+#line 3427
+   /* copy workspace back if necessary */
+#line 3427
+    if (realign) {
+#line 3427
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3427
+      xp = (float *) *xpp;
+#line 3427
+    }
+#line 3427
+   /* update xpp and tp */
+#line 3427
+    xp += ni;
+#line 3427
+    tp += ni;
+#line 3427
+    *xpp = (void*)xp;
+#line 3427
+  }
+#line 3427
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3427
+
+#line 3427
+#else   /* not SX */
+#line 3427
+
+#line 3427
+	char *xp = (char *) *xpp;
+#line 3427
+	int status = NC_NOERR;
+#line 3427
+
+#line 3427
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3427
 	{
-		int lstatus = ncx_put_float_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3427
+		int lstatus = ncx_put_float_schar(xp, tp, fillp);
+#line 3427
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3427
 			status = lstatus;
+#line 3427
 	}
+#line 3427
 
+#line 3427
 	*xpp = (void *)xp;
+#line 3427
 	return status;
-}
+#line 3427
 #endif
+#line 3427
+}
+#line 3427
+
 int
-ncx_putn_float_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3428
+ncx_putn_float_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3428
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3428
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3428
 
+#line 3428
  /* basic algorithm is:
+#line 3428
   *   - ensure sane alignment of output data
+#line 3428
   *   - copy (conversion happens automatically) input data
+#line 3428
   *     to output
+#line 3428
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3428
   *     at next location for converted output
+#line 3428
   */
+#line 3428
   long i, j, ni;
+#line 3428
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3428
   float *xp;
+#line 3428
   int nrange = 0;         /* number of range errors */
+#line 3428
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3428
   long cxp = (long) *((char**)xpp);
+#line 3428
 
+#line 3428
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3428
   /* sjl: manually stripmine so we can limit amount of
+#line 3428
    * vector work space reserved to LOOPCNT elements. Also
+#line 3428
    * makes vectorisation easy */
+#line 3428
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3428
     ni=Min(nelems-j,LOOPCNT);
+#line 3428
     if (realign) {
+#line 3428
       xp = tmp;
+#line 3428
     } else {
+#line 3428
       xp = (float *) *xpp;
+#line 3428
     }
+#line 3428
    /* copy the next block */
+#line 3428
 #pragma cdir loopcnt=LOOPCNT
+#line 3428
 #pragma cdir shortloop
+#line 3428
     for (i=0; i<ni; i++) {
+#line 3428
       /* the normal case: */
+#line 3428
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3428
      /* test for range errors (not always needed but do it anyway) */
+#line 3428
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3428
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3428
       nrange += tp[i] > X_FLOAT_MAX || tp[i] < X_FLOAT_MIN;
+#line 3428
     }
+#line 3428
    /* copy workspace back if necessary */
+#line 3428
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3428
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3428
       xp = (float *) *xpp;
+#line 3428
     }
+#line 3428
    /* update xpp and tp */
+#line 3428
     xp += ni;
+#line 3428
     tp += ni;
+#line 3428
     *xpp = (void*)xp;
+#line 3428
   }
+#line 3428
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3428
 
+#line 3428
 #else   /* not SX */
+#line 3428
 
+#line 3428
 	char *xp = (char *) *xpp;
+#line 3428
 	int status = NC_NOERR;
+#line 3428
 
+#line 3428
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3428
 	{
-		int lstatus = ncx_put_float_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3428
+		int lstatus = ncx_put_float_short(xp, tp, fillp);
+#line 3428
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3428
 			status = lstatus;
+#line 3428
 	}
+#line 3428
 
+#line 3428
 	*xpp = (void *)xp;
+#line 3428
 	return status;
+#line 3428
 #endif
+#line 3428
 }
+#line 3428
 
 int
-ncx_putn_float_short(void **xpp, size_t nelems, const short *tp)
+#line 3429
+ncx_putn_float_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3429
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3429
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3429
 
+#line 3429
  /* basic algorithm is:
+#line 3429
   *   - ensure sane alignment of output data
+#line 3429
   *   - copy (conversion happens automatically) input data
+#line 3429
   *     to output
+#line 3429
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3429
   *     at next location for converted output
+#line 3429
   */
+#line 3429
   long i, j, ni;
+#line 3429
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3429
   float *xp;
+#line 3429
   int nrange = 0;         /* number of range errors */
+#line 3429
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3429
   long cxp = (long) *((char**)xpp);
+#line 3429
 
+#line 3429
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3429
   /* sjl: manually stripmine so we can limit amount of
+#line 3429
    * vector work space reserved to LOOPCNT elements. Also
+#line 3429
    * makes vectorisation easy */
+#line 3429
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3429
     ni=Min(nelems-j,LOOPCNT);
+#line 3429
     if (realign) {
+#line 3429
       xp = tmp;
+#line 3429
     } else {
+#line 3429
       xp = (float *) *xpp;
+#line 3429
     }
+#line 3429
    /* copy the next block */
+#line 3429
 #pragma cdir loopcnt=LOOPCNT
+#line 3429
 #pragma cdir shortloop
+#line 3429
     for (i=0; i<ni; i++) {
+#line 3429
       /* the normal case: */
+#line 3429
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3429
      /* test for range errors (not always needed but do it anyway) */
+#line 3429
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3429
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3429
       nrange += tp[i] > X_FLOAT_MAX || tp[i] < X_FLOAT_MIN;
+#line 3429
     }
+#line 3429
    /* copy workspace back if necessary */
+#line 3429
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3429
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3429
       xp = (float *) *xpp;
+#line 3429
     }
+#line 3429
    /* update xpp and tp */
+#line 3429
     xp += ni;
+#line 3429
     tp += ni;
+#line 3429
     *xpp = (void*)xp;
+#line 3429
   }
+#line 3429
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3429
 
+#line 3429
 #else   /* not SX */
+#line 3429
 
+#line 3429
 	char *xp = (char *) *xpp;
+#line 3429
 	int status = NC_NOERR;
+#line 3429
 
+#line 3429
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3429
 	{
-		int lstatus = ncx_put_float_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3429
+		int lstatus = ncx_put_float_int(xp, tp, fillp);
+#line 3429
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3429
 			status = lstatus;
+#line 3429
 	}
+#line 3429
 
+#line 3429
 	*xpp = (void *)xp;
+#line 3429
 	return status;
+#line 3429
 #endif
+#line 3429
 }
+#line 3429
 
 int
-ncx_putn_float_int(void **xpp, size_t nelems, const int *tp)
+#line 3430
+ncx_putn_float_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3430
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3430
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3430
 
+#line 3430
  /* basic algorithm is:
+#line 3430
   *   - ensure sane alignment of output data
+#line 3430
   *   - copy (conversion happens automatically) input data
+#line 3430
   *     to output
+#line 3430
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3430
   *     at next location for converted output
+#line 3430
   */
+#line 3430
   long i, j, ni;
+#line 3430
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3430
   float *xp;
+#line 3430
   int nrange = 0;         /* number of range errors */
+#line 3430
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3430
   long cxp = (long) *((char**)xpp);
+#line 3430
 
+#line 3430
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3430
   /* sjl: manually stripmine so we can limit amount of
+#line 3430
    * vector work space reserved to LOOPCNT elements. Also
+#line 3430
    * makes vectorisation easy */
+#line 3430
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3430
     ni=Min(nelems-j,LOOPCNT);
+#line 3430
     if (realign) {
+#line 3430
       xp = tmp;
+#line 3430
     } else {
+#line 3430
       xp = (float *) *xpp;
+#line 3430
     }
+#line 3430
    /* copy the next block */
+#line 3430
 #pragma cdir loopcnt=LOOPCNT
+#line 3430
 #pragma cdir shortloop
+#line 3430
     for (i=0; i<ni; i++) {
+#line 3430
       /* the normal case: */
+#line 3430
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3430
      /* test for range errors (not always needed but do it anyway) */
+#line 3430
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3430
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3430
       nrange += tp[i] > X_FLOAT_MAX || tp[i] < X_FLOAT_MIN;
+#line 3430
     }
+#line 3430
    /* copy workspace back if necessary */
+#line 3430
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3430
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3430
       xp = (float *) *xpp;
+#line 3430
     }
+#line 3430
    /* update xpp and tp */
+#line 3430
     xp += ni;
+#line 3430
     tp += ni;
+#line 3430
     *xpp = (void*)xp;
+#line 3430
   }
+#line 3430
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3430
 
+#line 3430
 #else   /* not SX */
+#line 3430
 
+#line 3430
 	char *xp = (char *) *xpp;
+#line 3430
 	int status = NC_NOERR;
+#line 3430
 
+#line 3430
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3430
 	{
-		int lstatus = ncx_put_float_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3430
+		int lstatus = ncx_put_float_long(xp, tp, fillp);
+#line 3430
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3430
 			status = lstatus;
+#line 3430
 	}
+#line 3430
 
+#line 3430
 	*xpp = (void *)xp;
+#line 3430
 	return status;
+#line 3430
 #endif
+#line 3430
 }
+#line 3430
 
 int
-ncx_putn_float_double(void **xpp, size_t nelems, const double *tp)
+#line 3431
+ncx_putn_float_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3431
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3431
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3431
 
+#line 3431
  /* basic algorithm is:
+#line 3431
   *   - ensure sane alignment of output data
+#line 3431
   *   - copy (conversion happens automatically) input data
+#line 3431
   *     to output
+#line 3431
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3431
   *     at next location for converted output
+#line 3431
   */
+#line 3431
   long i, j, ni;
+#line 3431
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3431
   float *xp;
+#line 3431
   int nrange = 0;         /* number of range errors */
+#line 3431
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3431
   long cxp = (long) *((char**)xpp);
+#line 3431
 
+#line 3431
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3431
   /* sjl: manually stripmine so we can limit amount of
+#line 3431
    * vector work space reserved to LOOPCNT elements. Also
+#line 3431
    * makes vectorisation easy */
+#line 3431
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3431
     ni=Min(nelems-j,LOOPCNT);
+#line 3431
     if (realign) {
+#line 3431
       xp = tmp;
+#line 3431
     } else {
+#line 3431
       xp = (float *) *xpp;
+#line 3431
     }
+#line 3431
    /* copy the next block */
+#line 3431
 #pragma cdir loopcnt=LOOPCNT
+#line 3431
 #pragma cdir shortloop
+#line 3431
     for (i=0; i<ni; i++) {
+#line 3431
       /* the normal case: */
+#line 3431
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3431
      /* test for range errors (not always needed but do it anyway) */
+#line 3431
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3431
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3431
       nrange += tp[i] > X_FLOAT_MAX || tp[i] < X_FLOAT_MIN;
+#line 3431
     }
+#line 3431
    /* copy workspace back if necessary */
+#line 3431
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3431
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3431
       xp = (float *) *xpp;
+#line 3431
     }
+#line 3431
    /* update xpp and tp */
+#line 3431
     xp += ni;
+#line 3431
     tp += ni;
+#line 3431
     *xpp = (void*)xp;
+#line 3431
   }
+#line 3431
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3431
 
+#line 3431
 #else   /* not SX */
+#line 3431
 
+#line 3431
 	char *xp = (char *) *xpp;
+#line 3431
 	int status = NC_NOERR;
+#line 3431
 
+#line 3431
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3431
 	{
-		int lstatus = ncx_put_float_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3431
+		int lstatus = ncx_put_float_double(xp, tp, fillp);
+#line 3431
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3431
 			status = lstatus;
+#line 3431
 	}
+#line 3431
 
+#line 3431
 	*xpp = (void *)xp;
+#line 3431
 	return status;
+#line 3431
 #endif
+#line 3431
 }
+#line 3431
 
 int
-ncx_putn_float_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3432
+ncx_putn_float_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3432
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3432
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3432
 
+#line 3432
  /* basic algorithm is:
+#line 3432
   *   - ensure sane alignment of output data
+#line 3432
   *   - copy (conversion happens automatically) input data
+#line 3432
   *     to output
+#line 3432
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3432
   *     at next location for converted output
+#line 3432
   */
+#line 3432
   long i, j, ni;
+#line 3432
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3432
   float *xp;
+#line 3432
   int nrange = 0;         /* number of range errors */
+#line 3432
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3432
   long cxp = (long) *((char**)xpp);
+#line 3432
 
+#line 3432
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3432
   /* sjl: manually stripmine so we can limit amount of
+#line 3432
    * vector work space reserved to LOOPCNT elements. Also
+#line 3432
    * makes vectorisation easy */
+#line 3432
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3432
     ni=Min(nelems-j,LOOPCNT);
+#line 3432
     if (realign) {
+#line 3432
       xp = tmp;
+#line 3432
     } else {
+#line 3432
       xp = (float *) *xpp;
+#line 3432
     }
+#line 3432
    /* copy the next block */
+#line 3432
 #pragma cdir loopcnt=LOOPCNT
+#line 3432
 #pragma cdir shortloop
+#line 3432
     for (i=0; i<ni; i++) {
+#line 3432
       /* the normal case: */
+#line 3432
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3432
      /* test for range errors (not always needed but do it anyway) */
+#line 3432
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3432
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3432
       nrange += tp[i] > X_FLOAT_MAX || tp[i] < X_FLOAT_MIN;
+#line 3432
     }
+#line 3432
    /* copy workspace back if necessary */
+#line 3432
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3432
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3432
       xp = (float *) *xpp;
+#line 3432
     }
+#line 3432
    /* update xpp and tp */
+#line 3432
     xp += ni;
+#line 3432
     tp += ni;
+#line 3432
     *xpp = (void*)xp;
+#line 3432
   }
+#line 3432
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3432
 
+#line 3432
 #else   /* not SX */
+#line 3432
 
+#line 3432
 	char *xp = (char *) *xpp;
+#line 3432
 	int status = NC_NOERR;
+#line 3432
 
+#line 3432
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3432
 	{
-		int lstatus = ncx_put_float_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3432
+		int lstatus = ncx_put_float_longlong(xp, tp, fillp);
+#line 3432
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3432
 			status = lstatus;
+#line 3432
 	}
+#line 3432
 
+#line 3432
 	*xpp = (void *)xp;
+#line 3432
 	return status;
+#line 3432
 #endif
+#line 3432
 }
+#line 3432
 
 int
-ncx_putn_float_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3433
+ncx_putn_float_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3433
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3433
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3433
 
+#line 3433
  /* basic algorithm is:
+#line 3433
   *   - ensure sane alignment of output data
+#line 3433
   *   - copy (conversion happens automatically) input data
+#line 3433
   *     to output
+#line 3433
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3433
   *     at next location for converted output
+#line 3433
   */
+#line 3433
   long i, j, ni;
+#line 3433
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3433
   float *xp;
+#line 3433
   int nrange = 0;         /* number of range errors */
+#line 3433
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3433
   long cxp = (long) *((char**)xpp);
+#line 3433
 
+#line 3433
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3433
   /* sjl: manually stripmine so we can limit amount of
+#line 3433
    * vector work space reserved to LOOPCNT elements. Also
+#line 3433
    * makes vectorisation easy */
+#line 3433
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3433
     ni=Min(nelems-j,LOOPCNT);
+#line 3433
     if (realign) {
+#line 3433
       xp = tmp;
+#line 3433
     } else {
+#line 3433
       xp = (float *) *xpp;
+#line 3433
     }
+#line 3433
    /* copy the next block */
+#line 3433
 #pragma cdir loopcnt=LOOPCNT
+#line 3433
 #pragma cdir shortloop
+#line 3433
     for (i=0; i<ni; i++) {
+#line 3433
       /* the normal case: */
+#line 3433
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3433
      /* test for range errors (not always needed but do it anyway) */
+#line 3433
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3433
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3433
       nrange += tp[i] > X_FLOAT_MAX ;
+#line 3433
     }
+#line 3433
    /* copy workspace back if necessary */
+#line 3433
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3433
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3433
       xp = (float *) *xpp;
+#line 3433
     }
+#line 3433
    /* update xpp and tp */
+#line 3433
     xp += ni;
+#line 3433
     tp += ni;
+#line 3433
     *xpp = (void*)xp;
+#line 3433
   }
+#line 3433
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3433
 
+#line 3433
 #else   /* not SX */
+#line 3433
 
+#line 3433
 	char *xp = (char *) *xpp;
+#line 3433
 	int status = NC_NOERR;
+#line 3433
 
+#line 3433
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3433
 	{
-		int lstatus = ncx_put_float_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3433
+		int lstatus = ncx_put_float_uchar(xp, tp, fillp);
+#line 3433
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3433
 			status = lstatus;
+#line 3433
 	}
+#line 3433
 
+#line 3433
 	*xpp = (void *)xp;
+#line 3433
 	return status;
+#line 3433
 #endif
+#line 3433
 }
+#line 3433
 
 int
-ncx_putn_float_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3434
+ncx_putn_float_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3434
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3434
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3434
 
+#line 3434
  /* basic algorithm is:
+#line 3434
   *   - ensure sane alignment of output data
+#line 3434
   *   - copy (conversion happens automatically) input data
+#line 3434
   *     to output
+#line 3434
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3434
   *     at next location for converted output
+#line 3434
   */
+#line 3434
   long i, j, ni;
+#line 3434
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3434
   float *xp;
+#line 3434
   int nrange = 0;         /* number of range errors */
+#line 3434
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3434
   long cxp = (long) *((char**)xpp);
+#line 3434
 
+#line 3434
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3434
   /* sjl: manually stripmine so we can limit amount of
+#line 3434
    * vector work space reserved to LOOPCNT elements. Also
+#line 3434
    * makes vectorisation easy */
+#line 3434
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3434
     ni=Min(nelems-j,LOOPCNT);
+#line 3434
     if (realign) {
+#line 3434
       xp = tmp;
+#line 3434
     } else {
+#line 3434
       xp = (float *) *xpp;
+#line 3434
     }
+#line 3434
    /* copy the next block */
+#line 3434
 #pragma cdir loopcnt=LOOPCNT
+#line 3434
 #pragma cdir shortloop
+#line 3434
     for (i=0; i<ni; i++) {
+#line 3434
       /* the normal case: */
+#line 3434
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3434
      /* test for range errors (not always needed but do it anyway) */
+#line 3434
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3434
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3434
       nrange += tp[i] > X_FLOAT_MAX ;
+#line 3434
     }
+#line 3434
    /* copy workspace back if necessary */
+#line 3434
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3434
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3434
       xp = (float *) *xpp;
+#line 3434
     }
+#line 3434
    /* update xpp and tp */
+#line 3434
     xp += ni;
+#line 3434
     tp += ni;
+#line 3434
     *xpp = (void*)xp;
+#line 3434
   }
+#line 3434
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3434
 
+#line 3434
 #else   /* not SX */
+#line 3434
 
+#line 3434
 	char *xp = (char *) *xpp;
+#line 3434
 	int status = NC_NOERR;
+#line 3434
 
+#line 3434
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3434
 	{
-		int lstatus = ncx_put_float_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3434
+		int lstatus = ncx_put_float_ushort(xp, tp, fillp);
+#line 3434
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3434
 			status = lstatus;
+#line 3434
 	}
+#line 3434
 
+#line 3434
 	*xpp = (void *)xp;
+#line 3434
 	return status;
+#line 3434
 #endif
+#line 3434
 }
+#line 3434
 
 int
-ncx_putn_float_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3435
+ncx_putn_float_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3435
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3435
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3435
 
+#line 3435
  /* basic algorithm is:
+#line 3435
   *   - ensure sane alignment of output data
+#line 3435
   *   - copy (conversion happens automatically) input data
+#line 3435
   *     to output
+#line 3435
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3435
   *     at next location for converted output
+#line 3435
   */
+#line 3435
   long i, j, ni;
+#line 3435
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3435
   float *xp;
+#line 3435
   int nrange = 0;         /* number of range errors */
+#line 3435
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3435
   long cxp = (long) *((char**)xpp);
+#line 3435
 
+#line 3435
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3435
   /* sjl: manually stripmine so we can limit amount of
+#line 3435
    * vector work space reserved to LOOPCNT elements. Also
+#line 3435
    * makes vectorisation easy */
+#line 3435
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3435
     ni=Min(nelems-j,LOOPCNT);
+#line 3435
     if (realign) {
+#line 3435
       xp = tmp;
+#line 3435
     } else {
+#line 3435
       xp = (float *) *xpp;
+#line 3435
     }
+#line 3435
    /* copy the next block */
+#line 3435
 #pragma cdir loopcnt=LOOPCNT
+#line 3435
 #pragma cdir shortloop
+#line 3435
     for (i=0; i<ni; i++) {
+#line 3435
       /* the normal case: */
+#line 3435
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3435
      /* test for range errors (not always needed but do it anyway) */
+#line 3435
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3435
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3435
       nrange += tp[i] > X_FLOAT_MAX ;
+#line 3435
     }
+#line 3435
    /* copy workspace back if necessary */
+#line 3435
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3435
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3435
       xp = (float *) *xpp;
+#line 3435
     }
+#line 3435
    /* update xpp and tp */
+#line 3435
     xp += ni;
+#line 3435
     tp += ni;
+#line 3435
     *xpp = (void*)xp;
+#line 3435
   }
+#line 3435
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3435
 
+#line 3435
 #else   /* not SX */
+#line 3435
 
+#line 3435
 	char *xp = (char *) *xpp;
+#line 3435
 	int status = NC_NOERR;
+#line 3435
 
+#line 3435
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3435
 	{
-		int lstatus = ncx_put_float_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3435
+		int lstatus = ncx_put_float_uint(xp, tp, fillp);
+#line 3435
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3435
 			status = lstatus;
+#line 3435
 	}
+#line 3435
 
+#line 3435
 	*xpp = (void *)xp;
+#line 3435
 	return status;
+#line 3435
 #endif
+#line 3435
 }
+#line 3435
 
 int
-ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3436
+ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3436
 {
-#if _SX && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3436
+#if defined(_SX) && _SX != 0 && X_SIZEOF_FLOAT == SIZEOF_FLOAT
+#line 3436
 
+#line 3436
  /* basic algorithm is:
+#line 3436
   *   - ensure sane alignment of output data
+#line 3436
   *   - copy (conversion happens automatically) input data
+#line 3436
   *     to output
+#line 3436
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3436
   *     at next location for converted output
+#line 3436
   */
+#line 3436
   long i, j, ni;
+#line 3436
   float tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3436
   float *xp;
+#line 3436
   int nrange = 0;         /* number of range errors */
+#line 3436
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3436
   long cxp = (long) *((char**)xpp);
+#line 3436
 
+#line 3436
   realign = (cxp & 7) % SIZEOF_FLOAT;
+#line 3436
   /* sjl: manually stripmine so we can limit amount of
+#line 3436
    * vector work space reserved to LOOPCNT elements. Also
+#line 3436
    * makes vectorisation easy */
+#line 3436
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3436
     ni=Min(nelems-j,LOOPCNT);
+#line 3436
     if (realign) {
+#line 3436
       xp = tmp;
+#line 3436
     } else {
+#line 3436
       xp = (float *) *xpp;
+#line 3436
     }
+#line 3436
    /* copy the next block */
+#line 3436
 #pragma cdir loopcnt=LOOPCNT
+#line 3436
 #pragma cdir shortloop
+#line 3436
     for (i=0; i<ni; i++) {
+#line 3436
       /* the normal case: */
+#line 3436
       xp[i] = (float) Max( X_FLOAT_MIN, Min(X_FLOAT_MAX, (float) tp[i]));
+#line 3436
      /* test for range errors (not always needed but do it anyway) */
+#line 3436
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3436
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3436
       nrange += tp[i] > X_FLOAT_MAX ;
+#line 3436
     }
+#line 3436
    /* copy workspace back if necessary */
+#line 3436
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT);
+#line 3436
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_FLOAT);
+#line 3436
       xp = (float *) *xpp;
+#line 3436
     }
+#line 3436
    /* update xpp and tp */
+#line 3436
     xp += ni;
+#line 3436
     tp += ni;
+#line 3436
     *xpp = (void*)xp;
+#line 3436
   }
+#line 3436
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3436
 
+#line 3436
 #else   /* not SX */
+#line 3436
 
+#line 3436
 	char *xp = (char *) *xpp;
+#line 3436
 	int status = NC_NOERR;
+#line 3436
 
+#line 3436
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
+#line 3436
 	{
-		int lstatus = ncx_put_float_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3436
+		int lstatus = ncx_put_float_ulonglong(xp, tp, fillp);
+#line 3436
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3436
 			status = lstatus;
+#line 3436
 	}
+#line 3436
 
+#line 3436
 	*xpp = (void *)xp;
+#line 3436
 	return status;
+#line 3436
 #endif
+#line 3436
 }
+#line 3436
 
 
 /* double --------------------------------------------------------------------*/
@@ -13051,62 +28318,103 @@ int
 ncx_getn_double_double(const void **xpp, size_t nelems, double *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(double));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_DOUBLE);
 # else
 	swapn8b(tp, *xpp, nelems);
 # endif
 	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_DOUBLE);
 	return NC_NOERR;
 }
-#elif vax
+#elif defined(vax) && vax != 0
 int
 ncx_getn_double_double(const void **xpp, size_t ndoubles, double *ip)
 {
 	double *const end = ip + ndoubles;
 
-	while(ip < end)
+	while (ip < end)
 	{
 	struct vax_double *const vdp =
+#line 3461
 			 (struct vax_double *)ip;
+#line 3461
 	const struct ieee_double *const idp =
+#line 3461
 			 (const struct ieee_double *) (*xpp);
+#line 3461
 	{
+#line 3461
 		const struct dbl_limits *lim;
+#line 3461
 		int ii;
+#line 3461
 		for (ii = 0, lim = dbl_limits;
+#line 3461
 			ii < sizeof(dbl_limits)/sizeof(struct dbl_limits);
+#line 3461
 			ii++, lim++)
+#line 3461
 		{
+#line 3461
 			if ((idp->mant_lo == lim->ieee.mant_lo)
+#line 3461
 				&& (idp->mant_4 == lim->ieee.mant_4)
+#line 3461
 				&& (idp->mant_5 == lim->ieee.mant_5)
+#line 3461
 				&& (idp->mant_6 == lim->ieee.mant_6)
+#line 3461
 				&& (idp->exp_lo == lim->ieee.exp_lo)
+#line 3461
 				&& (idp->exp_hi == lim->ieee.exp_hi)
+#line 3461
 				)
+#line 3461
 			{
+#line 3461
 				*vdp = lim->d;
+#line 3461
 				goto doneit;
+#line 3461
 			}
+#line 3461
 		}
+#line 3461
 	}
+#line 3461
 	{
+#line 3461
 		unsigned exp = idp->exp_hi << 4 | idp->exp_lo;
+#line 3461
 		vdp->exp = exp - IEEE_DBL_BIAS + VAX_DBL_BIAS;
+#line 3461
 	}
+#line 3461
 	{
+#line 3461
 		unsigned mant_hi = ((idp->mant_6 << 16)
+#line 3461
 				 | (idp->mant_5 << 8)
+#line 3461
 				 | idp->mant_4);
+#line 3461
 		unsigned mant_lo = SWAP4(idp->mant_lo);
+#line 3461
 		vdp->mantissa1 = (mant_hi >> 13);
+#line 3461
 		vdp->mantissa2 = ((mant_hi & MASK(13)) << 3)
+#line 3461
 				| (mant_lo >> 29);
+#line 3461
 		vdp->mantissa3 = (mant_lo >> 13);
+#line 3461
 		vdp->mantissa4 = (mant_lo << 3);
+#line 3461
 	}
+#line 3461
 	doneit:
+#line 3461
 		vdp->sign = idp->sign;
+#line 3461
 
 		ip++;
 		*xpp = (char *)(*xpp) + X_SIZEOF_DOUBLE;
@@ -13123,8 +28431,8 @@ ncx_getn_double_double(const void **xpp, size_t nelems, double *tp)
 
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
 	{
-		const int lstatus = ncx_get_double_double(xp, tp);
-		if(lstatus != NC_NOERR)
+		const int lstatus = ncx_get_double_double(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
@@ -13133,671 +28441,1435 @@ ncx_getn_double_double(const void **xpp, size_t nelems, double *tp)
 }
 #endif
 int
+#line 3486
 ncx_getn_double_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3486
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3486
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3486
 
+#line 3486
  /* basic algorithm is:
+#line 3486
   *   - ensure sane alignment of input data
+#line 3486
   *   - copy (conversion happens automatically) input data
+#line 3486
   *     to output
+#line 3486
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3486
   *     at next location for converted output
+#line 3486
   */
+#line 3486
   long i, j, ni;
+#line 3486
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3486
   double *xp;
+#line 3486
   int nrange = 0;         /* number of range errors */
+#line 3486
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3486
   long cxp = (long) *((char**)xpp);
+#line 3486
 
+#line 3486
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3486
   /* sjl: manually stripmine so we can limit amount of
+#line 3486
    * vector work space reserved to LOOPCNT elements. Also
+#line 3486
    * makes vectorisation easy */
+#line 3486
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3486
     ni=Min(nelems-j,LOOPCNT);
+#line 3486
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3486
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3486
       xp = tmp;
+#line 3486
     } else {
+#line 3486
       xp = (double *) *xpp;
+#line 3486
     }
+#line 3486
    /* copy the next block */
+#line 3486
 #pragma cdir loopcnt=LOOPCNT
+#line 3486
 #pragma cdir shortloop
+#line 3486
     for (i=0; i<ni; i++) {
+#line 3486
       tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3486
      /* test for range errors (not always needed but do it anyway) */
+#line 3486
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3486
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3486
       nrange += xp[i] > SCHAR_MAX || xp[i] < SCHAR_MIN;
+#line 3486
     }
+#line 3486
    /* update xpp and tp */
+#line 3486
     if (realign) xp = (double *) *xpp;
+#line 3486
     xp += ni;
+#line 3486
     tp += ni;
+#line 3486
     *xpp = (void*)xp;
+#line 3486
   }
+#line 3486
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3486
 
+#line 3486
 #else   /* not SX */
+#line 3486
 	const char *xp = (const char *) *xpp;
+#line 3486
 	int status = NC_NOERR;
+#line 3486
 
+#line 3486
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3486
 	{
+#line 3486
 		const int lstatus = ncx_get_double_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3486
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3486
 			status = lstatus;
+#line 3486
 	}
+#line 3486
 
+#line 3486
 	*xpp = (const void *)xp;
+#line 3486
 	return status;
-#  endif
+#line 3486
+#endif
+#line 3486
 }
+#line 3486
 
 int
+#line 3487
 ncx_getn_double_short(const void **xpp, size_t nelems, short *tp)
+#line 3487
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3487
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3487
 
+#line 3487
  /* basic algorithm is:
+#line 3487
   *   - ensure sane alignment of input data
+#line 3487
   *   - copy (conversion happens automatically) input data
+#line 3487
   *     to output
+#line 3487
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3487
   *     at next location for converted output
+#line 3487
   */
+#line 3487
   long i, j, ni;
+#line 3487
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3487
   double *xp;
+#line 3487
   int nrange = 0;         /* number of range errors */
+#line 3487
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3487
   long cxp = (long) *((char**)xpp);
+#line 3487
 
+#line 3487
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3487
   /* sjl: manually stripmine so we can limit amount of
+#line 3487
    * vector work space reserved to LOOPCNT elements. Also
+#line 3487
    * makes vectorisation easy */
+#line 3487
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3487
     ni=Min(nelems-j,LOOPCNT);
+#line 3487
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3487
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3487
       xp = tmp;
+#line 3487
     } else {
+#line 3487
       xp = (double *) *xpp;
+#line 3487
     }
+#line 3487
    /* copy the next block */
+#line 3487
 #pragma cdir loopcnt=LOOPCNT
+#line 3487
 #pragma cdir shortloop
+#line 3487
     for (i=0; i<ni; i++) {
+#line 3487
       tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3487
      /* test for range errors (not always needed but do it anyway) */
+#line 3487
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3487
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3487
       nrange += xp[i] > SHORT_MAX || xp[i] < SHORT_MIN;
+#line 3487
     }
+#line 3487
    /* update xpp and tp */
+#line 3487
     if (realign) xp = (double *) *xpp;
+#line 3487
     xp += ni;
+#line 3487
     tp += ni;
+#line 3487
     *xpp = (void*)xp;
+#line 3487
   }
+#line 3487
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3487
 
+#line 3487
 #else   /* not SX */
+#line 3487
 	const char *xp = (const char *) *xpp;
+#line 3487
 	int status = NC_NOERR;
+#line 3487
 
+#line 3487
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3487
 	{
+#line 3487
 		const int lstatus = ncx_get_double_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3487
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3487
 			status = lstatus;
+#line 3487
 	}
+#line 3487
 
+#line 3487
 	*xpp = (const void *)xp;
+#line 3487
 	return status;
-#  endif
+#line 3487
+#endif
+#line 3487
 }
+#line 3487
 
 int
+#line 3488
 ncx_getn_double_int(const void **xpp, size_t nelems, int *tp)
+#line 3488
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3488
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3488
 
+#line 3488
  /* basic algorithm is:
+#line 3488
   *   - ensure sane alignment of input data
+#line 3488
   *   - copy (conversion happens automatically) input data
+#line 3488
   *     to output
+#line 3488
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3488
   *     at next location for converted output
+#line 3488
   */
+#line 3488
   long i, j, ni;
+#line 3488
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3488
   double *xp;
+#line 3488
   int nrange = 0;         /* number of range errors */
+#line 3488
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3488
   long cxp = (long) *((char**)xpp);
+#line 3488
 
+#line 3488
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3488
   /* sjl: manually stripmine so we can limit amount of
+#line 3488
    * vector work space reserved to LOOPCNT elements. Also
+#line 3488
    * makes vectorisation easy */
+#line 3488
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3488
     ni=Min(nelems-j,LOOPCNT);
+#line 3488
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3488
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3488
       xp = tmp;
+#line 3488
     } else {
+#line 3488
       xp = (double *) *xpp;
+#line 3488
     }
+#line 3488
    /* copy the next block */
+#line 3488
 #pragma cdir loopcnt=LOOPCNT
+#line 3488
 #pragma cdir shortloop
+#line 3488
     for (i=0; i<ni; i++) {
+#line 3488
       tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3488
      /* test for range errors (not always needed but do it anyway) */
+#line 3488
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3488
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3488
       nrange += xp[i] > INT_MAX || xp[i] < INT_MIN;
+#line 3488
     }
+#line 3488
    /* update xpp and tp */
+#line 3488
     if (realign) xp = (double *) *xpp;
+#line 3488
     xp += ni;
+#line 3488
     tp += ni;
+#line 3488
     *xpp = (void*)xp;
+#line 3488
   }
+#line 3488
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3488
 
+#line 3488
 #else   /* not SX */
+#line 3488
 	const char *xp = (const char *) *xpp;
+#line 3488
 	int status = NC_NOERR;
+#line 3488
 
+#line 3488
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3488
 	{
+#line 3488
 		const int lstatus = ncx_get_double_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3488
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3488
 			status = lstatus;
+#line 3488
 	}
+#line 3488
 
+#line 3488
 	*xpp = (const void *)xp;
+#line 3488
 	return status;
-#  endif
+#line 3488
+#endif
+#line 3488
+}
+#line 3488
+
+int
+#line 3489
+ncx_getn_double_long(const void **xpp, size_t nelems, long *tp)
+#line 3489
+{
+#line 3489
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3489
+
+#line 3489
+ /* basic algorithm is:
+#line 3489
+  *   - ensure sane alignment of input data
+#line 3489
+  *   - copy (conversion happens automatically) input data
+#line 3489
+  *     to output
+#line 3489
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3489
+  *     at next location for converted output
+#line 3489
+  */
+#line 3489
+  long i, j, ni;
+#line 3489
+  double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3489
+  double *xp;
+#line 3489
+  int nrange = 0;         /* number of range errors */
+#line 3489
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3489
+  long cxp = (long) *((char**)xpp);
+#line 3489
+
+#line 3489
+  realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3489
+  /* sjl: manually stripmine so we can limit amount of
+#line 3489
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3489
+   * makes vectorisation easy */
+#line 3489
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3489
+    ni=Min(nelems-j,LOOPCNT);
+#line 3489
+    if (realign) {
+#line 3489
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3489
+      xp = tmp;
+#line 3489
+    } else {
+#line 3489
+      xp = (double *) *xpp;
+#line 3489
+    }
+#line 3489
+   /* copy the next block */
+#line 3489
+#pragma cdir loopcnt=LOOPCNT
+#line 3489
+#pragma cdir shortloop
+#line 3489
+    for (i=0; i<ni; i++) {
+#line 3489
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3489
+     /* test for range errors (not always needed but do it anyway) */
+#line 3489
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3489
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3489
+      nrange += xp[i] > LONG_MAX || xp[i] < LONG_MIN;
+#line 3489
+    }
+#line 3489
+   /* update xpp and tp */
+#line 3489
+    if (realign) xp = (double *) *xpp;
+#line 3489
+    xp += ni;
+#line 3489
+    tp += ni;
+#line 3489
+    *xpp = (void*)xp;
+#line 3489
+  }
+#line 3489
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3489
+
+#line 3489
+#else   /* not SX */
+#line 3489
+	const char *xp = (const char *) *xpp;
+#line 3489
+	int status = NC_NOERR;
+#line 3489
+
+#line 3489
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3489
+	{
+#line 3489
+		const int lstatus = ncx_get_double_long(xp, tp);
+#line 3489
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3489
+			status = lstatus;
+#line 3489
+	}
+#line 3489
+
+#line 3489
+	*xpp = (const void *)xp;
+#line 3489
+	return status;
+#line 3489
+#endif
+#line 3489
 }
+#line 3489
 
 int
+#line 3490
 ncx_getn_double_float(const void **xpp, size_t nelems, float *tp)
+#line 3490
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3490
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3490
 
+#line 3490
  /* basic algorithm is:
+#line 3490
   *   - ensure sane alignment of input data
+#line 3490
   *   - copy (conversion happens automatically) input data
+#line 3490
   *     to output
+#line 3490
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3490
   *     at next location for converted output
+#line 3490
   */
+#line 3490
   long i, j, ni;
+#line 3490
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3490
   double *xp;
+#line 3490
   int nrange = 0;         /* number of range errors */
+#line 3490
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3490
   long cxp = (long) *((char**)xpp);
+#line 3490
 
+#line 3490
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3490
   /* sjl: manually stripmine so we can limit amount of
+#line 3490
    * vector work space reserved to LOOPCNT elements. Also
+#line 3490
    * makes vectorisation easy */
+#line 3490
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3490
     ni=Min(nelems-j,LOOPCNT);
+#line 3490
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3490
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3490
       xp = tmp;
+#line 3490
     } else {
+#line 3490
       xp = (double *) *xpp;
+#line 3490
     }
+#line 3490
    /* copy the next block */
+#line 3490
 #pragma cdir loopcnt=LOOPCNT
+#line 3490
 #pragma cdir shortloop
+#line 3490
     for (i=0; i<ni; i++) {
+#line 3490
       tp[i] = (float) Max( FLOAT_MIN, Min(FLOAT_MAX, (float) xp[i]));
+#line 3490
      /* test for range errors (not always needed but do it anyway) */
+#line 3490
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3490
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3490
       nrange += xp[i] > FLOAT_MAX || xp[i] < FLOAT_MIN;
+#line 3490
     }
+#line 3490
    /* update xpp and tp */
+#line 3490
     if (realign) xp = (double *) *xpp;
+#line 3490
     xp += ni;
+#line 3490
     tp += ni;
+#line 3490
     *xpp = (void*)xp;
+#line 3490
   }
+#line 3490
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3490
 
+#line 3490
 #else   /* not SX */
+#line 3490
 	const char *xp = (const char *) *xpp;
+#line 3490
 	int status = NC_NOERR;
+#line 3490
 
+#line 3490
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3490
 	{
+#line 3490
 		const int lstatus = ncx_get_double_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3490
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3490
 			status = lstatus;
+#line 3490
 	}
+#line 3490
 
+#line 3490
 	*xpp = (const void *)xp;
+#line 3490
 	return status;
-#  endif
+#line 3490
+#endif
+#line 3490
 }
+#line 3490
 
 int
+#line 3491
 ncx_getn_double_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3491
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3491
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3491
 
+#line 3491
  /* basic algorithm is:
+#line 3491
   *   - ensure sane alignment of input data
+#line 3491
   *   - copy (conversion happens automatically) input data
+#line 3491
   *     to output
+#line 3491
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3491
   *     at next location for converted output
+#line 3491
   */
+#line 3491
   long i, j, ni;
+#line 3491
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3491
   double *xp;
+#line 3491
   int nrange = 0;         /* number of range errors */
+#line 3491
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3491
   long cxp = (long) *((char**)xpp);
+#line 3491
 
+#line 3491
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3491
   /* sjl: manually stripmine so we can limit amount of
+#line 3491
    * vector work space reserved to LOOPCNT elements. Also
+#line 3491
    * makes vectorisation easy */
+#line 3491
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3491
     ni=Min(nelems-j,LOOPCNT);
+#line 3491
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3491
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3491
       xp = tmp;
+#line 3491
     } else {
+#line 3491
       xp = (double *) *xpp;
+#line 3491
     }
+#line 3491
    /* copy the next block */
+#line 3491
 #pragma cdir loopcnt=LOOPCNT
+#line 3491
 #pragma cdir shortloop
+#line 3491
     for (i=0; i<ni; i++) {
+#line 3491
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3491
      /* test for range errors (not always needed but do it anyway) */
+#line 3491
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3491
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3491
       nrange += xp[i] > LONGLONG_MAX || xp[i] < LONGLONG_MIN;
+#line 3491
     }
+#line 3491
    /* update xpp and tp */
+#line 3491
     if (realign) xp = (double *) *xpp;
+#line 3491
     xp += ni;
+#line 3491
     tp += ni;
+#line 3491
     *xpp = (void*)xp;
+#line 3491
   }
+#line 3491
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3491
 
+#line 3491
 #else   /* not SX */
+#line 3491
 	const char *xp = (const char *) *xpp;
+#line 3491
 	int status = NC_NOERR;
+#line 3491
 
+#line 3491
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3491
 	{
+#line 3491
 		const int lstatus = ncx_get_double_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3491
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3491
 			status = lstatus;
+#line 3491
 	}
+#line 3491
 
+#line 3491
 	*xpp = (const void *)xp;
+#line 3491
 	return status;
-#  endif
+#line 3491
+#endif
+#line 3491
 }
+#line 3491
 
 int
+#line 3492
 ncx_getn_double_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3492
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3492
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3492
 
+#line 3492
  /* basic algorithm is:
+#line 3492
   *   - ensure sane alignment of input data
+#line 3492
   *   - copy (conversion happens automatically) input data
+#line 3492
   *     to output
+#line 3492
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3492
   *     at next location for converted output
+#line 3492
   */
+#line 3492
   long i, j, ni;
+#line 3492
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3492
   double *xp;
+#line 3492
   int nrange = 0;         /* number of range errors */
+#line 3492
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3492
   long cxp = (long) *((char**)xpp);
+#line 3492
 
+#line 3492
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3492
   /* sjl: manually stripmine so we can limit amount of
+#line 3492
    * vector work space reserved to LOOPCNT elements. Also
+#line 3492
    * makes vectorisation easy */
+#line 3492
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3492
     ni=Min(nelems-j,LOOPCNT);
+#line 3492
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3492
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3492
       xp = tmp;
+#line 3492
     } else {
+#line 3492
       xp = (double *) *xpp;
+#line 3492
     }
+#line 3492
    /* copy the next block */
+#line 3492
 #pragma cdir loopcnt=LOOPCNT
+#line 3492
 #pragma cdir shortloop
+#line 3492
     for (i=0; i<ni; i++) {
+#line 3492
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3492
      /* test for range errors (not always needed but do it anyway) */
+#line 3492
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3492
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3492
       nrange += xp[i] > UCHAR_MAX || xp[i] < 0;
+#line 3492
     }
+#line 3492
    /* update xpp and tp */
+#line 3492
     if (realign) xp = (double *) *xpp;
+#line 3492
     xp += ni;
+#line 3492
     tp += ni;
+#line 3492
     *xpp = (void*)xp;
+#line 3492
   }
+#line 3492
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3492
 
+#line 3492
 #else   /* not SX */
+#line 3492
 	const char *xp = (const char *) *xpp;
+#line 3492
 	int status = NC_NOERR;
+#line 3492
 
+#line 3492
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3492
 	{
+#line 3492
 		const int lstatus = ncx_get_double_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3492
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3492
 			status = lstatus;
+#line 3492
 	}
+#line 3492
 
+#line 3492
 	*xpp = (const void *)xp;
+#line 3492
 	return status;
-#  endif
+#line 3492
+#endif
+#line 3492
 }
+#line 3492
 
 int
+#line 3493
 ncx_getn_double_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3493
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3493
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3493
 
+#line 3493
  /* basic algorithm is:
+#line 3493
   *   - ensure sane alignment of input data
+#line 3493
   *   - copy (conversion happens automatically) input data
+#line 3493
   *     to output
+#line 3493
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3493
   *     at next location for converted output
+#line 3493
   */
+#line 3493
   long i, j, ni;
+#line 3493
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3493
   double *xp;
+#line 3493
   int nrange = 0;         /* number of range errors */
+#line 3493
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3493
   long cxp = (long) *((char**)xpp);
+#line 3493
 
+#line 3493
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3493
   /* sjl: manually stripmine so we can limit amount of
+#line 3493
    * vector work space reserved to LOOPCNT elements. Also
+#line 3493
    * makes vectorisation easy */
+#line 3493
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3493
     ni=Min(nelems-j,LOOPCNT);
+#line 3493
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3493
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3493
       xp = tmp;
+#line 3493
     } else {
+#line 3493
       xp = (double *) *xpp;
+#line 3493
     }
+#line 3493
    /* copy the next block */
+#line 3493
 #pragma cdir loopcnt=LOOPCNT
+#line 3493
 #pragma cdir shortloop
+#line 3493
     for (i=0; i<ni; i++) {
+#line 3493
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3493
      /* test for range errors (not always needed but do it anyway) */
+#line 3493
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3493
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3493
       nrange += xp[i] > USHORT_MAX || xp[i] < 0;
+#line 3493
     }
+#line 3493
    /* update xpp and tp */
+#line 3493
     if (realign) xp = (double *) *xpp;
+#line 3493
     xp += ni;
+#line 3493
     tp += ni;
+#line 3493
     *xpp = (void*)xp;
+#line 3493
   }
+#line 3493
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3493
 
+#line 3493
 #else   /* not SX */
+#line 3493
 	const char *xp = (const char *) *xpp;
+#line 3493
 	int status = NC_NOERR;
+#line 3493
 
+#line 3493
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3493
 	{
+#line 3493
 		const int lstatus = ncx_get_double_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3493
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3493
 			status = lstatus;
+#line 3493
 	}
+#line 3493
 
+#line 3493
 	*xpp = (const void *)xp;
+#line 3493
 	return status;
-#  endif
+#line 3493
+#endif
+#line 3493
 }
+#line 3493
 
 int
+#line 3494
 ncx_getn_double_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3494
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3494
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3494
 
+#line 3494
  /* basic algorithm is:
+#line 3494
   *   - ensure sane alignment of input data
+#line 3494
   *   - copy (conversion happens automatically) input data
+#line 3494
   *     to output
+#line 3494
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3494
   *     at next location for converted output
+#line 3494
   */
+#line 3494
   long i, j, ni;
+#line 3494
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3494
   double *xp;
+#line 3494
   int nrange = 0;         /* number of range errors */
+#line 3494
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3494
   long cxp = (long) *((char**)xpp);
+#line 3494
 
+#line 3494
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3494
   /* sjl: manually stripmine so we can limit amount of
+#line 3494
    * vector work space reserved to LOOPCNT elements. Also
+#line 3494
    * makes vectorisation easy */
+#line 3494
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3494
     ni=Min(nelems-j,LOOPCNT);
+#line 3494
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3494
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3494
       xp = tmp;
+#line 3494
     } else {
+#line 3494
       xp = (double *) *xpp;
+#line 3494
     }
+#line 3494
    /* copy the next block */
+#line 3494
 #pragma cdir loopcnt=LOOPCNT
+#line 3494
 #pragma cdir shortloop
+#line 3494
     for (i=0; i<ni; i++) {
+#line 3494
       tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3494
      /* test for range errors (not always needed but do it anyway) */
+#line 3494
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3494
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3494
       nrange += xp[i] > UINT_MAX || xp[i] < 0;
+#line 3494
     }
+#line 3494
    /* update xpp and tp */
+#line 3494
     if (realign) xp = (double *) *xpp;
+#line 3494
     xp += ni;
+#line 3494
     tp += ni;
+#line 3494
     *xpp = (void*)xp;
+#line 3494
   }
+#line 3494
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3494
 
+#line 3494
 #else   /* not SX */
+#line 3494
 	const char *xp = (const char *) *xpp;
+#line 3494
 	int status = NC_NOERR;
+#line 3494
 
+#line 3494
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3494
 	{
+#line 3494
 		const int lstatus = ncx_get_double_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3494
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3494
 			status = lstatus;
+#line 3494
 	}
+#line 3494
 
+#line 3494
 	*xpp = (const void *)xp;
+#line 3494
 	return status;
-#  endif
+#line 3494
+#endif
+#line 3494
 }
+#line 3494
 
 int
+#line 3495
 ncx_getn_double_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3495
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3495
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3495
 
+#line 3495
  /* basic algorithm is:
+#line 3495
   *   - ensure sane alignment of input data
+#line 3495
   *   - copy (conversion happens automatically) input data
+#line 3495
   *     to output
+#line 3495
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3495
   *     at next location for converted output
+#line 3495
   */
+#line 3495
   long i, j, ni;
+#line 3495
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3495
   double *xp;
+#line 3495
   int nrange = 0;         /* number of range errors */
+#line 3495
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3495
   long cxp = (long) *((char**)xpp);
+#line 3495
 
+#line 3495
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3495
   /* sjl: manually stripmine so we can limit amount of
+#line 3495
    * vector work space reserved to LOOPCNT elements. Also
+#line 3495
    * makes vectorisation easy */
+#line 3495
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3495
     ni=Min(nelems-j,LOOPCNT);
+#line 3495
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_DOUBLE);
+#line 3495
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_DOUBLE));
+#line 3495
       xp = tmp;
+#line 3495
     } else {
+#line 3495
       xp = (double *) *xpp;
+#line 3495
     }
+#line 3495
    /* copy the next block */
+#line 3495
 #pragma cdir loopcnt=LOOPCNT
+#line 3495
 #pragma cdir shortloop
+#line 3495
     for (i=0; i<ni; i++) {
+#line 3495
       tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3495
      /* test for range errors (not always needed but do it anyway) */
+#line 3495
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3495
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3495
       nrange += xp[i] > ULONGLONG_MAX || xp[i] < 0;
+#line 3495
     }
+#line 3495
    /* update xpp and tp */
+#line 3495
     if (realign) xp = (double *) *xpp;
+#line 3495
     xp += ni;
+#line 3495
     tp += ni;
+#line 3495
     *xpp = (void*)xp;
+#line 3495
   }
+#line 3495
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3495
 
+#line 3495
 #else   /* not SX */
+#line 3495
 	const char *xp = (const char *) *xpp;
+#line 3495
 	int status = NC_NOERR;
+#line 3495
 
+#line 3495
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3495
 	{
+#line 3495
 		const int lstatus = ncx_get_double_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3495
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3495
 			status = lstatus;
+#line 3495
 	}
+#line 3495
 
+#line 3495
 	*xpp = (const void *)xp;
+#line 3495
 	return status;
-#  endif
+#line 3495
+#endif
+#line 3495
 }
+#line 3495
 
 
 #if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE && !defined(NO_IEEE_FLOAT)
 /* optimized version */
 int
-ncx_putn_double_double(void **xpp, size_t nelems, const double *tp)
+ncx_putn_double_double(void **xpp, size_t nelems, const double *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_DOUBLE);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_DOUBLE);
 # else
 	swapn8b(*xpp, tp, nelems);
 # endif
 	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_DOUBLE);
 	return NC_NOERR;
 }
-#elif vax
+#elif defined(vax) && vax != 0
 int
-ncx_putn_double_double(void **xpp, size_t ndoubles, const double *ip)
+ncx_putn_double_double(void **xpp, size_t ndoubles, const double *ip, void *fillp)
 {
 	const double *const end = ip + ndoubles;
 
-	while(ip < end)
+	while (ip < end)
 	{
 	const struct vax_double *const vdp =
+#line 3518
 			(const struct vax_double *)ip;
+#line 3518
 	struct ieee_double *const idp =
+#line 3518
 			 (struct ieee_double *) (*xpp);
+#line 3518
 
+#line 3518
 	if ((vdp->mantissa4 > (dbl_limits[0].d.mantissa4 - 3)) &&
+#line 3518
 		(vdp->mantissa3 == dbl_limits[0].d.mantissa3) &&
+#line 3518
 		(vdp->mantissa2 == dbl_limits[0].d.mantissa2) &&
+#line 3518
 		(vdp->mantissa1 == dbl_limits[0].d.mantissa1) &&
+#line 3518
 		(vdp->exp == dbl_limits[0].d.exp))
+#line 3518
 	{
+#line 3518
 		*idp = dbl_limits[0].ieee;
+#line 3518
 		goto shipit;
+#line 3518
 	}
+#line 3518
 	if ((vdp->mantissa4 == dbl_limits[1].d.mantissa4) &&
+#line 3518
 		(vdp->mantissa3 == dbl_limits[1].d.mantissa3) &&
+#line 3518
 		(vdp->mantissa2 == dbl_limits[1].d.mantissa2) &&
+#line 3518
 		(vdp->mantissa1 == dbl_limits[1].d.mantissa1) &&
+#line 3518
 		(vdp->exp == dbl_limits[1].d.exp))
+#line 3518
 	{
+#line 3518
 		*idp = dbl_limits[1].ieee;
+#line 3518
 		goto shipit;
+#line 3518
 	}
+#line 3518
 
+#line 3518
 	{
+#line 3518
 		unsigned exp = vdp->exp - VAX_DBL_BIAS + IEEE_DBL_BIAS;
+#line 3518
 
+#line 3518
 		unsigned mant_lo = ((vdp->mantissa2 & MASK(3)) << 29) |
+#line 3518
 			(vdp->mantissa3 << 13) |
+#line 3518
 			((vdp->mantissa4 >> 3) & MASK(13));
+#line 3518
 
+#line 3518
 		unsigned mant_hi = (vdp->mantissa1 << 13)
+#line 3518
 				 | (vdp->mantissa2 >> 3);
+#line 3518
 
-		if((vdp->mantissa4 & 7) > 4)
+#line 3518
+		if ((vdp->mantissa4 & 7) > 4)
+#line 3518
 		{
+#line 3518
 			/* round up */
+#line 3518
 			mant_lo++;
-			if(mant_lo == 0)
+#line 3518
+			if (mant_lo == 0)
+#line 3518
 			{
+#line 3518
 				mant_hi++;
-				if(mant_hi > 0xffffff)
+#line 3518
+				if (mant_hi > 0xffffff)
+#line 3518
 				{
+#line 3518
 					mant_hi = 0;
+#line 3518
 					exp++;
+#line 3518
 				}
+#line 3518
 			}
+#line 3518
 		}
+#line 3518
 
+#line 3518
 		idp->mant_lo = SWAP4(mant_lo);
+#line 3518
 		idp->mant_6 = mant_hi >> 16;
+#line 3518
 		idp->mant_5 = (mant_hi & 0xff00) >> 8;
+#line 3518
 		idp->mant_4 = mant_hi;
+#line 3518
 		idp->exp_hi = exp >> 4;
+#line 3518
 		idp->exp_lo = exp;
+#line 3518
 	}
+#line 3518
 
+#line 3518
 	shipit:
+#line 3518
 		idp->sign = vdp->sign;
+#line 3518
 
 		ip++;
 		*xpp = (char *)(*xpp) + X_SIZEOF_DOUBLE;
@@ -13807,3420 +29879,7376 @@ ncx_putn_double_double(void **xpp, size_t ndoubles, const double *ip)
 	/* vax */
 #else
 int
-ncx_putn_double_double(void **xpp, size_t nelems, const double *tp)
+ncx_putn_double_double(void **xpp, size_t nelems, const double *tp, void *fillp)
 {
 	char *xp = *xpp;
 	int status = NC_NOERR;
 
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
 	{
-		int lstatus = ncx_put_double_double(xp, tp);
-		if(lstatus != NC_NOERR)
+		int lstatus = ncx_put_double_double(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
+			status = lstatus;
+	}
+
+	*xpp = (void *)xp;
+	return status;
+}
+#endif
+int
+#line 3543
+ncx_putn_double_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3543
+{
+#line 3543
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3543
+
+#line 3543
+ /* basic algorithm is:
+#line 3543
+  *   - ensure sane alignment of output data
+#line 3543
+  *   - copy (conversion happens automatically) input data
+#line 3543
+  *     to output
+#line 3543
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3543
+  *     at next location for converted output
+#line 3543
+  */
+#line 3543
+  long i, j, ni;
+#line 3543
+  double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3543
+  double *xp;
+#line 3543
+  int nrange = 0;         /* number of range errors */
+#line 3543
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3543
+  long cxp = (long) *((char**)xpp);
+#line 3543
+
+#line 3543
+  realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3543
+  /* sjl: manually stripmine so we can limit amount of
+#line 3543
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3543
+   * makes vectorisation easy */
+#line 3543
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3543
+    ni=Min(nelems-j,LOOPCNT);
+#line 3543
+    if (realign) {
+#line 3543
+      xp = tmp;
+#line 3543
+    } else {
+#line 3543
+      xp = (double *) *xpp;
+#line 3543
+    }
+#line 3543
+   /* copy the next block */
+#line 3543
+#pragma cdir loopcnt=LOOPCNT
+#line 3543
+#pragma cdir shortloop
+#line 3543
+    for (i=0; i<ni; i++) {
+#line 3543
+      /* the normal case: */
+#line 3543
+      xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3543
+     /* test for range errors (not always needed but do it anyway) */
+#line 3543
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3543
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3543
+      nrange += tp[i] > X_DOUBLE_MAX || tp[i] < X_DOUBLE_MIN;
+#line 3543
+    }
+#line 3543
+   /* copy workspace back if necessary */
+#line 3543
+    if (realign) {
+#line 3543
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3543
+      xp = (double *) *xpp;
+#line 3543
+    }
+#line 3543
+   /* update xpp and tp */
+#line 3543
+    xp += ni;
+#line 3543
+    tp += ni;
+#line 3543
+    *xpp = (void*)xp;
+#line 3543
+  }
+#line 3543
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3543
+
+#line 3543
+#else   /* not SX */
+#line 3543
+
+#line 3543
+	char *xp = (char *) *xpp;
+#line 3543
+	int status = NC_NOERR;
+#line 3543
+
+#line 3543
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3543
+	{
+#line 3543
+		int lstatus = ncx_put_double_schar(xp, tp, fillp);
+#line 3543
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3543
 			status = lstatus;
+#line 3543
 	}
+#line 3543
 
+#line 3543
 	*xpp = (void *)xp;
+#line 3543
 	return status;
-}
+#line 3543
 #endif
+#line 3543
+}
+#line 3543
+
 int
-ncx_putn_double_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3544
+ncx_putn_double_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3544
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3544
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3544
 
+#line 3544
  /* basic algorithm is:
+#line 3544
   *   - ensure sane alignment of output data
+#line 3544
   *   - copy (conversion happens automatically) input data
+#line 3544
   *     to output
+#line 3544
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3544
   *     at next location for converted output
+#line 3544
   */
+#line 3544
   long i, j, ni;
+#line 3544
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3544
   double *xp;
+#line 3544
   int nrange = 0;         /* number of range errors */
+#line 3544
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3544
   long cxp = (long) *((char**)xpp);
+#line 3544
 
+#line 3544
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3544
   /* sjl: manually stripmine so we can limit amount of
+#line 3544
    * vector work space reserved to LOOPCNT elements. Also
+#line 3544
    * makes vectorisation easy */
+#line 3544
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3544
     ni=Min(nelems-j,LOOPCNT);
+#line 3544
     if (realign) {
+#line 3544
       xp = tmp;
+#line 3544
     } else {
+#line 3544
       xp = (double *) *xpp;
+#line 3544
     }
+#line 3544
    /* copy the next block */
+#line 3544
 #pragma cdir loopcnt=LOOPCNT
+#line 3544
 #pragma cdir shortloop
+#line 3544
     for (i=0; i<ni; i++) {
+#line 3544
       /* the normal case: */
+#line 3544
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3544
      /* test for range errors (not always needed but do it anyway) */
+#line 3544
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3544
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3544
       nrange += tp[i] > X_DOUBLE_MAX || tp[i] < X_DOUBLE_MIN;
+#line 3544
     }
+#line 3544
    /* copy workspace back if necessary */
+#line 3544
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3544
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3544
       xp = (double *) *xpp;
+#line 3544
     }
+#line 3544
    /* update xpp and tp */
+#line 3544
     xp += ni;
+#line 3544
     tp += ni;
+#line 3544
     *xpp = (void*)xp;
+#line 3544
   }
+#line 3544
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3544
 
+#line 3544
 #else   /* not SX */
+#line 3544
 
+#line 3544
 	char *xp = (char *) *xpp;
+#line 3544
 	int status = NC_NOERR;
+#line 3544
 
+#line 3544
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3544
 	{
-		int lstatus = ncx_put_double_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3544
+		int lstatus = ncx_put_double_short(xp, tp, fillp);
+#line 3544
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3544
 			status = lstatus;
+#line 3544
 	}
+#line 3544
 
+#line 3544
 	*xpp = (void *)xp;
+#line 3544
 	return status;
+#line 3544
 #endif
+#line 3544
 }
+#line 3544
 
 int
-ncx_putn_double_short(void **xpp, size_t nelems, const short *tp)
+#line 3545
+ncx_putn_double_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3545
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3545
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3545
 
+#line 3545
  /* basic algorithm is:
+#line 3545
   *   - ensure sane alignment of output data
+#line 3545
   *   - copy (conversion happens automatically) input data
+#line 3545
   *     to output
+#line 3545
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3545
   *     at next location for converted output
+#line 3545
   */
+#line 3545
   long i, j, ni;
+#line 3545
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3545
   double *xp;
+#line 3545
   int nrange = 0;         /* number of range errors */
+#line 3545
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3545
   long cxp = (long) *((char**)xpp);
+#line 3545
 
+#line 3545
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3545
   /* sjl: manually stripmine so we can limit amount of
+#line 3545
    * vector work space reserved to LOOPCNT elements. Also
+#line 3545
    * makes vectorisation easy */
+#line 3545
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3545
     ni=Min(nelems-j,LOOPCNT);
+#line 3545
     if (realign) {
+#line 3545
       xp = tmp;
+#line 3545
     } else {
+#line 3545
       xp = (double *) *xpp;
+#line 3545
     }
+#line 3545
    /* copy the next block */
+#line 3545
 #pragma cdir loopcnt=LOOPCNT
+#line 3545
 #pragma cdir shortloop
+#line 3545
     for (i=0; i<ni; i++) {
+#line 3545
       /* the normal case: */
+#line 3545
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3545
      /* test for range errors (not always needed but do it anyway) */
+#line 3545
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3545
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3545
       nrange += tp[i] > X_DOUBLE_MAX || tp[i] < X_DOUBLE_MIN;
+#line 3545
     }
+#line 3545
    /* copy workspace back if necessary */
+#line 3545
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3545
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3545
       xp = (double *) *xpp;
+#line 3545
     }
+#line 3545
    /* update xpp and tp */
+#line 3545
     xp += ni;
+#line 3545
     tp += ni;
+#line 3545
     *xpp = (void*)xp;
+#line 3545
   }
+#line 3545
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3545
 
+#line 3545
 #else   /* not SX */
+#line 3545
 
+#line 3545
 	char *xp = (char *) *xpp;
+#line 3545
 	int status = NC_NOERR;
+#line 3545
 
+#line 3545
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3545
 	{
-		int lstatus = ncx_put_double_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3545
+		int lstatus = ncx_put_double_int(xp, tp, fillp);
+#line 3545
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3545
 			status = lstatus;
+#line 3545
 	}
+#line 3545
 
+#line 3545
 	*xpp = (void *)xp;
+#line 3545
 	return status;
+#line 3545
 #endif
+#line 3545
 }
+#line 3545
 
 int
-ncx_putn_double_int(void **xpp, size_t nelems, const int *tp)
+#line 3546
+ncx_putn_double_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3546
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3546
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3546
 
+#line 3546
  /* basic algorithm is:
+#line 3546
   *   - ensure sane alignment of output data
+#line 3546
   *   - copy (conversion happens automatically) input data
+#line 3546
   *     to output
+#line 3546
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3546
   *     at next location for converted output
+#line 3546
   */
+#line 3546
   long i, j, ni;
+#line 3546
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3546
   double *xp;
+#line 3546
   int nrange = 0;         /* number of range errors */
+#line 3546
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3546
   long cxp = (long) *((char**)xpp);
+#line 3546
 
+#line 3546
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3546
   /* sjl: manually stripmine so we can limit amount of
+#line 3546
    * vector work space reserved to LOOPCNT elements. Also
+#line 3546
    * makes vectorisation easy */
+#line 3546
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3546
     ni=Min(nelems-j,LOOPCNT);
+#line 3546
     if (realign) {
+#line 3546
       xp = tmp;
+#line 3546
     } else {
+#line 3546
       xp = (double *) *xpp;
+#line 3546
     }
+#line 3546
    /* copy the next block */
+#line 3546
 #pragma cdir loopcnt=LOOPCNT
+#line 3546
 #pragma cdir shortloop
+#line 3546
     for (i=0; i<ni; i++) {
+#line 3546
       /* the normal case: */
+#line 3546
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3546
      /* test for range errors (not always needed but do it anyway) */
+#line 3546
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3546
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3546
       nrange += tp[i] > X_DOUBLE_MAX || tp[i] < X_DOUBLE_MIN;
+#line 3546
     }
+#line 3546
    /* copy workspace back if necessary */
+#line 3546
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3546
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3546
       xp = (double *) *xpp;
+#line 3546
     }
+#line 3546
    /* update xpp and tp */
+#line 3546
     xp += ni;
+#line 3546
     tp += ni;
+#line 3546
     *xpp = (void*)xp;
+#line 3546
   }
+#line 3546
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3546
 
+#line 3546
 #else   /* not SX */
+#line 3546
 
+#line 3546
 	char *xp = (char *) *xpp;
+#line 3546
 	int status = NC_NOERR;
+#line 3546
 
+#line 3546
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3546
 	{
-		int lstatus = ncx_put_double_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3546
+		int lstatus = ncx_put_double_long(xp, tp, fillp);
+#line 3546
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3546
 			status = lstatus;
+#line 3546
 	}
+#line 3546
 
+#line 3546
 	*xpp = (void *)xp;
+#line 3546
 	return status;
+#line 3546
 #endif
+#line 3546
 }
+#line 3546
 
 int
-ncx_putn_double_float(void **xpp, size_t nelems, const float *tp)
+#line 3547
+ncx_putn_double_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3547
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3547
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3547
 
+#line 3547
  /* basic algorithm is:
+#line 3547
   *   - ensure sane alignment of output data
+#line 3547
   *   - copy (conversion happens automatically) input data
+#line 3547
   *     to output
+#line 3547
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3547
   *     at next location for converted output
+#line 3547
   */
+#line 3547
   long i, j, ni;
+#line 3547
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3547
   double *xp;
+#line 3547
   int nrange = 0;         /* number of range errors */
+#line 3547
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3547
   long cxp = (long) *((char**)xpp);
+#line 3547
 
+#line 3547
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3547
   /* sjl: manually stripmine so we can limit amount of
+#line 3547
    * vector work space reserved to LOOPCNT elements. Also
+#line 3547
    * makes vectorisation easy */
+#line 3547
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3547
     ni=Min(nelems-j,LOOPCNT);
+#line 3547
     if (realign) {
+#line 3547
       xp = tmp;
+#line 3547
     } else {
+#line 3547
       xp = (double *) *xpp;
+#line 3547
     }
+#line 3547
    /* copy the next block */
+#line 3547
 #pragma cdir loopcnt=LOOPCNT
+#line 3547
 #pragma cdir shortloop
+#line 3547
     for (i=0; i<ni; i++) {
+#line 3547
       /* the normal case: */
+#line 3547
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3547
      /* test for range errors (not always needed but do it anyway) */
+#line 3547
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3547
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3547
       nrange += tp[i] > X_DOUBLE_MAX || tp[i] < X_DOUBLE_MIN;
+#line 3547
     }
+#line 3547
    /* copy workspace back if necessary */
+#line 3547
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3547
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3547
       xp = (double *) *xpp;
+#line 3547
     }
+#line 3547
    /* update xpp and tp */
+#line 3547
     xp += ni;
+#line 3547
     tp += ni;
+#line 3547
     *xpp = (void*)xp;
+#line 3547
   }
+#line 3547
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3547
 
+#line 3547
 #else   /* not SX */
+#line 3547
 
+#line 3547
 	char *xp = (char *) *xpp;
+#line 3547
 	int status = NC_NOERR;
+#line 3547
 
+#line 3547
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3547
 	{
-		int lstatus = ncx_put_double_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3547
+		int lstatus = ncx_put_double_float(xp, tp, fillp);
+#line 3547
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3547
 			status = lstatus;
+#line 3547
 	}
+#line 3547
 
+#line 3547
 	*xpp = (void *)xp;
+#line 3547
 	return status;
+#line 3547
 #endif
+#line 3547
 }
+#line 3547
 
 int
-ncx_putn_double_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3548
+ncx_putn_double_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3548
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3548
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3548
 
+#line 3548
  /* basic algorithm is:
+#line 3548
   *   - ensure sane alignment of output data
+#line 3548
   *   - copy (conversion happens automatically) input data
+#line 3548
   *     to output
+#line 3548
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3548
   *     at next location for converted output
+#line 3548
   */
+#line 3548
   long i, j, ni;
+#line 3548
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3548
   double *xp;
+#line 3548
   int nrange = 0;         /* number of range errors */
+#line 3548
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3548
   long cxp = (long) *((char**)xpp);
+#line 3548
 
+#line 3548
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3548
   /* sjl: manually stripmine so we can limit amount of
+#line 3548
    * vector work space reserved to LOOPCNT elements. Also
+#line 3548
    * makes vectorisation easy */
+#line 3548
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3548
     ni=Min(nelems-j,LOOPCNT);
+#line 3548
     if (realign) {
+#line 3548
       xp = tmp;
+#line 3548
     } else {
+#line 3548
       xp = (double *) *xpp;
+#line 3548
     }
+#line 3548
    /* copy the next block */
+#line 3548
 #pragma cdir loopcnt=LOOPCNT
+#line 3548
 #pragma cdir shortloop
+#line 3548
     for (i=0; i<ni; i++) {
+#line 3548
       /* the normal case: */
+#line 3548
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3548
      /* test for range errors (not always needed but do it anyway) */
+#line 3548
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3548
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3548
       nrange += tp[i] > X_DOUBLE_MAX || tp[i] < X_DOUBLE_MIN;
+#line 3548
     }
+#line 3548
    /* copy workspace back if necessary */
+#line 3548
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3548
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3548
       xp = (double *) *xpp;
+#line 3548
     }
+#line 3548
    /* update xpp and tp */
+#line 3548
     xp += ni;
+#line 3548
     tp += ni;
+#line 3548
     *xpp = (void*)xp;
+#line 3548
   }
+#line 3548
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3548
 
+#line 3548
 #else   /* not SX */
+#line 3548
 
+#line 3548
 	char *xp = (char *) *xpp;
+#line 3548
 	int status = NC_NOERR;
+#line 3548
 
+#line 3548
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3548
 	{
-		int lstatus = ncx_put_double_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3548
+		int lstatus = ncx_put_double_longlong(xp, tp, fillp);
+#line 3548
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3548
 			status = lstatus;
+#line 3548
 	}
+#line 3548
 
+#line 3548
 	*xpp = (void *)xp;
+#line 3548
 	return status;
+#line 3548
 #endif
+#line 3548
 }
+#line 3548
 
 int
-ncx_putn_double_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3549
+ncx_putn_double_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3549
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3549
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3549
 
+#line 3549
  /* basic algorithm is:
+#line 3549
   *   - ensure sane alignment of output data
+#line 3549
   *   - copy (conversion happens automatically) input data
+#line 3549
   *     to output
+#line 3549
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3549
   *     at next location for converted output
+#line 3549
   */
+#line 3549
   long i, j, ni;
+#line 3549
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3549
   double *xp;
+#line 3549
   int nrange = 0;         /* number of range errors */
+#line 3549
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3549
   long cxp = (long) *((char**)xpp);
+#line 3549
 
+#line 3549
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3549
   /* sjl: manually stripmine so we can limit amount of
+#line 3549
    * vector work space reserved to LOOPCNT elements. Also
+#line 3549
    * makes vectorisation easy */
+#line 3549
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3549
     ni=Min(nelems-j,LOOPCNT);
+#line 3549
     if (realign) {
+#line 3549
       xp = tmp;
+#line 3549
     } else {
+#line 3549
       xp = (double *) *xpp;
+#line 3549
     }
+#line 3549
    /* copy the next block */
+#line 3549
 #pragma cdir loopcnt=LOOPCNT
+#line 3549
 #pragma cdir shortloop
+#line 3549
     for (i=0; i<ni; i++) {
+#line 3549
       /* the normal case: */
+#line 3549
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3549
      /* test for range errors (not always needed but do it anyway) */
+#line 3549
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3549
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3549
       nrange += tp[i] > X_DOUBLE_MAX ;
+#line 3549
     }
+#line 3549
    /* copy workspace back if necessary */
+#line 3549
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3549
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3549
       xp = (double *) *xpp;
+#line 3549
     }
+#line 3549
    /* update xpp and tp */
+#line 3549
     xp += ni;
+#line 3549
     tp += ni;
+#line 3549
     *xpp = (void*)xp;
+#line 3549
   }
+#line 3549
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3549
 
+#line 3549
 #else   /* not SX */
+#line 3549
 
+#line 3549
 	char *xp = (char *) *xpp;
+#line 3549
 	int status = NC_NOERR;
+#line 3549
 
+#line 3549
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3549
 	{
-		int lstatus = ncx_put_double_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3549
+		int lstatus = ncx_put_double_uchar(xp, tp, fillp);
+#line 3549
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3549
 			status = lstatus;
+#line 3549
 	}
+#line 3549
 
+#line 3549
 	*xpp = (void *)xp;
+#line 3549
 	return status;
+#line 3549
 #endif
+#line 3549
 }
+#line 3549
 
 int
-ncx_putn_double_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3550
+ncx_putn_double_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3550
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3550
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3550
 
+#line 3550
  /* basic algorithm is:
+#line 3550
   *   - ensure sane alignment of output data
+#line 3550
   *   - copy (conversion happens automatically) input data
+#line 3550
   *     to output
+#line 3550
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3550
   *     at next location for converted output
+#line 3550
   */
+#line 3550
   long i, j, ni;
+#line 3550
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3550
   double *xp;
+#line 3550
   int nrange = 0;         /* number of range errors */
+#line 3550
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3550
   long cxp = (long) *((char**)xpp);
+#line 3550
 
+#line 3550
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3550
   /* sjl: manually stripmine so we can limit amount of
+#line 3550
    * vector work space reserved to LOOPCNT elements. Also
+#line 3550
    * makes vectorisation easy */
+#line 3550
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3550
     ni=Min(nelems-j,LOOPCNT);
+#line 3550
     if (realign) {
+#line 3550
       xp = tmp;
+#line 3550
     } else {
+#line 3550
       xp = (double *) *xpp;
+#line 3550
     }
+#line 3550
    /* copy the next block */
+#line 3550
 #pragma cdir loopcnt=LOOPCNT
+#line 3550
 #pragma cdir shortloop
+#line 3550
     for (i=0; i<ni; i++) {
+#line 3550
       /* the normal case: */
+#line 3550
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3550
      /* test for range errors (not always needed but do it anyway) */
+#line 3550
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3550
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3550
       nrange += tp[i] > X_DOUBLE_MAX ;
+#line 3550
     }
+#line 3550
    /* copy workspace back if necessary */
+#line 3550
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3550
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3550
       xp = (double *) *xpp;
+#line 3550
     }
+#line 3550
    /* update xpp and tp */
+#line 3550
     xp += ni;
+#line 3550
     tp += ni;
+#line 3550
     *xpp = (void*)xp;
+#line 3550
   }
+#line 3550
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3550
 
+#line 3550
 #else   /* not SX */
+#line 3550
 
+#line 3550
 	char *xp = (char *) *xpp;
+#line 3550
 	int status = NC_NOERR;
+#line 3550
 
+#line 3550
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3550
 	{
-		int lstatus = ncx_put_double_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3550
+		int lstatus = ncx_put_double_ushort(xp, tp, fillp);
+#line 3550
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3550
 			status = lstatus;
+#line 3550
 	}
+#line 3550
 
+#line 3550
 	*xpp = (void *)xp;
+#line 3550
 	return status;
+#line 3550
 #endif
+#line 3550
 }
+#line 3550
 
 int
-ncx_putn_double_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3551
+ncx_putn_double_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3551
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3551
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3551
 
+#line 3551
  /* basic algorithm is:
+#line 3551
   *   - ensure sane alignment of output data
+#line 3551
   *   - copy (conversion happens automatically) input data
+#line 3551
   *     to output
+#line 3551
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3551
   *     at next location for converted output
+#line 3551
   */
+#line 3551
   long i, j, ni;
+#line 3551
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3551
   double *xp;
+#line 3551
   int nrange = 0;         /* number of range errors */
+#line 3551
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3551
   long cxp = (long) *((char**)xpp);
+#line 3551
 
+#line 3551
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3551
   /* sjl: manually stripmine so we can limit amount of
+#line 3551
    * vector work space reserved to LOOPCNT elements. Also
+#line 3551
    * makes vectorisation easy */
+#line 3551
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3551
     ni=Min(nelems-j,LOOPCNT);
+#line 3551
     if (realign) {
+#line 3551
       xp = tmp;
+#line 3551
     } else {
+#line 3551
       xp = (double *) *xpp;
+#line 3551
     }
+#line 3551
    /* copy the next block */
+#line 3551
 #pragma cdir loopcnt=LOOPCNT
+#line 3551
 #pragma cdir shortloop
+#line 3551
     for (i=0; i<ni; i++) {
+#line 3551
       /* the normal case: */
+#line 3551
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3551
      /* test for range errors (not always needed but do it anyway) */
+#line 3551
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3551
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3551
       nrange += tp[i] > X_DOUBLE_MAX ;
+#line 3551
     }
+#line 3551
    /* copy workspace back if necessary */
+#line 3551
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3551
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3551
       xp = (double *) *xpp;
+#line 3551
     }
+#line 3551
    /* update xpp and tp */
+#line 3551
     xp += ni;
+#line 3551
     tp += ni;
+#line 3551
     *xpp = (void*)xp;
+#line 3551
   }
+#line 3551
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3551
 
+#line 3551
 #else   /* not SX */
+#line 3551
 
+#line 3551
 	char *xp = (char *) *xpp;
+#line 3551
 	int status = NC_NOERR;
+#line 3551
 
+#line 3551
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3551
 	{
-		int lstatus = ncx_put_double_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3551
+		int lstatus = ncx_put_double_uint(xp, tp, fillp);
+#line 3551
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3551
 			status = lstatus;
+#line 3551
 	}
+#line 3551
 
+#line 3551
 	*xpp = (void *)xp;
+#line 3551
 	return status;
+#line 3551
 #endif
+#line 3551
 }
+#line 3551
 
 int
-ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3552
+ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3552
 {
-#if _SX && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3552
+#if defined(_SX) && _SX != 0 && X_SIZEOF_DOUBLE == SIZEOF_DOUBLE
+#line 3552
 
+#line 3552
  /* basic algorithm is:
+#line 3552
   *   - ensure sane alignment of output data
+#line 3552
   *   - copy (conversion happens automatically) input data
+#line 3552
   *     to output
+#line 3552
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3552
   *     at next location for converted output
+#line 3552
   */
+#line 3552
   long i, j, ni;
+#line 3552
   double tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3552
   double *xp;
+#line 3552
   int nrange = 0;         /* number of range errors */
+#line 3552
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3552
   long cxp = (long) *((char**)xpp);
+#line 3552
 
+#line 3552
   realign = (cxp & 7) % SIZEOF_DOUBLE;
+#line 3552
   /* sjl: manually stripmine so we can limit amount of
+#line 3552
    * vector work space reserved to LOOPCNT elements. Also
+#line 3552
    * makes vectorisation easy */
+#line 3552
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3552
     ni=Min(nelems-j,LOOPCNT);
+#line 3552
     if (realign) {
+#line 3552
       xp = tmp;
+#line 3552
     } else {
+#line 3552
       xp = (double *) *xpp;
+#line 3552
     }
+#line 3552
    /* copy the next block */
+#line 3552
 #pragma cdir loopcnt=LOOPCNT
+#line 3552
 #pragma cdir shortloop
+#line 3552
     for (i=0; i<ni; i++) {
+#line 3552
       /* the normal case: */
+#line 3552
       xp[i] = (double) Max( X_DOUBLE_MIN, Min(X_DOUBLE_MAX, (double) tp[i]));
+#line 3552
      /* test for range errors (not always needed but do it anyway) */
+#line 3552
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3552
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3552
       nrange += tp[i] > X_DOUBLE_MAX ;
+#line 3552
     }
+#line 3552
    /* copy workspace back if necessary */
+#line 3552
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE);
+#line 3552
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_DOUBLE);
+#line 3552
       xp = (double *) *xpp;
+#line 3552
     }
+#line 3552
    /* update xpp and tp */
+#line 3552
     xp += ni;
+#line 3552
     tp += ni;
+#line 3552
     *xpp = (void*)xp;
+#line 3552
   }
+#line 3552
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3552
 
+#line 3552
 #else   /* not SX */
+#line 3552
 
+#line 3552
 	char *xp = (char *) *xpp;
+#line 3552
 	int status = NC_NOERR;
+#line 3552
 
+#line 3552
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
+#line 3552
 	{
-		int lstatus = ncx_put_double_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3552
+		int lstatus = ncx_put_double_ulonglong(xp, tp, fillp);
+#line 3552
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3552
 			status = lstatus;
+#line 3552
 	}
+#line 3552
 
+#line 3552
 	*xpp = (void *)xp;
+#line 3552
 	return status;
+#line 3552
 #endif
+#line 3552
 }
+#line 3552
 
 
 
-/* longlong -----------------------------------------------------------------------*/
+/* longlong ------------------------------------------------------------------*/
 
-#if X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#if X_SIZEOF_INT64 == SIZEOF_LONGLONG
 /* optimized version */
 int
 ncx_getn_longlong_longlong(const void **xpp, size_t nelems, long long *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(long long));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_LONG_LONG);
 # else
 	swapn8b(tp, *xpp, nelems);
 # endif
-	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_LONGLONG);
+	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_INT64);
 	return NC_NOERR;
 }
 #else
 int
+#line 3571
 ncx_getn_longlong_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3571
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3571
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3571
 
+#line 3571
  /* basic algorithm is:
+#line 3571
   *   - ensure sane alignment of input data
+#line 3571
   *   - copy (conversion happens automatically) input data
+#line 3571
   *     to output
+#line 3571
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3571
   *     at next location for converted output
+#line 3571
   */
+#line 3571
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3571
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3571
+  int64 *xp;
+#line 3571
   int nrange = 0;         /* number of range errors */
+#line 3571
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3571
   long cxp = (long) *((char**)xpp);
+#line 3571
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3571
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3571
   /* sjl: manually stripmine so we can limit amount of
+#line 3571
    * vector work space reserved to LOOPCNT elements. Also
+#line 3571
    * makes vectorisation easy */
+#line 3571
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3571
     ni=Min(nelems-j,LOOPCNT);
+#line 3571
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3571
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3571
       xp = tmp;
+#line 3571
     } else {
-      xp = (longlong *) *xpp;
+#line 3571
+      xp = (int64 *) *xpp;
+#line 3571
     }
+#line 3571
    /* copy the next block */
+#line 3571
 #pragma cdir loopcnt=LOOPCNT
+#line 3571
 #pragma cdir shortloop
+#line 3571
     for (i=0; i<ni; i++) {
+#line 3571
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3571
      /* test for range errors (not always needed but do it anyway) */
+#line 3571
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3571
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3571
       nrange += xp[i] > LONGLONG_MAX || xp[i] < LONGLONG_MIN;
+#line 3571
     }
+#line 3571
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3571
+    if (realign) xp = (int64 *) *xpp;
+#line 3571
     xp += ni;
+#line 3571
     tp += ni;
+#line 3571
     *xpp = (void*)xp;
+#line 3571
   }
+#line 3571
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3571
 
+#line 3571
 #else   /* not SX */
+#line 3571
 	const char *xp = (const char *) *xpp;
+#line 3571
 	int status = NC_NOERR;
+#line 3571
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3571
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3571
 	{
+#line 3571
 		const int lstatus = ncx_get_longlong_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3571
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3571
 			status = lstatus;
+#line 3571
 	}
+#line 3571
 
+#line 3571
 	*xpp = (const void *)xp;
+#line 3571
 	return status;
-#  endif
+#line 3571
+#endif
+#line 3571
 }
+#line 3571
 
 #endif
 int
+#line 3573
 ncx_getn_longlong_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3573
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3573
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3573
 
+#line 3573
  /* basic algorithm is:
+#line 3573
   *   - ensure sane alignment of input data
+#line 3573
   *   - copy (conversion happens automatically) input data
+#line 3573
   *     to output
+#line 3573
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3573
   *     at next location for converted output
+#line 3573
   */
+#line 3573
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3573
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3573
+  int64 *xp;
+#line 3573
   int nrange = 0;         /* number of range errors */
+#line 3573
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3573
   long cxp = (long) *((char**)xpp);
+#line 3573
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3573
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3573
   /* sjl: manually stripmine so we can limit amount of
+#line 3573
    * vector work space reserved to LOOPCNT elements. Also
+#line 3573
    * makes vectorisation easy */
+#line 3573
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3573
     ni=Min(nelems-j,LOOPCNT);
+#line 3573
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3573
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3573
       xp = tmp;
+#line 3573
     } else {
-      xp = (longlong *) *xpp;
+#line 3573
+      xp = (int64 *) *xpp;
+#line 3573
     }
+#line 3573
    /* copy the next block */
+#line 3573
 #pragma cdir loopcnt=LOOPCNT
+#line 3573
 #pragma cdir shortloop
+#line 3573
     for (i=0; i<ni; i++) {
+#line 3573
       tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3573
      /* test for range errors (not always needed but do it anyway) */
+#line 3573
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3573
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3573
       nrange += xp[i] > SCHAR_MAX || xp[i] < SCHAR_MIN;
+#line 3573
     }
+#line 3573
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3573
+    if (realign) xp = (int64 *) *xpp;
+#line 3573
     xp += ni;
+#line 3573
     tp += ni;
+#line 3573
     *xpp = (void*)xp;
+#line 3573
   }
+#line 3573
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3573
 
+#line 3573
 #else   /* not SX */
+#line 3573
 	const char *xp = (const char *) *xpp;
+#line 3573
 	int status = NC_NOERR;
+#line 3573
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3573
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3573
 	{
+#line 3573
 		const int lstatus = ncx_get_longlong_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3573
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3573
 			status = lstatus;
+#line 3573
 	}
+#line 3573
 
+#line 3573
 	*xpp = (const void *)xp;
+#line 3573
 	return status;
-#  endif
+#line 3573
+#endif
+#line 3573
 }
+#line 3573
 
 int
+#line 3574
 ncx_getn_longlong_short(const void **xpp, size_t nelems, short *tp)
+#line 3574
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3574
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3574
 
+#line 3574
  /* basic algorithm is:
+#line 3574
   *   - ensure sane alignment of input data
+#line 3574
   *   - copy (conversion happens automatically) input data
+#line 3574
   *     to output
+#line 3574
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3574
   *     at next location for converted output
+#line 3574
   */
+#line 3574
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3574
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3574
+  int64 *xp;
+#line 3574
   int nrange = 0;         /* number of range errors */
+#line 3574
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3574
   long cxp = (long) *((char**)xpp);
+#line 3574
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3574
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3574
   /* sjl: manually stripmine so we can limit amount of
+#line 3574
    * vector work space reserved to LOOPCNT elements. Also
+#line 3574
    * makes vectorisation easy */
+#line 3574
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3574
     ni=Min(nelems-j,LOOPCNT);
+#line 3574
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3574
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3574
       xp = tmp;
+#line 3574
     } else {
-      xp = (longlong *) *xpp;
+#line 3574
+      xp = (int64 *) *xpp;
+#line 3574
     }
+#line 3574
    /* copy the next block */
+#line 3574
 #pragma cdir loopcnt=LOOPCNT
+#line 3574
 #pragma cdir shortloop
+#line 3574
     for (i=0; i<ni; i++) {
+#line 3574
       tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3574
      /* test for range errors (not always needed but do it anyway) */
+#line 3574
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3574
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3574
       nrange += xp[i] > SHORT_MAX || xp[i] < SHORT_MIN;
+#line 3574
     }
+#line 3574
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3574
+    if (realign) xp = (int64 *) *xpp;
+#line 3574
     xp += ni;
+#line 3574
     tp += ni;
+#line 3574
     *xpp = (void*)xp;
+#line 3574
   }
+#line 3574
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3574
 
+#line 3574
 #else   /* not SX */
+#line 3574
 	const char *xp = (const char *) *xpp;
+#line 3574
 	int status = NC_NOERR;
+#line 3574
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3574
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3574
 	{
+#line 3574
 		const int lstatus = ncx_get_longlong_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3574
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3574
 			status = lstatus;
+#line 3574
 	}
+#line 3574
 
+#line 3574
 	*xpp = (const void *)xp;
+#line 3574
 	return status;
-#  endif
+#line 3574
+#endif
+#line 3574
 }
+#line 3574
 
 int
+#line 3575
 ncx_getn_longlong_int(const void **xpp, size_t nelems, int *tp)
+#line 3575
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3575
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3575
 
+#line 3575
  /* basic algorithm is:
+#line 3575
   *   - ensure sane alignment of input data
+#line 3575
   *   - copy (conversion happens automatically) input data
+#line 3575
   *     to output
+#line 3575
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3575
   *     at next location for converted output
+#line 3575
   */
+#line 3575
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3575
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3575
+  int64 *xp;
+#line 3575
   int nrange = 0;         /* number of range errors */
+#line 3575
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3575
   long cxp = (long) *((char**)xpp);
+#line 3575
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3575
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3575
   /* sjl: manually stripmine so we can limit amount of
+#line 3575
    * vector work space reserved to LOOPCNT elements. Also
+#line 3575
    * makes vectorisation easy */
+#line 3575
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3575
     ni=Min(nelems-j,LOOPCNT);
+#line 3575
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3575
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3575
       xp = tmp;
+#line 3575
     } else {
-      xp = (longlong *) *xpp;
+#line 3575
+      xp = (int64 *) *xpp;
+#line 3575
     }
+#line 3575
    /* copy the next block */
+#line 3575
 #pragma cdir loopcnt=LOOPCNT
+#line 3575
 #pragma cdir shortloop
+#line 3575
     for (i=0; i<ni; i++) {
+#line 3575
       tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3575
      /* test for range errors (not always needed but do it anyway) */
+#line 3575
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3575
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3575
       nrange += xp[i] > INT_MAX || xp[i] < INT_MIN;
+#line 3575
     }
+#line 3575
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3575
+    if (realign) xp = (int64 *) *xpp;
+#line 3575
     xp += ni;
+#line 3575
     tp += ni;
+#line 3575
     *xpp = (void*)xp;
+#line 3575
   }
+#line 3575
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3575
 
+#line 3575
 #else   /* not SX */
+#line 3575
 	const char *xp = (const char *) *xpp;
+#line 3575
 	int status = NC_NOERR;
+#line 3575
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3575
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3575
 	{
+#line 3575
 		const int lstatus = ncx_get_longlong_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3575
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3575
+			status = lstatus;
+#line 3575
+	}
+#line 3575
+
+#line 3575
+	*xpp = (const void *)xp;
+#line 3575
+	return status;
+#line 3575
+#endif
+#line 3575
+}
+#line 3575
+
+int
+#line 3576
+ncx_getn_longlong_long(const void **xpp, size_t nelems, long *tp)
+#line 3576
+{
+#line 3576
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3576
+
+#line 3576
+ /* basic algorithm is:
+#line 3576
+  *   - ensure sane alignment of input data
+#line 3576
+  *   - copy (conversion happens automatically) input data
+#line 3576
+  *     to output
+#line 3576
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3576
+  *     at next location for converted output
+#line 3576
+  */
+#line 3576
+  long i, j, ni;
+#line 3576
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3576
+  int64 *xp;
+#line 3576
+  int nrange = 0;         /* number of range errors */
+#line 3576
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3576
+  long cxp = (long) *((char**)xpp);
+#line 3576
+
+#line 3576
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3576
+  /* sjl: manually stripmine so we can limit amount of
+#line 3576
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3576
+   * makes vectorisation easy */
+#line 3576
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3576
+    ni=Min(nelems-j,LOOPCNT);
+#line 3576
+    if (realign) {
+#line 3576
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3576
+      xp = tmp;
+#line 3576
+    } else {
+#line 3576
+      xp = (int64 *) *xpp;
+#line 3576
+    }
+#line 3576
+   /* copy the next block */
+#line 3576
+#pragma cdir loopcnt=LOOPCNT
+#line 3576
+#pragma cdir shortloop
+#line 3576
+    for (i=0; i<ni; i++) {
+#line 3576
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3576
+     /* test for range errors (not always needed but do it anyway) */
+#line 3576
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3576
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3576
+      nrange += xp[i] > LONG_MAX || xp[i] < LONG_MIN;
+#line 3576
+    }
+#line 3576
+   /* update xpp and tp */
+#line 3576
+    if (realign) xp = (int64 *) *xpp;
+#line 3576
+    xp += ni;
+#line 3576
+    tp += ni;
+#line 3576
+    *xpp = (void*)xp;
+#line 3576
+  }
+#line 3576
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3576
+
+#line 3576
+#else   /* not SX */
+#line 3576
+	const char *xp = (const char *) *xpp;
+#line 3576
+	int status = NC_NOERR;
+#line 3576
+
+#line 3576
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3576
+	{
+#line 3576
+		const int lstatus = ncx_get_longlong_long(xp, tp);
+#line 3576
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3576
 			status = lstatus;
+#line 3576
 	}
+#line 3576
 
+#line 3576
 	*xpp = (const void *)xp;
+#line 3576
 	return status;
-#  endif
+#line 3576
+#endif
+#line 3576
 }
+#line 3576
 
 int
+#line 3577
 ncx_getn_longlong_float(const void **xpp, size_t nelems, float *tp)
+#line 3577
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3577
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3577
 
+#line 3577
  /* basic algorithm is:
+#line 3577
   *   - ensure sane alignment of input data
+#line 3577
   *   - copy (conversion happens automatically) input data
+#line 3577
   *     to output
+#line 3577
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3577
   *     at next location for converted output
+#line 3577
   */
+#line 3577
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3577
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3577
+  int64 *xp;
+#line 3577
   int nrange = 0;         /* number of range errors */
+#line 3577
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3577
   long cxp = (long) *((char**)xpp);
+#line 3577
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3577
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3577
   /* sjl: manually stripmine so we can limit amount of
+#line 3577
    * vector work space reserved to LOOPCNT elements. Also
+#line 3577
    * makes vectorisation easy */
+#line 3577
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3577
     ni=Min(nelems-j,LOOPCNT);
+#line 3577
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3577
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3577
       xp = tmp;
+#line 3577
     } else {
-      xp = (longlong *) *xpp;
+#line 3577
+      xp = (int64 *) *xpp;
+#line 3577
     }
+#line 3577
    /* copy the next block */
+#line 3577
 #pragma cdir loopcnt=LOOPCNT
+#line 3577
 #pragma cdir shortloop
+#line 3577
     for (i=0; i<ni; i++) {
+#line 3577
       tp[i] = (float) Max( FLOAT_MIN, Min(FLOAT_MAX, (float) xp[i]));
+#line 3577
      /* test for range errors (not always needed but do it anyway) */
+#line 3577
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3577
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3577
       nrange += xp[i] > FLOAT_MAX || xp[i] < FLOAT_MIN;
+#line 3577
     }
+#line 3577
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3577
+    if (realign) xp = (int64 *) *xpp;
+#line 3577
     xp += ni;
+#line 3577
     tp += ni;
+#line 3577
     *xpp = (void*)xp;
+#line 3577
   }
+#line 3577
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3577
 
+#line 3577
 #else   /* not SX */
+#line 3577
 	const char *xp = (const char *) *xpp;
+#line 3577
 	int status = NC_NOERR;
+#line 3577
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3577
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3577
 	{
+#line 3577
 		const int lstatus = ncx_get_longlong_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3577
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3577
 			status = lstatus;
+#line 3577
 	}
+#line 3577
 
+#line 3577
 	*xpp = (const void *)xp;
+#line 3577
 	return status;
-#  endif
+#line 3577
+#endif
+#line 3577
 }
+#line 3577
 
 int
+#line 3578
 ncx_getn_longlong_double(const void **xpp, size_t nelems, double *tp)
+#line 3578
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3578
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3578
 
+#line 3578
  /* basic algorithm is:
+#line 3578
   *   - ensure sane alignment of input data
+#line 3578
   *   - copy (conversion happens automatically) input data
+#line 3578
   *     to output
+#line 3578
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3578
   *     at next location for converted output
+#line 3578
   */
+#line 3578
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3578
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3578
+  int64 *xp;
+#line 3578
   int nrange = 0;         /* number of range errors */
+#line 3578
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3578
   long cxp = (long) *((char**)xpp);
+#line 3578
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3578
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3578
   /* sjl: manually stripmine so we can limit amount of
+#line 3578
    * vector work space reserved to LOOPCNT elements. Also
+#line 3578
    * makes vectorisation easy */
+#line 3578
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3578
     ni=Min(nelems-j,LOOPCNT);
+#line 3578
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3578
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3578
       xp = tmp;
+#line 3578
     } else {
-      xp = (longlong *) *xpp;
+#line 3578
+      xp = (int64 *) *xpp;
+#line 3578
     }
+#line 3578
    /* copy the next block */
+#line 3578
 #pragma cdir loopcnt=LOOPCNT
+#line 3578
 #pragma cdir shortloop
+#line 3578
     for (i=0; i<ni; i++) {
+#line 3578
       tp[i] = (double) Max( DOUBLE_MIN, Min(DOUBLE_MAX, (double) xp[i]));
+#line 3578
      /* test for range errors (not always needed but do it anyway) */
+#line 3578
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3578
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3578
       nrange += xp[i] > DOUBLE_MAX || xp[i] < DOUBLE_MIN;
+#line 3578
     }
+#line 3578
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3578
+    if (realign) xp = (int64 *) *xpp;
+#line 3578
     xp += ni;
+#line 3578
     tp += ni;
+#line 3578
     *xpp = (void*)xp;
+#line 3578
   }
+#line 3578
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3578
 
+#line 3578
 #else   /* not SX */
+#line 3578
 	const char *xp = (const char *) *xpp;
+#line 3578
 	int status = NC_NOERR;
+#line 3578
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3578
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3578
 	{
+#line 3578
 		const int lstatus = ncx_get_longlong_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3578
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3578
 			status = lstatus;
+#line 3578
 	}
+#line 3578
 
+#line 3578
 	*xpp = (const void *)xp;
+#line 3578
 	return status;
-#  endif
+#line 3578
+#endif
+#line 3578
 }
+#line 3578
 
 int
+#line 3579
 ncx_getn_longlong_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3579
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3579
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3579
 
+#line 3579
  /* basic algorithm is:
+#line 3579
   *   - ensure sane alignment of input data
+#line 3579
   *   - copy (conversion happens automatically) input data
+#line 3579
   *     to output
+#line 3579
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3579
   *     at next location for converted output
+#line 3579
   */
+#line 3579
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3579
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3579
+  int64 *xp;
+#line 3579
   int nrange = 0;         /* number of range errors */
+#line 3579
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3579
   long cxp = (long) *((char**)xpp);
+#line 3579
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3579
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3579
   /* sjl: manually stripmine so we can limit amount of
+#line 3579
    * vector work space reserved to LOOPCNT elements. Also
+#line 3579
    * makes vectorisation easy */
+#line 3579
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3579
     ni=Min(nelems-j,LOOPCNT);
+#line 3579
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3579
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3579
       xp = tmp;
+#line 3579
     } else {
-      xp = (longlong *) *xpp;
+#line 3579
+      xp = (int64 *) *xpp;
+#line 3579
     }
+#line 3579
    /* copy the next block */
+#line 3579
 #pragma cdir loopcnt=LOOPCNT
+#line 3579
 #pragma cdir shortloop
+#line 3579
     for (i=0; i<ni; i++) {
+#line 3579
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3579
      /* test for range errors (not always needed but do it anyway) */
+#line 3579
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3579
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3579
       nrange += xp[i] > UCHAR_MAX || xp[i] < 0;
+#line 3579
     }
+#line 3579
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3579
+    if (realign) xp = (int64 *) *xpp;
+#line 3579
     xp += ni;
+#line 3579
     tp += ni;
+#line 3579
     *xpp = (void*)xp;
+#line 3579
   }
+#line 3579
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3579
 
+#line 3579
 #else   /* not SX */
+#line 3579
 	const char *xp = (const char *) *xpp;
+#line 3579
 	int status = NC_NOERR;
+#line 3579
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3579
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3579
 	{
+#line 3579
 		const int lstatus = ncx_get_longlong_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3579
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3579
 			status = lstatus;
+#line 3579
 	}
+#line 3579
 
+#line 3579
 	*xpp = (const void *)xp;
+#line 3579
 	return status;
-#  endif
+#line 3579
+#endif
+#line 3579
 }
+#line 3579
 
 int
+#line 3580
 ncx_getn_longlong_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3580
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3580
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3580
 
+#line 3580
  /* basic algorithm is:
+#line 3580
   *   - ensure sane alignment of input data
+#line 3580
   *   - copy (conversion happens automatically) input data
+#line 3580
   *     to output
+#line 3580
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3580
   *     at next location for converted output
+#line 3580
   */
+#line 3580
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3580
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3580
+  int64 *xp;
+#line 3580
   int nrange = 0;         /* number of range errors */
+#line 3580
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3580
   long cxp = (long) *((char**)xpp);
+#line 3580
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3580
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3580
   /* sjl: manually stripmine so we can limit amount of
+#line 3580
    * vector work space reserved to LOOPCNT elements. Also
+#line 3580
    * makes vectorisation easy */
+#line 3580
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3580
     ni=Min(nelems-j,LOOPCNT);
+#line 3580
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3580
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3580
       xp = tmp;
+#line 3580
     } else {
-      xp = (longlong *) *xpp;
+#line 3580
+      xp = (int64 *) *xpp;
+#line 3580
     }
+#line 3580
    /* copy the next block */
+#line 3580
 #pragma cdir loopcnt=LOOPCNT
+#line 3580
 #pragma cdir shortloop
+#line 3580
     for (i=0; i<ni; i++) {
+#line 3580
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3580
      /* test for range errors (not always needed but do it anyway) */
+#line 3580
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3580
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3580
       nrange += xp[i] > USHORT_MAX || xp[i] < 0;
+#line 3580
     }
+#line 3580
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3580
+    if (realign) xp = (int64 *) *xpp;
+#line 3580
     xp += ni;
+#line 3580
     tp += ni;
+#line 3580
     *xpp = (void*)xp;
+#line 3580
   }
+#line 3580
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3580
 
+#line 3580
 #else   /* not SX */
+#line 3580
 	const char *xp = (const char *) *xpp;
+#line 3580
 	int status = NC_NOERR;
+#line 3580
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3580
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3580
 	{
+#line 3580
 		const int lstatus = ncx_get_longlong_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3580
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3580
 			status = lstatus;
+#line 3580
 	}
+#line 3580
 
+#line 3580
 	*xpp = (const void *)xp;
+#line 3580
 	return status;
-#  endif
+#line 3580
+#endif
+#line 3580
 }
+#line 3580
 
 int
+#line 3581
 ncx_getn_longlong_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3581
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3581
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3581
 
+#line 3581
  /* basic algorithm is:
+#line 3581
   *   - ensure sane alignment of input data
+#line 3581
   *   - copy (conversion happens automatically) input data
+#line 3581
   *     to output
+#line 3581
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3581
   *     at next location for converted output
+#line 3581
   */
+#line 3581
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3581
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3581
+  int64 *xp;
+#line 3581
   int nrange = 0;         /* number of range errors */
+#line 3581
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3581
   long cxp = (long) *((char**)xpp);
+#line 3581
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3581
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3581
   /* sjl: manually stripmine so we can limit amount of
+#line 3581
    * vector work space reserved to LOOPCNT elements. Also
+#line 3581
    * makes vectorisation easy */
+#line 3581
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3581
     ni=Min(nelems-j,LOOPCNT);
+#line 3581
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3581
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3581
       xp = tmp;
+#line 3581
     } else {
-      xp = (longlong *) *xpp;
+#line 3581
+      xp = (int64 *) *xpp;
+#line 3581
     }
+#line 3581
    /* copy the next block */
+#line 3581
 #pragma cdir loopcnt=LOOPCNT
+#line 3581
 #pragma cdir shortloop
+#line 3581
     for (i=0; i<ni; i++) {
+#line 3581
       tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3581
      /* test for range errors (not always needed but do it anyway) */
+#line 3581
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3581
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3581
       nrange += xp[i] > UINT_MAX || xp[i] < 0;
+#line 3581
     }
+#line 3581
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3581
+    if (realign) xp = (int64 *) *xpp;
+#line 3581
     xp += ni;
+#line 3581
     tp += ni;
+#line 3581
     *xpp = (void*)xp;
+#line 3581
   }
+#line 3581
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3581
 
+#line 3581
 #else   /* not SX */
+#line 3581
 	const char *xp = (const char *) *xpp;
+#line 3581
 	int status = NC_NOERR;
+#line 3581
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3581
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3581
 	{
+#line 3581
 		const int lstatus = ncx_get_longlong_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3581
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3581
 			status = lstatus;
+#line 3581
 	}
+#line 3581
 
+#line 3581
 	*xpp = (const void *)xp;
+#line 3581
 	return status;
-#  endif
+#line 3581
+#endif
+#line 3581
 }
+#line 3581
 
 int
+#line 3582
 ncx_getn_longlong_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3582
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3582
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3582
 
+#line 3582
  /* basic algorithm is:
+#line 3582
   *   - ensure sane alignment of input data
+#line 3582
   *   - copy (conversion happens automatically) input data
+#line 3582
   *     to output
+#line 3582
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3582
   *     at next location for converted output
+#line 3582
   */
+#line 3582
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3582
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3582
+  int64 *xp;
+#line 3582
   int nrange = 0;         /* number of range errors */
+#line 3582
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3582
   long cxp = (long) *((char**)xpp);
+#line 3582
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3582
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3582
   /* sjl: manually stripmine so we can limit amount of
+#line 3582
    * vector work space reserved to LOOPCNT elements. Also
+#line 3582
    * makes vectorisation easy */
+#line 3582
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3582
     ni=Min(nelems-j,LOOPCNT);
+#line 3582
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_LONGLONG);
+#line 3582
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_INT64));
+#line 3582
       xp = tmp;
+#line 3582
     } else {
-      xp = (longlong *) *xpp;
+#line 3582
+      xp = (int64 *) *xpp;
+#line 3582
     }
+#line 3582
    /* copy the next block */
+#line 3582
 #pragma cdir loopcnt=LOOPCNT
+#line 3582
 #pragma cdir shortloop
+#line 3582
     for (i=0; i<ni; i++) {
+#line 3582
       tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3582
      /* test for range errors (not always needed but do it anyway) */
+#line 3582
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3582
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3582
       nrange += xp[i] > ULONGLONG_MAX || xp[i] < 0;
+#line 3582
     }
+#line 3582
    /* update xpp and tp */
-    if (realign) xp = (longlong *) *xpp;
+#line 3582
+    if (realign) xp = (int64 *) *xpp;
+#line 3582
     xp += ni;
+#line 3582
     tp += ni;
+#line 3582
     *xpp = (void*)xp;
+#line 3582
   }
+#line 3582
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3582
 
+#line 3582
 #else   /* not SX */
+#line 3582
 	const char *xp = (const char *) *xpp;
+#line 3582
 	int status = NC_NOERR;
+#line 3582
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3582
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3582
 	{
+#line 3582
 		const int lstatus = ncx_get_longlong_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3582
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3582
 			status = lstatus;
+#line 3582
 	}
+#line 3582
 
+#line 3582
 	*xpp = (const void *)xp;
+#line 3582
 	return status;
-#  endif
+#line 3582
+#endif
+#line 3582
 }
+#line 3582
 
 
-#if X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#if X_SIZEOF_INT64 == SIZEOF_LONGLONG
 /* optimized version */
 int
-ncx_putn_longlong_longlong(void **xpp, size_t nelems, const long long *tp)
+ncx_putn_longlong_longlong(void **xpp, size_t nelems, const long long *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_LONGLONG);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_INT64);
 # else
 	swapn8b(*xpp, tp, nelems);
 # endif
-	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_LONGLONG);
+	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_INT64);
 	return NC_NOERR;
 }
 #else
 int
-ncx_putn_longlong_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3598
+ncx_putn_longlong_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3598
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3598
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3598
 
+#line 3598
  /* basic algorithm is:
+#line 3598
   *   - ensure sane alignment of output data
+#line 3598
   *   - copy (conversion happens automatically) input data
+#line 3598
   *     to output
+#line 3598
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3598
   *     at next location for converted output
+#line 3598
   */
+#line 3598
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3598
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3598
+  int64 *xp;
+#line 3598
   int nrange = 0;         /* number of range errors */
+#line 3598
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3598
   long cxp = (long) *((char**)xpp);
+#line 3598
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3598
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3598
   /* sjl: manually stripmine so we can limit amount of
+#line 3598
    * vector work space reserved to LOOPCNT elements. Also
+#line 3598
    * makes vectorisation easy */
+#line 3598
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3598
     ni=Min(nelems-j,LOOPCNT);
+#line 3598
     if (realign) {
+#line 3598
       xp = tmp;
+#line 3598
     } else {
-      xp = (longlong *) *xpp;
+#line 3598
+      xp = (int64 *) *xpp;
+#line 3598
     }
+#line 3598
    /* copy the next block */
+#line 3598
 #pragma cdir loopcnt=LOOPCNT
+#line 3598
 #pragma cdir shortloop
+#line 3598
     for (i=0; i<ni; i++) {
+#line 3598
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3598
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3598
      /* test for range errors (not always needed but do it anyway) */
+#line 3598
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3598
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX || tp[i] < X_LONGLONG_MIN;
+#line 3598
+      nrange += tp[i] > X_INT64_MAX || tp[i] < X_INT64_MIN;
+#line 3598
     }
+#line 3598
    /* copy workspace back if necessary */
+#line 3598
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3598
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3598
+      xp = (int64 *) *xpp;
+#line 3598
     }
+#line 3598
    /* update xpp and tp */
+#line 3598
     xp += ni;
+#line 3598
     tp += ni;
+#line 3598
     *xpp = (void*)xp;
+#line 3598
   }
+#line 3598
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3598
 
+#line 3598
 #else   /* not SX */
+#line 3598
 
+#line 3598
 	char *xp = (char *) *xpp;
+#line 3598
 	int status = NC_NOERR;
+#line 3598
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3598
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3598
 	{
-		int lstatus = ncx_put_longlong_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3598
+		int lstatus = ncx_put_longlong_longlong(xp, tp, fillp);
+#line 3598
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3598
 			status = lstatus;
+#line 3598
 	}
+#line 3598
 
+#line 3598
 	*xpp = (void *)xp;
+#line 3598
 	return status;
+#line 3598
 #endif
+#line 3598
 }
+#line 3598
+
+#endif
+int
+#line 3600
+ncx_putn_longlong_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3600
+{
+#line 3600
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3600
+
+#line 3600
+ /* basic algorithm is:
+#line 3600
+  *   - ensure sane alignment of output data
+#line 3600
+  *   - copy (conversion happens automatically) input data
+#line 3600
+  *     to output
+#line 3600
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3600
+  *     at next location for converted output
+#line 3600
+  */
+#line 3600
+  long i, j, ni;
+#line 3600
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3600
+  int64 *xp;
+#line 3600
+  int nrange = 0;         /* number of range errors */
+#line 3600
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3600
+  long cxp = (long) *((char**)xpp);
+#line 3600
+
+#line 3600
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3600
+  /* sjl: manually stripmine so we can limit amount of
+#line 3600
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3600
+   * makes vectorisation easy */
+#line 3600
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3600
+    ni=Min(nelems-j,LOOPCNT);
+#line 3600
+    if (realign) {
+#line 3600
+      xp = tmp;
+#line 3600
+    } else {
+#line 3600
+      xp = (int64 *) *xpp;
+#line 3600
+    }
+#line 3600
+   /* copy the next block */
+#line 3600
+#pragma cdir loopcnt=LOOPCNT
+#line 3600
+#pragma cdir shortloop
+#line 3600
+    for (i=0; i<ni; i++) {
+#line 3600
+      /* the normal case: */
+#line 3600
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3600
+     /* test for range errors (not always needed but do it anyway) */
+#line 3600
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3600
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3600
+      nrange += tp[i] > X_INT64_MAX || tp[i] < X_INT64_MIN;
+#line 3600
+    }
+#line 3600
+   /* copy workspace back if necessary */
+#line 3600
+    if (realign) {
+#line 3600
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3600
+      xp = (int64 *) *xpp;
+#line 3600
+    }
+#line 3600
+   /* update xpp and tp */
+#line 3600
+    xp += ni;
+#line 3600
+    tp += ni;
+#line 3600
+    *xpp = (void*)xp;
+#line 3600
+  }
+#line 3600
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3600
+
+#line 3600
+#else   /* not SX */
+#line 3600
 
+#line 3600
+	char *xp = (char *) *xpp;
+#line 3600
+	int status = NC_NOERR;
+#line 3600
+
+#line 3600
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3600
+	{
+#line 3600
+		int lstatus = ncx_put_longlong_schar(xp, tp, fillp);
+#line 3600
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3600
+			status = lstatus;
+#line 3600
+	}
+#line 3600
+
+#line 3600
+	*xpp = (void *)xp;
+#line 3600
+	return status;
+#line 3600
 #endif
+#line 3600
+}
+#line 3600
+
 int
-ncx_putn_longlong_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3601
+ncx_putn_longlong_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3601
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3601
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3601
 
+#line 3601
  /* basic algorithm is:
+#line 3601
   *   - ensure sane alignment of output data
+#line 3601
   *   - copy (conversion happens automatically) input data
+#line 3601
   *     to output
+#line 3601
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3601
   *     at next location for converted output
+#line 3601
   */
+#line 3601
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3601
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3601
+  int64 *xp;
+#line 3601
   int nrange = 0;         /* number of range errors */
+#line 3601
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3601
   long cxp = (long) *((char**)xpp);
+#line 3601
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3601
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3601
   /* sjl: manually stripmine so we can limit amount of
+#line 3601
    * vector work space reserved to LOOPCNT elements. Also
+#line 3601
    * makes vectorisation easy */
+#line 3601
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3601
     ni=Min(nelems-j,LOOPCNT);
+#line 3601
     if (realign) {
+#line 3601
       xp = tmp;
+#line 3601
     } else {
-      xp = (longlong *) *xpp;
+#line 3601
+      xp = (int64 *) *xpp;
+#line 3601
     }
+#line 3601
    /* copy the next block */
+#line 3601
 #pragma cdir loopcnt=LOOPCNT
+#line 3601
 #pragma cdir shortloop
+#line 3601
     for (i=0; i<ni; i++) {
+#line 3601
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3601
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3601
      /* test for range errors (not always needed but do it anyway) */
+#line 3601
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3601
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX || tp[i] < X_LONGLONG_MIN;
+#line 3601
+      nrange += tp[i] > X_INT64_MAX || tp[i] < X_INT64_MIN;
+#line 3601
     }
+#line 3601
    /* copy workspace back if necessary */
+#line 3601
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3601
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3601
+      xp = (int64 *) *xpp;
+#line 3601
     }
+#line 3601
    /* update xpp and tp */
+#line 3601
     xp += ni;
+#line 3601
     tp += ni;
+#line 3601
     *xpp = (void*)xp;
+#line 3601
   }
+#line 3601
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3601
 
+#line 3601
 #else   /* not SX */
+#line 3601
 
+#line 3601
 	char *xp = (char *) *xpp;
+#line 3601
 	int status = NC_NOERR;
+#line 3601
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3601
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3601
 	{
-		int lstatus = ncx_put_longlong_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3601
+		int lstatus = ncx_put_longlong_short(xp, tp, fillp);
+#line 3601
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3601
 			status = lstatus;
+#line 3601
 	}
+#line 3601
 
+#line 3601
 	*xpp = (void *)xp;
+#line 3601
 	return status;
+#line 3601
 #endif
+#line 3601
 }
+#line 3601
 
 int
-ncx_putn_longlong_short(void **xpp, size_t nelems, const short *tp)
+#line 3602
+ncx_putn_longlong_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3602
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3602
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3602
 
+#line 3602
  /* basic algorithm is:
+#line 3602
   *   - ensure sane alignment of output data
+#line 3602
   *   - copy (conversion happens automatically) input data
+#line 3602
   *     to output
+#line 3602
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3602
   *     at next location for converted output
+#line 3602
   */
+#line 3602
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3602
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3602
+  int64 *xp;
+#line 3602
   int nrange = 0;         /* number of range errors */
+#line 3602
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3602
   long cxp = (long) *((char**)xpp);
+#line 3602
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3602
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3602
   /* sjl: manually stripmine so we can limit amount of
+#line 3602
    * vector work space reserved to LOOPCNT elements. Also
+#line 3602
    * makes vectorisation easy */
+#line 3602
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3602
     ni=Min(nelems-j,LOOPCNT);
+#line 3602
     if (realign) {
+#line 3602
       xp = tmp;
+#line 3602
     } else {
-      xp = (longlong *) *xpp;
+#line 3602
+      xp = (int64 *) *xpp;
+#line 3602
     }
+#line 3602
    /* copy the next block */
+#line 3602
 #pragma cdir loopcnt=LOOPCNT
+#line 3602
 #pragma cdir shortloop
+#line 3602
     for (i=0; i<ni; i++) {
+#line 3602
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3602
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3602
      /* test for range errors (not always needed but do it anyway) */
+#line 3602
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3602
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX || tp[i] < X_LONGLONG_MIN;
+#line 3602
+      nrange += tp[i] > X_INT64_MAX || tp[i] < X_INT64_MIN;
+#line 3602
     }
+#line 3602
    /* copy workspace back if necessary */
+#line 3602
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3602
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3602
+      xp = (int64 *) *xpp;
+#line 3602
     }
+#line 3602
    /* update xpp and tp */
+#line 3602
     xp += ni;
+#line 3602
     tp += ni;
+#line 3602
     *xpp = (void*)xp;
+#line 3602
   }
+#line 3602
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3602
 
+#line 3602
 #else   /* not SX */
+#line 3602
 
+#line 3602
 	char *xp = (char *) *xpp;
+#line 3602
 	int status = NC_NOERR;
+#line 3602
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3602
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3602
 	{
-		int lstatus = ncx_put_longlong_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3602
+		int lstatus = ncx_put_longlong_int(xp, tp, fillp);
+#line 3602
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3602
 			status = lstatus;
+#line 3602
 	}
+#line 3602
 
+#line 3602
 	*xpp = (void *)xp;
+#line 3602
 	return status;
+#line 3602
 #endif
+#line 3602
 }
+#line 3602
 
 int
-ncx_putn_longlong_int(void **xpp, size_t nelems, const int *tp)
+#line 3603
+ncx_putn_longlong_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3603
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3603
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3603
 
+#line 3603
  /* basic algorithm is:
+#line 3603
   *   - ensure sane alignment of output data
+#line 3603
   *   - copy (conversion happens automatically) input data
+#line 3603
   *     to output
+#line 3603
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3603
   *     at next location for converted output
+#line 3603
   */
+#line 3603
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3603
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3603
+  int64 *xp;
+#line 3603
   int nrange = 0;         /* number of range errors */
+#line 3603
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3603
   long cxp = (long) *((char**)xpp);
+#line 3603
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3603
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3603
   /* sjl: manually stripmine so we can limit amount of
+#line 3603
    * vector work space reserved to LOOPCNT elements. Also
+#line 3603
    * makes vectorisation easy */
+#line 3603
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3603
     ni=Min(nelems-j,LOOPCNT);
+#line 3603
     if (realign) {
+#line 3603
       xp = tmp;
+#line 3603
     } else {
-      xp = (longlong *) *xpp;
+#line 3603
+      xp = (int64 *) *xpp;
+#line 3603
     }
+#line 3603
    /* copy the next block */
+#line 3603
 #pragma cdir loopcnt=LOOPCNT
+#line 3603
 #pragma cdir shortloop
+#line 3603
     for (i=0; i<ni; i++) {
+#line 3603
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3603
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3603
      /* test for range errors (not always needed but do it anyway) */
+#line 3603
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3603
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX || tp[i] < X_LONGLONG_MIN;
+#line 3603
+      nrange += tp[i] > X_INT64_MAX || tp[i] < X_INT64_MIN;
+#line 3603
     }
+#line 3603
    /* copy workspace back if necessary */
+#line 3603
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3603
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3603
+      xp = (int64 *) *xpp;
+#line 3603
     }
+#line 3603
    /* update xpp and tp */
+#line 3603
     xp += ni;
+#line 3603
     tp += ni;
+#line 3603
     *xpp = (void*)xp;
+#line 3603
   }
+#line 3603
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3603
 
+#line 3603
 #else   /* not SX */
+#line 3603
 
+#line 3603
 	char *xp = (char *) *xpp;
+#line 3603
 	int status = NC_NOERR;
+#line 3603
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3603
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3603
 	{
-		int lstatus = ncx_put_longlong_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3603
+		int lstatus = ncx_put_longlong_long(xp, tp, fillp);
+#line 3603
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3603
 			status = lstatus;
+#line 3603
 	}
+#line 3603
 
+#line 3603
 	*xpp = (void *)xp;
+#line 3603
 	return status;
+#line 3603
 #endif
+#line 3603
 }
+#line 3603
 
 int
-ncx_putn_longlong_float(void **xpp, size_t nelems, const float *tp)
+#line 3604
+ncx_putn_longlong_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3604
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3604
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3604
 
+#line 3604
  /* basic algorithm is:
+#line 3604
   *   - ensure sane alignment of output data
+#line 3604
   *   - copy (conversion happens automatically) input data
+#line 3604
   *     to output
+#line 3604
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3604
   *     at next location for converted output
+#line 3604
   */
+#line 3604
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3604
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3604
+  int64 *xp;
+#line 3604
   int nrange = 0;         /* number of range errors */
+#line 3604
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3604
   long cxp = (long) *((char**)xpp);
+#line 3604
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3604
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3604
   /* sjl: manually stripmine so we can limit amount of
+#line 3604
    * vector work space reserved to LOOPCNT elements. Also
+#line 3604
    * makes vectorisation easy */
+#line 3604
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3604
     ni=Min(nelems-j,LOOPCNT);
+#line 3604
     if (realign) {
+#line 3604
       xp = tmp;
+#line 3604
     } else {
-      xp = (longlong *) *xpp;
+#line 3604
+      xp = (int64 *) *xpp;
+#line 3604
     }
+#line 3604
    /* copy the next block */
+#line 3604
 #pragma cdir loopcnt=LOOPCNT
+#line 3604
 #pragma cdir shortloop
+#line 3604
     for (i=0; i<ni; i++) {
+#line 3604
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3604
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3604
      /* test for range errors (not always needed but do it anyway) */
+#line 3604
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3604
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX || tp[i] < X_LONGLONG_MIN;
+#line 3604
+      nrange += tp[i] > X_INT64_MAX || tp[i] < X_INT64_MIN;
+#line 3604
     }
+#line 3604
    /* copy workspace back if necessary */
+#line 3604
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3604
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3604
+      xp = (int64 *) *xpp;
+#line 3604
     }
+#line 3604
    /* update xpp and tp */
+#line 3604
     xp += ni;
+#line 3604
     tp += ni;
+#line 3604
     *xpp = (void*)xp;
+#line 3604
   }
+#line 3604
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3604
 
+#line 3604
 #else   /* not SX */
+#line 3604
 
+#line 3604
 	char *xp = (char *) *xpp;
+#line 3604
 	int status = NC_NOERR;
+#line 3604
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3604
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3604
 	{
-		int lstatus = ncx_put_longlong_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3604
+		int lstatus = ncx_put_longlong_float(xp, tp, fillp);
+#line 3604
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3604
 			status = lstatus;
+#line 3604
 	}
+#line 3604
 
+#line 3604
 	*xpp = (void *)xp;
+#line 3604
 	return status;
+#line 3604
 #endif
+#line 3604
 }
+#line 3604
 
 int
-ncx_putn_longlong_double(void **xpp, size_t nelems, const double *tp)
+#line 3605
+ncx_putn_longlong_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3605
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3605
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3605
 
+#line 3605
  /* basic algorithm is:
+#line 3605
   *   - ensure sane alignment of output data
+#line 3605
   *   - copy (conversion happens automatically) input data
+#line 3605
   *     to output
+#line 3605
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3605
   *     at next location for converted output
+#line 3605
   */
+#line 3605
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3605
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3605
+  int64 *xp;
+#line 3605
   int nrange = 0;         /* number of range errors */
+#line 3605
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3605
   long cxp = (long) *((char**)xpp);
+#line 3605
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3605
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3605
   /* sjl: manually stripmine so we can limit amount of
+#line 3605
    * vector work space reserved to LOOPCNT elements. Also
+#line 3605
    * makes vectorisation easy */
+#line 3605
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3605
     ni=Min(nelems-j,LOOPCNT);
+#line 3605
     if (realign) {
+#line 3605
       xp = tmp;
+#line 3605
     } else {
-      xp = (longlong *) *xpp;
+#line 3605
+      xp = (int64 *) *xpp;
+#line 3605
     }
+#line 3605
    /* copy the next block */
+#line 3605
 #pragma cdir loopcnt=LOOPCNT
+#line 3605
 #pragma cdir shortloop
+#line 3605
     for (i=0; i<ni; i++) {
+#line 3605
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3605
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3605
      /* test for range errors (not always needed but do it anyway) */
+#line 3605
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3605
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX || tp[i] < X_LONGLONG_MIN;
+#line 3605
+      nrange += tp[i] > X_INT64_MAX || tp[i] < X_INT64_MIN;
+#line 3605
     }
+#line 3605
    /* copy workspace back if necessary */
+#line 3605
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3605
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3605
+      xp = (int64 *) *xpp;
+#line 3605
     }
+#line 3605
    /* update xpp and tp */
+#line 3605
     xp += ni;
+#line 3605
     tp += ni;
+#line 3605
     *xpp = (void*)xp;
+#line 3605
   }
+#line 3605
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3605
 
+#line 3605
 #else   /* not SX */
+#line 3605
 
+#line 3605
 	char *xp = (char *) *xpp;
+#line 3605
 	int status = NC_NOERR;
+#line 3605
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3605
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3605
 	{
-		int lstatus = ncx_put_longlong_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3605
+		int lstatus = ncx_put_longlong_double(xp, tp, fillp);
+#line 3605
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3605
 			status = lstatus;
+#line 3605
 	}
+#line 3605
 
+#line 3605
 	*xpp = (void *)xp;
+#line 3605
 	return status;
+#line 3605
 #endif
+#line 3605
 }
+#line 3605
 
 int
-ncx_putn_longlong_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3606
+ncx_putn_longlong_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3606
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3606
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3606
 
+#line 3606
  /* basic algorithm is:
+#line 3606
   *   - ensure sane alignment of output data
+#line 3606
   *   - copy (conversion happens automatically) input data
+#line 3606
   *     to output
+#line 3606
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3606
   *     at next location for converted output
+#line 3606
   */
+#line 3606
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3606
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3606
+  int64 *xp;
+#line 3606
   int nrange = 0;         /* number of range errors */
+#line 3606
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3606
   long cxp = (long) *((char**)xpp);
+#line 3606
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3606
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3606
   /* sjl: manually stripmine so we can limit amount of
+#line 3606
    * vector work space reserved to LOOPCNT elements. Also
+#line 3606
    * makes vectorisation easy */
+#line 3606
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3606
     ni=Min(nelems-j,LOOPCNT);
+#line 3606
     if (realign) {
+#line 3606
       xp = tmp;
+#line 3606
     } else {
-      xp = (longlong *) *xpp;
+#line 3606
+      xp = (int64 *) *xpp;
+#line 3606
     }
+#line 3606
    /* copy the next block */
+#line 3606
 #pragma cdir loopcnt=LOOPCNT
+#line 3606
 #pragma cdir shortloop
+#line 3606
     for (i=0; i<ni; i++) {
+#line 3606
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3606
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3606
      /* test for range errors (not always needed but do it anyway) */
+#line 3606
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3606
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX ;
+#line 3606
+      nrange += tp[i] > X_INT64_MAX ;
+#line 3606
     }
+#line 3606
    /* copy workspace back if necessary */
+#line 3606
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3606
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3606
+      xp = (int64 *) *xpp;
+#line 3606
     }
+#line 3606
    /* update xpp and tp */
+#line 3606
     xp += ni;
+#line 3606
     tp += ni;
+#line 3606
     *xpp = (void*)xp;
+#line 3606
   }
+#line 3606
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3606
 
+#line 3606
 #else   /* not SX */
+#line 3606
 
+#line 3606
 	char *xp = (char *) *xpp;
+#line 3606
 	int status = NC_NOERR;
+#line 3606
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3606
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3606
 	{
-		int lstatus = ncx_put_longlong_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3606
+		int lstatus = ncx_put_longlong_uchar(xp, tp, fillp);
+#line 3606
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3606
 			status = lstatus;
+#line 3606
 	}
+#line 3606
 
+#line 3606
 	*xpp = (void *)xp;
+#line 3606
 	return status;
+#line 3606
 #endif
+#line 3606
 }
+#line 3606
 
 int
-ncx_putn_longlong_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3607
+ncx_putn_longlong_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3607
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3607
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3607
 
+#line 3607
  /* basic algorithm is:
+#line 3607
   *   - ensure sane alignment of output data
+#line 3607
   *   - copy (conversion happens automatically) input data
+#line 3607
   *     to output
+#line 3607
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3607
   *     at next location for converted output
+#line 3607
   */
+#line 3607
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3607
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3607
+  int64 *xp;
+#line 3607
   int nrange = 0;         /* number of range errors */
+#line 3607
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3607
   long cxp = (long) *((char**)xpp);
+#line 3607
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3607
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3607
   /* sjl: manually stripmine so we can limit amount of
+#line 3607
    * vector work space reserved to LOOPCNT elements. Also
+#line 3607
    * makes vectorisation easy */
+#line 3607
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3607
     ni=Min(nelems-j,LOOPCNT);
+#line 3607
     if (realign) {
+#line 3607
       xp = tmp;
+#line 3607
     } else {
-      xp = (longlong *) *xpp;
+#line 3607
+      xp = (int64 *) *xpp;
+#line 3607
     }
+#line 3607
    /* copy the next block */
+#line 3607
 #pragma cdir loopcnt=LOOPCNT
+#line 3607
 #pragma cdir shortloop
+#line 3607
     for (i=0; i<ni; i++) {
+#line 3607
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3607
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3607
      /* test for range errors (not always needed but do it anyway) */
+#line 3607
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3607
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX ;
+#line 3607
+      nrange += tp[i] > X_INT64_MAX ;
+#line 3607
     }
+#line 3607
    /* copy workspace back if necessary */
+#line 3607
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3607
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3607
+      xp = (int64 *) *xpp;
+#line 3607
     }
+#line 3607
    /* update xpp and tp */
+#line 3607
     xp += ni;
+#line 3607
     tp += ni;
+#line 3607
     *xpp = (void*)xp;
+#line 3607
   }
+#line 3607
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3607
 
+#line 3607
 #else   /* not SX */
+#line 3607
 
+#line 3607
 	char *xp = (char *) *xpp;
+#line 3607
 	int status = NC_NOERR;
+#line 3607
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3607
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3607
 	{
-		int lstatus = ncx_put_longlong_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3607
+		int lstatus = ncx_put_longlong_ushort(xp, tp, fillp);
+#line 3607
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3607
 			status = lstatus;
+#line 3607
 	}
+#line 3607
 
+#line 3607
 	*xpp = (void *)xp;
+#line 3607
 	return status;
+#line 3607
 #endif
+#line 3607
 }
+#line 3607
 
 int
-ncx_putn_longlong_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3608
+ncx_putn_longlong_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3608
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3608
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3608
 
+#line 3608
  /* basic algorithm is:
+#line 3608
   *   - ensure sane alignment of output data
+#line 3608
   *   - copy (conversion happens automatically) input data
+#line 3608
   *     to output
+#line 3608
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3608
   *     at next location for converted output
+#line 3608
   */
+#line 3608
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3608
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3608
+  int64 *xp;
+#line 3608
   int nrange = 0;         /* number of range errors */
+#line 3608
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3608
   long cxp = (long) *((char**)xpp);
+#line 3608
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3608
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3608
   /* sjl: manually stripmine so we can limit amount of
+#line 3608
    * vector work space reserved to LOOPCNT elements. Also
+#line 3608
    * makes vectorisation easy */
+#line 3608
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3608
     ni=Min(nelems-j,LOOPCNT);
+#line 3608
     if (realign) {
+#line 3608
       xp = tmp;
+#line 3608
     } else {
-      xp = (longlong *) *xpp;
+#line 3608
+      xp = (int64 *) *xpp;
+#line 3608
     }
+#line 3608
    /* copy the next block */
+#line 3608
 #pragma cdir loopcnt=LOOPCNT
+#line 3608
 #pragma cdir shortloop
+#line 3608
     for (i=0; i<ni; i++) {
+#line 3608
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3608
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3608
      /* test for range errors (not always needed but do it anyway) */
+#line 3608
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3608
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX ;
+#line 3608
+      nrange += tp[i] > X_INT64_MAX ;
+#line 3608
     }
+#line 3608
    /* copy workspace back if necessary */
+#line 3608
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3608
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3608
+      xp = (int64 *) *xpp;
+#line 3608
     }
+#line 3608
    /* update xpp and tp */
+#line 3608
     xp += ni;
+#line 3608
     tp += ni;
+#line 3608
     *xpp = (void*)xp;
+#line 3608
   }
+#line 3608
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3608
 
+#line 3608
 #else   /* not SX */
+#line 3608
 
+#line 3608
 	char *xp = (char *) *xpp;
+#line 3608
 	int status = NC_NOERR;
+#line 3608
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3608
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3608
 	{
-		int lstatus = ncx_put_longlong_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3608
+		int lstatus = ncx_put_longlong_uint(xp, tp, fillp);
+#line 3608
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3608
 			status = lstatus;
+#line 3608
 	}
+#line 3608
 
+#line 3608
 	*xpp = (void *)xp;
+#line 3608
 	return status;
+#line 3608
 #endif
+#line 3608
 }
+#line 3608
 
 int
-ncx_putn_longlong_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3609
+ncx_putn_longlong_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3609
 {
-#if _SX && X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#line 3609
+#if defined(_SX) && _SX != 0 && X_SIZEOF_INT64 == SIZEOF_INT64
+#line 3609
 
+#line 3609
  /* basic algorithm is:
+#line 3609
   *   - ensure sane alignment of output data
+#line 3609
   *   - copy (conversion happens automatically) input data
+#line 3609
   *     to output
+#line 3609
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3609
   *     at next location for converted output
+#line 3609
   */
+#line 3609
   long i, j, ni;
-  longlong tmp[LOOPCNT];        /* in case input is misaligned */
-  longlong *xp;
+#line 3609
+  int64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3609
+  int64 *xp;
+#line 3609
   int nrange = 0;         /* number of range errors */
+#line 3609
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3609
   long cxp = (long) *((char**)xpp);
+#line 3609
 
-  realign = (cxp & 7) % SIZEOF_LONGLONG;
+#line 3609
+  realign = (cxp & 7) % SIZEOF_INT64;
+#line 3609
   /* sjl: manually stripmine so we can limit amount of
+#line 3609
    * vector work space reserved to LOOPCNT elements. Also
+#line 3609
    * makes vectorisation easy */
+#line 3609
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3609
     ni=Min(nelems-j,LOOPCNT);
+#line 3609
     if (realign) {
+#line 3609
       xp = tmp;
+#line 3609
     } else {
-      xp = (longlong *) *xpp;
+#line 3609
+      xp = (int64 *) *xpp;
+#line 3609
     }
+#line 3609
    /* copy the next block */
+#line 3609
 #pragma cdir loopcnt=LOOPCNT
+#line 3609
 #pragma cdir shortloop
+#line 3609
     for (i=0; i<ni; i++) {
+#line 3609
       /* the normal case: */
-      xp[i] = (longlong) Max( X_LONGLONG_MIN, Min(X_LONGLONG_MAX, (longlong) tp[i]));
+#line 3609
+      xp[i] = (int64) Max( X_INT64_MIN, Min(X_INT64_MAX, (int64) tp[i]));
+#line 3609
      /* test for range errors (not always needed but do it anyway) */
+#line 3609
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3609
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_LONGLONG_MAX ;
+#line 3609
+      nrange += tp[i] > X_INT64_MAX ;
+#line 3609
     }
+#line 3609
    /* copy workspace back if necessary */
+#line 3609
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_LONGLONG);
-      xp = (longlong *) *xpp;
+#line 3609
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_INT64);
+#line 3609
+      xp = (int64 *) *xpp;
+#line 3609
     }
+#line 3609
    /* update xpp and tp */
+#line 3609
     xp += ni;
+#line 3609
     tp += ni;
+#line 3609
     *xpp = (void*)xp;
+#line 3609
   }
+#line 3609
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3609
 
+#line 3609
 #else   /* not SX */
+#line 3609
 
+#line 3609
 	char *xp = (char *) *xpp;
+#line 3609
 	int status = NC_NOERR;
+#line 3609
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_LONGLONG, tp++)
+#line 3609
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT64, tp++)
+#line 3609
 	{
-		int lstatus = ncx_put_longlong_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3609
+		int lstatus = ncx_put_longlong_ulonglong(xp, tp, fillp);
+#line 3609
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3609
 			status = lstatus;
+#line 3609
 	}
+#line 3609
 
+#line 3609
 	*xpp = (void *)xp;
+#line 3609
 	return status;
+#line 3609
 #endif
+#line 3609
 }
+#line 3609
 
 
-/* ulonglong ----------------------------------------------------------------------*/
+/* uint64 --------------------------------------------------------------------*/
 
-#if X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#if X_SIZEOF_UINT64 == SIZEOF_ULONGLONG
 /* optimized version */
 int
 ncx_getn_ulonglong_ulonglong(const void **xpp, size_t nelems, unsigned long long *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(unsigned long long));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_UNSIGNED_LONG_LONG);
 # else
 	swapn8b(tp, *xpp, nelems);
 # endif
-	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_ULONGLONG);
+	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_UINT64);
 	return NC_NOERR;
 }
 #else
 int
+#line 3627
 ncx_getn_ulonglong_ulonglong(const void **xpp, size_t nelems, ulonglong *tp)
+#line 3627
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3627
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3627
 
+#line 3627
  /* basic algorithm is:
+#line 3627
   *   - ensure sane alignment of input data
+#line 3627
   *   - copy (conversion happens automatically) input data
+#line 3627
   *     to output
+#line 3627
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3627
   *     at next location for converted output
+#line 3627
   */
+#line 3627
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3627
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3627
+  uint64 *xp;
+#line 3627
   int nrange = 0;         /* number of range errors */
+#line 3627
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3627
   long cxp = (long) *((char**)xpp);
+#line 3627
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3627
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3627
   /* sjl: manually stripmine so we can limit amount of
+#line 3627
    * vector work space reserved to LOOPCNT elements. Also
+#line 3627
    * makes vectorisation easy */
+#line 3627
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3627
     ni=Min(nelems-j,LOOPCNT);
+#line 3627
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3627
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3627
       xp = tmp;
+#line 3627
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3627
+      xp = (uint64 *) *xpp;
+#line 3627
     }
+#line 3627
    /* copy the next block */
+#line 3627
 #pragma cdir loopcnt=LOOPCNT
+#line 3627
 #pragma cdir shortloop
+#line 3627
     for (i=0; i<ni; i++) {
+#line 3627
       tp[i] = (ulonglong) Max( ULONGLONG_MIN, Min(ULONGLONG_MAX, (ulonglong) xp[i]));
+#line 3627
      /* test for range errors (not always needed but do it anyway) */
+#line 3627
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3627
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3627
       nrange += xp[i] > ULONGLONG_MAX ;
+#line 3627
     }
+#line 3627
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3627
+    if (realign) xp = (uint64 *) *xpp;
+#line 3627
     xp += ni;
+#line 3627
     tp += ni;
+#line 3627
     *xpp = (void*)xp;
+#line 3627
   }
+#line 3627
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3627
 
+#line 3627
 #else   /* not SX */
+#line 3627
 	const char *xp = (const char *) *xpp;
+#line 3627
 	int status = NC_NOERR;
+#line 3627
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3627
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3627
 	{
+#line 3627
 		const int lstatus = ncx_get_ulonglong_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3627
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3627
 			status = lstatus;
+#line 3627
 	}
+#line 3627
 
+#line 3627
 	*xpp = (const void *)xp;
+#line 3627
 	return status;
-#  endif
+#line 3627
+#endif
+#line 3627
 }
+#line 3627
 
 #endif
 int
+#line 3629
 ncx_getn_ulonglong_schar(const void **xpp, size_t nelems, schar *tp)
+#line 3629
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3629
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3629
 
+#line 3629
  /* basic algorithm is:
+#line 3629
   *   - ensure sane alignment of input data
+#line 3629
   *   - copy (conversion happens automatically) input data
+#line 3629
   *     to output
+#line 3629
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3629
   *     at next location for converted output
+#line 3629
   */
+#line 3629
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3629
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3629
+  uint64 *xp;
+#line 3629
   int nrange = 0;         /* number of range errors */
+#line 3629
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3629
   long cxp = (long) *((char**)xpp);
+#line 3629
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3629
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3629
   /* sjl: manually stripmine so we can limit amount of
+#line 3629
    * vector work space reserved to LOOPCNT elements. Also
+#line 3629
    * makes vectorisation easy */
+#line 3629
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3629
     ni=Min(nelems-j,LOOPCNT);
+#line 3629
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3629
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3629
       xp = tmp;
+#line 3629
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3629
+      xp = (uint64 *) *xpp;
+#line 3629
     }
+#line 3629
    /* copy the next block */
+#line 3629
 #pragma cdir loopcnt=LOOPCNT
+#line 3629
 #pragma cdir shortloop
+#line 3629
     for (i=0; i<ni; i++) {
+#line 3629
       tp[i] = (schar) Max( SCHAR_MIN, Min(SCHAR_MAX, (schar) xp[i]));
+#line 3629
      /* test for range errors (not always needed but do it anyway) */
+#line 3629
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3629
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3629
       nrange += xp[i] > SCHAR_MAX ;
+#line 3629
     }
+#line 3629
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3629
+    if (realign) xp = (uint64 *) *xpp;
+#line 3629
     xp += ni;
+#line 3629
     tp += ni;
+#line 3629
     *xpp = (void*)xp;
+#line 3629
   }
+#line 3629
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3629
 
+#line 3629
 #else   /* not SX */
+#line 3629
 	const char *xp = (const char *) *xpp;
+#line 3629
 	int status = NC_NOERR;
+#line 3629
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3629
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3629
 	{
+#line 3629
 		const int lstatus = ncx_get_ulonglong_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3629
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3629
 			status = lstatus;
+#line 3629
 	}
+#line 3629
 
+#line 3629
 	*xpp = (const void *)xp;
+#line 3629
 	return status;
-#  endif
+#line 3629
+#endif
+#line 3629
 }
+#line 3629
 
 int
+#line 3630
 ncx_getn_ulonglong_short(const void **xpp, size_t nelems, short *tp)
+#line 3630
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3630
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3630
 
+#line 3630
  /* basic algorithm is:
+#line 3630
   *   - ensure sane alignment of input data
+#line 3630
   *   - copy (conversion happens automatically) input data
+#line 3630
   *     to output
+#line 3630
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3630
   *     at next location for converted output
+#line 3630
   */
+#line 3630
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3630
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3630
+  uint64 *xp;
+#line 3630
   int nrange = 0;         /* number of range errors */
+#line 3630
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3630
   long cxp = (long) *((char**)xpp);
+#line 3630
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3630
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3630
   /* sjl: manually stripmine so we can limit amount of
+#line 3630
    * vector work space reserved to LOOPCNT elements. Also
+#line 3630
    * makes vectorisation easy */
+#line 3630
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3630
     ni=Min(nelems-j,LOOPCNT);
+#line 3630
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3630
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3630
       xp = tmp;
+#line 3630
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3630
+      xp = (uint64 *) *xpp;
+#line 3630
     }
+#line 3630
    /* copy the next block */
+#line 3630
 #pragma cdir loopcnt=LOOPCNT
+#line 3630
 #pragma cdir shortloop
+#line 3630
     for (i=0; i<ni; i++) {
+#line 3630
       tp[i] = (short) Max( SHORT_MIN, Min(SHORT_MAX, (short) xp[i]));
+#line 3630
      /* test for range errors (not always needed but do it anyway) */
+#line 3630
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3630
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3630
       nrange += xp[i] > SHORT_MAX ;
+#line 3630
     }
+#line 3630
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3630
+    if (realign) xp = (uint64 *) *xpp;
+#line 3630
     xp += ni;
+#line 3630
     tp += ni;
+#line 3630
     *xpp = (void*)xp;
+#line 3630
   }
+#line 3630
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3630
 
+#line 3630
 #else   /* not SX */
+#line 3630
 	const char *xp = (const char *) *xpp;
+#line 3630
 	int status = NC_NOERR;
+#line 3630
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3630
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3630
 	{
+#line 3630
 		const int lstatus = ncx_get_ulonglong_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3630
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3630
 			status = lstatus;
+#line 3630
 	}
+#line 3630
 
+#line 3630
 	*xpp = (const void *)xp;
+#line 3630
 	return status;
-#  endif
+#line 3630
+#endif
+#line 3630
 }
+#line 3630
 
 int
+#line 3631
 ncx_getn_ulonglong_int(const void **xpp, size_t nelems, int *tp)
+#line 3631
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3631
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3631
 
+#line 3631
  /* basic algorithm is:
+#line 3631
   *   - ensure sane alignment of input data
+#line 3631
   *   - copy (conversion happens automatically) input data
+#line 3631
   *     to output
+#line 3631
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3631
   *     at next location for converted output
+#line 3631
   */
+#line 3631
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3631
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3631
+  uint64 *xp;
+#line 3631
   int nrange = 0;         /* number of range errors */
+#line 3631
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3631
   long cxp = (long) *((char**)xpp);
+#line 3631
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3631
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3631
   /* sjl: manually stripmine so we can limit amount of
+#line 3631
    * vector work space reserved to LOOPCNT elements. Also
+#line 3631
    * makes vectorisation easy */
+#line 3631
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3631
     ni=Min(nelems-j,LOOPCNT);
+#line 3631
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3631
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3631
       xp = tmp;
+#line 3631
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3631
+      xp = (uint64 *) *xpp;
+#line 3631
     }
+#line 3631
    /* copy the next block */
+#line 3631
 #pragma cdir loopcnt=LOOPCNT
+#line 3631
 #pragma cdir shortloop
+#line 3631
     for (i=0; i<ni; i++) {
+#line 3631
       tp[i] = (int) Max( INT_MIN, Min(INT_MAX, (int) xp[i]));
+#line 3631
      /* test for range errors (not always needed but do it anyway) */
+#line 3631
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3631
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3631
       nrange += xp[i] > INT_MAX ;
+#line 3631
     }
+#line 3631
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3631
+    if (realign) xp = (uint64 *) *xpp;
+#line 3631
     xp += ni;
+#line 3631
     tp += ni;
+#line 3631
     *xpp = (void*)xp;
+#line 3631
   }
+#line 3631
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3631
 
+#line 3631
 #else   /* not SX */
+#line 3631
 	const char *xp = (const char *) *xpp;
+#line 3631
 	int status = NC_NOERR;
+#line 3631
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3631
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3631
 	{
+#line 3631
 		const int lstatus = ncx_get_ulonglong_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3631
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3631
+			status = lstatus;
+#line 3631
+	}
+#line 3631
+
+#line 3631
+	*xpp = (const void *)xp;
+#line 3631
+	return status;
+#line 3631
+#endif
+#line 3631
+}
+#line 3631
+
+int
+#line 3632
+ncx_getn_ulonglong_long(const void **xpp, size_t nelems, long *tp)
+#line 3632
+{
+#line 3632
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3632
+
+#line 3632
+ /* basic algorithm is:
+#line 3632
+  *   - ensure sane alignment of input data
+#line 3632
+  *   - copy (conversion happens automatically) input data
+#line 3632
+  *     to output
+#line 3632
+  *   - update xpp to point at next unconverted input, and tp to point
+#line 3632
+  *     at next location for converted output
+#line 3632
+  */
+#line 3632
+  long i, j, ni;
+#line 3632
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3632
+  uint64 *xp;
+#line 3632
+  int nrange = 0;         /* number of range errors */
+#line 3632
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3632
+  long cxp = (long) *((char**)xpp);
+#line 3632
+
+#line 3632
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3632
+  /* sjl: manually stripmine so we can limit amount of
+#line 3632
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3632
+   * makes vectorisation easy */
+#line 3632
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3632
+    ni=Min(nelems-j,LOOPCNT);
+#line 3632
+    if (realign) {
+#line 3632
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3632
+      xp = tmp;
+#line 3632
+    } else {
+#line 3632
+      xp = (uint64 *) *xpp;
+#line 3632
+    }
+#line 3632
+   /* copy the next block */
+#line 3632
+#pragma cdir loopcnt=LOOPCNT
+#line 3632
+#pragma cdir shortloop
+#line 3632
+    for (i=0; i<ni; i++) {
+#line 3632
+      tp[i] = (long) Max( LONG_MIN, Min(LONG_MAX, (long) xp[i]));
+#line 3632
+     /* test for range errors (not always needed but do it anyway) */
+#line 3632
+     /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3632
+     /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3632
+      nrange += xp[i] > LONG_MAX ;
+#line 3632
+    }
+#line 3632
+   /* update xpp and tp */
+#line 3632
+    if (realign) xp = (uint64 *) *xpp;
+#line 3632
+    xp += ni;
+#line 3632
+    tp += ni;
+#line 3632
+    *xpp = (void*)xp;
+#line 3632
+  }
+#line 3632
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3632
+
+#line 3632
+#else   /* not SX */
+#line 3632
+	const char *xp = (const char *) *xpp;
+#line 3632
+	int status = NC_NOERR;
+#line 3632
+
+#line 3632
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3632
+	{
+#line 3632
+		const int lstatus = ncx_get_ulonglong_long(xp, tp);
+#line 3632
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3632
 			status = lstatus;
+#line 3632
 	}
+#line 3632
 
+#line 3632
 	*xpp = (const void *)xp;
+#line 3632
 	return status;
-#  endif
+#line 3632
+#endif
+#line 3632
 }
+#line 3632
 
 int
+#line 3633
 ncx_getn_ulonglong_float(const void **xpp, size_t nelems, float *tp)
+#line 3633
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3633
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3633
 
+#line 3633
  /* basic algorithm is:
+#line 3633
   *   - ensure sane alignment of input data
+#line 3633
   *   - copy (conversion happens automatically) input data
+#line 3633
   *     to output
+#line 3633
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3633
   *     at next location for converted output
+#line 3633
   */
+#line 3633
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3633
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3633
+  uint64 *xp;
+#line 3633
   int nrange = 0;         /* number of range errors */
+#line 3633
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3633
   long cxp = (long) *((char**)xpp);
+#line 3633
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3633
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3633
   /* sjl: manually stripmine so we can limit amount of
+#line 3633
    * vector work space reserved to LOOPCNT elements. Also
+#line 3633
    * makes vectorisation easy */
+#line 3633
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3633
     ni=Min(nelems-j,LOOPCNT);
+#line 3633
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3633
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3633
       xp = tmp;
+#line 3633
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3633
+      xp = (uint64 *) *xpp;
+#line 3633
     }
+#line 3633
    /* copy the next block */
+#line 3633
 #pragma cdir loopcnt=LOOPCNT
+#line 3633
 #pragma cdir shortloop
+#line 3633
     for (i=0; i<ni; i++) {
+#line 3633
       tp[i] = (float) Max( FLOAT_MIN, Min(FLOAT_MAX, (float) xp[i]));
+#line 3633
      /* test for range errors (not always needed but do it anyway) */
+#line 3633
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3633
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3633
       nrange += xp[i] > FLOAT_MAX ;
+#line 3633
     }
+#line 3633
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3633
+    if (realign) xp = (uint64 *) *xpp;
+#line 3633
     xp += ni;
+#line 3633
     tp += ni;
+#line 3633
     *xpp = (void*)xp;
+#line 3633
   }
+#line 3633
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3633
 
+#line 3633
 #else   /* not SX */
+#line 3633
 	const char *xp = (const char *) *xpp;
+#line 3633
 	int status = NC_NOERR;
+#line 3633
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3633
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3633
 	{
+#line 3633
 		const int lstatus = ncx_get_ulonglong_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3633
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3633
 			status = lstatus;
+#line 3633
 	}
+#line 3633
 
+#line 3633
 	*xpp = (const void *)xp;
+#line 3633
 	return status;
-#  endif
+#line 3633
+#endif
+#line 3633
 }
+#line 3633
 
 int
+#line 3634
 ncx_getn_ulonglong_double(const void **xpp, size_t nelems, double *tp)
+#line 3634
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3634
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3634
 
+#line 3634
  /* basic algorithm is:
+#line 3634
   *   - ensure sane alignment of input data
+#line 3634
   *   - copy (conversion happens automatically) input data
+#line 3634
   *     to output
+#line 3634
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3634
   *     at next location for converted output
+#line 3634
   */
+#line 3634
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3634
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3634
+  uint64 *xp;
+#line 3634
   int nrange = 0;         /* number of range errors */
+#line 3634
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3634
   long cxp = (long) *((char**)xpp);
+#line 3634
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3634
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3634
   /* sjl: manually stripmine so we can limit amount of
+#line 3634
    * vector work space reserved to LOOPCNT elements. Also
+#line 3634
    * makes vectorisation easy */
+#line 3634
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3634
     ni=Min(nelems-j,LOOPCNT);
+#line 3634
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3634
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3634
       xp = tmp;
+#line 3634
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3634
+      xp = (uint64 *) *xpp;
+#line 3634
     }
+#line 3634
    /* copy the next block */
+#line 3634
 #pragma cdir loopcnt=LOOPCNT
+#line 3634
 #pragma cdir shortloop
+#line 3634
     for (i=0; i<ni; i++) {
+#line 3634
       tp[i] = (double) Max( DOUBLE_MIN, Min(DOUBLE_MAX, (double) xp[i]));
+#line 3634
      /* test for range errors (not always needed but do it anyway) */
+#line 3634
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3634
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3634
       nrange += xp[i] > DOUBLE_MAX ;
+#line 3634
     }
+#line 3634
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3634
+    if (realign) xp = (uint64 *) *xpp;
+#line 3634
     xp += ni;
+#line 3634
     tp += ni;
+#line 3634
     *xpp = (void*)xp;
+#line 3634
   }
+#line 3634
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3634
 
+#line 3634
 #else   /* not SX */
+#line 3634
 	const char *xp = (const char *) *xpp;
+#line 3634
 	int status = NC_NOERR;
+#line 3634
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3634
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3634
 	{
+#line 3634
 		const int lstatus = ncx_get_ulonglong_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3634
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3634
 			status = lstatus;
+#line 3634
 	}
+#line 3634
 
+#line 3634
 	*xpp = (const void *)xp;
+#line 3634
 	return status;
-#  endif
+#line 3634
+#endif
+#line 3634
 }
+#line 3634
 
 int
+#line 3635
 ncx_getn_ulonglong_longlong(const void **xpp, size_t nelems, longlong *tp)
+#line 3635
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3635
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3635
 
+#line 3635
  /* basic algorithm is:
+#line 3635
   *   - ensure sane alignment of input data
+#line 3635
   *   - copy (conversion happens automatically) input data
+#line 3635
   *     to output
+#line 3635
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3635
   *     at next location for converted output
+#line 3635
   */
+#line 3635
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3635
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3635
+  uint64 *xp;
+#line 3635
   int nrange = 0;         /* number of range errors */
+#line 3635
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3635
   long cxp = (long) *((char**)xpp);
+#line 3635
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3635
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3635
   /* sjl: manually stripmine so we can limit amount of
+#line 3635
    * vector work space reserved to LOOPCNT elements. Also
+#line 3635
    * makes vectorisation easy */
+#line 3635
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3635
     ni=Min(nelems-j,LOOPCNT);
+#line 3635
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3635
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3635
       xp = tmp;
+#line 3635
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3635
+      xp = (uint64 *) *xpp;
+#line 3635
     }
+#line 3635
    /* copy the next block */
+#line 3635
 #pragma cdir loopcnt=LOOPCNT
+#line 3635
 #pragma cdir shortloop
+#line 3635
     for (i=0; i<ni; i++) {
+#line 3635
       tp[i] = (longlong) Max( LONGLONG_MIN, Min(LONGLONG_MAX, (longlong) xp[i]));
+#line 3635
      /* test for range errors (not always needed but do it anyway) */
+#line 3635
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3635
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3635
       nrange += xp[i] > LONGLONG_MAX ;
+#line 3635
     }
+#line 3635
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3635
+    if (realign) xp = (uint64 *) *xpp;
+#line 3635
     xp += ni;
+#line 3635
     tp += ni;
+#line 3635
     *xpp = (void*)xp;
+#line 3635
   }
+#line 3635
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3635
 
+#line 3635
 #else   /* not SX */
+#line 3635
 	const char *xp = (const char *) *xpp;
+#line 3635
 	int status = NC_NOERR;
+#line 3635
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3635
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3635
 	{
+#line 3635
 		const int lstatus = ncx_get_ulonglong_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3635
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3635
 			status = lstatus;
+#line 3635
 	}
+#line 3635
 
+#line 3635
 	*xpp = (const void *)xp;
+#line 3635
 	return status;
-#  endif
+#line 3635
+#endif
+#line 3635
 }
+#line 3635
 
 int
+#line 3636
 ncx_getn_ulonglong_uchar(const void **xpp, size_t nelems, uchar *tp)
+#line 3636
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3636
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3636
 
+#line 3636
  /* basic algorithm is:
+#line 3636
   *   - ensure sane alignment of input data
+#line 3636
   *   - copy (conversion happens automatically) input data
+#line 3636
   *     to output
+#line 3636
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3636
   *     at next location for converted output
+#line 3636
   */
+#line 3636
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3636
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3636
+  uint64 *xp;
+#line 3636
   int nrange = 0;         /* number of range errors */
+#line 3636
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3636
   long cxp = (long) *((char**)xpp);
+#line 3636
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3636
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3636
   /* sjl: manually stripmine so we can limit amount of
+#line 3636
    * vector work space reserved to LOOPCNT elements. Also
+#line 3636
    * makes vectorisation easy */
+#line 3636
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3636
     ni=Min(nelems-j,LOOPCNT);
+#line 3636
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3636
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3636
       xp = tmp;
+#line 3636
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3636
+      xp = (uint64 *) *xpp;
+#line 3636
     }
+#line 3636
    /* copy the next block */
+#line 3636
 #pragma cdir loopcnt=LOOPCNT
+#line 3636
 #pragma cdir shortloop
+#line 3636
     for (i=0; i<ni; i++) {
+#line 3636
       tp[i] = (uchar) Max( UCHAR_MIN, Min(UCHAR_MAX, (uchar) xp[i]));
+#line 3636
      /* test for range errors (not always needed but do it anyway) */
+#line 3636
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3636
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3636
       nrange += xp[i] > UCHAR_MAX ;
+#line 3636
     }
+#line 3636
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3636
+    if (realign) xp = (uint64 *) *xpp;
+#line 3636
     xp += ni;
+#line 3636
     tp += ni;
+#line 3636
     *xpp = (void*)xp;
+#line 3636
   }
+#line 3636
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3636
 
+#line 3636
 #else   /* not SX */
+#line 3636
 	const char *xp = (const char *) *xpp;
+#line 3636
 	int status = NC_NOERR;
+#line 3636
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3636
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3636
 	{
+#line 3636
 		const int lstatus = ncx_get_ulonglong_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3636
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3636
 			status = lstatus;
+#line 3636
 	}
+#line 3636
 
+#line 3636
 	*xpp = (const void *)xp;
+#line 3636
 	return status;
-#  endif
+#line 3636
+#endif
+#line 3636
 }
+#line 3636
 
 int
+#line 3637
 ncx_getn_ulonglong_ushort(const void **xpp, size_t nelems, ushort *tp)
+#line 3637
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3637
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3637
 
+#line 3637
  /* basic algorithm is:
+#line 3637
   *   - ensure sane alignment of input data
+#line 3637
   *   - copy (conversion happens automatically) input data
+#line 3637
   *     to output
+#line 3637
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3637
   *     at next location for converted output
+#line 3637
   */
+#line 3637
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3637
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3637
+  uint64 *xp;
+#line 3637
   int nrange = 0;         /* number of range errors */
+#line 3637
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3637
   long cxp = (long) *((char**)xpp);
+#line 3637
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3637
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3637
   /* sjl: manually stripmine so we can limit amount of
+#line 3637
    * vector work space reserved to LOOPCNT elements. Also
+#line 3637
    * makes vectorisation easy */
+#line 3637
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3637
     ni=Min(nelems-j,LOOPCNT);
+#line 3637
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3637
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3637
       xp = tmp;
+#line 3637
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3637
+      xp = (uint64 *) *xpp;
+#line 3637
     }
+#line 3637
    /* copy the next block */
+#line 3637
 #pragma cdir loopcnt=LOOPCNT
+#line 3637
 #pragma cdir shortloop
+#line 3637
     for (i=0; i<ni; i++) {
+#line 3637
       tp[i] = (ushort) Max( USHORT_MIN, Min(USHORT_MAX, (ushort) xp[i]));
+#line 3637
      /* test for range errors (not always needed but do it anyway) */
+#line 3637
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3637
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3637
       nrange += xp[i] > USHORT_MAX ;
+#line 3637
     }
+#line 3637
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3637
+    if (realign) xp = (uint64 *) *xpp;
+#line 3637
     xp += ni;
+#line 3637
     tp += ni;
+#line 3637
     *xpp = (void*)xp;
+#line 3637
   }
+#line 3637
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3637
 
+#line 3637
 #else   /* not SX */
+#line 3637
 	const char *xp = (const char *) *xpp;
+#line 3637
 	int status = NC_NOERR;
+#line 3637
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3637
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3637
 	{
+#line 3637
 		const int lstatus = ncx_get_ulonglong_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3637
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3637
 			status = lstatus;
+#line 3637
 	}
+#line 3637
 
+#line 3637
 	*xpp = (const void *)xp;
+#line 3637
 	return status;
-#  endif
+#line 3637
+#endif
+#line 3637
 }
+#line 3637
 
 int
+#line 3638
 ncx_getn_ulonglong_uint(const void **xpp, size_t nelems, uint *tp)
+#line 3638
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3638
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3638
 
+#line 3638
  /* basic algorithm is:
+#line 3638
   *   - ensure sane alignment of input data
+#line 3638
   *   - copy (conversion happens automatically) input data
+#line 3638
   *     to output
+#line 3638
   *   - update xpp to point at next unconverted input, and tp to point
+#line 3638
   *     at next location for converted output
+#line 3638
   */
+#line 3638
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3638
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3638
+  uint64 *xp;
+#line 3638
   int nrange = 0;         /* number of range errors */
+#line 3638
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3638
   long cxp = (long) *((char**)xpp);
+#line 3638
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3638
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3638
   /* sjl: manually stripmine so we can limit amount of
+#line 3638
    * vector work space reserved to LOOPCNT elements. Also
+#line 3638
    * makes vectorisation easy */
+#line 3638
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3638
     ni=Min(nelems-j,LOOPCNT);
+#line 3638
     if (realign) {
-      memcpy(tmp, *xpp, ni*SIZEOF_ULONGLONG);
+#line 3638
+      memcpy(tmp, *xpp, (size_t)(ni*SIZEOF_UINT64));
+#line 3638
       xp = tmp;
+#line 3638
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3638
+      xp = (uint64 *) *xpp;
+#line 3638
     }
+#line 3638
    /* copy the next block */
+#line 3638
 #pragma cdir loopcnt=LOOPCNT
+#line 3638
 #pragma cdir shortloop
+#line 3638
     for (i=0; i<ni; i++) {
+#line 3638
       tp[i] = (uint) Max( UINT_MIN, Min(UINT_MAX, (uint) xp[i]));
+#line 3638
      /* test for range errors (not always needed but do it anyway) */
+#line 3638
      /* if xpp is unsigned, we need not check if xp[i] < _MIN */
+#line 3638
      /* if xpp is signed && tp is unsigned, we need check if xp[i] >= 0 */
+#line 3638
       nrange += xp[i] > UINT_MAX ;
+#line 3638
     }
+#line 3638
    /* update xpp and tp */
-    if (realign) xp = (ulonglong *) *xpp;
+#line 3638
+    if (realign) xp = (uint64 *) *xpp;
+#line 3638
     xp += ni;
+#line 3638
     tp += ni;
+#line 3638
     *xpp = (void*)xp;
+#line 3638
   }
+#line 3638
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3638
 
+#line 3638
 #else   /* not SX */
+#line 3638
 	const char *xp = (const char *) *xpp;
+#line 3638
 	int status = NC_NOERR;
+#line 3638
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3638
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3638
 	{
+#line 3638
 		const int lstatus = ncx_get_ulonglong_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3638
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3638
 			status = lstatus;
+#line 3638
 	}
+#line 3638
 
+#line 3638
 	*xpp = (const void *)xp;
+#line 3638
 	return status;
-#  endif
+#line 3638
+#endif
+#line 3638
 }
+#line 3638
 
 
-#if X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#if X_SIZEOF_UINT64 == SIZEOF_ULONGLONG
 /* optimized version */
 int
-ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const unsigned long long *tp)
+ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const unsigned long long *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_ULONGLONG);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_UINT64);
 # else
 	swapn8b(*xpp, tp, nelems);
 # endif
-	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_ULONGLONG);
+	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_UINT64);
 	return NC_NOERR;
 }
 #else
 int
-ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const ulonglong *tp)
+#line 3654
+ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const ulonglong *tp, void *fillp)
+#line 3654
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3654
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3654
 
+#line 3654
  /* basic algorithm is:
+#line 3654
   *   - ensure sane alignment of output data
+#line 3654
   *   - copy (conversion happens automatically) input data
+#line 3654
   *     to output
+#line 3654
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3654
   *     at next location for converted output
+#line 3654
   */
+#line 3654
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3654
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3654
+  uint64 *xp;
+#line 3654
   int nrange = 0;         /* number of range errors */
+#line 3654
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3654
   long cxp = (long) *((char**)xpp);
+#line 3654
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3654
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3654
   /* sjl: manually stripmine so we can limit amount of
+#line 3654
    * vector work space reserved to LOOPCNT elements. Also
+#line 3654
    * makes vectorisation easy */
+#line 3654
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3654
     ni=Min(nelems-j,LOOPCNT);
+#line 3654
     if (realign) {
+#line 3654
       xp = tmp;
+#line 3654
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3654
+      xp = (uint64 *) *xpp;
+#line 3654
     }
+#line 3654
    /* copy the next block */
+#line 3654
 #pragma cdir loopcnt=LOOPCNT
+#line 3654
 #pragma cdir shortloop
+#line 3654
     for (i=0; i<ni; i++) {
+#line 3654
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3654
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3654
      /* test for range errors (not always needed but do it anyway) */
+#line 3654
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3654
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX ;
+#line 3654
+      nrange += tp[i] > X_UINT64_MAX ;
+#line 3654
     }
+#line 3654
    /* copy workspace back if necessary */
+#line 3654
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3654
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3654
+      xp = (uint64 *) *xpp;
+#line 3654
     }
+#line 3654
    /* update xpp and tp */
+#line 3654
     xp += ni;
+#line 3654
     tp += ni;
+#line 3654
     *xpp = (void*)xp;
+#line 3654
   }
+#line 3654
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3654
 
+#line 3654
 #else   /* not SX */
+#line 3654
 
+#line 3654
 	char *xp = (char *) *xpp;
+#line 3654
 	int status = NC_NOERR;
+#line 3654
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3654
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3654
 	{
-		int lstatus = ncx_put_ulonglong_ulonglong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3654
+		int lstatus = ncx_put_ulonglong_ulonglong(xp, tp, fillp);
+#line 3654
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3654
 			status = lstatus;
+#line 3654
 	}
+#line 3654
 
+#line 3654
 	*xpp = (void *)xp;
+#line 3654
 	return status;
+#line 3654
 #endif
+#line 3654
 }
+#line 3654
+
+#endif
+int
+#line 3656
+ncx_putn_ulonglong_schar(void **xpp, size_t nelems, const schar *tp, void *fillp)
+#line 3656
+{
+#line 3656
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3656
+
+#line 3656
+ /* basic algorithm is:
+#line 3656
+  *   - ensure sane alignment of output data
+#line 3656
+  *   - copy (conversion happens automatically) input data
+#line 3656
+  *     to output
+#line 3656
+  *   - update tp to point at next unconverted input, and xpp to point
+#line 3656
+  *     at next location for converted output
+#line 3656
+  */
+#line 3656
+  long i, j, ni;
+#line 3656
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3656
+  uint64 *xp;
+#line 3656
+  int nrange = 0;         /* number of range errors */
+#line 3656
+  int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3656
+  long cxp = (long) *((char**)xpp);
+#line 3656
+
+#line 3656
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3656
+  /* sjl: manually stripmine so we can limit amount of
+#line 3656
+   * vector work space reserved to LOOPCNT elements. Also
+#line 3656
+   * makes vectorisation easy */
+#line 3656
+  for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3656
+    ni=Min(nelems-j,LOOPCNT);
+#line 3656
+    if (realign) {
+#line 3656
+      xp = tmp;
+#line 3656
+    } else {
+#line 3656
+      xp = (uint64 *) *xpp;
+#line 3656
+    }
+#line 3656
+   /* copy the next block */
+#line 3656
+#pragma cdir loopcnt=LOOPCNT
+#line 3656
+#pragma cdir shortloop
+#line 3656
+    for (i=0; i<ni; i++) {
+#line 3656
+      /* the normal case: */
+#line 3656
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3656
+     /* test for range errors (not always needed but do it anyway) */
+#line 3656
+     /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3656
+     /* if tp is unsigned, we need not check if tp[i] < X__MIN */
+#line 3656
+      nrange += tp[i] > X_UINT64_MAX || tp[i] < 0;
+#line 3656
+    }
+#line 3656
+   /* copy workspace back if necessary */
+#line 3656
+    if (realign) {
+#line 3656
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3656
+      xp = (uint64 *) *xpp;
+#line 3656
+    }
+#line 3656
+   /* update xpp and tp */
+#line 3656
+    xp += ni;
+#line 3656
+    tp += ni;
+#line 3656
+    *xpp = (void*)xp;
+#line 3656
+  }
+#line 3656
+  return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3656
+
+#line 3656
+#else   /* not SX */
+#line 3656
+
+#line 3656
+	char *xp = (char *) *xpp;
+#line 3656
+	int status = NC_NOERR;
+#line 3656
+
+#line 3656
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3656
+	{
+#line 3656
+		int lstatus = ncx_put_ulonglong_schar(xp, tp, fillp);
+#line 3656
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3656
+			status = lstatus;
+#line 3656
+	}
+#line 3656
 
+#line 3656
+	*xpp = (void *)xp;
+#line 3656
+	return status;
+#line 3656
 #endif
+#line 3656
+}
+#line 3656
+
 int
-ncx_putn_ulonglong_schar(void **xpp, size_t nelems, const schar *tp)
+#line 3657
+ncx_putn_ulonglong_short(void **xpp, size_t nelems, const short *tp, void *fillp)
+#line 3657
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3657
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3657
 
+#line 3657
  /* basic algorithm is:
+#line 3657
   *   - ensure sane alignment of output data
+#line 3657
   *   - copy (conversion happens automatically) input data
+#line 3657
   *     to output
+#line 3657
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3657
   *     at next location for converted output
+#line 3657
   */
+#line 3657
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3657
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3657
+  uint64 *xp;
+#line 3657
   int nrange = 0;         /* number of range errors */
+#line 3657
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3657
   long cxp = (long) *((char**)xpp);
+#line 3657
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3657
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3657
   /* sjl: manually stripmine so we can limit amount of
+#line 3657
    * vector work space reserved to LOOPCNT elements. Also
+#line 3657
    * makes vectorisation easy */
+#line 3657
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3657
     ni=Min(nelems-j,LOOPCNT);
+#line 3657
     if (realign) {
+#line 3657
       xp = tmp;
+#line 3657
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3657
+      xp = (uint64 *) *xpp;
+#line 3657
     }
+#line 3657
    /* copy the next block */
+#line 3657
 #pragma cdir loopcnt=LOOPCNT
+#line 3657
 #pragma cdir shortloop
+#line 3657
     for (i=0; i<ni; i++) {
+#line 3657
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3657
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3657
      /* test for range errors (not always needed but do it anyway) */
+#line 3657
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3657
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX || tp[i] < 0;
+#line 3657
+      nrange += tp[i] > X_UINT64_MAX || tp[i] < 0;
+#line 3657
     }
+#line 3657
    /* copy workspace back if necessary */
+#line 3657
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3657
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3657
+      xp = (uint64 *) *xpp;
+#line 3657
     }
+#line 3657
    /* update xpp and tp */
+#line 3657
     xp += ni;
+#line 3657
     tp += ni;
+#line 3657
     *xpp = (void*)xp;
+#line 3657
   }
+#line 3657
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3657
 
+#line 3657
 #else   /* not SX */
+#line 3657
 
+#line 3657
 	char *xp = (char *) *xpp;
+#line 3657
 	int status = NC_NOERR;
+#line 3657
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3657
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3657
 	{
-		int lstatus = ncx_put_ulonglong_schar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3657
+		int lstatus = ncx_put_ulonglong_short(xp, tp, fillp);
+#line 3657
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3657
 			status = lstatus;
+#line 3657
 	}
+#line 3657
 
+#line 3657
 	*xpp = (void *)xp;
+#line 3657
 	return status;
+#line 3657
 #endif
+#line 3657
 }
+#line 3657
 
 int
-ncx_putn_ulonglong_short(void **xpp, size_t nelems, const short *tp)
+#line 3658
+ncx_putn_ulonglong_int(void **xpp, size_t nelems, const int *tp, void *fillp)
+#line 3658
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3658
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3658
 
+#line 3658
  /* basic algorithm is:
+#line 3658
   *   - ensure sane alignment of output data
+#line 3658
   *   - copy (conversion happens automatically) input data
+#line 3658
   *     to output
+#line 3658
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3658
   *     at next location for converted output
+#line 3658
   */
+#line 3658
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3658
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3658
+  uint64 *xp;
+#line 3658
   int nrange = 0;         /* number of range errors */
+#line 3658
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3658
   long cxp = (long) *((char**)xpp);
+#line 3658
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3658
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3658
   /* sjl: manually stripmine so we can limit amount of
+#line 3658
    * vector work space reserved to LOOPCNT elements. Also
+#line 3658
    * makes vectorisation easy */
+#line 3658
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3658
     ni=Min(nelems-j,LOOPCNT);
+#line 3658
     if (realign) {
+#line 3658
       xp = tmp;
+#line 3658
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3658
+      xp = (uint64 *) *xpp;
+#line 3658
     }
+#line 3658
    /* copy the next block */
+#line 3658
 #pragma cdir loopcnt=LOOPCNT
+#line 3658
 #pragma cdir shortloop
+#line 3658
     for (i=0; i<ni; i++) {
+#line 3658
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3658
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3658
      /* test for range errors (not always needed but do it anyway) */
+#line 3658
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3658
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX || tp[i] < 0;
+#line 3658
+      nrange += tp[i] > X_UINT64_MAX || tp[i] < 0;
+#line 3658
     }
+#line 3658
    /* copy workspace back if necessary */
+#line 3658
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3658
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3658
+      xp = (uint64 *) *xpp;
+#line 3658
     }
+#line 3658
    /* update xpp and tp */
+#line 3658
     xp += ni;
+#line 3658
     tp += ni;
+#line 3658
     *xpp = (void*)xp;
+#line 3658
   }
+#line 3658
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3658
 
+#line 3658
 #else   /* not SX */
+#line 3658
 
+#line 3658
 	char *xp = (char *) *xpp;
+#line 3658
 	int status = NC_NOERR;
+#line 3658
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3658
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3658
 	{
-		int lstatus = ncx_put_ulonglong_short(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3658
+		int lstatus = ncx_put_ulonglong_int(xp, tp, fillp);
+#line 3658
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3658
 			status = lstatus;
+#line 3658
 	}
+#line 3658
 
+#line 3658
 	*xpp = (void *)xp;
+#line 3658
 	return status;
+#line 3658
 #endif
+#line 3658
 }
+#line 3658
 
 int
-ncx_putn_ulonglong_int(void **xpp, size_t nelems, const int *tp)
+#line 3659
+ncx_putn_ulonglong_long(void **xpp, size_t nelems, const long *tp, void *fillp)
+#line 3659
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3659
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3659
 
+#line 3659
  /* basic algorithm is:
+#line 3659
   *   - ensure sane alignment of output data
+#line 3659
   *   - copy (conversion happens automatically) input data
+#line 3659
   *     to output
+#line 3659
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3659
   *     at next location for converted output
+#line 3659
   */
+#line 3659
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3659
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3659
+  uint64 *xp;
+#line 3659
   int nrange = 0;         /* number of range errors */
+#line 3659
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3659
   long cxp = (long) *((char**)xpp);
+#line 3659
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3659
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3659
   /* sjl: manually stripmine so we can limit amount of
+#line 3659
    * vector work space reserved to LOOPCNT elements. Also
+#line 3659
    * makes vectorisation easy */
+#line 3659
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3659
     ni=Min(nelems-j,LOOPCNT);
+#line 3659
     if (realign) {
+#line 3659
       xp = tmp;
+#line 3659
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3659
+      xp = (uint64 *) *xpp;
+#line 3659
     }
+#line 3659
    /* copy the next block */
+#line 3659
 #pragma cdir loopcnt=LOOPCNT
+#line 3659
 #pragma cdir shortloop
+#line 3659
     for (i=0; i<ni; i++) {
+#line 3659
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3659
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3659
      /* test for range errors (not always needed but do it anyway) */
+#line 3659
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3659
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX || tp[i] < 0;
+#line 3659
+      nrange += tp[i] > X_UINT64_MAX || tp[i] < 0;
+#line 3659
     }
+#line 3659
    /* copy workspace back if necessary */
+#line 3659
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3659
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3659
+      xp = (uint64 *) *xpp;
+#line 3659
     }
+#line 3659
    /* update xpp and tp */
+#line 3659
     xp += ni;
+#line 3659
     tp += ni;
+#line 3659
     *xpp = (void*)xp;
+#line 3659
   }
+#line 3659
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3659
 
+#line 3659
 #else   /* not SX */
+#line 3659
 
+#line 3659
 	char *xp = (char *) *xpp;
+#line 3659
 	int status = NC_NOERR;
+#line 3659
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3659
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3659
 	{
-		int lstatus = ncx_put_ulonglong_int(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3659
+		int lstatus = ncx_put_ulonglong_long(xp, tp, fillp);
+#line 3659
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3659
 			status = lstatus;
+#line 3659
 	}
+#line 3659
 
+#line 3659
 	*xpp = (void *)xp;
+#line 3659
 	return status;
+#line 3659
 #endif
+#line 3659
 }
+#line 3659
 
 int
-ncx_putn_ulonglong_float(void **xpp, size_t nelems, const float *tp)
+#line 3660
+ncx_putn_ulonglong_float(void **xpp, size_t nelems, const float *tp, void *fillp)
+#line 3660
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3660
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3660
 
+#line 3660
  /* basic algorithm is:
+#line 3660
   *   - ensure sane alignment of output data
+#line 3660
   *   - copy (conversion happens automatically) input data
+#line 3660
   *     to output
+#line 3660
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3660
   *     at next location for converted output
+#line 3660
   */
+#line 3660
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3660
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3660
+  uint64 *xp;
+#line 3660
   int nrange = 0;         /* number of range errors */
+#line 3660
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3660
   long cxp = (long) *((char**)xpp);
+#line 3660
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3660
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3660
   /* sjl: manually stripmine so we can limit amount of
+#line 3660
    * vector work space reserved to LOOPCNT elements. Also
+#line 3660
    * makes vectorisation easy */
+#line 3660
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3660
     ni=Min(nelems-j,LOOPCNT);
+#line 3660
     if (realign) {
+#line 3660
       xp = tmp;
+#line 3660
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3660
+      xp = (uint64 *) *xpp;
+#line 3660
     }
+#line 3660
    /* copy the next block */
+#line 3660
 #pragma cdir loopcnt=LOOPCNT
+#line 3660
 #pragma cdir shortloop
+#line 3660
     for (i=0; i<ni; i++) {
+#line 3660
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3660
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3660
      /* test for range errors (not always needed but do it anyway) */
+#line 3660
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3660
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX || tp[i] < 0;
+#line 3660
+      nrange += tp[i] > X_UINT64_MAX || tp[i] < 0;
+#line 3660
     }
+#line 3660
    /* copy workspace back if necessary */
+#line 3660
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3660
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3660
+      xp = (uint64 *) *xpp;
+#line 3660
     }
+#line 3660
    /* update xpp and tp */
+#line 3660
     xp += ni;
+#line 3660
     tp += ni;
+#line 3660
     *xpp = (void*)xp;
+#line 3660
   }
+#line 3660
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3660
 
+#line 3660
 #else   /* not SX */
+#line 3660
 
+#line 3660
 	char *xp = (char *) *xpp;
+#line 3660
 	int status = NC_NOERR;
+#line 3660
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3660
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3660
 	{
-		int lstatus = ncx_put_ulonglong_float(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3660
+		int lstatus = ncx_put_ulonglong_float(xp, tp, fillp);
+#line 3660
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3660
 			status = lstatus;
+#line 3660
 	}
+#line 3660
 
+#line 3660
 	*xpp = (void *)xp;
+#line 3660
 	return status;
+#line 3660
 #endif
+#line 3660
 }
+#line 3660
 
 int
-ncx_putn_ulonglong_double(void **xpp, size_t nelems, const double *tp)
+#line 3661
+ncx_putn_ulonglong_double(void **xpp, size_t nelems, const double *tp, void *fillp)
+#line 3661
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3661
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3661
 
+#line 3661
  /* basic algorithm is:
+#line 3661
   *   - ensure sane alignment of output data
+#line 3661
   *   - copy (conversion happens automatically) input data
+#line 3661
   *     to output
+#line 3661
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3661
   *     at next location for converted output
+#line 3661
   */
+#line 3661
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3661
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3661
+  uint64 *xp;
+#line 3661
   int nrange = 0;         /* number of range errors */
+#line 3661
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3661
   long cxp = (long) *((char**)xpp);
+#line 3661
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3661
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3661
   /* sjl: manually stripmine so we can limit amount of
+#line 3661
    * vector work space reserved to LOOPCNT elements. Also
+#line 3661
    * makes vectorisation easy */
+#line 3661
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3661
     ni=Min(nelems-j,LOOPCNT);
+#line 3661
     if (realign) {
+#line 3661
       xp = tmp;
+#line 3661
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3661
+      xp = (uint64 *) *xpp;
+#line 3661
     }
+#line 3661
    /* copy the next block */
+#line 3661
 #pragma cdir loopcnt=LOOPCNT
+#line 3661
 #pragma cdir shortloop
+#line 3661
     for (i=0; i<ni; i++) {
+#line 3661
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3661
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3661
      /* test for range errors (not always needed but do it anyway) */
+#line 3661
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3661
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX || tp[i] < 0;
+#line 3661
+      nrange += tp[i] > X_UINT64_MAX || tp[i] < 0;
+#line 3661
     }
+#line 3661
    /* copy workspace back if necessary */
+#line 3661
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3661
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3661
+      xp = (uint64 *) *xpp;
+#line 3661
     }
+#line 3661
    /* update xpp and tp */
+#line 3661
     xp += ni;
+#line 3661
     tp += ni;
+#line 3661
     *xpp = (void*)xp;
+#line 3661
   }
+#line 3661
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3661
 
+#line 3661
 #else   /* not SX */
+#line 3661
 
+#line 3661
 	char *xp = (char *) *xpp;
+#line 3661
 	int status = NC_NOERR;
+#line 3661
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3661
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3661
 	{
-		int lstatus = ncx_put_ulonglong_double(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3661
+		int lstatus = ncx_put_ulonglong_double(xp, tp, fillp);
+#line 3661
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3661
 			status = lstatus;
+#line 3661
 	}
+#line 3661
 
+#line 3661
 	*xpp = (void *)xp;
+#line 3661
 	return status;
+#line 3661
 #endif
+#line 3661
 }
+#line 3661
 
 int
-ncx_putn_ulonglong_longlong(void **xpp, size_t nelems, const longlong *tp)
+#line 3662
+ncx_putn_ulonglong_longlong(void **xpp, size_t nelems, const longlong *tp, void *fillp)
+#line 3662
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3662
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3662
 
+#line 3662
  /* basic algorithm is:
+#line 3662
   *   - ensure sane alignment of output data
+#line 3662
   *   - copy (conversion happens automatically) input data
+#line 3662
   *     to output
+#line 3662
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3662
   *     at next location for converted output
+#line 3662
   */
+#line 3662
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3662
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3662
+  uint64 *xp;
+#line 3662
   int nrange = 0;         /* number of range errors */
+#line 3662
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3662
   long cxp = (long) *((char**)xpp);
+#line 3662
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3662
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3662
   /* sjl: manually stripmine so we can limit amount of
+#line 3662
    * vector work space reserved to LOOPCNT elements. Also
+#line 3662
    * makes vectorisation easy */
+#line 3662
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3662
     ni=Min(nelems-j,LOOPCNT);
+#line 3662
     if (realign) {
+#line 3662
       xp = tmp;
+#line 3662
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3662
+      xp = (uint64 *) *xpp;
+#line 3662
     }
+#line 3662
    /* copy the next block */
+#line 3662
 #pragma cdir loopcnt=LOOPCNT
+#line 3662
 #pragma cdir shortloop
+#line 3662
     for (i=0; i<ni; i++) {
+#line 3662
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3662
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3662
      /* test for range errors (not always needed but do it anyway) */
+#line 3662
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3662
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX || tp[i] < 0;
+#line 3662
+      nrange += tp[i] > X_UINT64_MAX || tp[i] < 0;
+#line 3662
     }
+#line 3662
    /* copy workspace back if necessary */
+#line 3662
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3662
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3662
+      xp = (uint64 *) *xpp;
+#line 3662
     }
+#line 3662
    /* update xpp and tp */
+#line 3662
     xp += ni;
+#line 3662
     tp += ni;
+#line 3662
     *xpp = (void*)xp;
+#line 3662
   }
+#line 3662
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3662
 
+#line 3662
 #else   /* not SX */
+#line 3662
 
+#line 3662
 	char *xp = (char *) *xpp;
+#line 3662
 	int status = NC_NOERR;
+#line 3662
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3662
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3662
 	{
-		int lstatus = ncx_put_ulonglong_longlong(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3662
+		int lstatus = ncx_put_ulonglong_longlong(xp, tp, fillp);
+#line 3662
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3662
 			status = lstatus;
+#line 3662
 	}
+#line 3662
 
+#line 3662
 	*xpp = (void *)xp;
+#line 3662
 	return status;
+#line 3662
 #endif
+#line 3662
 }
+#line 3662
 
 int
-ncx_putn_ulonglong_uchar(void **xpp, size_t nelems, const uchar *tp)
+#line 3663
+ncx_putn_ulonglong_uchar(void **xpp, size_t nelems, const uchar *tp, void *fillp)
+#line 3663
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3663
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3663
 
+#line 3663
  /* basic algorithm is:
+#line 3663
   *   - ensure sane alignment of output data
+#line 3663
   *   - copy (conversion happens automatically) input data
+#line 3663
   *     to output
+#line 3663
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3663
   *     at next location for converted output
+#line 3663
   */
+#line 3663
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3663
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3663
+  uint64 *xp;
+#line 3663
   int nrange = 0;         /* number of range errors */
+#line 3663
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3663
   long cxp = (long) *((char**)xpp);
+#line 3663
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3663
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3663
   /* sjl: manually stripmine so we can limit amount of
+#line 3663
    * vector work space reserved to LOOPCNT elements. Also
+#line 3663
    * makes vectorisation easy */
+#line 3663
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3663
     ni=Min(nelems-j,LOOPCNT);
+#line 3663
     if (realign) {
+#line 3663
       xp = tmp;
+#line 3663
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3663
+      xp = (uint64 *) *xpp;
+#line 3663
     }
+#line 3663
    /* copy the next block */
+#line 3663
 #pragma cdir loopcnt=LOOPCNT
+#line 3663
 #pragma cdir shortloop
+#line 3663
     for (i=0; i<ni; i++) {
+#line 3663
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3663
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3663
      /* test for range errors (not always needed but do it anyway) */
+#line 3663
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3663
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX ;
+#line 3663
+      nrange += tp[i] > X_UINT64_MAX ;
+#line 3663
     }
+#line 3663
    /* copy workspace back if necessary */
+#line 3663
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3663
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3663
+      xp = (uint64 *) *xpp;
+#line 3663
     }
+#line 3663
    /* update xpp and tp */
+#line 3663
     xp += ni;
+#line 3663
     tp += ni;
+#line 3663
     *xpp = (void*)xp;
+#line 3663
   }
+#line 3663
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3663
 
+#line 3663
 #else   /* not SX */
+#line 3663
 
+#line 3663
 	char *xp = (char *) *xpp;
+#line 3663
 	int status = NC_NOERR;
+#line 3663
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3663
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3663
 	{
-		int lstatus = ncx_put_ulonglong_uchar(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3663
+		int lstatus = ncx_put_ulonglong_uchar(xp, tp, fillp);
+#line 3663
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3663
 			status = lstatus;
+#line 3663
 	}
+#line 3663
 
+#line 3663
 	*xpp = (void *)xp;
+#line 3663
 	return status;
+#line 3663
 #endif
+#line 3663
 }
+#line 3663
 
 int
-ncx_putn_ulonglong_ushort(void **xpp, size_t nelems, const ushort *tp)
+#line 3664
+ncx_putn_ulonglong_ushort(void **xpp, size_t nelems, const ushort *tp, void *fillp)
+#line 3664
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3664
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3664
 
+#line 3664
  /* basic algorithm is:
+#line 3664
   *   - ensure sane alignment of output data
+#line 3664
   *   - copy (conversion happens automatically) input data
+#line 3664
   *     to output
+#line 3664
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3664
   *     at next location for converted output
+#line 3664
   */
+#line 3664
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3664
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3664
+  uint64 *xp;
+#line 3664
   int nrange = 0;         /* number of range errors */
+#line 3664
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3664
   long cxp = (long) *((char**)xpp);
+#line 3664
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3664
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3664
   /* sjl: manually stripmine so we can limit amount of
+#line 3664
    * vector work space reserved to LOOPCNT elements. Also
+#line 3664
    * makes vectorisation easy */
+#line 3664
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3664
     ni=Min(nelems-j,LOOPCNT);
+#line 3664
     if (realign) {
+#line 3664
       xp = tmp;
+#line 3664
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3664
+      xp = (uint64 *) *xpp;
+#line 3664
     }
+#line 3664
    /* copy the next block */
+#line 3664
 #pragma cdir loopcnt=LOOPCNT
+#line 3664
 #pragma cdir shortloop
+#line 3664
     for (i=0; i<ni; i++) {
+#line 3664
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3664
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3664
      /* test for range errors (not always needed but do it anyway) */
+#line 3664
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3664
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX ;
+#line 3664
+      nrange += tp[i] > X_UINT64_MAX ;
+#line 3664
     }
+#line 3664
    /* copy workspace back if necessary */
+#line 3664
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3664
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3664
+      xp = (uint64 *) *xpp;
+#line 3664
     }
+#line 3664
    /* update xpp and tp */
+#line 3664
     xp += ni;
+#line 3664
     tp += ni;
+#line 3664
     *xpp = (void*)xp;
+#line 3664
   }
+#line 3664
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3664
 
+#line 3664
 #else   /* not SX */
+#line 3664
 
+#line 3664
 	char *xp = (char *) *xpp;
+#line 3664
 	int status = NC_NOERR;
+#line 3664
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3664
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3664
 	{
-		int lstatus = ncx_put_ulonglong_ushort(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3664
+		int lstatus = ncx_put_ulonglong_ushort(xp, tp, fillp);
+#line 3664
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3664
 			status = lstatus;
+#line 3664
 	}
+#line 3664
 
+#line 3664
 	*xpp = (void *)xp;
+#line 3664
 	return status;
+#line 3664
 #endif
+#line 3664
 }
+#line 3664
 
 int
-ncx_putn_ulonglong_uint(void **xpp, size_t nelems, const uint *tp)
+#line 3665
+ncx_putn_ulonglong_uint(void **xpp, size_t nelems, const uint *tp, void *fillp)
+#line 3665
 {
-#if _SX && X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+#line 3665
+#if defined(_SX) && _SX != 0 && X_SIZEOF_UINT64 == SIZEOF_UINT64
+#line 3665
 
+#line 3665
  /* basic algorithm is:
+#line 3665
   *   - ensure sane alignment of output data
+#line 3665
   *   - copy (conversion happens automatically) input data
+#line 3665
   *     to output
+#line 3665
   *   - update tp to point at next unconverted input, and xpp to point
+#line 3665
   *     at next location for converted output
+#line 3665
   */
+#line 3665
   long i, j, ni;
-  ulonglong tmp[LOOPCNT];        /* in case input is misaligned */
-  ulonglong *xp;
+#line 3665
+  uint64 tmp[LOOPCNT];        /* in case input is misaligned */
+#line 3665
+  uint64 *xp;
+#line 3665
   int nrange = 0;         /* number of range errors */
+#line 3665
   int realign = 0;        /* "do we need to fix input data alignment?" */
+#line 3665
   long cxp = (long) *((char**)xpp);
+#line 3665
 
-  realign = (cxp & 7) % SIZEOF_ULONGLONG;
+#line 3665
+  realign = (cxp & 7) % SIZEOF_UINT64;
+#line 3665
   /* sjl: manually stripmine so we can limit amount of
+#line 3665
    * vector work space reserved to LOOPCNT elements. Also
+#line 3665
    * makes vectorisation easy */
+#line 3665
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
+#line 3665
     ni=Min(nelems-j,LOOPCNT);
+#line 3665
     if (realign) {
+#line 3665
       xp = tmp;
+#line 3665
     } else {
-      xp = (ulonglong *) *xpp;
+#line 3665
+      xp = (uint64 *) *xpp;
+#line 3665
     }
+#line 3665
    /* copy the next block */
+#line 3665
 #pragma cdir loopcnt=LOOPCNT
+#line 3665
 #pragma cdir shortloop
+#line 3665
     for (i=0; i<ni; i++) {
+#line 3665
       /* the normal case: */
-      xp[i] = (ulonglong) Max( X_ULONGLONG_MIN, Min(X_ULONGLONG_MAX, (ulonglong) tp[i]));
+#line 3665
+      xp[i] = (uint64) Max( X_UINT64_MIN, Min(X_UINT64_MAX, (uint64) tp[i]));
+#line 3665
      /* test for range errors (not always needed but do it anyway) */
+#line 3665
      /* if xpp is unsigned && tp is signed, we need check if tp[i] >= 0 */
+#line 3665
      /* if tp is unsigned, we need not check if tp[i] < X__MIN */
-      nrange += tp[i] > X_ULONGLONG_MAX ;
+#line 3665
+      nrange += tp[i] > X_UINT64_MAX ;
+#line 3665
     }
+#line 3665
    /* copy workspace back if necessary */
+#line 3665
     if (realign) {
-      memcpy(*xpp, tmp, ni*X_SIZEOF_ULONGLONG);
-      xp = (ulonglong *) *xpp;
+#line 3665
+      memcpy(*xpp, tmp, (size_t)*ni*X_SIZEOF_UINT64);
+#line 3665
+      xp = (uint64 *) *xpp;
+#line 3665
     }
+#line 3665
    /* update xpp and tp */
+#line 3665
     xp += ni;
+#line 3665
     tp += ni;
+#line 3665
     *xpp = (void*)xp;
+#line 3665
   }
+#line 3665
   return nrange == 0 ? NC_NOERR : NC_ERANGE;
+#line 3665
 
+#line 3665
 #else   /* not SX */
+#line 3665
 
+#line 3665
 	char *xp = (char *) *xpp;
+#line 3665
 	int status = NC_NOERR;
+#line 3665
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_ULONGLONG, tp++)
+#line 3665
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_UINT64, tp++)
+#line 3665
 	{
-		int lstatus = ncx_put_ulonglong_uint(xp, tp);
-		if(lstatus != NC_NOERR)
+#line 3665
+		int lstatus = ncx_put_ulonglong_uint(xp, tp, fillp);
+#line 3665
+		if (status == NC_NOERR) /* report the first encountered error */
+#line 3665
 			status = lstatus;
+#line 3665
 	}
+#line 3665
 
+#line 3665
 	*xpp = (void *)xp;
+#line 3665
 	return status;
+#line 3665
 #endif
+#line 3665
 }
+#line 3665
 
 
 
@@ -17229,77 +37257,90 @@ ncx_putn_ulonglong_uint(void **xpp, size_t nelems, const uint *tp)
  */
 
 /* text */
-#ifdef __arm__
-int
-ncx_getn_text(const void **xpp, size_t nelems, signed char *tp)
-#else
+
 int
 ncx_getn_text(const void **xpp, size_t nelems, char *tp)
-#endif
 {
-	(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((schar *)(*xpp) + nelems);
+	(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 3677
+	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 3677
 	return NC_NOERR;
+#line 3677
 
 }
 
-#ifdef __arm__
-int
-ncx_pad_getn_text(const void **xpp, size_t nelems, signed char *tp)
-#else
 int
 ncx_pad_getn_text(const void **xpp, size_t nelems, char *tp)
-#endif
 {
 	size_t rndup = nelems % X_ALIGN;
+#line 3683
 
-	if(rndup)
+#line 3683
+	if (rndup)
+#line 3683
 		rndup = X_ALIGN - rndup;
+#line 3683
 
-	(void) memcpy(tp, *xpp, nelems);
+#line 3683
+	(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 3683
 	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
+#line 3683
 
+#line 3683
 	return NC_NOERR;
+#line 3683
 
 }
 
-#ifdef __arm__
-int ncx_putn_text(void **xpp, size_t nelems, const signed char *tp)
-#else
 int
 ncx_putn_text(void **xpp, size_t nelems, const char *tp)
-#endif
 {
-	(void) memcpy(*xpp, tp, nelems);
+	(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 3689
 	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 3689
 
+#line 3689
 	return NC_NOERR;
+#line 3689
 
 }
 
-#ifdef __arm__
-int
-ncx_pad_putn_text(void **xpp, size_t nelems, const signed char *tp)
-#else
 int
 ncx_pad_putn_text(void **xpp, size_t nelems, const char *tp)
-#endif
 {
 	size_t rndup = nelems % X_ALIGN;
+#line 3695
 
-	if(rndup)
+#line 3695
+	if (rndup)
+#line 3695
 		rndup = X_ALIGN - rndup;
+#line 3695
 
-	(void) memcpy(*xpp, tp, nelems);
+#line 3695
+	(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 3695
 	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 3695
 
-	if(rndup)
+#line 3695
+	if (rndup)
+#line 3695
 	{
-		(void) memcpy(*xpp, nada, rndup);
+#line 3695
+		(void) memcpy(*xpp, nada, (size_t)rndup);
+#line 3695
 		*xpp = (void *)((char *)(*xpp) + rndup);
+#line 3695
 	}
+#line 3695
 
+#line 3695
 	return NC_NOERR;
+#line 3695
 
 }
 
@@ -17309,9 +37350,12 @@ ncx_pad_putn_text(void **xpp, size_t nelems, const char *tp)
 int
 ncx_getn_void(const void **xpp, size_t nelems, void *tp)
 {
-	(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((schar *)(*xpp) + nelems);
+	(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 3704
+	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 3704
 	return NC_NOERR;
+#line 3704
 
 }
 
@@ -17319,24 +37363,37 @@ int
 ncx_pad_getn_void(const void **xpp, size_t nelems, void *tp)
 {
 	size_t rndup = nelems % X_ALIGN;
+#line 3710
 
-	if(rndup)
+#line 3710
+	if (rndup)
+#line 3710
 		rndup = X_ALIGN - rndup;
+#line 3710
 
-	(void) memcpy(tp, *xpp, nelems);
+#line 3710
+	(void) memcpy(tp, *xpp, (size_t)nelems);
+#line 3710
 	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
+#line 3710
 
+#line 3710
 	return NC_NOERR;
+#line 3710
 
 }
 
 int
 ncx_putn_void(void **xpp, size_t nelems, const void *tp)
 {
-	(void) memcpy(*xpp, tp, nelems);
+	(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 3716
 	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 3716
 
+#line 3716
 	return NC_NOERR;
+#line 3716
 
 }
 
@@ -17344,19 +37401,34 @@ int
 ncx_pad_putn_void(void **xpp, size_t nelems, const void *tp)
 {
 	size_t rndup = nelems % X_ALIGN;
+#line 3722
 
-	if(rndup)
+#line 3722
+	if (rndup)
+#line 3722
 		rndup = X_ALIGN - rndup;
+#line 3722
 
-	(void) memcpy(*xpp, tp, nelems);
+#line 3722
+	(void) memcpy(*xpp, tp, (size_t)nelems);
+#line 3722
 	*xpp = (void *)((char *)(*xpp) + nelems);
+#line 3722
 
-	if(rndup)
+#line 3722
+	if (rndup)
+#line 3722
 	{
-		(void) memcpy(*xpp, nada, rndup);
+#line 3722
+		(void) memcpy(*xpp, nada, (size_t)rndup);
+#line 3722
 		*xpp = (void *)((char *)(*xpp) + rndup);
+#line 3722
 	}
+#line 3722
 
+#line 3722
 	return NC_NOERR;
+#line 3722
 
 }
diff --git a/libsrc/ncx.h b/libsrc/ncx.h
index 37923d1..805d110 100644
--- a/libsrc/ncx.h
+++ b/libsrc/ncx.h
@@ -10,6 +10,12 @@
 #include "ncio.h"
 #include "fbits.h"
 
+#ifndef HAVE_STDINT_H
+#include "pstdint.h"
+#else
+#include <stdint.h>
+#endif /* HAVE_STDINT_H */
+
 /*
  * An external data representation interface.
 
@@ -26,7 +32,7 @@
  *
  */
 
-#include <config.h> /* output of 'configure' */
+#include "config.h" /* output of 'configure' */
 #include "rnd.h"
 #include <stddef.h> /* size_t */
 #include <errno.h>
@@ -225,19 +231,19 @@ extern int
 ncx_get_schar_double(const void *xp, double *ip);
 
 extern int
-ncx_put_schar_schar(void *xp, const schar *ip);
+ncx_put_schar_schar(void *xp, const schar *ip, void *fillp);
 extern int
-ncx_put_schar_uchar(void *xp, const uchar *ip);
+ncx_put_schar_uchar(void *xp, const uchar *ip, void *fillp);
 extern int
-ncx_put_schar_short(void *xp, const short *ip);
+ncx_put_schar_short(void *xp, const short *ip, void *fillp);
 extern int
-ncx_put_schar_int(void *xp, const int *ip);
+ncx_put_schar_int(void *xp, const int *ip, void *fillp);
 extern int
-ncx_put_schar_long(void *xp, const long *ip);
+ncx_put_schar_long(void *xp, const long *ip, void *fillp);
 extern int
-ncx_put_schar_float(void *xp, const float *ip);
+ncx_put_schar_float(void *xp, const float *ip, void *fillp);
 extern int
-ncx_put_schar_double(void *xp, const double *ip);
+ncx_put_schar_double(void *xp, const double *ip, void *fillp);
 #endif
 
 /*
@@ -269,8 +275,17 @@ ncx_put_int32(void **xpp, const int ip);
 extern int
 ncx_put_int64(void **xpp, const long long ip);
 
+extern int
+ncx_get_uint32(const void **xpp, unsigned int *ip);
+extern int
+ncx_get_uint64(const void **xpp, unsigned long long *ip);
+extern int
+ncx_put_uint32(void **xpp, const unsigned int ip);
+extern int
+ncx_put_uint64(void **xpp, const unsigned long long ip);
+
 extern int ncx_get_int_int(const void *xp, int *ip);
-extern int ncx_put_int_int(void *xp, const int *ip);
+extern int ncx_put_int_int(void *xp, const int *ip, void *fillp);
 
 /*
  * Aggregate numeric conversion functions.
@@ -360,50 +375,50 @@ extern int
 ncx_pad_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_schar_schar (void **xpp, size_t nelems, const schar   *ip);
+ncx_putn_schar_schar (void **xpp, size_t nelems, const schar   *ip, void *fillp);
 extern int
-ncx_putn_schar_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_schar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_schar_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_schar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_schar_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_schar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_schar_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_schar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_schar_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_schar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_schar_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_schar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_schar_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_schar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_schar_double(void **xpp, size_t nelems, const double  *ip);
+ncx_putn_schar_double(void **xpp, size_t nelems, const double  *ip, void *fillp);
 extern int
-ncx_putn_schar_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_schar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 extern int
-ncx_pad_putn_schar_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_pad_putn_schar_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_pad_putn_schar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_short (void **xpp, size_t nelems, const short  *ip);
+ncx_pad_putn_schar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_pad_putn_schar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_pad_putn_schar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_pad_putn_schar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_pad_putn_schar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_float (void **xpp, size_t nelems, const float  *ip);
+ncx_pad_putn_schar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *ip);
+ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_pad_putn_schar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- uchar ----------------------------------------------------------------*/
 extern int
@@ -453,50 +468,50 @@ extern int
 ncx_pad_getn_uchar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_uchar_schar (void **xpp, size_t nelems, const schar   *ip);
+ncx_putn_uchar_schar (void **xpp, size_t nelems, const schar   *ip, void *fillp);
 extern int
-ncx_putn_uchar_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_uchar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_uchar_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_uchar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_uchar_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_uchar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_uchar_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_uchar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_uchar_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_uchar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_uchar_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_uchar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_uchar_double(void **xpp, size_t nelems, const double  *ip);
+ncx_putn_uchar_double(void **xpp, size_t nelems, const double  *ip, void *fillp);
 extern int
-ncx_putn_uchar_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_uchar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 extern int
-ncx_pad_putn_uchar_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_pad_putn_uchar_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_pad_putn_uchar_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_short (void **xpp, size_t nelems, const short  *ip);
+ncx_pad_putn_uchar_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_pad_putn_uchar_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_pad_putn_uchar_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_pad_putn_uchar_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_pad_putn_uchar_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_float (void **xpp, size_t nelems, const float  *ip);
+ncx_pad_putn_uchar_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_double(void **xpp, size_t nelems, const double *ip);
+ncx_pad_putn_uchar_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_pad_putn_uchar_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_pad_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_pad_putn_uchar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- short ----------------------------------------------------------------*/
 extern int
@@ -546,50 +561,50 @@ extern int
 ncx_pad_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_short_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_short_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_short_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_short_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_short_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_short_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_short_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_short_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_short_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_short_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_short_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_short_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_short_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_short_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_short_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_short_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_short_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_short_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_short_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_short_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 extern int
-ncx_pad_putn_short_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_pad_putn_short_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_pad_putn_short_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_pad_putn_short_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_pad_putn_short_short (void **xpp, size_t nelems, const short  *ip);
+ncx_pad_putn_short_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_pad_putn_short_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_pad_putn_short_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_pad_putn_short_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_pad_putn_short_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_pad_putn_short_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_pad_putn_short_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_pad_putn_short_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_pad_putn_short_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_pad_putn_short_float (void **xpp, size_t nelems, const float  *ip);
+ncx_pad_putn_short_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *ip);
+ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_pad_putn_short_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_pad_putn_short_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- ushort ---------------------------------------------------------------*/
 extern int
@@ -639,50 +654,50 @@ extern int
 ncx_pad_getn_ushort_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_ushort_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_ushort_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_ushort_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_ushort_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_ushort_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_ushort_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_ushort_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_ushort_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_ushort_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_ushort_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_ushort_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_ushort_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_ushort_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_ushort_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_ushort_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_ushort_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_ushort_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_ushort_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 extern int
-ncx_pad_putn_ushort_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_pad_putn_ushort_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_pad_putn_ushort_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_short (void **xpp, size_t nelems, const short  *ip);
+ncx_pad_putn_ushort_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_pad_putn_ushort_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_pad_putn_ushort_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_pad_putn_ushort_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_pad_putn_ushort_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_float (void **xpp, size_t nelems, const float  *ip);
+ncx_pad_putn_ushort_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_double(void **xpp, size_t nelems, const double *ip);
+ncx_pad_putn_ushort_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_pad_putn_ushort_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_pad_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_pad_putn_ushort_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- int ------------------------------------------------------------------*/
 extern int
@@ -711,29 +726,29 @@ extern int
 ncx_getn_int_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_int_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_int_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_int_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_int_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_int_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_int_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_int_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_int_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_int_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_int_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_int_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_int_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_int_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_int_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_long_long (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_long_long (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_int_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_int_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_int_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_int_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_int_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_int_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- uint -----------------------------------------------------------------*/
 extern int
@@ -762,29 +777,29 @@ extern int
 ncx_getn_uint_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_uint_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_uint_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_uint_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_uint_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_uint_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_uint_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_uint_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_uint_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_uint_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_uint_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_uint_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_uint_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_uint_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_uint_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_long_long (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_long_long (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_uint_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_uint_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_uint_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_uint_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_uint_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_uint_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_uint_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_uint_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- float ----------------------------------------------------------------*/
 extern int
@@ -811,27 +826,27 @@ extern int
 ncx_getn_float_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_float_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_float_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_float_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_float_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_float_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_float_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_float_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_float_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_float_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_float_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_float_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_float_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_float_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_float_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_float_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_float_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_float_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_float_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_float_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_float_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- double ---------------------------------------------------------------*/
 extern int
@@ -858,27 +873,27 @@ extern int
 ncx_getn_double_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_double_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_double_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_double_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_double_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_double_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_double_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_double_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_double_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_double_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_double_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_double_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_double_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_double_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_double_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_double_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_double_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_double_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_double_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_double_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_double_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- longlong ----------------------------------------------------------------*/
 extern int
@@ -905,27 +920,27 @@ extern int
 ncx_getn_longlong_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_longlong_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_longlong_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_longlong_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_longlong_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_longlong_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_longlong_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_longlong_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_longlong_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_longlong_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_longlong_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_longlong_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_longlong_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_longlong_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_longlong_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_longlong_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_longlong_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_longlong_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_longlong_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_longlong_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_longlong_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_longlong_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_longlong_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 /*---- ulonglong ---------------------------------------------------------------*/
 extern int
@@ -952,27 +967,27 @@ extern int
 ncx_getn_ulonglong_ulonglong(const void **xpp, size_t nelems, ulonglong *ip);
 
 extern int
-ncx_putn_ulonglong_schar (void **xpp, size_t nelems, const schar  *ip);
+ncx_putn_ulonglong_schar (void **xpp, size_t nelems, const schar  *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_uchar (void **xpp, size_t nelems, const uchar  *ip);
+ncx_putn_ulonglong_uchar (void **xpp, size_t nelems, const uchar  *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_short (void **xpp, size_t nelems, const short  *ip);
+ncx_putn_ulonglong_short (void **xpp, size_t nelems, const short  *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_ushort(void **xpp, size_t nelems, const ushort *ip);
+ncx_putn_ulonglong_ushort(void **xpp, size_t nelems, const ushort *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_int   (void **xpp, size_t nelems, const int    *ip);
+ncx_putn_ulonglong_int   (void **xpp, size_t nelems, const int    *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_uint  (void **xpp, size_t nelems, const uint   *ip);
+ncx_putn_ulonglong_uint  (void **xpp, size_t nelems, const uint   *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_long  (void **xpp, size_t nelems, const long   *ip);
+ncx_putn_ulonglong_long  (void **xpp, size_t nelems, const long   *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_float (void **xpp, size_t nelems, const float  *ip);
+ncx_putn_ulonglong_float (void **xpp, size_t nelems, const float  *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_double(void **xpp, size_t nelems, const double *ip);
+ncx_putn_ulonglong_double(void **xpp, size_t nelems, const double *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_longlong (void **xpp, size_t nelems, const longlong  *ip);
+ncx_putn_ulonglong_longlong (void **xpp, size_t nelems, const longlong  *ip, void *fillp);
 extern int
-ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
+ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const ulonglong *ip, void *fillp);
 
 
 /*
@@ -980,21 +995,6 @@ ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const ulonglong *ip);
  */
 
 /* read ASCII characters */
-#ifdef __arm__
-
-extern int
-ncx_getn_text(const void **xpp, size_t nchars, signed char *cp);
-extern int
-ncx_pad_getn_text(const void **xpp, size_t nchars, signed char *cp);
-
-/* write ASCII characters */
-extern int
-ncx_putn_text(void **xpp, size_t nchars, const signed char *cp);
-extern int
-ncx_pad_putn_text(void **xpp, size_t nchars, const signed char *cp);
-
-#else // ifdef __arm__
-
 extern int
 ncx_getn_text(const void **xpp, size_t nchars, char *cp);
 extern int
@@ -1006,7 +1006,6 @@ ncx_putn_text(void **xpp, size_t nchars, const char *cp);
 extern int
 ncx_pad_putn_text(void **xpp, size_t nchars, const char *cp);
 
-#endif //ifdef __arm__
 
 /* for symmetry */
 #define ncx_getn_char_char(xpp, nelems, fillp) ncx_getn_text(xpp, nelems, fillp)
diff --git a/libsrc/ncx.m4 b/libsrc/ncx.m4
index 7f0e1e4..219e145 100644
--- a/libsrc/ncx.m4
+++ b/libsrc/ncx.m4
@@ -1,50 +1,127 @@
+dnl Process this m4 file to produce 'C' language file.
 dnl
-dnl sjl: this version of ncx.m4 has SX-specific optimisations as per
-dnl      Harveys mods to earlier versions. However, I have removed
-dnl      support for FLOAT2 and attempted to tidy up the mods to
-dnl      reduce the complexity a bit
-dnl
-dnl This is m4 source.
-dnl Process using m4 to produce 'C' language file.
+dnl This file is supposed to be the same as PnetCDF's ncx.m4
 dnl
 dnl If you see this line, you can ignore the next one.
 /* Do not edit this file. It is produced from the corresponding .m4 source */
 dnl
 /*
- *	Copyright 1996, University Corporation for Atmospheric Research
- *	See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *
- * 	This file contains some routines derived from code
- *	which is copyrighted by Sun Microsystems, Inc.
- *	The "#ifdef vax" versions of
- *		 ncx_put_float_float()
- *		 ncx_get_float_float()
- *		 ncx_put_double_double()
- *		 ncx_get_double_double()
- *		 ncx_putn_float_float()
- *		 ncx_getn_float_float()
- *		 ncx_putn_double_double()
- *		 ncx_getn_double_double()
- * 	are derived from xdr_float() and xdr_double() routines
- *	in the freely available, copyrighted Sun RPCSRC 3.9
- *	distribution, xdr_float.c.
- * 	Our "value added" is that these are always memory to memory,
- *	they handle IEEE subnormals properly, and their "n" versions
- *	operate speedily on arrays.
+ *  Copyright (C) 2014, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
  */
-/* $Id: ncx.m4 2795 2014-10-27 23:12:51Z wkliao $ */
+/* $Id: ncx.m4 2601 2016-11-07 04:54:42Z wkliao $ */
 
-/*
- * An external data representation interface.
- */
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#endif
+
+dnl
+dnl If the m4 macro "ERANGE_FILL" is defined, the I/O to data elements
+dnl that cause NC_ERANGE will be filled with the NC default fill values.
+dnl
+
+define(`SKIP_LOOP', `ifdef(`ERANGE_FILL', `$1++; $2++; continue;')')
 
-#pragma GCC diagnostic ignored "-Wdeprecated"
+dnl
+dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
+dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types
+dnl (MPI_Offset vs. size_t), and function name substrings for external data
+dnl types.
+dnl
+
+ifdef(`PNETCDF',`
+`#'if HAVE_CONFIG_H
+`#'include <ncconfig.h>
+`#'endif',`
+`#'if HAVE_CONFIG_H
+`#'include <config.h>
+`#'endif')
 
-#include "ncx.h"
-#include "nc3dispatch.h"
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 
+ifdef(`PNETCDF',`
+`#'include "ncx.h"
+`#'include "macro.h"',`
+`#'pragma GCC diagnostic ignored "-Wdeprecated"
+`#'include "ncx.h"
+`#'include "nc3dispatch.h"')
+
+define(`IntType',  `ifdef(`PNETCDF', `MPI_Offset', `size_t')')dnl
+define(`APIPrefix',`ifdef(`PNETCDF', `ncmpi', `nc')')dnl
+define(`NC_TYPE',  `ifdef(`PNETCDF', `ifelse(
+`$1', `schar',  `NC_BYTE',dnl
+`$1', `uchar',  `NC_UBYTE',dnl
+`$1', `short',  `NC_SHORT',dnl
+`$1', `ushort', `NC_USHORT',dnl
+`$1', `int',    `NC_INT',dnl
+`$1', `uint',   `NC_UINT',dnl
+`$1', `float',  `NC_FLOAT',dnl
+`$1', `double', `NC_DOUBLE',dnl
+`$1', `int64',  `NC_INT64',dnl
+`$1', `uint64', `NC_UINT64')',dnl
+`ifelse(
+`$1', `int64', `longlong',dnl
+`$1', `uint64', `ulonglong',dnl
+`$1')')')dnl
+
+ifdef(`PNETCDF',,`define(`DEBUG_RETURN_ERROR',`return $1;')')
+ifdef(`PNETCDF',,`define(`DEBUG_ASSIGN_ERROR',`$1 = $2;')')
+
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h> /* uint16_t, uint32_t, uint64_t */
+#elif defined(HAVE_STDINT_H)
+#include <stdint.h>   /* uint16_t, uint32_t, uint64_t */
+#endif
+
+dnl
+dnl *fillp is the fill value in internal representation
+dnl
+define(`FillValue', `ifdef(`ERANGE_FILL', `ifelse(
+`$1', `schar',     `if (fillp != NULL) memcpy($2, fillp, 1);',dnl
+`$1', `uchar',     `if (fillp != NULL) memcpy($2, fillp, 1);',dnl
+`$1', `short',     `if (fillp != NULL) memcpy($2, fillp, 2);',dnl
+`$1', `ushort',    `if (fillp != NULL) memcpy($2, fillp, 2);',dnl
+`$1', `int',       `if (fillp != NULL) memcpy($2, fillp, 4);',dnl
+`$1', `uint',      `if (fillp != NULL) memcpy($2, fillp, 4);',dnl
+`$1', `long',      `if (fillp != NULL) memcpy($2, fillp, SIZEOF_LONG);', dnl
+`$1', `ulong',     `if (fillp != NULL) memcpy($2, fillp, SIZEOF_ULONG);',dnl
+`$1', `float',     `if (fillp != NULL) memcpy($2, fillp, 4);',dnl
+`$1', `double',    `if (fillp != NULL) memcpy($2, fillp, 8);',dnl
+`$1', `longlong',  `if (fillp != NULL) memcpy($2, fillp, 8);',dnl
+`$1', `int64',     `if (fillp != NULL) memcpy($2, fillp, 8);',dnl
+`$1', `ulonglong', `if (fillp != NULL) memcpy($2, fillp, 8);',dnl
+`$1', `uint64',    `if (fillp != NULL) memcpy($2, fillp, 8);')')')dnl
+
+dnl
+dnl
+define(`FillDefaultValue', `ifelse(
+`$1', `schar',     `NC_FILL_BYTE',
+`$1', `uchar',     `NC_FILL_UBYTE',
+`$1', `short',     `NC_FILL_SHORT',
+`$1', `ushort',    `NC_FILL_USHORT',
+`$1', `int',       `NC_FILL_INT',
+`$1', `uint',      `NC_FILL_UINT',
+`$1', `long',      `NC_FILL_INT',
+`$1', `ulong',     `NC_FILL_UINT',
+`$1', `float',     `NC_FILL_FLOAT',
+`$1', `double',    `NC_FILL_DOUBLE',
+`$1', `longlong',  `NC_FILL_INT64',
+`$1', `int64',     `NC_FILL_INT64',
+`$1', `ulonglong', `NC_FILL_UINT64',
+`$1', `uint64',    `NC_FILL_UINT64')')dnl
+
+/*
+ * The only error code returned from subroutines in this file is NC_ERANGE,
+ * if errors are detected.
+ */
+
+/*
+ * An external data representation interface.
+ */
+
 /* alias poorly named limits.h macros */
 #define  SHORT_MAX  SHRT_MAX
 #define  SHORT_MIN  SHRT_MIN
@@ -92,14 +169,66 @@ dnl
 #define Min(a,b) ((a) < (b) ? (a) : (b))
 #define Max(a,b) ((a) > (b) ? (a) : (b))
 
+#ifndef SIZEOF_UCHAR
+#ifdef  SIZEOF_UNSIGNED_CHAR
+#define SIZEOF_UCHAR SIZEOF_UNSIGNED_CHAR
+#else
+#error "unknown SIZEOF_UCHAR"
+#endif
+#endif
+
 #ifndef SIZEOF_USHORT
+#ifdef  SIZEOF_UNSIGNED_SHORT_INT
 #define SIZEOF_USHORT SIZEOF_UNSIGNED_SHORT_INT
+#elif defined(SIZEOF_UNSIGNED_SHORT)
+#define SIZEOF_USHORT SIZEOF_UNSIGNED_SHORT
+#else
+#error "unknown SIZEOF_USHORT"
+#endif
 #endif
+
 #ifndef SIZEOF_UINT
+#ifdef  SIZEOF_UNSIGNED_INT
 #define SIZEOF_UINT SIZEOF_UNSIGNED_INT
+#else
+#error "unknown SIZEOF_UINT"
+#endif
+#endif
+
+#ifndef SIZEOF_LONGLONG
+#ifdef  SIZEOF_LONG_LONG
+#define SIZEOF_LONGLONG SIZEOF_LONG_LONG
+#else
+#error "unknown SIZEOF_LONGLONG"
+#endif
+#endif
+
+#ifndef SIZEOF_INT64
+#ifdef  SIZEOF_LONG_LONG
+#define SIZEOF_INT64 SIZEOF_LONG_LONG
+#elif defined(SIZEOF_LONGLONG)
+#define SIZEOF_INT64 SIZEOF_LONGLONG
+#else
+#error "unknown SIZEOF_INT64"
+#endif
+#endif
+
+#ifndef SIZEOF_ULONGLONG
+#ifdef  SIZEOF_UNSIGNED_LONG_LONG
+#define SIZEOF_ULONGLONG SIZEOF_UNSIGNED_LONG_LONG
+#else
+#error "unknown SIZEOF_ULONGLONG"
+#endif
+#endif
+
+#ifndef SIZEOF_UINT64
+#ifdef  SIZEOF_UNSIGNED_LONG_LONG
+#define SIZEOF_UINT64 SIZEOF_UNSIGNED_LONG_LONG
+#elif defined(SIZEOF_ULONGLONG)
+#define SIZEOF_UINT64 SIZEOF_ULONGLONG
+#else
+#error "unknown SIZEOF_UINT64"
 #endif
-#ifndef SIZEOF_ULONG_LONG
-#define SIZEOF_ULONG_LONG SIZEOF_UNSIGNED_LONG_LONG
 #endif
 
 /*
@@ -113,7 +242,7 @@ dnl
 # define X_FLOAT_MIN (-X_FLOAT_MAX)
 #endif
 
-#if _SX /* NEC SUPER UX */
+#if defined(_SX) && _SX != 0 /* NEC SUPER UX */
 #define LOOPCNT 256    /* must be no longer than hardware vector length */
 #if _INT64
 #undef  INT_MAX /* workaround cpp bug */
@@ -140,34 +269,52 @@ static const char nada[X_ALIGN] = {0, 0, 0, 0};
 #ifndef WORDS_BIGENDIAN
 /* LITTLE_ENDIAN: DEC and intel */
 /*
- * Routines to convert to BIGENDIAN.
- * Optimize the swapn?b() and swap?b() routines aggressivly.
+ * Routines to convert to BIG ENDIAN.
+ * Optimize the swapn?b() and swap?b() routines aggressively.
  */
 
 #define SWAP2(a) ( (((a) & 0xff) << 8) | \
-		(((a) >> 8) & 0xff) )
+                   (((a) >> 8) & 0xff) )
 
 #define SWAP4(a) ( ((a) << 24) | \
-		(((a) <<  8) & 0x00ff0000) | \
-		(((a) >>  8) & 0x0000ff00) | \
-		(((a) >> 24) & 0x000000ff) )
-
-
-static void
-swapn2b(void *dst, const void *src, size_t nn)
-{
+                  (((a) <<  8) & 0x00ff0000) | \
+                  (((a) >>  8) & 0x0000ff00) | \
+                  (((a) >> 24) & 0x000000ff) )
+
+#define SWAP8(a) ( (((a) & 0x00000000000000FFULL) << 56) | \
+                   (((a) & 0x000000000000FF00ULL) << 40) | \
+                   (((a) & 0x0000000000FF0000ULL) << 24) | \
+                   (((a) & 0x00000000FF000000ULL) <<  8) | \
+                   (((a) & 0x000000FF00000000ULL) >>  8) | \
+                   (((a) & 0x0000FF0000000000ULL) >> 24) | \
+                   (((a) & 0x00FF000000000000ULL) >> 40) | \
+                   (((a) & 0xFF00000000000000ULL) >> 56) )
+
+
+inline static void
+swapn2b(void *dst, const void *src, IntType nn)
+{
+    /* it is OK if dst == src */
+    int i;
+    uint16_t *op = (uint16_t*) dst;
+    uint16_t *ip = (uint16_t*) src;
+    for (i=0; i<nn; i++) {
+        op[i] = ip[i];
+        op[i] = (uint16_t)SWAP2(op[i]);
+    }
+#if 0
 	char *op = dst;
 	const char *ip = src;
 
 /* unroll the following to reduce loop overhead
  *
- *	while(nn-- != 0)
+ *	while (nn-- > 0)
  *	{
  *		*op++ = *(++ip);
  *		*op++ = *(ip++ -1);
  *	}
  */
-	while(nn > 3)
+	while (nn > 3)
 	{
 		*op++ = *(++ip);
 		*op++ = *(ip++ -1);
@@ -179,41 +326,79 @@ swapn2b(void *dst, const void *src, size_t nn)
 		*op++ = *(ip++ -1);
 		nn -= 4;
 	}
-	while(nn-- > 0)
+	while (nn-- > 0)
 	{
 		*op++ = *(++ip);
 		*op++ = *(ip++ -1);
 	}
+#endif
 }
 
 # ifndef vax
-void
+inline static void
 swap4b(void *dst, const void *src)
 {
-    unsigned int *op = dst;
-    const char *ip = src;
-    unsigned int tempIn;
-    unsigned int tempOut;
+    /* copy over, make the below swap in-place */
+    uint32_t tmp = *(uint32_t*)src;
+    tmp = SWAP4(tmp);
+    memcpy(dst, &tmp, 4);
+
+    /* Codes below will cause "break strict-aliasing rules" in gcc
+    uint32_t *op = (uint32_t*)dst;
+    *op = *(uint32_t*)src;
+    *op = SWAP4(*op);
+    */
+
+    /* Below are copied from netCDF-4.
+     * See https://bugtracking.unidata.ucar.edu/browse/NCF-338
+     * Quote "One issue we are wrestling with is how compilers optimize this
+     * code.  For some reason, we are actually needing to add an artificial
+     * move to a 4 byte space to get it to work.  I think what is happening is
+     * that the optimizer is bit shifting within a double, which is incorrect.
+     * The following code actually does work correctly.
+     *  This is in Linux land, gcc.
+     *
+     * However, the above in-place byte-swap does not appear affected by this.
+     */
+#if 0
+    uint32_t *ip = (uint32_t*)src;
+    uint32_t tempOut;  /* cannot use pointer when gcc O2 optimizer is used */
+    tempOut = SWAP4(*ip);
 
-    tempIn = *(unsigned int *)(ip+0);
-    tempOut =
-    ( tempIn << 24) |
-    ((tempIn & 0x0000ff00) << 8) |
-    ((tempIn & 0x00ff0000) >> 8) |
-    ( tempIn >> 24);
+    *(float *)dst = *(float *)(&tempOut);
+#endif
+
+    /* OLD implementation that results in four load and four store CPU
+       instructions
+    char *op = dst;
+    const char *ip = src;
+    op[0] = ip[3];
+    op[1] = ip[2];
+    op[2] = ip[1];
+    op[3] = ip[0];
+    */
 
-    *(float *)op = *(float *)(&tempOut);
 }
 # endif /* !vax */
 
-static void
-swapn4b(void *dst, const void *src, size_t nn)
+inline static void
+swapn4b(void *dst, const void *src, IntType nn)
 {
+    int i;
+    uint32_t *op = (uint32_t*) dst;
+    uint32_t *ip = (uint32_t*) src;
+    for (i=0; i<nn; i++) {
+        /* copy over, make the below swap in-place */
+        op[i] = ip[i];
+        op[i] = SWAP4(op[i]);
+    }
+
+#if 0
 	char *op = dst;
 	const char *ip = src;
 
 /* unroll the following to reduce loop overhead
- *	while(nn-- != 0)
+ *	while (nn-- > 0)
  *	{
  *		op[0] = ip[3];
  *		op[1] = ip[2];
@@ -223,7 +408,7 @@ swapn4b(void *dst, const void *src, size_t nn)
  *		ip += 4;
  *	}
  */
-	while(nn > 3)
+	while (nn > 3)
 	{
 		op[0] = ip[3];
 		op[1] = ip[2];
@@ -245,7 +430,7 @@ swapn4b(void *dst, const void *src, size_t nn)
 		ip += 16;
 		nn -= 4;
 	}
-	while(nn-- > 0)
+	while (nn-- > 0)
 	{
 		op[0] = ip[3];
 		op[1] = ip[2];
@@ -254,12 +439,29 @@ swapn4b(void *dst, const void *src, size_t nn)
 		op += 4;
 		ip += 4;
 	}
+#endif
 }
 
 # ifndef vax
-static void
+inline static void
 swap8b(void *dst, const void *src)
 {
+#ifdef FLOAT_WORDS_BIGENDIAN
+    /* copy over, make the below swap in-place */
+    *(uint64_t*)dst = *(uint64_t*)src;
+
+    uint32_t *op = (uint32_t*)dst;
+    *op = SWAP4(*op);
+    op = (uint32_t*)((char*)dst+4);
+    *op = SWAP4(*op);
+#else
+    uint64_t *op = (uint64_t*)dst;
+    /* copy over, make the below swap in-place */
+    *op = *(uint64_t*)src;
+    *op = SWAP8(*op);
+#endif
+
+#if 0
 	char *op = dst;
 	const char *ip = src;
 #  ifndef FLOAT_WORDS_BIGENDIAN
@@ -280,19 +482,44 @@ swap8b(void *dst, const void *src)
 	op[5] = ip[6];
 	op[6] = ip[5];
 	op[7] = ip[4];
-#  endif
+#endif
+#endif
 }
 # endif /* !vax */
 
 # ifndef vax
-static void
-swapn8b(void *dst, const void *src, size_t nn)
-{
+inline static void
+swapn8b(void *dst, const void *src, IntType nn)
+{
+#ifdef FLOAT_WORDS_BIGENDIAN
+    int i;
+    uint64_t *dst_p = (uint64_t*) dst;
+    uint64_t *src_p = (uint64_t*) src;
+    for (i=0; i<nn; i++) {
+        /* copy over, make the below swap in-place */
+        dst_p[i] = src_p[i];
+        uint32_t *op = (uint32_t*)(&dst_p[i]);
+        *op = SWAP4(*op);
+        op = (uint32_t*)((char*)op+4);
+        *op = SWAP4(*op);
+    }
+#else
+    int i;
+    uint64_t *op = (uint64_t*) dst;
+    uint64_t *ip = (uint64_t*) src;
+    for (i=0; i<nn; i++) {
+        /* copy over, make the below swap in-place */
+        op[i] = ip[i];
+        op[i] = SWAP8(op[i]);
+    }
+#endif
+
+#if 0
 	char *op = dst;
 	const char *ip = src;
 
 /* unroll the following to reduce loop overhead
- *	while(nn-- != 0)
+ *	while (nn-- > 0)
  *	{
  *		op[0] = ip[7];
  *		op[1] = ip[6];
@@ -307,7 +534,7 @@ swapn8b(void *dst, const void *src, size_t nn)
  *	}
  */
 #  ifndef FLOAT_WORDS_BIGENDIAN
-	while(nn > 1)
+	while (nn > 1)
 	{
 		op[0] = ip[7];
 		op[1] = ip[6];
@@ -329,7 +556,7 @@ swapn8b(void *dst, const void *src, size_t nn)
 		ip += 16;
 		nn -= 2;
 	}
-	while(nn-- != 0)
+	while (nn-- > 0)
 	{
 		op[0] = ip[7];
 		op[1] = ip[6];
@@ -343,7 +570,7 @@ swapn8b(void *dst, const void *src, size_t nn)
 		ip += 8;
 	}
 #  else
-	while(nn-- != 0)
+	while (nn-- > 0)
 	{
 		op[0] = ip[3];
 		op[1] = ip[2];
@@ -356,7 +583,8 @@ swapn8b(void *dst, const void *src, size_t nn)
 		op += 8;
 		ip += 8;
 	}
-#  endif
+#endif
+#endif
 }
 # endif /* !vax */
 
@@ -382,57 +610,37 @@ define(`Xmin',             ``X_'Upcase($1)`_MIN'')dnl
 define(`IXmax',           ``IX_'Upcase($1)`_MAX'')dnl
 dnl
 define(`Fmin',  `ifelse(index(`$1',`u'), 0, `0', `(double)Imin($1)')')dnl
-define(`Dmin',  `ifelse(index(`$1',`u'), 0, `0',         `Imin($1)')')dnl
+define(`Dmin',  `ifelse(index(`$1',`u'), 0, `0', `(double)Imin($1)')')dnl
 define(`FXmin', `ifelse(index(`$1',`u'), 0, `0', `(double)Xmin($1)')')dnl
 define(`DXmin', `ifelse(index(`$1',`u'), 0, `0',         `Xmin($1)')')dnl
 
-dnl
-dnl For GET APIs:
-dnl       check for negative xx if xp is   signed && ip is unsigned
-dnl Don't check for negative xx if xp is   signed && ip is   signed
-dnl Don't check for negative xx if xp is unsigned
-dnl
-define(`GETI_CheckNeg', `ifelse(index(`$1',`u'), 0, , `ifelse(index(`$2',`u'), 0, `	if (xx < 0) return NC_ERANGE; /* because ip is unsigned */')')')dnl
-
-dnl
-dnl For PUT APIs:
-dnl       check for negative ip if xp is unsigned && ip is   signed
-dnl Don't check for negative ip if xp is unsigned && ip is unsigned
-dnl Don't check for negative ip if xp is   signed
-dnl
-define(`PUTI_CheckNeg', `ifelse(index(`$1',`u'), 0, `ifelse(index(`$2',`u'), 0, , `	if (*ip < 0) return NC_ERANGE; /* because xp is unsigned */')')')dnl
+define(`Cast_Signed2Unsigned',
+       `ifelse(index(`$1',`u'), 0,
+               `ifelse(index(`$2',`u'), 0, , `(signed)')')')dnl
 
 dnl
-dnl For GET APIs and either $1 and $2 is float or double:
+dnl For GET APIs boundary check
 dnl
 define(`GETF_CheckBND',
-`ifelse(`$1', `double', `	if(xx > Upcase($2)_MAX || xx < Dmin($2)) return NC_ERANGE;',
-		       `ifelse(`$1', `float', `ifelse(`$2', `double',,`	if(xx > (double)Upcase($2)_MAX || xx < Fmin($2)) return NC_ERANGE;')')'dnl
-)')
-
-dnl
-dnl For PUT APIs and either $1 and $2 is float or double:
-dnl
-define(`PUTF_CheckBND',
-`ifelse(`$2', `double', `	if(*ip > Xmax($1) || *ip < DXmin($1)) return NC_ERANGE;',
-		       `ifelse(`$2', `float', `	if(*ip > (double)Xmax($1) || *ip < FXmin($1)) return NC_ERANGE;')'dnl
-)')
-
-dnl
-dnl For GET APIs and $1 and $2 are not float or double
-dnl
-define(`GETI_CheckBND',
-``#'if IXmax($1) > Imax($2)
-	if (xx > Imax($2)'`ifelse(index(`$1',`u'), 0, , `ifelse(index(`$2',`u'), 0, , ` || xx < Imin($2)')')'`) return NC_ERANGE;'
-`#'endif)
-
-dnl
-dnl For PUT APIs and $1 and $2 are not float or double
-dnl
-define(`PUTI_CheckBND',
-``#'if IXmax($1) < Imax($2)
-	if (*ip > IXmax($1)'`ifelse(index(`$1',`u'), 0, , `ifelse(index(`$2',`u'), 0, , ` || *ip < Xmin($1)')')'`) return NC_ERANGE;'
-`#'endif)
+`if (xx > (double)Upcase($1)_MAX || xx < Dmin($1)) {
+            ifdef(`ERANGE_FILL',`*ip = FillDefaultValue($1);')
+            DEBUG_RETURN_ERROR(NC_ERANGE)
+        }
+	*ip = ($1)xx;')dnl
+
+dnl
+dnl For GET APIs boudnary check for when $1 is either 'longlong' or 'ulonglong'
+dnl
+define(`GETF_CheckBND2',
+       `ifelse(index(`$1',`u'), 0,
+`if (xx == Upcase($1)_MAX)      *ip = Upcase($1)_MAX;',dnl for unsigned type
+`if (xx == Upcase($1)_MAX)      *ip = Upcase($1)_MAX;
+	else if (xx == Upcase($1)_MIN) *ip = Upcase($1)_MIN;')
+	else if (xx > (double)Upcase($1)_MAX || xx < Dmin($1)) {
+            ifdef(`ERANGE_FILL',`*ip = FillDefaultValue($1);')
+            DEBUG_RETURN_ERROR(NC_ERANGE)
+        }
+	else *ip = ($1)xx;')
 
 /*
  * Primitive numeric conversion functions.
@@ -444,13 +652,19 @@ dnl NCX_GET1F(xtype, itype) for floating-point types
 dnl
 define(`NCX_GET1F',dnl
 `dnl
-int
-ncx_get_$1_$2(const void *xp, $2 *ip)
+static int
+APIPrefix`x_get_'NC_TYPE($1)_$2(const void *xp, $2 *ip)
 {
 	ix_$1 xx;
 	get_ix_$1(xp, &xx);
-	*ip = ($2) xx;
-GETF_CheckBND($1, $2)
+	ifelse(`$1', `float',  `ifelse(`$2',  `longlong', GETF_CheckBND2($2),
+	                               `$2', `ulonglong', GETF_CheckBND2($2),
+	                               `$2',    `double', `*ip = ($2)xx;',
+				                          GETF_CheckBND($2))',
+	       `$1', `double', `ifelse(`$2',  `longlong', GETF_CheckBND2($2),
+	                               `$2', `ulonglong', GETF_CheckBND2($2),
+				                          GETF_CheckBND($2))',
+	       `*ip = ($2)xx;')
 	return NC_NOERR;
 }
 ')dnl
@@ -461,23 +675,41 @@ dnl NCX_GET1I(xtype, itype, isComptable) for integral types
 dnl
 define(`NCX_GET1I',dnl
 `dnl
-int
-ncx_get_$1_$2(const void *xp, $2 *ip)
+static int
+APIPrefix`x_get_'NC_TYPE($1)_$2(const void *xp, $2 *ip)
 {
+    int err=NC_NOERR;
 ifelse(`$3', `1',
 ``#'if IXsizeof($1) == Isizeof($2) && IXmax($1) == Upcase($2)_MAX
-	get_ix_$1(xp, (ix_$1 *)ip);
-	return NC_NOERR;
+    get_ix_$1(xp, (ix_$1 *)ip);
 `#'else
 ')dnl
-	ix_$1 xx;
-	get_ix_$1(xp, &xx);
-	*ip = ($2) xx;
-GETI_CheckBND($1, $2)
-GETI_CheckNeg($1, $2)
-ifelse(`$3', `1', ``#'endif
+    ix_$1 xx;
+    get_ix_$1(xp, &xx);
+
+`#'if IXmax($1) > Imax($2)
+    if (xx > Imax($2)'`ifelse(index(`$1',`u'), 0, ,
+                              index(`$2',`u'), 0, ,
+                              ` || xx < Imin($2)')'`) {
+ifdef(`ERANGE_FILL',`dnl
+        *ip = FillDefaultValue($2);
+        DEBUG_RETURN_ERROR(NC_ERANGE)',`
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)')
+    }'
+`#'endif
+
+`ifelse(index(`$1',`u'), 0, , index(`$2',`u'), 0,`dnl
+    if (xx < 0) {
+ifdef(`ERANGE_FILL',`dnl
+        *ip = FillDefaultValue($2);
+        DEBUG_RETURN_ERROR(NC_ERANGE)',`
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)') /* because ip is unsigned */
+    }')'dnl
+
+    *ip = ($2) xx;
+`ifelse(`$3', `1', ``#'endif
 ')dnl
-	return NC_NOERR;
+    return err;
 }
 ')dnl
 
@@ -487,13 +719,24 @@ dnl NCX_PUT1F(xtype, itype) for floating-point types
 dnl
 define(`NCX_PUT1F',dnl
 `dnl
-int
-ncx_put_$1_$2(void *xp, const $2 *ip)
+static int
+APIPrefix`x_put_'NC_TYPE($1)_$2(void *xp, const $2 *ip, void *fillp)
 {
-	ix_$1 xx = (ix_$1)*ip;
-	put_ix_$1(xp, &xx);
-PUTF_CheckBND($1, $2)
-	return NC_NOERR;
+    int err=NC_NOERR;
+    ix_$1 xx = FillDefaultValue($1);
+
+    ifelse(`$2', `double', `if (*ip > Xmax($1) || *ip < DXmin($1)) {
+        FillValue($1, &xx)
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
+    } ifdef(`ERANGE_FILL',`else')',
+        `$2', `float',  `if (*ip > (double)Xmax($1) || *ip < FXmin($1)) {
+        FillValue($1, &xx)
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
+    } ifdef(`ERANGE_FILL',`else')')
+        xx = (ix_$1)*ip;
+
+    put_ix_$1(xp, &xx);
+    return err;
 }
 ')dnl
 
@@ -503,22 +746,37 @@ dnl NCX_PUT1I(xtype, itype, isComptable) for integral types
 dnl
 define(`NCX_PUT1I',dnl
 `dnl
-int
-ncx_put_$1_$2(void *xp, const $2 *ip)
+static int
+APIPrefix`x_put_'NC_TYPE($1)_$2(void *xp, const $2 *ip, void *fillp)
 {
+    int err=NC_NOERR;
 ifelse(`$3', `1',
 ``#'if IXsizeof($1) == Isizeof($2) && IXmax($1) == Upcase($2)_MAX
-	put_ix_$1(xp, (const ix_$1 *)ip);
-	return NC_NOERR;
+    put_ix_$1(xp, (const ix_$1 *)ip);
 `#'else
 ')dnl
-	ix_$1 xx = (ix_$1)*ip;
-	put_ix_$1(xp, &xx);
-PUTI_CheckBND($1, $2)
-PUTI_CheckNeg($1, $2)
+    ix_$1 xx = FillDefaultValue($1);
+
+`#'if IXmax($1) < Imax($2)
+    if (*ip > IXmax($1)'`ifelse(index(`$1',`u'), 0, ,
+                                index(`$2',`u'), 0, ,
+                                ` || *ip < Xmin($1)')'`) {
+        FillValue($1, &xx)
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
+    } ifdef(`ERANGE_FILL',`else')
+`#'endif
+ifelse(index(`$1',`u'), 0, `ifelse(index(`$2',`u'), 0, ,`dnl
+    if (*ip < 0) {
+        FillValue($1, &xx)
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE) /* because xp is unsigned */
+    } ifdef(`ERANGE_FILL',`else')
+')')dnl
+        xx = (ix_$1)*ip;
+
+    put_ix_$1(xp, &xx);
 ifelse(`$3', `1', ``#'endif
 ')dnl
-	return NC_NOERR;
+    return err;
 }
 ')dnl
 
@@ -528,7 +786,7 @@ ifelse(`$3', `1', ``#'endif
 /* We don't implement any x_schar and x_uchar primitives. */
 
 
-/* x_short -------------------------------------------------------------------*/
+/* external NC_SHORT --------------------------------------------------------*/
 
 #if SHORT_MAX == X_SHORT_MAX
 typedef short ix_short;
@@ -544,7 +802,7 @@ typedef long ix_short;
 #define IX_SHORT_MAX LONG_MAX
 #elif LLONG_MAX >= X_SHORT_MAX
 typedef long long ix_short;
-#define SIZEOF_IX_SHORT SIZEOF_LONG_LONG
+#define SIZEOF_IX_SHORT SIZEOF_LONGLONG
 #define IX_SHORT_MAX LLONG_MAX
 #else
 #error "ix_short implementation"
@@ -554,50 +812,51 @@ static void
 get_ix_short(const void *xp, ix_short *ip)
 {
 	const uchar *cp = (const uchar *) xp;
-	*ip = *cp++ << 8;
+	*ip = (ix_short)(*cp++ << 8);
 #if SIZEOF_IX_SHORT > X_SIZEOF_SHORT
-	if(*ip & 0x8000)
+	if (*ip & 0x8000)
 	{
 		/* extern is negative */
 		*ip |= (~(0xffff)); /* N.B. Assumes "twos complement" */
 	}
 #endif
-	*ip |= *cp;
+	*ip = (ix_short)(*ip | *cp);
 }
 
 static void
 put_ix_short(void *xp, const ix_short *ip)
 {
 	uchar *cp = (uchar *) xp;
-	*cp++ = (*ip) >> 8;
-	*cp = (*ip) & 0xff;
-}
-
-static NCX_GET1I(short, schar,     0)
-static NCX_GET1I(short, short,     1)
-static NCX_GET1I(short, int,       1)
-static NCX_GET1I(short, longlong,  1)
-static NCX_GET1I(short, ushort,    0)
-static NCX_GET1I(short, uchar,     0)
-static NCX_GET1I(short, uint,      0)
-static NCX_GET1I(short, ulonglong, 0)
-static NCX_GET1F(short, float)
-static NCX_GET1F(short, double)
+	*cp++ = (uchar)((*ip) >> 8);
+	*cp   = (uchar)((*ip) & 0xff);
+}
+
+NCX_GET1I(short, schar,     0)
+NCX_GET1I(short, short,     1)
+NCX_GET1I(short, int,       1)
+NCX_GET1I(short, long,      1)
+NCX_GET1I(short, longlong,  1)
+NCX_GET1I(short, ushort,    0)
+NCX_GET1I(short, uchar,     0)
+NCX_GET1I(short, uint,      0)
+NCX_GET1I(short, ulonglong, 0)
+NCX_GET1F(short, float)
+NCX_GET1F(short, double)
 
 static int
-ncx_put_short_schar(void *xp, const schar *ip)
+APIPrefix`x_put_'NC_TYPE(short)_schar(void *xp, const schar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
-	if(*ip & 0x80)
+	if (*ip & 0x80)
 		*cp++ = 0xff;
 	else
 		*cp++ = 0;
-	*cp = (uchar)(signed)*ip;
+	*cp = (uchar)*ip;
 	return NC_NOERR;
 }
 
 static int
-ncx_put_short_uchar(void *xp, const uchar *ip)
+APIPrefix`x_put_'NC_TYPE(short)_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0;
@@ -605,16 +864,17 @@ ncx_put_short_uchar(void *xp, const uchar *ip)
 	return NC_NOERR;
 }
 
-static NCX_PUT1I(short, short,     1)
-static NCX_PUT1I(short, int,       1)
-static NCX_PUT1I(short, longlong,  1)
-static NCX_PUT1I(short, ushort,    0)
-static NCX_PUT1I(short, uint,      0)
-static NCX_PUT1I(short, ulonglong, 0)
-static NCX_PUT1F(short, float)
-static NCX_PUT1F(short, double)
+NCX_PUT1I(short, short,     1)
+NCX_PUT1I(short, int,       1)
+NCX_PUT1I(short, long,      1)
+NCX_PUT1I(short, longlong,  1)
+NCX_PUT1I(short, ushort,    0)
+NCX_PUT1I(short, uint,      0)
+NCX_PUT1I(short, ulonglong, 0)
+NCX_PUT1F(short, float)
+NCX_PUT1F(short, double)
 
-/* x_ushort ------------------------------------------------------------------*/
+/* external NC_USHORT -------------------------------------------------------*/
 
 #if USHORT_MAX == X_USHORT_MAX
 typedef unsigned short ix_ushort;
@@ -630,7 +890,7 @@ typedef unsigned long ix_ushort;
 #define IX_USHORT_MAX ULONG_MAX
 #elif ULLONG_MAX >= X_USHORT_MAX
 typedef unsigned long long ix_ushort;
-#define SIZEOF_IX_USHORT SIZEOF_ULONG_LONG
+#define SIZEOF_IX_USHORT SIZEOF_ULONGLONG
 #define IX_USHORT_MAX ULLONG_MAX
 #else
 #error "ix_ushort implementation"
@@ -640,52 +900,64 @@ static void
 get_ix_ushort(const void *xp, ix_ushort *ip)
 {
 	const uchar *cp = (const uchar *) xp;
-	*ip = *cp++ << 8;
+	*ip = (ix_ushort)(*cp++ << 8);
 #if SIZEOF_IX_SHORT > X_SIZEOF_SHORT
-	if(*ip & 0x8000)
+	if (*ip & 0x8000)
 	{
 		/* extern is negative */
 		*ip |= (~(0xffff)); /* N.B. Assumes "twos complement" */
 	}
 #endif
-	*ip |= *cp;
+	*ip = (ix_ushort)(*ip | *cp);
 }
 
 static void
 put_ix_ushort(void *xp, const ix_ushort *ip)
 {
 	uchar *cp = (uchar *) xp;
-	*cp++ = (*ip) >> 8;
-	*cp = (*ip) & 0xff;
-}
-
-static NCX_GET1I(ushort, schar,     0)
-static NCX_GET1I(ushort, short,     0)
-static NCX_GET1I(ushort, int,       0)
-static NCX_GET1I(ushort, longlong,  0)
-static NCX_GET1I(ushort, ushort,    1)
-static NCX_GET1I(ushort, uchar,     1)
-static NCX_GET1I(ushort, uint,      1)
-static NCX_GET1I(ushort, ulonglong, 1)
-static NCX_GET1F(ushort, float)
-static NCX_GET1F(ushort, double)
+	*cp++ = (uchar)((*ip) >> 8);
+	*cp   = (uchar)((*ip) & 0xff);
+}
+
+NCX_GET1I(ushort, schar,     0)
+NCX_GET1I(ushort, short,     0)
+NCX_GET1I(ushort, int,       0)
+NCX_GET1I(ushort, long,      0)
+NCX_GET1I(ushort, longlong,  0)
+NCX_GET1I(ushort, ushort,    1)
+NCX_GET1I(ushort, uchar,     1)
+NCX_GET1I(ushort, uint,      1)
+NCX_GET1I(ushort, ulonglong, 1)
+NCX_GET1F(ushort, float)
+NCX_GET1F(ushort, double)
 
 static int
-ncx_put_ushort_schar(void *xp, const schar *ip)
+APIPrefix`x_put_'NC_TYPE(ushort)_schar(void *xp, const schar *ip, void *fillp)
 {
-	uchar *cp = (uchar *) xp;
-	if(*ip & 0x80)
-		*cp++ = 0xff;
-	else
-		*cp++ = 0;
-	*cp = (uchar)(signed)*ip;
-        if (*ip < 0) return NC_ERANGE;
+    int err=NC_NOERR;
+    uchar *cp;
+    if (*ip < 0) {
+ifdef(`ERANGE_FILL', `dnl
+        if (fillp != NULL) memcpy(xp, fillp, 2);
+#ifndef WORDS_BIGENDIAN
+        swapn2b(xp, xp, 1);
+#endif
+        DEBUG_RETURN_ERROR(NC_ERANGE)',`dnl
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)')
+    }
 
-	return NC_NOERR;
+    cp = (uchar *) xp;
+    if (*ip & 0x80)
+        *cp++ = 0xff;
+    else
+        *cp++ = 0;
+    *cp = (uchar)*ip;
+
+    return err;
 }
 
 static int
-ncx_put_ushort_uchar(void *xp, const uchar *ip)
+APIPrefix`x_put_'NC_TYPE(ushort)_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0;
@@ -693,16 +965,17 @@ ncx_put_ushort_uchar(void *xp, const uchar *ip)
 	return NC_NOERR;
 }
 
-static NCX_PUT1I(ushort, short,     0)
-static NCX_PUT1I(ushort, int,       0)
-static NCX_PUT1I(ushort, longlong,  0)
-static NCX_PUT1I(ushort, ushort,    1)
-static NCX_PUT1I(ushort, uint,      1)
-static NCX_PUT1I(ushort, ulonglong, 1)
-static NCX_PUT1F(ushort, float)
-static NCX_PUT1F(ushort, double)
+NCX_PUT1I(ushort, short,     0)
+NCX_PUT1I(ushort, int,       0)
+NCX_PUT1I(ushort, long,      0)
+NCX_PUT1I(ushort, longlong,  0)
+NCX_PUT1I(ushort, ushort,    1)
+NCX_PUT1I(ushort, uint,      1)
+NCX_PUT1I(ushort, ulonglong, 1)
+NCX_PUT1F(ushort, float)
+NCX_PUT1F(ushort, double)
 
-/* x_int ---------------------------------------------------------------------*/
+/* external NC_INT ----------------------------------------------------------*/
 
 #if SHORT_MAX == X_INT_MAX
 typedef short ix_int;
@@ -728,7 +1001,7 @@ get_ix_int(const void *xp, ix_int *ip)
 
 	*ip = *cp++ << 24;
 #if SIZEOF_IX_INT > X_SIZEOF_INT
-	if(*ip & 0x80000000)
+	if (*ip & 0x80000000)
 	{
 		/* extern is negative */
 		*ip |= (~(0xffffffff)); /* N.B. Assumes "twos complement" */
@@ -744,28 +1017,31 @@ put_ix_int(void *xp, const ix_int *ip)
 {
 	uchar *cp = (uchar *) xp;
 
-	*cp++ = (*ip) >> 24;
-	*cp++ = ((*ip) & 0x00ff0000) >> 16;
-	*cp++ = ((*ip) & 0x0000ff00) >>  8;
-	*cp   = ((*ip) & 0x000000ff);
+	*cp++ = (uchar)( (*ip) >> 24);
+	*cp++ = (uchar)(((*ip) & 0x00ff0000) >> 16);
+	*cp++ = (uchar)(((*ip) & 0x0000ff00) >>  8);
+	*cp   = (uchar)( (*ip) & 0x000000ff);
 }
 
-static NCX_GET1I(int, schar,     0)
-static NCX_GET1I(int, short,     1)
-       NCX_GET1I(int, int,       1)
-static NCX_GET1I(int, longlong,  1)
-static NCX_GET1I(int, ushort,    0)
-static NCX_GET1I(int, uchar,     0)
-static NCX_GET1I(int, uint,      0)
-static NCX_GET1I(int, ulonglong, 0)
-static NCX_GET1F(int, float)
-static NCX_GET1F(int, double)
+#if X_SIZEOF_INT != SIZEOF_INT
+NCX_GET1I(int, int,       1)
+#endif
+NCX_GET1I(int, schar,     0)
+NCX_GET1I(int, short,     1)
+NCX_GET1I(int, long,      1)
+NCX_GET1I(int, longlong,  1)
+NCX_GET1I(int, ushort,    0)
+NCX_GET1I(int, uchar,     0)
+NCX_GET1I(int, uint,      0)
+NCX_GET1I(int, ulonglong, 0)
+NCX_GET1F(int, float)
+NCX_GET1F(int, double)
 
 static int
-ncx_put_int_schar(void *xp, const schar *ip)
+APIPrefix`x_put_'NC_TYPE(int)_schar(void *xp, const schar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
-	if(*ip & 0x80)
+	if (*ip & 0x80)
 	{
 		*cp++ = 0xff;
 		*cp++ = 0xff;
@@ -777,12 +1053,12 @@ ncx_put_int_schar(void *xp, const schar *ip)
 		*cp++ = 0x00;
 		*cp++ = 0x00;
 	}
-	*cp = (uchar)(signed)*ip;
+	*cp = (uchar)*ip;
 	return NC_NOERR;
 }
 
 static int
-ncx_put_int_uchar(void *xp, const uchar *ip)
+APIPrefix`x_put_'NC_TYPE(int)_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0x00;
@@ -792,17 +1068,20 @@ ncx_put_int_uchar(void *xp, const uchar *ip)
 	return NC_NOERR;
 }
 
-static NCX_PUT1I(int, short,     1)
-       NCX_PUT1I(int, int,       1)
-static NCX_PUT1I(int, longlong,  1)
-static NCX_PUT1I(int, ushort,    0)
-static NCX_PUT1I(int, uint,      0)
-static NCX_PUT1I(int, ulonglong, 0)
-static NCX_PUT1F(int, float)
-static NCX_PUT1F(int, double)
+#if X_SIZEOF_INT != SIZEOF_INT
+NCX_PUT1I(int, int,       1)
+#endif
+NCX_PUT1I(int, short,     1)
+NCX_PUT1I(int, long,      1)
+NCX_PUT1I(int, longlong,  1)
+NCX_PUT1I(int, ushort,    0)
+NCX_PUT1I(int, uint,      0)
+NCX_PUT1I(int, ulonglong, 0)
+NCX_PUT1F(int, float)
+NCX_PUT1F(int, double)
 
 
-/* x_uint --------------------------------------------------------------------*/
+/* external NC_UINT ---------------------------------------------------------*/
 
 #if USHORT_MAX == X_UINT_MAX
 typedef ushort ix_uint;
@@ -826,10 +1105,10 @@ get_ix_uint(const void *xp, ix_uint *ip)
 {
 	const uchar *cp = (const uchar *) xp;
 
-	*ip = *cp++ << 24;
-	*ip |= (*cp++ << 16);
-	*ip |= (*cp++ << 8);
-	*ip |= *cp;
+	*ip = (ix_uint)(*cp++ << 24);
+	*ip = (ix_uint)(*ip | (ix_uint)(*cp++ << 16));
+	*ip = (ix_uint)(*ip | (ix_uint)(*cp++ << 8));
+	*ip = (ix_uint)(*ip | *cp);
 }
 
 static void
@@ -837,42 +1116,51 @@ put_ix_uint(void *xp, const ix_uint *ip)
 {
 	uchar *cp = (uchar *) xp;
 
-	*cp++ = (*ip) >> 24;
-	*cp++ = ((*ip) & 0x00ff0000) >> 16;
-	*cp++ = ((*ip) & 0x0000ff00) >>  8;
-	*cp   = ((*ip) & 0x000000ff);
+	*cp++ = (uchar)((*ip) >> 24);
+	*cp++ = (uchar)(((*ip) & 0x00ff0000) >> 16);
+	*cp++ = (uchar)(((*ip) & 0x0000ff00) >>  8);
+	*cp   = (uchar)( (*ip) & 0x000000ff);
 }
 
 #if X_SIZEOF_UINT != SIZEOF_UINT
-static NCX_GET1I(uint, uint,      1)
+NCX_GET1I(uint, uint,      1)
 #endif
 
-static NCX_GET1I(uint, schar,     0)
-static NCX_GET1I(uint, short,     0)
-static NCX_GET1I(uint, int,       0)
-static NCX_GET1I(uint, longlong,  0)
-static NCX_GET1I(uint, ushort,    1)
-static NCX_GET1I(uint, uchar,     1)
-static NCX_GET1I(uint, ulonglong, 1)
-static NCX_GET1F(uint, float)
-static NCX_GET1F(uint, double)
+NCX_GET1I(uint, schar,     0)
+NCX_GET1I(uint, short,     0)
+NCX_GET1I(uint, int,       0)
+NCX_GET1I(uint, long,      0)
+NCX_GET1I(uint, longlong,  0)
+NCX_GET1I(uint, ushort,    1)
+NCX_GET1I(uint, uchar,     1)
+NCX_GET1I(uint, ulonglong, 1)
+NCX_GET1F(uint, float)
+NCX_GET1F(uint, double)
 
 static int
-ncx_put_uint_schar(void *xp, const schar *ip)
+APIPrefix`x_put_'NC_TYPE(uint)_schar(void *xp, const schar *ip, void *fillp)
 {
-	uchar *cp = (uchar *) xp;
-	*cp++ = 0x00;
-	*cp++ = 0x00;
-	*cp++ = 0x00;
-	*cp = (uchar)(signed)*ip;
+    uchar *cp;
+    if (*ip < 0) {
+ifdef(`ERANGE_FILL', `dnl
+        if (fillp != NULL) memcpy(xp, fillp, 4);
+#ifndef WORDS_BIGENDIAN
+        swapn4b(xp, xp, 1);
+#endif')
+        DEBUG_RETURN_ERROR(NC_ERANGE)
+    }
 
-	if (*ip < 0) return NC_ERANGE;
+    cp = (uchar *) xp;
+    *cp++ = 0x00;
+    *cp++ = 0x00;
+    *cp++ = 0x00;
+    *cp = (uchar)*ip;
 
-	return NC_NOERR;
+    return NC_NOERR;
 }
 
 static int
-ncx_put_uint_uchar(void *xp, const uchar *ip)
+APIPrefix`x_put_'NC_TYPE(uint)_uchar(void *xp, const uchar *ip, void *fillp)
 {
 	uchar *cp = (uchar *) xp;
 	*cp++ = 0x00;
@@ -883,32 +1171,34 @@ ncx_put_uint_uchar(void *xp, const uchar *ip)
 }
 
 #if X_SIZEOF_UINT != SIZEOF_UINT
-static NCX_PUT1I(uint, uint,      1)
+NCX_PUT1I(uint, uint,      1)
 #endif
 
-static NCX_PUT1I(uint, short,     0)
-static NCX_PUT1I(uint, int,       0)
-static NCX_PUT1I(uint, longlong,  0)
-static NCX_PUT1I(uint, ushort,    1)
-static NCX_PUT1I(uint, ulonglong, 1)
-static NCX_PUT1F(uint, float)
-static NCX_PUT1F(uint, double)
+NCX_PUT1I(uint, short,     0)
+NCX_PUT1I(uint, int,       0)
+NCX_PUT1I(uint, long,      0)
+NCX_PUT1I(uint, longlong,  0)
+NCX_PUT1I(uint, ushort,    1)
+NCX_PUT1I(uint, ulonglong, 1)
+NCX_PUT1F(uint, float)
+NCX_PUT1F(uint, double)
 
-/* x_float -------------------------------------------------------------------*/
+
+/* external NC_FLOAT --------------------------------------------------------*/
 
 #if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT)
 
-static void
+inline static void
 get_ix_float(const void *xp, float *ip)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(ip, xp, sizeof(float));
+	(void) memcpy(ip, xp, SIZEOF_FLOAT);
 #else
 	swap4b(ip, xp);
 #endif
 }
 
-static void
+inline static void
 put_ix_float(void *xp, const float *ip)
 {
 #ifdef WORDS_BIGENDIAN
@@ -918,7 +1208,7 @@ put_ix_float(void *xp, const float *ip)
 #endif
 }
 
-#elif vax
+#elif defined(vax) && vax != 0
 
 /* What IEEE single precision floating point looks like on a Vax */
 struct	ieee_single {
@@ -967,7 +1257,7 @@ define(`GET_VAX_DFLOAT_Body',dnl
 		switch(exp) {
 		case 0 :
 			/* ieee subnormal */
-			if(isp->mant_hi == min.ieee.mant_hi
+			if (isp->mant_hi == min.ieee.mant_hi
 				&& isp->mant_lo_hi == min.ieee.mant_lo_hi
 				&& isp->mant_lo_lo == min.ieee.mant_lo_lo)
 			{
@@ -979,7 +1269,7 @@ define(`GET_VAX_DFLOAT_Body',dnl
 					 | isp->mant_lo_hi << 8
 					 | isp->mant_lo_lo;
 				unsigned tmp = mantissa >> 20;
-				if(tmp >= 4) {
+				if (tmp >= 4) {
 					vsp->exp = 2;
 				} else if (tmp >= 2) {
 					vsp->exp = 1;
@@ -1042,8 +1332,8 @@ define(`PUT_VAX_DFLOAT_Body',dnl
 		}
 			break;
 		case 0xff : /* max.s.exp */
-			if( vsp->mantissa2 == max.s.mantissa2
-				&& vsp->mantissa1 == max.s.mantissa1)
+			if (vsp->mantissa2 == max.s.mantissa2 &&
+			    vsp->mantissa1 == max.s.mantissa1)
 			{
 				/* map largest vax float to ieee infinity */
 				*isp = max.ieee;
@@ -1133,11 +1423,11 @@ define(`GET_IX_FLOAT_Body',dnl
 `dnl
 		cray_single *csp = (cray_single *) ip;
 
-		if(isp->exp == 0)
+		if (isp->exp == 0)
 		{
 			/* ieee subnormal */
 			*ip = (double)isp->mant;
-			if(isp->mant != 0)
+			if (isp->mant != 0)
 			{
 				csp->exp -= (ieee_single_bias + 22);
 			}
@@ -1162,13 +1452,13 @@ define(`PUT_IX_FLOAT_Body',dnl
 
 	isp->sign = csp->sign;
 
-	if(ieee_exp >= 0xff)
+	if (ieee_exp >= 0xff)
 	{
 		/* NC_ERANGE => ieee Inf */
 		isp->exp = 0xff;
 		isp->mant = 0x0;
 	}
-	else if(ieee_exp > 0)
+	else if (ieee_exp > 0)
 	{
 		/* normal ieee representation */
 		isp->exp  = ieee_exp;
@@ -1177,7 +1467,7 @@ define(`PUT_IX_FLOAT_Body',dnl
 		isp->mant = (((csp->mant << 1) &
 				0xffffffffffff) >> (48 - 23));
 	}
-	else if(ieee_exp > -23)
+	else if (ieee_exp > -23)
 	{
 		/* ieee subnormal, right shift */
 		const int rshift = (48 - 23 - ieee_exp);
@@ -1185,7 +1475,7 @@ define(`PUT_IX_FLOAT_Body',dnl
 		isp->mant = csp->mant >> rshift;
 
 #if 0
-		if(csp->mant & (1 << (rshift -1)))
+		if (csp->mant & (1 << (rshift -1)))
 		{
 			/* round up */
 			isp->mant++;
@@ -1206,7 +1496,7 @@ static void
 get_ix_float(const void *xp, float *ip)
 {
 
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		const ieee_single_hi *isp = (const ieee_single_hi *) xp;
 GET_IX_FLOAT_Body
@@ -1221,7 +1511,7 @@ GET_IX_FLOAT_Body
 static void
 put_ix_float(void *xp, const float *ip)
 {
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		ieee_single_hi *isp = (ieee_single_hi*)xp;
 PUT_IX_FLOAT_Body
@@ -1241,10 +1531,10 @@ get_ix_float(const void *xp, float *ip)
 
 	ieee_double *idp = (ieee_double *) ip;
 
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		const ieee_single_hi *isp = (const ieee_single_hi *) xp;
-		if(isp->exp == 0 && isp->mant == 0)
+		if (isp->exp == 0 && isp->mant == 0)
 		{
 			idp->exp = 0;
 			idp->mant = 0;
@@ -1259,7 +1549,7 @@ get_ix_float(const void *xp, float *ip)
 	else
 	{
 		const ieee_single_lo *isp = (const ieee_single_lo *) xp;
-		if(isp->exp == 0 && isp->mant == 0)
+		if (isp->exp == 0 && isp->mant == 0)
 		{
 			idp->exp = 0;
 			idp->mant = 0;
@@ -1277,10 +1567,10 @@ static void
 put_ix_float(void *xp, const float *ip)
 {
 	const ieee_double *idp = (const ieee_double *) ip;
-	if(word_align(xp) == 0)
+	if (word_align(xp) == 0)
 	{
 		ieee_single_hi *isp = (ieee_single_hi*)xp;
-		if(idp->exp > (ieee_double_bias - ieee_single_bias))
+		if (idp->exp > (ieee_double_bias - ieee_single_bias))
 			isp->exp = idp->exp - (ieee_double_bias - ieee_single_bias);
 		else
 			isp->exp = 0;
@@ -1290,7 +1580,7 @@ put_ix_float(void *xp, const float *ip)
 	else
 	{
 		ieee_single_lo *isp = (ieee_single_lo*)xp;
-		if(idp->exp > (ieee_double_bias - ieee_single_bias))
+		if (idp->exp > (ieee_double_bias - ieee_single_bias))
 			isp->exp = idp->exp - (ieee_double_bias - ieee_single_bias);
 		else
 			isp->exp = 0;
@@ -1306,7 +1596,7 @@ put_ix_float(void *xp, const float *ip)
 
 #if X_SIZEOF_FLOAT != SIZEOF_FLOAT || defined(NO_IEEE_FLOAT)
 static int
-ncx_get_float_float(const void *xp, float *ip)
+APIPrefix`x_get_'NC_TYPE(float)_float(const void *xp, float *ip, void *fillp)
 {
 	/* TODO */
 	get_ix_float(xp, ip);
@@ -1316,41 +1606,49 @@ ncx_get_float_float(const void *xp, float *ip)
 
 #define ix_float float
 
-static NCX_GET1F(float, schar)
-static NCX_GET1F(float, short)
-static NCX_GET1F(float, int)
-static NCX_GET1F(float, double)
-static NCX_GET1F(float, longlong)
-static NCX_GET1F(float, uchar)
-static NCX_GET1F(float, ushort)
-static NCX_GET1F(float, uint)
-static NCX_GET1F(float, ulonglong)
+NCX_GET1F(float, schar)
+NCX_GET1F(float, short)
+NCX_GET1F(float, int)
+NCX_GET1F(float, long)
+NCX_GET1F(float, double)
+NCX_GET1F(float, longlong)
+NCX_GET1F(float, uchar)
+NCX_GET1F(float, ushort)
+NCX_GET1F(float, uint)
+NCX_GET1F(float, ulonglong)
 
 #if X_SIZEOF_FLOAT != SIZEOF_FLOAT || defined(NO_IEEE_FLOAT)
 static int
-ncx_put_float_float(void *xp, const float *ip)
+APIPrefix`x_put_'NC_TYPE(float)_float(void *xp, const float *ip, void *fillp)
 {
-	put_ix_float(xp, ip);
+    int err=NC_NOERR;
+    float *_ip=ip;
 #ifdef NO_IEEE_FLOAT
-	if(*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN)
-		return NC_ERANGE;
+    ifdef(`ERANGE_FILL',`float tmp;')
+    if (*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN) {
+        FillValue(float, &tmp)
+        ifdef(`ERANGE_FILL',`_ip = &tmp;')
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
+    }
 #endif
-	return NC_NOERR;
+    put_ix_float(xp, _ip);
+    return err;
 }
 #endif
 
-static NCX_PUT1F(float, schar)
-static NCX_PUT1F(float, short)
-static NCX_PUT1F(float, int)
-static NCX_PUT1F(float, double)
-static NCX_PUT1F(float, longlong)
-static NCX_PUT1F(float, uchar)
-static NCX_PUT1F(float, ushort)
-static NCX_PUT1F(float, uint)
-static NCX_PUT1F(float, ulonglong)
+NCX_PUT1F(float, schar)
+NCX_PUT1F(float, short)
+NCX_PUT1F(float, int)
+NCX_PUT1F(float, long)
+NCX_PUT1F(float, double)
+NCX_PUT1F(float, longlong)
+NCX_PUT1F(float, uchar)
+NCX_PUT1F(float, ushort)
+NCX_PUT1F(float, uint)
+NCX_PUT1F(float, ulonglong)
 
 
-/* x_double ------------------------------------------------------------------*/
+/* external NC_DOUBLE -------------------------------------------------------*/
 
 #if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE  && !defined(NO_IEEE_FLOAT)
 
@@ -1358,7 +1656,7 @@ static void
 get_ix_double(const void *xp, double *ip)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(ip, xp, sizeof(double));
+	(void) memcpy(ip, xp, SIZEOF_DOUBLE);
 #else
 	swap8b(ip, xp);
 #endif
@@ -1374,7 +1672,7 @@ put_ix_double(void *xp, const double *ip)
 #endif
 }
 
-#elif vax
+#elif defined(vax) && vax != 0
 
 /* What IEEE double precision floating point looks like on a Vax */
 struct	ieee_double {
@@ -1508,14 +1806,14 @@ define(`PUT_VAX_DDOUBLE_Body',dnl
 		unsigned mant_hi = (vdp->mantissa1 << 13)
 				 | (vdp->mantissa2 >> 3);
 
-		if((vdp->mantissa4 & 7) > 4)
+		if ((vdp->mantissa4 & 7) > 4)
 		{
 			/* round up */
 			mant_lo++;
-			if(mant_lo == 0)
+			if (mant_lo == 0)
 			{
 				mant_hi++;
-				if(mant_hi > 0xffffff)
+				if (mant_hi > 0xffffff)
 				{
 					mant_hi = 0;
 					exp++;
@@ -1549,11 +1847,11 @@ get_ix_double(const void *xp, double *ip)
 	const ieee_double *idp = (const ieee_double *) xp;
 	cray_single *csp = (cray_single *) ip;
 
-	if(idp->exp == 0)
+	if (idp->exp == 0)
 	{
 		/* ieee subnormal */
 		*ip = (double)idp->mant;
-		if(idp->mant != 0)
+		if (idp->mant != 0)
 		{
 			csp->exp -= (ieee_double_bias + 51);
 		}
@@ -1577,13 +1875,13 @@ put_ix_double(void *xp, const double *ip)
 
 	idp->sign = csp->sign;
 
-	if(ieee_exp >= 0x7ff)
+	if (ieee_exp >= 0x7ff)
 	{
 		/* NC_ERANGE => ieee Inf */
 		idp->exp = 0x7ff;
 		idp->mant = 0x0;
 	}
-	else if(ieee_exp > 0)
+	else if (ieee_exp > 0)
 	{
 		/* normal ieee representation */
 		idp->exp  = ieee_exp;
@@ -1592,14 +1890,14 @@ put_ix_double(void *xp, const double *ip)
 		idp->mant = (((csp->mant << 1) &
 				0xffffffffffff) << (52 - 48));
 	}
-	else if(ieee_exp >= (-(52 -48)))
+	else if (ieee_exp >= (-(52 -48)))
 	{
 		/* ieee subnormal, left shift */
 		const int lshift = (52 - 48) + ieee_exp;
 		idp->mant = csp->mant << lshift;
 		idp->exp  = 0;
 	}
-	else if(ieee_exp >= -52)
+	else if (ieee_exp >= -52)
 	{
 		/* ieee subnormal, right shift */
 		const int rshift = (- (52 - 48) - ieee_exp);
@@ -1607,7 +1905,7 @@ put_ix_double(void *xp, const double *ip)
 		idp->mant = csp->mant >> rshift;
 
 #if 0
-		if(csp->mant & (1 << (rshift -1)))
+		if (csp->mant & (1 << (rshift -1)))
 		{
 			/* round up */
 			idp->mant++;
@@ -1629,47 +1927,36 @@ put_ix_double(void *xp, const double *ip)
 
 #define ix_double double
 
-static NCX_GET1F(double, schar)
-static NCX_GET1F(double, short)
-static NCX_GET1F(double, int)
-static NCX_GET1F(double, longlong)
-static NCX_GET1F(double, uchar)
-static NCX_GET1F(double, ushort)
-static NCX_GET1F(double, uint)
-
-int
-ncx_get_double_ulonglong(const void *xp, unsigned long long *ip)
-{
-	double xx;
-	get_ix_double(xp, &xx);
-	*ip = (unsigned long long) xx;
-	if(xx > ULONG_LONG_MAX || xx < 0)
-		return NC_ERANGE;
-	return NC_NOERR;
-}
+NCX_GET1F(double, schar)
+NCX_GET1F(double, short)
+NCX_GET1F(double, int)
+NCX_GET1F(double, long)
+NCX_GET1F(double, longlong)
+NCX_GET1F(double, uchar)
+NCX_GET1F(double, ushort)
+NCX_GET1F(double, uint)
+NCX_GET1F(double, ulonglong)
 
 static int
-ncx_get_double_float(const void *xp, float *ip)
+APIPrefix`x_get_'NC_TYPE(double)_float(const void *xp, float *ip)
 {
-	double xx;
-	get_ix_double(xp, &xx);
-	if(xx > FLT_MAX)
-	{
-		*ip = FLT_MAX;
-		return NC_ERANGE;
-	}
-	if(xx < (-FLT_MAX))
-	{
-		*ip = (-FLT_MAX);
-		return NC_ERANGE;
-	}
-	*ip = (float) xx;
-	return NC_NOERR;
+    double xx;
+    get_ix_double(xp, &xx);
+    if (xx > FLT_MAX) {
+        ifdef(`ERANGE_FILL', `*ip = NC_FILL_FLOAT;', `*ip = FLT_MAX;')
+        DEBUG_RETURN_ERROR(NC_ERANGE)
+    }
+    if (xx < (-FLT_MAX)) {
+        ifdef(`ERANGE_FILL', `*ip = NC_FILL_FLOAT;', `*ip = (-FLT_MAX);')
+        DEBUG_RETURN_ERROR(NC_ERANGE)
+    }
+    *ip = (float) xx;
+    return NC_NOERR;
 }
 
 #if X_SIZEOF_DOUBLE != SIZEOF_DOUBLE  || defined(NO_IEEE_FLOAT)
 static int
-ncx_get_double_double(const void *xp, double *ip)
+APIPrefix`x_get_'NC_TYPE(double)_double(const void *xp, double *ip, void *fillp)
 {
 	/* TODO */
 	get_ix_double(xp, ip);
@@ -1677,182 +1964,208 @@ ncx_get_double_double(const void *xp, double *ip)
 }
 #endif
 
-static NCX_PUT1F(double, schar)
-static NCX_PUT1F(double, uchar)
-static NCX_PUT1F(double, short)
-static NCX_PUT1F(double, ushort)
-static NCX_PUT1F(double, int)
-static NCX_PUT1F(double, uint)
-static NCX_PUT1F(double, longlong)
-static NCX_PUT1F(double, ulonglong)
+NCX_PUT1F(double, schar)
+NCX_PUT1F(double, uchar)
+NCX_PUT1F(double, short)
+NCX_PUT1F(double, ushort)
+NCX_PUT1F(double, int)
+NCX_PUT1F(double, long)
+NCX_PUT1F(double, uint)
+NCX_PUT1F(double, longlong)
+NCX_PUT1F(double, ulonglong)
 
 static int
-ncx_put_double_float(void *xp, const float *ip)
+APIPrefix`x_put_'NC_TYPE(double)_float(void *xp, const float *ip, void *fillp)
 {
-	double xx = (double) *ip;
-	put_ix_double(xp, &xx);
-#if 1	/* TODO: figure this out */
-	if((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN)
-		return NC_ERANGE;
+    int err=NC_NOERR;
+    double xx = FillDefaultValue(double);
+#if 1	/* TODO: figure this out (if condition below will never be true)*/
+    if ((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN) {
+        FillValue(double, &xx)
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
+    } ifdef(`ERANGE_FILL',`else')
 #endif
-	return NC_NOERR;
+        xx = (double) *ip;
+
+    put_ix_double(xp, &xx);
+    return err;
 }
 
 #if X_SIZEOF_DOUBLE != SIZEOF_DOUBLE  || defined(NO_IEEE_FLOAT)
 static int
-ncx_put_double_double(void *xp, const double *ip)
+APIPrefix`x_put_'NC_TYPE(double)_double(void *xp, const double *ip, void *fillp)
 {
-	put_ix_double(xp, ip);
+    int err=NC_NOERR;
+    double *_ip = ip;
 #ifdef NO_IEEE_FLOAT
-	if(*ip > X_DOUBLE_MAX || *ip < X_DOUBLE_MIN)
-		return NC_ERANGE;
+    ifdef(`ERANGE_FILL',`double tmp=NC_FILL_DOUBLE;')
+    if (*ip > X_DOUBLE_MAX || *ip < X_DOUBLE_MIN) {
+        FillValue(double, &tmp)
+        ifdef(`ERANGE_FILL',`_ip = &tmp;')
+        DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
+    }
 #endif
-	return NC_NOERR;
+    put_ix_double(xp, _ip);
+    return err;
 }
 #endif
 
 
-/* x_longlong ---------------------------------------------------------------------*/
+/* external NC_INT64 --------------------------------------------------------*/
 
-#if SHORT_MAX == X_LONGLONG_MAX
-typedef short ix_longlong;
-#define SIZEOF_IX_LONGLONG SIZEOF_SHORT
-#define IX_LONGLONG_MAX SHORT_MAX
-#elif LONG_LONG_MAX  >= X_LONGLONG_MAX
-typedef longlong ix_longlong;
-#define SIZEOF_IX_LONGLONG SIZEOF_LONGLONG
-#define IX_LONGLONG_MAX LONG_LONG_MAX
-#elif LONG_MAX  >= X_LONGLONG_MAX
-typedef long ix_longlong;
-#define SIZEOF_IX_LONGLONG SIZEOF_LONG
-#define IX_LONGLONG_MAX LONG_MAX
+#if SHORT_MAX == X_INT64_MAX
+typedef short ix_int64;
+#define SIZEOF_IX_INT64 SIZEOF_SHORT
+#define IX_INT64_MAX SHORT_MAX
+#elif LONG_LONG_MAX  >= X_INT64_MAX
+typedef longlong ix_int64;
+#define SIZEOF_IX_INT64 SIZEOF_LONGLONG
+#define IX_INT64_MAX LONG_LONG_MAX
+#elif LONG_MAX  >= X_INT64_MAX
+typedef long ix_int64;
+#define SIZEOF_IX_INT64 SIZEOF_LONG
+#define IX_INT64_MAX LONG_MAX
 #else
-#error "ix_longlong implementation"
+#error "ix_int64 implementation"
 #endif
 
 
 static void
-get_ix_longlong(const void *xp, ix_longlong *ip)
+get_ix_int64(const void *xp, ix_int64 *ip)
 {
     const uchar *cp = (const uchar *) xp;
 
-    *ip  = ((long long)(*cp++) << 56);
-    *ip |= ((long long)(*cp++) << 48);
-    *ip |= ((long long)(*cp++) << 40);
-    *ip |= ((long long)(*cp++) << 32);
-    *ip |= ((long long)(*cp++) << 24);
-    *ip |= ((long long)(*cp++) << 16);
-    *ip |= ((long long)(*cp++) <<  8);
-    *ip |=  (long long)*cp;
+    *ip  = ((ix_int64)(*cp++) << 56);
+    *ip |= ((ix_int64)(*cp++) << 48);
+    *ip |= ((ix_int64)(*cp++) << 40);
+    *ip |= ((ix_int64)(*cp++) << 32);
+    *ip |= ((ix_int64)(*cp++) << 24);
+    *ip |= ((ix_int64)(*cp++) << 16);
+    *ip |= ((ix_int64)(*cp++) <<  8);
+    *ip |=  (ix_int64)*cp;
 }
 
 static void
-put_ix_longlong(void *xp, const ix_longlong *ip)
+put_ix_int64(void *xp, const ix_int64 *ip)
 {
     uchar *cp = (uchar *) xp;
 
-    *cp++ = (*ip) >> 56;
-    *cp++ = ((*ip) & 0x00ff000000000000LL) >> 48;
-    *cp++ = ((*ip) & 0x0000ff0000000000LL) >> 40;
-    *cp++ = ((*ip) & 0x000000ff00000000LL) >> 32;
-    *cp++ = ((*ip) & 0x00000000ff000000LL) >> 24;
-    *cp++ = ((*ip) & 0x0000000000ff0000LL) >> 16;
-    *cp++ = ((*ip) & 0x000000000000ff00LL) >>  8;
-    *cp   = ((*ip) & 0x00000000000000ffLL);
-}
-
-static NCX_GET1I(longlong, schar,     0)
-static NCX_GET1I(longlong, short,     1)
-static NCX_GET1I(longlong, int,       1)
-static NCX_GET1I(longlong, longlong,  1)
-static NCX_GET1I(longlong, ushort,    0)
-static NCX_GET1I(longlong, uchar,     0)
-static NCX_GET1I(longlong, uint,      0)
-static NCX_GET1I(longlong, ulonglong, 0)
-static NCX_GET1F(longlong, float)
-static NCX_GET1F(longlong, double)
-
-static NCX_PUT1I(longlong, schar,     0)
-static NCX_PUT1I(longlong, short,     1)
-static NCX_PUT1I(longlong, int,       1)
-static NCX_PUT1I(longlong, longlong,  1)
-static NCX_PUT1I(longlong, ushort,    0)
-static NCX_PUT1I(longlong, uchar,     0)
-static NCX_PUT1I(longlong, uint,      0)
-static NCX_PUT1I(longlong, ulonglong, 0)
-static NCX_PUT1F(longlong, float)
-static NCX_PUT1F(longlong, double)
-
-/* x_ulonglong --------------------------------------------------------------------*/
-
-#if USHORT_MAX == X_ULONGLONG_MAX
-typedef ushort ix_ulonglong;
-#define SIZEOF_IX_ULONGLONG SIZEOF_USHORT
-#define IX_ULONGLONG_MAX USHORT_MAX
-#elif ULONG_LONG_MAX  >= X_ULONGLONG_MAX
-typedef ulonglong ix_ulonglong;
-#define SIZEOF_IX_ULONGLONG SIZEOF_ULONGLONG
-#define IX_ULONGLONG_MAX ULONG_LONG_MAX
-#elif ULONG_MAX  >= X_ULONGLONG_MAX
-typedef ulong ix_ulonglong;
-#define SIZEOF_IX_ULONGLONG SIZEOF_ULONG
-#define IX_ULONGLONG_MAX ULONG_MAX
+    *cp++ = (uchar)((*ip) >> 56);
+    *cp++ = (uchar)(((*ip) & 0x00ff000000000000LL) >> 48);
+    *cp++ = (uchar)(((*ip) & 0x0000ff0000000000LL) >> 40);
+    *cp++ = (uchar)(((*ip) & 0x000000ff00000000LL) >> 32);
+    *cp++ = (uchar)(((*ip) & 0x00000000ff000000LL) >> 24);
+    *cp++ = (uchar)(((*ip) & 0x0000000000ff0000LL) >> 16);
+    *cp++ = (uchar)(((*ip) & 0x000000000000ff00LL) >>  8);
+    *cp   = (uchar)( (*ip) & 0x00000000000000ffLL);
+}
+
+#if X_SIZEOF_INT64 != SIZEOF_LONGLONG
+NCX_GET1I(int64, longlong,  1)
+#endif
+NCX_GET1I(int64, schar,     0)
+NCX_GET1I(int64, short,     1)
+NCX_GET1I(int64, int,       1)
+NCX_GET1I(int64, long,      1)
+NCX_GET1I(int64, ushort,    0)
+NCX_GET1I(int64, uchar,     0)
+NCX_GET1I(int64, uint,      0)
+NCX_GET1I(int64, ulonglong, 0)
+NCX_GET1F(int64, float)
+NCX_GET1F(int64, double)
+
+#if X_SIZEOF_INT64 != SIZEOF_LONGLONG
+NCX_PUT1I(int64, longlong,  1)
+#endif
+NCX_PUT1I(int64, schar,     0)
+NCX_PUT1I(int64, short,     1)
+NCX_PUT1I(int64, int,       1)
+NCX_PUT1I(int64, long,      1)
+NCX_PUT1I(int64, ushort,    0)
+NCX_PUT1I(int64, uchar,     0)
+NCX_PUT1I(int64, uint,      0)
+NCX_PUT1I(int64, ulonglong, 0)
+NCX_PUT1F(int64, float)
+NCX_PUT1F(int64, double)
+
+
+/* external NC_UINT64 -------------------------------------------------------*/
+
+#if USHORT_MAX == X_UINT64_MAX
+typedef ushort ix_uint64;
+#define SIZEOF_IX_UINT64 SIZEOF_USHORT
+#define IX_UINT64_MAX USHORT_MAX
+#elif ULONG_LONG_MAX  >= X_UINT64_MAX
+typedef ulonglong ix_uint64;
+#define SIZEOF_IX_UINT64 SIZEOF_ULONGLONG
+#define IX_UINT64_MAX ULONG_LONG_MAX
+#elif ULONG_MAX  >= X_UINT64_MAX
+typedef ulong ix_uint64;
+#define SIZEOF_IX_UINT64 SIZEOF_ULONG
+#define IX_UINT64_MAX ULONG_MAX
 #else
-#error "ix_ulonglong implementation"
+#error "ix_uint64 implementation"
 #endif
 
 
 static void
-get_ix_ulonglong(const void *xp, ix_ulonglong *ip)
+get_ix_uint64(const void *xp, ix_uint64 *ip)
 {
     const uchar *cp = (const uchar *) xp;
 
-    *ip  = ((unsigned long long)(*cp++) << 56);
-    *ip |= ((unsigned long long)(*cp++) << 48);
-    *ip |= ((unsigned long long)(*cp++) << 40);
-    *ip |= ((unsigned long long)(*cp++) << 32);
-    *ip |= ((unsigned long long)(*cp++) << 24);
-    *ip |= ((unsigned long long)(*cp++) << 16);
-    *ip |= ((unsigned long long)(*cp++) <<  8);
-    *ip |=  (unsigned long long)*cp;
+    *ip  = ((ix_uint64)(*cp++) << 56);
+    *ip |= ((ix_uint64)(*cp++) << 48);
+    *ip |= ((ix_uint64)(*cp++) << 40);
+    *ip |= ((ix_uint64)(*cp++) << 32);
+    *ip |= ((ix_uint64)(*cp++) << 24);
+    *ip |= ((ix_uint64)(*cp++) << 16);
+    *ip |= ((ix_uint64)(*cp++) <<  8);
+    *ip |=  (ix_uint64)*cp;
 }
 
 static void
-put_ix_ulonglong(void *xp, const ix_ulonglong *ip)
+put_ix_uint64(void *xp, const ix_uint64 *ip)
 {
     uchar *cp = (uchar *) xp;
 
-    *cp++ = (*ip) >> 56;
-    *cp++ = ((*ip) & 0x00ff000000000000ULL) >> 48;
-    *cp++ = ((*ip) & 0x0000ff0000000000ULL) >> 40;
-    *cp++ = ((*ip) & 0x000000ff00000000ULL) >> 32;
-    *cp++ = ((*ip) & 0x00000000ff000000ULL) >> 24;
-    *cp++ = ((*ip) & 0x0000000000ff0000ULL) >> 16;
-    *cp++ = ((*ip) & 0x000000000000ff00ULL) >>  8;
-    *cp   = ((*ip) & 0x00000000000000ffULL);
-}
-
-static NCX_GET1I(ulonglong, schar,     0)
-static NCX_GET1I(ulonglong, short,     0)
-static NCX_GET1I(ulonglong, int,       0)
-static NCX_GET1I(ulonglong, longlong,  0)
-static NCX_GET1I(ulonglong, ushort,    1)
-static NCX_GET1I(ulonglong, uchar,     1)
-static NCX_GET1I(ulonglong, uint,      1)
-static NCX_GET1I(ulonglong, ulonglong, 1)
-static NCX_GET1F(ulonglong, float)
-static NCX_GET1F(ulonglong, double)
-
-static NCX_PUT1I(ulonglong, schar,     0)
-static NCX_PUT1I(ulonglong, short,     0)
-static NCX_PUT1I(ulonglong, int,       0)
-static NCX_PUT1I(ulonglong, longlong,  0)
-static NCX_PUT1I(ulonglong, uchar,     1)
-static NCX_PUT1I(ulonglong, ushort,    1)
-static NCX_PUT1I(ulonglong, uint,      1)
-static NCX_PUT1I(ulonglong, ulonglong, 1)
-static NCX_PUT1F(ulonglong, float)
-static NCX_PUT1F(ulonglong, double)
+    *cp++ = (uchar)((*ip) >> 56);
+    *cp++ = (uchar)(((*ip) & 0x00ff000000000000ULL) >> 48);
+    *cp++ = (uchar)(((*ip) & 0x0000ff0000000000ULL) >> 40);
+    *cp++ = (uchar)(((*ip) & 0x000000ff00000000ULL) >> 32);
+    *cp++ = (uchar)(((*ip) & 0x00000000ff000000ULL) >> 24);
+    *cp++ = (uchar)(((*ip) & 0x0000000000ff0000ULL) >> 16);
+    *cp++ = (uchar)(((*ip) & 0x000000000000ff00ULL) >>  8);
+    *cp   = (uchar)( (*ip) & 0x00000000000000ffULL);
+}
+
+#if X_SIZEOF_UINT64 != SIZEOF_ULONGLONG
+NCX_GET1I(uint64, ulonglong, 1)
+#endif
+NCX_GET1I(uint64, schar,     0)
+NCX_GET1I(uint64, short,     0)
+NCX_GET1I(uint64, int,       0)
+NCX_GET1I(uint64, long,      0)
+NCX_GET1I(uint64, longlong,  0)
+NCX_GET1I(uint64, ushort,    1)
+NCX_GET1I(uint64, uchar,     1)
+NCX_GET1I(uint64, uint,      1)
+NCX_GET1F(uint64, float)
+NCX_GET1F(uint64, double)
+
+#if X_SIZEOF_UINT64 != SIZEOF_ULONGLONG
+NCX_PUT1I(uint64, ulonglong, 1)
+#endif
+NCX_PUT1I(uint64, schar,     0)
+NCX_PUT1I(uint64, short,     0)
+NCX_PUT1I(uint64, int,       0)
+NCX_PUT1I(uint64, long,      0)
+NCX_PUT1I(uint64, longlong,  0)
+NCX_PUT1I(uint64, uchar,     1)
+NCX_PUT1I(uint64, ushort,    1)
+NCX_PUT1I(uint64, uint,      1)
+NCX_PUT1F(uint64, float)
+NCX_PUT1F(uint64, double)
+
 
 /* x_size_t */
 
@@ -1862,7 +2175,7 @@ static NCX_PUT1F(ulonglong, double)
 #endif
 
 int
-ncx_put_size_t(void **xpp, const size_t *ulp)
+APIPrefix`x_put_size_t'(void **xpp, const size_t *ulp)
 {
 	/* similar to put_ix_int() */
 	uchar *cp = (uchar *) *xpp;
@@ -1878,12 +2191,12 @@ ncx_put_size_t(void **xpp, const size_t *ulp)
 }
 
 int
-ncx_get_size_t(const void **xpp,  size_t *ulp)
+APIPrefix`x_get_size_t'(const void **xpp,  size_t *ulp)
 {
 	/* similar to get_ix_int */
 	const uchar *cp = (const uchar *) *xpp;
 
-	*ulp = (unsigned)(*cp++ << 24);
+	*ulp  = (unsigned)(*cp++ << 24);
 	*ulp |= (*cp++ << 16);
 	*ulp |= (*cp++ << 8);
 	*ulp |= *cp;
@@ -1895,18 +2208,19 @@ ncx_get_size_t(const void **xpp,  size_t *ulp)
 /* x_off_t */
 
 int
-ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t)
+APIPrefix`x_put_off_t'(void **xpp, const off_t *lp, size_t sizeof_off_t)
 {
-	/* similar to put_ix_int() */
-	uchar *cp = (uchar *) *xpp;
-		/* No negative offsets stored in netcdf */
+	/* No negative offsets stored in netcdf */
 	if (*lp < 0) {
 	  /* Assume this is an overflow of a 32-bit int... */
-	  return NC_ERANGE;
+	  DEBUG_RETURN_ERROR(NC_ERANGE)
 	}
 
 	assert(sizeof_off_t == 4 || sizeof_off_t == 8);
 
+	/* similar to put_ix_int() */
+	uchar *cp = (uchar *) *xpp;
+
 	if (sizeof_off_t == 4) {
 		*cp++ = (uchar) ((*lp)               >> 24);
 		*cp++ = (uchar)(((*lp) & 0x00ff0000) >> 16);
@@ -1926,13 +2240,13 @@ ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t)
 		*cp   = (uchar)( (*lp) & 0x000000ff);
 #else
 		*cp++ = (uchar) ((*lp)                          >> 56);
-		*cp++ = (uchar)(((*lp) & 0x00ff000000000000ULL) >> 48);
-		*cp++ = (uchar)(((*lp) & 0x0000ff0000000000ULL) >> 40);
-		*cp++ = (uchar)(((*lp) & 0x000000ff00000000ULL) >> 32);
-		*cp++ = (uchar)(((*lp) & 0x00000000ff000000ULL) >> 24);
-		*cp++ = (uchar)(((*lp) & 0x0000000000ff0000ULL) >> 16);
-		*cp++ = (uchar)(((*lp) & 0x000000000000ff00ULL) >>  8);
-		*cp   = (uchar)( (*lp) & 0x00000000000000ffULL);
+		*cp++ = (uchar)(((*lp) & 0x00ff000000000000LL) >> 48);
+		*cp++ = (uchar)(((*lp) & 0x0000ff0000000000LL) >> 40);
+		*cp++ = (uchar)(((*lp) & 0x000000ff00000000LL) >> 32);
+		*cp++ = (uchar)(((*lp) & 0x00000000ff000000LL) >> 24);
+		*cp++ = (uchar)(((*lp) & 0x0000000000ff0000LL) >> 16);
+		*cp++ = (uchar)(((*lp) & 0x000000000000ff00LL) >>  8);
+		*cp   = (uchar)( (*lp) & 0x00000000000000ffLL);
 #endif
 	}
 	*xpp = (void *)((char *)(*xpp) + sizeof_off_t);
@@ -1940,7 +2254,7 @@ ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t)
 }
 
 int
-ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t)
+APIPrefix`x_get_off_t'(const void **xpp, off_t *lp, size_t sizeof_off_t)
 {
 	/* similar to get_ix_int() */
 	const uchar *cp = (const uchar *) *xpp;
@@ -1965,7 +2279,7 @@ ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t)
  * on this system.  Set an error code and return.
  */
 		if (*lp != 0) {
-		  return NC_ERANGE;
+		  DEBUG_RETURN_ERROR(NC_ERANGE)
 		}
 
 		*lp  = ((off_t)(*cp++) << 24);
@@ -1979,7 +2293,7 @@ ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t)
 		   * than 2^32 which is not allowed, but is not caught
 		   * by the previous check
 		   */
-		  return NC_ERANGE;
+		  DEBUG_RETURN_ERROR(NC_ERANGE)
 		}
 #else
 		*lp =  ((off_t)(*cp++) << 56);
@@ -1996,62 +2310,68 @@ ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t)
 	return NC_NOERR;
 }
 
-/*----< ncx_get_int32() >--------------------------------------------------*/
+/*----< APIPrefix`x_get_uint32'() >------------------------------------------*/
 int
-ncx_get_int32(const void **xpp,
-              int         *ip)
+APIPrefix`x_get_uint32'(const void **xpp, uint *ip)
 {
+#ifdef WORDS_BIGENDIAN
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(ip, *xpp, SIZEOF_UINT);
+#else
     const uchar *cp = (const uchar *) *xpp;
 
-    /* cannot call swap4b(), as lp is 8-byte */
-    *ip  = (*cp++ << 24);
-    *ip |= (*cp++ << 16);
-    *ip |= (*cp++ <<  8);
-    *ip |=  *cp;
-
+    *ip = (uint)(*cp++ << 24);
+    *ip = (uint)(*ip | (uint)(*cp++ << 16));
+    *ip = (uint)(*ip | (uint)(*cp++ <<  8));
+    *ip = (uint)(*ip | *cp);
+#endif
     /* advance *xpp 4 bytes */
     *xpp = (void *)((const char *)(*xpp) + 4);
 
     return NC_NOERR;
 }
 
-/*----< ncx_get_int64() >-------------------------------------------------*/
+/*----< APIPrefix`x_get_uint64'() >------------------------------------------*/
 int
-ncx_get_int64(const void **xpp,
-              long long   *llp)
+APIPrefix`x_get_uint64'(const void **xpp, unsigned long long *ullp)
 {
+#ifdef WORDS_BIGENDIAN
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(ullp, *xpp, SIZEOF_UINT64);
+#else
     const uchar *cp = (const uchar *) *xpp;
 
-    /* below is the same as calling swap8b(llp, *xpp) */
-    *llp  = ((long long)(*cp++) << 56);
-    *llp |= ((long long)(*cp++) << 48);
-    *llp |= ((long long)(*cp++) << 40);
-    *llp |= ((long long)(*cp++) << 32);
-    *llp |= ((long long)(*cp++) << 24);
-    *llp |= ((long long)(*cp++) << 16);
-    *llp |= ((long long)(*cp++) <<  8);
-    *llp |=  (long long)*cp;
-
+    /* below is the same as calling swap8b(ullp, *xpp) */
+    *ullp = (unsigned long long)(*cp++) << 56;
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 48);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 40);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 32);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 24);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) << 16);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp++) <<  8);
+    *ullp = (unsigned long long)(*ullp | (unsigned long long)(*cp));
+#endif
     /* advance *xpp 8 bytes */
     *xpp = (void *)((const char *)(*xpp) + 8);
 
     return NC_NOERR;
 }
 
-/*---< ncx_put_int32() >-----------------------------------------------------*/
-/* copy the contents of lp (a signed 32-bit integer) to xpp in Big Endian
+/*---< APIPrefix`x_put_uint32'() >-------------------------------------------*/
+/* copy the contents of ip (an unsigned 32-bit integer) to xpp in Big Endian
  * form and advance *xpp 4 bytes
  */
 int
-ncx_put_int32(void      **xpp,
-              const int   ip)
+APIPrefix`x_put_uint32'(void **xpp, const unsigned int ip)
 {
 #ifdef WORDS_BIGENDIAN
-    int *ptr = (int*) (*xpp); /* typecast to 4-byte integer */
-    *ptr = ip;
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(*xpp, &ip, X_SIZEOF_UINT);
 #else
     /* bitwise shifts below are to produce an integer in Big Endian */
-    /* cannot call swap4b(), as lp is 8-byte */
     uchar *cp = (uchar *) *xpp;
     *cp++ = (uchar)((ip & 0xff000000) >> 24);
     *cp++ = (uchar)((ip & 0x00ff0000) >> 16);
@@ -2064,28 +2384,28 @@ ncx_put_int32(void      **xpp,
     return NC_NOERR;
 }
 
-/*---< ncx_put_int64() >-----------------------------------------------------*/
-/* copy the contents of lp (a signed 64-bit integer) to xpp in Big Endian
+/*---< APIPrefix`x_put_uint64'() >-------------------------------------------*/
+/* copy the contents of ip (an unsigned 64-bit integer) to xpp in Big Endian
  * form and advance *xpp 8 bytes
  */
 int
-ncx_put_int64(void             **xpp,
-              const long long    ip)
+APIPrefix`x_put_uint64'(void **xpp, const unsigned long long ip)
 {
 #ifdef WORDS_BIGENDIAN
-    long long *ptr = (long long*) (*xpp); /* typecast to 8-byte integer */
-    *ptr = ip;
+    /* use memcpy instead of assignment to avoid BUS_ADRALN alignment error on
+     * some system, such as HPUX */
+    (void) memcpy(*xpp, &ip, X_SIZEOF_UINT64);
 #else
     uchar *cp = (uchar *) *xpp;
     /* below is the same as calling swap8b(*xpp, &ip) */
-    *cp++ = (uchar)((ip & 0xff00000000000000ULL) >> 56);
-    *cp++ = (uchar)((ip & 0x00ff000000000000ULL) >> 48);
-    *cp++ = (uchar)((ip & 0x0000ff0000000000ULL) >> 40);
-    *cp++ = (uchar)((ip & 0x000000ff00000000ULL) >> 32);
-    *cp++ = (uchar)((ip & 0x00000000ff000000ULL) >> 24);
-    *cp++ = (uchar)((ip & 0x0000000000ff0000ULL) >> 16);
-    *cp++ = (uchar)((ip & 0x000000000000ff00ULL) >>  8);
-    *cp   = (uchar)( ip & 0x00000000000000ffULL);
+    *cp++ = (uchar) (ip                         >> 56);
+    *cp++ = (uchar)((ip & 0x00ff000000000000LL) >> 48);
+    *cp++ = (uchar)((ip & 0x0000ff0000000000LL) >> 40);
+    *cp++ = (uchar)((ip & 0x000000ff00000000LL) >> 32);
+    *cp++ = (uchar)((ip & 0x00000000ff000000LL) >> 24);
+    *cp++ = (uchar)((ip & 0x0000000000ff0000LL) >> 16);
+    *cp++ = (uchar)((ip & 0x000000000000ff00LL) >>  8);
+    *cp   = (uchar) (ip & 0x00000000000000ffLL);
 #endif
     /* advance *xpp 8 bytes */
     *xpp  = (void *)((char *)(*xpp) + 8);
@@ -2098,8 +2418,8 @@ ncx_put_int64(void             **xpp,
  * Aggregate numeric conversion functions.
  */
 dnl
-define(`GETN_CheckBND', `ifelse(index(`$1',`u'), 0, , `ifelse(index(`$2',`u'), 0, `|| xp[i] < 0', `|| xp[i] < Imin($2)')')')dnl
-define(`PUTN_CheckBND', `ifelse(index(`$2',`u'), 0, , `ifelse(index(`$1',`u'), 0, `|| tp[i] < 0', `|| tp[i] < Xmin($1)')')')dnl
+define(`GETN_CheckBND', `ifelse(index(`$1',`u'), 0, , index(`$2',`u'), 0, `|| xp[i] < 0', `|| xp[i] < Imin($2)')')dnl
+define(`PUTN_CheckBND', `ifelse(index(`$2',`u'), 0, , index(`$1',`u'), 0, `|| tp[i] < 0', `|| tp[i] < Xmin($1)')')dnl
 
 dnl
 dnl dnl dnl
@@ -2108,8 +2428,8 @@ dnl NCX_GETN_Byte_Body (body for one byte types on diagonal)
 dnl
 define(`NCX_GETN_Byte_Body',dnl
 `dnl
-	(void) memcpy(tp, *xpp, nelems);
-	*xpp = (void *)((schar *)(*xpp) + nelems);
+	(void) memcpy(tp, *xpp, (size_t)nelems);
+	*xpp = (void *)((char *)(*xpp) + nelems);
 	return NC_NOERR;
 ')dnl
 dnl dnl dnl
@@ -2118,99 +2438,86 @@ dnl NCX_PAD_GETN_Byte_body (body for one byte types on diagonal)
 dnl
 define(`NCX_PAD_GETN_Byte_Body',dnl
 `dnl
-	size_t rndup = nelems % X_ALIGN;
+	IntType rndup = nelems % X_ALIGN;
 
-	if(rndup)
+	if (rndup)
 		rndup = X_ALIGN - rndup;
 
-	(void) memcpy(tp, *xpp, nelems);
+	(void) memcpy(tp, *xpp, (size_t)nelems);
 	*xpp = (void *)((char *)(*xpp) + nelems + rndup);
 
 	return NC_NOERR;
 ')dnl
 dnl dnl dnl
 dnl
-dnl NCX_GETN_CHAR(Type)
+dnl NCX_GETN_BYTE(xtype, itype)
 dnl
-define(`NCX_GETN_CHAR',dnl
+define(`NCX_GETN_BYTE',dnl
 `dnl
 int
-ncx_getn_$1_$2(const void **xpp, size_t nelems, $2 *tp)
+APIPrefix`x_getn_'NC_TYPE($1)_$2(const void **xpp, IntType nelems, $2 *tp)
 {
-	int status = NC_NOERR;
-	$1 *xp = ($1 *)(*xpp);
+    int status = NC_NOERR;
+    $1 *xp = ($1 *)(*xpp);
 
-	while(nelems-- != 0)
-	{
-ifelse(index(`$1',`u'), 0, , `ifelse(index(`$2',`u'), 0, `		if (*xp < 0) status = NC_ERANGE;')')
-		*tp++ = *xp++;
-	}
+    while (nelems-- != 0) {
+        ifelse(index(`$1',`u'), 0, ,
+               index(`$2',`u'), 0, `
+        if (*xp < 0) {
+            ifdef(`ERANGE_FILL',`*tp = FillDefaultValue($2);')
+            DEBUG_ASSIGN_ERROR(status, NC_ERANGE) /* because tp is unsigned */
+            SKIP_LOOP(xp, tp)
+        }')dnl
 
-	*xpp = (const void *)xp;
-	return status;
+        *tp++ = ($2) Cast_Signed2Unsigned($2,$1) (*xp++);  /* type cast from $1 to $2 */
+    }
+
+    *xpp = (const void *)xp;
+    return status;
 }
 ')dnl
 dnl dnl dnl
 dnl
-dnl NCX_PAD_GETN_CHAR(Type)
+dnl NCX_PAD_GETN_BYTE(xtype, itype)
 dnl
-define(`NCX_PAD_GETN_CHAR',dnl
+define(`NCX_PAD_GETN_BYTE',dnl
 `dnl
 int
-ncx_pad_getn_$1_$2(const void **xpp, size_t nelems, $2 *tp)
+APIPrefix`x_pad_getn_'NC_TYPE($1)_$2(const void **xpp, IntType nelems, $2 *tp)
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	$1 *xp = ($1 *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
+    int status = NC_NOERR;
+    IntType rndup = nelems % X_ALIGN;
+    $1 *xp = ($1 *) *xpp;
 
-	while(nelems-- != 0)
-	{
-ifelse(index(`$1',`u'), 0, , `ifelse(index(`$2',`u'), 0, `		if (*xp < 0) status = NC_ERANGE;')')
-		*tp++ = *xp++;
-	}
+    if (rndup)
+        rndup = X_ALIGN - rndup;
 
-	*xpp = (void *)(xp + rndup);
-	return status;
-}
-')dnl
-dnl dnl dnl
-dnl
-dnl NCX_GETNo(XType, Type) deprecated
-dnl
-define(`NCX_GETNo',dnl
-`dnl
-int
-ncx_getn_$1_$2(const void **xpp, size_t nelems, $2 *tp)
-{
-	const char *xp = (const char *) *xpp;
-	int status = NC_NOERR;
-	$1 xx;
+    while (nelems-- != 0) {
+        ifelse(index(`$1',`u'), 0, ,
+               index(`$2',`u'), 0, `
+        if (*xp < 0) {
+            ifdef(`ERANGE_FILL', `*tp = FillDefaultValue($2);')
+            DEBUG_ASSIGN_ERROR(status, NC_ERANGE) /* because tp is unsigned */
+            SKIP_LOOP(xp, tp)
+        }')dnl
 
-	for( ; nelems != 0; nelems--, xp += Xsizeof($1), tp++)
-	{
-		const int lstatus = ncx_get_$1_$1(xp, &xx);
-		*tp = ($2)xx;
-		if(lstatus != NC_NOERR)
-			status = lstatus;
-	}
+        *tp++ = ($2) Cast_Signed2Unsigned($2,$1) (*xp++);  /* type cast from $1 to $2 */
+    }
 
-	*xpp = (const void *)xp;
-	return status;
+    *xpp = (void *)(xp + rndup);
+    return status;
 }
 ')dnl
 dnl dnl dnl
 dnl
-dnl NCX_GETN(XType, Type, condition)
+dnl NCX_GETN(xtype, itype)
 dnl
 define(`NCX_GETN',dnl
 `dnl
 int
-ncx_getn_$1_$2(const void **xpp, size_t nelems, $2 *tp)
+APIPrefix`x_getn_'NC_TYPE($1)_$2(const void **xpp, IntType nelems, $2 *tp)
 {
-`#'if _SX && Xsizeof($1) == Isizeof($1)
+`#'if defined(_SX) && _SX != 0 && Xsizeof($1) == Isizeof($1)
 
  /* basic algorithm is:
   *   - ensure sane alignment of input data
@@ -2233,7 +2540,7 @@ ncx_getn_$1_$2(const void **xpp, size_t nelems, $2 *tp)
   for (j=0; j<nelems && nrange==0; j+=LOOPCNT) {
     ni=Min(nelems-j,LOOPCNT);
     if (realign) {
-      memcpy(tmp, *xpp, ni*Isizeof($1));
+      memcpy(tmp, *xpp, (size_t)(ni*Isizeof($1)));
       xp = tmp;
     } else {
       xp = ($1 *) *xpp;
@@ -2262,14 +2569,14 @@ ncx_getn_$1_$2(const void **xpp, size_t nelems, $2 *tp)
 
 	for( ; nelems != 0; nelems--, xp += Xsizeof($1), tp++)
 	{
-		const int lstatus = ncx_get_$1_$2(xp, tp);
-		if(lstatus != NC_NOERR)
+		const int lstatus = APIPrefix`x_get_'NC_TYPE($1)_$2(xp, tp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
 	*xpp = (const void *)xp;
 	return status;
-#  endif
+#endif
 }
 ')dnl
 dnl dnl dnl
@@ -2279,22 +2586,23 @@ dnl
 define(`NCX_PAD_GETN_SHORT',dnl
 `dnl
 int
-ncx_pad_getn_$1_$2(const void **xpp, size_t nelems, $2 *tp)
+APIPrefix`x_pad_getn_'NC_TYPE($1)_$2(const void **xpp, IntType nelems, $2 *tp)
 {
-	const size_t rndup = nelems % 2;
+	const IntType rndup = nelems % X_SIZEOF_SHORT;
 
 	const char *xp = (const char *) *xpp;
 	int status = NC_NOERR;
 
 	for( ; nelems != 0; nelems--, xp += Xsizeof($1), tp++)
 	{
-		const int lstatus = ncx_get_$1_$2(xp, tp);
-		if(lstatus != NC_NOERR)
+		const int lstatus = APIPrefix`x_get_'NC_TYPE($1)_$2(xp, tp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
-	if(rndup != 0)
+	if (rndup != 0)
 		xp += Xsizeof($1);
+
 	*xpp = (void *)xp;
 	return status;
 }
@@ -2305,7 +2613,7 @@ dnl NCX_PUTN_Byte_Body(Type) (body for one byte types)
 dnl
 define(`NCX_PUTN_Byte_Body',dnl
 `dnl
-	(void) memcpy(*xpp, tp, nelems);
+	(void) memcpy(*xpp, tp, (size_t)nelems);
 	*xpp = (void *)((char *)(*xpp) + nelems);
 
 	return NC_NOERR;
@@ -2315,17 +2623,17 @@ dnl
 dnl NCX_PAD_PUTN_Byte_Body(Type) (body for one byte types)
 dnl
 define(`NCX_PAD_PUTN_Byte_Body',dnl
-	size_t rndup = nelems % X_ALIGN;
+	IntType rndup = nelems % X_ALIGN;
 
-	if(rndup)
+	if (rndup)
 		rndup = X_ALIGN - rndup;
 
-	(void) memcpy(*xpp, tp, nelems);
+	(void) memcpy(*xpp, tp, (size_t)nelems);
 	*xpp = (void *)((char *)(*xpp) + nelems);
 
-	if(rndup)
+	if (rndup)
 	{
-		(void) memcpy(*xpp, nada, rndup);
+		(void) memcpy(*xpp, nada, (size_t)rndup);
 		*xpp = (void *)((char *)(*xpp) + rndup);
 	}
 
@@ -2334,98 +2642,73 @@ define(`NCX_PAD_PUTN_Byte_Body',dnl
 ')dnl
 dnl dnl dnl
 dnl
-dnl NCX_PUTN_CHAR(Type)
+dnl NCX_PUTN_BYTE(xtype, itype)
 dnl
-define(`NCX_PUTN_CHAR',dnl
+define(`NCX_PUTN_BYTE',dnl
 `dnl
 int
-ncx_putn_$1_$2(void **xpp, size_t nelems, const $2 *tp)
+APIPrefix`x_putn_'NC_TYPE($1)_$2(void **xpp, IntType nelems, const $2 *tp, void *fillp)
 {
-	int status = NC_NOERR;
-	$1 *xp = ($1 *) *xpp;
+    int status = NC_NOERR;
+    $1 *xp = ($1 *) *xpp;
 
-	while(nelems-- != 0)
-	{
-		if(*tp > Xmax($1) ifelse(index(`$2',`u'), 0, , `ifelse(index(`$1',`u'), 0, `|| *tp < 0',`|| *tp < Xmin(schar)')'))
-			status = NC_ERANGE;
-		*xp++ = ($1) (signed)*tp++;
-	}
+    while (nelems-- != 0) {
+        if (*tp > ($2)Xmax($1) ifelse(index(`$2',`u'), 0, , index(`$1',`u'), 0, `|| *tp < 0',`|| *tp < Xmin(schar)')) {
+            FillValue($1, xp)
+            DEBUG_ASSIGN_ERROR(status, NC_ERANGE)
+            SKIP_LOOP(xp, tp)
+        }
+        *xp++ = ($1) Cast_Signed2Unsigned($1,$2) *tp++; /* type cast from $2 to $1 */
+    }
 
-	*xpp = (void *)xp;
-	return status;
+    *xpp = (void *)xp;
+    return status;
 }
 ')dnl
 dnl dnl dnl
 dnl
-dnl NCX_PAD_PUTN_CHAR(xtype, ttype)
+dnl NCX_PAD_PUTN_BYTE(xtype, ttype)
 dnl
-define(`NCX_PAD_PUTN_CHAR',dnl
+define(`NCX_PAD_PUTN_BYTE',dnl
 `dnl
 int
-ncx_pad_putn_$1_$2(void **xpp, size_t nelems, const $2 *tp)
+APIPrefix`x_pad_putn_'NC_TYPE($1)_$2(void **xpp, IntType nelems, const $2 *tp, void *fillp)
 {
-	int status = NC_NOERR;
-	size_t rndup = nelems % X_ALIGN;
-	$1 *xp = ($1 *) *xpp;
-
-	if(rndup)
-		rndup = X_ALIGN - rndup;
+    int status = NC_NOERR;
+    IntType rndup = nelems % X_ALIGN;
+    $1 *xp = ($1 *) *xpp;
 
-	while(nelems-- != 0)
-	{
-		if(*tp > Xmax($1) ifelse(index(`$2',`u'), 0, , `ifelse(index(`$1',`u'), 0, `|| *tp < 0',`|| *tp < Xmin(schar)')'))
-			status = NC_ERANGE;
-		*xp++ = ($1) (signed) *tp++;
-	}
+    if (rndup) rndup = X_ALIGN - rndup;
 
+    while (nelems-- != 0) {
+        if (*tp > ($2)Xmax($1) ifelse(index(`$2',`u'), 0, , index(`$1',`u'), 0, `|| *tp < 0',`|| *tp < Xmin(schar)')) {
+            FillValue($1, xp)
+            DEBUG_ASSIGN_ERROR(status, NC_ERANGE)
+            SKIP_LOOP(xp, tp)
+        }
+        *xp++ = ($1) Cast_Signed2Unsigned($1,$2) *tp++; /* type cast from $2 to $1 */
+    }
 
-	if(rndup)
-	{
-		(void) memcpy(xp, nada, rndup);
-		xp += rndup;
-	}
 
-	*xpp = (void *)xp;
-	return status;
-}
-')dnl
-dnl dnl dnl
-dnl
-dnl NCX_PUTNo(XType, Type) deprecated
-dnl
-define(`NCX_PUTNo',dnl
-`dnl
-int
-ncx_putn_$1_$2(void **xpp, size_t nelems, const $2 *tp)
-{
-	char *xp = (char *) *xpp;
-	int status = NC_NOERR;
-	$1 xx;
-
-	for( ; nelems != 0; nelems--, xp += Xsizeof($1), tp++)
-	{
-		xx = ($1) *tp;
-		{
-		int lstatus = ncx_put_$1_$1(xp, &xx);
-		if(lstatus != NC_NOERR)
-			status = lstatus;
-		}
-	}
+    if (rndup) {
+        (void) memcpy(xp, nada, (size_t)rndup);
+        xp += rndup;
+    }
 
-	*xpp = (void *)xp;
-	return status;
+    *xpp = (void *)xp;
+    return status;
 }
 ')dnl
 dnl dnl dnl
 dnl
-dnl NCX_PUTN(XType, Type, condition)
+dnl NCX_PUTN(xtype, itype)
 dnl
 define(`NCX_PUTN',dnl
 `dnl
 int
-ncx_putn_$1_$2(void **xpp, size_t nelems, const $2 *tp)
+APIPrefix`x_putn_'NC_TYPE($1)_$2(void **xpp, IntType nelems, const $2 *tp, void *fillp)
 {
-`#'if _SX && Xsizeof($1) == Isizeof($1)
+`#'if defined(_SX) && _SX != 0 && Xsizeof($1) == Isizeof($1)
 
  /* basic algorithm is:
   *   - ensure sane alignment of output data
@@ -2439,7 +2722,7 @@ ncx_putn_$1_$2(void **xpp, size_t nelems, const $2 *tp)
   $1 *xp;
 ifelse( $1$2, intfloat,dnl
 `dnl
-  double d;               /* special case for ncx_putn_int_float */
+  double d;               /* special case for APIPrefix`x_putn_int_float' */
 ')dnl
   int nrange = 0;         /* number of range errors */
   int realign = 0;        /* "do we need to fix input data alignment?" */
@@ -2478,7 +2761,7 @@ ifelse( $1$2, intfloat,dnl
     }
    /* copy workspace back if necessary */
     if (realign) {
-      memcpy(*xpp, tmp, ni*Xsizeof($1));
+      memcpy(*xpp, tmp, (size_t)*ni*Xsizeof($1));
       xp = ($1 *) *xpp;
     }
    /* update xpp and tp */
@@ -2495,8 +2778,8 @@ ifelse( $1$2, intfloat,dnl
 
 	for( ; nelems != 0; nelems--, xp += Xsizeof($1), tp++)
 	{
-		int lstatus = ncx_put_$1_$2(xp, tp);
-		if(lstatus != NC_NOERR)
+		int lstatus = APIPrefix`x_put_'NC_TYPE($1)_$2(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
@@ -2512,23 +2795,23 @@ dnl
 define(`NCX_PAD_PUTN_SHORT',dnl
 `dnl
 int
-ncx_pad_putn_$1_$2(void **xpp, size_t nelems, const $2 *tp)
+APIPrefix`x_pad_putn_'NC_TYPE($1)_$2(void **xpp, IntType nelems, const $2 *tp, void *fillp)
 {
-	const size_t rndup = nelems % 2;
+	const IntType rndup = nelems % X_SIZEOF_SHORT;
 
 	char *xp = (char *) *xpp;
 	int status = NC_NOERR;
 
 	for( ; nelems != 0; nelems--, xp += Xsizeof($1), tp++)
 	{
-		int lstatus = ncx_put_$1_$2(xp, tp);
-		if(lstatus != NC_NOERR)
+		int lstatus = APIPrefix`x_put_'NC_TYPE($1)_$2(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
-	if(rndup != 0)
+	if (rndup != 0)
 	{
-		(void) memcpy(xp, nada, Xsizeof($1));
+		(void) memcpy(xp, nada, (size_t)(Xsizeof($1)));
 		xp += Xsizeof($1);
 	}
 
@@ -2545,186 +2828,237 @@ dnl dnl dnl
 
 /* schar ---------------------------------------------------------------------*/
 
-dnl NCX_GETN_CHAR(schar, schar)
-int
-ncx_getn_schar_schar(const void **xpp, size_t nelems, schar *tp)
-{
-	NCX_GETN_Byte_Body
-}
-dnl NCX_GETN_CHAR(schar, uchar)
+dnl NCX_GETN_BYTE(schar, schar)
 int
-ncx_getn_schar_uchar(const void **xpp, size_t nelems, uchar *tp)
+APIPrefix`x_getn_'NC_TYPE(schar)_schar(const void **xpp, IntType nelems, schar *tp)
 {
 	NCX_GETN_Byte_Body
 }
-NCX_GETN_CHAR(schar, short)
-NCX_GETN_CHAR(schar, int)
-NCX_GETN_CHAR(schar, float)
-NCX_GETN_CHAR(schar, double)
-NCX_GETN_CHAR(schar, longlong)
-NCX_GETN_CHAR(schar, ushort)
-NCX_GETN_CHAR(schar, uint)
-NCX_GETN_CHAR(schar, ulonglong)
+NCX_GETN_BYTE(schar, uchar)
+NCX_GETN_BYTE(schar, short)
+NCX_GETN_BYTE(schar, int)
+NCX_GETN_BYTE(schar, long)
+NCX_GETN_BYTE(schar, float)
+NCX_GETN_BYTE(schar, double)
+NCX_GETN_BYTE(schar, longlong)
+NCX_GETN_BYTE(schar, ushort)
+NCX_GETN_BYTE(schar, uint)
+NCX_GETN_BYTE(schar, ulonglong)
 
-dnl NCX_PAD_GETN_CHAR(schar, schar)
+dnl NCX_PAD_GETN_BYTE(schar, schar)
 int
-ncx_pad_getn_schar_schar(const void **xpp, size_t nelems, schar *tp)
+APIPrefix`x_pad_getn_'NC_TYPE(schar)_schar(const void **xpp, IntType nelems, schar *tp)
 {
 	NCX_PAD_GETN_Byte_Body
 }
-dnl NCX_PAD_GETN_CHAR(schar, uchar)
-int
-ncx_pad_getn_schar_uchar(const void **xpp, size_t nelems, uchar *tp)
-{
-	NCX_PAD_GETN_Byte_Body
-}
-NCX_PAD_GETN_CHAR(schar, short)
-NCX_PAD_GETN_CHAR(schar, int)
-NCX_PAD_GETN_CHAR(schar, float)
-NCX_PAD_GETN_CHAR(schar, double)
-NCX_PAD_GETN_CHAR(schar, longlong)
-NCX_PAD_GETN_CHAR(schar, ushort)
-NCX_PAD_GETN_CHAR(schar, uint)
-NCX_PAD_GETN_CHAR(schar, ulonglong)
+NCX_PAD_GETN_BYTE(schar, uchar)
+NCX_PAD_GETN_BYTE(schar, short)
+NCX_PAD_GETN_BYTE(schar, int)
+NCX_PAD_GETN_BYTE(schar, long)
+NCX_PAD_GETN_BYTE(schar, float)
+NCX_PAD_GETN_BYTE(schar, double)
+NCX_PAD_GETN_BYTE(schar, longlong)
+NCX_PAD_GETN_BYTE(schar, ushort)
+NCX_PAD_GETN_BYTE(schar, uint)
+NCX_PAD_GETN_BYTE(schar, ulonglong)
 
-dnl NCX_PUTN_CHAR(schar, schar)
-int
-ncx_putn_schar_schar(void **xpp, size_t nelems, const schar *tp)
-{
-	NCX_PUTN_Byte_Body
-}
-dnl NCX_PUTN_CHAR(schar, uchar)
+dnl NCX_PUTN_BYTE(schar, schar)
 int
-ncx_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp)
+APIPrefix`x_putn_'NC_TYPE(schar)_schar(void **xpp, IntType nelems, const schar *tp, void *fillp)
 {
 	NCX_PUTN_Byte_Body
 }
-NCX_PUTN_CHAR(schar, short)
-NCX_PUTN_CHAR(schar, int)
-NCX_PUTN_CHAR(schar, float)
-NCX_PUTN_CHAR(schar, double)
-NCX_PUTN_CHAR(schar, longlong)
-NCX_PUTN_CHAR(schar, ushort)
-NCX_PUTN_CHAR(schar, uint)
-NCX_PUTN_CHAR(schar, ulonglong)
+NCX_PUTN_BYTE(schar, uchar)
+NCX_PUTN_BYTE(schar, short)
+NCX_PUTN_BYTE(schar, int)
+NCX_PUTN_BYTE(schar, long)
+NCX_PUTN_BYTE(schar, float)
+NCX_PUTN_BYTE(schar, double)
+NCX_PUTN_BYTE(schar, longlong)
+NCX_PUTN_BYTE(schar, ushort)
+NCX_PUTN_BYTE(schar, uint)
+NCX_PUTN_BYTE(schar, ulonglong)
 
-dnl NCX_PAD_PUTN_CHAR(schar, schar)
+dnl NCX_PAD_PUTN_BYTE(schar, schar)
 int
-ncx_pad_putn_schar_schar(void **xpp, size_t nelems, const schar *tp)
+APIPrefix`x_pad_putn_'NC_TYPE(schar)_schar(void **xpp, IntType nelems, const schar *tp, void *fillp)
 {
 	NCX_PAD_PUTN_Byte_Body
 }
-dnl NCX_PAD_PUTN_CHAR(schar, uchar)
-int
-ncx_pad_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp)
-{
-	NCX_PAD_PUTN_Byte_Body
-}
-NCX_PAD_PUTN_CHAR(schar, short)
-NCX_PAD_PUTN_CHAR(schar, int)
-NCX_PAD_PUTN_CHAR(schar, float)
-NCX_PAD_PUTN_CHAR(schar, double)
-NCX_PAD_PUTN_CHAR(schar, longlong)
-NCX_PAD_PUTN_CHAR(schar, ushort)
-NCX_PAD_PUTN_CHAR(schar, uint)
-NCX_PAD_PUTN_CHAR(schar, ulonglong)
+NCX_PAD_PUTN_BYTE(schar, uchar)
+NCX_PAD_PUTN_BYTE(schar, short)
+NCX_PAD_PUTN_BYTE(schar, int)
+NCX_PAD_PUTN_BYTE(schar, long)
+NCX_PAD_PUTN_BYTE(schar, float)
+NCX_PAD_PUTN_BYTE(schar, double)
+NCX_PAD_PUTN_BYTE(schar, longlong)
+NCX_PAD_PUTN_BYTE(schar, ushort)
+NCX_PAD_PUTN_BYTE(schar, uint)
+NCX_PAD_PUTN_BYTE(schar, ulonglong)
 
 
 /* uchar ---------------------------------------------------------------------*/
 dnl
-dnl NCX_GETN_CHAR(uchar, schar)
+dnl NCX_GETN_BYTE(uchar, schar)
 int
-ncx_getn_uchar_schar(const void **xpp, size_t nelems, schar *tp)
+APIPrefix`x_getn_'NC_TYPE(uchar)_schar(const void **xpp, IntType nelems, schar *tp)
 {
-	NCX_GETN_Byte_Body
+    int status = NC_NOERR;
+    uchar *xp = (uchar *)(*xpp);
+
+    while (nelems-- != 0) {
+        if (*xp > SCHAR_MAX) {
+            *tp = NC_FILL_BYTE;
+       	    DEBUG_ASSIGN_ERROR(status, NC_ERANGE)
+            SKIP_LOOP(xp, tp)
+        }
+	*tp++ = (schar) *xp++; /* type cast from uchar to schar */
+    }
+
+    *xpp = (const void *)xp;
+    return status;
 }
-dnl NCX_GETN_CHAR(uchar, uchar)
+dnl NCX_GETN_BYTE(uchar, uchar)
 int
-ncx_getn_uchar_uchar(const void **xpp, size_t nelems, uchar *tp)
+APIPrefix`x_getn_'NC_TYPE(uchar)_uchar(const void **xpp, IntType nelems, uchar *tp)
 {
 	NCX_GETN_Byte_Body
 }
-NCX_GETN_CHAR(uchar, short)
-NCX_GETN_CHAR(uchar, int)
-NCX_GETN_CHAR(uchar, float)
-NCX_GETN_CHAR(uchar, double)
-NCX_GETN_CHAR(uchar, longlong)
-NCX_GETN_CHAR(uchar, ushort)
-NCX_GETN_CHAR(uchar, uint)
-NCX_GETN_CHAR(uchar, ulonglong)
+NCX_GETN_BYTE(uchar, short)
+NCX_GETN_BYTE(uchar, int)
+NCX_GETN_BYTE(uchar, long)
+NCX_GETN_BYTE(uchar, float)
+NCX_GETN_BYTE(uchar, double)
+NCX_GETN_BYTE(uchar, longlong)
+NCX_GETN_BYTE(uchar, ushort)
+NCX_GETN_BYTE(uchar, uint)
+NCX_GETN_BYTE(uchar, ulonglong)
+
+dnl NCX_PAD_GETN_BYTE(uchar, schar)
+int
+APIPrefix`x_pad_getn_'NC_TYPE(uchar)_schar(const void **xpp, IntType nelems, schar *tp)
+{
+    int status = NC_NOERR;
+    IntType rndup = nelems % X_ALIGN;
+    uchar *xp = (uchar *) *xpp;
+
+    if (rndup) rndup = X_ALIGN - rndup;
+
+    while (nelems-- != 0) {
+        if (*xp > SCHAR_MAX) {
+            *tp = NC_FILL_BYTE;
+            DEBUG_ASSIGN_ERROR(status, NC_ERANGE)
+            SKIP_LOOP(xp, tp)
+        }
+        *tp++ = (schar) *xp++; /* type cast from uchar to schar */
+    }
 
-dnl NCX_PAD_GETN_CHAR(uchar, schar)
-int
-ncx_pad_getn_uchar_schar(const void **xpp, size_t nelems, schar *tp)
-{
-	NCX_PAD_GETN_Byte_Body
+    *xpp = (void *)(xp + rndup);
+    return status;
 }
-dnl NCX_PAD_GETN_CHAR(uchar, uchar)
+dnl NCX_PAD_GETN_BYTE(uchar, uchar)
 int
-ncx_pad_getn_uchar_uchar(const void **xpp, size_t nelems, uchar *tp)
+APIPrefix`x_pad_getn_'NC_TYPE(uchar)_uchar(const void **xpp, IntType nelems, uchar *tp)
 {
 	NCX_PAD_GETN_Byte_Body
 }
-NCX_PAD_GETN_CHAR(uchar, short)
-NCX_PAD_GETN_CHAR(uchar, int)
-NCX_PAD_GETN_CHAR(uchar, float)
-NCX_PAD_GETN_CHAR(uchar, double)
-NCX_PAD_GETN_CHAR(uchar, longlong)
-NCX_PAD_GETN_CHAR(uchar, ushort)
-NCX_PAD_GETN_CHAR(uchar, uint)
-NCX_PAD_GETN_CHAR(uchar, ulonglong)
+NCX_PAD_GETN_BYTE(uchar, short)
+NCX_PAD_GETN_BYTE(uchar, int)
+NCX_PAD_GETN_BYTE(uchar, long)
+NCX_PAD_GETN_BYTE(uchar, float)
+NCX_PAD_GETN_BYTE(uchar, double)
+NCX_PAD_GETN_BYTE(uchar, longlong)
+NCX_PAD_GETN_BYTE(uchar, ushort)
+NCX_PAD_GETN_BYTE(uchar, uint)
+NCX_PAD_GETN_BYTE(uchar, ulonglong)
+
+dnl NCX_PUTN_BYTE(uchar, schar)
+int
+APIPrefix`x_putn_'NC_TYPE(uchar)_schar(void **xpp, IntType nelems, const schar *tp, void *fillp)
+{
+    int status = NC_NOERR;
+    uchar *xp = (uchar *) *xpp;
+
+    while (nelems-- != 0) {
+        if (*tp < 0) {
+            FillValue(uchar, xp)
+            DEBUG_ASSIGN_ERROR(status, NC_ERANGE)
+            SKIP_LOOP(xp, tp)
+        }
+        *xp++ = (uchar) (signed) *tp++; /* type cast from schar to uchar */
+    }
 
-dnl NCX_PUTN_CHAR(uchar, schar)
-int
-ncx_putn_uchar_schar(void **xpp, size_t nelems, const schar *tp)
-{
-	NCX_PUTN_Byte_Body
+    *xpp = (void *)xp;
+    return status;
 }
-dnl NCX_PUTN_CHAR(uchar, uchar)
+dnl NCX_PUTN_BYTE(uchar, uchar)
 int
-ncx_putn_uchar_uchar(void **xpp, size_t nelems, const uchar *tp)
+APIPrefix`x_putn_'NC_TYPE(uchar)_uchar(void **xpp, IntType nelems, const uchar *tp, void *fillp)
 {
 	NCX_PUTN_Byte_Body
 }
-NCX_PUTN_CHAR(uchar, short)
-NCX_PUTN_CHAR(uchar, int)
-NCX_PUTN_CHAR(uchar, float)
-NCX_PUTN_CHAR(uchar, double)
-NCX_PUTN_CHAR(uchar, longlong)
-NCX_PUTN_CHAR(uchar, ushort)
-NCX_PUTN_CHAR(uchar, uint)
-NCX_PUTN_CHAR(uchar, ulonglong)
+NCX_PUTN_BYTE(uchar, short)
+NCX_PUTN_BYTE(uchar, int)
+NCX_PUTN_BYTE(uchar, long)
+NCX_PUTN_BYTE(uchar, float)
+NCX_PUTN_BYTE(uchar, double)
+NCX_PUTN_BYTE(uchar, longlong)
+NCX_PUTN_BYTE(uchar, ushort)
+NCX_PUTN_BYTE(uchar, uint)
+NCX_PUTN_BYTE(uchar, ulonglong)
+
+dnl NCX_PAD_PUTN_BYTE(uchar, schar)
+int
+APIPrefix`x_pad_putn_'NC_TYPE(uchar)_schar(void **xpp, IntType nelems, const schar *tp, void *fillp)
+{
+    int status = NC_NOERR;
+    IntType rndup = nelems % X_ALIGN;
+    uchar *xp = (uchar *) *xpp;
+
+    if (rndup) rndup = X_ALIGN - rndup;
+
+    while (nelems-- != 0) {
+        if (*tp < 0) {
+            FillValue(uchar, xp)
+            DEBUG_ASSIGN_ERROR(status, NC_ERANGE)
+            SKIP_LOOP(xp, tp)
+        }
+        *xp++ = (uchar) (signed) *tp++; /* type cast from schar to uchar */
+    }
 
-dnl NCX_PAD_PUTN_UCHAR(uchar, schar)
-int
-ncx_pad_putn_uchar_schar(void **xpp, size_t nelems, const schar *tp)
-{
-	NCX_PAD_PUTN_Byte_Body
+    if (rndup) {
+        (void) memcpy(xp, nada, (size_t)rndup);
+        xp += rndup;
+    }
+
+    *xpp = (void *)xp;
+    return status;
 }
 dnl NCX_PAD_PUTN_UCHAR(uchar, uchar)
 int
-ncx_pad_putn_uchar_uchar(void **xpp, size_t nelems, const uchar *tp)
+APIPrefix`x_pad_putn_'NC_TYPE(uchar)_uchar(void **xpp, IntType nelems, const uchar *tp, void *fillp)
 {
 	NCX_PAD_PUTN_Byte_Body
 }
-NCX_PAD_PUTN_CHAR(uchar, short)
-NCX_PAD_PUTN_CHAR(uchar, int)
-NCX_PAD_PUTN_CHAR(uchar, float)
-NCX_PAD_PUTN_CHAR(uchar, double)
-NCX_PAD_PUTN_CHAR(uchar, longlong)
-NCX_PAD_PUTN_CHAR(uchar, ushort)
-NCX_PAD_PUTN_CHAR(uchar, uint)
-NCX_PAD_PUTN_CHAR(uchar, ulonglong)
+NCX_PAD_PUTN_BYTE(uchar, short)
+NCX_PAD_PUTN_BYTE(uchar, int)
+NCX_PAD_PUTN_BYTE(uchar, long)
+NCX_PAD_PUTN_BYTE(uchar, float)
+NCX_PAD_PUTN_BYTE(uchar, double)
+NCX_PAD_PUTN_BYTE(uchar, longlong)
+NCX_PAD_PUTN_BYTE(uchar, ushort)
+NCX_PAD_PUTN_BYTE(uchar, uint)
+NCX_PAD_PUTN_BYTE(uchar, ulonglong)
 
 /* short ---------------------------------------------------------------------*/
 
 #if X_SIZEOF_SHORT == SIZEOF_SHORT
 /* optimized version */
 int
-ncx_getn_short_short(const void **xpp, size_t nelems, short *tp)
+APIPrefix`x_getn_'NC_TYPE(short)_short(const void **xpp, IntType nelems, short *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(short));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_SHORT);
 # else
 	swapn2b(tp, *xpp, nelems);
 # endif
@@ -2736,6 +3070,7 @@ NCX_GETN(short, short)
 #endif
 NCX_GETN(short, schar)
 NCX_GETN(short, int)
+NCX_GETN(short, long)
 NCX_GETN(short, float)
 NCX_GETN(short, double)
 NCX_GETN(short, longlong)
@@ -2748,6 +3083,7 @@ NCX_PAD_GETN_SHORT(short, schar)
 NCX_PAD_GETN_SHORT(short, uchar)
 NCX_PAD_GETN_SHORT(short, short)
 NCX_PAD_GETN_SHORT(short, int)
+NCX_PAD_GETN_SHORT(short, long)
 NCX_PAD_GETN_SHORT(short, float)
 NCX_PAD_GETN_SHORT(short, double)
 NCX_PAD_GETN_SHORT(short, uint)
@@ -2758,10 +3094,10 @@ NCX_PAD_GETN_SHORT(short, ushort)
 #if X_SIZEOF_SHORT == SIZEOF_SHORT
 /* optimized version */
 int
-ncx_putn_short_short(void **xpp, size_t nelems, const short *tp)
+APIPrefix`x_putn_'NC_TYPE(short)_short(void **xpp, IntType nelems, const short *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_SHORT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_SHORT);
 # else
 	swapn2b(*xpp, tp, nelems);
 # endif
@@ -2773,6 +3109,7 @@ NCX_PUTN(short, short)
 #endif
 NCX_PUTN(short, schar)
 NCX_PUTN(short, int)
+NCX_PUTN(short, long)
 NCX_PUTN(short, float)
 NCX_PUTN(short, double)
 NCX_PUTN(short, longlong)
@@ -2785,6 +3122,7 @@ NCX_PAD_PUTN_SHORT(short, schar)
 NCX_PAD_PUTN_SHORT(short, uchar)
 NCX_PAD_PUTN_SHORT(short, short)
 NCX_PAD_PUTN_SHORT(short, int)
+NCX_PAD_PUTN_SHORT(short, long)
 NCX_PAD_PUTN_SHORT(short, float)
 NCX_PAD_PUTN_SHORT(short, double)
 NCX_PAD_PUTN_SHORT(short, uint)
@@ -2798,10 +3136,10 @@ NCX_PAD_PUTN_SHORT(short, ushort)
 #if X_SIZEOF_USHORT == SIZEOF_USHORT
 /* optimized version */
 int
-ncx_getn_ushort_ushort(const void **xpp, size_t nelems, unsigned short *tp)
+APIPrefix`x_getn_'NC_TYPE(ushort)_ushort(const void **xpp, IntType nelems, unsigned short *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(unsigned short));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_USHORT);
 # else
 	swapn2b(tp, *xpp, nelems);
 # endif
@@ -2814,6 +3152,7 @@ NCX_GETN(ushort, ushort)
 NCX_GETN(ushort, schar)
 NCX_GETN(ushort, short)
 NCX_GETN(ushort, int)
+NCX_GETN(ushort, long)
 NCX_GETN(ushort, float)
 NCX_GETN(ushort, double)
 NCX_GETN(ushort, longlong)
@@ -2822,23 +3161,24 @@ NCX_GETN(ushort, uint)
 NCX_GETN(ushort, ulonglong)
 
 NCX_PAD_GETN_SHORT(ushort, schar)
-NCX_PAD_GETN_SHORT(ushort, uchar)
 NCX_PAD_GETN_SHORT(ushort, short)
-NCX_PAD_GETN_SHORT(ushort, ushort)
 NCX_PAD_GETN_SHORT(ushort, int)
-NCX_PAD_GETN_SHORT(ushort, uint)
+NCX_PAD_GETN_SHORT(ushort, long)
 NCX_PAD_GETN_SHORT(ushort, float)
 NCX_PAD_GETN_SHORT(ushort, double)
+NCX_PAD_GETN_SHORT(ushort, uchar)
+NCX_PAD_GETN_SHORT(ushort, ushort)
+NCX_PAD_GETN_SHORT(ushort, uint)
 NCX_PAD_GETN_SHORT(ushort, longlong)
 NCX_PAD_GETN_SHORT(ushort, ulonglong)
 
 #if X_SIZEOF_USHORT == SIZEOF_USHORT
 /* optimized version */
 int
-ncx_putn_ushort_ushort(void **xpp, size_t nelems, const unsigned short *tp)
+APIPrefix`x_putn_'NC_TYPE(ushort)_ushort(void **xpp, IntType nelems, const unsigned short *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_USHORT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_USHORT);
 # else
 	swapn2b(*xpp, tp, nelems);
 # endif
@@ -2851,6 +3191,7 @@ NCX_PUTN(ushort, ushort)
 NCX_PUTN(ushort, schar)
 NCX_PUTN(ushort, short)
 NCX_PUTN(ushort, int)
+NCX_PUTN(ushort, long)
 NCX_PUTN(ushort, float)
 NCX_PUTN(ushort, double)
 NCX_PUTN(ushort, longlong)
@@ -2862,6 +3203,7 @@ NCX_PAD_PUTN_SHORT(ushort, schar)
 NCX_PAD_PUTN_SHORT(ushort, uchar)
 NCX_PAD_PUTN_SHORT(ushort, short)
 NCX_PAD_PUTN_SHORT(ushort, int)
+NCX_PAD_PUTN_SHORT(ushort, long)
 NCX_PAD_PUTN_SHORT(ushort, float)
 NCX_PAD_PUTN_SHORT(ushort, double)
 NCX_PAD_PUTN_SHORT(ushort, uint)
@@ -2875,10 +3217,10 @@ NCX_PAD_PUTN_SHORT(ushort, ushort)
 #if X_SIZEOF_INT == SIZEOF_INT
 /* optimized version */
 int
-ncx_getn_int_int(const void **xpp, size_t nelems, int *tp)
+APIPrefix`x_getn_'NC_TYPE(int)_int(const void **xpp, IntType nelems, int *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(int));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_INT);
 # else
 	swapn4b(tp, *xpp, nelems);
 # endif
@@ -2890,6 +3232,7 @@ NCX_GETN(int, int)
 #endif
 NCX_GETN(int, schar)
 NCX_GETN(int, short)
+NCX_GETN(int, long)
 NCX_GETN(int, float)
 NCX_GETN(int, double)
 NCX_GETN(int, longlong)
@@ -2901,10 +3244,10 @@ NCX_GETN(int, ulonglong)
 #if X_SIZEOF_INT == SIZEOF_INT
 /* optimized version */
 int
-ncx_putn_int_int(void **xpp, size_t nelems, const int *tp)
+APIPrefix`x_putn_'NC_TYPE(int)_int(void **xpp, IntType nelems, const int *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_INT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_INT);
 # else
 	swapn4b(*xpp, tp, nelems);
 # endif
@@ -2916,6 +3259,7 @@ NCX_PUTN(int, int)
 #endif
 NCX_PUTN(int, schar)
 NCX_PUTN(int, short)
+NCX_PUTN(int, long)
 NCX_PUTN(int, float)
 NCX_PUTN(int, double)
 NCX_PUTN(int, longlong)
@@ -2929,10 +3273,10 @@ NCX_PUTN(int, ulonglong)
 #if X_SIZEOF_UINT == SIZEOF_UINT
 /* optimized version */
 int
-ncx_getn_uint_uint(const void **xpp, size_t nelems, unsigned int *tp)
+APIPrefix`x_getn_'NC_TYPE(uint)_uint(const void **xpp, IntType nelems, unsigned int *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(uint));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_UINT);
 # else
 	swapn4b(tp, *xpp, nelems);
 # endif
@@ -2945,6 +3289,7 @@ NCX_GETN(uint, uint)
 NCX_GETN(uint, schar)
 NCX_GETN(uint, short)
 NCX_GETN(uint, int)
+NCX_GETN(uint, long)
 NCX_GETN(uint, float)
 NCX_GETN(uint, double)
 NCX_GETN(uint, longlong)
@@ -2955,10 +3300,10 @@ NCX_GETN(uint, ulonglong)
 #if X_SIZEOF_UINT == SIZEOF_UINT
 /* optimized version */
 int
-ncx_putn_uint_uint(void **xpp, size_t nelems, const unsigned int *tp)
+APIPrefix`x_putn_'NC_TYPE(uint)_uint(void **xpp, IntType nelems, const unsigned int *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_UINT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_UINT);
 # else
 	swapn4b(*xpp, tp, nelems);
 # endif
@@ -2971,6 +3316,7 @@ NCX_PUTN(uint, uint)
 NCX_PUTN(uint, schar)
 NCX_PUTN(uint, short)
 NCX_PUTN(uint, int)
+NCX_PUTN(uint, long)
 NCX_PUTN(uint, float)
 NCX_PUTN(uint, double)
 NCX_PUTN(uint, longlong)
@@ -2984,23 +3330,23 @@ NCX_PUTN(uint, ulonglong)
 #if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT)
 /* optimized version */
 int
-ncx_getn_float_float(const void **xpp, size_t nelems, float *tp)
+APIPrefix`x_getn_'NC_TYPE(float)_float(const void **xpp, IntType nelems, float *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(float));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_FLOAT);
 # else
 	swapn4b(tp, *xpp, nelems);
 # endif
 	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_FLOAT);
 	return NC_NOERR;
 }
-#elif vax
+#elif defined(vax) && vax != 0
 int
-ncx_getn_float_float(const void **xpp, size_t nfloats, float *ip)
+APIPrefix`x_getn_'NC_TYPE(float)_float(const void **xpp, IntType nfloats, float *ip)
 {
 	float *const end = ip + nfloats;
 
-	while(ip < end)
+	while (ip < end)
 	{
 GET_VAX_DFLOAT_Body(`(*xpp)')
 
@@ -3011,15 +3357,15 @@ GET_VAX_DFLOAT_Body(`(*xpp)')
 }
 #else
 int
-ncx_getn_float_float(const void **xpp, size_t nelems, float *tp)
+APIPrefix`x_getn_'NC_TYPE(float)_float(const void **xpp, IntType nelems, float *tp)
 {
 	const char *xp = *xpp;
 	int status = NC_NOERR;
 
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
 	{
-		const int lstatus = ncx_get_float_float(xp, tp);
-		if(lstatus != NC_NOERR)
+		const int lstatus = APIPrefix`x_get_'NC_TYPE(float)_float(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
@@ -3031,6 +3377,7 @@ ncx_getn_float_float(const void **xpp, size_t nelems, float *tp)
 NCX_GETN(float, schar)
 NCX_GETN(float, short)
 NCX_GETN(float, int)
+NCX_GETN(float, long)
 NCX_GETN(float, double)
 NCX_GETN(float, longlong)
 NCX_GETN(float, ushort)
@@ -3038,45 +3385,38 @@ NCX_GETN(float, uchar)
 NCX_GETN(float, uint)
 NCX_GETN(float, ulonglong)
 
+int
+APIPrefix`x_putn_'NC_TYPE(float)_float(void **xpp, IntType nelems, const float *tp, void *fillp)
 #if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT)
 /* optimized version */
-int
-ncx_putn_float_float(void **xpp, size_t nelems, const float *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_FLOAT);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_FLOAT);
 # else
 	swapn4b(*xpp, tp, nelems);
 # endif
 	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_FLOAT);
 	return NC_NOERR;
 }
-#elif vax
-int
-ncx_putn_float_float(void **xpp, size_t nfloats, const float *ip)
+#elif defined(vax) && vax != 0
 {
-	const float *const end = ip + nfloats;
-
-	while(ip < end)
-	{
-PUT_VAX_DFLOAT_Body(`(*xpp)')
+	const float *const end = tp + nelems;
 
-		ip++;
+	while (tp < end) {
+		PUT_VAX_DFLOAT_Body(`(*xpp)')
+		tp++;
 		*xpp = (char *)(*xpp) + X_SIZEOF_FLOAT;
 	}
 	return NC_NOERR;
 }
 #else
-int
-ncx_putn_float_float(void **xpp, size_t nelems, const float *tp)
 {
 	char *xp = *xpp;
 	int status = NC_NOERR;
 
-	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++)
-	{
-		int lstatus = ncx_put_float_float(xp, tp);
-		if(lstatus != NC_NOERR)
+	for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) {
+		int lstatus = APIPrefix`x_put_'NC_TYPE(float)_float(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
@@ -3087,6 +3427,7 @@ ncx_putn_float_float(void **xpp, size_t nelems, const float *tp)
 NCX_PUTN(float, schar)
 NCX_PUTN(float, short)
 NCX_PUTN(float, int)
+NCX_PUTN(float, long)
 NCX_PUTN(float, double)
 NCX_PUTN(float, longlong)
 NCX_PUTN(float, uchar)
@@ -3099,23 +3440,23 @@ NCX_PUTN(float, ulonglong)
 #if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE && !defined(NO_IEEE_FLOAT)
 /* optimized version */
 int
-ncx_getn_double_double(const void **xpp, size_t nelems, double *tp)
+APIPrefix`x_getn_'NC_TYPE(double)_double(const void **xpp, IntType nelems, double *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(double));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_DOUBLE);
 # else
 	swapn8b(tp, *xpp, nelems);
 # endif
 	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_DOUBLE);
 	return NC_NOERR;
 }
-#elif vax
+#elif defined(vax) && vax != 0
 int
-ncx_getn_double_double(const void **xpp, size_t ndoubles, double *ip)
+APIPrefix`x_getn_'NC_TYPE(double)_double(const void **xpp, IntType ndoubles, double *ip)
 {
 	double *const end = ip + ndoubles;
 
-	while(ip < end)
+	while (ip < end)
 	{
 GET_VAX_DDOUBLE_Body(`(*xpp)')
 		ip++;
@@ -3126,15 +3467,15 @@ GET_VAX_DDOUBLE_Body(`(*xpp)')
 	/* vax */
 #else
 int
-ncx_getn_double_double(const void **xpp, size_t nelems, double *tp)
+APIPrefix`x_getn_'NC_TYPE(double)_double(const void **xpp, IntType nelems, double *tp)
 {
 	const char *xp = *xpp;
 	int status = NC_NOERR;
 
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
 	{
-		const int lstatus = ncx_get_double_double(xp, tp);
-		if(lstatus != NC_NOERR)
+		const int lstatus = APIPrefix`x_get_'NC_TYPE(double)_double(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
@@ -3145,6 +3486,7 @@ ncx_getn_double_double(const void **xpp, size_t nelems, double *tp)
 NCX_GETN(double, schar)
 NCX_GETN(double, short)
 NCX_GETN(double, int)
+NCX_GETN(double, long)
 NCX_GETN(double, float)
 NCX_GETN(double, longlong)
 NCX_GETN(double, uchar)
@@ -3155,23 +3497,23 @@ NCX_GETN(double, ulonglong)
 #if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE && !defined(NO_IEEE_FLOAT)
 /* optimized version */
 int
-ncx_putn_double_double(void **xpp, size_t nelems, const double *tp)
+APIPrefix`x_putn_'NC_TYPE(double)_double(void **xpp, IntType nelems, const double *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_DOUBLE);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_DOUBLE);
 # else
 	swapn8b(*xpp, tp, nelems);
 # endif
 	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_DOUBLE);
 	return NC_NOERR;
 }
-#elif vax
+#elif defined(vax) && vax != 0
 int
-ncx_putn_double_double(void **xpp, size_t ndoubles, const double *ip)
+APIPrefix`x_putn_'NC_TYPE(double)_double(void **xpp, IntType ndoubles, const double *ip, void *fillp)
 {
 	const double *const end = ip + ndoubles;
 
-	while(ip < end)
+	while (ip < end)
 	{
 PUT_VAX_DDOUBLE_Body(`(*xpp)')
 		ip++;
@@ -3182,15 +3524,15 @@ PUT_VAX_DDOUBLE_Body(`(*xpp)')
 	/* vax */
 #else
 int
-ncx_putn_double_double(void **xpp, size_t nelems, const double *tp)
+APIPrefix`x_putn_'NC_TYPE(double)_double(void **xpp, IntType nelems, const double *tp, void *fillp)
 {
 	char *xp = *xpp;
 	int status = NC_NOERR;
 
 	for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++)
 	{
-		int lstatus = ncx_put_double_double(xp, tp);
-		if(lstatus != NC_NOERR)
+		int lstatus = APIPrefix`x_put_'NC_TYPE(double)_double(xp, tp, fillp);
+		if (status == NC_NOERR) /* report the first encountered error */
 			status = lstatus;
 	}
 
@@ -3201,6 +3543,7 @@ ncx_putn_double_double(void **xpp, size_t nelems, const double *tp)
 NCX_PUTN(double, schar)
 NCX_PUTN(double, short)
 NCX_PUTN(double, int)
+NCX_PUTN(double, long)
 NCX_PUTN(double, float)
 NCX_PUTN(double, longlong)
 NCX_PUTN(double, uchar)
@@ -3209,113 +3552,117 @@ NCX_PUTN(double, uint)
 NCX_PUTN(double, ulonglong)
 
 
-/* longlong -----------------------------------------------------------------------*/
+/* longlong ------------------------------------------------------------------*/
 
-#if X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+#if X_SIZEOF_INT64 == SIZEOF_LONGLONG
 /* optimized version */
 int
-ncx_getn_longlong_longlong(const void **xpp, size_t nelems, long long *tp)
+APIPrefix`x_getn_'NC_TYPE(int64)_longlong(const void **xpp, IntType nelems, long long *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(long long));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_LONG_LONG);
 # else
 	swapn8b(tp, *xpp, nelems);
 # endif
-	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_LONGLONG);
+	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_INT64);
 	return NC_NOERR;
 }
 #else
-NCX_GETN(longlong, longlong)
-#endif
-NCX_GETN(longlong, schar)
-NCX_GETN(longlong, short)
-NCX_GETN(longlong, int)
-NCX_GETN(longlong, float)
-NCX_GETN(longlong, double)
-NCX_GETN(longlong, uchar)
-NCX_GETN(longlong, ushort)
-NCX_GETN(longlong, uint)
-NCX_GETN(longlong, ulonglong)
-
-#if X_SIZEOF_LONGLONG == SIZEOF_LONGLONG
+NCX_GETN(int64, longlong)
+#endif
+NCX_GETN(int64, schar)
+NCX_GETN(int64, short)
+NCX_GETN(int64, int)
+NCX_GETN(int64, long)
+NCX_GETN(int64, float)
+NCX_GETN(int64, double)
+NCX_GETN(int64, uchar)
+NCX_GETN(int64, ushort)
+NCX_GETN(int64, uint)
+NCX_GETN(int64, ulonglong)
+
+#if X_SIZEOF_INT64 == SIZEOF_LONGLONG
 /* optimized version */
 int
-ncx_putn_longlong_longlong(void **xpp, size_t nelems, const long long *tp)
+APIPrefix`x_putn_'NC_TYPE(int64)_longlong(void **xpp, IntType nelems, const long long *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_LONGLONG);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_INT64);
 # else
 	swapn8b(*xpp, tp, nelems);
 # endif
-	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_LONGLONG);
+	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_INT64);
 	return NC_NOERR;
 }
 #else
-NCX_PUTN(longlong, longlong)
-#endif
-NCX_PUTN(longlong, schar)
-NCX_PUTN(longlong, short)
-NCX_PUTN(longlong, int)
-NCX_PUTN(longlong, float)
-NCX_PUTN(longlong, double)
-NCX_PUTN(longlong, uchar)
-NCX_PUTN(longlong, ushort)
-NCX_PUTN(longlong, uint)
-NCX_PUTN(longlong, ulonglong)
-
-/* ulonglong ----------------------------------------------------------------------*/
-
-#if X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+NCX_PUTN(int64, longlong)
+#endif
+NCX_PUTN(int64, schar)
+NCX_PUTN(int64, short)
+NCX_PUTN(int64, int)
+NCX_PUTN(int64, long)
+NCX_PUTN(int64, float)
+NCX_PUTN(int64, double)
+NCX_PUTN(int64, uchar)
+NCX_PUTN(int64, ushort)
+NCX_PUTN(int64, uint)
+NCX_PUTN(int64, ulonglong)
+
+/* uint64 --------------------------------------------------------------------*/
+
+#if X_SIZEOF_UINT64 == SIZEOF_ULONGLONG
 /* optimized version */
 int
-ncx_getn_ulonglong_ulonglong(const void **xpp, size_t nelems, unsigned long long *tp)
+APIPrefix`x_getn_'NC_TYPE(uint64)_ulonglong(const void **xpp, IntType nelems, unsigned long long *tp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(tp, *xpp, nelems * sizeof(unsigned long long));
+	(void) memcpy(tp, *xpp, (size_t)nelems * SIZEOF_UNSIGNED_LONG_LONG);
 # else
 	swapn8b(tp, *xpp, nelems);
 # endif
-	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_ULONGLONG);
+	*xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_UINT64);
 	return NC_NOERR;
 }
 #else
-NCX_GETN(ulonglong, ulonglong)
-#endif
-NCX_GETN(ulonglong, schar)
-NCX_GETN(ulonglong, short)
-NCX_GETN(ulonglong, int)
-NCX_GETN(ulonglong, float)
-NCX_GETN(ulonglong, double)
-NCX_GETN(ulonglong, longlong)
-NCX_GETN(ulonglong, uchar)
-NCX_GETN(ulonglong, ushort)
-NCX_GETN(ulonglong, uint)
-
-#if X_SIZEOF_ULONGLONG == SIZEOF_ULONGLONG
+NCX_GETN(uint64, ulonglong)
+#endif
+NCX_GETN(uint64, schar)
+NCX_GETN(uint64, short)
+NCX_GETN(uint64, int)
+NCX_GETN(uint64, long)
+NCX_GETN(uint64, float)
+NCX_GETN(uint64, double)
+NCX_GETN(uint64, longlong)
+NCX_GETN(uint64, uchar)
+NCX_GETN(uint64, ushort)
+NCX_GETN(uint64, uint)
+
+#if X_SIZEOF_UINT64 == SIZEOF_ULONGLONG
 /* optimized version */
 int
-ncx_putn_ulonglong_ulonglong(void **xpp, size_t nelems, const unsigned long long *tp)
+APIPrefix`x_putn_'NC_TYPE(uint64)_ulonglong(void **xpp, IntType nelems, const unsigned long long *tp, void *fillp)
 {
 #ifdef WORDS_BIGENDIAN
-	(void) memcpy(*xpp, tp, nelems * X_SIZEOF_ULONGLONG);
+	(void) memcpy(*xpp, tp, (size_t)nelems * X_SIZEOF_UINT64);
 # else
 	swapn8b(*xpp, tp, nelems);
 # endif
-	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_ULONGLONG);
+	*xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_UINT64);
 	return NC_NOERR;
 }
 #else
-NCX_PUTN(ulonglong, ulonglong)
+NCX_PUTN(uint64, ulonglong)
 #endif
-NCX_PUTN(ulonglong, schar)
-NCX_PUTN(ulonglong, short)
-NCX_PUTN(ulonglong, int)
-NCX_PUTN(ulonglong, float)
-NCX_PUTN(ulonglong, double)
-NCX_PUTN(ulonglong, longlong)
-NCX_PUTN(ulonglong, uchar)
-NCX_PUTN(ulonglong, ushort)
-NCX_PUTN(ulonglong, uint)
+NCX_PUTN(uint64, schar)
+NCX_PUTN(uint64, short)
+NCX_PUTN(uint64, int)
+NCX_PUTN(uint64, long)
+NCX_PUTN(uint64, float)
+NCX_PUTN(uint64, double)
+NCX_PUTN(uint64, longlong)
+NCX_PUTN(uint64, uchar)
+NCX_PUTN(uint64, ushort)
+NCX_PUTN(uint64, uint)
 
 
 /*
@@ -3323,45 +3670,27 @@ NCX_PUTN(ulonglong, uint)
  */
 
 /* text */
-#ifdef __arm__
-int
-ncx_getn_text(const void **xpp, size_t nelems, signed char *tp)
-#else
+
 int
-ncx_getn_text(const void **xpp, size_t nelems, char *tp)
-#endif
+APIPrefix`x_getn_text'(const void **xpp, IntType nelems, char *tp)
 {
 NCX_GETN_Byte_Body
 }
 
-#ifdef __arm__
-int
-ncx_pad_getn_text(const void **xpp, size_t nelems, signed char *tp)
-#else
 int
-ncx_pad_getn_text(const void **xpp, size_t nelems, char *tp)
-#endif
+APIPrefix`x_pad_getn_text'(const void **xpp, IntType nelems, char *tp)
 {
 NCX_PAD_GETN_Byte_Body
 }
 
-#ifdef __arm__
-int ncx_putn_text(void **xpp, size_t nelems, const signed char *tp)
-#else
 int
-ncx_putn_text(void **xpp, size_t nelems, const char *tp)
-#endif
+APIPrefix`x_putn_text'(void **xpp, IntType nelems, const char *tp)
 {
 NCX_PUTN_Byte_Body
 }
 
-#ifdef __arm__
-int
-ncx_pad_putn_text(void **xpp, size_t nelems, const signed char *tp)
-#else
 int
-ncx_pad_putn_text(void **xpp, size_t nelems, const char *tp)
-#endif
+APIPrefix`x_pad_putn_text'(void **xpp, IntType nelems, const char *tp)
 {
 NCX_PAD_PUTN_Byte_Body
 }
@@ -3370,25 +3699,25 @@ NCX_PAD_PUTN_Byte_Body
 /* opaque */
 
 int
-ncx_getn_void(const void **xpp, size_t nelems, void *tp)
+APIPrefix`x_getn_void'(const void **xpp, IntType nelems, void *tp)
 {
 NCX_GETN_Byte_Body
 }
 
 int
-ncx_pad_getn_void(const void **xpp, size_t nelems, void *tp)
+APIPrefix`x_pad_getn_void'(const void **xpp, IntType nelems, void *tp)
 {
 NCX_PAD_GETN_Byte_Body
 }
 
 int
-ncx_putn_void(void **xpp, size_t nelems, const void *tp)
+APIPrefix`x_putn_void'(void **xpp, IntType nelems, const void *tp)
 {
 NCX_PUTN_Byte_Body
 }
 
 int
-ncx_pad_putn_void(void **xpp, size_t nelems, const void *tp)
+APIPrefix`x_pad_putn_void'(void **xpp, IntType nelems, const void *tp)
 {
 NCX_PAD_PUTN_Byte_Body
 }
diff --git a/libsrc/ncx_cray.c b/libsrc/ncx_cray.c
index 9fe3269..ce56ed9 100644
--- a/libsrc/ncx_cray.c
+++ b/libsrc/ncx_cray.c
@@ -8,6 +8,10 @@
 #error "ncx_cray.c is a cray specific implementation"
 #endif
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 /*
  * An external data representation interface.
  */
diff --git a/libsrc/netcdf.3 b/libsrc/netcdf.3
new file mode 100644
index 0000000..89985ed
--- /dev/null
+++ b/libsrc/netcdf.3
@@ -0,0 +1,1405 @@
+.nr yr \n(yr+1900
+.af mo 01
+.af dy 01
+.TH NETCDF 3 "1997-04-18" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA LIBRARY FUNCTIONS"
+.SH NAME
+netcdf \- Unidata's Network Common Data Form (netCDF) library interface
+.SH SYNOPSIS
+.ft B
+.na
+.nh
+#include "netcdf.h"
+.sp
+
+cc ...  \-lnetcdf \-lhdf5_hl \-lhdf5 \-lz \-lm
+
+.ad
+.hy
+Complete documentation for the netCDF libraries can be found at the netCDF website: http://www.unidata.ucar.edu/software/netcdf/.
+.sp
+.SH "LIBRARY VERSION"
+.LP
+This document describes versions 3 and 4
+of Unidata netCDF data-access interface
+for the C programming language.
+.HP
+\fBconst char* nc_inq_libvers()\fR
+.sp
+Returns a string identifying the version of the netCDF library, and
+when it was built, like: "3.1a of Aug 22 1996 12:57:47 $".
+.LP
+The RCS \fBident(1)\fP command will find a string like
+"$\|Id: @\|(#) netcdf library version 3.1a of Sep  6 1996 15:56:26 $"
+in the library. The SCCS \fBwhat(1)\fP command will find a string like
+"netcdf library version 3.1a of Aug 23 1996 16:07:40 $".
+.SH "RETURN VALUES"
+.LP
+All netCDF functions (except
+\fBnc_inq_libvers(\|)\fR and \fBnc_strerror(\|)\fR) return an integer status.
+
+If this returned status value is not equal to
+\fBNC_NOERR\fR (zero), it
+indicates that an error occurred. The possible status values are defined in
+system include file <errno.h> and in "netcdf.h".
+.HP
+\fBconst char* nc_strerror(int \fIstatus\fP)\fR
+.sp
+Returns a string textual translation of the \fIstatus\fP
+value, like "Attribute or variable name contains illegal characters"
+or "No such file or directory".
+.sp
+.SH "FILE OPERATIONS"
+.LP
+.HP
+\fBint nc_create(const char \fIpath\fP[], int \fIcmode\fP, int* \fIncid\fP)\fR
+.sp
+Creates a new netCDF dataset at \fIpath\fP,
+returning a netCDF ID in \fIncid\fP.
+The argument \fIcmode\fP may include the bitwise-or
+of the following flags:
+\fBNC_NOCLOBBER\fR
+to protect existing datasets (default
+silently blows them away),
+\fBNC_SHARE\fR
+for synchronous dataset updates for classic format files
+(default is to buffer accesses),
+.sp
+When a netCDF dataset is created, is is opened
+\fBNC_WRITE\fR.
+The new netCDF dataset is in define mode.
+\fBNC_64BIT_OFFSET\fR.
+to create a file in the 64-bit offset format
+(as opposed to classic format, the default).
+\fBNC_TRUE\fR to create a netCDF-4/HDF5 file,
+and \fBNC_CLASSIC_MODEL\fR to guarantee that netCDF-4/HDF5 files maintain compatibility
+with the netCDF classic data model.
+.HP
+\fBint nc__create(const char \fIpath\fP[], int \fIcmode\fP, size_t \fIinitialsize\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR
+.sp
+Like \fBnc_create(\|)\fR but has additional performance tuning parameters.
+.sp
+The argument \fIinitialsize\fP sets the initial size of the file at
+creation time.
+.sp
+See \fBnc__open(\|)\fR below for an explanation of the \fIchunksize\fP
+parameter.
+.HP
+\fBint nc_open(const char \fIpath\fP[], int \fImode\fP, int* \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncopen(\|)\fR in version 2)
+.sp
+Opens a existing netCDF dataset at \fIpath\fP
+returning a netCDF ID
+in \fIncid\fP.
+The type of access is described by the \fImode\fP parameter,
+which may include the bitwise-or
+of the following flags:
+\fBNC_WRITE\fR
+for read-write access (default
+read-only),
+\fBNC_SHARE\fR
+for synchronous dataset updates (default is
+to buffer accesses), and
+\fBNC_LOCK\fR
+(not yet implemented).
+.sp
+As of NetCDF version 4.1, and if TRUE support was enabled
+when the NetCDF library was built, the path parameter
+may specify a TRUE URL. In this case, the access mode is
+forced to be read-only.
+.HP
+\fBint nc__open(const char \fIpath\fP[], int \fImode\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR
+.sp
+Like \fBnc_open(\|)\fR but has an additional performance tuning parameter.
+.sp
+The argument referenced by \fIchunksize\fP controls a space versus time
+tradeoff, memory allocated in the netcdf library versus number of system
+calls.
+Because of internal requirements, the value may not be set to exactly
+the value requested.
+The actual value chosen is returned by reference.
+Using the value \fBNC_SIZEHINT_DEFAULT\fR causes the library to choose a
+default.
+How the system choses the default depends on the system.
+On many systems, the "preferred I/O block size" is available from the
+\fBstat()\fR system call, \fBstruct stat\fR member \fBst_blksize\fR.
+If this is available it is used. Lacking that, twice the system pagesize
+is used.
+Lacking a call to discover the system pagesize, we just set default
+chunksize to 8192.
+.sp
+The chunksize is a property of a given open netcdf descriptor
+\fIncid\fP, it is not a persistent property of the netcdf dataset.
+.sp
+As with \fBnc__open(\|)\fR, the path parameter
+may specify a TRUE URL, but the tuning parameters are ignored.
+.HP
+\fBint nc_redef(int \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncredef(\|)\fR in version 2)
+.sp
+Puts an open netCDF dataset into define mode,
+so dimensions, variables, and attributes can be added or renamed and
+attributes can be deleted.
+.HP
+\fBint nc_enddef(int \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncendef(\|)\fR in version 2)
+.sp
+Takes an open netCDF dataset out of define mode.
+The changes made to the netCDF dataset
+while it was in define mode are checked and committed to disk if no
+problems occurred.  Some data values may be written as well,
+see "VARIABLE PREFILLING" below.
+After a successful call, variable data can be read or written to the dataset.
+.HP
+\fBint nc__enddef(int \fIncid\fP, size_t \fIh_minfree\fP, size_t \fIv_align\fP, size_t \fIv_minfree\fP, size_t \fIr_align\fP)\fR
+.sp
+Like \fBnc_enddef(\|)\fR but has additional performance tuning parameters.
+.sp
+Caution: this function exposes internals of the netcdf version 1 file
+format.
+It may not be available on future netcdf implementations.
+.sp
+The current netcdf file format has three sections,
+the "header" section, the data section for fixed size variables, and
+the data section for variables which have an unlimited dimension (record
+variables).
+The header begins at the beginning of the file. The index
+(offset) of the beginning of the other two sections is contained in the
+header. Typically, there is no space between the sections. This causes
+copying overhead to accrue if one wishes to change the size of the
+sections,
+as may happen when changing names of things, text attribute values,
+adding
+attributes or adding variables. Also, for buffered i/o, there may be
+advantages
+to aligning sections in certain ways.
+.sp
+The minfree parameters allow one to control costs of future calls
+to \fBnc_redef(\|)\fR, \fBnc_enddef(\|)\fR by requesting that \fIminfree\fP bytes be
+available at the end of the section.
+The \fIh_minfree\fP parameter sets the pad
+at the end of the "header" section. The \fIv_minfree\fP parameter sets
+the pad at the end of the data section for fixed size variables.
+.sp
+The align parameters allow one to set the alignment of the beginning of
+the corresponding sections. The beginning of the section is rounded up
+to an index which is a multiple of the align parameter. The flag value
+\fBNC_ALIGN_CHUNK\fR tells the library to use the chunksize (see above)
+as the align parameter.
+The \fIv_align\fP parameter controls the alignment of the beginning of
+the data section for fixed size variables.
+The \fIr_align\fP parameter controls the alignment of the beginning of
+the data section for variables which have an unlimited dimension (record
+variables).
+.sp
+The file format requires mod 4 alignment, so the align parameters
+are silently rounded up to multiples of 4. The usual call,
+\fBnc_enddef(\fIncid\fP)\fR
+is equivalent to
+\fBnc__enddef(\fIncid\fP, 0, 4, 0, 4)\fR.
+.sp
+The file format does not contain a "record size" value, this is
+calculated from the sizes of the record variables. This unfortunate fact
+prevents us from providing minfree and alignment control of the
+"records"
+in a netcdf file. If you add a variable which has an unlimited
+dimension,
+the third section will always be copied with the new variable added.
+.HP
+\fBint nc_sync(int \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncsync(\|)\fR in version 2)
+.sp
+Unless the
+\fBNC_SHARE\fR
+bit is set in
+\fBnc_open(\|)\fR or \fBnc_create(\|)\fR,
+accesses to the underlying netCDF dataset are
+buffered by the library. This function synchronizes the state of
+the underlying dataset and the library.
+This is done automatically by
+\fBnc_close(\|)\fR and \fBnc_enddef(\|)\fR.
+.HP
+\fBint nc_abort(int \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncabort(\|)\fR in version 2)
+.sp
+You don't need to call this function.
+This function is called automatically by
+\fBnc_close(\|)\fR
+if the netCDF was in define mode and something goes wrong with the commit.
+If the netCDF dataset isn't in define mode, then this function is equivalent to
+\fBnc_close(\|)\fR.
+If it is called after
+\fBnc_redef(\|)\fR,
+but before
+\fBnc_enddef(\|)\fR,
+the new definitions are not committed and the dataset is closed.
+If it is called after
+\fBnc_create(\|)\fR
+but before
+\fBnc_enddef(\|)\fR,
+the dataset disappears.
+.HP
+\fBint nc_close(int \fIncid\fP)\fR
+.sp
+(Corresponds to
+\fBncclose(\|)\fR in version 2)
+.sp
+Closes an open netCDF dataset.
+If the dataset is in define mode,
+\fBnc_enddef(\|)\fR
+will be called before closing.
+After a dataset is closed, its ID may be reassigned to another dataset.
+.HP
+\fBint nc_inq(int \fIncid\fP, int* \fIndims\fP, int* \fInvars\fP,
+int* \fInatts\fP, int* \fIunlimdimid\fP)\fR
+.HP
+\fBint nc_inq_ndims(int \fIncid\fP, int* \fIndims\fP)\fR
+.HP
+\fBint nc_inq_nvars(int \fIncid\fP, int* \fInvars\fP)\fR
+.HP
+\fBint nc_inq_natts(int \fIncid\fP, int* \fInatts\fP)\fR
+.HP
+\fBint nc_inq_unlimdim(int \fIncid\fP, int* \fIunlimdimid\fP)\fR
+.HP
+\fBint nc_inq_format(int \fIncid\fP, int* \fIformatn\fP)\fR
+.sp
+Use these functions to find out what is in a netCDF dataset.
+Upon successful return,
+\fIndims\fP will contain  the
+number of dimensions defined for this netCDF dataset,
+\fInvars\fP will contain the number of variables,
+\fInatts\fP will contain the number of attributes, and
+\fIunlimdimid\fP will contain the
+dimension ID of the unlimited dimension if one exists, or
+\-1 otherwise.
+\fIformatn\fP will contain the version number of the dataset <format>, one of
+\fBNC_FORMAT_CLASSIC\fR, \fBNC_FORMAT_64BIT_OFFSET\fR, \fBNC_FORMAT_NETCDF4\fR, or
+\fBNC_FORMAT_NETCDF4_CLASSIC\fR.
+If any of the
+return parameters is a \fBNULL\fR pointer, then the corresponding information
+will not be returned; hence, no space need be allocated for it.
+.HP
+\fBint nc_def_dim(int \fIncid\fP, const char \fIname\fP[], size_t \fIlen\fP, int* \fIdimid\fP)\fR
+.sp
+(Corresponds to \fBncdimdef(\|)\fR in version 2)
+.sp
+Adds a new dimension to an open netCDF dataset, which must be
+in define mode.
+\fIname\fP is the dimension name.
+If \fIdimid\fP is not a \fBNULL\fR pointer then upon successful completion \fIdimid\fP will contain the dimension ID of the newly created dimension.
+
+.SH "USER DEFINED TYPES"
+.LP
+Users many define types for a netCDF-4/HDF5 file (unless the
+\fBNC_CLASSIC_MODEL\fR was used when the file was creates). Users may
+define compound types, variable length arrays, enumeration types, and
+opaque types.
+.sp
+
+.HP
+\fBint nc_def_compound(int \fIncid\fP, size_t \fIsize\fP, const char \fIname\fP[], int* \fItypeidp\fP)\fR
+.sp
+Define a compound type.
+.HP
+\fBint nc_insert_compound(int \fIncid\fP, nc_type \fI\fP, const char \fIname\fP[], size_t \fIoffset\fP, nc_type \fIfield_typeid\fP)\fR
+.sp
+Insert an element into a compound type. May not be done after type has been used, or after the type has been written by an enddef.
+.HP
+\fBint nc_insert_array_compound(int \fIncid\fP, nc_type \fI\fP, const char \fIname\fP[], size_t \fIoffset\fP, nc_type \fIfield_typeid\fP, int \fIndims\fP, const int \fIdim_sizes\fP[])\fR
+.sp
+Insert an array into a compound type.
+.HP
+\fBint nc_inq_type(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fIsizep\fP)\fR
+.sp
+Learn about a type.
+.HP
+\fBint nc_inq_compound(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fIsizep\fP, size_t* \fInfieldsp\fP)\fR
+.HP
+\fBint nc_inq_compound_name(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[])\fR
+.HP
+\fBint nc_inq_compound_size(int \fIncid\fP, nc_type \fI\fP, size_t* \fIsizep\fP)\fR
+.HP
+\fBint nc_inq_compound_nfields(int \fIncid\fP, nc_type \fI\fP, size_t* \fInfieldsp\fP)\fR
+.HP
+\fBint nc_inq_compound_fieldname(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, char \fIname\fP[])\fR
+.HP
+\fBint nc_inq_compound_fieldindex(int \fIncid\fP, nc_type \fI\fP, const char \fIname\fP[], int* \fIfieldidp\fP)\fR
+.HP
+\fBint nc_inq_compound_fieldoffset(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, size_t* \fIoffsetp\fP)\fR
+.HP
+\fBint nc_inq_compound_fieldtype(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, nc_type* \fIfield_typeid\fP)\fR
+.HP
+\fBint nc_inq_compound_fieldndims(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, int* \fIndims\fP)\fR
+.HP
+\fBint nc_inq_compound_fielddim_sizes(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, int \fIdim_sizes\fP[])\fR
+.sp
+Learn about a compound type.
+.HP
+\fBint nc_def_vlen(int \fIncid\fP, const char \fIname\fP[], nc_type \fIbase_typeid\fP, nc_type* \fIxtypep\fP)\fR
+.sp
+Create a variable length array type.
+.HP
+\fBint nc_inq_vlen(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fIdatum_sizep\fP, nc_type* \fIbase_nc_typep\fP)\fR
+.sp
+Learn about a variable length array type.
+.HP
+\fBint nc_free_vlen(nc_vlen_t *vl)\fR
+.sp
+Free memory comsumed by reading data of a variable length array type.
+.HP
+\fBint nc_put_vlen_element(int \fIncid\fP, nc_type \fI\fP, void * \fIvlen_element\fP, size_t \fIlen\fP, void * \fIdata\fP)\fR
+.sp
+Write one VLEN.
+.HP
+\fBint nc_get_vlen_element(int \fIncid\fP, nc_type \fI\fP, void ** \fIvlen_element\fP, size_t \fIlen\fP, void ** \fIdata\fP)\fR
+.sp
+Read one VLEN.
+.HP
+\fBint nc_free_string(size_t \fIlen\fP, char **data)\fR
+.sp
+Free memory comsumed by reading data of a string type.
+.HP
+\fBint nc_inq_user_type(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fI\fP, nc_type* \fI\fP, size_t* \fI\fP, int* \fI\fP)\fR
+.sp
+Learn about a user define type.
+.HP
+\fBint nc_def_enum(int \fIncid\fP, nc_type \fIbase_typeid\fP, const char \fIname\fP[], nc_type* \fItypeidp\fP)\fR
+.sp
+Define an enumeration type.
+.HP
+\fBint nc_insert_enum(int \fIncid\fP, nc_type \fIbase_typeid\fP, const char \fIname\fP[], const void *value)\fR
+.sp
+Insert a name-value pair into enumeration type.
+.HP
+\fBint nc_inq_enum_member(int \fIncid\fP, nc_type \fIxtype\fP, int \fIidx\fP, char \fIname\fP[], void *value)\fR
+.HP
+\fBint nc_inq_enum_ident(int \fIncid\fP, nc_type \fIxtype\fP, int \fIidx\fP, long long \fIvalue\fP, char \fIidentifier\fP[])\fR
+.sp
+Learn about a name-value pair into enumeration type.
+.HP
+\fBint nc_def_opaque(int \fIncid\fP, size_t \fIsize\fP, const char \fIname\fP[], nc_type* \fIxtypep\fP)\fR
+.sp
+Create an opaque type.
+.HP
+\fBint nc_inq_opaque(int \fIncid\fP, nc_type \fIxtype\fP, char \fIname\fP[], size_t* \fIsizep\fP)\fR
+.sp
+Learn about opaque type.
+.HP
+.SH "GROUPS"
+.sp
+Users may organize data into hierarchical groups in netCDF-4/HDF5 files (unless \fBNC_CLASSIC_MODEL\fR was used when creating the file).
+.HP
+\fBint nc_inq_grps(int \fIncid\fP, int* \fInumgrps\fP, int \fIncids\fP[])\fR
+.sp
+Learn how many groups (and their ncids) are available from the group represented by ncid.
+.HP
+\fBint nc_inq_grpname(int \fIncid\fP, char \fIname\fP[])\fR
+.HP
+\fBint nc_inq_grpname_full(int \fIncid\fP, size_t* \fIlen\fP, char \fIname\fP[])\fR
+.HP
+\fBint nc_inq_grpname_len(int \fIncid\fP, size_t* \fIlen\fP)\fR
+.HP
+\fBint nc_inq_grp_parent(int \fIncid\fP, int* \fIncid\fP)\fR
+.HP
+\fBint nc_inq_grp_ncid(int \fIncid\fP, char \fIname\fP[], int* \fIncid\fP)\fR
+.HP
+\fBint nc_inq_full_ncid(int \fIncid\fP, char \fIname\fP[], int* \fIncid\fP)\fR
+.sp
+Learn about a group.
+.HP
+\fBint nc_inq_varids(int \fIncid\fP, int* \fInvars\fP, int* \fI\fP)\fR
+.sp
+Get the varids in a group.
+.HP
+\fBint nc_inq_dimids(int \fIncid\fP, int* \fIndims\fP, int* \fIdimids\fP, int \fIinclude_parents\fP)\fR
+.sp
+Get the dimids in a group and (potentially) its parents.
+.HP
+\fBint nc_inq_typeids(int \fIncid\fP, int* \fIntypes\fP, int \fItypeids\fP[])\fR
+.sp
+Get the typeids of user-defined types in a group.
+.HP
+\fBint nc_def_grp(int \fIncid\fP, char \fIname\fP[], int* \fIncid\fP)\fR
+.sp
+Create a group.
+.LP
+
+.SH "DIMENSIONS"
+.LP
+.HP
+\fBint nc_inq_dimid(int \fIncid\fP, const char \fIname\fP[], int* \fIdimid\fP)\fR
+.sp
+(Corresponds to \fBncdimid(\|)\fR in version 2)
+.sp
+Given a dimension name, returns the ID of a netCDF dimension in \fIdimid\fP.
+.HP
+\fBint nc_inq_dim(int \fIncid\fP, int \fIdimid\fP, char \fIname\fP[], size_t* \fIlen\fP)\fR
+.HP
+\fBint nc_inq_dimname(int \fIncid\fP, int \fIdimid\fP, char \fIname\fP[])\fR
+.HP
+\fBint nc_inq_dimlen(int \fIncid\fP, int \fIdimid\fP, size_t* \fIlen\fP)\fR
+.sp
+Use these functions to find out about a dimension.
+If either the \fIname\fP
+argument or \fIlen\fP argument is a \fBNULL\fR pointer, then
+the associated information will not be returned.  Otherwise,
+\fIname\fP should be  big enough (\fBNC_MAX_NAME\fR)
+to hold the dimension name as the name will be copied into your storage.
+The length return parameter, \fIlen\fP
+will contain the size of the dimension.
+For the unlimited dimension, the returned length is the current
+maximum value used for writing into any of the variables which use
+the dimension.
+.HP
+\fBint nc_rename_dim(int \fIncid\fP, int \fIdimid\fP, const char \fIname\fP[])\fR
+.sp
+(Corresponds to \fBncdimrename(\|)\fR in version 2)
+.sp
+Renames an existing dimension in an open netCDF dataset.
+If the new name is longer than the old name, the netCDF dataset must be in
+define mode.
+You cannot rename a dimension to have the same name as another dimension.
+.SH "VARIABLES"
+.LP
+.HP
+\fBint nc_def_var(int \fIncid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, int \fIndims\fP, const int \fIdimids\fP[], int* \fIvarid\fP)\fR
+.sp
+(Corresponds to \fBncvardef(\|)\fR in version 2)
+.sp
+Adds a new variable to a netCDF dataset. The netCDF must be in define mode.
+If not \fBNULL\fR, then \fIvarid\fP will be set to the netCDF variable ID.
+.HP
+\fBint nc_inq_varid(int \fIncid\fP, const char \fIname\fP[], int* \fIvarid\fP)\fR
+.sp
+(Corresponds to \fBncvarid(\|)\fR in version 2)
+.sp
+Returns the ID of a netCDF variable in \fIvarid\fP given its name.
+.HP
+\fBint nc_inq_var(int \fIncid\fP, int \fIvarid\fP, char \fIname\fP[], nc_type* \fIxtype\fP, int* \fIndims\fP, int \fIdimids\fP[],
+int* \fInatts\fP)\fR
+.HP
+\fBint nc_inq_varname(int \fIncid\fP, int \fIvarid\fP, char \fIname\fP[])\fR
+.HP
+\fBint nc_inq_vartype(int \fIncid\fP, int \fIvarid\fP, nc_type* \fIxtype\fP)\fR
+.HP
+\fBint nc_inq_varndims(int \fIncid\fP, int \fIvarid\fP, int* \fIndims\fP)\fR
+.HP
+\fBint nc_inq_vardimid(int \fIncid\fP, int \fIvarid\fP, int \fIdimids\fP[])\fR
+.HP
+\fBint nc_inq_varnatts(int \fIncid\fP, int \fIvarid\fP, int* \fInatts\fP)\fR
+.sp
+Returns information about a netCDF variable, given its ID.
+If any of the
+return parameters (\fIname\fP, \fIxtype\fP, \fIndims\fP, \fIdimids\fP, or
+\fInatts\fP) is a \fBNULL\fR pointer, then the corresponding information
+will not be returned; hence, no space need be allocated for it.
+.HP
+\fBint nc_rename_var(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[])\fR
+.sp
+(Corresponds to \fBncvarrename(\|)\fR in version 2)
+.sp
+Changes the name of a netCDF variable.
+If the new name is longer than the old name, the netCDF must be in define mode.
+You cannot rename a variable to have the name of any existing variable.
+
+.SH "VARIABLES \fIin\fP NETCDF-4 FILES"
+.LP
+The following functions may only be used on variables in a
+netCDF-4/HDF5 data file. These functions must be called after the
+variable is defined, but before an enddef call.
+.sp
+\fBint nc_def_var_deflate(int \fIncid\fP, int \fIvarid\fP, int \fIshuffle\fP, int \fIdeflate\fP, int \fIdeflate_level\fP)\fR
+.sp
+Turn on compression and/or shuffle filter. (Shuffle filter is only useful for integer data.)
+.HP
+\fBint nc_inq_var_deflate(int \fIncid\fP, int \fIvarid\fP, int* \fIshufflep\fP, int* \fIdeflatep\fP, int* \fIdeflate_levelp\fP)\fR
+.sp
+Learn about a variable's deflate settings.
+.HP
+\fBint nc_def_var_fletcher32(int \fIncid\fP, int \fIvarid\fP, int \fIfletcher32\fP)\fR
+.sp
+Turn on checksumming for a variable.
+.HP
+\fBint nc_inq_var_fletcher32(int \fIncid\fP, int \fIvarid\fP, int* \fIfletcher32\fP)\fR
+.sp
+Learn about checksumming for a variable.
+.HP
+\fBint nc_def_var_chunking(int \fIncid\fP, int \fIvarid\fP, int \fIstorage\fP, const size_t \fIchunksizesp\fP[])\fR
+.sp
+Set chunksizes for a variable.
+.HP
+\fBint nc_inq_var_chunking(int \fIncid\fP, int \fIvarid\fP, int* \fIstoragep\fP, size_t \fIchunksizesp\fP[])\fR
+.sp
+Learn about chunksizes for a variable.
+.HP
+\fBint nc_def_var_fill(int \fIncid\fP, int \fIvarid\fP, int \fIno_fill\fP, const size_t \fIchunksizesp\fP[])\fR
+.sp
+Set a fill value for a variable.
+.HP
+\fBint nc_inq_var_fill(int \fIncid\fP, int \fIvarid\fP, int* \fIstoragep\fP, size_t \fIchunksizesp\fP[])\fR
+.sp
+Learn the fill value for a variable.
+.HP
+\fBint nc_def_var_endian(int \fIncid\fP, int \fIvarid\fP, int \fIendian\fP)\fR
+.sp
+Set endianness of variable.
+.HP
+\fBint nc_inq_var_endian(int \fIncid\fP, int \fIvarid\fP, int* \fIendianp\fP)\fR
+.sp
+Learn the endianness of a variable.
+.HP
+
+.SH "WRITING AND READING WHOLE VARIABLES"
+.LP
+.HP
+\fBint nc_put_var_text(int \fIncid\fP, int \fIvarid\fP, const char \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_uchar(int \fIncid\fP, int \fIvarid\fP, const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_schar(int \fIncid\fP, int \fIvarid\fP, const signed char \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_short(int \fIncid\fP, int \fIvarid\fP, const short \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_int(int \fIncid\fP, int \fIvarid\fP, const int \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_long(int \fIncid\fP, int \fIvarid\fP, const long \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_float(int \fIncid\fP, int \fIvarid\fP, const float \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_double(int \fIncid\fP, int \fIvarid\fP, const double \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_ubyte(int \fIncid\fP, int \fIvarid\fP, const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_ushort(int \fIncid\fP, int \fIvarid\fP, const unsigned short \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_uint(int \fIncid\fP, int \fIvarid\fP, const unsigned int \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_int64(int \fIncid\fP, int \fIvarid\fP, const long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_uint64(int \fIncid\fP, int \fIvarid\fP, const unsigned long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_var_string(int \fIncid\fP, int \fIvarid\fP, const char * \fIout\fP[])\fR
+
+
+.sp
+Writes an entire netCDF variable (i.e. all the values).  The netCDF
+dataset must be open and in data mode.  The type of the data is
+specified in the function name, and it is converted to the external
+type of the specified variable, if possible, otherwise an
+\fBNC_ERANGE\fR error is returned. Note that rounding is not performed
+during the conversion. Floating point numbers are truncated when
+converted to integers.
+.HP
+\fBint nc_get_var_text(int \fIncid\fP, int \fIvarid\fP, char \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_uchar(int \fIncid\fP, int \fIvarid\fP, unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_schar(int \fIncid\fP, int \fIvarid\fP, signed char \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_short(int \fIncid\fP, int \fIvarid\fP, short \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_int(int \fIncid\fP, int \fIvarid\fP, int \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_long(int \fIncid\fP, int \fIvarid\fP, long \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_float(int \fIncid\fP, int \fIvarid\fP, float \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_double(int \fIncid\fP, int \fIvarid\fP, double \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_ubyte(int \fIncid\fP, int \fIvarid\fP, unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_ushort(int \fIncid\fP, int \fIvarid\fP, unsigned short \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_uint(int \fIncid\fP, int \fIvarid\fP, unsigned int \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_int64(int \fIncid\fP, int \fIvarid\fP, long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_uint64(int \fIncid\fP, int \fIvarid\fP, unsigned long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_var_string(int \fIncid\fP, int \fIvarid\fP, char * \fIin\fP[])\fR
+
+
+.sp
+Reads an entire netCDF variable (i.e. all the values).
+The netCDF dataset must be open and in data mode.
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNC_ERANGE\fR error is returned.
+.SH "WRITING AND READING ONE DATUM"
+.LP
+.HP
+\fBint nc_put_var1_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], signed char \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], short \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], int \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], float \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], double \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned short \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned int \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long long \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned long long \fI*out\fP)\fR
+.HP
+\fBint nc_put_var1_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char * \fI*out\fP)\fR
+
+
+.sp
+Puts a single data value into a variable at the position \fIindex\fP of an
+open netCDF dataset that is in data mode.  The type of the data is
+specified in the function name, and it is converted to the external type
+of the specified variable, if possible, otherwise an \fBNC_ERANGE\fR
+error is returned.
+.HP
+\fBint nc_get_var1_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], signed char* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], short* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], int* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], float* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], double* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned short* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned int* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long long* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned long long* \fIin\fP)\fR
+.HP
+\fBint nc_get_var1_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char ** \fIin\fP)\fR
+
+
+.sp
+Gets a single data value from a variable at the position \fIindex\fP
+of an open netCDF dataset that is in data mode.
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNC_ERANGE\fR error is returned.
+.SH "WRITING AND READING AN ARRAY"
+.LP
+.HP
+\fBint nc_put_vara_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const signed char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const short \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const int \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const long \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const float \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const double \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned short \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned int \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_vara_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const char * \fIout\fP[])\fR
+
+
+.sp
+Writes an array section of values into a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the \fIstart\fP and \fIcount\fP vectors, which give the starting index
+and count of values along each dimension of the specified variable.
+The type of the data is
+specified in the function name and is converted to the external type
+of the specified variable, if possible, otherwise an \fBNC_ERANGE\fR
+error is returned.
+.HP
+\fBint nc_get_vara_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], signed char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], short \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], int \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], long \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], float \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], double \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned short \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned int \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_vara_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], char * \fIin\fP[])\fR
+
+
+.sp
+Reads an array section of values from a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the \fIstart\fP and \fIcount\fP vectors, which give the starting index
+and count of values along each dimension of the specified variable.
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNC_ERANGE\fR error is returned.
+.SH "WRITING AND READING A SLICED ARRAY"
+.LP
+.HP
+\fBint nc_put_vars_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const signed char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const short \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const int \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const long \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const float \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const double \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned short \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned int \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_vars_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const char * \fIout\fP[])\fR
+
+
+.sp
+These functions are used for \fIstrided output\fP, which is like the
+array section output described above, except that
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.HP
+\fBint nc_get_vars_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], signed char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], short \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], int \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], long \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], float \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], double \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned short \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned int \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_vars_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], char * \fIin\fP[])\fR
+
+
+.sp
+These functions are used for \fIstrided input\fP, which is like the
+array section input described above, except that
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "WRITING AND READING A MAPPED ARRAY"
+.LP
+.HP
+\fBint nc_put_varm_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const char \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const signed char \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const short \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const int \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const long \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const float \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const double \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned short \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned int \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_varm_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const char * \fIout\fP[])\fR
+
+
+.sp
+These functions are used for \fImapped output\fP, which is like
+strided output described above, except that an additional index mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the index
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.HP
+\fBint nc_get_varm_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, char \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, signed char \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, short \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, int \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, long \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, float \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, double \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned short \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned int \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_varm_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, char * \fIin\fP[])\fR
+
+
+.sp
+These functions are used for \fImapped input\fP, which is like
+strided input described above, except that an additional index mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the index
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "ATTRIBUTES"
+.LP
+.HP
+\fBint nc_put_att_text(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const char \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_uchar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_schar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const signed char \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_short(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const short \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_int(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const int \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_long(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const long \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_float(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const float \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_double(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const double \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_ubyte(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned char \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_ushort(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned short \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_uint(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned int \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_int64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_uint64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned long long \fIout\fP[])\fR
+.HP
+\fBint nc_put_att_string(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const char * \fIout\fP[])\fR
+
+
+.HP
+\fBint nc_put_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, void * \fIip\fP)\fR
+.HP
+\fBint nc_get_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], void ** \fIip\fP)\fR
+.sp
+Unlike variables, attributes do not have
+separate functions for defining and writing values.
+This family of functions defines a new attribute with a value or changes
+the value of an existing attribute.
+If the attribute is new, or if the space required to
+store the attribute value is greater than before,
+the netCDF dataset must be in define mode.
+The parameter \fIlen\fP is the number of values from \fIout\fP to transfer.
+It is often one, except that for
+\fBnc_put_att_text(\|)\fR it will usually be
+\fBstrlen(\fIout\fP)\fR.
+.sp
+For these functions, the type component of the function name refers to
+the in-memory type of the value, whereas the \fIxtype\fP argument refers to the
+external type for storing the value.  An \fBNC_ERANGE\fR
+error results if
+a conversion between these types is not possible.  In this case the value
+is represented with the appropriate fill-value for the associated
+external type.
+.HP
+\fBint nc_inq_attname(int \fIncid\fP, int \fIvarid\fP, int \fIattnum\fP, char \fIname\fP[])\fR
+.sp
+Gets the
+name of an attribute, given its variable ID and attribute number.
+This function is useful in generic applications that
+need to get the names of all the attributes associated with a variable,
+since attributes are accessed by name rather than number in all other
+attribute functions.  The number of an attribute is more volatile than
+the name, since it can change when other attributes of the same variable
+are deleted.  The attributes for each variable are numbered
+from 0 (the first attribute) to
+\fInvatts\fP-1,
+where \fInvatts\fP is
+the number of attributes for the variable, as returned from a call to
+\fBnc_inq_varnatts(\|)\fR.
+If the \fIname\fP parameter is a \fBNULL\fR pointer, no name will be
+returned and no space need be allocated.
+.HP
+\fBint nc_inq_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type* \fIxtype\fP, size_t* \fIlen\fP)\fR
+.HP
+\fBint nc_inq_attid(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], int* \fIattnum\fP)\fR
+.HP
+\fBint nc_inq_atttype(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type* \fIxtype\fP)\fR
+.HP
+\fBint nc_inq_attlen(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], size_t* \fIlen\fP)\fR
+.sp
+These functions return information about a netCDF attribute,
+given its variable ID and name.  The information returned is the
+external type in \fIxtype\fP
+and the number of elements in the attribute as \fIlen\fP.
+If any of the return arguments is a \fBNULL\fR pointer,
+the specified information will not be returned.
+.HP
+\fBint nc_copy_att(int \fIncid\fP, int \fIvarid_in\fP, const char \fIname\fP[], int \fIncid_out\fP, int \fIvarid_out\fP)\fR
+.sp
+Copies an
+attribute from one netCDF dataset to another.  It can also be used to
+copy an attribute from one variable to another within the same netCDF.
+\fIncid_in\fP is the netCDF ID of an input netCDF dataset from which the
+attribute will be copied.
+\fIvarid_in\fP
+is the ID of the variable in the input netCDF dataset from which the
+attribute will be copied, or \fBNC_GLOBAL\fR
+for a global attribute.
+\fIname\fP
+is the name of the attribute in the input netCDF dataset to be copied.
+\fIncid_out\fP
+is the netCDF ID of the output netCDF dataset to which the attribute will be
+copied.
+It is permissible for the input and output netCDF ID's to be the same.  The
+output netCDF dataset should be in define mode if the attribute to be
+copied does not already exist for the target variable, or if it would
+cause an existing target attribute to grow.
+\fIvarid_out\fP
+is the ID of the variable in the output netCDF dataset to which the attribute will
+be copied, or \fBNC_GLOBAL\fR to copy to a global attribute.
+.HP
+\fBint nc_rename_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], const char \fInewname\fP[])\fR
+.sp
+Changes the
+name of an attribute.  If the new name is longer than the original name,
+the netCDF must be in define mode.  You cannot rename an attribute to
+have the same name as another attribute of the same variable.
+\fIname\fP is the original attribute name.
+\fInewname\fP
+is the new name to be assigned to the specified attribute.  If the new name
+is longer than the old name, the netCDF dataset must be in define mode.
+.HP
+\fBint nc_del_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[])\fR
+.sp
+Deletes an attribute from a netCDF dataset.  The dataset must be in
+define mode.
+.HP
+\fBint nc_get_att_text(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], char \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_uchar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_schar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], signed char \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_short(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], short \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_int(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], int \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_long(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], long \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_float(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], float \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_double(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], double \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_ubyte(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned char \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_ushort(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned short \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_uint(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned int \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_int64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_uint64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned long long \fIin\fP[])\fR
+.HP
+\fBint nc_get_att_string(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], char * \fIin\fP[])\fR
+
+
+.sp
+Gets the value(s) of a netCDF attribute, given its
+variable ID and name.  Converts from the external type to the type
+specified in
+the function name, if possible, otherwise returns an \fBNC_ERANGE\fR
+error.
+All elements of the vector of attribute
+values are returned, so you must allocate enough space to hold
+them.  If you don't know how much space to reserve, call
+\fBnc_inq_attlen(\|)\fR
+first to find out the length of the attribute.
+.SH "COMMON ARGUMENT DESCRIPTIONS"
+.LP
+In this section we define some common arguments which are used in the
+"FUNCTION DESCRIPTIONS" section.
+.TP
+int \fIncid\fP
+is the netCDF ID returned from a previous, successful call to
+\fBnc_open(\|)\fR or \fBnc_create(\|)\fR
+.TP
+char \fIname\fP[]
+is the name of a dimension, variable, or attribute. The names of
+dimensions, variables and attributes consist of arbitrary
+sequences of alphanumeric characters (as well as underscore '_',
+period '.' and hyphen '-'), beginning with a letter or
+underscore. (However names commencing with underscore are reserved for
+system use.) Case is significant in netCDF names. A zero-length name
+is not allowed.
+As an input argument,
+it shall be a pointer to a 0-terminated string; as an output argument, it
+shall be the address of a buffer in which to hold such a string.
+The maximum allowable number of characters
+(excluding the terminating 0) is \fBNC_MAX_NAME\fR.
+.TP
+nc_type \fIxtype\fP
+specifies the external data type of a netCDF variable or attribute and
+is one of the following:
+\fBNC_BYTE\fR, \fBNC_CHAR\fR, \fBNC_SHORT\fR, \fBNC_INT\fR,
+\fBNC_FLOAT\fR, or \fBNC_DOUBLE\fR.
+These are used to specify 8-bit integers,
+characters, 16-bit integers, 32-bit integers, 32-bit IEEE floating point
+numbers, and 64-bit IEEE floating-point numbers, respectively.
+(\fBNC_INT\fR corresponds to \fBNC_LONG\fR in version 2, to specify a
+32-bit integer).
+.TP
+int \fIdimids\fP[]
+is a vector of dimension ID's and defines the shape of a netCDF variable.
+The size of the vector shall be greater than or equal to the
+rank (i.e. the number of dimensions) of the variable (\fIndims\fP).
+The vector shall be ordered by the speed with which a dimension varies:
+\fIdimids\fP[\fIndims\fP-1]
+shall be the dimension ID of the most rapidly
+varying dimension and
+\fIdimids\fP[0]
+shall be the dimension ID of the most slowly
+varying dimension.
+The maximum possible number of
+dimensions for a variable is given by the symbolic constant
+\fBNC_MAX_VAR_DIMS\fR.
+.TP
+int \fIdimid\fP
+is the ID of a netCDF dimension.
+netCDF dimension ID's are allocated sequentially from the
+non-negative
+integers beginning with 0.
+.TP
+int \fIndims\fP
+is either the total number of dimensions in a netCDF dataset or the rank
+(i.e. the number of dimensions) of a netCDF variable.
+The value shall not be negative or greater than the symbolic constant
+\fBNC_MAX_VAR_DIMS\fR.
+.TP
+int \fIvarid\fP
+is the ID of a netCDF variable or (for the attribute-access functions)
+the symbolic constant
+\fBNC_GLOBAL\fR,
+which is used to reference global attributes.
+netCDF variable ID's are allocated sequentially from the
+non-negative
+integers beginning with 0.
+.TP
+int* \fInatts\fP
+is the number of global attributes in a netCDF dataset  for the
+\fBnc_inquire(\|)\fR
+function or the number
+of attributes associated with a netCDF variable for the
+\fBnc_varinq(\|)\fR
+function.
+.TP
+const size_t \fIindex\fP[]
+specifies the indicial coordinates of the netCDF data value to be accessed.
+The indices start at 0;
+thus, for example, the first data value of a
+two-dimensional variable is (0,0).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+const size_t \fIstart\fP[]
+specifies the starting point
+for accessing a netCDF variable's data values
+in terms of the indicial coordinates of
+the corner of the array section.
+The indices start at 0;
+thus, the first data
+value of a variable is (0, 0, ..., 0).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+const size_t \fIcount\fP[]
+specifies the number of indices selected along each dimension of the
+array section.
+Thus, to access a single value, for example, specify \fIcount\fP as
+(1, 1, ..., 1).
+Note that, for strided I/O, this argument must be adjusted
+to be compatible with the \fIstride\fP and \fIstart\fP arguments so that
+the interaction of the
+three does not attempt to access an invalid data co-ordinate.
+The elements of the
+\fIcount\fP vector correspond, in order, to the variable's dimensions.
+.TP
+const size_t \fIstride\fP[]
+specifies the sampling interval along each dimension of the netCDF
+variable.   The elements of the stride vector correspond, in order,
+to the netCDF variable's dimensions (\fIstride\fP[0])
+gives the sampling interval along the most slowly
+varying dimension of the netCDF variable).  Sampling intervals are
+specified in type-independent units of elements (a value of 1 selects
+consecutive elements of the netCDF variable along the corresponding
+dimension, a value of 2 selects every other element, etc.).
+A \fBNULL\fR stride argument is treated as (1, 1, ... , 1).
+.TP
+\fIimap\fP
+specifies the mapping between the dimensions of a netCDF variable and
+the in-memory structure of the internal data array.  The elements of
+the index mapping vector correspond, in order, to the netCDF variable's
+dimensions (\fIimap\fP[0] gives the distance
+between elements of the internal array corresponding to the most
+slowly varying dimension of the netCDF variable).
+Distances between elements are specified in type-independent units of
+elements (the distance between internal elements that occupy adjacent
+memory locations is 1 and not the element's byte-length as in netCDF 2).
+A \fBNULL\fR pointer means the memory-resident values have
+the same structure as the associated netCDF variable.
+.SH "VARIABLE PREFILLING"
+.LP
+By default, the netCDF interface sets the values of
+all newly-defined variables of finite length (i.e. those that do not have
+an unlimited, dimension) to the type-dependent fill-value associated with each
+variable.  This is done when \fBnc_enddef(\|)\fR
+is called.  The
+fill-value for a variable may be changed from the default value by
+defining the attribute `\fB_FillValue\fR' for the variable.  This
+attribute must have the same type as the variable and be of length one.
+.LP
+Variables with an unlimited dimension are also prefilled, but on
+an `as needed' basis.  For example, if the first write of such a
+variable is to position 5, then
+positions
+0 through 4
+(and no others)
+would be set to the fill-value at the same time.
+.LP
+This default prefilling of data values may be disabled by
+or'ing the
+\fBNC_NOFILL\fR
+flag into the mode parameter of \fBnc_open(\|)\fR or \fBnc_create(\|)\fR,
+or, by calling the function \fBnc_set_fill(\|)\fR
+with the argument \fBNC_NOFILL\fR.
+For variables that do not use the unlimited dimension,
+this call must
+be made before
+\fBnc_enddef(\|)\fR.
+For variables that
+use the unlimited dimension, this call
+may be made at any time.
+.LP
+One can obtain increased performance of the netCDF interface by using
+this feature, but only at the expense of requiring the application to set
+every single data value.  The performance
+enhancing behavior of this function is dependent on the particulars of
+the implementation and dataset format.
+The flag value controlled by \fBnc_set_fill(\|)\fR
+is per netCDF ID,
+not per variable or per write.
+Allowing this to change affects the degree to which
+a program can be effectively parallelized.
+Given all of this, we state that the use
+of this feature may not be available (or even needed) in future
+releases. Programmers are cautioned against heavy reliance upon this
+feature.
+.HP
+\fBint nc_setfill(int \fIncid\fP, int \fIfillmode\fP, int* \fIold_fillemode\fP)\fR
+.sp
+(Corresponds to \fBncsetfill(\|)\fR in version 2)
+.sp
+Determines whether or not variable prefilling will be done (see
+above).
+The netCDF dataset shall be writable.
+\fIfillmode\fP is either \fBNC_FILL\fR
+to enable prefilling (the
+default) or \fBNC_NOFILL\fR
+to disable prefilling.
+This function returns the previous setting in \fIold_fillmode\fP.
+
+.HP
+.SH "MPP FUNCTION DESCRIPTIONS"
+.LP
+Additional functions for use on SGI/Cray MPP machines (_CRAYMPP).
+These are used to set and inquire which PE is the base for MPP
+for a particular netCDF. These are only relevant when
+using the SGI/Cray ``global''
+Flexible File I/O layer and desire to have
+only a subset of PEs to open the specific netCDF file.
+For technical reasons, these functions are available on all platforms.
+On a platform other than SGI/Cray MPP, it is as if
+only processor available were processor 0.
+.LP
+To use this feature, you need to specify a communicator group and call
+\fBglio_group_mpi(\|)\fR or \fBglio_group_shmem(\|)\fR prior to the netCDF
+\fBnc_open(\|)\fR and \fBnc_create(\|)\fR calls.
+.HP
+\fBint nc__create_mp(const char \fIpath\fP[], int \fIcmode\fP, size_t \fIinitialsize\fP, int \fIpe\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR
+.sp
+Like \fBnc__create(\|)\fR but allows the base PE to be set.
+.sp
+The argument \fIpe\fP sets the base PE at creation time. In the MPP
+environment, \fBnc__create(\|)\fR and \fBnc_create(\|)\fR set the base PE to processor
+zero by default.
+.HP
+\fBint nc__open_mp(const char \fIpath\fP[], int \fImode\fP, int \fIpe\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR
+.sp
+Like \fBnc__open(\|)\fR but allows the base PE to be set.
+The argument \fIpe\fP sets the base PE at creation time. In the MPP
+environment, \fBnc__open(\|)\fR and \fBnc_open(\|)\fR set the base PE to processor
+zero by default.
+.HP
+\fBint nc_inq_base_pe(int \fIncid\fP, int* \fIpe\fP)\fR
+.sp
+Inquires of the netCDF dataset which PE is being used as the base for MPP use.
+This is safe to use at any time.
+.HP
+\fBint nc_set_base_pe(int \fIncid\fP, int \fIpe\fP)\fR
+.sp
+Resets the base PE for the netCDF dataset.
+Only perform this operation when the affected communicator group
+synchronizes before and after the call.
+This operation is very risky and should only be contemplated
+under only the most extreme cases.
+.SH "ENVIRONMENT VARIABLES"
+.TP 4
+.B NETCDF_FFIOSPEC
+Specifies the Flexible File I/O buffers for netCDF I/O when executing
+under the UNICOS operating system (the variable is ignored on other
+operating systems).
+An appropriate specification can greatly increase the efficiency of
+netCDF I/O -- to the extent that it can actually surpass FORTRAN binary
+I/O.
+This environment variable has been made a little more generalized,
+such that other FFIO option specifications can now be added.
+The default specification is \fBbufa:336:2\fP,
+unless a current FFIO specification is in operation,
+which will be honored.
+See UNICOS Flexible File I/O for more information.
+.SH "MAILING-LISTS"
+.LP
+Both a mailing list and a digest are available for
+discussion of the netCDF interface and announcements about netCDF bugs,
+fixes, and enhancements.
+To begin or change your subscription to either the mailing-list or the
+digest, send one of the following in the body (not
+the subject line) of an email message to "majordomo at unidata.ucar.edu".
+Use your email address in place of \fIjdoe at host.inst.domain\fP.
+.sp
+To subscribe to the netCDF mailing list:
+.RS
+\fBsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF mailing list:
+.RS
+\fBunsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To subscribe to the netCDF digest:
+.RS
+\fBsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF digest:
+.RS
+\fBunsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To retrieve the general introductory information for the mailing list:
+.RS
+\fBinfo netcdfgroup\fR
+.RE
+To get a synopsis of other majordomo commands:
+.RS
+\fBhelp\fR
+.RE
+.SH "SEE ALSO"
+.LP
+.BR ncdump (1),
+.BR ncgen (1),
+.BR netcdf (3).
+.LP
+\fInetCDF User's Guide\fP, published
+by the Unidata Program Center, University Corporation for Atmospheric
+Research, located in Boulder, Colorado.
+
+NetCDF home page at http:/www.unidata.ucar.edu/netcdf.
diff --git a/libsrc/posixio.c b/libsrc/posixio.c
index 93057b4..67fe48f 100644
--- a/libsrc/posixio.c
+++ b/libsrc/posixio.c
@@ -6,33 +6,41 @@
 
 /* For MinGW Build */
 
-
+#if HAVE_CONFIG_H
 #include <config.h>
+#endif
+
 #include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
 
 /* Windows platforms, including MinGW, Cygwin, Visual Studio */
 #if defined(_WIN32) || defined(_WIN64)
 #include <windows.h>
 #include <winbase.h>
 #include <io.h>
-#else
-#include <unistd.h>
 #endif
 
-#include <assert.h>
-#include <stdlib.h>
-#include <errno.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 #ifndef NC_NOERR
 #define NC_NOERR 0
 #endif
 
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <fcntl.h>
-#include <string.h>
-
 #ifndef HAVE_SSIZE_T
 typedef int ssize_t;
 #endif
@@ -170,7 +178,8 @@ pagesize(void)
 static size_t
 blksize(int fd)
 {
-#if defined(HAVE_ST_BLKSIZE)
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+#ifdef HAVE_SYS_STAT_H
 	struct stat sb;
 	if (fstat(fd, &sb) > -1)
 	{
@@ -180,6 +189,7 @@ blksize(int fd)
 	}
 	/* else, silent in the face of error */
 #endif
+#endif
 	return (size_t) 2 * pagesize();
 }
 
diff --git a/libsrc/putget.c b/libsrc/putget.c
index 2ae29b2..96966be 100644
--- a/libsrc/putget.c
+++ b/libsrc/putget.c
@@ -1,16 +1,22 @@
+#line 9 "putget.m4"
 /* Do not edit this file. It is produced from the corresponding .m4 source */
+#line 11
 /*
  *	Copyright 1996, University Corporation for Atmospheric Research
  *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 /* $Id: putget.m4 2783 2014-10-26 05:19:35Z wkliao $ */
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <string.h>
 #include <stdlib.h>
 #include <assert.h>
 
 #include "netcdf.h"
+#include "nc3dispatch.h"
 #include "nc3internal.h"
 #include "ncx.h"
 #include "fbits.h"
@@ -21,7 +27,6 @@
 #    include <stdio.h>
 #  endif
 #endif
-#include "nc3dispatch.h"
 
 
 #undef MIN  /* system may define MIN somewhere and complain */
@@ -70,6 +75,7 @@ arrayp(const char *label, size_t count, const size_t *array)
 #endif
 
 
+#line 110
 
 /*
  * Next 6 type specific functions
@@ -78,252 +84,480 @@ arrayp(const char *label, size_t count, const size_t *array)
 NC_arrayfill()
  */
 static int
+#line 117
 NC_fill_schar(
+#line 117
 	void **xpp,
+#line 117
 	size_t nelems)	/* how many */
+#line 117
 {
+#line 117
 	schar fillp[NFILL * sizeof(double)/X_SIZEOF_CHAR];
+#line 117
 
+#line 117
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 117
 
+#line 117
 	{
+#line 117
 		schar *vp = fillp;	/* lower bound of area to be filled */
+#line 117
 		const schar *const end = vp + nelems;
+#line 117
 		while(vp < end)
+#line 117
 		{
+#line 117
 			*vp++ = NC_FILL_BYTE;
+#line 117
 		}
+#line 117
 	}
-	return ncx_putn_schar_schar(xpp, nelems, fillp);
+#line 117
+	return ncx_putn_schar_schar(xpp, nelems, fillp ,NULL);
+#line 117
 }
+#line 117
 
 static int
+#line 118
 NC_fill_char(
+#line 118
 	void **xpp,
+#line 118
 	size_t nelems)	/* how many */
+#line 118
 {
+#line 118
 	char fillp[NFILL * sizeof(double)/X_SIZEOF_CHAR];
+#line 118
 
+#line 118
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 118
 
+#line 118
 	{
+#line 118
 		char *vp = fillp;	/* lower bound of area to be filled */
+#line 118
 		const char *const end = vp + nelems;
+#line 118
 		while(vp < end)
+#line 118
 		{
+#line 118
 			*vp++ = NC_FILL_CHAR;
+#line 118
 		}
+#line 118
 	}
-	return ncx_putn_char_char(xpp, nelems, fillp);
+#line 118
+	return ncx_putn_char_char(xpp, nelems, fillp );
+#line 118
 }
+#line 118
 
 static int
+#line 119
 NC_fill_short(
+#line 119
 	void **xpp,
+#line 119
 	size_t nelems)	/* how many */
+#line 119
 {
+#line 119
 	short fillp[NFILL * sizeof(double)/X_SIZEOF_SHORT];
+#line 119
 
+#line 119
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 119
 
+#line 119
 	{
+#line 119
 		short *vp = fillp;	/* lower bound of area to be filled */
+#line 119
 		const short *const end = vp + nelems;
+#line 119
 		while(vp < end)
+#line 119
 		{
+#line 119
 			*vp++ = NC_FILL_SHORT;
+#line 119
 		}
+#line 119
 	}
-	return ncx_putn_short_short(xpp, nelems, fillp);
+#line 119
+	return ncx_putn_short_short(xpp, nelems, fillp ,NULL);
+#line 119
 }
+#line 119
 
 
 #if (SIZEOF_INT >= X_SIZEOF_INT)
 static int
+#line 122
 NC_fill_int(
+#line 122
 	void **xpp,
+#line 122
 	size_t nelems)	/* how many */
+#line 122
 {
+#line 122
 	int fillp[NFILL * sizeof(double)/X_SIZEOF_INT];
+#line 122
 
+#line 122
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 122
 
+#line 122
 	{
+#line 122
 		int *vp = fillp;	/* lower bound of area to be filled */
+#line 122
 		const int *const end = vp + nelems;
+#line 122
 		while(vp < end)
+#line 122
 		{
+#line 122
 			*vp++ = NC_FILL_INT;
+#line 122
 		}
+#line 122
 	}
-	return ncx_putn_int_int(xpp, nelems, fillp);
+#line 122
+	return ncx_putn_int_int(xpp, nelems, fillp ,NULL);
+#line 122
 }
+#line 122
 
 #elif SIZEOF_LONG == X_SIZEOF_INT
 static int
+#line 124
 NC_fill_int(
+#line 124
 	void **xpp,
+#line 124
 	size_t nelems)	/* how many */
+#line 124
 {
+#line 124
 	long fillp[NFILL * sizeof(double)/X_SIZEOF_INT];
+#line 124
 
+#line 124
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 124
 
+#line 124
 	{
+#line 124
 		long *vp = fillp;	/* lower bound of area to be filled */
+#line 124
 		const long *const end = vp + nelems;
+#line 124
 		while(vp < end)
+#line 124
 		{
+#line 124
 			*vp++ = NC_FILL_INT;
+#line 124
 		}
+#line 124
 	}
-	return ncx_putn_int_long(xpp, nelems, fillp);
+#line 124
+	return ncx_putn_int_long(xpp, nelems, fillp ,NULL);
+#line 124
 }
+#line 124
 
 #else
 #error "NC_fill_int implementation"
 #endif
 
 static int
+#line 129
 NC_fill_float(
+#line 129
 	void **xpp,
+#line 129
 	size_t nelems)	/* how many */
+#line 129
 {
+#line 129
 	float fillp[NFILL * sizeof(double)/X_SIZEOF_FLOAT];
+#line 129
 
+#line 129
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 129
 
+#line 129
 	{
+#line 129
 		float *vp = fillp;	/* lower bound of area to be filled */
+#line 129
 		const float *const end = vp + nelems;
+#line 129
 		while(vp < end)
+#line 129
 		{
+#line 129
 			*vp++ = NC_FILL_FLOAT;
+#line 129
 		}
+#line 129
 	}
-	return ncx_putn_float_float(xpp, nelems, fillp);
+#line 129
+	return ncx_putn_float_float(xpp, nelems, fillp ,NULL);
+#line 129
 }
+#line 129
 
 static int
+#line 130
 NC_fill_double(
+#line 130
 	void **xpp,
+#line 130
 	size_t nelems)	/* how many */
+#line 130
 {
+#line 130
 	double fillp[NFILL * sizeof(double)/X_SIZEOF_DOUBLE];
+#line 130
 
+#line 130
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 130
 
+#line 130
 	{
+#line 130
 		double *vp = fillp;	/* lower bound of area to be filled */
+#line 130
 		const double *const end = vp + nelems;
+#line 130
 		while(vp < end)
+#line 130
 		{
+#line 130
 			*vp++ = NC_FILL_DOUBLE;
+#line 130
 		}
+#line 130
 	}
-	return ncx_putn_double_double(xpp, nelems, fillp);
+#line 130
+	return ncx_putn_double_double(xpp, nelems, fillp ,NULL);
+#line 130
 }
+#line 130
 
 
 static int
+#line 132
 NC_fill_uchar(
+#line 132
 	void **xpp,
+#line 132
 	size_t nelems)	/* how many */
+#line 132
 {
+#line 132
 	uchar fillp[NFILL * sizeof(double)/X_SIZEOF_UBYTE];
+#line 132
 
+#line 132
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 132
 
+#line 132
 	{
+#line 132
 		uchar *vp = fillp;	/* lower bound of area to be filled */
+#line 132
 		const uchar *const end = vp + nelems;
+#line 132
 		while(vp < end)
+#line 132
 		{
+#line 132
 			*vp++ = NC_FILL_UBYTE;
+#line 132
 		}
+#line 132
 	}
-	return ncx_putn_uchar_uchar(xpp, nelems, fillp);
+#line 132
+	return ncx_putn_uchar_uchar(xpp, nelems, fillp ,NULL);
+#line 132
 }
+#line 132
 
 static int
+#line 133
 NC_fill_ushort(
+#line 133
 	void **xpp,
+#line 133
 	size_t nelems)	/* how many */
+#line 133
 {
+#line 133
 	ushort fillp[NFILL * sizeof(double)/X_SIZEOF_USHORT];
+#line 133
 
+#line 133
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 133
 
+#line 133
 	{
+#line 133
 		ushort *vp = fillp;	/* lower bound of area to be filled */
+#line 133
 		const ushort *const end = vp + nelems;
+#line 133
 		while(vp < end)
+#line 133
 		{
+#line 133
 			*vp++ = NC_FILL_USHORT;
+#line 133
 		}
+#line 133
 	}
-	return ncx_putn_ushort_ushort(xpp, nelems, fillp);
+#line 133
+	return ncx_putn_ushort_ushort(xpp, nelems, fillp ,NULL);
+#line 133
 }
+#line 133
 
 static int
+#line 134
 NC_fill_uint(
+#line 134
 	void **xpp,
+#line 134
 	size_t nelems)	/* how many */
+#line 134
 {
+#line 134
 	uint fillp[NFILL * sizeof(double)/X_SIZEOF_UINT];
+#line 134
 
+#line 134
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 134
 
+#line 134
 	{
+#line 134
 		uint *vp = fillp;	/* lower bound of area to be filled */
+#line 134
 		const uint *const end = vp + nelems;
+#line 134
 		while(vp < end)
+#line 134
 		{
+#line 134
 			*vp++ = NC_FILL_UINT;
+#line 134
 		}
+#line 134
 	}
-	return ncx_putn_uint_uint(xpp, nelems, fillp);
+#line 134
+	return ncx_putn_uint_uint(xpp, nelems, fillp ,NULL);
+#line 134
 }
+#line 134
 
 static int
+#line 135
 NC_fill_longlong(
+#line 135
 	void **xpp,
+#line 135
 	size_t nelems)	/* how many */
+#line 135
 {
+#line 135
 	longlong fillp[NFILL * sizeof(double)/X_SIZEOF_LONGLONG];
+#line 135
 
+#line 135
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 135
 
+#line 135
 	{
+#line 135
 		longlong *vp = fillp;	/* lower bound of area to be filled */
+#line 135
 		const longlong *const end = vp + nelems;
+#line 135
 		while(vp < end)
+#line 135
 		{
+#line 135
 			*vp++ = NC_FILL_INT64;
+#line 135
 		}
+#line 135
 	}
-	return ncx_putn_longlong_longlong(xpp, nelems, fillp);
+#line 135
+	return ncx_putn_longlong_longlong(xpp, nelems, fillp ,NULL);
+#line 135
 }
+#line 135
 
 static int
+#line 136
 NC_fill_ulonglong(
+#line 136
 	void **xpp,
+#line 136
 	size_t nelems)	/* how many */
+#line 136
 {
+#line 136
 	ulonglong fillp[NFILL * sizeof(double)/X_SIZEOF_ULONGLONG];
+#line 136
 
+#line 136
 	assert(nelems <= sizeof(fillp)/sizeof(fillp[0]));
+#line 136
 
+#line 136
 	{
+#line 136
 		ulonglong *vp = fillp;	/* lower bound of area to be filled */
+#line 136
 		const ulonglong *const end = vp + nelems;
+#line 136
 		while(vp < end)
+#line 136
 		{
+#line 136
 			*vp++ = NC_FILL_UINT64;
+#line 136
 		}
+#line 136
 	}
-	return ncx_putn_ulonglong_ulonglong(xpp, nelems, fillp);
+#line 136
+	return ncx_putn_ulonglong_ulonglong(xpp, nelems, fillp ,NULL);
+#line 136
 }
+#line 136
 
 
 
@@ -735,7 +969,11 @@ NCcoordck(NC3_INFO* ncp, const NC_var *varp, const size_t *coord)
 	{
 		if(*coord > X_UINT_MAX) /* rkr: bug fix from previous X_INT_MAX */
 			return NC_EINVALCOORDS; /* sanity check */
+#ifdef RELAX_COORD_BOUND
+		if(NC_readonly(ncp) && *coord > NC_get_numrecs(ncp))
+#else
 		if(NC_readonly(ncp) && *coord >= NC_get_numrecs(ncp))
+#endif
 		{
 			if(!NC_doNsync(ncp))
 				return NC_EINVALCOORDS;
@@ -745,7 +983,11 @@ NCcoordck(NC3_INFO* ncp, const NC_var *varp, const size_t *coord)
 				const int status = read_numrecs(ncp);
 				if(status != NC_NOERR)
 					return status;
+#ifdef RELAX_COORD_BOUND
+				if(*coord > NC_get_numrecs(ncp))
+#else
 				if(*coord >= NC_get_numrecs(ncp))
+#endif
 					return NC_EINVALCOORDS;
 			}
 		}
@@ -772,7 +1014,11 @@ fprintf(stderr,"	NCcoordck: ip %p, *ip %ld, up %p, *up %lu\n",
 #endif /* CDEBUG */
 
 		/* cast needed for braindead systems with signed size_t */
+#ifdef RELAX_COORD_BOUND
+		if((unsigned long) *ip > (unsigned long) *up )
+#else
 		if((unsigned long) *ip >= (unsigned long) *up )
+#endif
 			return NC_EINVALCOORDS;
 	}
 
@@ -796,6 +1042,11 @@ NCedgeck(const NC3_INFO* ncp, const NC_var *varp,
 
 	if(IS_RECVAR(varp))
 	{
+#ifdef RELAX_COORD_BOUND
+		if (NC_readonly(ncp) &&
+                    (start[0] == NC_get_numrecs(ncp) && edges[0] > 0))
+			return(NC_EINVALCOORDS);
+#endif
 		start++;
 		edges++;
 		shp++;
@@ -803,6 +1054,10 @@ NCedgeck(const NC3_INFO* ncp, const NC_var *varp,
 
 	for(; start < end; start++, edges++, shp++)
 	{
+#ifdef RELAX_COORD_BOUND
+		if ((unsigned long) *start == *shp && *edges > 0)
+			return(NC_EINVALCOORDS);
+#endif
 		/* cast needed for braindead systems with signed size_t */
 		if((unsigned long) *edges > *shp ||
 			(unsigned long) *start + (unsigned long) *edges > *shp)
@@ -856,8655 +1111,18090 @@ NC_varoffset(const NC3_INFO* ncp, const NC_var *varp, const size_t *coord)
 }
 
 
+#line 749
 
 static int
+#line 750
 putNCvx_char_char(NC3_INFO* ncp, const NC_var *varp,
+#line 750
 		 const size_t *start, size_t nelems, const char *value)
+#line 750
 {
+#line 750
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 750
 	size_t remaining = varp->xsz * nelems;
+#line 750
 	int status = NC_NOERR;
+#line 750
 	void *xp;
+#line 750
+        void *fillp;
+#line 750
 
+#line 750
 	if(nelems == 0)
+#line 750
 		return NC_NOERR;
+#line 750
 
+#line 750
 	assert(value != NULL);
+#line 750
 
+#line 750
+        fillp = malloc(varp->xsz);
+#line 750
+	status = NC3_inq_var_fill(varp, fillp);
+#line 750
+
+#line 750
 	for(;;)
+#line 750
 	{
+#line 750
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 750
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 750
 
+#line 750
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 750
 				 RGN_WRITE, &xp);
+#line 750
 		if(lstatus != NC_NOERR)
+#line 750
 			return lstatus;
+#line 750
 
-		lstatus = ncx_putn_char_char(&xp, nput, value);
+#line 750
+		lstatus = ncx_putn_char_char(&xp, nput, value );
+#line 750
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 750
 		{
+#line 750
 			/* not fatal to the loop */
+#line 750
 			status = lstatus;
+#line 750
 		}
+#line 750
 
+#line 750
 		(void) ncio_rel(ncp->nciop, offset,
+#line 750
 				 RGN_MODIFIED);
+#line 750
 
+#line 750
 		remaining -= extent;
+#line 750
 		if(remaining == 0)
+#line 750
 			break; /* normal loop exit */
-		offset += extent;
+#line 750
+		offset += (off_t)extent;
+#line 750
 		value += nput;
+#line 750
 
+#line 750
 	}
+#line 750
+        free(fillp);
+#line 750
 
+#line 750
 	return status;
+#line 750
 }
+#line 750
 
 
 static int
+#line 752
 putNCvx_schar_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 752
 		 const size_t *start, size_t nelems, const schar *value)
+#line 752
 {
+#line 752
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 752
 	size_t remaining = varp->xsz * nelems;
+#line 752
 	int status = NC_NOERR;
+#line 752
 	void *xp;
+#line 752
+        void *fillp;
+#line 752
 
+#line 752
 	if(nelems == 0)
+#line 752
 		return NC_NOERR;
+#line 752
 
+#line 752
 	assert(value != NULL);
+#line 752
+
+#line 752
+        fillp = malloc(varp->xsz);
+#line 752
+	status = NC3_inq_var_fill(varp, fillp);
+#line 752
 
+#line 752
 	for(;;)
+#line 752
 	{
+#line 752
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 752
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 752
 
+#line 752
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 752
 				 RGN_WRITE, &xp);
+#line 752
 		if(lstatus != NC_NOERR)
+#line 752
 			return lstatus;
+#line 752
 
-		lstatus = ncx_putn_schar_schar(&xp, nput, value);
+#line 752
+		lstatus = ncx_putn_schar_schar(&xp, nput, value ,fillp);
+#line 752
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 752
 		{
+#line 752
 			/* not fatal to the loop */
+#line 752
 			status = lstatus;
+#line 752
 		}
+#line 752
 
+#line 752
 		(void) ncio_rel(ncp->nciop, offset,
+#line 752
 				 RGN_MODIFIED);
+#line 752
 
+#line 752
 		remaining -= extent;
+#line 752
 		if(remaining == 0)
+#line 752
 			break; /* normal loop exit */
-		offset += extent;
+#line 752
+		offset += (off_t)extent;
+#line 752
 		value += nput;
+#line 752
 
+#line 752
 	}
+#line 752
+        free(fillp);
+#line 752
 
+#line 752
 	return status;
+#line 752
 }
+#line 752
 
 static int
+#line 753
 putNCvx_schar_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 753
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 753
 {
+#line 753
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 753
 	size_t remaining = varp->xsz * nelems;
+#line 753
 	int status = NC_NOERR;
+#line 753
 	void *xp;
+#line 753
+        void *fillp;
+#line 753
 
+#line 753
 	if(nelems == 0)
+#line 753
 		return NC_NOERR;
+#line 753
 
+#line 753
 	assert(value != NULL);
+#line 753
+
+#line 753
+        fillp = malloc(varp->xsz);
+#line 753
+	status = NC3_inq_var_fill(varp, fillp);
+#line 753
 
+#line 753
 	for(;;)
+#line 753
 	{
+#line 753
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 753
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 753
 
+#line 753
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 753
 				 RGN_WRITE, &xp);
+#line 753
 		if(lstatus != NC_NOERR)
+#line 753
 			return lstatus;
+#line 753
 
-		lstatus = ncx_putn_schar_uchar(&xp, nput, value);
+#line 753
+		lstatus = ncx_putn_schar_uchar(&xp, nput, value ,fillp);
+#line 753
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 753
 		{
+#line 753
 			/* not fatal to the loop */
+#line 753
 			status = lstatus;
+#line 753
 		}
+#line 753
 
+#line 753
 		(void) ncio_rel(ncp->nciop, offset,
+#line 753
 				 RGN_MODIFIED);
+#line 753
 
+#line 753
 		remaining -= extent;
+#line 753
 		if(remaining == 0)
+#line 753
 			break; /* normal loop exit */
-		offset += extent;
+#line 753
+		offset += (off_t)extent;
+#line 753
 		value += nput;
+#line 753
 
+#line 753
 	}
+#line 753
+        free(fillp);
+#line 753
 
+#line 753
 	return status;
+#line 753
 }
+#line 753
 
 static int
+#line 754
 putNCvx_schar_short(NC3_INFO* ncp, const NC_var *varp,
+#line 754
 		 const size_t *start, size_t nelems, const short *value)
+#line 754
 {
+#line 754
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 754
 	size_t remaining = varp->xsz * nelems;
+#line 754
 	int status = NC_NOERR;
+#line 754
 	void *xp;
+#line 754
+        void *fillp;
+#line 754
 
+#line 754
 	if(nelems == 0)
+#line 754
 		return NC_NOERR;
+#line 754
 
+#line 754
 	assert(value != NULL);
+#line 754
 
+#line 754
+        fillp = malloc(varp->xsz);
+#line 754
+	status = NC3_inq_var_fill(varp, fillp);
+#line 754
+
+#line 754
 	for(;;)
+#line 754
 	{
+#line 754
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 754
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 754
 
+#line 754
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 754
 				 RGN_WRITE, &xp);
+#line 754
 		if(lstatus != NC_NOERR)
+#line 754
 			return lstatus;
+#line 754
 
-		lstatus = ncx_putn_schar_short(&xp, nput, value);
+#line 754
+		lstatus = ncx_putn_schar_short(&xp, nput, value ,fillp);
+#line 754
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 754
 		{
+#line 754
 			/* not fatal to the loop */
+#line 754
 			status = lstatus;
+#line 754
 		}
+#line 754
 
+#line 754
 		(void) ncio_rel(ncp->nciop, offset,
+#line 754
 				 RGN_MODIFIED);
+#line 754
 
+#line 754
 		remaining -= extent;
+#line 754
 		if(remaining == 0)
+#line 754
 			break; /* normal loop exit */
-		offset += extent;
+#line 754
+		offset += (off_t)extent;
+#line 754
 		value += nput;
+#line 754
 
+#line 754
 	}
+#line 754
+        free(fillp);
+#line 754
 
+#line 754
 	return status;
+#line 754
 }
+#line 754
 
 static int
+#line 755
 putNCvx_schar_int(NC3_INFO* ncp, const NC_var *varp,
+#line 755
 		 const size_t *start, size_t nelems, const int *value)
+#line 755
 {
+#line 755
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 755
 	size_t remaining = varp->xsz * nelems;
+#line 755
 	int status = NC_NOERR;
+#line 755
 	void *xp;
+#line 755
+        void *fillp;
+#line 755
 
+#line 755
 	if(nelems == 0)
+#line 755
 		return NC_NOERR;
+#line 755
 
+#line 755
 	assert(value != NULL);
+#line 755
+
+#line 755
+        fillp = malloc(varp->xsz);
+#line 755
+	status = NC3_inq_var_fill(varp, fillp);
+#line 755
 
+#line 755
 	for(;;)
+#line 755
 	{
+#line 755
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 755
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 755
 
+#line 755
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 755
 				 RGN_WRITE, &xp);
+#line 755
 		if(lstatus != NC_NOERR)
+#line 755
 			return lstatus;
+#line 755
 
-		lstatus = ncx_putn_schar_int(&xp, nput, value);
+#line 755
+		lstatus = ncx_putn_schar_int(&xp, nput, value ,fillp);
+#line 755
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 755
 		{
+#line 755
 			/* not fatal to the loop */
+#line 755
 			status = lstatus;
+#line 755
 		}
+#line 755
 
+#line 755
 		(void) ncio_rel(ncp->nciop, offset,
+#line 755
 				 RGN_MODIFIED);
+#line 755
 
+#line 755
 		remaining -= extent;
+#line 755
 		if(remaining == 0)
+#line 755
 			break; /* normal loop exit */
-		offset += extent;
+#line 755
+		offset += (off_t)extent;
+#line 755
 		value += nput;
+#line 755
 
+#line 755
 	}
+#line 755
+        free(fillp);
+#line 755
 
+#line 755
 	return status;
+#line 755
 }
+#line 755
 
 static int
+#line 756
 putNCvx_schar_float(NC3_INFO* ncp, const NC_var *varp,
+#line 756
 		 const size_t *start, size_t nelems, const float *value)
+#line 756
 {
+#line 756
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 756
 	size_t remaining = varp->xsz * nelems;
+#line 756
 	int status = NC_NOERR;
+#line 756
 	void *xp;
+#line 756
+        void *fillp;
+#line 756
 
+#line 756
 	if(nelems == 0)
+#line 756
 		return NC_NOERR;
+#line 756
 
+#line 756
 	assert(value != NULL);
+#line 756
 
+#line 756
+        fillp = malloc(varp->xsz);
+#line 756
+	status = NC3_inq_var_fill(varp, fillp);
+#line 756
+
+#line 756
 	for(;;)
+#line 756
 	{
+#line 756
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 756
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 756
 
+#line 756
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 756
 				 RGN_WRITE, &xp);
+#line 756
 		if(lstatus != NC_NOERR)
+#line 756
 			return lstatus;
+#line 756
 
-		lstatus = ncx_putn_schar_float(&xp, nput, value);
+#line 756
+		lstatus = ncx_putn_schar_float(&xp, nput, value ,fillp);
+#line 756
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 756
 		{
+#line 756
 			/* not fatal to the loop */
+#line 756
 			status = lstatus;
+#line 756
 		}
+#line 756
 
+#line 756
 		(void) ncio_rel(ncp->nciop, offset,
+#line 756
 				 RGN_MODIFIED);
+#line 756
 
+#line 756
 		remaining -= extent;
+#line 756
 		if(remaining == 0)
+#line 756
 			break; /* normal loop exit */
-		offset += extent;
+#line 756
+		offset += (off_t)extent;
+#line 756
 		value += nput;
+#line 756
 
+#line 756
 	}
+#line 756
+        free(fillp);
+#line 756
 
+#line 756
 	return status;
+#line 756
 }
+#line 756
 
 static int
+#line 757
 putNCvx_schar_double(NC3_INFO* ncp, const NC_var *varp,
+#line 757
 		 const size_t *start, size_t nelems, const double *value)
+#line 757
 {
+#line 757
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 757
 	size_t remaining = varp->xsz * nelems;
+#line 757
 	int status = NC_NOERR;
+#line 757
 	void *xp;
+#line 757
+        void *fillp;
+#line 757
 
+#line 757
 	if(nelems == 0)
+#line 757
 		return NC_NOERR;
+#line 757
 
+#line 757
 	assert(value != NULL);
+#line 757
+
+#line 757
+        fillp = malloc(varp->xsz);
+#line 757
+	status = NC3_inq_var_fill(varp, fillp);
+#line 757
 
+#line 757
 	for(;;)
+#line 757
 	{
+#line 757
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 757
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 757
 
+#line 757
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 757
 				 RGN_WRITE, &xp);
+#line 757
 		if(lstatus != NC_NOERR)
+#line 757
 			return lstatus;
+#line 757
 
-		lstatus = ncx_putn_schar_double(&xp, nput, value);
+#line 757
+		lstatus = ncx_putn_schar_double(&xp, nput, value ,fillp);
+#line 757
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 757
 		{
+#line 757
 			/* not fatal to the loop */
+#line 757
 			status = lstatus;
+#line 757
 		}
+#line 757
 
+#line 757
 		(void) ncio_rel(ncp->nciop, offset,
+#line 757
 				 RGN_MODIFIED);
+#line 757
 
+#line 757
 		remaining -= extent;
+#line 757
 		if(remaining == 0)
+#line 757
 			break; /* normal loop exit */
-		offset += extent;
+#line 757
+		offset += (off_t)extent;
+#line 757
 		value += nput;
+#line 757
 
+#line 757
 	}
+#line 757
+        free(fillp);
+#line 757
 
+#line 757
 	return status;
+#line 757
 }
+#line 757
 
 static int
+#line 758
 putNCvx_schar_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 758
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 758
 {
+#line 758
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 758
 	size_t remaining = varp->xsz * nelems;
+#line 758
 	int status = NC_NOERR;
+#line 758
 	void *xp;
+#line 758
+        void *fillp;
+#line 758
 
+#line 758
 	if(nelems == 0)
+#line 758
 		return NC_NOERR;
+#line 758
 
+#line 758
 	assert(value != NULL);
+#line 758
 
+#line 758
+        fillp = malloc(varp->xsz);
+#line 758
+	status = NC3_inq_var_fill(varp, fillp);
+#line 758
+
+#line 758
 	for(;;)
+#line 758
 	{
+#line 758
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 758
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 758
 
+#line 758
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 758
 				 RGN_WRITE, &xp);
+#line 758
 		if(lstatus != NC_NOERR)
+#line 758
 			return lstatus;
+#line 758
 
-		lstatus = ncx_putn_schar_longlong(&xp, nput, value);
+#line 758
+		lstatus = ncx_putn_schar_longlong(&xp, nput, value ,fillp);
+#line 758
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 758
 		{
+#line 758
 			/* not fatal to the loop */
+#line 758
 			status = lstatus;
+#line 758
 		}
+#line 758
 
+#line 758
 		(void) ncio_rel(ncp->nciop, offset,
+#line 758
 				 RGN_MODIFIED);
+#line 758
 
+#line 758
 		remaining -= extent;
+#line 758
 		if(remaining == 0)
+#line 758
 			break; /* normal loop exit */
-		offset += extent;
+#line 758
+		offset += (off_t)extent;
+#line 758
 		value += nput;
+#line 758
 
+#line 758
 	}
+#line 758
+        free(fillp);
+#line 758
 
+#line 758
 	return status;
+#line 758
 }
+#line 758
 
 static int
+#line 759
 putNCvx_schar_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 759
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 759
 {
+#line 759
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 759
 	size_t remaining = varp->xsz * nelems;
+#line 759
 	int status = NC_NOERR;
+#line 759
 	void *xp;
+#line 759
+        void *fillp;
+#line 759
 
+#line 759
 	if(nelems == 0)
+#line 759
 		return NC_NOERR;
+#line 759
 
+#line 759
 	assert(value != NULL);
+#line 759
+
+#line 759
+        fillp = malloc(varp->xsz);
+#line 759
+	status = NC3_inq_var_fill(varp, fillp);
+#line 759
 
+#line 759
 	for(;;)
+#line 759
 	{
+#line 759
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 759
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 759
 
+#line 759
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 759
 				 RGN_WRITE, &xp);
+#line 759
 		if(lstatus != NC_NOERR)
+#line 759
 			return lstatus;
+#line 759
 
-		lstatus = ncx_putn_schar_ushort(&xp, nput, value);
+#line 759
+		lstatus = ncx_putn_schar_ushort(&xp, nput, value ,fillp);
+#line 759
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 759
 		{
+#line 759
 			/* not fatal to the loop */
+#line 759
 			status = lstatus;
+#line 759
 		}
+#line 759
 
+#line 759
 		(void) ncio_rel(ncp->nciop, offset,
+#line 759
 				 RGN_MODIFIED);
+#line 759
 
+#line 759
 		remaining -= extent;
+#line 759
 		if(remaining == 0)
+#line 759
 			break; /* normal loop exit */
-		offset += extent;
+#line 759
+		offset += (off_t)extent;
+#line 759
 		value += nput;
+#line 759
 
+#line 759
 	}
+#line 759
+        free(fillp);
+#line 759
 
+#line 759
 	return status;
+#line 759
 }
+#line 759
 
 static int
+#line 760
 putNCvx_schar_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 760
 		 const size_t *start, size_t nelems, const uint *value)
+#line 760
 {
+#line 760
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 760
 	size_t remaining = varp->xsz * nelems;
+#line 760
 	int status = NC_NOERR;
+#line 760
 	void *xp;
+#line 760
+        void *fillp;
+#line 760
 
+#line 760
 	if(nelems == 0)
+#line 760
 		return NC_NOERR;
+#line 760
 
+#line 760
 	assert(value != NULL);
+#line 760
+
+#line 760
+        fillp = malloc(varp->xsz);
+#line 760
+	status = NC3_inq_var_fill(varp, fillp);
+#line 760
 
+#line 760
 	for(;;)
+#line 760
 	{
+#line 760
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 760
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 760
 
+#line 760
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 760
 				 RGN_WRITE, &xp);
+#line 760
 		if(lstatus != NC_NOERR)
+#line 760
 			return lstatus;
+#line 760
 
-		lstatus = ncx_putn_schar_uint(&xp, nput, value);
+#line 760
+		lstatus = ncx_putn_schar_uint(&xp, nput, value ,fillp);
+#line 760
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 760
 		{
+#line 760
 			/* not fatal to the loop */
+#line 760
 			status = lstatus;
+#line 760
 		}
+#line 760
 
+#line 760
 		(void) ncio_rel(ncp->nciop, offset,
+#line 760
 				 RGN_MODIFIED);
+#line 760
 
+#line 760
 		remaining -= extent;
+#line 760
 		if(remaining == 0)
+#line 760
 			break; /* normal loop exit */
-		offset += extent;
+#line 760
+		offset += (off_t)extent;
+#line 760
 		value += nput;
+#line 760
 
+#line 760
 	}
+#line 760
+        free(fillp);
+#line 760
 
+#line 760
 	return status;
+#line 760
 }
+#line 760
 
 static int
+#line 761
 putNCvx_schar_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 761
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 761
 {
+#line 761
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 761
 	size_t remaining = varp->xsz * nelems;
+#line 761
 	int status = NC_NOERR;
+#line 761
 	void *xp;
+#line 761
+        void *fillp;
+#line 761
 
+#line 761
 	if(nelems == 0)
+#line 761
 		return NC_NOERR;
+#line 761
 
+#line 761
 	assert(value != NULL);
+#line 761
 
+#line 761
+        fillp = malloc(varp->xsz);
+#line 761
+	status = NC3_inq_var_fill(varp, fillp);
+#line 761
+
+#line 761
 	for(;;)
+#line 761
 	{
+#line 761
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 761
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 761
 
+#line 761
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 761
 				 RGN_WRITE, &xp);
+#line 761
 		if(lstatus != NC_NOERR)
+#line 761
 			return lstatus;
+#line 761
 
-		lstatus = ncx_putn_schar_ulonglong(&xp, nput, value);
+#line 761
+		lstatus = ncx_putn_schar_ulonglong(&xp, nput, value ,fillp);
+#line 761
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 761
 		{
+#line 761
 			/* not fatal to the loop */
+#line 761
 			status = lstatus;
+#line 761
 		}
+#line 761
 
+#line 761
 		(void) ncio_rel(ncp->nciop, offset,
+#line 761
 				 RGN_MODIFIED);
+#line 761
 
+#line 761
 		remaining -= extent;
+#line 761
 		if(remaining == 0)
+#line 761
 			break; /* normal loop exit */
-		offset += extent;
+#line 761
+		offset += (off_t)extent;
+#line 761
 		value += nput;
+#line 761
 
+#line 761
 	}
+#line 761
+        free(fillp);
+#line 761
 
+#line 761
 	return status;
+#line 761
 }
+#line 761
 
 
 static int
+#line 763
 putNCvx_short_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 763
 		 const size_t *start, size_t nelems, const schar *value)
+#line 763
 {
+#line 763
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 763
 	size_t remaining = varp->xsz * nelems;
+#line 763
 	int status = NC_NOERR;
+#line 763
 	void *xp;
+#line 763
+        void *fillp;
+#line 763
 
+#line 763
 	if(nelems == 0)
+#line 763
 		return NC_NOERR;
+#line 763
 
+#line 763
 	assert(value != NULL);
+#line 763
+
+#line 763
+        fillp = malloc(varp->xsz);
+#line 763
+	status = NC3_inq_var_fill(varp, fillp);
+#line 763
 
+#line 763
 	for(;;)
+#line 763
 	{
+#line 763
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 763
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 763
 
+#line 763
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 763
 				 RGN_WRITE, &xp);
+#line 763
 		if(lstatus != NC_NOERR)
+#line 763
 			return lstatus;
+#line 763
 
-		lstatus = ncx_putn_short_schar(&xp, nput, value);
+#line 763
+		lstatus = ncx_putn_short_schar(&xp, nput, value ,fillp);
+#line 763
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 763
 		{
+#line 763
 			/* not fatal to the loop */
+#line 763
 			status = lstatus;
+#line 763
 		}
+#line 763
 
+#line 763
 		(void) ncio_rel(ncp->nciop, offset,
+#line 763
 				 RGN_MODIFIED);
+#line 763
 
+#line 763
 		remaining -= extent;
+#line 763
 		if(remaining == 0)
+#line 763
 			break; /* normal loop exit */
-		offset += extent;
+#line 763
+		offset += (off_t)extent;
+#line 763
 		value += nput;
+#line 763
 
+#line 763
 	}
+#line 763
+        free(fillp);
+#line 763
 
+#line 763
 	return status;
+#line 763
 }
+#line 763
 
 static int
+#line 764
 putNCvx_short_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 764
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 764
 {
+#line 764
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 764
 	size_t remaining = varp->xsz * nelems;
+#line 764
 	int status = NC_NOERR;
+#line 764
 	void *xp;
+#line 764
+        void *fillp;
+#line 764
 
+#line 764
 	if(nelems == 0)
+#line 764
 		return NC_NOERR;
+#line 764
 
+#line 764
 	assert(value != NULL);
+#line 764
 
+#line 764
+        fillp = malloc(varp->xsz);
+#line 764
+	status = NC3_inq_var_fill(varp, fillp);
+#line 764
+
+#line 764
 	for(;;)
+#line 764
 	{
+#line 764
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 764
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 764
 
+#line 764
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 764
 				 RGN_WRITE, &xp);
+#line 764
 		if(lstatus != NC_NOERR)
+#line 764
 			return lstatus;
+#line 764
 
-		lstatus = ncx_putn_short_uchar(&xp, nput, value);
+#line 764
+		lstatus = ncx_putn_short_uchar(&xp, nput, value ,fillp);
+#line 764
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 764
 		{
+#line 764
 			/* not fatal to the loop */
+#line 764
 			status = lstatus;
+#line 764
 		}
+#line 764
 
+#line 764
 		(void) ncio_rel(ncp->nciop, offset,
+#line 764
 				 RGN_MODIFIED);
+#line 764
 
+#line 764
 		remaining -= extent;
+#line 764
 		if(remaining == 0)
+#line 764
 			break; /* normal loop exit */
-		offset += extent;
+#line 764
+		offset += (off_t)extent;
+#line 764
 		value += nput;
+#line 764
 
+#line 764
 	}
+#line 764
+        free(fillp);
+#line 764
 
+#line 764
 	return status;
+#line 764
 }
+#line 764
 
 static int
+#line 765
 putNCvx_short_short(NC3_INFO* ncp, const NC_var *varp,
+#line 765
 		 const size_t *start, size_t nelems, const short *value)
+#line 765
 {
+#line 765
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 765
 	size_t remaining = varp->xsz * nelems;
+#line 765
 	int status = NC_NOERR;
+#line 765
 	void *xp;
+#line 765
+        void *fillp;
+#line 765
 
+#line 765
 	if(nelems == 0)
+#line 765
 		return NC_NOERR;
+#line 765
 
+#line 765
 	assert(value != NULL);
+#line 765
+
+#line 765
+        fillp = malloc(varp->xsz);
+#line 765
+	status = NC3_inq_var_fill(varp, fillp);
+#line 765
 
+#line 765
 	for(;;)
+#line 765
 	{
+#line 765
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 765
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 765
 
+#line 765
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 765
 				 RGN_WRITE, &xp);
+#line 765
 		if(lstatus != NC_NOERR)
+#line 765
 			return lstatus;
+#line 765
 
-		lstatus = ncx_putn_short_short(&xp, nput, value);
+#line 765
+		lstatus = ncx_putn_short_short(&xp, nput, value ,fillp);
+#line 765
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 765
 		{
+#line 765
 			/* not fatal to the loop */
+#line 765
 			status = lstatus;
+#line 765
 		}
+#line 765
 
+#line 765
 		(void) ncio_rel(ncp->nciop, offset,
+#line 765
 				 RGN_MODIFIED);
+#line 765
 
+#line 765
 		remaining -= extent;
+#line 765
 		if(remaining == 0)
+#line 765
 			break; /* normal loop exit */
-		offset += extent;
+#line 765
+		offset += (off_t)extent;
+#line 765
 		value += nput;
+#line 765
 
+#line 765
 	}
+#line 765
+        free(fillp);
+#line 765
 
+#line 765
 	return status;
+#line 765
 }
+#line 765
 
 static int
+#line 766
 putNCvx_short_int(NC3_INFO* ncp, const NC_var *varp,
+#line 766
 		 const size_t *start, size_t nelems, const int *value)
+#line 766
 {
+#line 766
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 766
 	size_t remaining = varp->xsz * nelems;
+#line 766
 	int status = NC_NOERR;
+#line 766
 	void *xp;
+#line 766
+        void *fillp;
+#line 766
 
+#line 766
 	if(nelems == 0)
+#line 766
 		return NC_NOERR;
+#line 766
 
+#line 766
 	assert(value != NULL);
+#line 766
 
+#line 766
+        fillp = malloc(varp->xsz);
+#line 766
+	status = NC3_inq_var_fill(varp, fillp);
+#line 766
+
+#line 766
 	for(;;)
+#line 766
 	{
+#line 766
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 766
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 766
 
+#line 766
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 766
 				 RGN_WRITE, &xp);
+#line 766
 		if(lstatus != NC_NOERR)
+#line 766
 			return lstatus;
+#line 766
 
-		lstatus = ncx_putn_short_int(&xp, nput, value);
+#line 766
+		lstatus = ncx_putn_short_int(&xp, nput, value ,fillp);
+#line 766
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 766
 		{
+#line 766
 			/* not fatal to the loop */
+#line 766
 			status = lstatus;
+#line 766
 		}
+#line 766
 
+#line 766
 		(void) ncio_rel(ncp->nciop, offset,
+#line 766
 				 RGN_MODIFIED);
+#line 766
 
+#line 766
 		remaining -= extent;
+#line 766
 		if(remaining == 0)
+#line 766
 			break; /* normal loop exit */
-		offset += extent;
+#line 766
+		offset += (off_t)extent;
+#line 766
 		value += nput;
+#line 766
 
+#line 766
 	}
+#line 766
+        free(fillp);
+#line 766
 
+#line 766
 	return status;
+#line 766
 }
+#line 766
 
 static int
+#line 767
 putNCvx_short_float(NC3_INFO* ncp, const NC_var *varp,
+#line 767
 		 const size_t *start, size_t nelems, const float *value)
+#line 767
 {
+#line 767
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 767
 	size_t remaining = varp->xsz * nelems;
+#line 767
 	int status = NC_NOERR;
+#line 767
 	void *xp;
+#line 767
+        void *fillp;
+#line 767
 
+#line 767
 	if(nelems == 0)
+#line 767
 		return NC_NOERR;
+#line 767
 
+#line 767
 	assert(value != NULL);
+#line 767
+
+#line 767
+        fillp = malloc(varp->xsz);
+#line 767
+	status = NC3_inq_var_fill(varp, fillp);
+#line 767
 
+#line 767
 	for(;;)
+#line 767
 	{
+#line 767
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 767
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 767
 
+#line 767
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 767
 				 RGN_WRITE, &xp);
+#line 767
 		if(lstatus != NC_NOERR)
+#line 767
 			return lstatus;
+#line 767
 
-		lstatus = ncx_putn_short_float(&xp, nput, value);
+#line 767
+		lstatus = ncx_putn_short_float(&xp, nput, value ,fillp);
+#line 767
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 767
 		{
+#line 767
 			/* not fatal to the loop */
+#line 767
 			status = lstatus;
+#line 767
 		}
+#line 767
 
+#line 767
 		(void) ncio_rel(ncp->nciop, offset,
+#line 767
 				 RGN_MODIFIED);
+#line 767
 
+#line 767
 		remaining -= extent;
+#line 767
 		if(remaining == 0)
+#line 767
 			break; /* normal loop exit */
-		offset += extent;
+#line 767
+		offset += (off_t)extent;
+#line 767
 		value += nput;
+#line 767
 
+#line 767
 	}
+#line 767
+        free(fillp);
+#line 767
 
+#line 767
 	return status;
+#line 767
 }
+#line 767
 
 static int
+#line 768
 putNCvx_short_double(NC3_INFO* ncp, const NC_var *varp,
+#line 768
 		 const size_t *start, size_t nelems, const double *value)
+#line 768
 {
+#line 768
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 768
 	size_t remaining = varp->xsz * nelems;
+#line 768
 	int status = NC_NOERR;
+#line 768
 	void *xp;
+#line 768
+        void *fillp;
+#line 768
 
+#line 768
 	if(nelems == 0)
+#line 768
 		return NC_NOERR;
+#line 768
 
+#line 768
 	assert(value != NULL);
+#line 768
+
+#line 768
+        fillp = malloc(varp->xsz);
+#line 768
+	status = NC3_inq_var_fill(varp, fillp);
+#line 768
 
+#line 768
 	for(;;)
+#line 768
 	{
+#line 768
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 768
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 768
 
+#line 768
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 768
 				 RGN_WRITE, &xp);
+#line 768
 		if(lstatus != NC_NOERR)
+#line 768
 			return lstatus;
+#line 768
 
-		lstatus = ncx_putn_short_double(&xp, nput, value);
+#line 768
+		lstatus = ncx_putn_short_double(&xp, nput, value ,fillp);
+#line 768
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 768
 		{
+#line 768
 			/* not fatal to the loop */
+#line 768
 			status = lstatus;
+#line 768
 		}
+#line 768
 
+#line 768
 		(void) ncio_rel(ncp->nciop, offset,
+#line 768
 				 RGN_MODIFIED);
+#line 768
 
+#line 768
 		remaining -= extent;
+#line 768
 		if(remaining == 0)
+#line 768
 			break; /* normal loop exit */
-		offset += extent;
+#line 768
+		offset += (off_t)extent;
+#line 768
 		value += nput;
+#line 768
 
+#line 768
 	}
+#line 768
+        free(fillp);
+#line 768
 
+#line 768
 	return status;
+#line 768
 }
+#line 768
 
 static int
+#line 769
 putNCvx_short_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 769
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 769
 {
+#line 769
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 769
 	size_t remaining = varp->xsz * nelems;
+#line 769
 	int status = NC_NOERR;
+#line 769
 	void *xp;
+#line 769
+        void *fillp;
+#line 769
 
+#line 769
 	if(nelems == 0)
+#line 769
 		return NC_NOERR;
+#line 769
 
+#line 769
 	assert(value != NULL);
+#line 769
 
+#line 769
+        fillp = malloc(varp->xsz);
+#line 769
+	status = NC3_inq_var_fill(varp, fillp);
+#line 769
+
+#line 769
 	for(;;)
+#line 769
 	{
+#line 769
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 769
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 769
 
+#line 769
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 769
 				 RGN_WRITE, &xp);
+#line 769
 		if(lstatus != NC_NOERR)
+#line 769
 			return lstatus;
+#line 769
 
-		lstatus = ncx_putn_short_longlong(&xp, nput, value);
+#line 769
+		lstatus = ncx_putn_short_longlong(&xp, nput, value ,fillp);
+#line 769
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 769
 		{
+#line 769
 			/* not fatal to the loop */
+#line 769
 			status = lstatus;
+#line 769
 		}
+#line 769
 
+#line 769
 		(void) ncio_rel(ncp->nciop, offset,
+#line 769
 				 RGN_MODIFIED);
+#line 769
 
+#line 769
 		remaining -= extent;
+#line 769
 		if(remaining == 0)
+#line 769
 			break; /* normal loop exit */
-		offset += extent;
+#line 769
+		offset += (off_t)extent;
+#line 769
 		value += nput;
+#line 769
 
+#line 769
 	}
+#line 769
+        free(fillp);
+#line 769
 
+#line 769
 	return status;
+#line 769
 }
+#line 769
 
 static int
+#line 770
 putNCvx_short_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 770
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 770
 {
+#line 770
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 770
 	size_t remaining = varp->xsz * nelems;
+#line 770
 	int status = NC_NOERR;
+#line 770
 	void *xp;
+#line 770
+        void *fillp;
+#line 770
 
+#line 770
 	if(nelems == 0)
+#line 770
 		return NC_NOERR;
+#line 770
 
+#line 770
 	assert(value != NULL);
+#line 770
+
+#line 770
+        fillp = malloc(varp->xsz);
+#line 770
+	status = NC3_inq_var_fill(varp, fillp);
+#line 770
 
+#line 770
 	for(;;)
+#line 770
 	{
+#line 770
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 770
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 770
 
+#line 770
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 770
 				 RGN_WRITE, &xp);
+#line 770
 		if(lstatus != NC_NOERR)
+#line 770
 			return lstatus;
+#line 770
 
-		lstatus = ncx_putn_short_ushort(&xp, nput, value);
+#line 770
+		lstatus = ncx_putn_short_ushort(&xp, nput, value ,fillp);
+#line 770
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 770
 		{
+#line 770
 			/* not fatal to the loop */
+#line 770
 			status = lstatus;
+#line 770
 		}
+#line 770
 
+#line 770
 		(void) ncio_rel(ncp->nciop, offset,
+#line 770
 				 RGN_MODIFIED);
+#line 770
 
+#line 770
 		remaining -= extent;
+#line 770
 		if(remaining == 0)
+#line 770
 			break; /* normal loop exit */
-		offset += extent;
+#line 770
+		offset += (off_t)extent;
+#line 770
 		value += nput;
+#line 770
 
+#line 770
 	}
+#line 770
+        free(fillp);
+#line 770
 
+#line 770
 	return status;
+#line 770
 }
+#line 770
 
 static int
+#line 771
 putNCvx_short_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 771
 		 const size_t *start, size_t nelems, const uint *value)
+#line 771
 {
+#line 771
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 771
 	size_t remaining = varp->xsz * nelems;
+#line 771
 	int status = NC_NOERR;
+#line 771
 	void *xp;
+#line 771
+        void *fillp;
+#line 771
 
+#line 771
 	if(nelems == 0)
+#line 771
 		return NC_NOERR;
+#line 771
 
+#line 771
 	assert(value != NULL);
+#line 771
 
+#line 771
+        fillp = malloc(varp->xsz);
+#line 771
+	status = NC3_inq_var_fill(varp, fillp);
+#line 771
+
+#line 771
 	for(;;)
+#line 771
 	{
+#line 771
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 771
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 771
 
+#line 771
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 771
 				 RGN_WRITE, &xp);
+#line 771
 		if(lstatus != NC_NOERR)
+#line 771
 			return lstatus;
+#line 771
 
-		lstatus = ncx_putn_short_uint(&xp, nput, value);
+#line 771
+		lstatus = ncx_putn_short_uint(&xp, nput, value ,fillp);
+#line 771
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 771
 		{
+#line 771
 			/* not fatal to the loop */
+#line 771
 			status = lstatus;
+#line 771
 		}
+#line 771
 
+#line 771
 		(void) ncio_rel(ncp->nciop, offset,
+#line 771
 				 RGN_MODIFIED);
+#line 771
 
+#line 771
 		remaining -= extent;
+#line 771
 		if(remaining == 0)
+#line 771
 			break; /* normal loop exit */
-		offset += extent;
+#line 771
+		offset += (off_t)extent;
+#line 771
 		value += nput;
+#line 771
 
+#line 771
 	}
+#line 771
+        free(fillp);
+#line 771
 
+#line 771
 	return status;
+#line 771
 }
+#line 771
 
 static int
+#line 772
 putNCvx_short_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 772
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 772
 {
+#line 772
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 772
 	size_t remaining = varp->xsz * nelems;
+#line 772
 	int status = NC_NOERR;
+#line 772
 	void *xp;
+#line 772
+        void *fillp;
+#line 772
 
+#line 772
 	if(nelems == 0)
+#line 772
 		return NC_NOERR;
+#line 772
 
+#line 772
 	assert(value != NULL);
+#line 772
+
+#line 772
+        fillp = malloc(varp->xsz);
+#line 772
+	status = NC3_inq_var_fill(varp, fillp);
+#line 772
 
+#line 772
 	for(;;)
+#line 772
 	{
+#line 772
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 772
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 772
 
+#line 772
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 772
 				 RGN_WRITE, &xp);
+#line 772
 		if(lstatus != NC_NOERR)
+#line 772
 			return lstatus;
+#line 772
 
-		lstatus = ncx_putn_short_ulonglong(&xp, nput, value);
+#line 772
+		lstatus = ncx_putn_short_ulonglong(&xp, nput, value ,fillp);
+#line 772
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 772
 		{
+#line 772
 			/* not fatal to the loop */
+#line 772
 			status = lstatus;
+#line 772
 		}
+#line 772
 
+#line 772
 		(void) ncio_rel(ncp->nciop, offset,
+#line 772
 				 RGN_MODIFIED);
+#line 772
 
+#line 772
 		remaining -= extent;
+#line 772
 		if(remaining == 0)
+#line 772
 			break; /* normal loop exit */
-		offset += extent;
+#line 772
+		offset += (off_t)extent;
+#line 772
 		value += nput;
+#line 772
 
+#line 772
 	}
+#line 772
+        free(fillp);
+#line 772
 
+#line 772
 	return status;
+#line 772
 }
+#line 772
 
 
 static int
+#line 774
 putNCvx_int_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 774
 		 const size_t *start, size_t nelems, const schar *value)
+#line 774
 {
+#line 774
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 774
 	size_t remaining = varp->xsz * nelems;
+#line 774
 	int status = NC_NOERR;
+#line 774
 	void *xp;
+#line 774
+        void *fillp;
+#line 774
 
+#line 774
 	if(nelems == 0)
+#line 774
 		return NC_NOERR;
+#line 774
 
+#line 774
 	assert(value != NULL);
+#line 774
 
+#line 774
+        fillp = malloc(varp->xsz);
+#line 774
+	status = NC3_inq_var_fill(varp, fillp);
+#line 774
+
+#line 774
 	for(;;)
+#line 774
 	{
+#line 774
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 774
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 774
 
+#line 774
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 774
 				 RGN_WRITE, &xp);
+#line 774
 		if(lstatus != NC_NOERR)
+#line 774
 			return lstatus;
+#line 774
 
-		lstatus = ncx_putn_int_schar(&xp, nput, value);
+#line 774
+		lstatus = ncx_putn_int_schar(&xp, nput, value ,fillp);
+#line 774
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 774
 		{
+#line 774
 			/* not fatal to the loop */
+#line 774
 			status = lstatus;
+#line 774
 		}
+#line 774
 
+#line 774
 		(void) ncio_rel(ncp->nciop, offset,
+#line 774
 				 RGN_MODIFIED);
+#line 774
 
+#line 774
 		remaining -= extent;
+#line 774
 		if(remaining == 0)
+#line 774
 			break; /* normal loop exit */
-		offset += extent;
+#line 774
+		offset += (off_t)extent;
+#line 774
 		value += nput;
+#line 774
 
+#line 774
 	}
+#line 774
+        free(fillp);
+#line 774
 
+#line 774
 	return status;
+#line 774
 }
+#line 774
 
 static int
+#line 775
 putNCvx_int_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 775
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 775
 {
+#line 775
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 775
 	size_t remaining = varp->xsz * nelems;
+#line 775
 	int status = NC_NOERR;
+#line 775
 	void *xp;
+#line 775
+        void *fillp;
+#line 775
 
+#line 775
 	if(nelems == 0)
+#line 775
 		return NC_NOERR;
+#line 775
 
+#line 775
 	assert(value != NULL);
+#line 775
+
+#line 775
+        fillp = malloc(varp->xsz);
+#line 775
+	status = NC3_inq_var_fill(varp, fillp);
+#line 775
 
+#line 775
 	for(;;)
+#line 775
 	{
+#line 775
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 775
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 775
 
+#line 775
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 775
 				 RGN_WRITE, &xp);
+#line 775
 		if(lstatus != NC_NOERR)
+#line 775
 			return lstatus;
+#line 775
 
-		lstatus = ncx_putn_int_uchar(&xp, nput, value);
+#line 775
+		lstatus = ncx_putn_int_uchar(&xp, nput, value ,fillp);
+#line 775
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 775
 		{
+#line 775
 			/* not fatal to the loop */
+#line 775
 			status = lstatus;
+#line 775
 		}
+#line 775
 
+#line 775
 		(void) ncio_rel(ncp->nciop, offset,
+#line 775
 				 RGN_MODIFIED);
+#line 775
 
+#line 775
 		remaining -= extent;
+#line 775
 		if(remaining == 0)
+#line 775
 			break; /* normal loop exit */
-		offset += extent;
+#line 775
+		offset += (off_t)extent;
+#line 775
 		value += nput;
+#line 775
 
+#line 775
 	}
+#line 775
+        free(fillp);
+#line 775
 
+#line 775
 	return status;
+#line 775
 }
+#line 775
 
 static int
+#line 776
 putNCvx_int_short(NC3_INFO* ncp, const NC_var *varp,
+#line 776
 		 const size_t *start, size_t nelems, const short *value)
+#line 776
 {
+#line 776
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 776
 	size_t remaining = varp->xsz * nelems;
+#line 776
 	int status = NC_NOERR;
+#line 776
 	void *xp;
+#line 776
+        void *fillp;
+#line 776
 
+#line 776
 	if(nelems == 0)
+#line 776
 		return NC_NOERR;
+#line 776
 
+#line 776
 	assert(value != NULL);
+#line 776
+
+#line 776
+        fillp = malloc(varp->xsz);
+#line 776
+	status = NC3_inq_var_fill(varp, fillp);
+#line 776
 
+#line 776
 	for(;;)
+#line 776
 	{
+#line 776
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 776
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 776
 
+#line 776
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 776
 				 RGN_WRITE, &xp);
+#line 776
 		if(lstatus != NC_NOERR)
+#line 776
 			return lstatus;
+#line 776
 
-		lstatus = ncx_putn_int_short(&xp, nput, value);
+#line 776
+		lstatus = ncx_putn_int_short(&xp, nput, value ,fillp);
+#line 776
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 776
 		{
+#line 776
 			/* not fatal to the loop */
+#line 776
 			status = lstatus;
+#line 776
 		}
+#line 776
 
+#line 776
 		(void) ncio_rel(ncp->nciop, offset,
+#line 776
 				 RGN_MODIFIED);
+#line 776
 
+#line 776
 		remaining -= extent;
+#line 776
 		if(remaining == 0)
+#line 776
 			break; /* normal loop exit */
-		offset += extent;
+#line 776
+		offset += (off_t)extent;
+#line 776
 		value += nput;
+#line 776
 
+#line 776
 	}
+#line 776
+        free(fillp);
+#line 776
 
+#line 776
 	return status;
+#line 776
 }
+#line 776
 
 static int
+#line 777
 putNCvx_int_int(NC3_INFO* ncp, const NC_var *varp,
+#line 777
 		 const size_t *start, size_t nelems, const int *value)
+#line 777
 {
+#line 777
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 777
 	size_t remaining = varp->xsz * nelems;
+#line 777
 	int status = NC_NOERR;
+#line 777
 	void *xp;
+#line 777
+        void *fillp;
+#line 777
 
+#line 777
 	if(nelems == 0)
+#line 777
 		return NC_NOERR;
+#line 777
 
+#line 777
 	assert(value != NULL);
+#line 777
 
+#line 777
+        fillp = malloc(varp->xsz);
+#line 777
+	status = NC3_inq_var_fill(varp, fillp);
+#line 777
+
+#line 777
 	for(;;)
+#line 777
 	{
+#line 777
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 777
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 777
 
+#line 777
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 777
 				 RGN_WRITE, &xp);
+#line 777
 		if(lstatus != NC_NOERR)
+#line 777
 			return lstatus;
+#line 777
 
-		lstatus = ncx_putn_int_int(&xp, nput, value);
+#line 777
+		lstatus = ncx_putn_int_int(&xp, nput, value ,fillp);
+#line 777
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 777
 		{
+#line 777
 			/* not fatal to the loop */
+#line 777
 			status = lstatus;
+#line 777
 		}
+#line 777
 
+#line 777
 		(void) ncio_rel(ncp->nciop, offset,
+#line 777
 				 RGN_MODIFIED);
+#line 777
 
+#line 777
 		remaining -= extent;
+#line 777
 		if(remaining == 0)
+#line 777
 			break; /* normal loop exit */
-		offset += extent;
+#line 777
+		offset += (off_t)extent;
+#line 777
 		value += nput;
+#line 777
 
+#line 777
 	}
+#line 777
+        free(fillp);
+#line 777
 
+#line 777
 	return status;
+#line 777
 }
+#line 777
 
 static int
+#line 778
 putNCvx_int_float(NC3_INFO* ncp, const NC_var *varp,
+#line 778
 		 const size_t *start, size_t nelems, const float *value)
+#line 778
 {
+#line 778
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 778
 	size_t remaining = varp->xsz * nelems;
+#line 778
 	int status = NC_NOERR;
+#line 778
 	void *xp;
+#line 778
+        void *fillp;
+#line 778
 
+#line 778
 	if(nelems == 0)
+#line 778
 		return NC_NOERR;
+#line 778
 
+#line 778
 	assert(value != NULL);
+#line 778
+
+#line 778
+        fillp = malloc(varp->xsz);
+#line 778
+	status = NC3_inq_var_fill(varp, fillp);
+#line 778
 
+#line 778
 	for(;;)
+#line 778
 	{
+#line 778
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 778
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 778
 
+#line 778
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 778
 				 RGN_WRITE, &xp);
+#line 778
 		if(lstatus != NC_NOERR)
+#line 778
 			return lstatus;
+#line 778
 
-		lstatus = ncx_putn_int_float(&xp, nput, value);
+#line 778
+		lstatus = ncx_putn_int_float(&xp, nput, value ,fillp);
+#line 778
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 778
 		{
+#line 778
 			/* not fatal to the loop */
+#line 778
 			status = lstatus;
+#line 778
 		}
+#line 778
 
+#line 778
 		(void) ncio_rel(ncp->nciop, offset,
+#line 778
 				 RGN_MODIFIED);
+#line 778
 
+#line 778
 		remaining -= extent;
+#line 778
 		if(remaining == 0)
+#line 778
 			break; /* normal loop exit */
-		offset += extent;
+#line 778
+		offset += (off_t)extent;
+#line 778
 		value += nput;
+#line 778
 
+#line 778
 	}
+#line 778
+        free(fillp);
+#line 778
 
+#line 778
 	return status;
+#line 778
 }
+#line 778
 
 static int
+#line 779
 putNCvx_int_double(NC3_INFO* ncp, const NC_var *varp,
+#line 779
 		 const size_t *start, size_t nelems, const double *value)
+#line 779
 {
+#line 779
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 779
 	size_t remaining = varp->xsz * nelems;
+#line 779
 	int status = NC_NOERR;
+#line 779
 	void *xp;
+#line 779
+        void *fillp;
+#line 779
 
+#line 779
 	if(nelems == 0)
+#line 779
 		return NC_NOERR;
+#line 779
 
+#line 779
 	assert(value != NULL);
+#line 779
 
+#line 779
+        fillp = malloc(varp->xsz);
+#line 779
+	status = NC3_inq_var_fill(varp, fillp);
+#line 779
+
+#line 779
 	for(;;)
+#line 779
 	{
+#line 779
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 779
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 779
 
+#line 779
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 779
 				 RGN_WRITE, &xp);
+#line 779
 		if(lstatus != NC_NOERR)
+#line 779
 			return lstatus;
+#line 779
 
-		lstatus = ncx_putn_int_double(&xp, nput, value);
+#line 779
+		lstatus = ncx_putn_int_double(&xp, nput, value ,fillp);
+#line 779
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 779
 		{
+#line 779
 			/* not fatal to the loop */
+#line 779
 			status = lstatus;
+#line 779
 		}
+#line 779
 
+#line 779
 		(void) ncio_rel(ncp->nciop, offset,
+#line 779
 				 RGN_MODIFIED);
+#line 779
 
+#line 779
 		remaining -= extent;
+#line 779
 		if(remaining == 0)
+#line 779
 			break; /* normal loop exit */
-		offset += extent;
+#line 779
+		offset += (off_t)extent;
+#line 779
 		value += nput;
+#line 779
 
+#line 779
 	}
+#line 779
+        free(fillp);
+#line 779
 
+#line 779
 	return status;
+#line 779
 }
+#line 779
 
 static int
+#line 780
 putNCvx_int_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 780
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 780
 {
+#line 780
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 780
 	size_t remaining = varp->xsz * nelems;
+#line 780
 	int status = NC_NOERR;
+#line 780
 	void *xp;
+#line 780
+        void *fillp;
+#line 780
 
+#line 780
 	if(nelems == 0)
+#line 780
 		return NC_NOERR;
+#line 780
 
+#line 780
 	assert(value != NULL);
+#line 780
+
+#line 780
+        fillp = malloc(varp->xsz);
+#line 780
+	status = NC3_inq_var_fill(varp, fillp);
+#line 780
 
+#line 780
 	for(;;)
+#line 780
 	{
+#line 780
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 780
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 780
 
+#line 780
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 780
 				 RGN_WRITE, &xp);
+#line 780
 		if(lstatus != NC_NOERR)
+#line 780
 			return lstatus;
+#line 780
 
-		lstatus = ncx_putn_int_longlong(&xp, nput, value);
+#line 780
+		lstatus = ncx_putn_int_longlong(&xp, nput, value ,fillp);
+#line 780
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 780
 		{
+#line 780
 			/* not fatal to the loop */
+#line 780
 			status = lstatus;
+#line 780
 		}
+#line 780
 
+#line 780
 		(void) ncio_rel(ncp->nciop, offset,
+#line 780
 				 RGN_MODIFIED);
+#line 780
 
+#line 780
 		remaining -= extent;
+#line 780
 		if(remaining == 0)
+#line 780
 			break; /* normal loop exit */
-		offset += extent;
+#line 780
+		offset += (off_t)extent;
+#line 780
 		value += nput;
+#line 780
 
+#line 780
 	}
+#line 780
+        free(fillp);
+#line 780
 
+#line 780
 	return status;
+#line 780
 }
+#line 780
 
 static int
+#line 781
 putNCvx_int_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 781
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 781
 {
+#line 781
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 781
 	size_t remaining = varp->xsz * nelems;
+#line 781
 	int status = NC_NOERR;
+#line 781
 	void *xp;
+#line 781
+        void *fillp;
+#line 781
 
+#line 781
 	if(nelems == 0)
+#line 781
 		return NC_NOERR;
+#line 781
 
+#line 781
 	assert(value != NULL);
+#line 781
 
+#line 781
+        fillp = malloc(varp->xsz);
+#line 781
+	status = NC3_inq_var_fill(varp, fillp);
+#line 781
+
+#line 781
 	for(;;)
+#line 781
 	{
+#line 781
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 781
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 781
 
+#line 781
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 781
 				 RGN_WRITE, &xp);
+#line 781
 		if(lstatus != NC_NOERR)
+#line 781
 			return lstatus;
+#line 781
 
-		lstatus = ncx_putn_int_ushort(&xp, nput, value);
+#line 781
+		lstatus = ncx_putn_int_ushort(&xp, nput, value ,fillp);
+#line 781
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 781
 		{
+#line 781
 			/* not fatal to the loop */
+#line 781
 			status = lstatus;
+#line 781
 		}
+#line 781
 
+#line 781
 		(void) ncio_rel(ncp->nciop, offset,
+#line 781
 				 RGN_MODIFIED);
+#line 781
 
+#line 781
 		remaining -= extent;
+#line 781
 		if(remaining == 0)
+#line 781
 			break; /* normal loop exit */
-		offset += extent;
+#line 781
+		offset += (off_t)extent;
+#line 781
 		value += nput;
+#line 781
 
+#line 781
 	}
+#line 781
+        free(fillp);
+#line 781
 
+#line 781
 	return status;
+#line 781
 }
+#line 781
 
 static int
+#line 782
 putNCvx_int_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 782
 		 const size_t *start, size_t nelems, const uint *value)
+#line 782
 {
+#line 782
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 782
 	size_t remaining = varp->xsz * nelems;
+#line 782
 	int status = NC_NOERR;
+#line 782
 	void *xp;
+#line 782
+        void *fillp;
+#line 782
 
+#line 782
 	if(nelems == 0)
+#line 782
 		return NC_NOERR;
+#line 782
 
+#line 782
 	assert(value != NULL);
+#line 782
+
+#line 782
+        fillp = malloc(varp->xsz);
+#line 782
+	status = NC3_inq_var_fill(varp, fillp);
+#line 782
 
+#line 782
 	for(;;)
+#line 782
 	{
+#line 782
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 782
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 782
 
+#line 782
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 782
 				 RGN_WRITE, &xp);
+#line 782
 		if(lstatus != NC_NOERR)
+#line 782
 			return lstatus;
+#line 782
 
-		lstatus = ncx_putn_int_uint(&xp, nput, value);
+#line 782
+		lstatus = ncx_putn_int_uint(&xp, nput, value ,fillp);
+#line 782
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 782
 		{
+#line 782
 			/* not fatal to the loop */
+#line 782
 			status = lstatus;
+#line 782
 		}
+#line 782
 
+#line 782
 		(void) ncio_rel(ncp->nciop, offset,
+#line 782
 				 RGN_MODIFIED);
+#line 782
 
+#line 782
 		remaining -= extent;
+#line 782
 		if(remaining == 0)
+#line 782
 			break; /* normal loop exit */
-		offset += extent;
+#line 782
+		offset += (off_t)extent;
+#line 782
 		value += nput;
+#line 782
 
+#line 782
 	}
+#line 782
+        free(fillp);
+#line 782
 
+#line 782
 	return status;
+#line 782
 }
+#line 782
 
 static int
+#line 783
 putNCvx_int_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 783
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 783
 {
+#line 783
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 783
 	size_t remaining = varp->xsz * nelems;
+#line 783
 	int status = NC_NOERR;
+#line 783
 	void *xp;
+#line 783
+        void *fillp;
+#line 783
 
+#line 783
 	if(nelems == 0)
+#line 783
 		return NC_NOERR;
+#line 783
 
+#line 783
 	assert(value != NULL);
+#line 783
+
+#line 783
+        fillp = malloc(varp->xsz);
+#line 783
+	status = NC3_inq_var_fill(varp, fillp);
+#line 783
 
+#line 783
 	for(;;)
+#line 783
 	{
+#line 783
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 783
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 783
 
+#line 783
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 783
 				 RGN_WRITE, &xp);
+#line 783
 		if(lstatus != NC_NOERR)
+#line 783
 			return lstatus;
+#line 783
 
-		lstatus = ncx_putn_int_ulonglong(&xp, nput, value);
+#line 783
+		lstatus = ncx_putn_int_ulonglong(&xp, nput, value ,fillp);
+#line 783
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 783
 		{
+#line 783
 			/* not fatal to the loop */
+#line 783
 			status = lstatus;
+#line 783
 		}
+#line 783
 
+#line 783
 		(void) ncio_rel(ncp->nciop, offset,
+#line 783
 				 RGN_MODIFIED);
+#line 783
 
+#line 783
 		remaining -= extent;
+#line 783
 		if(remaining == 0)
+#line 783
 			break; /* normal loop exit */
-		offset += extent;
+#line 783
+		offset += (off_t)extent;
+#line 783
 		value += nput;
+#line 783
 
+#line 783
 	}
+#line 783
+        free(fillp);
+#line 783
 
+#line 783
 	return status;
+#line 783
 }
+#line 783
 
 
 static int
+#line 785
 putNCvx_float_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 785
 		 const size_t *start, size_t nelems, const schar *value)
+#line 785
 {
+#line 785
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 785
 	size_t remaining = varp->xsz * nelems;
+#line 785
 	int status = NC_NOERR;
+#line 785
 	void *xp;
+#line 785
+        void *fillp;
+#line 785
 
+#line 785
 	if(nelems == 0)
+#line 785
 		return NC_NOERR;
+#line 785
 
+#line 785
 	assert(value != NULL);
+#line 785
 
+#line 785
+        fillp = malloc(varp->xsz);
+#line 785
+	status = NC3_inq_var_fill(varp, fillp);
+#line 785
+
+#line 785
 	for(;;)
+#line 785
 	{
+#line 785
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 785
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 785
 
+#line 785
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 785
 				 RGN_WRITE, &xp);
+#line 785
 		if(lstatus != NC_NOERR)
+#line 785
 			return lstatus;
+#line 785
 
-		lstatus = ncx_putn_float_schar(&xp, nput, value);
+#line 785
+		lstatus = ncx_putn_float_schar(&xp, nput, value ,fillp);
+#line 785
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 785
 		{
+#line 785
 			/* not fatal to the loop */
+#line 785
 			status = lstatus;
+#line 785
 		}
+#line 785
 
+#line 785
 		(void) ncio_rel(ncp->nciop, offset,
+#line 785
 				 RGN_MODIFIED);
+#line 785
 
+#line 785
 		remaining -= extent;
+#line 785
 		if(remaining == 0)
+#line 785
 			break; /* normal loop exit */
-		offset += extent;
+#line 785
+		offset += (off_t)extent;
+#line 785
 		value += nput;
+#line 785
 
+#line 785
 	}
+#line 785
+        free(fillp);
+#line 785
 
+#line 785
 	return status;
+#line 785
 }
+#line 785
 
 static int
+#line 786
 putNCvx_float_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 786
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 786
 {
+#line 786
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 786
 	size_t remaining = varp->xsz * nelems;
+#line 786
 	int status = NC_NOERR;
+#line 786
 	void *xp;
+#line 786
+        void *fillp;
+#line 786
 
+#line 786
 	if(nelems == 0)
+#line 786
 		return NC_NOERR;
+#line 786
 
+#line 786
 	assert(value != NULL);
+#line 786
+
+#line 786
+        fillp = malloc(varp->xsz);
+#line 786
+	status = NC3_inq_var_fill(varp, fillp);
+#line 786
 
+#line 786
 	for(;;)
+#line 786
 	{
+#line 786
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 786
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 786
 
+#line 786
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 786
 				 RGN_WRITE, &xp);
+#line 786
 		if(lstatus != NC_NOERR)
+#line 786
 			return lstatus;
+#line 786
 
-		lstatus = ncx_putn_float_uchar(&xp, nput, value);
+#line 786
+		lstatus = ncx_putn_float_uchar(&xp, nput, value ,fillp);
+#line 786
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 786
 		{
+#line 786
 			/* not fatal to the loop */
+#line 786
 			status = lstatus;
+#line 786
 		}
+#line 786
 
+#line 786
 		(void) ncio_rel(ncp->nciop, offset,
+#line 786
 				 RGN_MODIFIED);
+#line 786
 
+#line 786
 		remaining -= extent;
+#line 786
 		if(remaining == 0)
+#line 786
 			break; /* normal loop exit */
-		offset += extent;
+#line 786
+		offset += (off_t)extent;
+#line 786
 		value += nput;
+#line 786
 
+#line 786
 	}
+#line 786
+        free(fillp);
+#line 786
 
+#line 786
 	return status;
+#line 786
 }
+#line 786
 
 static int
+#line 787
 putNCvx_float_short(NC3_INFO* ncp, const NC_var *varp,
+#line 787
 		 const size_t *start, size_t nelems, const short *value)
+#line 787
 {
+#line 787
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 787
 	size_t remaining = varp->xsz * nelems;
+#line 787
 	int status = NC_NOERR;
+#line 787
 	void *xp;
+#line 787
+        void *fillp;
+#line 787
 
+#line 787
 	if(nelems == 0)
+#line 787
 		return NC_NOERR;
+#line 787
 
+#line 787
 	assert(value != NULL);
+#line 787
 
+#line 787
+        fillp = malloc(varp->xsz);
+#line 787
+	status = NC3_inq_var_fill(varp, fillp);
+#line 787
+
+#line 787
 	for(;;)
+#line 787
 	{
+#line 787
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 787
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 787
 
+#line 787
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 787
 				 RGN_WRITE, &xp);
+#line 787
 		if(lstatus != NC_NOERR)
+#line 787
 			return lstatus;
+#line 787
 
-		lstatus = ncx_putn_float_short(&xp, nput, value);
+#line 787
+		lstatus = ncx_putn_float_short(&xp, nput, value ,fillp);
+#line 787
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 787
 		{
+#line 787
 			/* not fatal to the loop */
+#line 787
 			status = lstatus;
+#line 787
 		}
+#line 787
 
+#line 787
 		(void) ncio_rel(ncp->nciop, offset,
+#line 787
 				 RGN_MODIFIED);
+#line 787
 
+#line 787
 		remaining -= extent;
+#line 787
 		if(remaining == 0)
+#line 787
 			break; /* normal loop exit */
-		offset += extent;
+#line 787
+		offset += (off_t)extent;
+#line 787
 		value += nput;
+#line 787
 
+#line 787
 	}
+#line 787
+        free(fillp);
+#line 787
 
+#line 787
 	return status;
+#line 787
 }
+#line 787
 
 static int
+#line 788
 putNCvx_float_int(NC3_INFO* ncp, const NC_var *varp,
+#line 788
 		 const size_t *start, size_t nelems, const int *value)
+#line 788
 {
+#line 788
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 788
 	size_t remaining = varp->xsz * nelems;
+#line 788
 	int status = NC_NOERR;
+#line 788
 	void *xp;
+#line 788
+        void *fillp;
+#line 788
 
+#line 788
 	if(nelems == 0)
+#line 788
 		return NC_NOERR;
+#line 788
 
+#line 788
 	assert(value != NULL);
+#line 788
+
+#line 788
+        fillp = malloc(varp->xsz);
+#line 788
+	status = NC3_inq_var_fill(varp, fillp);
+#line 788
 
+#line 788
 	for(;;)
+#line 788
 	{
+#line 788
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 788
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 788
 
+#line 788
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 788
 				 RGN_WRITE, &xp);
+#line 788
 		if(lstatus != NC_NOERR)
+#line 788
 			return lstatus;
+#line 788
 
-		lstatus = ncx_putn_float_int(&xp, nput, value);
+#line 788
+		lstatus = ncx_putn_float_int(&xp, nput, value ,fillp);
+#line 788
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 788
 		{
+#line 788
 			/* not fatal to the loop */
+#line 788
 			status = lstatus;
+#line 788
 		}
+#line 788
 
+#line 788
 		(void) ncio_rel(ncp->nciop, offset,
+#line 788
 				 RGN_MODIFIED);
+#line 788
 
+#line 788
 		remaining -= extent;
+#line 788
 		if(remaining == 0)
+#line 788
 			break; /* normal loop exit */
-		offset += extent;
+#line 788
+		offset += (off_t)extent;
+#line 788
 		value += nput;
+#line 788
 
+#line 788
 	}
+#line 788
+        free(fillp);
+#line 788
 
+#line 788
 	return status;
+#line 788
 }
+#line 788
 
 static int
+#line 789
 putNCvx_float_float(NC3_INFO* ncp, const NC_var *varp,
+#line 789
 		 const size_t *start, size_t nelems, const float *value)
+#line 789
 {
+#line 789
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 789
 	size_t remaining = varp->xsz * nelems;
+#line 789
 	int status = NC_NOERR;
+#line 789
 	void *xp;
+#line 789
+        void *fillp;
+#line 789
 
+#line 789
 	if(nelems == 0)
+#line 789
 		return NC_NOERR;
+#line 789
 
+#line 789
 	assert(value != NULL);
+#line 789
 
+#line 789
+        fillp = malloc(varp->xsz);
+#line 789
+	status = NC3_inq_var_fill(varp, fillp);
+#line 789
+
+#line 789
 	for(;;)
+#line 789
 	{
+#line 789
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 789
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 789
 
+#line 789
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 789
 				 RGN_WRITE, &xp);
+#line 789
 		if(lstatus != NC_NOERR)
+#line 789
 			return lstatus;
+#line 789
 
-		lstatus = ncx_putn_float_float(&xp, nput, value);
+#line 789
+		lstatus = ncx_putn_float_float(&xp, nput, value ,fillp);
+#line 789
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 789
 		{
+#line 789
 			/* not fatal to the loop */
+#line 789
 			status = lstatus;
+#line 789
 		}
+#line 789
 
+#line 789
 		(void) ncio_rel(ncp->nciop, offset,
+#line 789
 				 RGN_MODIFIED);
+#line 789
 
+#line 789
 		remaining -= extent;
+#line 789
 		if(remaining == 0)
+#line 789
 			break; /* normal loop exit */
-		offset += extent;
+#line 789
+		offset += (off_t)extent;
+#line 789
 		value += nput;
+#line 789
 
+#line 789
 	}
+#line 789
+        free(fillp);
+#line 789
 
+#line 789
 	return status;
+#line 789
 }
+#line 789
 
 static int
+#line 790
 putNCvx_float_double(NC3_INFO* ncp, const NC_var *varp,
+#line 790
 		 const size_t *start, size_t nelems, const double *value)
+#line 790
 {
+#line 790
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 790
 	size_t remaining = varp->xsz * nelems;
+#line 790
 	int status = NC_NOERR;
+#line 790
 	void *xp;
+#line 790
+        void *fillp;
+#line 790
 
+#line 790
 	if(nelems == 0)
+#line 790
 		return NC_NOERR;
+#line 790
 
+#line 790
 	assert(value != NULL);
+#line 790
+
+#line 790
+        fillp = malloc(varp->xsz);
+#line 790
+	status = NC3_inq_var_fill(varp, fillp);
+#line 790
 
+#line 790
 	for(;;)
+#line 790
 	{
+#line 790
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 790
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 790
 
+#line 790
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 790
 				 RGN_WRITE, &xp);
+#line 790
 		if(lstatus != NC_NOERR)
+#line 790
 			return lstatus;
+#line 790
 
-		lstatus = ncx_putn_float_double(&xp, nput, value);
+#line 790
+		lstatus = ncx_putn_float_double(&xp, nput, value ,fillp);
+#line 790
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 790
 		{
+#line 790
 			/* not fatal to the loop */
+#line 790
 			status = lstatus;
+#line 790
 		}
+#line 790
 
+#line 790
 		(void) ncio_rel(ncp->nciop, offset,
+#line 790
 				 RGN_MODIFIED);
+#line 790
 
+#line 790
 		remaining -= extent;
+#line 790
 		if(remaining == 0)
+#line 790
 			break; /* normal loop exit */
-		offset += extent;
+#line 790
+		offset += (off_t)extent;
+#line 790
 		value += nput;
+#line 790
 
+#line 790
 	}
+#line 790
+        free(fillp);
+#line 790
 
+#line 790
 	return status;
+#line 790
 }
+#line 790
 
 static int
+#line 791
 putNCvx_float_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 791
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 791
 {
+#line 791
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 791
 	size_t remaining = varp->xsz * nelems;
+#line 791
 	int status = NC_NOERR;
+#line 791
 	void *xp;
+#line 791
+        void *fillp;
+#line 791
 
+#line 791
 	if(nelems == 0)
+#line 791
 		return NC_NOERR;
+#line 791
 
+#line 791
 	assert(value != NULL);
+#line 791
+
+#line 791
+        fillp = malloc(varp->xsz);
+#line 791
+	status = NC3_inq_var_fill(varp, fillp);
+#line 791
 
+#line 791
 	for(;;)
+#line 791
 	{
+#line 791
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 791
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 791
 
+#line 791
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 791
 				 RGN_WRITE, &xp);
+#line 791
 		if(lstatus != NC_NOERR)
+#line 791
 			return lstatus;
+#line 791
 
-		lstatus = ncx_putn_float_longlong(&xp, nput, value);
+#line 791
+		lstatus = ncx_putn_float_longlong(&xp, nput, value ,fillp);
+#line 791
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 791
 		{
+#line 791
 			/* not fatal to the loop */
+#line 791
 			status = lstatus;
+#line 791
 		}
+#line 791
 
+#line 791
 		(void) ncio_rel(ncp->nciop, offset,
+#line 791
 				 RGN_MODIFIED);
+#line 791
 
+#line 791
 		remaining -= extent;
+#line 791
 		if(remaining == 0)
+#line 791
 			break; /* normal loop exit */
-		offset += extent;
+#line 791
+		offset += (off_t)extent;
+#line 791
 		value += nput;
+#line 791
 
+#line 791
 	}
+#line 791
+        free(fillp);
+#line 791
 
+#line 791
 	return status;
+#line 791
 }
+#line 791
 
 static int
+#line 792
 putNCvx_float_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 792
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 792
 {
+#line 792
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 792
 	size_t remaining = varp->xsz * nelems;
+#line 792
 	int status = NC_NOERR;
+#line 792
 	void *xp;
+#line 792
+        void *fillp;
+#line 792
 
+#line 792
 	if(nelems == 0)
+#line 792
 		return NC_NOERR;
+#line 792
 
+#line 792
 	assert(value != NULL);
+#line 792
 
+#line 792
+        fillp = malloc(varp->xsz);
+#line 792
+	status = NC3_inq_var_fill(varp, fillp);
+#line 792
+
+#line 792
 	for(;;)
+#line 792
 	{
+#line 792
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 792
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 792
 
+#line 792
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 792
 				 RGN_WRITE, &xp);
+#line 792
 		if(lstatus != NC_NOERR)
+#line 792
 			return lstatus;
+#line 792
 
-		lstatus = ncx_putn_float_ushort(&xp, nput, value);
+#line 792
+		lstatus = ncx_putn_float_ushort(&xp, nput, value ,fillp);
+#line 792
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 792
 		{
+#line 792
 			/* not fatal to the loop */
+#line 792
 			status = lstatus;
+#line 792
 		}
+#line 792
 
+#line 792
 		(void) ncio_rel(ncp->nciop, offset,
+#line 792
 				 RGN_MODIFIED);
+#line 792
 
+#line 792
 		remaining -= extent;
+#line 792
 		if(remaining == 0)
+#line 792
 			break; /* normal loop exit */
-		offset += extent;
+#line 792
+		offset += (off_t)extent;
+#line 792
 		value += nput;
+#line 792
 
+#line 792
 	}
+#line 792
+        free(fillp);
+#line 792
 
+#line 792
 	return status;
+#line 792
 }
+#line 792
 
 static int
+#line 793
 putNCvx_float_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 793
 		 const size_t *start, size_t nelems, const uint *value)
+#line 793
 {
+#line 793
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 793
 	size_t remaining = varp->xsz * nelems;
+#line 793
 	int status = NC_NOERR;
+#line 793
 	void *xp;
+#line 793
+        void *fillp;
+#line 793
 
+#line 793
 	if(nelems == 0)
+#line 793
 		return NC_NOERR;
+#line 793
 
+#line 793
 	assert(value != NULL);
+#line 793
+
+#line 793
+        fillp = malloc(varp->xsz);
+#line 793
+	status = NC3_inq_var_fill(varp, fillp);
+#line 793
 
+#line 793
 	for(;;)
+#line 793
 	{
+#line 793
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 793
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 793
 
+#line 793
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 793
 				 RGN_WRITE, &xp);
+#line 793
 		if(lstatus != NC_NOERR)
+#line 793
 			return lstatus;
+#line 793
 
-		lstatus = ncx_putn_float_uint(&xp, nput, value);
+#line 793
+		lstatus = ncx_putn_float_uint(&xp, nput, value ,fillp);
+#line 793
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 793
 		{
+#line 793
 			/* not fatal to the loop */
+#line 793
 			status = lstatus;
+#line 793
 		}
+#line 793
 
+#line 793
 		(void) ncio_rel(ncp->nciop, offset,
+#line 793
 				 RGN_MODIFIED);
+#line 793
 
+#line 793
 		remaining -= extent;
+#line 793
 		if(remaining == 0)
+#line 793
 			break; /* normal loop exit */
-		offset += extent;
+#line 793
+		offset += (off_t)extent;
+#line 793
 		value += nput;
+#line 793
 
+#line 793
 	}
+#line 793
+        free(fillp);
+#line 793
 
+#line 793
 	return status;
+#line 793
 }
+#line 793
 
 static int
+#line 794
 putNCvx_float_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 794
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 794
 {
+#line 794
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 794
 	size_t remaining = varp->xsz * nelems;
+#line 794
 	int status = NC_NOERR;
+#line 794
 	void *xp;
+#line 794
+        void *fillp;
+#line 794
 
+#line 794
 	if(nelems == 0)
+#line 794
 		return NC_NOERR;
+#line 794
 
+#line 794
 	assert(value != NULL);
+#line 794
 
+#line 794
+        fillp = malloc(varp->xsz);
+#line 794
+	status = NC3_inq_var_fill(varp, fillp);
+#line 794
+
+#line 794
 	for(;;)
+#line 794
 	{
+#line 794
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 794
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 794
 
+#line 794
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 794
 				 RGN_WRITE, &xp);
+#line 794
 		if(lstatus != NC_NOERR)
+#line 794
 			return lstatus;
+#line 794
 
-		lstatus = ncx_putn_float_ulonglong(&xp, nput, value);
+#line 794
+		lstatus = ncx_putn_float_ulonglong(&xp, nput, value ,fillp);
+#line 794
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 794
 		{
+#line 794
 			/* not fatal to the loop */
+#line 794
 			status = lstatus;
+#line 794
 		}
+#line 794
 
+#line 794
 		(void) ncio_rel(ncp->nciop, offset,
+#line 794
 				 RGN_MODIFIED);
+#line 794
 
+#line 794
 		remaining -= extent;
+#line 794
 		if(remaining == 0)
+#line 794
 			break; /* normal loop exit */
-		offset += extent;
+#line 794
+		offset += (off_t)extent;
+#line 794
 		value += nput;
+#line 794
 
+#line 794
 	}
+#line 794
+        free(fillp);
+#line 794
 
+#line 794
 	return status;
+#line 794
 }
+#line 794
 
 
 static int
+#line 796
 putNCvx_double_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 796
 		 const size_t *start, size_t nelems, const schar *value)
+#line 796
 {
+#line 796
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 796
 	size_t remaining = varp->xsz * nelems;
+#line 796
 	int status = NC_NOERR;
+#line 796
 	void *xp;
+#line 796
+        void *fillp;
+#line 796
 
+#line 796
 	if(nelems == 0)
+#line 796
 		return NC_NOERR;
+#line 796
 
+#line 796
 	assert(value != NULL);
+#line 796
+
+#line 796
+        fillp = malloc(varp->xsz);
+#line 796
+	status = NC3_inq_var_fill(varp, fillp);
+#line 796
 
+#line 796
 	for(;;)
+#line 796
 	{
+#line 796
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 796
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 796
 
+#line 796
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 796
 				 RGN_WRITE, &xp);
+#line 796
 		if(lstatus != NC_NOERR)
+#line 796
 			return lstatus;
+#line 796
 
-		lstatus = ncx_putn_double_schar(&xp, nput, value);
+#line 796
+		lstatus = ncx_putn_double_schar(&xp, nput, value ,fillp);
+#line 796
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 796
 		{
+#line 796
 			/* not fatal to the loop */
+#line 796
 			status = lstatus;
+#line 796
 		}
+#line 796
 
+#line 796
 		(void) ncio_rel(ncp->nciop, offset,
+#line 796
 				 RGN_MODIFIED);
+#line 796
 
+#line 796
 		remaining -= extent;
+#line 796
 		if(remaining == 0)
+#line 796
 			break; /* normal loop exit */
-		offset += extent;
+#line 796
+		offset += (off_t)extent;
+#line 796
 		value += nput;
+#line 796
 
+#line 796
 	}
+#line 796
+        free(fillp);
+#line 796
 
+#line 796
 	return status;
+#line 796
 }
+#line 796
 
 static int
+#line 797
 putNCvx_double_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 797
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 797
 {
+#line 797
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 797
 	size_t remaining = varp->xsz * nelems;
+#line 797
 	int status = NC_NOERR;
+#line 797
 	void *xp;
+#line 797
+        void *fillp;
+#line 797
 
+#line 797
 	if(nelems == 0)
+#line 797
 		return NC_NOERR;
+#line 797
 
+#line 797
 	assert(value != NULL);
+#line 797
 
+#line 797
+        fillp = malloc(varp->xsz);
+#line 797
+	status = NC3_inq_var_fill(varp, fillp);
+#line 797
+
+#line 797
 	for(;;)
+#line 797
 	{
+#line 797
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 797
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 797
 
+#line 797
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 797
 				 RGN_WRITE, &xp);
+#line 797
 		if(lstatus != NC_NOERR)
+#line 797
 			return lstatus;
+#line 797
 
-		lstatus = ncx_putn_double_uchar(&xp, nput, value);
+#line 797
+		lstatus = ncx_putn_double_uchar(&xp, nput, value ,fillp);
+#line 797
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 797
 		{
+#line 797
 			/* not fatal to the loop */
+#line 797
 			status = lstatus;
+#line 797
 		}
+#line 797
 
+#line 797
 		(void) ncio_rel(ncp->nciop, offset,
+#line 797
 				 RGN_MODIFIED);
+#line 797
 
+#line 797
 		remaining -= extent;
+#line 797
 		if(remaining == 0)
+#line 797
 			break; /* normal loop exit */
-		offset += extent;
+#line 797
+		offset += (off_t)extent;
+#line 797
 		value += nput;
+#line 797
 
+#line 797
 	}
+#line 797
+        free(fillp);
+#line 797
 
+#line 797
 	return status;
+#line 797
 }
+#line 797
 
 static int
+#line 798
 putNCvx_double_short(NC3_INFO* ncp, const NC_var *varp,
+#line 798
 		 const size_t *start, size_t nelems, const short *value)
+#line 798
 {
+#line 798
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 798
 	size_t remaining = varp->xsz * nelems;
+#line 798
 	int status = NC_NOERR;
+#line 798
 	void *xp;
+#line 798
+        void *fillp;
+#line 798
 
+#line 798
 	if(nelems == 0)
+#line 798
 		return NC_NOERR;
+#line 798
 
+#line 798
 	assert(value != NULL);
+#line 798
+
+#line 798
+        fillp = malloc(varp->xsz);
+#line 798
+	status = NC3_inq_var_fill(varp, fillp);
+#line 798
 
+#line 798
 	for(;;)
+#line 798
 	{
+#line 798
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 798
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 798
 
+#line 798
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 798
 				 RGN_WRITE, &xp);
+#line 798
 		if(lstatus != NC_NOERR)
+#line 798
 			return lstatus;
+#line 798
 
-		lstatus = ncx_putn_double_short(&xp, nput, value);
+#line 798
+		lstatus = ncx_putn_double_short(&xp, nput, value ,fillp);
+#line 798
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 798
 		{
+#line 798
 			/* not fatal to the loop */
+#line 798
 			status = lstatus;
+#line 798
 		}
+#line 798
 
+#line 798
 		(void) ncio_rel(ncp->nciop, offset,
+#line 798
 				 RGN_MODIFIED);
+#line 798
 
+#line 798
 		remaining -= extent;
+#line 798
 		if(remaining == 0)
+#line 798
 			break; /* normal loop exit */
-		offset += extent;
+#line 798
+		offset += (off_t)extent;
+#line 798
 		value += nput;
+#line 798
 
+#line 798
 	}
+#line 798
+        free(fillp);
+#line 798
 
+#line 798
 	return status;
+#line 798
 }
+#line 798
 
 static int
+#line 799
 putNCvx_double_int(NC3_INFO* ncp, const NC_var *varp,
+#line 799
 		 const size_t *start, size_t nelems, const int *value)
+#line 799
 {
+#line 799
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 799
 	size_t remaining = varp->xsz * nelems;
+#line 799
 	int status = NC_NOERR;
+#line 799
 	void *xp;
+#line 799
+        void *fillp;
+#line 799
 
+#line 799
 	if(nelems == 0)
+#line 799
 		return NC_NOERR;
+#line 799
 
+#line 799
 	assert(value != NULL);
+#line 799
+
+#line 799
+        fillp = malloc(varp->xsz);
+#line 799
+	status = NC3_inq_var_fill(varp, fillp);
+#line 799
 
+#line 799
 	for(;;)
+#line 799
 	{
+#line 799
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 799
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 799
 
+#line 799
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 799
 				 RGN_WRITE, &xp);
+#line 799
 		if(lstatus != NC_NOERR)
+#line 799
 			return lstatus;
+#line 799
 
-		lstatus = ncx_putn_double_int(&xp, nput, value);
+#line 799
+		lstatus = ncx_putn_double_int(&xp, nput, value ,fillp);
+#line 799
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 799
 		{
+#line 799
 			/* not fatal to the loop */
+#line 799
 			status = lstatus;
+#line 799
 		}
+#line 799
 
+#line 799
 		(void) ncio_rel(ncp->nciop, offset,
+#line 799
 				 RGN_MODIFIED);
+#line 799
 
+#line 799
 		remaining -= extent;
+#line 799
 		if(remaining == 0)
+#line 799
 			break; /* normal loop exit */
-		offset += extent;
+#line 799
+		offset += (off_t)extent;
+#line 799
 		value += nput;
+#line 799
 
+#line 799
 	}
+#line 799
+        free(fillp);
+#line 799
 
+#line 799
 	return status;
+#line 799
 }
+#line 799
 
 static int
+#line 800
 putNCvx_double_float(NC3_INFO* ncp, const NC_var *varp,
+#line 800
 		 const size_t *start, size_t nelems, const float *value)
+#line 800
 {
+#line 800
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 800
 	size_t remaining = varp->xsz * nelems;
+#line 800
 	int status = NC_NOERR;
+#line 800
 	void *xp;
+#line 800
+        void *fillp;
+#line 800
 
+#line 800
 	if(nelems == 0)
+#line 800
 		return NC_NOERR;
+#line 800
 
+#line 800
 	assert(value != NULL);
+#line 800
 
+#line 800
+        fillp = malloc(varp->xsz);
+#line 800
+	status = NC3_inq_var_fill(varp, fillp);
+#line 800
+
+#line 800
 	for(;;)
+#line 800
 	{
+#line 800
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 800
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 800
 
+#line 800
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 800
 				 RGN_WRITE, &xp);
+#line 800
 		if(lstatus != NC_NOERR)
+#line 800
 			return lstatus;
+#line 800
 
-		lstatus = ncx_putn_double_float(&xp, nput, value);
+#line 800
+		lstatus = ncx_putn_double_float(&xp, nput, value ,fillp);
+#line 800
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 800
 		{
+#line 800
 			/* not fatal to the loop */
+#line 800
 			status = lstatus;
+#line 800
 		}
+#line 800
 
+#line 800
 		(void) ncio_rel(ncp->nciop, offset,
+#line 800
 				 RGN_MODIFIED);
+#line 800
 
+#line 800
 		remaining -= extent;
+#line 800
 		if(remaining == 0)
+#line 800
 			break; /* normal loop exit */
-		offset += extent;
+#line 800
+		offset += (off_t)extent;
+#line 800
 		value += nput;
+#line 800
 
+#line 800
 	}
+#line 800
+        free(fillp);
+#line 800
 
+#line 800
 	return status;
+#line 800
 }
+#line 800
 
 static int
+#line 801
 putNCvx_double_double(NC3_INFO* ncp, const NC_var *varp,
+#line 801
 		 const size_t *start, size_t nelems, const double *value)
+#line 801
 {
+#line 801
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 801
 	size_t remaining = varp->xsz * nelems;
+#line 801
 	int status = NC_NOERR;
+#line 801
 	void *xp;
+#line 801
+        void *fillp;
+#line 801
 
+#line 801
 	if(nelems == 0)
+#line 801
 		return NC_NOERR;
+#line 801
 
+#line 801
 	assert(value != NULL);
+#line 801
+
+#line 801
+        fillp = malloc(varp->xsz);
+#line 801
+	status = NC3_inq_var_fill(varp, fillp);
+#line 801
 
+#line 801
 	for(;;)
+#line 801
 	{
+#line 801
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 801
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 801
 
+#line 801
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 801
 				 RGN_WRITE, &xp);
+#line 801
 		if(lstatus != NC_NOERR)
+#line 801
 			return lstatus;
+#line 801
 
-		lstatus = ncx_putn_double_double(&xp, nput, value);
+#line 801
+		lstatus = ncx_putn_double_double(&xp, nput, value ,fillp);
+#line 801
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 801
 		{
+#line 801
 			/* not fatal to the loop */
+#line 801
 			status = lstatus;
+#line 801
 		}
+#line 801
 
+#line 801
 		(void) ncio_rel(ncp->nciop, offset,
+#line 801
 				 RGN_MODIFIED);
+#line 801
 
+#line 801
 		remaining -= extent;
+#line 801
 		if(remaining == 0)
+#line 801
 			break; /* normal loop exit */
-		offset += extent;
+#line 801
+		offset += (off_t)extent;
+#line 801
 		value += nput;
+#line 801
 
+#line 801
 	}
+#line 801
+        free(fillp);
+#line 801
 
+#line 801
 	return status;
+#line 801
 }
+#line 801
 
 static int
+#line 802
 putNCvx_double_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 802
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 802
 {
+#line 802
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 802
 	size_t remaining = varp->xsz * nelems;
+#line 802
 	int status = NC_NOERR;
+#line 802
 	void *xp;
+#line 802
+        void *fillp;
+#line 802
 
+#line 802
 	if(nelems == 0)
+#line 802
 		return NC_NOERR;
+#line 802
 
+#line 802
 	assert(value != NULL);
+#line 802
 
+#line 802
+        fillp = malloc(varp->xsz);
+#line 802
+	status = NC3_inq_var_fill(varp, fillp);
+#line 802
+
+#line 802
 	for(;;)
+#line 802
 	{
+#line 802
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 802
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 802
 
+#line 802
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 802
 				 RGN_WRITE, &xp);
+#line 802
 		if(lstatus != NC_NOERR)
+#line 802
 			return lstatus;
+#line 802
 
-		lstatus = ncx_putn_double_longlong(&xp, nput, value);
+#line 802
+		lstatus = ncx_putn_double_longlong(&xp, nput, value ,fillp);
+#line 802
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 802
 		{
+#line 802
 			/* not fatal to the loop */
+#line 802
 			status = lstatus;
+#line 802
 		}
+#line 802
 
+#line 802
 		(void) ncio_rel(ncp->nciop, offset,
+#line 802
 				 RGN_MODIFIED);
+#line 802
 
+#line 802
 		remaining -= extent;
+#line 802
 		if(remaining == 0)
+#line 802
 			break; /* normal loop exit */
-		offset += extent;
+#line 802
+		offset += (off_t)extent;
+#line 802
 		value += nput;
+#line 802
 
+#line 802
 	}
+#line 802
+        free(fillp);
+#line 802
 
+#line 802
 	return status;
+#line 802
 }
+#line 802
 
 static int
+#line 803
 putNCvx_double_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 803
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 803
 {
+#line 803
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 803
 	size_t remaining = varp->xsz * nelems;
+#line 803
 	int status = NC_NOERR;
+#line 803
 	void *xp;
+#line 803
+        void *fillp;
+#line 803
 
+#line 803
 	if(nelems == 0)
+#line 803
 		return NC_NOERR;
+#line 803
 
+#line 803
 	assert(value != NULL);
+#line 803
+
+#line 803
+        fillp = malloc(varp->xsz);
+#line 803
+	status = NC3_inq_var_fill(varp, fillp);
+#line 803
 
+#line 803
 	for(;;)
+#line 803
 	{
+#line 803
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 803
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 803
 
+#line 803
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 803
 				 RGN_WRITE, &xp);
+#line 803
 		if(lstatus != NC_NOERR)
+#line 803
 			return lstatus;
+#line 803
 
-		lstatus = ncx_putn_double_ushort(&xp, nput, value);
+#line 803
+		lstatus = ncx_putn_double_ushort(&xp, nput, value ,fillp);
+#line 803
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 803
 		{
+#line 803
 			/* not fatal to the loop */
+#line 803
 			status = lstatus;
+#line 803
 		}
+#line 803
 
+#line 803
 		(void) ncio_rel(ncp->nciop, offset,
+#line 803
 				 RGN_MODIFIED);
+#line 803
 
+#line 803
 		remaining -= extent;
+#line 803
 		if(remaining == 0)
+#line 803
 			break; /* normal loop exit */
-		offset += extent;
+#line 803
+		offset += (off_t)extent;
+#line 803
 		value += nput;
+#line 803
 
+#line 803
 	}
+#line 803
+        free(fillp);
+#line 803
 
+#line 803
 	return status;
+#line 803
 }
+#line 803
 
 static int
+#line 804
 putNCvx_double_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 804
 		 const size_t *start, size_t nelems, const uint *value)
+#line 804
 {
+#line 804
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 804
 	size_t remaining = varp->xsz * nelems;
+#line 804
 	int status = NC_NOERR;
+#line 804
 	void *xp;
+#line 804
+        void *fillp;
+#line 804
 
+#line 804
 	if(nelems == 0)
+#line 804
 		return NC_NOERR;
+#line 804
 
+#line 804
 	assert(value != NULL);
+#line 804
 
+#line 804
+        fillp = malloc(varp->xsz);
+#line 804
+	status = NC3_inq_var_fill(varp, fillp);
+#line 804
+
+#line 804
 	for(;;)
+#line 804
 	{
+#line 804
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 804
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 804
 
+#line 804
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 804
 				 RGN_WRITE, &xp);
+#line 804
 		if(lstatus != NC_NOERR)
+#line 804
 			return lstatus;
+#line 804
 
-		lstatus = ncx_putn_double_uint(&xp, nput, value);
+#line 804
+		lstatus = ncx_putn_double_uint(&xp, nput, value ,fillp);
+#line 804
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 804
 		{
+#line 804
 			/* not fatal to the loop */
+#line 804
 			status = lstatus;
+#line 804
 		}
+#line 804
 
+#line 804
 		(void) ncio_rel(ncp->nciop, offset,
+#line 804
 				 RGN_MODIFIED);
+#line 804
 
+#line 804
 		remaining -= extent;
+#line 804
 		if(remaining == 0)
+#line 804
 			break; /* normal loop exit */
-		offset += extent;
+#line 804
+		offset += (off_t)extent;
+#line 804
 		value += nput;
+#line 804
 
+#line 804
 	}
+#line 804
+        free(fillp);
+#line 804
 
+#line 804
 	return status;
+#line 804
 }
+#line 804
 
 static int
+#line 805
 putNCvx_double_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 805
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 805
 {
+#line 805
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 805
 	size_t remaining = varp->xsz * nelems;
+#line 805
 	int status = NC_NOERR;
+#line 805
 	void *xp;
+#line 805
+        void *fillp;
+#line 805
 
+#line 805
 	if(nelems == 0)
+#line 805
 		return NC_NOERR;
+#line 805
 
+#line 805
 	assert(value != NULL);
+#line 805
+
+#line 805
+        fillp = malloc(varp->xsz);
+#line 805
+	status = NC3_inq_var_fill(varp, fillp);
+#line 805
 
+#line 805
 	for(;;)
+#line 805
 	{
+#line 805
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 805
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 805
 
+#line 805
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 805
 				 RGN_WRITE, &xp);
+#line 805
 		if(lstatus != NC_NOERR)
+#line 805
 			return lstatus;
+#line 805
 
-		lstatus = ncx_putn_double_ulonglong(&xp, nput, value);
+#line 805
+		lstatus = ncx_putn_double_ulonglong(&xp, nput, value ,fillp);
+#line 805
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 805
 		{
+#line 805
 			/* not fatal to the loop */
+#line 805
 			status = lstatus;
+#line 805
 		}
+#line 805
 
+#line 805
 		(void) ncio_rel(ncp->nciop, offset,
+#line 805
 				 RGN_MODIFIED);
+#line 805
 
+#line 805
 		remaining -= extent;
+#line 805
 		if(remaining == 0)
+#line 805
 			break; /* normal loop exit */
-		offset += extent;
+#line 805
+		offset += (off_t)extent;
+#line 805
 		value += nput;
+#line 805
 
+#line 805
 	}
+#line 805
+        free(fillp);
+#line 805
 
+#line 805
 	return status;
+#line 805
 }
+#line 805
 
 
 static int
+#line 807
 putNCvx_uchar_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 807
 		 const size_t *start, size_t nelems, const schar *value)
+#line 807
 {
+#line 807
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 807
 	size_t remaining = varp->xsz * nelems;
+#line 807
 	int status = NC_NOERR;
+#line 807
 	void *xp;
+#line 807
+        void *fillp;
+#line 807
 
+#line 807
 	if(nelems == 0)
+#line 807
 		return NC_NOERR;
+#line 807
 
+#line 807
 	assert(value != NULL);
+#line 807
+
+#line 807
+        fillp = malloc(varp->xsz);
+#line 807
+	status = NC3_inq_var_fill(varp, fillp);
+#line 807
 
+#line 807
 	for(;;)
+#line 807
 	{
+#line 807
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 807
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 807
 
+#line 807
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 807
 				 RGN_WRITE, &xp);
+#line 807
 		if(lstatus != NC_NOERR)
+#line 807
 			return lstatus;
+#line 807
 
-		lstatus = ncx_putn_uchar_schar(&xp, nput, value);
+#line 807
+		lstatus = ncx_putn_uchar_schar(&xp, nput, value ,fillp);
+#line 807
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 807
 		{
+#line 807
 			/* not fatal to the loop */
+#line 807
 			status = lstatus;
+#line 807
 		}
+#line 807
 
+#line 807
 		(void) ncio_rel(ncp->nciop, offset,
+#line 807
 				 RGN_MODIFIED);
+#line 807
 
+#line 807
 		remaining -= extent;
+#line 807
 		if(remaining == 0)
+#line 807
 			break; /* normal loop exit */
-		offset += extent;
+#line 807
+		offset += (off_t)extent;
+#line 807
 		value += nput;
+#line 807
 
+#line 807
 	}
+#line 807
+        free(fillp);
+#line 807
 
+#line 807
 	return status;
+#line 807
 }
+#line 807
 
 static int
+#line 808
 putNCvx_uchar_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 808
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 808
 {
+#line 808
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 808
 	size_t remaining = varp->xsz * nelems;
+#line 808
 	int status = NC_NOERR;
+#line 808
 	void *xp;
+#line 808
+        void *fillp;
+#line 808
 
+#line 808
 	if(nelems == 0)
+#line 808
 		return NC_NOERR;
+#line 808
 
+#line 808
 	assert(value != NULL);
+#line 808
 
+#line 808
+        fillp = malloc(varp->xsz);
+#line 808
+	status = NC3_inq_var_fill(varp, fillp);
+#line 808
+
+#line 808
 	for(;;)
+#line 808
 	{
+#line 808
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 808
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 808
 
+#line 808
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 808
 				 RGN_WRITE, &xp);
+#line 808
 		if(lstatus != NC_NOERR)
+#line 808
 			return lstatus;
+#line 808
 
-		lstatus = ncx_putn_uchar_uchar(&xp, nput, value);
+#line 808
+		lstatus = ncx_putn_uchar_uchar(&xp, nput, value ,fillp);
+#line 808
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 808
 		{
+#line 808
 			/* not fatal to the loop */
+#line 808
 			status = lstatus;
+#line 808
 		}
+#line 808
 
+#line 808
 		(void) ncio_rel(ncp->nciop, offset,
+#line 808
 				 RGN_MODIFIED);
+#line 808
 
+#line 808
 		remaining -= extent;
+#line 808
 		if(remaining == 0)
+#line 808
 			break; /* normal loop exit */
-		offset += extent;
+#line 808
+		offset += (off_t)extent;
+#line 808
 		value += nput;
+#line 808
 
+#line 808
 	}
+#line 808
+        free(fillp);
+#line 808
 
+#line 808
 	return status;
+#line 808
 }
+#line 808
 
 static int
+#line 809
 putNCvx_uchar_short(NC3_INFO* ncp, const NC_var *varp,
+#line 809
 		 const size_t *start, size_t nelems, const short *value)
+#line 809
 {
+#line 809
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 809
 	size_t remaining = varp->xsz * nelems;
+#line 809
 	int status = NC_NOERR;
+#line 809
 	void *xp;
+#line 809
+        void *fillp;
+#line 809
 
+#line 809
 	if(nelems == 0)
+#line 809
 		return NC_NOERR;
+#line 809
 
+#line 809
 	assert(value != NULL);
+#line 809
+
+#line 809
+        fillp = malloc(varp->xsz);
+#line 809
+	status = NC3_inq_var_fill(varp, fillp);
+#line 809
 
+#line 809
 	for(;;)
+#line 809
 	{
+#line 809
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 809
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 809
 
+#line 809
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 809
 				 RGN_WRITE, &xp);
+#line 809
 		if(lstatus != NC_NOERR)
+#line 809
 			return lstatus;
+#line 809
 
-		lstatus = ncx_putn_uchar_short(&xp, nput, value);
+#line 809
+		lstatus = ncx_putn_uchar_short(&xp, nput, value ,fillp);
+#line 809
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 809
 		{
+#line 809
 			/* not fatal to the loop */
+#line 809
 			status = lstatus;
+#line 809
 		}
+#line 809
 
+#line 809
 		(void) ncio_rel(ncp->nciop, offset,
+#line 809
 				 RGN_MODIFIED);
+#line 809
 
+#line 809
 		remaining -= extent;
+#line 809
 		if(remaining == 0)
+#line 809
 			break; /* normal loop exit */
-		offset += extent;
+#line 809
+		offset += (off_t)extent;
+#line 809
 		value += nput;
+#line 809
 
+#line 809
 	}
+#line 809
+        free(fillp);
+#line 809
 
+#line 809
 	return status;
+#line 809
 }
+#line 809
 
 static int
+#line 810
 putNCvx_uchar_int(NC3_INFO* ncp, const NC_var *varp,
+#line 810
 		 const size_t *start, size_t nelems, const int *value)
+#line 810
 {
+#line 810
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 810
 	size_t remaining = varp->xsz * nelems;
+#line 810
 	int status = NC_NOERR;
+#line 810
 	void *xp;
+#line 810
+        void *fillp;
+#line 810
 
+#line 810
 	if(nelems == 0)
+#line 810
 		return NC_NOERR;
+#line 810
 
+#line 810
 	assert(value != NULL);
+#line 810
 
+#line 810
+        fillp = malloc(varp->xsz);
+#line 810
+	status = NC3_inq_var_fill(varp, fillp);
+#line 810
+
+#line 810
 	for(;;)
+#line 810
 	{
+#line 810
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 810
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 810
 
+#line 810
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 810
 				 RGN_WRITE, &xp);
+#line 810
 		if(lstatus != NC_NOERR)
+#line 810
 			return lstatus;
+#line 810
 
-		lstatus = ncx_putn_uchar_int(&xp, nput, value);
+#line 810
+		lstatus = ncx_putn_uchar_int(&xp, nput, value ,fillp);
+#line 810
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 810
 		{
+#line 810
 			/* not fatal to the loop */
+#line 810
 			status = lstatus;
+#line 810
 		}
+#line 810
 
+#line 810
 		(void) ncio_rel(ncp->nciop, offset,
+#line 810
 				 RGN_MODIFIED);
+#line 810
 
+#line 810
 		remaining -= extent;
+#line 810
 		if(remaining == 0)
+#line 810
 			break; /* normal loop exit */
-		offset += extent;
+#line 810
+		offset += (off_t)extent;
+#line 810
 		value += nput;
+#line 810
 
+#line 810
 	}
+#line 810
+        free(fillp);
+#line 810
 
+#line 810
 	return status;
+#line 810
 }
+#line 810
 
 static int
+#line 811
 putNCvx_uchar_float(NC3_INFO* ncp, const NC_var *varp,
+#line 811
 		 const size_t *start, size_t nelems, const float *value)
+#line 811
 {
+#line 811
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 811
 	size_t remaining = varp->xsz * nelems;
+#line 811
 	int status = NC_NOERR;
+#line 811
 	void *xp;
+#line 811
+        void *fillp;
+#line 811
 
+#line 811
 	if(nelems == 0)
+#line 811
 		return NC_NOERR;
+#line 811
 
+#line 811
 	assert(value != NULL);
+#line 811
+
+#line 811
+        fillp = malloc(varp->xsz);
+#line 811
+	status = NC3_inq_var_fill(varp, fillp);
+#line 811
 
+#line 811
 	for(;;)
+#line 811
 	{
+#line 811
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 811
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 811
 
+#line 811
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 811
 				 RGN_WRITE, &xp);
+#line 811
 		if(lstatus != NC_NOERR)
+#line 811
 			return lstatus;
+#line 811
 
-		lstatus = ncx_putn_uchar_float(&xp, nput, value);
+#line 811
+		lstatus = ncx_putn_uchar_float(&xp, nput, value ,fillp);
+#line 811
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 811
 		{
+#line 811
 			/* not fatal to the loop */
+#line 811
 			status = lstatus;
+#line 811
 		}
+#line 811
 
+#line 811
 		(void) ncio_rel(ncp->nciop, offset,
+#line 811
 				 RGN_MODIFIED);
+#line 811
 
+#line 811
 		remaining -= extent;
+#line 811
 		if(remaining == 0)
+#line 811
 			break; /* normal loop exit */
-		offset += extent;
+#line 811
+		offset += (off_t)extent;
+#line 811
 		value += nput;
+#line 811
 
+#line 811
 	}
+#line 811
+        free(fillp);
+#line 811
 
+#line 811
 	return status;
+#line 811
 }
+#line 811
 
 static int
+#line 812
 putNCvx_uchar_double(NC3_INFO* ncp, const NC_var *varp,
+#line 812
 		 const size_t *start, size_t nelems, const double *value)
+#line 812
 {
+#line 812
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 812
 	size_t remaining = varp->xsz * nelems;
+#line 812
 	int status = NC_NOERR;
+#line 812
 	void *xp;
+#line 812
+        void *fillp;
+#line 812
 
+#line 812
 	if(nelems == 0)
+#line 812
 		return NC_NOERR;
+#line 812
 
+#line 812
 	assert(value != NULL);
+#line 812
 
+#line 812
+        fillp = malloc(varp->xsz);
+#line 812
+	status = NC3_inq_var_fill(varp, fillp);
+#line 812
+
+#line 812
 	for(;;)
+#line 812
 	{
+#line 812
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 812
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 812
 
+#line 812
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 812
 				 RGN_WRITE, &xp);
+#line 812
 		if(lstatus != NC_NOERR)
+#line 812
 			return lstatus;
+#line 812
 
-		lstatus = ncx_putn_uchar_double(&xp, nput, value);
+#line 812
+		lstatus = ncx_putn_uchar_double(&xp, nput, value ,fillp);
+#line 812
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 812
 		{
+#line 812
 			/* not fatal to the loop */
+#line 812
 			status = lstatus;
+#line 812
 		}
+#line 812
 
+#line 812
 		(void) ncio_rel(ncp->nciop, offset,
+#line 812
 				 RGN_MODIFIED);
+#line 812
 
+#line 812
 		remaining -= extent;
+#line 812
 		if(remaining == 0)
+#line 812
 			break; /* normal loop exit */
-		offset += extent;
+#line 812
+		offset += (off_t)extent;
+#line 812
 		value += nput;
+#line 812
 
+#line 812
 	}
+#line 812
+        free(fillp);
+#line 812
 
+#line 812
 	return status;
+#line 812
 }
+#line 812
 
 static int
+#line 813
 putNCvx_uchar_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 813
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 813
 {
+#line 813
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 813
 	size_t remaining = varp->xsz * nelems;
+#line 813
 	int status = NC_NOERR;
+#line 813
 	void *xp;
+#line 813
+        void *fillp;
+#line 813
 
+#line 813
 	if(nelems == 0)
+#line 813
 		return NC_NOERR;
+#line 813
 
+#line 813
 	assert(value != NULL);
+#line 813
+
+#line 813
+        fillp = malloc(varp->xsz);
+#line 813
+	status = NC3_inq_var_fill(varp, fillp);
+#line 813
 
+#line 813
 	for(;;)
+#line 813
 	{
+#line 813
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 813
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 813
 
+#line 813
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 813
 				 RGN_WRITE, &xp);
+#line 813
 		if(lstatus != NC_NOERR)
+#line 813
 			return lstatus;
+#line 813
 
-		lstatus = ncx_putn_uchar_longlong(&xp, nput, value);
+#line 813
+		lstatus = ncx_putn_uchar_longlong(&xp, nput, value ,fillp);
+#line 813
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 813
 		{
+#line 813
 			/* not fatal to the loop */
+#line 813
 			status = lstatus;
+#line 813
 		}
+#line 813
 
+#line 813
 		(void) ncio_rel(ncp->nciop, offset,
+#line 813
 				 RGN_MODIFIED);
+#line 813
 
+#line 813
 		remaining -= extent;
+#line 813
 		if(remaining == 0)
+#line 813
 			break; /* normal loop exit */
-		offset += extent;
+#line 813
+		offset += (off_t)extent;
+#line 813
 		value += nput;
+#line 813
 
+#line 813
 	}
+#line 813
+        free(fillp);
+#line 813
 
+#line 813
 	return status;
+#line 813
 }
+#line 813
 
 static int
+#line 814
 putNCvx_uchar_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 814
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 814
 {
+#line 814
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 814
 	size_t remaining = varp->xsz * nelems;
+#line 814
 	int status = NC_NOERR;
+#line 814
 	void *xp;
+#line 814
+        void *fillp;
+#line 814
 
+#line 814
 	if(nelems == 0)
+#line 814
 		return NC_NOERR;
+#line 814
 
+#line 814
 	assert(value != NULL);
+#line 814
+
+#line 814
+        fillp = malloc(varp->xsz);
+#line 814
+	status = NC3_inq_var_fill(varp, fillp);
+#line 814
 
+#line 814
 	for(;;)
+#line 814
 	{
+#line 814
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 814
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 814
 
+#line 814
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 814
 				 RGN_WRITE, &xp);
+#line 814
 		if(lstatus != NC_NOERR)
+#line 814
 			return lstatus;
+#line 814
 
-		lstatus = ncx_putn_uchar_ushort(&xp, nput, value);
+#line 814
+		lstatus = ncx_putn_uchar_ushort(&xp, nput, value ,fillp);
+#line 814
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 814
 		{
+#line 814
 			/* not fatal to the loop */
+#line 814
 			status = lstatus;
+#line 814
 		}
+#line 814
 
+#line 814
 		(void) ncio_rel(ncp->nciop, offset,
+#line 814
 				 RGN_MODIFIED);
+#line 814
 
+#line 814
 		remaining -= extent;
+#line 814
 		if(remaining == 0)
+#line 814
 			break; /* normal loop exit */
-		offset += extent;
+#line 814
+		offset += (off_t)extent;
+#line 814
 		value += nput;
+#line 814
 
+#line 814
 	}
+#line 814
+        free(fillp);
+#line 814
 
+#line 814
 	return status;
+#line 814
 }
+#line 814
 
 static int
+#line 815
 putNCvx_uchar_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 815
 		 const size_t *start, size_t nelems, const uint *value)
+#line 815
 {
+#line 815
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 815
 	size_t remaining = varp->xsz * nelems;
+#line 815
 	int status = NC_NOERR;
+#line 815
 	void *xp;
+#line 815
+        void *fillp;
+#line 815
 
+#line 815
 	if(nelems == 0)
+#line 815
 		return NC_NOERR;
+#line 815
 
+#line 815
 	assert(value != NULL);
+#line 815
 
+#line 815
+        fillp = malloc(varp->xsz);
+#line 815
+	status = NC3_inq_var_fill(varp, fillp);
+#line 815
+
+#line 815
 	for(;;)
+#line 815
 	{
+#line 815
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 815
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 815
 
+#line 815
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 815
 				 RGN_WRITE, &xp);
+#line 815
 		if(lstatus != NC_NOERR)
+#line 815
 			return lstatus;
+#line 815
 
-		lstatus = ncx_putn_uchar_uint(&xp, nput, value);
+#line 815
+		lstatus = ncx_putn_uchar_uint(&xp, nput, value ,fillp);
+#line 815
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 815
 		{
+#line 815
 			/* not fatal to the loop */
+#line 815
 			status = lstatus;
+#line 815
 		}
+#line 815
 
+#line 815
 		(void) ncio_rel(ncp->nciop, offset,
+#line 815
 				 RGN_MODIFIED);
+#line 815
 
+#line 815
 		remaining -= extent;
+#line 815
 		if(remaining == 0)
+#line 815
 			break; /* normal loop exit */
-		offset += extent;
+#line 815
+		offset += (off_t)extent;
+#line 815
 		value += nput;
+#line 815
 
+#line 815
 	}
+#line 815
+        free(fillp);
+#line 815
 
+#line 815
 	return status;
+#line 815
 }
+#line 815
 
 static int
+#line 816
 putNCvx_uchar_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 816
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 816
 {
+#line 816
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 816
 	size_t remaining = varp->xsz * nelems;
+#line 816
 	int status = NC_NOERR;
+#line 816
 	void *xp;
+#line 816
+        void *fillp;
+#line 816
 
+#line 816
 	if(nelems == 0)
+#line 816
 		return NC_NOERR;
+#line 816
 
+#line 816
 	assert(value != NULL);
+#line 816
+
+#line 816
+        fillp = malloc(varp->xsz);
+#line 816
+	status = NC3_inq_var_fill(varp, fillp);
+#line 816
 
+#line 816
 	for(;;)
+#line 816
 	{
+#line 816
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 816
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 816
 
+#line 816
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 816
 				 RGN_WRITE, &xp);
+#line 816
 		if(lstatus != NC_NOERR)
+#line 816
 			return lstatus;
+#line 816
 
-		lstatus = ncx_putn_uchar_ulonglong(&xp, nput, value);
+#line 816
+		lstatus = ncx_putn_uchar_ulonglong(&xp, nput, value ,fillp);
+#line 816
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 816
 		{
+#line 816
 			/* not fatal to the loop */
+#line 816
 			status = lstatus;
+#line 816
 		}
+#line 816
 
+#line 816
 		(void) ncio_rel(ncp->nciop, offset,
+#line 816
 				 RGN_MODIFIED);
+#line 816
 
+#line 816
 		remaining -= extent;
+#line 816
 		if(remaining == 0)
+#line 816
 			break; /* normal loop exit */
-		offset += extent;
+#line 816
+		offset += (off_t)extent;
+#line 816
 		value += nput;
+#line 816
 
+#line 816
 	}
+#line 816
+        free(fillp);
+#line 816
 
+#line 816
 	return status;
+#line 816
 }
+#line 816
 
 
 static int
+#line 818
 putNCvx_ushort_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 818
 		 const size_t *start, size_t nelems, const schar *value)
+#line 818
 {
+#line 818
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 818
 	size_t remaining = varp->xsz * nelems;
+#line 818
 	int status = NC_NOERR;
+#line 818
 	void *xp;
+#line 818
+        void *fillp;
+#line 818
 
+#line 818
 	if(nelems == 0)
+#line 818
 		return NC_NOERR;
+#line 818
 
+#line 818
 	assert(value != NULL);
+#line 818
 
+#line 818
+        fillp = malloc(varp->xsz);
+#line 818
+	status = NC3_inq_var_fill(varp, fillp);
+#line 818
+
+#line 818
 	for(;;)
+#line 818
 	{
+#line 818
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 818
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 818
 
+#line 818
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 818
 				 RGN_WRITE, &xp);
+#line 818
 		if(lstatus != NC_NOERR)
+#line 818
 			return lstatus;
+#line 818
 
-		lstatus = ncx_putn_ushort_schar(&xp, nput, value);
+#line 818
+		lstatus = ncx_putn_ushort_schar(&xp, nput, value ,fillp);
+#line 818
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 818
 		{
+#line 818
 			/* not fatal to the loop */
+#line 818
 			status = lstatus;
+#line 818
 		}
+#line 818
 
+#line 818
 		(void) ncio_rel(ncp->nciop, offset,
+#line 818
 				 RGN_MODIFIED);
+#line 818
 
+#line 818
 		remaining -= extent;
+#line 818
 		if(remaining == 0)
+#line 818
 			break; /* normal loop exit */
-		offset += extent;
+#line 818
+		offset += (off_t)extent;
+#line 818
 		value += nput;
+#line 818
 
+#line 818
 	}
+#line 818
+        free(fillp);
+#line 818
 
+#line 818
 	return status;
+#line 818
 }
+#line 818
 
 static int
+#line 819
 putNCvx_ushort_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 819
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 819
 {
+#line 819
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 819
 	size_t remaining = varp->xsz * nelems;
+#line 819
 	int status = NC_NOERR;
+#line 819
 	void *xp;
+#line 819
+        void *fillp;
+#line 819
 
+#line 819
 	if(nelems == 0)
+#line 819
 		return NC_NOERR;
+#line 819
 
+#line 819
 	assert(value != NULL);
+#line 819
+
+#line 819
+        fillp = malloc(varp->xsz);
+#line 819
+	status = NC3_inq_var_fill(varp, fillp);
+#line 819
 
+#line 819
 	for(;;)
+#line 819
 	{
+#line 819
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 819
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 819
 
+#line 819
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 819
 				 RGN_WRITE, &xp);
+#line 819
 		if(lstatus != NC_NOERR)
+#line 819
 			return lstatus;
+#line 819
 
-		lstatus = ncx_putn_ushort_uchar(&xp, nput, value);
+#line 819
+		lstatus = ncx_putn_ushort_uchar(&xp, nput, value ,fillp);
+#line 819
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 819
 		{
+#line 819
 			/* not fatal to the loop */
+#line 819
 			status = lstatus;
+#line 819
 		}
+#line 819
 
+#line 819
 		(void) ncio_rel(ncp->nciop, offset,
+#line 819
 				 RGN_MODIFIED);
+#line 819
 
+#line 819
 		remaining -= extent;
+#line 819
 		if(remaining == 0)
+#line 819
 			break; /* normal loop exit */
-		offset += extent;
+#line 819
+		offset += (off_t)extent;
+#line 819
 		value += nput;
+#line 819
 
+#line 819
 	}
+#line 819
+        free(fillp);
+#line 819
 
+#line 819
 	return status;
+#line 819
 }
+#line 819
 
 static int
+#line 820
 putNCvx_ushort_short(NC3_INFO* ncp, const NC_var *varp,
+#line 820
 		 const size_t *start, size_t nelems, const short *value)
+#line 820
 {
+#line 820
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 820
 	size_t remaining = varp->xsz * nelems;
+#line 820
 	int status = NC_NOERR;
+#line 820
 	void *xp;
+#line 820
+        void *fillp;
+#line 820
 
+#line 820
 	if(nelems == 0)
+#line 820
 		return NC_NOERR;
+#line 820
 
+#line 820
 	assert(value != NULL);
+#line 820
 
+#line 820
+        fillp = malloc(varp->xsz);
+#line 820
+	status = NC3_inq_var_fill(varp, fillp);
+#line 820
+
+#line 820
 	for(;;)
+#line 820
 	{
+#line 820
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 820
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 820
 
+#line 820
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 820
 				 RGN_WRITE, &xp);
+#line 820
 		if(lstatus != NC_NOERR)
+#line 820
 			return lstatus;
+#line 820
 
-		lstatus = ncx_putn_ushort_short(&xp, nput, value);
+#line 820
+		lstatus = ncx_putn_ushort_short(&xp, nput, value ,fillp);
+#line 820
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 820
 		{
+#line 820
 			/* not fatal to the loop */
+#line 820
 			status = lstatus;
+#line 820
 		}
+#line 820
 
+#line 820
 		(void) ncio_rel(ncp->nciop, offset,
+#line 820
 				 RGN_MODIFIED);
+#line 820
 
+#line 820
 		remaining -= extent;
+#line 820
 		if(remaining == 0)
+#line 820
 			break; /* normal loop exit */
-		offset += extent;
+#line 820
+		offset += (off_t)extent;
+#line 820
 		value += nput;
+#line 820
 
+#line 820
 	}
+#line 820
+        free(fillp);
+#line 820
 
+#line 820
 	return status;
+#line 820
 }
+#line 820
 
 static int
+#line 821
 putNCvx_ushort_int(NC3_INFO* ncp, const NC_var *varp,
+#line 821
 		 const size_t *start, size_t nelems, const int *value)
+#line 821
 {
+#line 821
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 821
 	size_t remaining = varp->xsz * nelems;
+#line 821
 	int status = NC_NOERR;
+#line 821
 	void *xp;
+#line 821
+        void *fillp;
+#line 821
 
+#line 821
 	if(nelems == 0)
+#line 821
 		return NC_NOERR;
+#line 821
 
+#line 821
 	assert(value != NULL);
+#line 821
+
+#line 821
+        fillp = malloc(varp->xsz);
+#line 821
+	status = NC3_inq_var_fill(varp, fillp);
+#line 821
 
+#line 821
 	for(;;)
+#line 821
 	{
+#line 821
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 821
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 821
 
+#line 821
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 821
 				 RGN_WRITE, &xp);
+#line 821
 		if(lstatus != NC_NOERR)
+#line 821
 			return lstatus;
+#line 821
 
-		lstatus = ncx_putn_ushort_int(&xp, nput, value);
+#line 821
+		lstatus = ncx_putn_ushort_int(&xp, nput, value ,fillp);
+#line 821
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 821
 		{
+#line 821
 			/* not fatal to the loop */
+#line 821
 			status = lstatus;
+#line 821
 		}
+#line 821
 
+#line 821
 		(void) ncio_rel(ncp->nciop, offset,
+#line 821
 				 RGN_MODIFIED);
+#line 821
 
+#line 821
 		remaining -= extent;
+#line 821
 		if(remaining == 0)
+#line 821
 			break; /* normal loop exit */
-		offset += extent;
+#line 821
+		offset += (off_t)extent;
+#line 821
 		value += nput;
+#line 821
 
+#line 821
 	}
+#line 821
+        free(fillp);
+#line 821
 
+#line 821
 	return status;
+#line 821
 }
+#line 821
 
 static int
+#line 822
 putNCvx_ushort_float(NC3_INFO* ncp, const NC_var *varp,
+#line 822
 		 const size_t *start, size_t nelems, const float *value)
+#line 822
 {
+#line 822
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 822
 	size_t remaining = varp->xsz * nelems;
+#line 822
 	int status = NC_NOERR;
+#line 822
 	void *xp;
+#line 822
+        void *fillp;
+#line 822
 
+#line 822
 	if(nelems == 0)
+#line 822
 		return NC_NOERR;
+#line 822
 
+#line 822
 	assert(value != NULL);
+#line 822
+
+#line 822
+        fillp = malloc(varp->xsz);
+#line 822
+	status = NC3_inq_var_fill(varp, fillp);
+#line 822
 
+#line 822
 	for(;;)
+#line 822
 	{
+#line 822
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 822
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 822
 
+#line 822
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 822
 				 RGN_WRITE, &xp);
+#line 822
 		if(lstatus != NC_NOERR)
+#line 822
 			return lstatus;
+#line 822
 
-		lstatus = ncx_putn_ushort_float(&xp, nput, value);
+#line 822
+		lstatus = ncx_putn_ushort_float(&xp, nput, value ,fillp);
+#line 822
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 822
 		{
+#line 822
 			/* not fatal to the loop */
+#line 822
 			status = lstatus;
+#line 822
 		}
+#line 822
 
+#line 822
 		(void) ncio_rel(ncp->nciop, offset,
+#line 822
 				 RGN_MODIFIED);
+#line 822
 
+#line 822
 		remaining -= extent;
+#line 822
 		if(remaining == 0)
+#line 822
 			break; /* normal loop exit */
-		offset += extent;
+#line 822
+		offset += (off_t)extent;
+#line 822
 		value += nput;
+#line 822
 
+#line 822
 	}
+#line 822
+        free(fillp);
+#line 822
 
+#line 822
 	return status;
+#line 822
 }
+#line 822
 
 static int
+#line 823
 putNCvx_ushort_double(NC3_INFO* ncp, const NC_var *varp,
+#line 823
 		 const size_t *start, size_t nelems, const double *value)
+#line 823
 {
+#line 823
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 823
 	size_t remaining = varp->xsz * nelems;
+#line 823
 	int status = NC_NOERR;
+#line 823
 	void *xp;
+#line 823
+        void *fillp;
+#line 823
 
+#line 823
 	if(nelems == 0)
+#line 823
 		return NC_NOERR;
+#line 823
 
+#line 823
 	assert(value != NULL);
+#line 823
 
+#line 823
+        fillp = malloc(varp->xsz);
+#line 823
+	status = NC3_inq_var_fill(varp, fillp);
+#line 823
+
+#line 823
 	for(;;)
+#line 823
 	{
+#line 823
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 823
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 823
 
+#line 823
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 823
 				 RGN_WRITE, &xp);
+#line 823
 		if(lstatus != NC_NOERR)
+#line 823
 			return lstatus;
+#line 823
 
-		lstatus = ncx_putn_ushort_double(&xp, nput, value);
+#line 823
+		lstatus = ncx_putn_ushort_double(&xp, nput, value ,fillp);
+#line 823
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 823
 		{
+#line 823
 			/* not fatal to the loop */
+#line 823
 			status = lstatus;
+#line 823
 		}
+#line 823
 
+#line 823
 		(void) ncio_rel(ncp->nciop, offset,
+#line 823
 				 RGN_MODIFIED);
+#line 823
 
+#line 823
 		remaining -= extent;
+#line 823
 		if(remaining == 0)
+#line 823
 			break; /* normal loop exit */
-		offset += extent;
+#line 823
+		offset += (off_t)extent;
+#line 823
 		value += nput;
+#line 823
 
+#line 823
 	}
+#line 823
+        free(fillp);
+#line 823
 
+#line 823
 	return status;
+#line 823
 }
+#line 823
 
 static int
+#line 824
 putNCvx_ushort_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 824
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 824
 {
+#line 824
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 824
 	size_t remaining = varp->xsz * nelems;
+#line 824
 	int status = NC_NOERR;
+#line 824
 	void *xp;
+#line 824
+        void *fillp;
+#line 824
 
+#line 824
 	if(nelems == 0)
+#line 824
 		return NC_NOERR;
+#line 824
 
+#line 824
 	assert(value != NULL);
+#line 824
+
+#line 824
+        fillp = malloc(varp->xsz);
+#line 824
+	status = NC3_inq_var_fill(varp, fillp);
+#line 824
 
+#line 824
 	for(;;)
+#line 824
 	{
+#line 824
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 824
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 824
 
+#line 824
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 824
 				 RGN_WRITE, &xp);
+#line 824
 		if(lstatus != NC_NOERR)
+#line 824
 			return lstatus;
+#line 824
 
-		lstatus = ncx_putn_ushort_longlong(&xp, nput, value);
+#line 824
+		lstatus = ncx_putn_ushort_longlong(&xp, nput, value ,fillp);
+#line 824
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 824
 		{
+#line 824
 			/* not fatal to the loop */
+#line 824
 			status = lstatus;
+#line 824
 		}
+#line 824
 
+#line 824
 		(void) ncio_rel(ncp->nciop, offset,
+#line 824
 				 RGN_MODIFIED);
+#line 824
 
+#line 824
 		remaining -= extent;
+#line 824
 		if(remaining == 0)
+#line 824
 			break; /* normal loop exit */
-		offset += extent;
+#line 824
+		offset += (off_t)extent;
+#line 824
 		value += nput;
+#line 824
 
+#line 824
 	}
+#line 824
+        free(fillp);
+#line 824
 
+#line 824
 	return status;
+#line 824
 }
+#line 824
 
 static int
+#line 825
 putNCvx_ushort_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 825
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 825
 {
+#line 825
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 825
 	size_t remaining = varp->xsz * nelems;
+#line 825
 	int status = NC_NOERR;
+#line 825
 	void *xp;
+#line 825
+        void *fillp;
+#line 825
 
+#line 825
 	if(nelems == 0)
+#line 825
 		return NC_NOERR;
+#line 825
 
+#line 825
 	assert(value != NULL);
+#line 825
 
+#line 825
+        fillp = malloc(varp->xsz);
+#line 825
+	status = NC3_inq_var_fill(varp, fillp);
+#line 825
+
+#line 825
 	for(;;)
+#line 825
 	{
+#line 825
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 825
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 825
 
+#line 825
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 825
 				 RGN_WRITE, &xp);
+#line 825
 		if(lstatus != NC_NOERR)
+#line 825
 			return lstatus;
+#line 825
 
-		lstatus = ncx_putn_ushort_ushort(&xp, nput, value);
+#line 825
+		lstatus = ncx_putn_ushort_ushort(&xp, nput, value ,fillp);
+#line 825
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 825
 		{
+#line 825
 			/* not fatal to the loop */
+#line 825
 			status = lstatus;
+#line 825
 		}
+#line 825
 
+#line 825
 		(void) ncio_rel(ncp->nciop, offset,
+#line 825
 				 RGN_MODIFIED);
+#line 825
 
+#line 825
 		remaining -= extent;
+#line 825
 		if(remaining == 0)
+#line 825
 			break; /* normal loop exit */
-		offset += extent;
+#line 825
+		offset += (off_t)extent;
+#line 825
 		value += nput;
+#line 825
 
+#line 825
 	}
+#line 825
+        free(fillp);
+#line 825
 
+#line 825
 	return status;
+#line 825
 }
+#line 825
 
 static int
+#line 826
 putNCvx_ushort_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 826
 		 const size_t *start, size_t nelems, const uint *value)
+#line 826
 {
+#line 826
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 826
 	size_t remaining = varp->xsz * nelems;
+#line 826
 	int status = NC_NOERR;
+#line 826
 	void *xp;
+#line 826
+        void *fillp;
+#line 826
 
+#line 826
 	if(nelems == 0)
+#line 826
 		return NC_NOERR;
+#line 826
 
+#line 826
 	assert(value != NULL);
+#line 826
+
+#line 826
+        fillp = malloc(varp->xsz);
+#line 826
+	status = NC3_inq_var_fill(varp, fillp);
+#line 826
 
+#line 826
 	for(;;)
+#line 826
 	{
+#line 826
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 826
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 826
 
+#line 826
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 826
 				 RGN_WRITE, &xp);
+#line 826
 		if(lstatus != NC_NOERR)
+#line 826
 			return lstatus;
+#line 826
 
-		lstatus = ncx_putn_ushort_uint(&xp, nput, value);
+#line 826
+		lstatus = ncx_putn_ushort_uint(&xp, nput, value ,fillp);
+#line 826
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 826
 		{
+#line 826
 			/* not fatal to the loop */
+#line 826
 			status = lstatus;
+#line 826
 		}
+#line 826
 
+#line 826
 		(void) ncio_rel(ncp->nciop, offset,
+#line 826
 				 RGN_MODIFIED);
+#line 826
 
+#line 826
 		remaining -= extent;
+#line 826
 		if(remaining == 0)
+#line 826
 			break; /* normal loop exit */
-		offset += extent;
+#line 826
+		offset += (off_t)extent;
+#line 826
 		value += nput;
+#line 826
 
+#line 826
 	}
+#line 826
+        free(fillp);
+#line 826
 
+#line 826
 	return status;
+#line 826
 }
+#line 826
 
 static int
+#line 827
 putNCvx_ushort_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 827
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 827
 {
+#line 827
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 827
 	size_t remaining = varp->xsz * nelems;
+#line 827
 	int status = NC_NOERR;
+#line 827
 	void *xp;
+#line 827
+        void *fillp;
+#line 827
 
+#line 827
 	if(nelems == 0)
+#line 827
 		return NC_NOERR;
+#line 827
 
+#line 827
 	assert(value != NULL);
+#line 827
 
+#line 827
+        fillp = malloc(varp->xsz);
+#line 827
+	status = NC3_inq_var_fill(varp, fillp);
+#line 827
+
+#line 827
 	for(;;)
+#line 827
 	{
+#line 827
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 827
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 827
 
+#line 827
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 827
 				 RGN_WRITE, &xp);
+#line 827
 		if(lstatus != NC_NOERR)
+#line 827
 			return lstatus;
+#line 827
 
-		lstatus = ncx_putn_ushort_ulonglong(&xp, nput, value);
+#line 827
+		lstatus = ncx_putn_ushort_ulonglong(&xp, nput, value ,fillp);
+#line 827
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 827
 		{
+#line 827
 			/* not fatal to the loop */
+#line 827
 			status = lstatus;
+#line 827
 		}
+#line 827
 
+#line 827
 		(void) ncio_rel(ncp->nciop, offset,
+#line 827
 				 RGN_MODIFIED);
+#line 827
 
+#line 827
 		remaining -= extent;
+#line 827
 		if(remaining == 0)
+#line 827
 			break; /* normal loop exit */
-		offset += extent;
+#line 827
+		offset += (off_t)extent;
+#line 827
 		value += nput;
+#line 827
 
+#line 827
 	}
+#line 827
+        free(fillp);
+#line 827
 
+#line 827
 	return status;
+#line 827
 }
+#line 827
 
 
 static int
+#line 829
 putNCvx_uint_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 829
 		 const size_t *start, size_t nelems, const schar *value)
+#line 829
 {
+#line 829
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 829
 	size_t remaining = varp->xsz * nelems;
+#line 829
 	int status = NC_NOERR;
+#line 829
 	void *xp;
+#line 829
+        void *fillp;
+#line 829
 
+#line 829
 	if(nelems == 0)
+#line 829
 		return NC_NOERR;
+#line 829
 
+#line 829
 	assert(value != NULL);
+#line 829
+
+#line 829
+        fillp = malloc(varp->xsz);
+#line 829
+	status = NC3_inq_var_fill(varp, fillp);
+#line 829
 
+#line 829
 	for(;;)
+#line 829
 	{
+#line 829
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 829
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 829
 
+#line 829
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 829
 				 RGN_WRITE, &xp);
+#line 829
 		if(lstatus != NC_NOERR)
+#line 829
 			return lstatus;
+#line 829
 
-		lstatus = ncx_putn_uint_schar(&xp, nput, value);
+#line 829
+		lstatus = ncx_putn_uint_schar(&xp, nput, value ,fillp);
+#line 829
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 829
 		{
+#line 829
 			/* not fatal to the loop */
+#line 829
 			status = lstatus;
+#line 829
 		}
+#line 829
 
+#line 829
 		(void) ncio_rel(ncp->nciop, offset,
+#line 829
 				 RGN_MODIFIED);
+#line 829
 
+#line 829
 		remaining -= extent;
+#line 829
 		if(remaining == 0)
+#line 829
 			break; /* normal loop exit */
-		offset += extent;
+#line 829
+		offset += (off_t)extent;
+#line 829
 		value += nput;
+#line 829
 
+#line 829
 	}
+#line 829
+        free(fillp);
+#line 829
 
+#line 829
 	return status;
+#line 829
 }
+#line 829
 
 static int
+#line 830
 putNCvx_uint_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 830
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 830
 {
+#line 830
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 830
 	size_t remaining = varp->xsz * nelems;
+#line 830
 	int status = NC_NOERR;
+#line 830
 	void *xp;
+#line 830
+        void *fillp;
+#line 830
 
+#line 830
 	if(nelems == 0)
+#line 830
 		return NC_NOERR;
+#line 830
 
+#line 830
 	assert(value != NULL);
+#line 830
+
+#line 830
+        fillp = malloc(varp->xsz);
+#line 830
+	status = NC3_inq_var_fill(varp, fillp);
+#line 830
 
+#line 830
 	for(;;)
+#line 830
 	{
+#line 830
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 830
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 830
 
+#line 830
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 830
 				 RGN_WRITE, &xp);
+#line 830
 		if(lstatus != NC_NOERR)
+#line 830
 			return lstatus;
+#line 830
 
-		lstatus = ncx_putn_uint_uchar(&xp, nput, value);
+#line 830
+		lstatus = ncx_putn_uint_uchar(&xp, nput, value ,fillp);
+#line 830
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 830
 		{
+#line 830
 			/* not fatal to the loop */
+#line 830
 			status = lstatus;
+#line 830
 		}
+#line 830
 
+#line 830
 		(void) ncio_rel(ncp->nciop, offset,
+#line 830
 				 RGN_MODIFIED);
+#line 830
 
+#line 830
 		remaining -= extent;
+#line 830
 		if(remaining == 0)
+#line 830
 			break; /* normal loop exit */
-		offset += extent;
+#line 830
+		offset += (off_t)extent;
+#line 830
 		value += nput;
+#line 830
 
+#line 830
 	}
+#line 830
+        free(fillp);
+#line 830
 
+#line 830
 	return status;
+#line 830
 }
+#line 830
 
 static int
+#line 831
 putNCvx_uint_short(NC3_INFO* ncp, const NC_var *varp,
+#line 831
 		 const size_t *start, size_t nelems, const short *value)
+#line 831
 {
+#line 831
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 831
 	size_t remaining = varp->xsz * nelems;
+#line 831
 	int status = NC_NOERR;
+#line 831
 	void *xp;
+#line 831
+        void *fillp;
+#line 831
 
+#line 831
 	if(nelems == 0)
+#line 831
 		return NC_NOERR;
+#line 831
 
+#line 831
 	assert(value != NULL);
+#line 831
 
+#line 831
+        fillp = malloc(varp->xsz);
+#line 831
+	status = NC3_inq_var_fill(varp, fillp);
+#line 831
+
+#line 831
 	for(;;)
+#line 831
 	{
+#line 831
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 831
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 831
 
+#line 831
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 831
 				 RGN_WRITE, &xp);
+#line 831
 		if(lstatus != NC_NOERR)
+#line 831
 			return lstatus;
+#line 831
 
-		lstatus = ncx_putn_uint_short(&xp, nput, value);
+#line 831
+		lstatus = ncx_putn_uint_short(&xp, nput, value ,fillp);
+#line 831
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 831
 		{
+#line 831
 			/* not fatal to the loop */
+#line 831
 			status = lstatus;
+#line 831
 		}
+#line 831
 
+#line 831
 		(void) ncio_rel(ncp->nciop, offset,
+#line 831
 				 RGN_MODIFIED);
+#line 831
 
+#line 831
 		remaining -= extent;
+#line 831
 		if(remaining == 0)
+#line 831
 			break; /* normal loop exit */
-		offset += extent;
+#line 831
+		offset += (off_t)extent;
+#line 831
 		value += nput;
+#line 831
 
+#line 831
 	}
+#line 831
+        free(fillp);
+#line 831
 
+#line 831
 	return status;
+#line 831
 }
+#line 831
 
 static int
+#line 832
 putNCvx_uint_int(NC3_INFO* ncp, const NC_var *varp,
+#line 832
 		 const size_t *start, size_t nelems, const int *value)
+#line 832
 {
+#line 832
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 832
 	size_t remaining = varp->xsz * nelems;
+#line 832
 	int status = NC_NOERR;
+#line 832
 	void *xp;
+#line 832
+        void *fillp;
+#line 832
 
+#line 832
 	if(nelems == 0)
+#line 832
 		return NC_NOERR;
+#line 832
 
+#line 832
 	assert(value != NULL);
+#line 832
+
+#line 832
+        fillp = malloc(varp->xsz);
+#line 832
+	status = NC3_inq_var_fill(varp, fillp);
+#line 832
 
+#line 832
 	for(;;)
+#line 832
 	{
+#line 832
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 832
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 832
 
+#line 832
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 832
 				 RGN_WRITE, &xp);
+#line 832
 		if(lstatus != NC_NOERR)
+#line 832
 			return lstatus;
+#line 832
 
-		lstatus = ncx_putn_uint_int(&xp, nput, value);
+#line 832
+		lstatus = ncx_putn_uint_int(&xp, nput, value ,fillp);
+#line 832
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 832
 		{
+#line 832
 			/* not fatal to the loop */
+#line 832
 			status = lstatus;
+#line 832
 		}
+#line 832
 
+#line 832
 		(void) ncio_rel(ncp->nciop, offset,
+#line 832
 				 RGN_MODIFIED);
+#line 832
 
+#line 832
 		remaining -= extent;
+#line 832
 		if(remaining == 0)
+#line 832
 			break; /* normal loop exit */
-		offset += extent;
+#line 832
+		offset += (off_t)extent;
+#line 832
 		value += nput;
+#line 832
 
+#line 832
 	}
+#line 832
+        free(fillp);
+#line 832
 
+#line 832
 	return status;
+#line 832
 }
+#line 832
 
 static int
+#line 833
 putNCvx_uint_float(NC3_INFO* ncp, const NC_var *varp,
+#line 833
 		 const size_t *start, size_t nelems, const float *value)
+#line 833
 {
+#line 833
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 833
 	size_t remaining = varp->xsz * nelems;
+#line 833
 	int status = NC_NOERR;
+#line 833
 	void *xp;
+#line 833
+        void *fillp;
+#line 833
 
+#line 833
 	if(nelems == 0)
+#line 833
 		return NC_NOERR;
+#line 833
 
+#line 833
 	assert(value != NULL);
+#line 833
 
+#line 833
+        fillp = malloc(varp->xsz);
+#line 833
+	status = NC3_inq_var_fill(varp, fillp);
+#line 833
+
+#line 833
 	for(;;)
+#line 833
 	{
+#line 833
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 833
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 833
 
+#line 833
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 833
 				 RGN_WRITE, &xp);
+#line 833
 		if(lstatus != NC_NOERR)
+#line 833
 			return lstatus;
+#line 833
 
-		lstatus = ncx_putn_uint_float(&xp, nput, value);
+#line 833
+		lstatus = ncx_putn_uint_float(&xp, nput, value ,fillp);
+#line 833
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 833
 		{
+#line 833
 			/* not fatal to the loop */
+#line 833
 			status = lstatus;
+#line 833
 		}
+#line 833
 
+#line 833
 		(void) ncio_rel(ncp->nciop, offset,
+#line 833
 				 RGN_MODIFIED);
+#line 833
 
+#line 833
 		remaining -= extent;
+#line 833
 		if(remaining == 0)
+#line 833
 			break; /* normal loop exit */
-		offset += extent;
+#line 833
+		offset += (off_t)extent;
+#line 833
 		value += nput;
+#line 833
 
+#line 833
 	}
+#line 833
+        free(fillp);
+#line 833
 
+#line 833
 	return status;
+#line 833
 }
+#line 833
 
 static int
+#line 834
 putNCvx_uint_double(NC3_INFO* ncp, const NC_var *varp,
+#line 834
 		 const size_t *start, size_t nelems, const double *value)
+#line 834
 {
+#line 834
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 834
 	size_t remaining = varp->xsz * nelems;
+#line 834
 	int status = NC_NOERR;
+#line 834
 	void *xp;
+#line 834
+        void *fillp;
+#line 834
 
+#line 834
 	if(nelems == 0)
+#line 834
 		return NC_NOERR;
+#line 834
 
+#line 834
 	assert(value != NULL);
+#line 834
+
+#line 834
+        fillp = malloc(varp->xsz);
+#line 834
+	status = NC3_inq_var_fill(varp, fillp);
+#line 834
 
+#line 834
 	for(;;)
+#line 834
 	{
+#line 834
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 834
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 834
 
+#line 834
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 834
 				 RGN_WRITE, &xp);
+#line 834
 		if(lstatus != NC_NOERR)
+#line 834
 			return lstatus;
+#line 834
 
-		lstatus = ncx_putn_uint_double(&xp, nput, value);
+#line 834
+		lstatus = ncx_putn_uint_double(&xp, nput, value ,fillp);
+#line 834
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 834
 		{
+#line 834
 			/* not fatal to the loop */
+#line 834
 			status = lstatus;
+#line 834
 		}
+#line 834
 
+#line 834
 		(void) ncio_rel(ncp->nciop, offset,
+#line 834
 				 RGN_MODIFIED);
+#line 834
 
+#line 834
 		remaining -= extent;
+#line 834
 		if(remaining == 0)
+#line 834
 			break; /* normal loop exit */
-		offset += extent;
+#line 834
+		offset += (off_t)extent;
+#line 834
 		value += nput;
+#line 834
 
+#line 834
 	}
+#line 834
+        free(fillp);
+#line 834
 
+#line 834
 	return status;
+#line 834
 }
+#line 834
 
 static int
+#line 835
 putNCvx_uint_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 835
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 835
 {
+#line 835
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 835
 	size_t remaining = varp->xsz * nelems;
+#line 835
 	int status = NC_NOERR;
+#line 835
 	void *xp;
+#line 835
+        void *fillp;
+#line 835
 
+#line 835
 	if(nelems == 0)
+#line 835
 		return NC_NOERR;
+#line 835
 
+#line 835
 	assert(value != NULL);
+#line 835
 
+#line 835
+        fillp = malloc(varp->xsz);
+#line 835
+	status = NC3_inq_var_fill(varp, fillp);
+#line 835
+
+#line 835
 	for(;;)
+#line 835
 	{
+#line 835
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 835
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 835
 
+#line 835
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 835
 				 RGN_WRITE, &xp);
+#line 835
 		if(lstatus != NC_NOERR)
+#line 835
 			return lstatus;
+#line 835
 
-		lstatus = ncx_putn_uint_longlong(&xp, nput, value);
+#line 835
+		lstatus = ncx_putn_uint_longlong(&xp, nput, value ,fillp);
+#line 835
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 835
 		{
+#line 835
 			/* not fatal to the loop */
+#line 835
 			status = lstatus;
+#line 835
 		}
+#line 835
 
+#line 835
 		(void) ncio_rel(ncp->nciop, offset,
+#line 835
 				 RGN_MODIFIED);
+#line 835
 
+#line 835
 		remaining -= extent;
+#line 835
 		if(remaining == 0)
+#line 835
 			break; /* normal loop exit */
-		offset += extent;
+#line 835
+		offset += (off_t)extent;
+#line 835
 		value += nput;
+#line 835
 
+#line 835
 	}
+#line 835
+        free(fillp);
+#line 835
 
+#line 835
 	return status;
+#line 835
 }
+#line 835
 
 static int
+#line 836
 putNCvx_uint_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 836
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 836
 {
+#line 836
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 836
 	size_t remaining = varp->xsz * nelems;
+#line 836
 	int status = NC_NOERR;
+#line 836
 	void *xp;
+#line 836
+        void *fillp;
+#line 836
 
+#line 836
 	if(nelems == 0)
+#line 836
 		return NC_NOERR;
+#line 836
 
+#line 836
 	assert(value != NULL);
+#line 836
+
+#line 836
+        fillp = malloc(varp->xsz);
+#line 836
+	status = NC3_inq_var_fill(varp, fillp);
+#line 836
 
+#line 836
 	for(;;)
+#line 836
 	{
+#line 836
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 836
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 836
 
+#line 836
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 836
 				 RGN_WRITE, &xp);
+#line 836
 		if(lstatus != NC_NOERR)
+#line 836
 			return lstatus;
+#line 836
 
-		lstatus = ncx_putn_uint_ushort(&xp, nput, value);
+#line 836
+		lstatus = ncx_putn_uint_ushort(&xp, nput, value ,fillp);
+#line 836
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 836
 		{
+#line 836
 			/* not fatal to the loop */
+#line 836
 			status = lstatus;
+#line 836
 		}
+#line 836
 
+#line 836
 		(void) ncio_rel(ncp->nciop, offset,
+#line 836
 				 RGN_MODIFIED);
+#line 836
 
+#line 836
 		remaining -= extent;
+#line 836
 		if(remaining == 0)
+#line 836
 			break; /* normal loop exit */
-		offset += extent;
+#line 836
+		offset += (off_t)extent;
+#line 836
 		value += nput;
+#line 836
 
+#line 836
 	}
+#line 836
+        free(fillp);
+#line 836
 
+#line 836
 	return status;
+#line 836
 }
+#line 836
 
 static int
+#line 837
 putNCvx_uint_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 837
 		 const size_t *start, size_t nelems, const uint *value)
+#line 837
 {
+#line 837
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 837
 	size_t remaining = varp->xsz * nelems;
+#line 837
 	int status = NC_NOERR;
+#line 837
 	void *xp;
+#line 837
+        void *fillp;
+#line 837
 
+#line 837
 	if(nelems == 0)
+#line 837
 		return NC_NOERR;
+#line 837
 
+#line 837
 	assert(value != NULL);
+#line 837
+
+#line 837
+        fillp = malloc(varp->xsz);
+#line 837
+	status = NC3_inq_var_fill(varp, fillp);
+#line 837
 
+#line 837
 	for(;;)
+#line 837
 	{
+#line 837
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 837
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 837
 
+#line 837
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 837
 				 RGN_WRITE, &xp);
+#line 837
 		if(lstatus != NC_NOERR)
+#line 837
 			return lstatus;
+#line 837
 
-		lstatus = ncx_putn_uint_uint(&xp, nput, value);
+#line 837
+		lstatus = ncx_putn_uint_uint(&xp, nput, value ,fillp);
+#line 837
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 837
 		{
+#line 837
 			/* not fatal to the loop */
+#line 837
 			status = lstatus;
+#line 837
 		}
+#line 837
 
+#line 837
 		(void) ncio_rel(ncp->nciop, offset,
+#line 837
 				 RGN_MODIFIED);
+#line 837
 
+#line 837
 		remaining -= extent;
+#line 837
 		if(remaining == 0)
+#line 837
 			break; /* normal loop exit */
-		offset += extent;
+#line 837
+		offset += (off_t)extent;
+#line 837
 		value += nput;
+#line 837
 
+#line 837
 	}
+#line 837
+        free(fillp);
+#line 837
 
+#line 837
 	return status;
+#line 837
 }
+#line 837
 
 static int
+#line 838
 putNCvx_uint_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 838
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 838
 {
+#line 838
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 838
 	size_t remaining = varp->xsz * nelems;
+#line 838
 	int status = NC_NOERR;
+#line 838
 	void *xp;
+#line 838
+        void *fillp;
+#line 838
 
+#line 838
 	if(nelems == 0)
+#line 838
 		return NC_NOERR;
+#line 838
 
+#line 838
 	assert(value != NULL);
+#line 838
 
+#line 838
+        fillp = malloc(varp->xsz);
+#line 838
+	status = NC3_inq_var_fill(varp, fillp);
+#line 838
+
+#line 838
 	for(;;)
+#line 838
 	{
+#line 838
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 838
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 838
 
+#line 838
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 838
 				 RGN_WRITE, &xp);
+#line 838
 		if(lstatus != NC_NOERR)
+#line 838
 			return lstatus;
+#line 838
 
-		lstatus = ncx_putn_uint_ulonglong(&xp, nput, value);
+#line 838
+		lstatus = ncx_putn_uint_ulonglong(&xp, nput, value ,fillp);
+#line 838
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 838
 		{
+#line 838
 			/* not fatal to the loop */
+#line 838
 			status = lstatus;
+#line 838
 		}
+#line 838
 
+#line 838
 		(void) ncio_rel(ncp->nciop, offset,
+#line 838
 				 RGN_MODIFIED);
+#line 838
 
+#line 838
 		remaining -= extent;
+#line 838
 		if(remaining == 0)
+#line 838
 			break; /* normal loop exit */
-		offset += extent;
+#line 838
+		offset += (off_t)extent;
+#line 838
 		value += nput;
+#line 838
 
+#line 838
 	}
+#line 838
+        free(fillp);
+#line 838
 
+#line 838
 	return status;
+#line 838
 }
+#line 838
 
 
 static int
+#line 840
 putNCvx_longlong_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 840
 		 const size_t *start, size_t nelems, const schar *value)
+#line 840
 {
+#line 840
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 840
 	size_t remaining = varp->xsz * nelems;
+#line 840
 	int status = NC_NOERR;
+#line 840
 	void *xp;
+#line 840
+        void *fillp;
+#line 840
 
+#line 840
 	if(nelems == 0)
+#line 840
 		return NC_NOERR;
+#line 840
 
+#line 840
 	assert(value != NULL);
+#line 840
+
+#line 840
+        fillp = malloc(varp->xsz);
+#line 840
+	status = NC3_inq_var_fill(varp, fillp);
+#line 840
 
+#line 840
 	for(;;)
+#line 840
 	{
+#line 840
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 840
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 840
 
+#line 840
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 840
 				 RGN_WRITE, &xp);
+#line 840
 		if(lstatus != NC_NOERR)
+#line 840
 			return lstatus;
+#line 840
 
-		lstatus = ncx_putn_longlong_schar(&xp, nput, value);
+#line 840
+		lstatus = ncx_putn_longlong_schar(&xp, nput, value ,fillp);
+#line 840
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 840
 		{
+#line 840
 			/* not fatal to the loop */
+#line 840
 			status = lstatus;
+#line 840
 		}
+#line 840
 
+#line 840
 		(void) ncio_rel(ncp->nciop, offset,
+#line 840
 				 RGN_MODIFIED);
+#line 840
 
+#line 840
 		remaining -= extent;
+#line 840
 		if(remaining == 0)
+#line 840
 			break; /* normal loop exit */
-		offset += extent;
+#line 840
+		offset += (off_t)extent;
+#line 840
 		value += nput;
+#line 840
 
+#line 840
 	}
+#line 840
+        free(fillp);
+#line 840
 
+#line 840
 	return status;
+#line 840
 }
+#line 840
 
 static int
+#line 841
 putNCvx_longlong_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 841
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 841
 {
+#line 841
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 841
 	size_t remaining = varp->xsz * nelems;
+#line 841
 	int status = NC_NOERR;
+#line 841
 	void *xp;
+#line 841
+        void *fillp;
+#line 841
 
+#line 841
 	if(nelems == 0)
+#line 841
 		return NC_NOERR;
+#line 841
 
+#line 841
 	assert(value != NULL);
+#line 841
 
+#line 841
+        fillp = malloc(varp->xsz);
+#line 841
+	status = NC3_inq_var_fill(varp, fillp);
+#line 841
+
+#line 841
 	for(;;)
+#line 841
 	{
+#line 841
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 841
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 841
 
+#line 841
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 841
 				 RGN_WRITE, &xp);
+#line 841
 		if(lstatus != NC_NOERR)
+#line 841
 			return lstatus;
+#line 841
 
-		lstatus = ncx_putn_longlong_uchar(&xp, nput, value);
+#line 841
+		lstatus = ncx_putn_longlong_uchar(&xp, nput, value ,fillp);
+#line 841
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 841
 		{
+#line 841
 			/* not fatal to the loop */
+#line 841
 			status = lstatus;
+#line 841
 		}
+#line 841
 
+#line 841
 		(void) ncio_rel(ncp->nciop, offset,
+#line 841
 				 RGN_MODIFIED);
+#line 841
 
+#line 841
 		remaining -= extent;
+#line 841
 		if(remaining == 0)
+#line 841
 			break; /* normal loop exit */
-		offset += extent;
+#line 841
+		offset += (off_t)extent;
+#line 841
 		value += nput;
+#line 841
 
+#line 841
 	}
+#line 841
+        free(fillp);
+#line 841
 
+#line 841
 	return status;
+#line 841
 }
+#line 841
 
 static int
+#line 842
 putNCvx_longlong_short(NC3_INFO* ncp, const NC_var *varp,
+#line 842
 		 const size_t *start, size_t nelems, const short *value)
+#line 842
 {
+#line 842
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 842
 	size_t remaining = varp->xsz * nelems;
+#line 842
 	int status = NC_NOERR;
+#line 842
 	void *xp;
+#line 842
+        void *fillp;
+#line 842
 
+#line 842
 	if(nelems == 0)
+#line 842
 		return NC_NOERR;
+#line 842
 
+#line 842
 	assert(value != NULL);
+#line 842
+
+#line 842
+        fillp = malloc(varp->xsz);
+#line 842
+	status = NC3_inq_var_fill(varp, fillp);
+#line 842
 
+#line 842
 	for(;;)
+#line 842
 	{
+#line 842
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 842
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 842
 
+#line 842
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 842
 				 RGN_WRITE, &xp);
+#line 842
 		if(lstatus != NC_NOERR)
+#line 842
 			return lstatus;
+#line 842
 
-		lstatus = ncx_putn_longlong_short(&xp, nput, value);
+#line 842
+		lstatus = ncx_putn_longlong_short(&xp, nput, value ,fillp);
+#line 842
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 842
 		{
+#line 842
 			/* not fatal to the loop */
+#line 842
 			status = lstatus;
+#line 842
 		}
+#line 842
 
+#line 842
 		(void) ncio_rel(ncp->nciop, offset,
+#line 842
 				 RGN_MODIFIED);
+#line 842
 
+#line 842
 		remaining -= extent;
+#line 842
 		if(remaining == 0)
+#line 842
 			break; /* normal loop exit */
-		offset += extent;
+#line 842
+		offset += (off_t)extent;
+#line 842
 		value += nput;
+#line 842
 
+#line 842
 	}
+#line 842
+        free(fillp);
+#line 842
 
+#line 842
 	return status;
+#line 842
 }
+#line 842
 
 static int
+#line 843
 putNCvx_longlong_int(NC3_INFO* ncp, const NC_var *varp,
+#line 843
 		 const size_t *start, size_t nelems, const int *value)
+#line 843
 {
+#line 843
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 843
 	size_t remaining = varp->xsz * nelems;
+#line 843
 	int status = NC_NOERR;
+#line 843
 	void *xp;
+#line 843
+        void *fillp;
+#line 843
 
+#line 843
 	if(nelems == 0)
+#line 843
 		return NC_NOERR;
+#line 843
 
+#line 843
 	assert(value != NULL);
+#line 843
 
+#line 843
+        fillp = malloc(varp->xsz);
+#line 843
+	status = NC3_inq_var_fill(varp, fillp);
+#line 843
+
+#line 843
 	for(;;)
+#line 843
 	{
+#line 843
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 843
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 843
 
+#line 843
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 843
 				 RGN_WRITE, &xp);
+#line 843
 		if(lstatus != NC_NOERR)
+#line 843
 			return lstatus;
+#line 843
 
-		lstatus = ncx_putn_longlong_int(&xp, nput, value);
+#line 843
+		lstatus = ncx_putn_longlong_int(&xp, nput, value ,fillp);
+#line 843
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 843
 		{
+#line 843
 			/* not fatal to the loop */
+#line 843
 			status = lstatus;
+#line 843
 		}
+#line 843
 
+#line 843
 		(void) ncio_rel(ncp->nciop, offset,
+#line 843
 				 RGN_MODIFIED);
+#line 843
 
+#line 843
 		remaining -= extent;
+#line 843
 		if(remaining == 0)
+#line 843
 			break; /* normal loop exit */
-		offset += extent;
+#line 843
+		offset += (off_t)extent;
+#line 843
 		value += nput;
+#line 843
 
+#line 843
 	}
+#line 843
+        free(fillp);
+#line 843
 
+#line 843
 	return status;
+#line 843
 }
+#line 843
 
 static int
+#line 844
 putNCvx_longlong_float(NC3_INFO* ncp, const NC_var *varp,
+#line 844
 		 const size_t *start, size_t nelems, const float *value)
+#line 844
 {
+#line 844
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 844
 	size_t remaining = varp->xsz * nelems;
+#line 844
 	int status = NC_NOERR;
+#line 844
 	void *xp;
+#line 844
+        void *fillp;
+#line 844
 
+#line 844
 	if(nelems == 0)
+#line 844
 		return NC_NOERR;
+#line 844
 
+#line 844
 	assert(value != NULL);
+#line 844
+
+#line 844
+        fillp = malloc(varp->xsz);
+#line 844
+	status = NC3_inq_var_fill(varp, fillp);
+#line 844
 
+#line 844
 	for(;;)
+#line 844
 	{
+#line 844
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 844
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 844
 
+#line 844
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 844
 				 RGN_WRITE, &xp);
+#line 844
 		if(lstatus != NC_NOERR)
+#line 844
 			return lstatus;
+#line 844
 
-		lstatus = ncx_putn_longlong_float(&xp, nput, value);
+#line 844
+		lstatus = ncx_putn_longlong_float(&xp, nput, value ,fillp);
+#line 844
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 844
 		{
+#line 844
 			/* not fatal to the loop */
+#line 844
 			status = lstatus;
+#line 844
 		}
+#line 844
 
+#line 844
 		(void) ncio_rel(ncp->nciop, offset,
+#line 844
 				 RGN_MODIFIED);
+#line 844
 
+#line 844
 		remaining -= extent;
+#line 844
 		if(remaining == 0)
+#line 844
 			break; /* normal loop exit */
-		offset += extent;
+#line 844
+		offset += (off_t)extent;
+#line 844
 		value += nput;
+#line 844
 
+#line 844
 	}
+#line 844
+        free(fillp);
+#line 844
 
+#line 844
 	return status;
+#line 844
 }
+#line 844
 
 static int
+#line 845
 putNCvx_longlong_double(NC3_INFO* ncp, const NC_var *varp,
+#line 845
 		 const size_t *start, size_t nelems, const double *value)
+#line 845
 {
+#line 845
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 845
 	size_t remaining = varp->xsz * nelems;
+#line 845
 	int status = NC_NOERR;
+#line 845
 	void *xp;
+#line 845
+        void *fillp;
+#line 845
 
+#line 845
 	if(nelems == 0)
+#line 845
 		return NC_NOERR;
+#line 845
 
+#line 845
 	assert(value != NULL);
+#line 845
+
+#line 845
+        fillp = malloc(varp->xsz);
+#line 845
+	status = NC3_inq_var_fill(varp, fillp);
+#line 845
 
+#line 845
 	for(;;)
+#line 845
 	{
+#line 845
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 845
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 845
 
+#line 845
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 845
 				 RGN_WRITE, &xp);
+#line 845
 		if(lstatus != NC_NOERR)
+#line 845
 			return lstatus;
+#line 845
 
-		lstatus = ncx_putn_longlong_double(&xp, nput, value);
+#line 845
+		lstatus = ncx_putn_longlong_double(&xp, nput, value ,fillp);
+#line 845
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 845
 		{
+#line 845
 			/* not fatal to the loop */
+#line 845
 			status = lstatus;
+#line 845
 		}
+#line 845
 
+#line 845
 		(void) ncio_rel(ncp->nciop, offset,
+#line 845
 				 RGN_MODIFIED);
+#line 845
 
+#line 845
 		remaining -= extent;
+#line 845
 		if(remaining == 0)
+#line 845
 			break; /* normal loop exit */
-		offset += extent;
+#line 845
+		offset += (off_t)extent;
+#line 845
 		value += nput;
+#line 845
 
+#line 845
 	}
+#line 845
+        free(fillp);
+#line 845
 
+#line 845
 	return status;
+#line 845
 }
+#line 845
 
 static int
+#line 846
 putNCvx_longlong_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 846
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 846
 {
+#line 846
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 846
 	size_t remaining = varp->xsz * nelems;
+#line 846
 	int status = NC_NOERR;
+#line 846
 	void *xp;
+#line 846
+        void *fillp;
+#line 846
 
+#line 846
 	if(nelems == 0)
+#line 846
 		return NC_NOERR;
+#line 846
 
+#line 846
 	assert(value != NULL);
+#line 846
 
+#line 846
+        fillp = malloc(varp->xsz);
+#line 846
+	status = NC3_inq_var_fill(varp, fillp);
+#line 846
+
+#line 846
 	for(;;)
+#line 846
 	{
+#line 846
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 846
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 846
 
+#line 846
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 846
 				 RGN_WRITE, &xp);
+#line 846
 		if(lstatus != NC_NOERR)
+#line 846
 			return lstatus;
+#line 846
 
-		lstatus = ncx_putn_longlong_longlong(&xp, nput, value);
+#line 846
+		lstatus = ncx_putn_longlong_longlong(&xp, nput, value ,fillp);
+#line 846
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 846
 		{
+#line 846
 			/* not fatal to the loop */
+#line 846
 			status = lstatus;
+#line 846
 		}
+#line 846
 
+#line 846
 		(void) ncio_rel(ncp->nciop, offset,
+#line 846
 				 RGN_MODIFIED);
+#line 846
 
+#line 846
 		remaining -= extent;
+#line 846
 		if(remaining == 0)
+#line 846
 			break; /* normal loop exit */
-		offset += extent;
+#line 846
+		offset += (off_t)extent;
+#line 846
 		value += nput;
+#line 846
 
+#line 846
 	}
+#line 846
+        free(fillp);
+#line 846
 
+#line 846
 	return status;
+#line 846
 }
+#line 846
 
 static int
+#line 847
 putNCvx_longlong_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 847
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 847
 {
+#line 847
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 847
 	size_t remaining = varp->xsz * nelems;
+#line 847
 	int status = NC_NOERR;
+#line 847
 	void *xp;
+#line 847
+        void *fillp;
+#line 847
 
+#line 847
 	if(nelems == 0)
+#line 847
 		return NC_NOERR;
+#line 847
 
+#line 847
 	assert(value != NULL);
+#line 847
+
+#line 847
+        fillp = malloc(varp->xsz);
+#line 847
+	status = NC3_inq_var_fill(varp, fillp);
+#line 847
 
+#line 847
 	for(;;)
+#line 847
 	{
+#line 847
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 847
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 847
 
+#line 847
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 847
 				 RGN_WRITE, &xp);
+#line 847
 		if(lstatus != NC_NOERR)
+#line 847
 			return lstatus;
+#line 847
 
-		lstatus = ncx_putn_longlong_ushort(&xp, nput, value);
+#line 847
+		lstatus = ncx_putn_longlong_ushort(&xp, nput, value ,fillp);
+#line 847
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 847
 		{
+#line 847
 			/* not fatal to the loop */
+#line 847
 			status = lstatus;
+#line 847
 		}
+#line 847
 
+#line 847
 		(void) ncio_rel(ncp->nciop, offset,
+#line 847
 				 RGN_MODIFIED);
+#line 847
 
+#line 847
 		remaining -= extent;
+#line 847
 		if(remaining == 0)
+#line 847
 			break; /* normal loop exit */
-		offset += extent;
+#line 847
+		offset += (off_t)extent;
+#line 847
 		value += nput;
+#line 847
 
+#line 847
 	}
+#line 847
+        free(fillp);
+#line 847
 
+#line 847
 	return status;
+#line 847
 }
+#line 847
 
 static int
+#line 848
 putNCvx_longlong_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 848
 		 const size_t *start, size_t nelems, const uint *value)
+#line 848
 {
+#line 848
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 848
 	size_t remaining = varp->xsz * nelems;
+#line 848
 	int status = NC_NOERR;
+#line 848
 	void *xp;
+#line 848
+        void *fillp;
+#line 848
 
+#line 848
 	if(nelems == 0)
+#line 848
 		return NC_NOERR;
+#line 848
 
+#line 848
 	assert(value != NULL);
+#line 848
 
+#line 848
+        fillp = malloc(varp->xsz);
+#line 848
+	status = NC3_inq_var_fill(varp, fillp);
+#line 848
+
+#line 848
 	for(;;)
+#line 848
 	{
+#line 848
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 848
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 848
 
+#line 848
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 848
 				 RGN_WRITE, &xp);
+#line 848
 		if(lstatus != NC_NOERR)
+#line 848
 			return lstatus;
+#line 848
 
-		lstatus = ncx_putn_longlong_uint(&xp, nput, value);
+#line 848
+		lstatus = ncx_putn_longlong_uint(&xp, nput, value ,fillp);
+#line 848
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 848
 		{
+#line 848
 			/* not fatal to the loop */
+#line 848
 			status = lstatus;
+#line 848
 		}
+#line 848
 
+#line 848
 		(void) ncio_rel(ncp->nciop, offset,
+#line 848
 				 RGN_MODIFIED);
+#line 848
 
+#line 848
 		remaining -= extent;
+#line 848
 		if(remaining == 0)
+#line 848
 			break; /* normal loop exit */
-		offset += extent;
+#line 848
+		offset += (off_t)extent;
+#line 848
 		value += nput;
+#line 848
 
+#line 848
 	}
+#line 848
+        free(fillp);
+#line 848
 
+#line 848
 	return status;
+#line 848
 }
+#line 848
 
 static int
+#line 849
 putNCvx_longlong_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 849
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 849
 {
+#line 849
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 849
 	size_t remaining = varp->xsz * nelems;
+#line 849
 	int status = NC_NOERR;
+#line 849
 	void *xp;
+#line 849
+        void *fillp;
+#line 849
 
+#line 849
 	if(nelems == 0)
+#line 849
 		return NC_NOERR;
+#line 849
 
+#line 849
 	assert(value != NULL);
+#line 849
+
+#line 849
+        fillp = malloc(varp->xsz);
+#line 849
+	status = NC3_inq_var_fill(varp, fillp);
+#line 849
 
+#line 849
 	for(;;)
+#line 849
 	{
+#line 849
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 849
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 849
 
+#line 849
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 849
 				 RGN_WRITE, &xp);
+#line 849
 		if(lstatus != NC_NOERR)
+#line 849
 			return lstatus;
+#line 849
 
-		lstatus = ncx_putn_longlong_ulonglong(&xp, nput, value);
+#line 849
+		lstatus = ncx_putn_longlong_ulonglong(&xp, nput, value ,fillp);
+#line 849
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 849
 		{
+#line 849
 			/* not fatal to the loop */
+#line 849
 			status = lstatus;
+#line 849
 		}
+#line 849
 
+#line 849
 		(void) ncio_rel(ncp->nciop, offset,
+#line 849
 				 RGN_MODIFIED);
+#line 849
 
+#line 849
 		remaining -= extent;
+#line 849
 		if(remaining == 0)
+#line 849
 			break; /* normal loop exit */
-		offset += extent;
+#line 849
+		offset += (off_t)extent;
+#line 849
 		value += nput;
+#line 849
 
+#line 849
 	}
+#line 849
+        free(fillp);
+#line 849
 
+#line 849
 	return status;
+#line 849
 }
+#line 849
 
 
 static int
+#line 851
 putNCvx_ulonglong_schar(NC3_INFO* ncp, const NC_var *varp,
+#line 851
 		 const size_t *start, size_t nelems, const schar *value)
+#line 851
 {
+#line 851
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 851
 	size_t remaining = varp->xsz * nelems;
+#line 851
 	int status = NC_NOERR;
+#line 851
 	void *xp;
+#line 851
+        void *fillp;
+#line 851
 
+#line 851
 	if(nelems == 0)
+#line 851
 		return NC_NOERR;
+#line 851
 
+#line 851
 	assert(value != NULL);
+#line 851
 
+#line 851
+        fillp = malloc(varp->xsz);
+#line 851
+	status = NC3_inq_var_fill(varp, fillp);
+#line 851
+
+#line 851
 	for(;;)
+#line 851
 	{
+#line 851
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 851
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 851
 
+#line 851
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 851
 				 RGN_WRITE, &xp);
+#line 851
 		if(lstatus != NC_NOERR)
+#line 851
 			return lstatus;
+#line 851
 
-		lstatus = ncx_putn_ulonglong_schar(&xp, nput, value);
+#line 851
+		lstatus = ncx_putn_ulonglong_schar(&xp, nput, value ,fillp);
+#line 851
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 851
 		{
+#line 851
 			/* not fatal to the loop */
+#line 851
 			status = lstatus;
+#line 851
 		}
+#line 851
 
+#line 851
 		(void) ncio_rel(ncp->nciop, offset,
+#line 851
 				 RGN_MODIFIED);
+#line 851
 
+#line 851
 		remaining -= extent;
+#line 851
 		if(remaining == 0)
+#line 851
 			break; /* normal loop exit */
-		offset += extent;
+#line 851
+		offset += (off_t)extent;
+#line 851
 		value += nput;
+#line 851
 
+#line 851
 	}
+#line 851
+        free(fillp);
+#line 851
 
+#line 851
 	return status;
+#line 851
 }
+#line 851
 
 static int
+#line 852
 putNCvx_ulonglong_uchar(NC3_INFO* ncp, const NC_var *varp,
+#line 852
 		 const size_t *start, size_t nelems, const uchar *value)
+#line 852
 {
+#line 852
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 852
 	size_t remaining = varp->xsz * nelems;
+#line 852
 	int status = NC_NOERR;
+#line 852
 	void *xp;
+#line 852
+        void *fillp;
+#line 852
 
+#line 852
 	if(nelems == 0)
+#line 852
 		return NC_NOERR;
+#line 852
 
+#line 852
 	assert(value != NULL);
+#line 852
+
+#line 852
+        fillp = malloc(varp->xsz);
+#line 852
+	status = NC3_inq_var_fill(varp, fillp);
+#line 852
 
+#line 852
 	for(;;)
+#line 852
 	{
+#line 852
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 852
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 852
 
+#line 852
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 852
 				 RGN_WRITE, &xp);
+#line 852
 		if(lstatus != NC_NOERR)
+#line 852
 			return lstatus;
+#line 852
 
-		lstatus = ncx_putn_ulonglong_uchar(&xp, nput, value);
+#line 852
+		lstatus = ncx_putn_ulonglong_uchar(&xp, nput, value ,fillp);
+#line 852
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 852
 		{
+#line 852
 			/* not fatal to the loop */
+#line 852
 			status = lstatus;
+#line 852
 		}
+#line 852
 
+#line 852
 		(void) ncio_rel(ncp->nciop, offset,
+#line 852
 				 RGN_MODIFIED);
+#line 852
 
+#line 852
 		remaining -= extent;
+#line 852
 		if(remaining == 0)
+#line 852
 			break; /* normal loop exit */
-		offset += extent;
+#line 852
+		offset += (off_t)extent;
+#line 852
 		value += nput;
+#line 852
 
+#line 852
 	}
+#line 852
+        free(fillp);
+#line 852
 
+#line 852
 	return status;
+#line 852
 }
+#line 852
 
 static int
+#line 853
 putNCvx_ulonglong_short(NC3_INFO* ncp, const NC_var *varp,
+#line 853
 		 const size_t *start, size_t nelems, const short *value)
+#line 853
 {
+#line 853
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 853
 	size_t remaining = varp->xsz * nelems;
+#line 853
 	int status = NC_NOERR;
+#line 853
 	void *xp;
+#line 853
+        void *fillp;
+#line 853
 
+#line 853
 	if(nelems == 0)
+#line 853
 		return NC_NOERR;
+#line 853
 
+#line 853
 	assert(value != NULL);
+#line 853
+
+#line 853
+        fillp = malloc(varp->xsz);
+#line 853
+	status = NC3_inq_var_fill(varp, fillp);
+#line 853
 
+#line 853
 	for(;;)
+#line 853
 	{
+#line 853
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 853
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 853
 
+#line 853
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 853
 				 RGN_WRITE, &xp);
+#line 853
 		if(lstatus != NC_NOERR)
+#line 853
 			return lstatus;
+#line 853
 
-		lstatus = ncx_putn_ulonglong_short(&xp, nput, value);
+#line 853
+		lstatus = ncx_putn_ulonglong_short(&xp, nput, value ,fillp);
+#line 853
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 853
 		{
+#line 853
 			/* not fatal to the loop */
+#line 853
 			status = lstatus;
+#line 853
 		}
+#line 853
 
+#line 853
 		(void) ncio_rel(ncp->nciop, offset,
+#line 853
 				 RGN_MODIFIED);
+#line 853
 
+#line 853
 		remaining -= extent;
+#line 853
 		if(remaining == 0)
+#line 853
 			break; /* normal loop exit */
-		offset += extent;
+#line 853
+		offset += (off_t)extent;
+#line 853
 		value += nput;
+#line 853
 
+#line 853
 	}
+#line 853
+        free(fillp);
+#line 853
 
+#line 853
 	return status;
+#line 853
 }
+#line 853
 
 static int
+#line 854
 putNCvx_ulonglong_int(NC3_INFO* ncp, const NC_var *varp,
+#line 854
 		 const size_t *start, size_t nelems, const int *value)
+#line 854
 {
+#line 854
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 854
 	size_t remaining = varp->xsz * nelems;
+#line 854
 	int status = NC_NOERR;
+#line 854
 	void *xp;
+#line 854
+        void *fillp;
+#line 854
 
+#line 854
 	if(nelems == 0)
+#line 854
 		return NC_NOERR;
+#line 854
 
+#line 854
 	assert(value != NULL);
+#line 854
 
+#line 854
+        fillp = malloc(varp->xsz);
+#line 854
+	status = NC3_inq_var_fill(varp, fillp);
+#line 854
+
+#line 854
 	for(;;)
+#line 854
 	{
+#line 854
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 854
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 854
 
+#line 854
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 854
 				 RGN_WRITE, &xp);
+#line 854
 		if(lstatus != NC_NOERR)
+#line 854
 			return lstatus;
+#line 854
 
-		lstatus = ncx_putn_ulonglong_int(&xp, nput, value);
+#line 854
+		lstatus = ncx_putn_ulonglong_int(&xp, nput, value ,fillp);
+#line 854
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 854
 		{
+#line 854
 			/* not fatal to the loop */
+#line 854
 			status = lstatus;
+#line 854
 		}
+#line 854
 
+#line 854
 		(void) ncio_rel(ncp->nciop, offset,
+#line 854
 				 RGN_MODIFIED);
+#line 854
 
+#line 854
 		remaining -= extent;
+#line 854
 		if(remaining == 0)
+#line 854
 			break; /* normal loop exit */
-		offset += extent;
+#line 854
+		offset += (off_t)extent;
+#line 854
 		value += nput;
+#line 854
 
+#line 854
 	}
+#line 854
+        free(fillp);
+#line 854
 
+#line 854
 	return status;
+#line 854
 }
+#line 854
 
 static int
+#line 855
 putNCvx_ulonglong_float(NC3_INFO* ncp, const NC_var *varp,
+#line 855
 		 const size_t *start, size_t nelems, const float *value)
+#line 855
 {
+#line 855
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 855
 	size_t remaining = varp->xsz * nelems;
+#line 855
 	int status = NC_NOERR;
+#line 855
 	void *xp;
+#line 855
+        void *fillp;
+#line 855
 
+#line 855
 	if(nelems == 0)
+#line 855
 		return NC_NOERR;
+#line 855
 
+#line 855
 	assert(value != NULL);
+#line 855
+
+#line 855
+        fillp = malloc(varp->xsz);
+#line 855
+	status = NC3_inq_var_fill(varp, fillp);
+#line 855
 
+#line 855
 	for(;;)
+#line 855
 	{
+#line 855
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 855
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 855
 
+#line 855
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 855
 				 RGN_WRITE, &xp);
+#line 855
 		if(lstatus != NC_NOERR)
+#line 855
 			return lstatus;
+#line 855
 
-		lstatus = ncx_putn_ulonglong_float(&xp, nput, value);
+#line 855
+		lstatus = ncx_putn_ulonglong_float(&xp, nput, value ,fillp);
+#line 855
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 855
 		{
+#line 855
 			/* not fatal to the loop */
+#line 855
 			status = lstatus;
+#line 855
 		}
+#line 855
 
+#line 855
 		(void) ncio_rel(ncp->nciop, offset,
+#line 855
 				 RGN_MODIFIED);
+#line 855
 
+#line 855
 		remaining -= extent;
+#line 855
 		if(remaining == 0)
+#line 855
 			break; /* normal loop exit */
-		offset += extent;
+#line 855
+		offset += (off_t)extent;
+#line 855
 		value += nput;
+#line 855
 
+#line 855
 	}
+#line 855
+        free(fillp);
+#line 855
 
+#line 855
 	return status;
+#line 855
 }
+#line 855
 
 static int
+#line 856
 putNCvx_ulonglong_double(NC3_INFO* ncp, const NC_var *varp,
+#line 856
 		 const size_t *start, size_t nelems, const double *value)
+#line 856
 {
+#line 856
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 856
 	size_t remaining = varp->xsz * nelems;
+#line 856
 	int status = NC_NOERR;
+#line 856
 	void *xp;
+#line 856
+        void *fillp;
+#line 856
 
+#line 856
 	if(nelems == 0)
+#line 856
 		return NC_NOERR;
+#line 856
 
+#line 856
 	assert(value != NULL);
+#line 856
 
+#line 856
+        fillp = malloc(varp->xsz);
+#line 856
+	status = NC3_inq_var_fill(varp, fillp);
+#line 856
+
+#line 856
 	for(;;)
+#line 856
 	{
+#line 856
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 856
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 856
 
+#line 856
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 856
 				 RGN_WRITE, &xp);
+#line 856
 		if(lstatus != NC_NOERR)
+#line 856
 			return lstatus;
+#line 856
 
-		lstatus = ncx_putn_ulonglong_double(&xp, nput, value);
+#line 856
+		lstatus = ncx_putn_ulonglong_double(&xp, nput, value ,fillp);
+#line 856
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 856
 		{
+#line 856
 			/* not fatal to the loop */
+#line 856
 			status = lstatus;
+#line 856
 		}
+#line 856
 
+#line 856
 		(void) ncio_rel(ncp->nciop, offset,
+#line 856
 				 RGN_MODIFIED);
+#line 856
 
+#line 856
 		remaining -= extent;
+#line 856
 		if(remaining == 0)
+#line 856
 			break; /* normal loop exit */
-		offset += extent;
+#line 856
+		offset += (off_t)extent;
+#line 856
 		value += nput;
+#line 856
 
+#line 856
 	}
+#line 856
+        free(fillp);
+#line 856
 
+#line 856
 	return status;
+#line 856
 }
+#line 856
 
 static int
+#line 857
 putNCvx_ulonglong_longlong(NC3_INFO* ncp, const NC_var *varp,
+#line 857
 		 const size_t *start, size_t nelems, const longlong *value)
+#line 857
 {
+#line 857
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 857
 	size_t remaining = varp->xsz * nelems;
+#line 857
 	int status = NC_NOERR;
+#line 857
 	void *xp;
+#line 857
+        void *fillp;
+#line 857
 
+#line 857
 	if(nelems == 0)
+#line 857
 		return NC_NOERR;
+#line 857
 
+#line 857
 	assert(value != NULL);
+#line 857
+
+#line 857
+        fillp = malloc(varp->xsz);
+#line 857
+	status = NC3_inq_var_fill(varp, fillp);
+#line 857
 
+#line 857
 	for(;;)
+#line 857
 	{
+#line 857
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 857
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 857
 
+#line 857
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 857
 				 RGN_WRITE, &xp);
+#line 857
 		if(lstatus != NC_NOERR)
+#line 857
 			return lstatus;
+#line 857
 
-		lstatus = ncx_putn_ulonglong_longlong(&xp, nput, value);
+#line 857
+		lstatus = ncx_putn_ulonglong_longlong(&xp, nput, value ,fillp);
+#line 857
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 857
 		{
+#line 857
 			/* not fatal to the loop */
+#line 857
 			status = lstatus;
+#line 857
 		}
+#line 857
 
+#line 857
 		(void) ncio_rel(ncp->nciop, offset,
+#line 857
 				 RGN_MODIFIED);
+#line 857
 
+#line 857
 		remaining -= extent;
+#line 857
 		if(remaining == 0)
+#line 857
 			break; /* normal loop exit */
-		offset += extent;
+#line 857
+		offset += (off_t)extent;
+#line 857
 		value += nput;
+#line 857
 
+#line 857
 	}
+#line 857
+        free(fillp);
+#line 857
 
+#line 857
 	return status;
+#line 857
 }
+#line 857
 
 static int
+#line 858
 putNCvx_ulonglong_ushort(NC3_INFO* ncp, const NC_var *varp,
+#line 858
 		 const size_t *start, size_t nelems, const ushort *value)
+#line 858
 {
+#line 858
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 858
 	size_t remaining = varp->xsz * nelems;
+#line 858
 	int status = NC_NOERR;
+#line 858
 	void *xp;
+#line 858
+        void *fillp;
+#line 858
 
+#line 858
 	if(nelems == 0)
+#line 858
 		return NC_NOERR;
+#line 858
 
+#line 858
 	assert(value != NULL);
+#line 858
 
+#line 858
+        fillp = malloc(varp->xsz);
+#line 858
+	status = NC3_inq_var_fill(varp, fillp);
+#line 858
+
+#line 858
 	for(;;)
+#line 858
 	{
+#line 858
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 858
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 858
 
+#line 858
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 858
 				 RGN_WRITE, &xp);
+#line 858
 		if(lstatus != NC_NOERR)
+#line 858
 			return lstatus;
+#line 858
 
-		lstatus = ncx_putn_ulonglong_ushort(&xp, nput, value);
+#line 858
+		lstatus = ncx_putn_ulonglong_ushort(&xp, nput, value ,fillp);
+#line 858
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 858
 		{
+#line 858
 			/* not fatal to the loop */
+#line 858
 			status = lstatus;
+#line 858
 		}
+#line 858
 
+#line 858
 		(void) ncio_rel(ncp->nciop, offset,
+#line 858
 				 RGN_MODIFIED);
+#line 858
 
+#line 858
 		remaining -= extent;
+#line 858
 		if(remaining == 0)
+#line 858
 			break; /* normal loop exit */
-		offset += extent;
+#line 858
+		offset += (off_t)extent;
+#line 858
 		value += nput;
+#line 858
 
+#line 858
 	}
+#line 858
+        free(fillp);
+#line 858
 
+#line 858
 	return status;
+#line 858
 }
+#line 858
 
 static int
+#line 859
 putNCvx_ulonglong_uint(NC3_INFO* ncp, const NC_var *varp,
+#line 859
 		 const size_t *start, size_t nelems, const uint *value)
+#line 859
 {
+#line 859
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 859
 	size_t remaining = varp->xsz * nelems;
+#line 859
 	int status = NC_NOERR;
+#line 859
 	void *xp;
+#line 859
+        void *fillp;
+#line 859
 
+#line 859
 	if(nelems == 0)
+#line 859
 		return NC_NOERR;
+#line 859
 
+#line 859
 	assert(value != NULL);
+#line 859
+
+#line 859
+        fillp = malloc(varp->xsz);
+#line 859
+	status = NC3_inq_var_fill(varp, fillp);
+#line 859
 
+#line 859
 	for(;;)
+#line 859
 	{
+#line 859
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 859
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 859
 
+#line 859
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 859
 				 RGN_WRITE, &xp);
+#line 859
 		if(lstatus != NC_NOERR)
+#line 859
 			return lstatus;
+#line 859
 
-		lstatus = ncx_putn_ulonglong_uint(&xp, nput, value);
+#line 859
+		lstatus = ncx_putn_ulonglong_uint(&xp, nput, value ,fillp);
+#line 859
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 859
 		{
+#line 859
 			/* not fatal to the loop */
+#line 859
 			status = lstatus;
+#line 859
 		}
+#line 859
 
+#line 859
 		(void) ncio_rel(ncp->nciop, offset,
+#line 859
 				 RGN_MODIFIED);
+#line 859
 
+#line 859
 		remaining -= extent;
+#line 859
 		if(remaining == 0)
+#line 859
 			break; /* normal loop exit */
-		offset += extent;
+#line 859
+		offset += (off_t)extent;
+#line 859
 		value += nput;
+#line 859
 
+#line 859
 	}
+#line 859
+        free(fillp);
+#line 859
 
+#line 859
 	return status;
+#line 859
 }
+#line 859
 
 static int
+#line 860
 putNCvx_ulonglong_ulonglong(NC3_INFO* ncp, const NC_var *varp,
+#line 860
 		 const size_t *start, size_t nelems, const ulonglong *value)
+#line 860
 {
+#line 860
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 860
 	size_t remaining = varp->xsz * nelems;
+#line 860
 	int status = NC_NOERR;
+#line 860
 	void *xp;
+#line 860
+        void *fillp;
+#line 860
 
+#line 860
 	if(nelems == 0)
+#line 860
 		return NC_NOERR;
+#line 860
 
+#line 860
 	assert(value != NULL);
+#line 860
+
+#line 860
+        fillp = malloc(varp->xsz);
+#line 860
+	status = NC3_inq_var_fill(varp, fillp);
+#line 860
 
+#line 860
 	for(;;)
+#line 860
 	{
+#line 860
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 860
 		size_t nput = ncx_howmany(varp->type, extent);
+#line 860
 
+#line 860
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 860
 				 RGN_WRITE, &xp);
+#line 860
 		if(lstatus != NC_NOERR)
+#line 860
 			return lstatus;
+#line 860
 
-		lstatus = ncx_putn_ulonglong_ulonglong(&xp, nput, value);
+#line 860
+		lstatus = ncx_putn_ulonglong_ulonglong(&xp, nput, value ,fillp);
+#line 860
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 860
 		{
+#line 860
 			/* not fatal to the loop */
+#line 860
 			status = lstatus;
+#line 860
 		}
+#line 860
 
+#line 860
 		(void) ncio_rel(ncp->nciop, offset,
+#line 860
 				 RGN_MODIFIED);
+#line 860
 
+#line 860
 		remaining -= extent;
+#line 860
 		if(remaining == 0)
+#line 860
 			break; /* normal loop exit */
-		offset += extent;
+#line 860
+		offset += (off_t)extent;
+#line 860
 		value += nput;
+#line 860
 
+#line 860
 	}
+#line 860
+        free(fillp);
+#line 860
 
+#line 860
 	return status;
+#line 860
 }
+#line 860
 
 
+#line 907
 
 static int
+#line 908
 getNCvx_char_char(const NC3_INFO* ncp, const NC_var *varp,
+#line 908
 		 const size_t *start, size_t nelems, char *value)
+#line 908
 {
+#line 908
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 908
 	size_t remaining = varp->xsz * nelems;
+#line 908
 	int status = NC_NOERR;
+#line 908
 	const void *xp;
+#line 908
 
+#line 908
 	if(nelems == 0)
+#line 908
 		return NC_NOERR;
+#line 908
 
+#line 908
 	assert(value != NULL);
+#line 908
 
+#line 908
 	for(;;)
+#line 908
 	{
+#line 908
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 908
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 908
 
+#line 908
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 908
 				 0, (void **)&xp);	/* cast away const */
+#line 908
 		if(lstatus != NC_NOERR)
+#line 908
 			return lstatus;
+#line 908
 
+#line 908
 		lstatus = ncx_getn_char_char(&xp, nget, value);
+#line 908
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 908
 			status = lstatus;
+#line 908
 
+#line 908
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 908
 
+#line 908
 		remaining -= extent;
+#line 908
 		if(remaining == 0)
+#line 908
 			break; /* normal loop exit */
-		offset += extent;
+#line 908
+		offset += (off_t)extent;
+#line 908
 		value += nget;
+#line 908
 	}
+#line 908
 
+#line 908
 	return status;
+#line 908
 }
+#line 908
 
 
 static int
+#line 910
 getNCvx_schar_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 910
 		 const size_t *start, size_t nelems, schar *value)
+#line 910
 {
+#line 910
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 910
 	size_t remaining = varp->xsz * nelems;
+#line 910
 	int status = NC_NOERR;
+#line 910
 	const void *xp;
+#line 910
 
+#line 910
 	if(nelems == 0)
+#line 910
 		return NC_NOERR;
+#line 910
 
+#line 910
 	assert(value != NULL);
+#line 910
 
+#line 910
 	for(;;)
+#line 910
 	{
+#line 910
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 910
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 910
 
+#line 910
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 910
 				 0, (void **)&xp);	/* cast away const */
+#line 910
 		if(lstatus != NC_NOERR)
+#line 910
 			return lstatus;
+#line 910
 
+#line 910
 		lstatus = ncx_getn_schar_schar(&xp, nget, value);
+#line 910
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 910
 			status = lstatus;
+#line 910
 
+#line 910
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 910
 
+#line 910
 		remaining -= extent;
+#line 910
 		if(remaining == 0)
+#line 910
 			break; /* normal loop exit */
-		offset += extent;
+#line 910
+		offset += (off_t)extent;
+#line 910
 		value += nget;
+#line 910
 	}
+#line 910
 
+#line 910
 	return status;
+#line 910
 }
+#line 910
 
 static int
+#line 911
 getNCvx_schar_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 911
 		 const size_t *start, size_t nelems, short *value)
+#line 911
 {
+#line 911
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 911
 	size_t remaining = varp->xsz * nelems;
+#line 911
 	int status = NC_NOERR;
+#line 911
 	const void *xp;
+#line 911
 
+#line 911
 	if(nelems == 0)
+#line 911
 		return NC_NOERR;
+#line 911
 
+#line 911
 	assert(value != NULL);
+#line 911
 
+#line 911
 	for(;;)
+#line 911
 	{
+#line 911
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 911
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 911
 
+#line 911
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 911
 				 0, (void **)&xp);	/* cast away const */
+#line 911
 		if(lstatus != NC_NOERR)
+#line 911
 			return lstatus;
+#line 911
 
+#line 911
 		lstatus = ncx_getn_schar_short(&xp, nget, value);
+#line 911
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 911
 			status = lstatus;
+#line 911
 
+#line 911
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 911
 
+#line 911
 		remaining -= extent;
+#line 911
 		if(remaining == 0)
+#line 911
 			break; /* normal loop exit */
-		offset += extent;
+#line 911
+		offset += (off_t)extent;
+#line 911
 		value += nget;
+#line 911
 	}
+#line 911
 
+#line 911
 	return status;
+#line 911
 }
+#line 911
 
 static int
+#line 912
 getNCvx_schar_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 912
 		 const size_t *start, size_t nelems, int *value)
+#line 912
 {
+#line 912
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 912
 	size_t remaining = varp->xsz * nelems;
+#line 912
 	int status = NC_NOERR;
+#line 912
 	const void *xp;
+#line 912
 
+#line 912
 	if(nelems == 0)
+#line 912
 		return NC_NOERR;
+#line 912
 
+#line 912
 	assert(value != NULL);
+#line 912
 
+#line 912
 	for(;;)
+#line 912
 	{
+#line 912
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 912
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 912
 
+#line 912
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 912
 				 0, (void **)&xp);	/* cast away const */
+#line 912
 		if(lstatus != NC_NOERR)
+#line 912
 			return lstatus;
+#line 912
 
+#line 912
 		lstatus = ncx_getn_schar_int(&xp, nget, value);
+#line 912
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 912
 			status = lstatus;
+#line 912
 
+#line 912
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 912
 
+#line 912
 		remaining -= extent;
+#line 912
 		if(remaining == 0)
+#line 912
 			break; /* normal loop exit */
-		offset += extent;
+#line 912
+		offset += (off_t)extent;
+#line 912
 		value += nget;
+#line 912
 	}
+#line 912
 
+#line 912
 	return status;
+#line 912
 }
+#line 912
 
 static int
+#line 913
 getNCvx_schar_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 913
 		 const size_t *start, size_t nelems, float *value)
+#line 913
 {
+#line 913
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 913
 	size_t remaining = varp->xsz * nelems;
+#line 913
 	int status = NC_NOERR;
+#line 913
 	const void *xp;
+#line 913
 
+#line 913
 	if(nelems == 0)
+#line 913
 		return NC_NOERR;
+#line 913
 
+#line 913
 	assert(value != NULL);
+#line 913
 
+#line 913
 	for(;;)
+#line 913
 	{
+#line 913
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 913
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 913
 
+#line 913
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 913
 				 0, (void **)&xp);	/* cast away const */
+#line 913
 		if(lstatus != NC_NOERR)
+#line 913
 			return lstatus;
+#line 913
 
+#line 913
 		lstatus = ncx_getn_schar_float(&xp, nget, value);
+#line 913
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 913
 			status = lstatus;
+#line 913
 
+#line 913
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 913
 
+#line 913
 		remaining -= extent;
+#line 913
 		if(remaining == 0)
+#line 913
 			break; /* normal loop exit */
-		offset += extent;
+#line 913
+		offset += (off_t)extent;
+#line 913
 		value += nget;
+#line 913
 	}
+#line 913
 
+#line 913
 	return status;
+#line 913
 }
+#line 913
 
 static int
+#line 914
 getNCvx_schar_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 914
 		 const size_t *start, size_t nelems, double *value)
+#line 914
 {
+#line 914
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 914
 	size_t remaining = varp->xsz * nelems;
+#line 914
 	int status = NC_NOERR;
+#line 914
 	const void *xp;
+#line 914
 
+#line 914
 	if(nelems == 0)
+#line 914
 		return NC_NOERR;
+#line 914
 
+#line 914
 	assert(value != NULL);
+#line 914
 
+#line 914
 	for(;;)
+#line 914
 	{
+#line 914
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 914
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 914
 
+#line 914
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 914
 				 0, (void **)&xp);	/* cast away const */
+#line 914
 		if(lstatus != NC_NOERR)
+#line 914
 			return lstatus;
+#line 914
 
+#line 914
 		lstatus = ncx_getn_schar_double(&xp, nget, value);
+#line 914
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 914
 			status = lstatus;
+#line 914
 
+#line 914
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 914
 
+#line 914
 		remaining -= extent;
+#line 914
 		if(remaining == 0)
+#line 914
 			break; /* normal loop exit */
-		offset += extent;
+#line 914
+		offset += (off_t)extent;
+#line 914
 		value += nget;
+#line 914
 	}
+#line 914
 
+#line 914
 	return status;
+#line 914
 }
+#line 914
 
 static int
+#line 915
 getNCvx_schar_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 915
 		 const size_t *start, size_t nelems, longlong *value)
+#line 915
 {
+#line 915
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 915
 	size_t remaining = varp->xsz * nelems;
+#line 915
 	int status = NC_NOERR;
+#line 915
 	const void *xp;
+#line 915
 
+#line 915
 	if(nelems == 0)
+#line 915
 		return NC_NOERR;
+#line 915
 
+#line 915
 	assert(value != NULL);
+#line 915
 
+#line 915
 	for(;;)
+#line 915
 	{
+#line 915
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 915
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 915
 
+#line 915
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 915
 				 0, (void **)&xp);	/* cast away const */
+#line 915
 		if(lstatus != NC_NOERR)
+#line 915
 			return lstatus;
+#line 915
 
+#line 915
 		lstatus = ncx_getn_schar_longlong(&xp, nget, value);
+#line 915
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 915
 			status = lstatus;
+#line 915
 
+#line 915
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 915
 
+#line 915
 		remaining -= extent;
+#line 915
 		if(remaining == 0)
+#line 915
 			break; /* normal loop exit */
-		offset += extent;
+#line 915
+		offset += (off_t)extent;
+#line 915
 		value += nget;
+#line 915
 	}
+#line 915
 
+#line 915
 	return status;
+#line 915
 }
+#line 915
 
 static int
+#line 916
 getNCvx_schar_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 916
 		 const size_t *start, size_t nelems, uint *value)
+#line 916
 {
+#line 916
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 916
 	size_t remaining = varp->xsz * nelems;
+#line 916
 	int status = NC_NOERR;
+#line 916
 	const void *xp;
+#line 916
 
+#line 916
 	if(nelems == 0)
+#line 916
 		return NC_NOERR;
+#line 916
 
+#line 916
 	assert(value != NULL);
+#line 916
 
+#line 916
 	for(;;)
+#line 916
 	{
+#line 916
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 916
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 916
 
+#line 916
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 916
 				 0, (void **)&xp);	/* cast away const */
+#line 916
 		if(lstatus != NC_NOERR)
+#line 916
 			return lstatus;
+#line 916
 
+#line 916
 		lstatus = ncx_getn_schar_uint(&xp, nget, value);
+#line 916
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 916
 			status = lstatus;
+#line 916
 
+#line 916
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 916
 
+#line 916
 		remaining -= extent;
+#line 916
 		if(remaining == 0)
+#line 916
 			break; /* normal loop exit */
-		offset += extent;
+#line 916
+		offset += (off_t)extent;
+#line 916
 		value += nget;
+#line 916
 	}
+#line 916
 
+#line 916
 	return status;
+#line 916
 }
+#line 916
 
 static int
+#line 917
 getNCvx_schar_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 917
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 917
 {
+#line 917
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 917
 	size_t remaining = varp->xsz * nelems;
+#line 917
 	int status = NC_NOERR;
+#line 917
 	const void *xp;
+#line 917
 
+#line 917
 	if(nelems == 0)
+#line 917
 		return NC_NOERR;
+#line 917
 
+#line 917
 	assert(value != NULL);
+#line 917
 
+#line 917
 	for(;;)
+#line 917
 	{
+#line 917
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 917
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 917
 
+#line 917
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 917
 				 0, (void **)&xp);	/* cast away const */
+#line 917
 		if(lstatus != NC_NOERR)
+#line 917
 			return lstatus;
+#line 917
 
+#line 917
 		lstatus = ncx_getn_schar_ulonglong(&xp, nget, value);
+#line 917
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 917
 			status = lstatus;
+#line 917
 
+#line 917
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 917
 
+#line 917
 		remaining -= extent;
+#line 917
 		if(remaining == 0)
+#line 917
 			break; /* normal loop exit */
-		offset += extent;
+#line 917
+		offset += (off_t)extent;
+#line 917
 		value += nget;
+#line 917
 	}
+#line 917
 
+#line 917
 	return status;
+#line 917
 }
+#line 917
 
 static int
+#line 918
 getNCvx_schar_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 918
 		 const size_t *start, size_t nelems, uchar *value)
+#line 918
 {
+#line 918
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 918
 	size_t remaining = varp->xsz * nelems;
+#line 918
 	int status = NC_NOERR;
+#line 918
 	const void *xp;
+#line 918
 
+#line 918
 	if(nelems == 0)
+#line 918
 		return NC_NOERR;
+#line 918
 
+#line 918
 	assert(value != NULL);
+#line 918
 
+#line 918
 	for(;;)
+#line 918
 	{
+#line 918
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 918
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 918
 
+#line 918
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 918
 				 0, (void **)&xp);	/* cast away const */
+#line 918
 		if(lstatus != NC_NOERR)
+#line 918
 			return lstatus;
+#line 918
 
+#line 918
 		lstatus = ncx_getn_schar_uchar(&xp, nget, value);
+#line 918
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 918
 			status = lstatus;
+#line 918
 
+#line 918
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 918
 
+#line 918
 		remaining -= extent;
+#line 918
 		if(remaining == 0)
+#line 918
 			break; /* normal loop exit */
-		offset += extent;
+#line 918
+		offset += (off_t)extent;
+#line 918
 		value += nget;
+#line 918
 	}
+#line 918
 
+#line 918
 	return status;
+#line 918
 }
+#line 918
 
 static int
+#line 919
 getNCvx_schar_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 919
 		 const size_t *start, size_t nelems, ushort *value)
+#line 919
 {
+#line 919
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 919
 	size_t remaining = varp->xsz * nelems;
+#line 919
 	int status = NC_NOERR;
+#line 919
 	const void *xp;
+#line 919
 
+#line 919
 	if(nelems == 0)
+#line 919
 		return NC_NOERR;
+#line 919
 
+#line 919
 	assert(value != NULL);
+#line 919
 
+#line 919
 	for(;;)
+#line 919
 	{
+#line 919
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 919
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 919
 
+#line 919
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 919
 				 0, (void **)&xp);	/* cast away const */
+#line 919
 		if(lstatus != NC_NOERR)
+#line 919
 			return lstatus;
+#line 919
 
+#line 919
 		lstatus = ncx_getn_schar_ushort(&xp, nget, value);
+#line 919
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 919
 			status = lstatus;
+#line 919
 
+#line 919
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 919
 
+#line 919
 		remaining -= extent;
+#line 919
 		if(remaining == 0)
+#line 919
 			break; /* normal loop exit */
-		offset += extent;
+#line 919
+		offset += (off_t)extent;
+#line 919
 		value += nget;
+#line 919
 	}
+#line 919
 
+#line 919
 	return status;
+#line 919
 }
+#line 919
 
 
 static int
+#line 921
 getNCvx_short_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 921
 		 const size_t *start, size_t nelems, schar *value)
+#line 921
 {
+#line 921
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 921
 	size_t remaining = varp->xsz * nelems;
+#line 921
 	int status = NC_NOERR;
+#line 921
 	const void *xp;
+#line 921
 
+#line 921
 	if(nelems == 0)
+#line 921
 		return NC_NOERR;
+#line 921
 
+#line 921
 	assert(value != NULL);
+#line 921
 
+#line 921
 	for(;;)
+#line 921
 	{
+#line 921
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 921
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 921
 
+#line 921
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 921
 				 0, (void **)&xp);	/* cast away const */
+#line 921
 		if(lstatus != NC_NOERR)
+#line 921
 			return lstatus;
+#line 921
 
+#line 921
 		lstatus = ncx_getn_short_schar(&xp, nget, value);
+#line 921
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 921
 			status = lstatus;
+#line 921
 
+#line 921
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 921
 
+#line 921
 		remaining -= extent;
+#line 921
 		if(remaining == 0)
+#line 921
 			break; /* normal loop exit */
-		offset += extent;
+#line 921
+		offset += (off_t)extent;
+#line 921
 		value += nget;
+#line 921
 	}
+#line 921
 
+#line 921
 	return status;
+#line 921
 }
+#line 921
 
 static int
+#line 922
 getNCvx_short_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 922
 		 const size_t *start, size_t nelems, uchar *value)
+#line 922
 {
+#line 922
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 922
 	size_t remaining = varp->xsz * nelems;
+#line 922
 	int status = NC_NOERR;
+#line 922
 	const void *xp;
+#line 922
 
+#line 922
 	if(nelems == 0)
+#line 922
 		return NC_NOERR;
+#line 922
 
+#line 922
 	assert(value != NULL);
+#line 922
 
+#line 922
 	for(;;)
+#line 922
 	{
+#line 922
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 922
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 922
 
+#line 922
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 922
 				 0, (void **)&xp);	/* cast away const */
+#line 922
 		if(lstatus != NC_NOERR)
+#line 922
 			return lstatus;
+#line 922
 
+#line 922
 		lstatus = ncx_getn_short_uchar(&xp, nget, value);
+#line 922
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 922
 			status = lstatus;
+#line 922
 
+#line 922
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 922
 
+#line 922
 		remaining -= extent;
+#line 922
 		if(remaining == 0)
+#line 922
 			break; /* normal loop exit */
-		offset += extent;
+#line 922
+		offset += (off_t)extent;
+#line 922
 		value += nget;
+#line 922
 	}
+#line 922
 
+#line 922
 	return status;
+#line 922
 }
+#line 922
 
 static int
+#line 923
 getNCvx_short_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 923
 		 const size_t *start, size_t nelems, short *value)
+#line 923
 {
+#line 923
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 923
 	size_t remaining = varp->xsz * nelems;
+#line 923
 	int status = NC_NOERR;
+#line 923
 	const void *xp;
+#line 923
 
+#line 923
 	if(nelems == 0)
+#line 923
 		return NC_NOERR;
+#line 923
 
+#line 923
 	assert(value != NULL);
+#line 923
 
+#line 923
 	for(;;)
+#line 923
 	{
+#line 923
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 923
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 923
 
+#line 923
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 923
 				 0, (void **)&xp);	/* cast away const */
+#line 923
 		if(lstatus != NC_NOERR)
+#line 923
 			return lstatus;
+#line 923
 
+#line 923
 		lstatus = ncx_getn_short_short(&xp, nget, value);
+#line 923
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 923
 			status = lstatus;
+#line 923
 
+#line 923
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 923
 
+#line 923
 		remaining -= extent;
+#line 923
 		if(remaining == 0)
+#line 923
 			break; /* normal loop exit */
-		offset += extent;
+#line 923
+		offset += (off_t)extent;
+#line 923
 		value += nget;
+#line 923
 	}
+#line 923
 
+#line 923
 	return status;
+#line 923
 }
+#line 923
 
 static int
+#line 924
 getNCvx_short_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 924
 		 const size_t *start, size_t nelems, int *value)
+#line 924
 {
+#line 924
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 924
 	size_t remaining = varp->xsz * nelems;
+#line 924
 	int status = NC_NOERR;
+#line 924
 	const void *xp;
+#line 924
 
+#line 924
 	if(nelems == 0)
+#line 924
 		return NC_NOERR;
+#line 924
 
+#line 924
 	assert(value != NULL);
+#line 924
 
+#line 924
 	for(;;)
+#line 924
 	{
+#line 924
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 924
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 924
 
+#line 924
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 924
 				 0, (void **)&xp);	/* cast away const */
+#line 924
 		if(lstatus != NC_NOERR)
+#line 924
 			return lstatus;
+#line 924
 
+#line 924
 		lstatus = ncx_getn_short_int(&xp, nget, value);
+#line 924
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 924
 			status = lstatus;
+#line 924
 
+#line 924
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 924
 
+#line 924
 		remaining -= extent;
+#line 924
 		if(remaining == 0)
+#line 924
 			break; /* normal loop exit */
-		offset += extent;
+#line 924
+		offset += (off_t)extent;
+#line 924
 		value += nget;
+#line 924
 	}
+#line 924
 
+#line 924
 	return status;
+#line 924
 }
+#line 924
 
 static int
+#line 925
 getNCvx_short_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 925
 		 const size_t *start, size_t nelems, float *value)
+#line 925
 {
+#line 925
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 925
 	size_t remaining = varp->xsz * nelems;
+#line 925
 	int status = NC_NOERR;
+#line 925
 	const void *xp;
+#line 925
 
+#line 925
 	if(nelems == 0)
+#line 925
 		return NC_NOERR;
+#line 925
 
+#line 925
 	assert(value != NULL);
+#line 925
 
+#line 925
 	for(;;)
+#line 925
 	{
+#line 925
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 925
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 925
 
+#line 925
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 925
 				 0, (void **)&xp);	/* cast away const */
+#line 925
 		if(lstatus != NC_NOERR)
+#line 925
 			return lstatus;
+#line 925
 
+#line 925
 		lstatus = ncx_getn_short_float(&xp, nget, value);
+#line 925
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 925
 			status = lstatus;
+#line 925
 
+#line 925
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 925
 
+#line 925
 		remaining -= extent;
+#line 925
 		if(remaining == 0)
+#line 925
 			break; /* normal loop exit */
-		offset += extent;
+#line 925
+		offset += (off_t)extent;
+#line 925
 		value += nget;
+#line 925
 	}
+#line 925
 
+#line 925
 	return status;
+#line 925
 }
+#line 925
 
 static int
+#line 926
 getNCvx_short_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 926
 		 const size_t *start, size_t nelems, double *value)
+#line 926
 {
+#line 926
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 926
 	size_t remaining = varp->xsz * nelems;
+#line 926
 	int status = NC_NOERR;
+#line 926
 	const void *xp;
+#line 926
 
+#line 926
 	if(nelems == 0)
+#line 926
 		return NC_NOERR;
+#line 926
 
+#line 926
 	assert(value != NULL);
+#line 926
 
+#line 926
 	for(;;)
+#line 926
 	{
+#line 926
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 926
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 926
 
+#line 926
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 926
 				 0, (void **)&xp);	/* cast away const */
+#line 926
 		if(lstatus != NC_NOERR)
+#line 926
 			return lstatus;
+#line 926
 
+#line 926
 		lstatus = ncx_getn_short_double(&xp, nget, value);
+#line 926
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 926
 			status = lstatus;
+#line 926
 
+#line 926
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 926
 
+#line 926
 		remaining -= extent;
+#line 926
 		if(remaining == 0)
+#line 926
 			break; /* normal loop exit */
-		offset += extent;
+#line 926
+		offset += (off_t)extent;
+#line 926
 		value += nget;
+#line 926
 	}
+#line 926
 
+#line 926
 	return status;
+#line 926
 }
+#line 926
 
 static int
+#line 927
 getNCvx_short_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 927
 		 const size_t *start, size_t nelems, longlong *value)
+#line 927
 {
+#line 927
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 927
 	size_t remaining = varp->xsz * nelems;
+#line 927
 	int status = NC_NOERR;
+#line 927
 	const void *xp;
+#line 927
 
+#line 927
 	if(nelems == 0)
+#line 927
 		return NC_NOERR;
+#line 927
 
+#line 927
 	assert(value != NULL);
+#line 927
 
+#line 927
 	for(;;)
+#line 927
 	{
+#line 927
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 927
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 927
 
+#line 927
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 927
 				 0, (void **)&xp);	/* cast away const */
+#line 927
 		if(lstatus != NC_NOERR)
+#line 927
 			return lstatus;
+#line 927
 
+#line 927
 		lstatus = ncx_getn_short_longlong(&xp, nget, value);
+#line 927
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 927
 			status = lstatus;
+#line 927
 
+#line 927
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 927
 
+#line 927
 		remaining -= extent;
+#line 927
 		if(remaining == 0)
+#line 927
 			break; /* normal loop exit */
-		offset += extent;
+#line 927
+		offset += (off_t)extent;
+#line 927
 		value += nget;
+#line 927
 	}
+#line 927
 
+#line 927
 	return status;
+#line 927
 }
+#line 927
 
 static int
+#line 928
 getNCvx_short_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 928
 		 const size_t *start, size_t nelems, uint *value)
+#line 928
 {
+#line 928
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 928
 	size_t remaining = varp->xsz * nelems;
+#line 928
 	int status = NC_NOERR;
+#line 928
 	const void *xp;
+#line 928
 
+#line 928
 	if(nelems == 0)
+#line 928
 		return NC_NOERR;
+#line 928
 
+#line 928
 	assert(value != NULL);
+#line 928
 
+#line 928
 	for(;;)
+#line 928
 	{
+#line 928
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 928
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 928
 
+#line 928
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 928
 				 0, (void **)&xp);	/* cast away const */
+#line 928
 		if(lstatus != NC_NOERR)
+#line 928
 			return lstatus;
+#line 928
 
+#line 928
 		lstatus = ncx_getn_short_uint(&xp, nget, value);
+#line 928
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 928
 			status = lstatus;
+#line 928
 
+#line 928
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 928
 
+#line 928
 		remaining -= extent;
+#line 928
 		if(remaining == 0)
+#line 928
 			break; /* normal loop exit */
-		offset += extent;
+#line 928
+		offset += (off_t)extent;
+#line 928
 		value += nget;
+#line 928
 	}
+#line 928
 
+#line 928
 	return status;
+#line 928
 }
+#line 928
 
 static int
+#line 929
 getNCvx_short_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 929
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 929
 {
+#line 929
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 929
 	size_t remaining = varp->xsz * nelems;
+#line 929
 	int status = NC_NOERR;
+#line 929
 	const void *xp;
+#line 929
 
+#line 929
 	if(nelems == 0)
+#line 929
 		return NC_NOERR;
+#line 929
 
+#line 929
 	assert(value != NULL);
+#line 929
 
+#line 929
 	for(;;)
+#line 929
 	{
+#line 929
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 929
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 929
 
+#line 929
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 929
 				 0, (void **)&xp);	/* cast away const */
+#line 929
 		if(lstatus != NC_NOERR)
+#line 929
 			return lstatus;
+#line 929
 
+#line 929
 		lstatus = ncx_getn_short_ulonglong(&xp, nget, value);
+#line 929
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 929
 			status = lstatus;
+#line 929
 
+#line 929
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 929
 
+#line 929
 		remaining -= extent;
+#line 929
 		if(remaining == 0)
+#line 929
 			break; /* normal loop exit */
-		offset += extent;
+#line 929
+		offset += (off_t)extent;
+#line 929
 		value += nget;
+#line 929
 	}
+#line 929
 
+#line 929
 	return status;
+#line 929
 }
+#line 929
 
 static int
+#line 930
 getNCvx_short_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 930
 		 const size_t *start, size_t nelems, ushort *value)
+#line 930
 {
+#line 930
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 930
 	size_t remaining = varp->xsz * nelems;
+#line 930
 	int status = NC_NOERR;
+#line 930
 	const void *xp;
+#line 930
 
+#line 930
 	if(nelems == 0)
+#line 930
 		return NC_NOERR;
+#line 930
 
+#line 930
 	assert(value != NULL);
+#line 930
 
+#line 930
 	for(;;)
+#line 930
 	{
+#line 930
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 930
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 930
 
+#line 930
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 930
 				 0, (void **)&xp);	/* cast away const */
+#line 930
 		if(lstatus != NC_NOERR)
+#line 930
 			return lstatus;
+#line 930
 
+#line 930
 		lstatus = ncx_getn_short_ushort(&xp, nget, value);
+#line 930
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 930
 			status = lstatus;
+#line 930
 
+#line 930
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 930
 
+#line 930
 		remaining -= extent;
+#line 930
 		if(remaining == 0)
+#line 930
 			break; /* normal loop exit */
-		offset += extent;
+#line 930
+		offset += (off_t)extent;
+#line 930
 		value += nget;
+#line 930
 	}
+#line 930
 
+#line 930
 	return status;
+#line 930
 }
+#line 930
 
 
 static int
+#line 932
 getNCvx_int_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 932
 		 const size_t *start, size_t nelems, schar *value)
+#line 932
 {
+#line 932
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 932
 	size_t remaining = varp->xsz * nelems;
+#line 932
 	int status = NC_NOERR;
+#line 932
 	const void *xp;
+#line 932
 
+#line 932
 	if(nelems == 0)
+#line 932
 		return NC_NOERR;
+#line 932
 
+#line 932
 	assert(value != NULL);
+#line 932
 
+#line 932
 	for(;;)
+#line 932
 	{
+#line 932
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 932
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 932
 
+#line 932
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 932
 				 0, (void **)&xp);	/* cast away const */
+#line 932
 		if(lstatus != NC_NOERR)
+#line 932
 			return lstatus;
+#line 932
 
+#line 932
 		lstatus = ncx_getn_int_schar(&xp, nget, value);
+#line 932
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 932
 			status = lstatus;
+#line 932
 
+#line 932
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 932
 
+#line 932
 		remaining -= extent;
+#line 932
 		if(remaining == 0)
+#line 932
 			break; /* normal loop exit */
-		offset += extent;
+#line 932
+		offset += (off_t)extent;
+#line 932
 		value += nget;
+#line 932
 	}
+#line 932
 
+#line 932
 	return status;
+#line 932
 }
+#line 932
 
 static int
+#line 933
 getNCvx_int_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 933
 		 const size_t *start, size_t nelems, uchar *value)
+#line 933
 {
+#line 933
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 933
 	size_t remaining = varp->xsz * nelems;
+#line 933
 	int status = NC_NOERR;
+#line 933
 	const void *xp;
+#line 933
 
+#line 933
 	if(nelems == 0)
+#line 933
 		return NC_NOERR;
+#line 933
 
+#line 933
 	assert(value != NULL);
+#line 933
 
+#line 933
 	for(;;)
+#line 933
 	{
+#line 933
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 933
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 933
 
+#line 933
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 933
 				 0, (void **)&xp);	/* cast away const */
+#line 933
 		if(lstatus != NC_NOERR)
+#line 933
 			return lstatus;
+#line 933
 
+#line 933
 		lstatus = ncx_getn_int_uchar(&xp, nget, value);
+#line 933
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 933
 			status = lstatus;
+#line 933
 
+#line 933
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 933
 
+#line 933
 		remaining -= extent;
+#line 933
 		if(remaining == 0)
+#line 933
 			break; /* normal loop exit */
-		offset += extent;
+#line 933
+		offset += (off_t)extent;
+#line 933
 		value += nget;
+#line 933
 	}
+#line 933
 
+#line 933
 	return status;
+#line 933
 }
+#line 933
 
 static int
+#line 934
 getNCvx_int_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 934
 		 const size_t *start, size_t nelems, short *value)
+#line 934
 {
+#line 934
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 934
 	size_t remaining = varp->xsz * nelems;
+#line 934
 	int status = NC_NOERR;
+#line 934
 	const void *xp;
+#line 934
 
+#line 934
 	if(nelems == 0)
+#line 934
 		return NC_NOERR;
+#line 934
 
+#line 934
 	assert(value != NULL);
+#line 934
 
+#line 934
 	for(;;)
+#line 934
 	{
+#line 934
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 934
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 934
 
+#line 934
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 934
 				 0, (void **)&xp);	/* cast away const */
+#line 934
 		if(lstatus != NC_NOERR)
+#line 934
 			return lstatus;
+#line 934
 
+#line 934
 		lstatus = ncx_getn_int_short(&xp, nget, value);
+#line 934
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 934
 			status = lstatus;
+#line 934
 
+#line 934
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 934
 
+#line 934
 		remaining -= extent;
+#line 934
 		if(remaining == 0)
+#line 934
 			break; /* normal loop exit */
-		offset += extent;
+#line 934
+		offset += (off_t)extent;
+#line 934
 		value += nget;
+#line 934
 	}
+#line 934
 
+#line 934
 	return status;
+#line 934
 }
+#line 934
 
 static int
+#line 935
 getNCvx_int_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 935
 		 const size_t *start, size_t nelems, int *value)
+#line 935
 {
+#line 935
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 935
 	size_t remaining = varp->xsz * nelems;
+#line 935
 	int status = NC_NOERR;
+#line 935
 	const void *xp;
+#line 935
 
+#line 935
 	if(nelems == 0)
+#line 935
 		return NC_NOERR;
+#line 935
 
+#line 935
 	assert(value != NULL);
+#line 935
 
+#line 935
 	for(;;)
+#line 935
 	{
+#line 935
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 935
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 935
 
+#line 935
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 935
 				 0, (void **)&xp);	/* cast away const */
+#line 935
 		if(lstatus != NC_NOERR)
+#line 935
 			return lstatus;
+#line 935
 
+#line 935
 		lstatus = ncx_getn_int_int(&xp, nget, value);
+#line 935
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 935
 			status = lstatus;
+#line 935
 
+#line 935
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 935
 
+#line 935
 		remaining -= extent;
+#line 935
 		if(remaining == 0)
+#line 935
 			break; /* normal loop exit */
-		offset += extent;
+#line 935
+		offset += (off_t)extent;
+#line 935
 		value += nget;
+#line 935
 	}
+#line 935
 
+#line 935
 	return status;
+#line 935
 }
+#line 935
 
 static int
+#line 936
 getNCvx_int_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 936
 		 const size_t *start, size_t nelems, float *value)
+#line 936
 {
+#line 936
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 936
 	size_t remaining = varp->xsz * nelems;
+#line 936
 	int status = NC_NOERR;
+#line 936
 	const void *xp;
+#line 936
 
+#line 936
 	if(nelems == 0)
+#line 936
 		return NC_NOERR;
+#line 936
 
+#line 936
 	assert(value != NULL);
+#line 936
 
+#line 936
 	for(;;)
+#line 936
 	{
+#line 936
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 936
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 936
 
+#line 936
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 936
 				 0, (void **)&xp);	/* cast away const */
+#line 936
 		if(lstatus != NC_NOERR)
+#line 936
 			return lstatus;
+#line 936
 
+#line 936
 		lstatus = ncx_getn_int_float(&xp, nget, value);
+#line 936
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 936
 			status = lstatus;
+#line 936
 
+#line 936
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 936
 
+#line 936
 		remaining -= extent;
+#line 936
 		if(remaining == 0)
+#line 936
 			break; /* normal loop exit */
-		offset += extent;
+#line 936
+		offset += (off_t)extent;
+#line 936
 		value += nget;
+#line 936
 	}
+#line 936
 
+#line 936
 	return status;
+#line 936
 }
+#line 936
 
 static int
+#line 937
 getNCvx_int_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 937
 		 const size_t *start, size_t nelems, double *value)
+#line 937
 {
+#line 937
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 937
 	size_t remaining = varp->xsz * nelems;
+#line 937
 	int status = NC_NOERR;
+#line 937
 	const void *xp;
+#line 937
 
+#line 937
 	if(nelems == 0)
+#line 937
 		return NC_NOERR;
+#line 937
 
+#line 937
 	assert(value != NULL);
+#line 937
 
+#line 937
 	for(;;)
+#line 937
 	{
+#line 937
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 937
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 937
 
+#line 937
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 937
 				 0, (void **)&xp);	/* cast away const */
+#line 937
 		if(lstatus != NC_NOERR)
+#line 937
 			return lstatus;
+#line 937
 
+#line 937
 		lstatus = ncx_getn_int_double(&xp, nget, value);
+#line 937
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 937
 			status = lstatus;
+#line 937
 
+#line 937
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 937
 
+#line 937
 		remaining -= extent;
+#line 937
 		if(remaining == 0)
+#line 937
 			break; /* normal loop exit */
-		offset += extent;
+#line 937
+		offset += (off_t)extent;
+#line 937
 		value += nget;
+#line 937
 	}
+#line 937
 
+#line 937
 	return status;
+#line 937
 }
+#line 937
 
 static int
+#line 938
 getNCvx_int_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 938
 		 const size_t *start, size_t nelems, longlong *value)
+#line 938
 {
+#line 938
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 938
 	size_t remaining = varp->xsz * nelems;
+#line 938
 	int status = NC_NOERR;
+#line 938
 	const void *xp;
+#line 938
 
+#line 938
 	if(nelems == 0)
+#line 938
 		return NC_NOERR;
+#line 938
 
+#line 938
 	assert(value != NULL);
+#line 938
 
+#line 938
 	for(;;)
+#line 938
 	{
+#line 938
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 938
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 938
 
+#line 938
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 938
 				 0, (void **)&xp);	/* cast away const */
+#line 938
 		if(lstatus != NC_NOERR)
+#line 938
 			return lstatus;
+#line 938
 
+#line 938
 		lstatus = ncx_getn_int_longlong(&xp, nget, value);
+#line 938
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 938
 			status = lstatus;
+#line 938
 
+#line 938
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 938
 
+#line 938
 		remaining -= extent;
+#line 938
 		if(remaining == 0)
+#line 938
 			break; /* normal loop exit */
-		offset += extent;
+#line 938
+		offset += (off_t)extent;
+#line 938
 		value += nget;
+#line 938
 	}
+#line 938
 
+#line 938
 	return status;
+#line 938
 }
+#line 938
 
 static int
+#line 939
 getNCvx_int_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 939
 		 const size_t *start, size_t nelems, uint *value)
+#line 939
 {
+#line 939
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 939
 	size_t remaining = varp->xsz * nelems;
+#line 939
 	int status = NC_NOERR;
+#line 939
 	const void *xp;
+#line 939
 
+#line 939
 	if(nelems == 0)
+#line 939
 		return NC_NOERR;
+#line 939
 
+#line 939
 	assert(value != NULL);
+#line 939
 
+#line 939
 	for(;;)
+#line 939
 	{
+#line 939
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 939
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 939
 
+#line 939
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 939
 				 0, (void **)&xp);	/* cast away const */
+#line 939
 		if(lstatus != NC_NOERR)
+#line 939
 			return lstatus;
+#line 939
 
+#line 939
 		lstatus = ncx_getn_int_uint(&xp, nget, value);
+#line 939
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 939
 			status = lstatus;
+#line 939
 
+#line 939
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 939
 
+#line 939
 		remaining -= extent;
+#line 939
 		if(remaining == 0)
+#line 939
 			break; /* normal loop exit */
-		offset += extent;
+#line 939
+		offset += (off_t)extent;
+#line 939
 		value += nget;
+#line 939
 	}
+#line 939
 
+#line 939
 	return status;
+#line 939
 }
+#line 939
 
 static int
+#line 940
 getNCvx_int_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 940
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 940
 {
+#line 940
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 940
 	size_t remaining = varp->xsz * nelems;
+#line 940
 	int status = NC_NOERR;
+#line 940
 	const void *xp;
+#line 940
 
+#line 940
 	if(nelems == 0)
+#line 940
 		return NC_NOERR;
+#line 940
 
+#line 940
 	assert(value != NULL);
+#line 940
 
+#line 940
 	for(;;)
+#line 940
 	{
+#line 940
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 940
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 940
 
+#line 940
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 940
 				 0, (void **)&xp);	/* cast away const */
+#line 940
 		if(lstatus != NC_NOERR)
+#line 940
 			return lstatus;
+#line 940
 
+#line 940
 		lstatus = ncx_getn_int_ulonglong(&xp, nget, value);
+#line 940
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 940
 			status = lstatus;
+#line 940
 
+#line 940
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 940
 
+#line 940
 		remaining -= extent;
+#line 940
 		if(remaining == 0)
+#line 940
 			break; /* normal loop exit */
-		offset += extent;
+#line 940
+		offset += (off_t)extent;
+#line 940
 		value += nget;
+#line 940
 	}
+#line 940
 
+#line 940
 	return status;
+#line 940
 }
+#line 940
 
 static int
+#line 941
 getNCvx_int_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 941
 		 const size_t *start, size_t nelems, ushort *value)
+#line 941
 {
+#line 941
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 941
 	size_t remaining = varp->xsz * nelems;
+#line 941
 	int status = NC_NOERR;
+#line 941
 	const void *xp;
+#line 941
 
+#line 941
 	if(nelems == 0)
+#line 941
 		return NC_NOERR;
+#line 941
 
+#line 941
 	assert(value != NULL);
+#line 941
 
+#line 941
 	for(;;)
+#line 941
 	{
+#line 941
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 941
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 941
 
+#line 941
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 941
 				 0, (void **)&xp);	/* cast away const */
+#line 941
 		if(lstatus != NC_NOERR)
+#line 941
 			return lstatus;
+#line 941
 
+#line 941
 		lstatus = ncx_getn_int_ushort(&xp, nget, value);
+#line 941
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 941
 			status = lstatus;
+#line 941
 
+#line 941
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 941
 
+#line 941
 		remaining -= extent;
+#line 941
 		if(remaining == 0)
+#line 941
 			break; /* normal loop exit */
-		offset += extent;
+#line 941
+		offset += (off_t)extent;
+#line 941
 		value += nget;
+#line 941
 	}
+#line 941
 
+#line 941
 	return status;
+#line 941
 }
+#line 941
 
 
 static int
+#line 943
 getNCvx_float_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 943
 		 const size_t *start, size_t nelems, schar *value)
+#line 943
 {
+#line 943
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 943
 	size_t remaining = varp->xsz * nelems;
+#line 943
 	int status = NC_NOERR;
+#line 943
 	const void *xp;
+#line 943
 
+#line 943
 	if(nelems == 0)
+#line 943
 		return NC_NOERR;
+#line 943
 
+#line 943
 	assert(value != NULL);
+#line 943
 
+#line 943
 	for(;;)
+#line 943
 	{
+#line 943
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 943
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 943
 
+#line 943
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 943
 				 0, (void **)&xp);	/* cast away const */
+#line 943
 		if(lstatus != NC_NOERR)
+#line 943
 			return lstatus;
+#line 943
 
+#line 943
 		lstatus = ncx_getn_float_schar(&xp, nget, value);
+#line 943
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 943
 			status = lstatus;
+#line 943
 
+#line 943
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 943
 
+#line 943
 		remaining -= extent;
+#line 943
 		if(remaining == 0)
+#line 943
 			break; /* normal loop exit */
-		offset += extent;
+#line 943
+		offset += (off_t)extent;
+#line 943
 		value += nget;
+#line 943
 	}
+#line 943
 
+#line 943
 	return status;
+#line 943
 }
+#line 943
 
 static int
+#line 944
 getNCvx_float_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 944
 		 const size_t *start, size_t nelems, uchar *value)
+#line 944
 {
+#line 944
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 944
 	size_t remaining = varp->xsz * nelems;
+#line 944
 	int status = NC_NOERR;
+#line 944
 	const void *xp;
+#line 944
 
+#line 944
 	if(nelems == 0)
+#line 944
 		return NC_NOERR;
+#line 944
 
+#line 944
 	assert(value != NULL);
+#line 944
 
+#line 944
 	for(;;)
+#line 944
 	{
+#line 944
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 944
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 944
 
+#line 944
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 944
 				 0, (void **)&xp);	/* cast away const */
+#line 944
 		if(lstatus != NC_NOERR)
+#line 944
 			return lstatus;
+#line 944
 
+#line 944
 		lstatus = ncx_getn_float_uchar(&xp, nget, value);
+#line 944
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 944
 			status = lstatus;
+#line 944
 
+#line 944
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 944
 
+#line 944
 		remaining -= extent;
+#line 944
 		if(remaining == 0)
+#line 944
 			break; /* normal loop exit */
-		offset += extent;
+#line 944
+		offset += (off_t)extent;
+#line 944
 		value += nget;
+#line 944
 	}
+#line 944
 
+#line 944
 	return status;
+#line 944
 }
+#line 944
 
 static int
+#line 945
 getNCvx_float_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 945
 		 const size_t *start, size_t nelems, short *value)
+#line 945
 {
+#line 945
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 945
 	size_t remaining = varp->xsz * nelems;
+#line 945
 	int status = NC_NOERR;
+#line 945
 	const void *xp;
+#line 945
 
+#line 945
 	if(nelems == 0)
+#line 945
 		return NC_NOERR;
+#line 945
 
+#line 945
 	assert(value != NULL);
+#line 945
 
+#line 945
 	for(;;)
+#line 945
 	{
+#line 945
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 945
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 945
 
+#line 945
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 945
 				 0, (void **)&xp);	/* cast away const */
+#line 945
 		if(lstatus != NC_NOERR)
+#line 945
 			return lstatus;
+#line 945
 
+#line 945
 		lstatus = ncx_getn_float_short(&xp, nget, value);
+#line 945
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 945
 			status = lstatus;
+#line 945
 
+#line 945
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 945
 
+#line 945
 		remaining -= extent;
+#line 945
 		if(remaining == 0)
+#line 945
 			break; /* normal loop exit */
-		offset += extent;
+#line 945
+		offset += (off_t)extent;
+#line 945
 		value += nget;
+#line 945
 	}
+#line 945
 
+#line 945
 	return status;
+#line 945
 }
+#line 945
 
 static int
+#line 946
 getNCvx_float_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 946
 		 const size_t *start, size_t nelems, int *value)
+#line 946
 {
+#line 946
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 946
 	size_t remaining = varp->xsz * nelems;
+#line 946
 	int status = NC_NOERR;
+#line 946
 	const void *xp;
+#line 946
 
+#line 946
 	if(nelems == 0)
+#line 946
 		return NC_NOERR;
+#line 946
 
+#line 946
 	assert(value != NULL);
+#line 946
 
+#line 946
 	for(;;)
+#line 946
 	{
+#line 946
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 946
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 946
 
+#line 946
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 946
 				 0, (void **)&xp);	/* cast away const */
+#line 946
 		if(lstatus != NC_NOERR)
+#line 946
 			return lstatus;
+#line 946
 
+#line 946
 		lstatus = ncx_getn_float_int(&xp, nget, value);
+#line 946
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 946
 			status = lstatus;
+#line 946
 
+#line 946
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 946
 
+#line 946
 		remaining -= extent;
+#line 946
 		if(remaining == 0)
+#line 946
 			break; /* normal loop exit */
-		offset += extent;
+#line 946
+		offset += (off_t)extent;
+#line 946
 		value += nget;
+#line 946
 	}
+#line 946
 
+#line 946
 	return status;
+#line 946
 }
+#line 946
 
 static int
+#line 947
 getNCvx_float_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 947
 		 const size_t *start, size_t nelems, float *value)
+#line 947
 {
+#line 947
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 947
 	size_t remaining = varp->xsz * nelems;
+#line 947
 	int status = NC_NOERR;
+#line 947
 	const void *xp;
+#line 947
 
+#line 947
 	if(nelems == 0)
+#line 947
 		return NC_NOERR;
+#line 947
 
+#line 947
 	assert(value != NULL);
+#line 947
 
+#line 947
 	for(;;)
+#line 947
 	{
+#line 947
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 947
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 947
 
+#line 947
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 947
 				 0, (void **)&xp);	/* cast away const */
+#line 947
 		if(lstatus != NC_NOERR)
+#line 947
 			return lstatus;
+#line 947
 
+#line 947
 		lstatus = ncx_getn_float_float(&xp, nget, value);
+#line 947
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 947
 			status = lstatus;
+#line 947
 
+#line 947
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 947
 
+#line 947
 		remaining -= extent;
+#line 947
 		if(remaining == 0)
+#line 947
 			break; /* normal loop exit */
-		offset += extent;
+#line 947
+		offset += (off_t)extent;
+#line 947
 		value += nget;
+#line 947
 	}
+#line 947
 
+#line 947
 	return status;
+#line 947
 }
+#line 947
 
 static int
+#line 948
 getNCvx_float_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 948
 		 const size_t *start, size_t nelems, double *value)
+#line 948
 {
+#line 948
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 948
 	size_t remaining = varp->xsz * nelems;
+#line 948
 	int status = NC_NOERR;
+#line 948
 	const void *xp;
+#line 948
 
+#line 948
 	if(nelems == 0)
+#line 948
 		return NC_NOERR;
+#line 948
 
+#line 948
 	assert(value != NULL);
+#line 948
 
+#line 948
 	for(;;)
+#line 948
 	{
+#line 948
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 948
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 948
 
+#line 948
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 948
 				 0, (void **)&xp);	/* cast away const */
+#line 948
 		if(lstatus != NC_NOERR)
+#line 948
 			return lstatus;
+#line 948
 
+#line 948
 		lstatus = ncx_getn_float_double(&xp, nget, value);
+#line 948
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 948
 			status = lstatus;
+#line 948
 
+#line 948
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 948
 
+#line 948
 		remaining -= extent;
+#line 948
 		if(remaining == 0)
+#line 948
 			break; /* normal loop exit */
-		offset += extent;
+#line 948
+		offset += (off_t)extent;
+#line 948
 		value += nget;
+#line 948
 	}
+#line 948
 
+#line 948
 	return status;
+#line 948
 }
+#line 948
 
 static int
+#line 949
 getNCvx_float_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 949
 		 const size_t *start, size_t nelems, longlong *value)
+#line 949
 {
+#line 949
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 949
 	size_t remaining = varp->xsz * nelems;
+#line 949
 	int status = NC_NOERR;
+#line 949
 	const void *xp;
+#line 949
 
+#line 949
 	if(nelems == 0)
+#line 949
 		return NC_NOERR;
+#line 949
 
+#line 949
 	assert(value != NULL);
+#line 949
 
+#line 949
 	for(;;)
+#line 949
 	{
+#line 949
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 949
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 949
 
+#line 949
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 949
 				 0, (void **)&xp);	/* cast away const */
+#line 949
 		if(lstatus != NC_NOERR)
+#line 949
 			return lstatus;
+#line 949
 
+#line 949
 		lstatus = ncx_getn_float_longlong(&xp, nget, value);
+#line 949
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 949
 			status = lstatus;
+#line 949
 
+#line 949
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 949
 
+#line 949
 		remaining -= extent;
+#line 949
 		if(remaining == 0)
+#line 949
 			break; /* normal loop exit */
-		offset += extent;
+#line 949
+		offset += (off_t)extent;
+#line 949
 		value += nget;
+#line 949
 	}
+#line 949
 
+#line 949
 	return status;
+#line 949
 }
+#line 949
 
 static int
+#line 950
 getNCvx_float_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 950
 		 const size_t *start, size_t nelems, uint *value)
+#line 950
 {
+#line 950
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 950
 	size_t remaining = varp->xsz * nelems;
+#line 950
 	int status = NC_NOERR;
+#line 950
 	const void *xp;
+#line 950
 
+#line 950
 	if(nelems == 0)
+#line 950
 		return NC_NOERR;
+#line 950
 
+#line 950
 	assert(value != NULL);
+#line 950
 
+#line 950
 	for(;;)
+#line 950
 	{
+#line 950
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 950
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 950
 
+#line 950
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 950
 				 0, (void **)&xp);	/* cast away const */
+#line 950
 		if(lstatus != NC_NOERR)
+#line 950
 			return lstatus;
+#line 950
 
+#line 950
 		lstatus = ncx_getn_float_uint(&xp, nget, value);
+#line 950
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 950
 			status = lstatus;
+#line 950
 
+#line 950
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 950
 
+#line 950
 		remaining -= extent;
+#line 950
 		if(remaining == 0)
+#line 950
 			break; /* normal loop exit */
-		offset += extent;
+#line 950
+		offset += (off_t)extent;
+#line 950
 		value += nget;
+#line 950
 	}
+#line 950
 
+#line 950
 	return status;
+#line 950
 }
+#line 950
 
 static int
+#line 951
 getNCvx_float_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 951
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 951
 {
+#line 951
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 951
 	size_t remaining = varp->xsz * nelems;
+#line 951
 	int status = NC_NOERR;
+#line 951
 	const void *xp;
+#line 951
 
+#line 951
 	if(nelems == 0)
+#line 951
 		return NC_NOERR;
+#line 951
 
+#line 951
 	assert(value != NULL);
+#line 951
 
+#line 951
 	for(;;)
+#line 951
 	{
+#line 951
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 951
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 951
 
+#line 951
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 951
 				 0, (void **)&xp);	/* cast away const */
+#line 951
 		if(lstatus != NC_NOERR)
+#line 951
 			return lstatus;
+#line 951
 
+#line 951
 		lstatus = ncx_getn_float_ulonglong(&xp, nget, value);
+#line 951
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 951
 			status = lstatus;
+#line 951
 
+#line 951
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 951
 
+#line 951
 		remaining -= extent;
+#line 951
 		if(remaining == 0)
+#line 951
 			break; /* normal loop exit */
-		offset += extent;
+#line 951
+		offset += (off_t)extent;
+#line 951
 		value += nget;
+#line 951
 	}
+#line 951
 
+#line 951
 	return status;
+#line 951
 }
+#line 951
 
 static int
+#line 952
 getNCvx_float_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 952
 		 const size_t *start, size_t nelems, ushort *value)
+#line 952
 {
+#line 952
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 952
 	size_t remaining = varp->xsz * nelems;
+#line 952
 	int status = NC_NOERR;
+#line 952
 	const void *xp;
+#line 952
 
+#line 952
 	if(nelems == 0)
+#line 952
 		return NC_NOERR;
+#line 952
 
+#line 952
 	assert(value != NULL);
+#line 952
 
+#line 952
 	for(;;)
+#line 952
 	{
+#line 952
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 952
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 952
 
+#line 952
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 952
 				 0, (void **)&xp);	/* cast away const */
+#line 952
 		if(lstatus != NC_NOERR)
+#line 952
 			return lstatus;
+#line 952
 
+#line 952
 		lstatus = ncx_getn_float_ushort(&xp, nget, value);
+#line 952
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 952
 			status = lstatus;
+#line 952
 
+#line 952
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 952
 
+#line 952
 		remaining -= extent;
+#line 952
 		if(remaining == 0)
+#line 952
 			break; /* normal loop exit */
-		offset += extent;
+#line 952
+		offset += (off_t)extent;
+#line 952
 		value += nget;
+#line 952
 	}
+#line 952
 
+#line 952
 	return status;
+#line 952
 }
+#line 952
 
 
 static int
+#line 954
 getNCvx_double_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 954
 		 const size_t *start, size_t nelems, schar *value)
+#line 954
 {
+#line 954
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 954
 	size_t remaining = varp->xsz * nelems;
+#line 954
 	int status = NC_NOERR;
+#line 954
 	const void *xp;
+#line 954
 
+#line 954
 	if(nelems == 0)
+#line 954
 		return NC_NOERR;
+#line 954
 
+#line 954
 	assert(value != NULL);
+#line 954
 
+#line 954
 	for(;;)
+#line 954
 	{
+#line 954
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 954
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 954
 
+#line 954
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 954
 				 0, (void **)&xp);	/* cast away const */
+#line 954
 		if(lstatus != NC_NOERR)
+#line 954
 			return lstatus;
+#line 954
 
+#line 954
 		lstatus = ncx_getn_double_schar(&xp, nget, value);
+#line 954
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 954
 			status = lstatus;
+#line 954
 
+#line 954
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 954
 
+#line 954
 		remaining -= extent;
+#line 954
 		if(remaining == 0)
+#line 954
 			break; /* normal loop exit */
-		offset += extent;
+#line 954
+		offset += (off_t)extent;
+#line 954
 		value += nget;
+#line 954
 	}
+#line 954
 
+#line 954
 	return status;
+#line 954
 }
+#line 954
 
 static int
+#line 955
 getNCvx_double_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 955
 		 const size_t *start, size_t nelems, uchar *value)
+#line 955
 {
+#line 955
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 955
 	size_t remaining = varp->xsz * nelems;
+#line 955
 	int status = NC_NOERR;
+#line 955
 	const void *xp;
+#line 955
 
+#line 955
 	if(nelems == 0)
+#line 955
 		return NC_NOERR;
+#line 955
 
+#line 955
 	assert(value != NULL);
+#line 955
 
+#line 955
 	for(;;)
+#line 955
 	{
+#line 955
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 955
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 955
 
+#line 955
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 955
 				 0, (void **)&xp);	/* cast away const */
+#line 955
 		if(lstatus != NC_NOERR)
+#line 955
 			return lstatus;
+#line 955
 
+#line 955
 		lstatus = ncx_getn_double_uchar(&xp, nget, value);
+#line 955
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 955
 			status = lstatus;
+#line 955
 
+#line 955
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 955
 
+#line 955
 		remaining -= extent;
+#line 955
 		if(remaining == 0)
+#line 955
 			break; /* normal loop exit */
-		offset += extent;
+#line 955
+		offset += (off_t)extent;
+#line 955
 		value += nget;
+#line 955
 	}
+#line 955
 
+#line 955
 	return status;
+#line 955
 }
+#line 955
 
 static int
+#line 956
 getNCvx_double_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 956
 		 const size_t *start, size_t nelems, short *value)
+#line 956
 {
+#line 956
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 956
 	size_t remaining = varp->xsz * nelems;
+#line 956
 	int status = NC_NOERR;
+#line 956
 	const void *xp;
+#line 956
 
+#line 956
 	if(nelems == 0)
+#line 956
 		return NC_NOERR;
+#line 956
 
+#line 956
 	assert(value != NULL);
+#line 956
 
+#line 956
 	for(;;)
+#line 956
 	{
+#line 956
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 956
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 956
 
+#line 956
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 956
 				 0, (void **)&xp);	/* cast away const */
+#line 956
 		if(lstatus != NC_NOERR)
+#line 956
 			return lstatus;
+#line 956
 
+#line 956
 		lstatus = ncx_getn_double_short(&xp, nget, value);
+#line 956
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 956
 			status = lstatus;
+#line 956
 
+#line 956
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 956
 
+#line 956
 		remaining -= extent;
+#line 956
 		if(remaining == 0)
+#line 956
 			break; /* normal loop exit */
-		offset += extent;
+#line 956
+		offset += (off_t)extent;
+#line 956
 		value += nget;
+#line 956
 	}
+#line 956
 
+#line 956
 	return status;
+#line 956
 }
+#line 956
 
 static int
+#line 957
 getNCvx_double_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 957
 		 const size_t *start, size_t nelems, int *value)
+#line 957
 {
+#line 957
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 957
 	size_t remaining = varp->xsz * nelems;
+#line 957
 	int status = NC_NOERR;
+#line 957
 	const void *xp;
+#line 957
 
+#line 957
 	if(nelems == 0)
+#line 957
 		return NC_NOERR;
+#line 957
 
+#line 957
 	assert(value != NULL);
+#line 957
 
+#line 957
 	for(;;)
+#line 957
 	{
+#line 957
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 957
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 957
 
+#line 957
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 957
 				 0, (void **)&xp);	/* cast away const */
+#line 957
 		if(lstatus != NC_NOERR)
+#line 957
 			return lstatus;
+#line 957
 
+#line 957
 		lstatus = ncx_getn_double_int(&xp, nget, value);
+#line 957
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 957
 			status = lstatus;
+#line 957
 
+#line 957
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 957
 
+#line 957
 		remaining -= extent;
+#line 957
 		if(remaining == 0)
+#line 957
 			break; /* normal loop exit */
-		offset += extent;
+#line 957
+		offset += (off_t)extent;
+#line 957
 		value += nget;
+#line 957
 	}
+#line 957
 
+#line 957
 	return status;
+#line 957
 }
+#line 957
 
 static int
+#line 958
 getNCvx_double_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 958
 		 const size_t *start, size_t nelems, float *value)
+#line 958
 {
+#line 958
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 958
 	size_t remaining = varp->xsz * nelems;
+#line 958
 	int status = NC_NOERR;
+#line 958
 	const void *xp;
+#line 958
 
+#line 958
 	if(nelems == 0)
+#line 958
 		return NC_NOERR;
+#line 958
 
+#line 958
 	assert(value != NULL);
+#line 958
 
+#line 958
 	for(;;)
+#line 958
 	{
+#line 958
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 958
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 958
 
+#line 958
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 958
 				 0, (void **)&xp);	/* cast away const */
+#line 958
 		if(lstatus != NC_NOERR)
+#line 958
 			return lstatus;
+#line 958
 
+#line 958
 		lstatus = ncx_getn_double_float(&xp, nget, value);
+#line 958
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 958
 			status = lstatus;
+#line 958
 
+#line 958
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 958
 
+#line 958
 		remaining -= extent;
+#line 958
 		if(remaining == 0)
+#line 958
 			break; /* normal loop exit */
-		offset += extent;
+#line 958
+		offset += (off_t)extent;
+#line 958
 		value += nget;
+#line 958
 	}
+#line 958
 
+#line 958
 	return status;
+#line 958
 }
+#line 958
 
 static int
+#line 959
 getNCvx_double_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 959
 		 const size_t *start, size_t nelems, double *value)
+#line 959
 {
+#line 959
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 959
 	size_t remaining = varp->xsz * nelems;
+#line 959
 	int status = NC_NOERR;
+#line 959
 	const void *xp;
+#line 959
 
+#line 959
 	if(nelems == 0)
+#line 959
 		return NC_NOERR;
+#line 959
 
+#line 959
 	assert(value != NULL);
+#line 959
 
+#line 959
 	for(;;)
+#line 959
 	{
+#line 959
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 959
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 959
 
+#line 959
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 959
 				 0, (void **)&xp);	/* cast away const */
+#line 959
 		if(lstatus != NC_NOERR)
+#line 959
 			return lstatus;
+#line 959
 
+#line 959
 		lstatus = ncx_getn_double_double(&xp, nget, value);
+#line 959
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 959
 			status = lstatus;
+#line 959
 
+#line 959
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 959
 
+#line 959
 		remaining -= extent;
+#line 959
 		if(remaining == 0)
+#line 959
 			break; /* normal loop exit */
-		offset += extent;
+#line 959
+		offset += (off_t)extent;
+#line 959
 		value += nget;
+#line 959
 	}
+#line 959
 
+#line 959
 	return status;
+#line 959
 }
+#line 959
 
 static int
+#line 960
 getNCvx_double_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 960
 		 const size_t *start, size_t nelems, longlong *value)
+#line 960
 {
+#line 960
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 960
 	size_t remaining = varp->xsz * nelems;
+#line 960
 	int status = NC_NOERR;
+#line 960
 	const void *xp;
+#line 960
 
+#line 960
 	if(nelems == 0)
+#line 960
 		return NC_NOERR;
+#line 960
 
+#line 960
 	assert(value != NULL);
+#line 960
 
+#line 960
 	for(;;)
+#line 960
 	{
+#line 960
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 960
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 960
 
+#line 960
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 960
 				 0, (void **)&xp);	/* cast away const */
+#line 960
 		if(lstatus != NC_NOERR)
+#line 960
 			return lstatus;
+#line 960
 
+#line 960
 		lstatus = ncx_getn_double_longlong(&xp, nget, value);
+#line 960
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 960
 			status = lstatus;
+#line 960
 
+#line 960
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 960
 
+#line 960
 		remaining -= extent;
+#line 960
 		if(remaining == 0)
+#line 960
 			break; /* normal loop exit */
-		offset += extent;
+#line 960
+		offset += (off_t)extent;
+#line 960
 		value += nget;
+#line 960
 	}
+#line 960
 
+#line 960
 	return status;
+#line 960
 }
+#line 960
 
 static int
+#line 961
 getNCvx_double_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 961
 		 const size_t *start, size_t nelems, uint *value)
+#line 961
 {
+#line 961
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 961
 	size_t remaining = varp->xsz * nelems;
+#line 961
 	int status = NC_NOERR;
+#line 961
 	const void *xp;
+#line 961
 
+#line 961
 	if(nelems == 0)
+#line 961
 		return NC_NOERR;
+#line 961
 
+#line 961
 	assert(value != NULL);
+#line 961
 
+#line 961
 	for(;;)
+#line 961
 	{
+#line 961
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 961
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 961
 
+#line 961
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 961
 				 0, (void **)&xp);	/* cast away const */
+#line 961
 		if(lstatus != NC_NOERR)
+#line 961
 			return lstatus;
+#line 961
 
+#line 961
 		lstatus = ncx_getn_double_uint(&xp, nget, value);
+#line 961
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 961
 			status = lstatus;
+#line 961
 
+#line 961
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 961
 
+#line 961
 		remaining -= extent;
+#line 961
 		if(remaining == 0)
+#line 961
 			break; /* normal loop exit */
-		offset += extent;
+#line 961
+		offset += (off_t)extent;
+#line 961
 		value += nget;
+#line 961
 	}
+#line 961
 
+#line 961
 	return status;
+#line 961
 }
+#line 961
 
 static int
+#line 962
 getNCvx_double_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 962
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 962
 {
+#line 962
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 962
 	size_t remaining = varp->xsz * nelems;
+#line 962
 	int status = NC_NOERR;
+#line 962
 	const void *xp;
+#line 962
 
+#line 962
 	if(nelems == 0)
+#line 962
 		return NC_NOERR;
+#line 962
 
+#line 962
 	assert(value != NULL);
+#line 962
 
+#line 962
 	for(;;)
+#line 962
 	{
+#line 962
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 962
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 962
 
+#line 962
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 962
 				 0, (void **)&xp);	/* cast away const */
+#line 962
 		if(lstatus != NC_NOERR)
+#line 962
 			return lstatus;
+#line 962
 
+#line 962
 		lstatus = ncx_getn_double_ulonglong(&xp, nget, value);
+#line 962
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 962
 			status = lstatus;
+#line 962
 
+#line 962
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 962
 
+#line 962
 		remaining -= extent;
+#line 962
 		if(remaining == 0)
+#line 962
 			break; /* normal loop exit */
-		offset += extent;
+#line 962
+		offset += (off_t)extent;
+#line 962
 		value += nget;
+#line 962
 	}
+#line 962
 
+#line 962
 	return status;
+#line 962
 }
+#line 962
 
 static int
+#line 963
 getNCvx_double_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 963
 		 const size_t *start, size_t nelems, ushort *value)
+#line 963
 {
+#line 963
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 963
 	size_t remaining = varp->xsz * nelems;
+#line 963
 	int status = NC_NOERR;
+#line 963
 	const void *xp;
+#line 963
 
+#line 963
 	if(nelems == 0)
+#line 963
 		return NC_NOERR;
+#line 963
 
+#line 963
 	assert(value != NULL);
+#line 963
 
+#line 963
 	for(;;)
+#line 963
 	{
+#line 963
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 963
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 963
 
+#line 963
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 963
 				 0, (void **)&xp);	/* cast away const */
+#line 963
 		if(lstatus != NC_NOERR)
+#line 963
 			return lstatus;
+#line 963
 
+#line 963
 		lstatus = ncx_getn_double_ushort(&xp, nget, value);
+#line 963
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 963
 			status = lstatus;
+#line 963
 
+#line 963
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 963
 
+#line 963
 		remaining -= extent;
+#line 963
 		if(remaining == 0)
+#line 963
 			break; /* normal loop exit */
-		offset += extent;
+#line 963
+		offset += (off_t)extent;
+#line 963
 		value += nget;
+#line 963
 	}
+#line 963
 
+#line 963
 	return status;
+#line 963
 }
+#line 963
 
 
 static int
+#line 965
 getNCvx_uchar_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 965
 		 const size_t *start, size_t nelems, schar *value)
+#line 965
 {
+#line 965
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 965
 	size_t remaining = varp->xsz * nelems;
+#line 965
 	int status = NC_NOERR;
+#line 965
 	const void *xp;
+#line 965
 
+#line 965
 	if(nelems == 0)
+#line 965
 		return NC_NOERR;
+#line 965
 
+#line 965
 	assert(value != NULL);
+#line 965
 
+#line 965
 	for(;;)
+#line 965
 	{
+#line 965
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 965
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 965
 
+#line 965
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 965
 				 0, (void **)&xp);	/* cast away const */
+#line 965
 		if(lstatus != NC_NOERR)
+#line 965
 			return lstatus;
+#line 965
 
+#line 965
 		lstatus = ncx_getn_uchar_schar(&xp, nget, value);
+#line 965
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 965
 			status = lstatus;
+#line 965
 
+#line 965
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 965
 
+#line 965
 		remaining -= extent;
+#line 965
 		if(remaining == 0)
+#line 965
 			break; /* normal loop exit */
-		offset += extent;
+#line 965
+		offset += (off_t)extent;
+#line 965
 		value += nget;
+#line 965
 	}
+#line 965
 
+#line 965
 	return status;
+#line 965
 }
+#line 965
 
 static int
+#line 966
 getNCvx_uchar_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 966
 		 const size_t *start, size_t nelems, uchar *value)
+#line 966
 {
+#line 966
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 966
 	size_t remaining = varp->xsz * nelems;
+#line 966
 	int status = NC_NOERR;
+#line 966
 	const void *xp;
+#line 966
 
+#line 966
 	if(nelems == 0)
+#line 966
 		return NC_NOERR;
+#line 966
 
+#line 966
 	assert(value != NULL);
+#line 966
 
+#line 966
 	for(;;)
+#line 966
 	{
+#line 966
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 966
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 966
 
+#line 966
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 966
 				 0, (void **)&xp);	/* cast away const */
+#line 966
 		if(lstatus != NC_NOERR)
+#line 966
 			return lstatus;
+#line 966
 
+#line 966
 		lstatus = ncx_getn_uchar_uchar(&xp, nget, value);
+#line 966
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 966
 			status = lstatus;
+#line 966
 
+#line 966
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 966
 
+#line 966
 		remaining -= extent;
+#line 966
 		if(remaining == 0)
+#line 966
 			break; /* normal loop exit */
-		offset += extent;
+#line 966
+		offset += (off_t)extent;
+#line 966
 		value += nget;
+#line 966
 	}
+#line 966
 
+#line 966
 	return status;
+#line 966
 }
+#line 966
 
 static int
+#line 967
 getNCvx_uchar_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 967
 		 const size_t *start, size_t nelems, short *value)
+#line 967
 {
+#line 967
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 967
 	size_t remaining = varp->xsz * nelems;
+#line 967
 	int status = NC_NOERR;
+#line 967
 	const void *xp;
+#line 967
 
+#line 967
 	if(nelems == 0)
+#line 967
 		return NC_NOERR;
+#line 967
 
+#line 967
 	assert(value != NULL);
+#line 967
 
+#line 967
 	for(;;)
+#line 967
 	{
+#line 967
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 967
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 967
 
+#line 967
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 967
 				 0, (void **)&xp);	/* cast away const */
+#line 967
 		if(lstatus != NC_NOERR)
+#line 967
 			return lstatus;
+#line 967
 
+#line 967
 		lstatus = ncx_getn_uchar_short(&xp, nget, value);
+#line 967
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 967
 			status = lstatus;
+#line 967
 
+#line 967
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 967
 
+#line 967
 		remaining -= extent;
+#line 967
 		if(remaining == 0)
+#line 967
 			break; /* normal loop exit */
-		offset += extent;
+#line 967
+		offset += (off_t)extent;
+#line 967
 		value += nget;
+#line 967
 	}
+#line 967
 
+#line 967
 	return status;
+#line 967
 }
+#line 967
 
 static int
+#line 968
 getNCvx_uchar_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 968
 		 const size_t *start, size_t nelems, int *value)
+#line 968
 {
+#line 968
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 968
 	size_t remaining = varp->xsz * nelems;
+#line 968
 	int status = NC_NOERR;
+#line 968
 	const void *xp;
+#line 968
 
+#line 968
 	if(nelems == 0)
+#line 968
 		return NC_NOERR;
+#line 968
 
+#line 968
 	assert(value != NULL);
+#line 968
 
+#line 968
 	for(;;)
+#line 968
 	{
+#line 968
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 968
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 968
 
+#line 968
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 968
 				 0, (void **)&xp);	/* cast away const */
+#line 968
 		if(lstatus != NC_NOERR)
+#line 968
 			return lstatus;
+#line 968
 
+#line 968
 		lstatus = ncx_getn_uchar_int(&xp, nget, value);
+#line 968
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 968
 			status = lstatus;
+#line 968
 
+#line 968
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 968
 
+#line 968
 		remaining -= extent;
+#line 968
 		if(remaining == 0)
+#line 968
 			break; /* normal loop exit */
-		offset += extent;
+#line 968
+		offset += (off_t)extent;
+#line 968
 		value += nget;
+#line 968
 	}
+#line 968
 
+#line 968
 	return status;
+#line 968
 }
+#line 968
 
 static int
+#line 969
 getNCvx_uchar_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 969
 		 const size_t *start, size_t nelems, float *value)
+#line 969
 {
+#line 969
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 969
 	size_t remaining = varp->xsz * nelems;
+#line 969
 	int status = NC_NOERR;
+#line 969
 	const void *xp;
+#line 969
 
+#line 969
 	if(nelems == 0)
+#line 969
 		return NC_NOERR;
+#line 969
 
+#line 969
 	assert(value != NULL);
+#line 969
 
+#line 969
 	for(;;)
+#line 969
 	{
+#line 969
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 969
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 969
 
+#line 969
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 969
 				 0, (void **)&xp);	/* cast away const */
+#line 969
 		if(lstatus != NC_NOERR)
+#line 969
 			return lstatus;
+#line 969
 
+#line 969
 		lstatus = ncx_getn_uchar_float(&xp, nget, value);
+#line 969
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 969
 			status = lstatus;
+#line 969
 
+#line 969
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 969
 
+#line 969
 		remaining -= extent;
+#line 969
 		if(remaining == 0)
+#line 969
 			break; /* normal loop exit */
-		offset += extent;
+#line 969
+		offset += (off_t)extent;
+#line 969
 		value += nget;
+#line 969
 	}
+#line 969
 
+#line 969
 	return status;
+#line 969
 }
+#line 969
 
 static int
+#line 970
 getNCvx_uchar_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 970
 		 const size_t *start, size_t nelems, double *value)
+#line 970
 {
+#line 970
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 970
 	size_t remaining = varp->xsz * nelems;
+#line 970
 	int status = NC_NOERR;
+#line 970
 	const void *xp;
+#line 970
 
+#line 970
 	if(nelems == 0)
+#line 970
 		return NC_NOERR;
+#line 970
 
+#line 970
 	assert(value != NULL);
+#line 970
 
+#line 970
 	for(;;)
+#line 970
 	{
+#line 970
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 970
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 970
 
+#line 970
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 970
 				 0, (void **)&xp);	/* cast away const */
+#line 970
 		if(lstatus != NC_NOERR)
+#line 970
 			return lstatus;
+#line 970
 
+#line 970
 		lstatus = ncx_getn_uchar_double(&xp, nget, value);
+#line 970
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 970
 			status = lstatus;
+#line 970
 
+#line 970
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 970
 
+#line 970
 		remaining -= extent;
+#line 970
 		if(remaining == 0)
+#line 970
 			break; /* normal loop exit */
-		offset += extent;
+#line 970
+		offset += (off_t)extent;
+#line 970
 		value += nget;
+#line 970
 	}
+#line 970
 
+#line 970
 	return status;
+#line 970
 }
+#line 970
 
 static int
+#line 971
 getNCvx_uchar_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 971
 		 const size_t *start, size_t nelems, longlong *value)
+#line 971
 {
+#line 971
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 971
 	size_t remaining = varp->xsz * nelems;
+#line 971
 	int status = NC_NOERR;
+#line 971
 	const void *xp;
+#line 971
 
+#line 971
 	if(nelems == 0)
+#line 971
 		return NC_NOERR;
+#line 971
 
+#line 971
 	assert(value != NULL);
+#line 971
 
+#line 971
 	for(;;)
+#line 971
 	{
+#line 971
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 971
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 971
 
+#line 971
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 971
 				 0, (void **)&xp);	/* cast away const */
+#line 971
 		if(lstatus != NC_NOERR)
+#line 971
 			return lstatus;
+#line 971
 
+#line 971
 		lstatus = ncx_getn_uchar_longlong(&xp, nget, value);
+#line 971
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 971
 			status = lstatus;
+#line 971
 
+#line 971
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 971
 
+#line 971
 		remaining -= extent;
+#line 971
 		if(remaining == 0)
+#line 971
 			break; /* normal loop exit */
-		offset += extent;
+#line 971
+		offset += (off_t)extent;
+#line 971
 		value += nget;
+#line 971
 	}
+#line 971
 
+#line 971
 	return status;
+#line 971
 }
+#line 971
 
 static int
+#line 972
 getNCvx_uchar_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 972
 		 const size_t *start, size_t nelems, uint *value)
+#line 972
 {
+#line 972
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 972
 	size_t remaining = varp->xsz * nelems;
+#line 972
 	int status = NC_NOERR;
+#line 972
 	const void *xp;
+#line 972
 
+#line 972
 	if(nelems == 0)
+#line 972
 		return NC_NOERR;
+#line 972
 
+#line 972
 	assert(value != NULL);
+#line 972
 
+#line 972
 	for(;;)
+#line 972
 	{
+#line 972
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 972
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 972
 
+#line 972
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 972
 				 0, (void **)&xp);	/* cast away const */
+#line 972
 		if(lstatus != NC_NOERR)
+#line 972
 			return lstatus;
+#line 972
 
+#line 972
 		lstatus = ncx_getn_uchar_uint(&xp, nget, value);
+#line 972
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 972
 			status = lstatus;
+#line 972
 
+#line 972
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 972
 
+#line 972
 		remaining -= extent;
+#line 972
 		if(remaining == 0)
+#line 972
 			break; /* normal loop exit */
-		offset += extent;
+#line 972
+		offset += (off_t)extent;
+#line 972
 		value += nget;
+#line 972
 	}
+#line 972
 
+#line 972
 	return status;
+#line 972
 }
+#line 972
 
 static int
+#line 973
 getNCvx_uchar_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 973
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 973
 {
+#line 973
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 973
 	size_t remaining = varp->xsz * nelems;
+#line 973
 	int status = NC_NOERR;
+#line 973
 	const void *xp;
+#line 973
 
+#line 973
 	if(nelems == 0)
+#line 973
 		return NC_NOERR;
+#line 973
 
+#line 973
 	assert(value != NULL);
+#line 973
 
+#line 973
 	for(;;)
+#line 973
 	{
+#line 973
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 973
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 973
 
+#line 973
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 973
 				 0, (void **)&xp);	/* cast away const */
+#line 973
 		if(lstatus != NC_NOERR)
+#line 973
 			return lstatus;
+#line 973
 
+#line 973
 		lstatus = ncx_getn_uchar_ulonglong(&xp, nget, value);
+#line 973
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 973
 			status = lstatus;
+#line 973
 
+#line 973
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 973
 
+#line 973
 		remaining -= extent;
+#line 973
 		if(remaining == 0)
+#line 973
 			break; /* normal loop exit */
-		offset += extent;
+#line 973
+		offset += (off_t)extent;
+#line 973
 		value += nget;
+#line 973
 	}
+#line 973
 
+#line 973
 	return status;
+#line 973
 }
+#line 973
 
 static int
+#line 974
 getNCvx_uchar_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 974
 		 const size_t *start, size_t nelems, ushort *value)
+#line 974
 {
+#line 974
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 974
 	size_t remaining = varp->xsz * nelems;
+#line 974
 	int status = NC_NOERR;
+#line 974
 	const void *xp;
+#line 974
 
+#line 974
 	if(nelems == 0)
+#line 974
 		return NC_NOERR;
+#line 974
 
+#line 974
 	assert(value != NULL);
+#line 974
 
+#line 974
 	for(;;)
+#line 974
 	{
+#line 974
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 974
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 974
 
+#line 974
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 974
 				 0, (void **)&xp);	/* cast away const */
+#line 974
 		if(lstatus != NC_NOERR)
+#line 974
 			return lstatus;
+#line 974
 
+#line 974
 		lstatus = ncx_getn_uchar_ushort(&xp, nget, value);
+#line 974
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 974
 			status = lstatus;
+#line 974
 
+#line 974
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 974
 
+#line 974
 		remaining -= extent;
+#line 974
 		if(remaining == 0)
+#line 974
 			break; /* normal loop exit */
-		offset += extent;
+#line 974
+		offset += (off_t)extent;
+#line 974
 		value += nget;
+#line 974
 	}
+#line 974
 
+#line 974
 	return status;
+#line 974
 }
+#line 974
 
 
 static int
+#line 976
 getNCvx_ushort_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 976
 		 const size_t *start, size_t nelems, schar *value)
+#line 976
 {
+#line 976
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 976
 	size_t remaining = varp->xsz * nelems;
+#line 976
 	int status = NC_NOERR;
+#line 976
 	const void *xp;
+#line 976
 
+#line 976
 	if(nelems == 0)
+#line 976
 		return NC_NOERR;
+#line 976
 
+#line 976
 	assert(value != NULL);
+#line 976
 
+#line 976
 	for(;;)
+#line 976
 	{
+#line 976
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 976
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 976
 
+#line 976
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 976
 				 0, (void **)&xp);	/* cast away const */
+#line 976
 		if(lstatus != NC_NOERR)
+#line 976
 			return lstatus;
+#line 976
 
+#line 976
 		lstatus = ncx_getn_ushort_schar(&xp, nget, value);
+#line 976
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 976
 			status = lstatus;
+#line 976
 
+#line 976
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 976
 
+#line 976
 		remaining -= extent;
+#line 976
 		if(remaining == 0)
+#line 976
 			break; /* normal loop exit */
-		offset += extent;
+#line 976
+		offset += (off_t)extent;
+#line 976
 		value += nget;
+#line 976
 	}
+#line 976
 
+#line 976
 	return status;
+#line 976
 }
+#line 976
 
 static int
+#line 977
 getNCvx_ushort_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 977
 		 const size_t *start, size_t nelems, uchar *value)
+#line 977
 {
+#line 977
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 977
 	size_t remaining = varp->xsz * nelems;
+#line 977
 	int status = NC_NOERR;
+#line 977
 	const void *xp;
+#line 977
 
+#line 977
 	if(nelems == 0)
+#line 977
 		return NC_NOERR;
+#line 977
 
+#line 977
 	assert(value != NULL);
+#line 977
 
+#line 977
 	for(;;)
+#line 977
 	{
+#line 977
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 977
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 977
 
+#line 977
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 977
 				 0, (void **)&xp);	/* cast away const */
+#line 977
 		if(lstatus != NC_NOERR)
+#line 977
 			return lstatus;
+#line 977
 
+#line 977
 		lstatus = ncx_getn_ushort_uchar(&xp, nget, value);
+#line 977
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 977
 			status = lstatus;
+#line 977
 
+#line 977
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 977
 
+#line 977
 		remaining -= extent;
+#line 977
 		if(remaining == 0)
+#line 977
 			break; /* normal loop exit */
-		offset += extent;
+#line 977
+		offset += (off_t)extent;
+#line 977
 		value += nget;
+#line 977
 	}
+#line 977
 
+#line 977
 	return status;
+#line 977
 }
+#line 977
 
 static int
+#line 978
 getNCvx_ushort_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 978
 		 const size_t *start, size_t nelems, short *value)
+#line 978
 {
+#line 978
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 978
 	size_t remaining = varp->xsz * nelems;
+#line 978
 	int status = NC_NOERR;
+#line 978
 	const void *xp;
+#line 978
 
+#line 978
 	if(nelems == 0)
+#line 978
 		return NC_NOERR;
+#line 978
 
+#line 978
 	assert(value != NULL);
+#line 978
 
+#line 978
 	for(;;)
+#line 978
 	{
+#line 978
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 978
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 978
 
+#line 978
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 978
 				 0, (void **)&xp);	/* cast away const */
+#line 978
 		if(lstatus != NC_NOERR)
+#line 978
 			return lstatus;
+#line 978
 
+#line 978
 		lstatus = ncx_getn_ushort_short(&xp, nget, value);
+#line 978
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 978
 			status = lstatus;
+#line 978
 
+#line 978
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 978
 
+#line 978
 		remaining -= extent;
+#line 978
 		if(remaining == 0)
+#line 978
 			break; /* normal loop exit */
-		offset += extent;
+#line 978
+		offset += (off_t)extent;
+#line 978
 		value += nget;
+#line 978
 	}
+#line 978
 
+#line 978
 	return status;
+#line 978
 }
+#line 978
 
 static int
+#line 979
 getNCvx_ushort_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 979
 		 const size_t *start, size_t nelems, int *value)
+#line 979
 {
+#line 979
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 979
 	size_t remaining = varp->xsz * nelems;
+#line 979
 	int status = NC_NOERR;
+#line 979
 	const void *xp;
+#line 979
 
+#line 979
 	if(nelems == 0)
+#line 979
 		return NC_NOERR;
+#line 979
 
+#line 979
 	assert(value != NULL);
+#line 979
 
+#line 979
 	for(;;)
+#line 979
 	{
+#line 979
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 979
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 979
 
+#line 979
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 979
 				 0, (void **)&xp);	/* cast away const */
+#line 979
 		if(lstatus != NC_NOERR)
+#line 979
 			return lstatus;
+#line 979
 
+#line 979
 		lstatus = ncx_getn_ushort_int(&xp, nget, value);
+#line 979
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 979
 			status = lstatus;
+#line 979
 
+#line 979
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 979
 
+#line 979
 		remaining -= extent;
+#line 979
 		if(remaining == 0)
+#line 979
 			break; /* normal loop exit */
-		offset += extent;
+#line 979
+		offset += (off_t)extent;
+#line 979
 		value += nget;
+#line 979
 	}
+#line 979
 
+#line 979
 	return status;
+#line 979
 }
+#line 979
 
 static int
+#line 980
 getNCvx_ushort_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 980
 		 const size_t *start, size_t nelems, float *value)
+#line 980
 {
+#line 980
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 980
 	size_t remaining = varp->xsz * nelems;
+#line 980
 	int status = NC_NOERR;
+#line 980
 	const void *xp;
+#line 980
 
+#line 980
 	if(nelems == 0)
+#line 980
 		return NC_NOERR;
+#line 980
 
+#line 980
 	assert(value != NULL);
+#line 980
 
+#line 980
 	for(;;)
+#line 980
 	{
+#line 980
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 980
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 980
 
+#line 980
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 980
 				 0, (void **)&xp);	/* cast away const */
+#line 980
 		if(lstatus != NC_NOERR)
+#line 980
 			return lstatus;
+#line 980
 
+#line 980
 		lstatus = ncx_getn_ushort_float(&xp, nget, value);
+#line 980
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 980
 			status = lstatus;
+#line 980
 
+#line 980
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 980
 
+#line 980
 		remaining -= extent;
+#line 980
 		if(remaining == 0)
+#line 980
 			break; /* normal loop exit */
-		offset += extent;
+#line 980
+		offset += (off_t)extent;
+#line 980
 		value += nget;
+#line 980
 	}
+#line 980
 
+#line 980
 	return status;
+#line 980
 }
+#line 980
 
 static int
+#line 981
 getNCvx_ushort_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 981
 		 const size_t *start, size_t nelems, double *value)
+#line 981
 {
+#line 981
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 981
 	size_t remaining = varp->xsz * nelems;
+#line 981
 	int status = NC_NOERR;
+#line 981
 	const void *xp;
+#line 981
 
+#line 981
 	if(nelems == 0)
+#line 981
 		return NC_NOERR;
+#line 981
 
+#line 981
 	assert(value != NULL);
+#line 981
 
+#line 981
 	for(;;)
+#line 981
 	{
+#line 981
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 981
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 981
 
+#line 981
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 981
 				 0, (void **)&xp);	/* cast away const */
+#line 981
 		if(lstatus != NC_NOERR)
+#line 981
 			return lstatus;
+#line 981
 
+#line 981
 		lstatus = ncx_getn_ushort_double(&xp, nget, value);
+#line 981
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 981
 			status = lstatus;
+#line 981
 
+#line 981
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 981
 
+#line 981
 		remaining -= extent;
+#line 981
 		if(remaining == 0)
+#line 981
 			break; /* normal loop exit */
-		offset += extent;
+#line 981
+		offset += (off_t)extent;
+#line 981
 		value += nget;
+#line 981
 	}
+#line 981
 
+#line 981
 	return status;
+#line 981
 }
+#line 981
 
 static int
+#line 982
 getNCvx_ushort_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 982
 		 const size_t *start, size_t nelems, longlong *value)
+#line 982
 {
+#line 982
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 982
 	size_t remaining = varp->xsz * nelems;
+#line 982
 	int status = NC_NOERR;
+#line 982
 	const void *xp;
+#line 982
 
+#line 982
 	if(nelems == 0)
+#line 982
 		return NC_NOERR;
+#line 982
 
+#line 982
 	assert(value != NULL);
+#line 982
 
+#line 982
 	for(;;)
+#line 982
 	{
+#line 982
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 982
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 982
 
+#line 982
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 982
 				 0, (void **)&xp);	/* cast away const */
+#line 982
 		if(lstatus != NC_NOERR)
+#line 982
 			return lstatus;
+#line 982
 
+#line 982
 		lstatus = ncx_getn_ushort_longlong(&xp, nget, value);
+#line 982
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 982
 			status = lstatus;
+#line 982
 
+#line 982
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 982
 
+#line 982
 		remaining -= extent;
+#line 982
 		if(remaining == 0)
+#line 982
 			break; /* normal loop exit */
-		offset += extent;
+#line 982
+		offset += (off_t)extent;
+#line 982
 		value += nget;
+#line 982
 	}
+#line 982
 
+#line 982
 	return status;
+#line 982
 }
+#line 982
 
 static int
+#line 983
 getNCvx_ushort_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 983
 		 const size_t *start, size_t nelems, uint *value)
+#line 983
 {
+#line 983
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 983
 	size_t remaining = varp->xsz * nelems;
+#line 983
 	int status = NC_NOERR;
+#line 983
 	const void *xp;
+#line 983
 
+#line 983
 	if(nelems == 0)
+#line 983
 		return NC_NOERR;
+#line 983
 
+#line 983
 	assert(value != NULL);
+#line 983
 
+#line 983
 	for(;;)
+#line 983
 	{
+#line 983
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 983
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 983
 
+#line 983
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 983
 				 0, (void **)&xp);	/* cast away const */
+#line 983
 		if(lstatus != NC_NOERR)
+#line 983
 			return lstatus;
+#line 983
 
+#line 983
 		lstatus = ncx_getn_ushort_uint(&xp, nget, value);
+#line 983
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 983
 			status = lstatus;
+#line 983
 
+#line 983
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 983
 
+#line 983
 		remaining -= extent;
+#line 983
 		if(remaining == 0)
+#line 983
 			break; /* normal loop exit */
-		offset += extent;
+#line 983
+		offset += (off_t)extent;
+#line 983
 		value += nget;
+#line 983
 	}
+#line 983
 
+#line 983
 	return status;
+#line 983
 }
+#line 983
 
 static int
+#line 984
 getNCvx_ushort_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 984
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 984
 {
+#line 984
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 984
 	size_t remaining = varp->xsz * nelems;
+#line 984
 	int status = NC_NOERR;
+#line 984
 	const void *xp;
+#line 984
 
+#line 984
 	if(nelems == 0)
+#line 984
 		return NC_NOERR;
+#line 984
 
+#line 984
 	assert(value != NULL);
+#line 984
 
+#line 984
 	for(;;)
+#line 984
 	{
+#line 984
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 984
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 984
 
+#line 984
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 984
 				 0, (void **)&xp);	/* cast away const */
+#line 984
 		if(lstatus != NC_NOERR)
+#line 984
 			return lstatus;
+#line 984
 
+#line 984
 		lstatus = ncx_getn_ushort_ulonglong(&xp, nget, value);
+#line 984
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 984
 			status = lstatus;
+#line 984
 
+#line 984
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 984
 
+#line 984
 		remaining -= extent;
+#line 984
 		if(remaining == 0)
+#line 984
 			break; /* normal loop exit */
-		offset += extent;
+#line 984
+		offset += (off_t)extent;
+#line 984
 		value += nget;
+#line 984
 	}
+#line 984
 
+#line 984
 	return status;
+#line 984
 }
+#line 984
 
 static int
+#line 985
 getNCvx_ushort_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 985
 		 const size_t *start, size_t nelems, ushort *value)
+#line 985
 {
+#line 985
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 985
 	size_t remaining = varp->xsz * nelems;
+#line 985
 	int status = NC_NOERR;
+#line 985
 	const void *xp;
+#line 985
 
+#line 985
 	if(nelems == 0)
+#line 985
 		return NC_NOERR;
+#line 985
 
+#line 985
 	assert(value != NULL);
+#line 985
 
+#line 985
 	for(;;)
+#line 985
 	{
+#line 985
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 985
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 985
 
+#line 985
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 985
 				 0, (void **)&xp);	/* cast away const */
+#line 985
 		if(lstatus != NC_NOERR)
+#line 985
 			return lstatus;
+#line 985
 
+#line 985
 		lstatus = ncx_getn_ushort_ushort(&xp, nget, value);
+#line 985
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 985
 			status = lstatus;
+#line 985
 
+#line 985
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 985
 
+#line 985
 		remaining -= extent;
+#line 985
 		if(remaining == 0)
+#line 985
 			break; /* normal loop exit */
-		offset += extent;
+#line 985
+		offset += (off_t)extent;
+#line 985
 		value += nget;
+#line 985
 	}
+#line 985
 
+#line 985
 	return status;
+#line 985
 }
+#line 985
 
 
 static int
+#line 987
 getNCvx_uint_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 987
 		 const size_t *start, size_t nelems, schar *value)
+#line 987
 {
+#line 987
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 987
 	size_t remaining = varp->xsz * nelems;
+#line 987
 	int status = NC_NOERR;
+#line 987
 	const void *xp;
+#line 987
 
+#line 987
 	if(nelems == 0)
+#line 987
 		return NC_NOERR;
+#line 987
 
+#line 987
 	assert(value != NULL);
+#line 987
 
+#line 987
 	for(;;)
+#line 987
 	{
+#line 987
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 987
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 987
 
+#line 987
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 987
 				 0, (void **)&xp);	/* cast away const */
+#line 987
 		if(lstatus != NC_NOERR)
+#line 987
 			return lstatus;
+#line 987
 
+#line 987
 		lstatus = ncx_getn_uint_schar(&xp, nget, value);
+#line 987
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 987
 			status = lstatus;
+#line 987
 
+#line 987
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 987
 
+#line 987
 		remaining -= extent;
+#line 987
 		if(remaining == 0)
+#line 987
 			break; /* normal loop exit */
-		offset += extent;
+#line 987
+		offset += (off_t)extent;
+#line 987
 		value += nget;
+#line 987
 	}
+#line 987
 
+#line 987
 	return status;
+#line 987
 }
+#line 987
 
 static int
+#line 988
 getNCvx_uint_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 988
 		 const size_t *start, size_t nelems, uchar *value)
+#line 988
 {
+#line 988
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 988
 	size_t remaining = varp->xsz * nelems;
+#line 988
 	int status = NC_NOERR;
+#line 988
 	const void *xp;
+#line 988
 
+#line 988
 	if(nelems == 0)
+#line 988
 		return NC_NOERR;
+#line 988
 
+#line 988
 	assert(value != NULL);
+#line 988
 
+#line 988
 	for(;;)
+#line 988
 	{
+#line 988
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 988
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 988
 
+#line 988
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 988
 				 0, (void **)&xp);	/* cast away const */
+#line 988
 		if(lstatus != NC_NOERR)
+#line 988
 			return lstatus;
+#line 988
 
+#line 988
 		lstatus = ncx_getn_uint_uchar(&xp, nget, value);
+#line 988
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 988
 			status = lstatus;
+#line 988
 
+#line 988
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 988
 
+#line 988
 		remaining -= extent;
+#line 988
 		if(remaining == 0)
+#line 988
 			break; /* normal loop exit */
-		offset += extent;
+#line 988
+		offset += (off_t)extent;
+#line 988
 		value += nget;
+#line 988
 	}
+#line 988
 
+#line 988
 	return status;
+#line 988
 }
+#line 988
 
 static int
+#line 989
 getNCvx_uint_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 989
 		 const size_t *start, size_t nelems, short *value)
+#line 989
 {
+#line 989
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 989
 	size_t remaining = varp->xsz * nelems;
+#line 989
 	int status = NC_NOERR;
+#line 989
 	const void *xp;
+#line 989
 
+#line 989
 	if(nelems == 0)
+#line 989
 		return NC_NOERR;
+#line 989
 
+#line 989
 	assert(value != NULL);
+#line 989
 
+#line 989
 	for(;;)
+#line 989
 	{
+#line 989
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 989
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 989
 
+#line 989
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 989
 				 0, (void **)&xp);	/* cast away const */
+#line 989
 		if(lstatus != NC_NOERR)
+#line 989
 			return lstatus;
+#line 989
 
+#line 989
 		lstatus = ncx_getn_uint_short(&xp, nget, value);
+#line 989
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 989
 			status = lstatus;
+#line 989
 
+#line 989
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 989
 
+#line 989
 		remaining -= extent;
+#line 989
 		if(remaining == 0)
+#line 989
 			break; /* normal loop exit */
-		offset += extent;
+#line 989
+		offset += (off_t)extent;
+#line 989
 		value += nget;
+#line 989
 	}
+#line 989
 
+#line 989
 	return status;
+#line 989
 }
+#line 989
 
 static int
+#line 990
 getNCvx_uint_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 990
 		 const size_t *start, size_t nelems, int *value)
+#line 990
 {
+#line 990
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 990
 	size_t remaining = varp->xsz * nelems;
+#line 990
 	int status = NC_NOERR;
+#line 990
 	const void *xp;
+#line 990
 
+#line 990
 	if(nelems == 0)
+#line 990
 		return NC_NOERR;
+#line 990
 
+#line 990
 	assert(value != NULL);
+#line 990
 
+#line 990
 	for(;;)
+#line 990
 	{
+#line 990
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 990
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 990
 
+#line 990
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 990
 				 0, (void **)&xp);	/* cast away const */
+#line 990
 		if(lstatus != NC_NOERR)
+#line 990
 			return lstatus;
+#line 990
 
+#line 990
 		lstatus = ncx_getn_uint_int(&xp, nget, value);
+#line 990
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 990
 			status = lstatus;
+#line 990
 
+#line 990
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 990
 
+#line 990
 		remaining -= extent;
+#line 990
 		if(remaining == 0)
+#line 990
 			break; /* normal loop exit */
-		offset += extent;
+#line 990
+		offset += (off_t)extent;
+#line 990
 		value += nget;
+#line 990
 	}
+#line 990
 
+#line 990
 	return status;
+#line 990
 }
+#line 990
 
 static int
+#line 991
 getNCvx_uint_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 991
 		 const size_t *start, size_t nelems, float *value)
+#line 991
 {
+#line 991
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 991
 	size_t remaining = varp->xsz * nelems;
+#line 991
 	int status = NC_NOERR;
+#line 991
 	const void *xp;
+#line 991
 
+#line 991
 	if(nelems == 0)
+#line 991
 		return NC_NOERR;
+#line 991
 
+#line 991
 	assert(value != NULL);
+#line 991
 
+#line 991
 	for(;;)
+#line 991
 	{
+#line 991
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 991
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 991
 
+#line 991
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 991
 				 0, (void **)&xp);	/* cast away const */
+#line 991
 		if(lstatus != NC_NOERR)
+#line 991
 			return lstatus;
+#line 991
 
+#line 991
 		lstatus = ncx_getn_uint_float(&xp, nget, value);
+#line 991
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 991
 			status = lstatus;
+#line 991
 
+#line 991
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 991
 
+#line 991
 		remaining -= extent;
+#line 991
 		if(remaining == 0)
+#line 991
 			break; /* normal loop exit */
-		offset += extent;
+#line 991
+		offset += (off_t)extent;
+#line 991
 		value += nget;
+#line 991
 	}
+#line 991
 
+#line 991
 	return status;
+#line 991
 }
+#line 991
 
 static int
+#line 992
 getNCvx_uint_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 992
 		 const size_t *start, size_t nelems, double *value)
+#line 992
 {
+#line 992
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 992
 	size_t remaining = varp->xsz * nelems;
+#line 992
 	int status = NC_NOERR;
+#line 992
 	const void *xp;
+#line 992
 
+#line 992
 	if(nelems == 0)
+#line 992
 		return NC_NOERR;
+#line 992
 
+#line 992
 	assert(value != NULL);
+#line 992
 
+#line 992
 	for(;;)
+#line 992
 	{
+#line 992
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 992
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 992
 
+#line 992
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 992
 				 0, (void **)&xp);	/* cast away const */
+#line 992
 		if(lstatus != NC_NOERR)
+#line 992
 			return lstatus;
+#line 992
 
+#line 992
 		lstatus = ncx_getn_uint_double(&xp, nget, value);
+#line 992
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 992
 			status = lstatus;
+#line 992
 
+#line 992
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 992
 
+#line 992
 		remaining -= extent;
+#line 992
 		if(remaining == 0)
+#line 992
 			break; /* normal loop exit */
-		offset += extent;
+#line 992
+		offset += (off_t)extent;
+#line 992
 		value += nget;
+#line 992
 	}
+#line 992
 
+#line 992
 	return status;
+#line 992
 }
+#line 992
 
 static int
+#line 993
 getNCvx_uint_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 993
 		 const size_t *start, size_t nelems, longlong *value)
+#line 993
 {
+#line 993
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 993
 	size_t remaining = varp->xsz * nelems;
+#line 993
 	int status = NC_NOERR;
+#line 993
 	const void *xp;
+#line 993
 
+#line 993
 	if(nelems == 0)
+#line 993
 		return NC_NOERR;
+#line 993
 
+#line 993
 	assert(value != NULL);
+#line 993
 
+#line 993
 	for(;;)
+#line 993
 	{
+#line 993
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 993
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 993
 
+#line 993
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 993
 				 0, (void **)&xp);	/* cast away const */
+#line 993
 		if(lstatus != NC_NOERR)
+#line 993
 			return lstatus;
+#line 993
 
+#line 993
 		lstatus = ncx_getn_uint_longlong(&xp, nget, value);
+#line 993
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 993
 			status = lstatus;
+#line 993
 
+#line 993
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 993
 
+#line 993
 		remaining -= extent;
+#line 993
 		if(remaining == 0)
+#line 993
 			break; /* normal loop exit */
-		offset += extent;
+#line 993
+		offset += (off_t)extent;
+#line 993
 		value += nget;
+#line 993
 	}
+#line 993
 
+#line 993
 	return status;
+#line 993
 }
+#line 993
 
 static int
+#line 994
 getNCvx_uint_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 994
 		 const size_t *start, size_t nelems, uint *value)
+#line 994
 {
+#line 994
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 994
 	size_t remaining = varp->xsz * nelems;
+#line 994
 	int status = NC_NOERR;
+#line 994
 	const void *xp;
+#line 994
 
+#line 994
 	if(nelems == 0)
+#line 994
 		return NC_NOERR;
+#line 994
 
+#line 994
 	assert(value != NULL);
+#line 994
 
+#line 994
 	for(;;)
+#line 994
 	{
+#line 994
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 994
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 994
 
+#line 994
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 994
 				 0, (void **)&xp);	/* cast away const */
+#line 994
 		if(lstatus != NC_NOERR)
+#line 994
 			return lstatus;
+#line 994
 
+#line 994
 		lstatus = ncx_getn_uint_uint(&xp, nget, value);
+#line 994
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 994
 			status = lstatus;
+#line 994
 
+#line 994
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 994
 
+#line 994
 		remaining -= extent;
+#line 994
 		if(remaining == 0)
+#line 994
 			break; /* normal loop exit */
-		offset += extent;
+#line 994
+		offset += (off_t)extent;
+#line 994
 		value += nget;
+#line 994
 	}
+#line 994
 
+#line 994
 	return status;
+#line 994
 }
+#line 994
 
 static int
+#line 995
 getNCvx_uint_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 995
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 995
 {
+#line 995
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 995
 	size_t remaining = varp->xsz * nelems;
+#line 995
 	int status = NC_NOERR;
+#line 995
 	const void *xp;
+#line 995
 
+#line 995
 	if(nelems == 0)
+#line 995
 		return NC_NOERR;
+#line 995
 
+#line 995
 	assert(value != NULL);
+#line 995
 
+#line 995
 	for(;;)
+#line 995
 	{
+#line 995
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 995
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 995
 
+#line 995
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 995
 				 0, (void **)&xp);	/* cast away const */
+#line 995
 		if(lstatus != NC_NOERR)
+#line 995
 			return lstatus;
+#line 995
 
+#line 995
 		lstatus = ncx_getn_uint_ulonglong(&xp, nget, value);
+#line 995
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 995
 			status = lstatus;
+#line 995
 
+#line 995
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 995
 
+#line 995
 		remaining -= extent;
+#line 995
 		if(remaining == 0)
+#line 995
 			break; /* normal loop exit */
-		offset += extent;
+#line 995
+		offset += (off_t)extent;
+#line 995
 		value += nget;
+#line 995
 	}
+#line 995
 
+#line 995
 	return status;
+#line 995
 }
+#line 995
 
 static int
+#line 996
 getNCvx_uint_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 996
 		 const size_t *start, size_t nelems, ushort *value)
+#line 996
 {
+#line 996
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 996
 	size_t remaining = varp->xsz * nelems;
+#line 996
 	int status = NC_NOERR;
+#line 996
 	const void *xp;
+#line 996
 
+#line 996
 	if(nelems == 0)
+#line 996
 		return NC_NOERR;
+#line 996
 
+#line 996
 	assert(value != NULL);
+#line 996
 
+#line 996
 	for(;;)
+#line 996
 	{
+#line 996
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 996
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 996
 
+#line 996
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 996
 				 0, (void **)&xp);	/* cast away const */
+#line 996
 		if(lstatus != NC_NOERR)
+#line 996
 			return lstatus;
+#line 996
 
+#line 996
 		lstatus = ncx_getn_uint_ushort(&xp, nget, value);
+#line 996
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 996
 			status = lstatus;
+#line 996
 
+#line 996
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 996
 
+#line 996
 		remaining -= extent;
+#line 996
 		if(remaining == 0)
+#line 996
 			break; /* normal loop exit */
-		offset += extent;
+#line 996
+		offset += (off_t)extent;
+#line 996
 		value += nget;
+#line 996
 	}
+#line 996
 
+#line 996
 	return status;
+#line 996
 }
+#line 996
 
 
 static int
+#line 998
 getNCvx_longlong_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 998
 		 const size_t *start, size_t nelems, schar *value)
+#line 998
 {
+#line 998
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 998
 	size_t remaining = varp->xsz * nelems;
+#line 998
 	int status = NC_NOERR;
+#line 998
 	const void *xp;
+#line 998
 
+#line 998
 	if(nelems == 0)
+#line 998
 		return NC_NOERR;
+#line 998
 
+#line 998
 	assert(value != NULL);
+#line 998
 
+#line 998
 	for(;;)
+#line 998
 	{
+#line 998
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 998
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 998
 
+#line 998
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 998
 				 0, (void **)&xp);	/* cast away const */
+#line 998
 		if(lstatus != NC_NOERR)
+#line 998
 			return lstatus;
+#line 998
 
+#line 998
 		lstatus = ncx_getn_longlong_schar(&xp, nget, value);
+#line 998
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 998
 			status = lstatus;
+#line 998
 
+#line 998
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 998
 
+#line 998
 		remaining -= extent;
+#line 998
 		if(remaining == 0)
+#line 998
 			break; /* normal loop exit */
-		offset += extent;
+#line 998
+		offset += (off_t)extent;
+#line 998
 		value += nget;
+#line 998
 	}
+#line 998
 
+#line 998
 	return status;
+#line 998
 }
+#line 998
 
 static int
+#line 999
 getNCvx_longlong_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 999
 		 const size_t *start, size_t nelems, uchar *value)
+#line 999
 {
+#line 999
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 999
 	size_t remaining = varp->xsz * nelems;
+#line 999
 	int status = NC_NOERR;
+#line 999
 	const void *xp;
+#line 999
 
+#line 999
 	if(nelems == 0)
+#line 999
 		return NC_NOERR;
+#line 999
 
+#line 999
 	assert(value != NULL);
+#line 999
 
+#line 999
 	for(;;)
+#line 999
 	{
+#line 999
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 999
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 999
 
+#line 999
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 999
 				 0, (void **)&xp);	/* cast away const */
+#line 999
 		if(lstatus != NC_NOERR)
+#line 999
 			return lstatus;
+#line 999
 
+#line 999
 		lstatus = ncx_getn_longlong_uchar(&xp, nget, value);
+#line 999
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 999
 			status = lstatus;
+#line 999
 
+#line 999
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 999
 
+#line 999
 		remaining -= extent;
+#line 999
 		if(remaining == 0)
+#line 999
 			break; /* normal loop exit */
-		offset += extent;
+#line 999
+		offset += (off_t)extent;
+#line 999
 		value += nget;
+#line 999
 	}
+#line 999
 
+#line 999
 	return status;
+#line 999
 }
+#line 999
 
 static int
+#line 1000
 getNCvx_longlong_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 1000
 		 const size_t *start, size_t nelems, short *value)
+#line 1000
 {
+#line 1000
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1000
 	size_t remaining = varp->xsz * nelems;
+#line 1000
 	int status = NC_NOERR;
+#line 1000
 	const void *xp;
+#line 1000
 
+#line 1000
 	if(nelems == 0)
+#line 1000
 		return NC_NOERR;
+#line 1000
 
+#line 1000
 	assert(value != NULL);
+#line 1000
 
+#line 1000
 	for(;;)
+#line 1000
 	{
+#line 1000
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1000
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1000
 
+#line 1000
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1000
 				 0, (void **)&xp);	/* cast away const */
+#line 1000
 		if(lstatus != NC_NOERR)
+#line 1000
 			return lstatus;
+#line 1000
 
+#line 1000
 		lstatus = ncx_getn_longlong_short(&xp, nget, value);
+#line 1000
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1000
 			status = lstatus;
+#line 1000
 
+#line 1000
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1000
 
+#line 1000
 		remaining -= extent;
+#line 1000
 		if(remaining == 0)
+#line 1000
 			break; /* normal loop exit */
-		offset += extent;
+#line 1000
+		offset += (off_t)extent;
+#line 1000
 		value += nget;
+#line 1000
 	}
+#line 1000
 
+#line 1000
 	return status;
+#line 1000
 }
+#line 1000
 
 static int
+#line 1001
 getNCvx_longlong_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 1001
 		 const size_t *start, size_t nelems, int *value)
+#line 1001
 {
+#line 1001
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1001
 	size_t remaining = varp->xsz * nelems;
+#line 1001
 	int status = NC_NOERR;
+#line 1001
 	const void *xp;
+#line 1001
 
+#line 1001
 	if(nelems == 0)
+#line 1001
 		return NC_NOERR;
+#line 1001
 
+#line 1001
 	assert(value != NULL);
+#line 1001
 
+#line 1001
 	for(;;)
+#line 1001
 	{
+#line 1001
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1001
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1001
 
+#line 1001
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1001
 				 0, (void **)&xp);	/* cast away const */
+#line 1001
 		if(lstatus != NC_NOERR)
+#line 1001
 			return lstatus;
+#line 1001
 
+#line 1001
 		lstatus = ncx_getn_longlong_int(&xp, nget, value);
+#line 1001
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1001
 			status = lstatus;
+#line 1001
 
+#line 1001
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1001
 
+#line 1001
 		remaining -= extent;
+#line 1001
 		if(remaining == 0)
+#line 1001
 			break; /* normal loop exit */
-		offset += extent;
+#line 1001
+		offset += (off_t)extent;
+#line 1001
 		value += nget;
+#line 1001
 	}
+#line 1001
 
+#line 1001
 	return status;
+#line 1001
 }
+#line 1001
 
 static int
+#line 1002
 getNCvx_longlong_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 1002
 		 const size_t *start, size_t nelems, float *value)
+#line 1002
 {
+#line 1002
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1002
 	size_t remaining = varp->xsz * nelems;
+#line 1002
 	int status = NC_NOERR;
+#line 1002
 	const void *xp;
+#line 1002
 
+#line 1002
 	if(nelems == 0)
+#line 1002
 		return NC_NOERR;
+#line 1002
 
+#line 1002
 	assert(value != NULL);
+#line 1002
 
+#line 1002
 	for(;;)
+#line 1002
 	{
+#line 1002
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1002
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1002
 
+#line 1002
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1002
 				 0, (void **)&xp);	/* cast away const */
+#line 1002
 		if(lstatus != NC_NOERR)
+#line 1002
 			return lstatus;
+#line 1002
 
+#line 1002
 		lstatus = ncx_getn_longlong_float(&xp, nget, value);
+#line 1002
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1002
 			status = lstatus;
+#line 1002
 
+#line 1002
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1002
 
+#line 1002
 		remaining -= extent;
+#line 1002
 		if(remaining == 0)
+#line 1002
 			break; /* normal loop exit */
-		offset += extent;
+#line 1002
+		offset += (off_t)extent;
+#line 1002
 		value += nget;
+#line 1002
 	}
+#line 1002
 
+#line 1002
 	return status;
+#line 1002
 }
+#line 1002
 
 static int
+#line 1003
 getNCvx_longlong_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 1003
 		 const size_t *start, size_t nelems, double *value)
+#line 1003
 {
+#line 1003
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1003
 	size_t remaining = varp->xsz * nelems;
+#line 1003
 	int status = NC_NOERR;
+#line 1003
 	const void *xp;
+#line 1003
 
+#line 1003
 	if(nelems == 0)
+#line 1003
 		return NC_NOERR;
+#line 1003
 
+#line 1003
 	assert(value != NULL);
+#line 1003
 
+#line 1003
 	for(;;)
+#line 1003
 	{
+#line 1003
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1003
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1003
 
+#line 1003
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1003
 				 0, (void **)&xp);	/* cast away const */
+#line 1003
 		if(lstatus != NC_NOERR)
+#line 1003
 			return lstatus;
+#line 1003
 
+#line 1003
 		lstatus = ncx_getn_longlong_double(&xp, nget, value);
+#line 1003
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1003
 			status = lstatus;
+#line 1003
 
+#line 1003
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1003
 
+#line 1003
 		remaining -= extent;
+#line 1003
 		if(remaining == 0)
+#line 1003
 			break; /* normal loop exit */
-		offset += extent;
+#line 1003
+		offset += (off_t)extent;
+#line 1003
 		value += nget;
+#line 1003
 	}
+#line 1003
 
+#line 1003
 	return status;
+#line 1003
 }
+#line 1003
 
 static int
+#line 1004
 getNCvx_longlong_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 1004
 		 const size_t *start, size_t nelems, longlong *value)
+#line 1004
 {
+#line 1004
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1004
 	size_t remaining = varp->xsz * nelems;
+#line 1004
 	int status = NC_NOERR;
+#line 1004
 	const void *xp;
+#line 1004
 
+#line 1004
 	if(nelems == 0)
+#line 1004
 		return NC_NOERR;
+#line 1004
 
+#line 1004
 	assert(value != NULL);
+#line 1004
 
+#line 1004
 	for(;;)
+#line 1004
 	{
+#line 1004
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1004
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1004
 
+#line 1004
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1004
 				 0, (void **)&xp);	/* cast away const */
+#line 1004
 		if(lstatus != NC_NOERR)
+#line 1004
 			return lstatus;
+#line 1004
 
+#line 1004
 		lstatus = ncx_getn_longlong_longlong(&xp, nget, value);
+#line 1004
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1004
 			status = lstatus;
+#line 1004
 
+#line 1004
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1004
 
+#line 1004
 		remaining -= extent;
+#line 1004
 		if(remaining == 0)
+#line 1004
 			break; /* normal loop exit */
-		offset += extent;
+#line 1004
+		offset += (off_t)extent;
+#line 1004
 		value += nget;
+#line 1004
 	}
+#line 1004
 
+#line 1004
 	return status;
+#line 1004
 }
+#line 1004
 
 static int
+#line 1005
 getNCvx_longlong_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 1005
 		 const size_t *start, size_t nelems, uint *value)
+#line 1005
 {
+#line 1005
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1005
 	size_t remaining = varp->xsz * nelems;
+#line 1005
 	int status = NC_NOERR;
+#line 1005
 	const void *xp;
+#line 1005
 
+#line 1005
 	if(nelems == 0)
+#line 1005
 		return NC_NOERR;
+#line 1005
 
+#line 1005
 	assert(value != NULL);
+#line 1005
 
+#line 1005
 	for(;;)
+#line 1005
 	{
+#line 1005
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1005
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1005
 
+#line 1005
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1005
 				 0, (void **)&xp);	/* cast away const */
+#line 1005
 		if(lstatus != NC_NOERR)
+#line 1005
 			return lstatus;
+#line 1005
 
+#line 1005
 		lstatus = ncx_getn_longlong_uint(&xp, nget, value);
+#line 1005
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1005
 			status = lstatus;
+#line 1005
 
+#line 1005
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1005
 
+#line 1005
 		remaining -= extent;
+#line 1005
 		if(remaining == 0)
+#line 1005
 			break; /* normal loop exit */
-		offset += extent;
+#line 1005
+		offset += (off_t)extent;
+#line 1005
 		value += nget;
+#line 1005
 	}
+#line 1005
 
+#line 1005
 	return status;
+#line 1005
 }
+#line 1005
 
 static int
+#line 1006
 getNCvx_longlong_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 1006
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 1006
 {
+#line 1006
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1006
 	size_t remaining = varp->xsz * nelems;
+#line 1006
 	int status = NC_NOERR;
+#line 1006
 	const void *xp;
+#line 1006
 
+#line 1006
 	if(nelems == 0)
+#line 1006
 		return NC_NOERR;
+#line 1006
 
+#line 1006
 	assert(value != NULL);
+#line 1006
 
+#line 1006
 	for(;;)
+#line 1006
 	{
+#line 1006
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1006
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1006
 
+#line 1006
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1006
 				 0, (void **)&xp);	/* cast away const */
+#line 1006
 		if(lstatus != NC_NOERR)
+#line 1006
 			return lstatus;
+#line 1006
 
+#line 1006
 		lstatus = ncx_getn_longlong_ulonglong(&xp, nget, value);
+#line 1006
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1006
 			status = lstatus;
+#line 1006
 
+#line 1006
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1006
 
+#line 1006
 		remaining -= extent;
+#line 1006
 		if(remaining == 0)
+#line 1006
 			break; /* normal loop exit */
-		offset += extent;
+#line 1006
+		offset += (off_t)extent;
+#line 1006
 		value += nget;
+#line 1006
 	}
+#line 1006
 
+#line 1006
 	return status;
+#line 1006
 }
+#line 1006
 
 static int
+#line 1007
 getNCvx_longlong_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 1007
 		 const size_t *start, size_t nelems, ushort *value)
+#line 1007
 {
+#line 1007
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1007
 	size_t remaining = varp->xsz * nelems;
+#line 1007
 	int status = NC_NOERR;
+#line 1007
 	const void *xp;
+#line 1007
 
+#line 1007
 	if(nelems == 0)
+#line 1007
 		return NC_NOERR;
+#line 1007
 
+#line 1007
 	assert(value != NULL);
+#line 1007
 
+#line 1007
 	for(;;)
+#line 1007
 	{
+#line 1007
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1007
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1007
 
+#line 1007
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1007
 				 0, (void **)&xp);	/* cast away const */
+#line 1007
 		if(lstatus != NC_NOERR)
+#line 1007
 			return lstatus;
+#line 1007
 
+#line 1007
 		lstatus = ncx_getn_longlong_ushort(&xp, nget, value);
+#line 1007
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1007
 			status = lstatus;
+#line 1007
 
+#line 1007
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1007
 
+#line 1007
 		remaining -= extent;
+#line 1007
 		if(remaining == 0)
+#line 1007
 			break; /* normal loop exit */
-		offset += extent;
+#line 1007
+		offset += (off_t)extent;
+#line 1007
 		value += nget;
+#line 1007
 	}
+#line 1007
 
+#line 1007
 	return status;
+#line 1007
 }
+#line 1007
 
 
 static int
+#line 1009
 getNCvx_ulonglong_schar(const NC3_INFO* ncp, const NC_var *varp,
+#line 1009
 		 const size_t *start, size_t nelems, schar *value)
+#line 1009
 {
+#line 1009
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1009
 	size_t remaining = varp->xsz * nelems;
+#line 1009
 	int status = NC_NOERR;
+#line 1009
 	const void *xp;
+#line 1009
 
+#line 1009
 	if(nelems == 0)
+#line 1009
 		return NC_NOERR;
+#line 1009
 
+#line 1009
 	assert(value != NULL);
+#line 1009
 
+#line 1009
 	for(;;)
+#line 1009
 	{
+#line 1009
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1009
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1009
 
+#line 1009
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1009
 				 0, (void **)&xp);	/* cast away const */
+#line 1009
 		if(lstatus != NC_NOERR)
+#line 1009
 			return lstatus;
+#line 1009
 
+#line 1009
 		lstatus = ncx_getn_ulonglong_schar(&xp, nget, value);
+#line 1009
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1009
 			status = lstatus;
+#line 1009
 
+#line 1009
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1009
 
+#line 1009
 		remaining -= extent;
+#line 1009
 		if(remaining == 0)
+#line 1009
 			break; /* normal loop exit */
-		offset += extent;
+#line 1009
+		offset += (off_t)extent;
+#line 1009
 		value += nget;
+#line 1009
 	}
+#line 1009
 
+#line 1009
 	return status;
+#line 1009
 }
+#line 1009
 
 static int
+#line 1010
 getNCvx_ulonglong_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 1010
 		 const size_t *start, size_t nelems, uchar *value)
+#line 1010
 {
+#line 1010
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1010
 	size_t remaining = varp->xsz * nelems;
+#line 1010
 	int status = NC_NOERR;
+#line 1010
 	const void *xp;
+#line 1010
 
+#line 1010
 	if(nelems == 0)
+#line 1010
 		return NC_NOERR;
+#line 1010
 
+#line 1010
 	assert(value != NULL);
+#line 1010
 
+#line 1010
 	for(;;)
+#line 1010
 	{
+#line 1010
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1010
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1010
 
+#line 1010
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1010
 				 0, (void **)&xp);	/* cast away const */
+#line 1010
 		if(lstatus != NC_NOERR)
+#line 1010
 			return lstatus;
+#line 1010
 
+#line 1010
 		lstatus = ncx_getn_ulonglong_uchar(&xp, nget, value);
+#line 1010
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1010
 			status = lstatus;
+#line 1010
 
+#line 1010
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1010
 
+#line 1010
 		remaining -= extent;
+#line 1010
 		if(remaining == 0)
+#line 1010
 			break; /* normal loop exit */
-		offset += extent;
+#line 1010
+		offset += (off_t)extent;
+#line 1010
 		value += nget;
+#line 1010
 	}
+#line 1010
 
+#line 1010
 	return status;
+#line 1010
 }
+#line 1010
 
 static int
+#line 1011
 getNCvx_ulonglong_short(const NC3_INFO* ncp, const NC_var *varp,
+#line 1011
 		 const size_t *start, size_t nelems, short *value)
+#line 1011
 {
+#line 1011
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1011
 	size_t remaining = varp->xsz * nelems;
+#line 1011
 	int status = NC_NOERR;
+#line 1011
 	const void *xp;
+#line 1011
 
+#line 1011
 	if(nelems == 0)
+#line 1011
 		return NC_NOERR;
+#line 1011
 
+#line 1011
 	assert(value != NULL);
+#line 1011
 
+#line 1011
 	for(;;)
+#line 1011
 	{
+#line 1011
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1011
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1011
 
+#line 1011
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1011
 				 0, (void **)&xp);	/* cast away const */
+#line 1011
 		if(lstatus != NC_NOERR)
+#line 1011
 			return lstatus;
+#line 1011
 
+#line 1011
 		lstatus = ncx_getn_ulonglong_short(&xp, nget, value);
+#line 1011
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1011
 			status = lstatus;
+#line 1011
 
+#line 1011
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1011
 
+#line 1011
 		remaining -= extent;
+#line 1011
 		if(remaining == 0)
+#line 1011
 			break; /* normal loop exit */
-		offset += extent;
+#line 1011
+		offset += (off_t)extent;
+#line 1011
 		value += nget;
+#line 1011
 	}
+#line 1011
 
+#line 1011
 	return status;
+#line 1011
 }
+#line 1011
 
 static int
+#line 1012
 getNCvx_ulonglong_int(const NC3_INFO* ncp, const NC_var *varp,
+#line 1012
 		 const size_t *start, size_t nelems, int *value)
+#line 1012
 {
+#line 1012
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1012
 	size_t remaining = varp->xsz * nelems;
+#line 1012
 	int status = NC_NOERR;
+#line 1012
 	const void *xp;
+#line 1012
 
+#line 1012
 	if(nelems == 0)
+#line 1012
 		return NC_NOERR;
+#line 1012
 
+#line 1012
 	assert(value != NULL);
+#line 1012
 
+#line 1012
 	for(;;)
+#line 1012
 	{
+#line 1012
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1012
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1012
 
+#line 1012
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1012
 				 0, (void **)&xp);	/* cast away const */
+#line 1012
 		if(lstatus != NC_NOERR)
+#line 1012
 			return lstatus;
+#line 1012
 
+#line 1012
 		lstatus = ncx_getn_ulonglong_int(&xp, nget, value);
+#line 1012
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1012
 			status = lstatus;
+#line 1012
 
+#line 1012
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1012
 
+#line 1012
 		remaining -= extent;
+#line 1012
 		if(remaining == 0)
+#line 1012
 			break; /* normal loop exit */
-		offset += extent;
+#line 1012
+		offset += (off_t)extent;
+#line 1012
 		value += nget;
+#line 1012
 	}
+#line 1012
 
+#line 1012
 	return status;
+#line 1012
 }
+#line 1012
 
 static int
+#line 1013
 getNCvx_ulonglong_float(const NC3_INFO* ncp, const NC_var *varp,
+#line 1013
 		 const size_t *start, size_t nelems, float *value)
+#line 1013
 {
+#line 1013
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1013
 	size_t remaining = varp->xsz * nelems;
+#line 1013
 	int status = NC_NOERR;
+#line 1013
 	const void *xp;
+#line 1013
 
+#line 1013
 	if(nelems == 0)
+#line 1013
 		return NC_NOERR;
+#line 1013
 
+#line 1013
 	assert(value != NULL);
+#line 1013
 
+#line 1013
 	for(;;)
+#line 1013
 	{
+#line 1013
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1013
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1013
 
+#line 1013
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1013
 				 0, (void **)&xp);	/* cast away const */
+#line 1013
 		if(lstatus != NC_NOERR)
+#line 1013
 			return lstatus;
+#line 1013
 
+#line 1013
 		lstatus = ncx_getn_ulonglong_float(&xp, nget, value);
+#line 1013
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1013
 			status = lstatus;
+#line 1013
 
+#line 1013
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1013
 
+#line 1013
 		remaining -= extent;
+#line 1013
 		if(remaining == 0)
+#line 1013
 			break; /* normal loop exit */
-		offset += extent;
+#line 1013
+		offset += (off_t)extent;
+#line 1013
 		value += nget;
+#line 1013
 	}
+#line 1013
 
+#line 1013
 	return status;
+#line 1013
 }
+#line 1013
 
 static int
+#line 1014
 getNCvx_ulonglong_double(const NC3_INFO* ncp, const NC_var *varp,
+#line 1014
 		 const size_t *start, size_t nelems, double *value)
+#line 1014
 {
+#line 1014
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1014
 	size_t remaining = varp->xsz * nelems;
+#line 1014
 	int status = NC_NOERR;
+#line 1014
 	const void *xp;
+#line 1014
 
+#line 1014
 	if(nelems == 0)
+#line 1014
 		return NC_NOERR;
+#line 1014
 
+#line 1014
 	assert(value != NULL);
+#line 1014
 
+#line 1014
 	for(;;)
+#line 1014
 	{
+#line 1014
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1014
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1014
 
+#line 1014
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1014
 				 0, (void **)&xp);	/* cast away const */
+#line 1014
 		if(lstatus != NC_NOERR)
+#line 1014
 			return lstatus;
+#line 1014
 
+#line 1014
 		lstatus = ncx_getn_ulonglong_double(&xp, nget, value);
+#line 1014
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1014
 			status = lstatus;
+#line 1014
 
+#line 1014
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1014
 
+#line 1014
 		remaining -= extent;
+#line 1014
 		if(remaining == 0)
+#line 1014
 			break; /* normal loop exit */
-		offset += extent;
+#line 1014
+		offset += (off_t)extent;
+#line 1014
 		value += nget;
+#line 1014
 	}
+#line 1014
 
+#line 1014
 	return status;
+#line 1014
 }
+#line 1014
 
 static int
+#line 1015
 getNCvx_ulonglong_longlong(const NC3_INFO* ncp, const NC_var *varp,
+#line 1015
 		 const size_t *start, size_t nelems, longlong *value)
+#line 1015
 {
+#line 1015
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1015
 	size_t remaining = varp->xsz * nelems;
+#line 1015
 	int status = NC_NOERR;
+#line 1015
 	const void *xp;
+#line 1015
 
+#line 1015
 	if(nelems == 0)
+#line 1015
 		return NC_NOERR;
+#line 1015
 
+#line 1015
 	assert(value != NULL);
+#line 1015
 
+#line 1015
 	for(;;)
+#line 1015
 	{
+#line 1015
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1015
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1015
 
+#line 1015
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1015
 				 0, (void **)&xp);	/* cast away const */
+#line 1015
 		if(lstatus != NC_NOERR)
+#line 1015
 			return lstatus;
+#line 1015
 
+#line 1015
 		lstatus = ncx_getn_ulonglong_longlong(&xp, nget, value);
+#line 1015
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1015
 			status = lstatus;
+#line 1015
 
+#line 1015
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1015
 
+#line 1015
 		remaining -= extent;
+#line 1015
 		if(remaining == 0)
+#line 1015
 			break; /* normal loop exit */
-		offset += extent;
+#line 1015
+		offset += (off_t)extent;
+#line 1015
 		value += nget;
+#line 1015
 	}
+#line 1015
 
+#line 1015
 	return status;
+#line 1015
 }
+#line 1015
 
 static int
+#line 1016
 getNCvx_ulonglong_uint(const NC3_INFO* ncp, const NC_var *varp,
+#line 1016
 		 const size_t *start, size_t nelems, uint *value)
+#line 1016
 {
+#line 1016
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1016
 	size_t remaining = varp->xsz * nelems;
+#line 1016
 	int status = NC_NOERR;
+#line 1016
 	const void *xp;
+#line 1016
 
+#line 1016
 	if(nelems == 0)
+#line 1016
 		return NC_NOERR;
+#line 1016
 
+#line 1016
 	assert(value != NULL);
+#line 1016
 
+#line 1016
 	for(;;)
+#line 1016
 	{
+#line 1016
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1016
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1016
 
+#line 1016
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1016
 				 0, (void **)&xp);	/* cast away const */
+#line 1016
 		if(lstatus != NC_NOERR)
+#line 1016
 			return lstatus;
+#line 1016
 
+#line 1016
 		lstatus = ncx_getn_ulonglong_uint(&xp, nget, value);
+#line 1016
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1016
 			status = lstatus;
+#line 1016
 
+#line 1016
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1016
 
+#line 1016
 		remaining -= extent;
+#line 1016
 		if(remaining == 0)
+#line 1016
 			break; /* normal loop exit */
-		offset += extent;
+#line 1016
+		offset += (off_t)extent;
+#line 1016
 		value += nget;
+#line 1016
 	}
+#line 1016
 
+#line 1016
 	return status;
+#line 1016
 }
+#line 1016
 
 static int
+#line 1017
 getNCvx_ulonglong_ulonglong(const NC3_INFO* ncp, const NC_var *varp,
+#line 1017
 		 const size_t *start, size_t nelems, ulonglong *value)
+#line 1017
 {
+#line 1017
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1017
 	size_t remaining = varp->xsz * nelems;
+#line 1017
 	int status = NC_NOERR;
+#line 1017
 	const void *xp;
+#line 1017
 
+#line 1017
 	if(nelems == 0)
+#line 1017
 		return NC_NOERR;
+#line 1017
 
+#line 1017
 	assert(value != NULL);
+#line 1017
 
+#line 1017
 	for(;;)
+#line 1017
 	{
+#line 1017
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1017
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1017
 
+#line 1017
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1017
 				 0, (void **)&xp);	/* cast away const */
+#line 1017
 		if(lstatus != NC_NOERR)
+#line 1017
 			return lstatus;
+#line 1017
 
+#line 1017
 		lstatus = ncx_getn_ulonglong_ulonglong(&xp, nget, value);
+#line 1017
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1017
 			status = lstatus;
+#line 1017
 
+#line 1017
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1017
 
+#line 1017
 		remaining -= extent;
+#line 1017
 		if(remaining == 0)
+#line 1017
 			break; /* normal loop exit */
-		offset += extent;
+#line 1017
+		offset += (off_t)extent;
+#line 1017
 		value += nget;
+#line 1017
 	}
+#line 1017
 
+#line 1017
 	return status;
+#line 1017
 }
+#line 1017
 
 static int
+#line 1018
 getNCvx_ulonglong_ushort(const NC3_INFO* ncp, const NC_var *varp,
+#line 1018
 		 const size_t *start, size_t nelems, ushort *value)
+#line 1018
 {
+#line 1018
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1018
 	size_t remaining = varp->xsz * nelems;
+#line 1018
 	int status = NC_NOERR;
+#line 1018
 	const void *xp;
+#line 1018
 
+#line 1018
 	if(nelems == 0)
+#line 1018
 		return NC_NOERR;
+#line 1018
 
+#line 1018
 	assert(value != NULL);
+#line 1018
 
+#line 1018
 	for(;;)
+#line 1018
 	{
+#line 1018
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1018
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1018
 
+#line 1018
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1018
 				 0, (void **)&xp);	/* cast away const */
+#line 1018
 		if(lstatus != NC_NOERR)
+#line 1018
 			return lstatus;
+#line 1018
 
+#line 1018
 		lstatus = ncx_getn_ulonglong_ushort(&xp, nget, value);
+#line 1018
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1018
 			status = lstatus;
+#line 1018
 
+#line 1018
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1018
 
+#line 1018
 		remaining -= extent;
+#line 1018
 		if(remaining == 0)
+#line 1018
 			break; /* normal loop exit */
-		offset += extent;
+#line 1018
+		offset += (off_t)extent;
+#line 1018
 		value += nget;
+#line 1018
 	}
+#line 1018
 
+#line 1018
 	return status;
+#line 1018
 }
+#line 1018
 
 
+#line 1021
 #ifdef NOTUSED
 static int
+#line 1022
 getNCvx_schar_uchar(const NC3_INFO* ncp, const NC_var *varp,
+#line 1022
 		 const size_t *start, size_t nelems, uchar *value)
+#line 1022
 {
+#line 1022
 	off_t offset = NC_varoffset(ncp, varp, start);
+#line 1022
 	size_t remaining = varp->xsz * nelems;
+#line 1022
 	int status = NC_NOERR;
+#line 1022
 	const void *xp;
+#line 1022
 
+#line 1022
 	if(nelems == 0)
+#line 1022
 		return NC_NOERR;
+#line 1022
 
+#line 1022
 	assert(value != NULL);
+#line 1022
 
+#line 1022
 	for(;;)
+#line 1022
 	{
+#line 1022
 		size_t extent = MIN(remaining, ncp->chunk);
+#line 1022
 		size_t nget = ncx_howmany(varp->type, extent);
+#line 1022
 
+#line 1022
 		int lstatus = ncio_get(ncp->nciop, offset, extent,
+#line 1022
 				 0, (void **)&xp);	/* cast away const */
+#line 1022
 		if(lstatus != NC_NOERR)
+#line 1022
 			return lstatus;
+#line 1022
 
+#line 1022
 		lstatus = ncx_getn_schar_uchar(&xp, nget, value);
+#line 1022
 		if(lstatus != NC_NOERR && status == NC_NOERR)
+#line 1022
 			status = lstatus;
+#line 1022
 
+#line 1022
 		(void) ncio_rel(ncp->nciop, offset, 0);
+#line 1022
 
+#line 1022
 		remaining -= extent;
+#line 1022
 		if(remaining == 0)
+#line 1022
 			break; /* normal loop exit */
-		offset += extent;
+#line 1022
+		offset += (off_t)extent;
+#line 1022
 		value += nget;
+#line 1022
 	}
+#line 1022
 
+#line 1022
 	return status;
+#line 1022
 }
+#line 1022
 
 #endif /*NOTUSED*/
 
@@ -9651,6 +19341,7 @@ odo1(const size_t *const start, const size_t *const upper,
 #endif
 
 
+#line 1184
 
 /* Define a macro to allow hash on two type values */
 #define CASE(nc1,nc2) (nc1*256+nc2)
@@ -9671,10 +19362,14 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 #endif
     break;
     case CASE(NC_BYTE,NC_BYTE):
-        return getNCvx_schar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_schar_schar(ncp,varp,start,nelems, (schar*)value);
 	break;
     case CASE(NC_BYTE,NC_UBYTE):
-        return getNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        if (fIsSet(ncp->flags,NC_64BIT_DATA))
+            return getNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        else
+            /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+            return getNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_BYTE,NC_SHORT):
         return getNCvx_schar_short(ncp,varp,start,nelems,(short*)value);
@@ -9701,7 +19396,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return getNCvx_schar_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_SHORT,NC_BYTE):
-        return getNCvx_short_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_short_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_SHORT,NC_UBYTE):
         return getNCvx_short_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9732,7 +19427,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_INT,NC_BYTE):
-        return getNCvx_int_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_int_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT,NC_UBYTE):
         return getNCvx_int_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9763,7 +19458,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_FLOAT,NC_BYTE):
-        return getNCvx_float_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_float_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_FLOAT,NC_UBYTE):
         return getNCvx_float_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9794,7 +19489,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_DOUBLE,NC_BYTE):
-        return getNCvx_double_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_double_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_DOUBLE,NC_UBYTE):
         return getNCvx_double_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9828,7 +19523,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return getNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_UBYTE,NC_BYTE):
-        return getNCvx_uchar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_uchar_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UBYTE,NC_SHORT):
         return getNCvx_uchar_short(ncp,varp,start,nelems,(short*)value);
@@ -9856,7 +19551,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_USHORT,NC_BYTE):
-        return getNCvx_ushort_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_ushort_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_USHORT,NC_UBYTE):
         return getNCvx_ushort_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9887,7 +19582,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_UINT,NC_BYTE):
-        return getNCvx_uint_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_uint_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT,NC_UBYTE):
         return getNCvx_uint_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9918,7 +19613,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_INT64,NC_BYTE):
-        return getNCvx_longlong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_longlong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT64,NC_UBYTE):
         return getNCvx_longlong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9949,7 +19644,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_UINT64,NC_BYTE):
-        return getNCvx_ulonglong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_ulonglong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT64,NC_UBYTE):
         return getNCvx_ulonglong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -9999,10 +19694,14 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_char_char(ncp,varp,start,nelems,(char*)value);
 	break;
     case CASE(NC_BYTE,NC_BYTE):
-        return putNCvx_schar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_schar_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_BYTE,NC_UBYTE):
-        return putNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        if (fIsSet(ncp->flags,NC_64BIT_DATA))
+            return putNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        else
+            /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+            return putNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_BYTE,NC_SHORT):
         return putNCvx_schar_short(ncp,varp,start,nelems,(short*)value);
@@ -10029,7 +19728,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_schar_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_SHORT,NC_BYTE):
-        return putNCvx_short_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_short_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_SHORT,NC_UBYTE):
         return putNCvx_short_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -10059,7 +19758,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_short_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_INT,NC_BYTE):
-        return putNCvx_int_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_int_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT,NC_UBYTE):
         return putNCvx_int_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -10089,7 +19788,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_int_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_FLOAT,NC_BYTE):
-        return putNCvx_float_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_float_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_FLOAT,NC_UBYTE):
         return putNCvx_float_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -10119,7 +19818,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_float_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_DOUBLE,NC_BYTE):
-        return putNCvx_double_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_double_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_DOUBLE,NC_UBYTE):
         return putNCvx_double_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -10152,7 +19851,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_UBYTE,NC_BYTE):
-        return putNCvx_uchar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_uchar_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UBYTE,NC_SHORT):
         return putNCvx_uchar_short(ncp,varp,start,nelems,(short*)value);
@@ -10179,7 +19878,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_uchar_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_USHORT,NC_BYTE):
-        return putNCvx_ushort_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_ushort_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_USHORT,NC_UBYTE):
         return putNCvx_ushort_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -10209,7 +19908,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_ushort_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_UINT,NC_BYTE):
-        return putNCvx_uint_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_uint_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT,NC_UBYTE):
         return putNCvx_uint_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -10239,7 +19938,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_uint_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_INT64,NC_BYTE):
-        return putNCvx_longlong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_longlong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT64,NC_UBYTE):
         return putNCvx_longlong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -10269,7 +19968,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_longlong_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_UINT64,NC_BYTE):
-        return putNCvx_ulonglong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_ulonglong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT64,NC_UBYTE):
         return putNCvx_ulonglong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
diff --git a/libsrc/putget.m4 b/libsrc/putget.m4
index e351744..bf37fb0 100644
--- a/libsrc/putget.m4
+++ b/libsrc/putget.m4
@@ -14,12 +14,16 @@ dnl
  */
 /* $Id: putget.m4 2783 2014-10-26 05:19:35Z wkliao $ */
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <string.h>
 #include <stdlib.h>
 #include <assert.h>
 
 #include "netcdf.h"
+#include "nc3dispatch.h"
 #include "nc3internal.h"
 #include "ncx.h"
 #include "fbits.h"
@@ -30,7 +34,6 @@ dnl
 #    include <stdio.h>
 #  endif
 #endif
-#include "nc3dispatch.h"
 
 
 #undef MIN  /* system may define MIN somewhere and complain */
@@ -101,7 +104,7 @@ NC_fill_$2(
 			*vp++ = $4;
 		}
 	}
-	return ncx_putn_$2_$1(xpp, nelems, fillp);
+	return ncx_putn_$2_$1(xpp, nelems, fillp ifelse(`$1',`char',,`,NULL'));
 }
 ')dnl
 
@@ -541,7 +544,11 @@ NCcoordck(NC3_INFO* ncp, const NC_var *varp, const size_t *coord)
 	{
 		if(*coord > X_UINT_MAX) /* rkr: bug fix from previous X_INT_MAX */
 			return NC_EINVALCOORDS; /* sanity check */
+#ifdef RELAX_COORD_BOUND
+		if(NC_readonly(ncp) && *coord > NC_get_numrecs(ncp))
+#else
 		if(NC_readonly(ncp) && *coord >= NC_get_numrecs(ncp))
+#endif
 		{
 			if(!NC_doNsync(ncp))
 				return NC_EINVALCOORDS;
@@ -551,7 +558,11 @@ NCcoordck(NC3_INFO* ncp, const NC_var *varp, const size_t *coord)
 				const int status = read_numrecs(ncp);
 				if(status != NC_NOERR)
 					return status;
+#ifdef RELAX_COORD_BOUND
+				if(*coord > NC_get_numrecs(ncp))
+#else
 				if(*coord >= NC_get_numrecs(ncp))
+#endif
 					return NC_EINVALCOORDS;
 			}
 		}
@@ -578,7 +589,11 @@ fprintf(stderr,"	NCcoordck: ip %p, *ip %ld, up %p, *up %lu\n",
 #endif /* CDEBUG */
 
 		/* cast needed for braindead systems with signed size_t */
+#ifdef RELAX_COORD_BOUND
+		if((unsigned long) *ip > (unsigned long) *up )
+#else
 		if((unsigned long) *ip >= (unsigned long) *up )
+#endif
 			return NC_EINVALCOORDS;
 	}
 
@@ -602,6 +617,11 @@ NCedgeck(const NC3_INFO* ncp, const NC_var *varp,
 
 	if(IS_RECVAR(varp))
 	{
+#ifdef RELAX_COORD_BOUND
+		if (NC_readonly(ncp) &&
+                    (start[0] == NC_get_numrecs(ncp) && edges[0] > 0))
+			return(NC_EINVALCOORDS);
+#endif
 		start++;
 		edges++;
 		shp++;
@@ -609,6 +629,10 @@ NCedgeck(const NC3_INFO* ncp, const NC_var *varp,
 
 	for(; start < end; start++, edges++, shp++)
 	{
+#ifdef RELAX_COORD_BOUND
+		if ((unsigned long) *start == *shp && *edges > 0)
+			return(NC_EINVALCOORDS);
+#endif
 		/* cast needed for braindead systems with signed size_t */
 		if((unsigned long) *edges > *shp ||
 			(unsigned long) *start + (unsigned long) *edges > *shp)
@@ -680,12 +704,16 @@ putNCvx_$1_$2(NC3_INFO* ncp, const NC_var *varp,
 	size_t remaining = varp->xsz * nelems;
 	int status = NC_NOERR;
 	void *xp;
+        void *fillp;
 
 	if(nelems == 0)
 		return NC_NOERR;
 
 	assert(value != NULL);
 
+        fillp = malloc(varp->xsz);
+	status = NC3_inq_var_fill(varp, fillp);
+
 	for(;;)
 	{
 		size_t extent = MIN(remaining, ncp->chunk);
@@ -696,7 +724,7 @@ putNCvx_$1_$2(NC3_INFO* ncp, const NC_var *varp,
 		if(lstatus != NC_NOERR)
 			return lstatus;
 
-		lstatus = ncx_putn_$1_$2(&xp, nput, value);
+		lstatus = ncx_putn_$1_$2(&xp, nput, value ifelse(`$1',`char',,`,fillp'));
 		if(lstatus != NC_NOERR && status == NC_NOERR)
 		{
 			/* not fatal to the loop */
@@ -709,10 +737,11 @@ putNCvx_$1_$2(NC3_INFO* ncp, const NC_var *varp,
 		remaining -= extent;
 		if(remaining == 0)
 			break; /* normal loop exit */
-		offset += extent;
+		offset += (off_t)extent;
 		value += nput;
 
 	}
+        free(fillp);
 
 	return status;
 }
@@ -868,7 +897,7 @@ getNCvx_$1_$2(const NC3_INFO* ncp, const NC_var *varp,
 		remaining -= extent;
 		if(remaining == 0)
 			break; /* normal loop exit */
-		offset += extent;
+		offset += (off_t)extent;
 		value += nget;
 	}
 
@@ -1172,10 +1201,14 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 #endif
     break;
     case CASE(NC_BYTE,NC_BYTE):
-        return getNCvx_schar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_schar_schar(ncp,varp,start,nelems, (schar*)value);
 	break;
     case CASE(NC_BYTE,NC_UBYTE):
-        return getNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        if (fIsSet(ncp->flags,NC_64BIT_DATA))
+            return getNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        else
+            /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+            return getNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_BYTE,NC_SHORT):
         return getNCvx_schar_short(ncp,varp,start,nelems,(short*)value);
@@ -1202,7 +1235,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return getNCvx_schar_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_SHORT,NC_BYTE):
-        return getNCvx_short_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_short_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_SHORT,NC_UBYTE):
         return getNCvx_short_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1233,7 +1266,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_INT,NC_BYTE):
-        return getNCvx_int_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_int_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT,NC_UBYTE):
         return getNCvx_int_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1264,7 +1297,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_FLOAT,NC_BYTE):
-        return getNCvx_float_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_float_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_FLOAT,NC_UBYTE):
         return getNCvx_float_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1295,7 +1328,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_DOUBLE,NC_BYTE):
-        return getNCvx_double_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_double_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_DOUBLE,NC_UBYTE):
         return getNCvx_double_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1329,7 +1362,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return getNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_UBYTE,NC_BYTE):
-        return getNCvx_uchar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_uchar_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UBYTE,NC_SHORT):
         return getNCvx_uchar_short(ncp,varp,start,nelems,(short*)value);
@@ -1357,7 +1390,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_USHORT,NC_BYTE):
-        return getNCvx_ushort_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_ushort_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_USHORT,NC_UBYTE):
         return getNCvx_ushort_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1388,7 +1421,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_UINT,NC_BYTE):
-        return getNCvx_uint_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_uint_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT,NC_UBYTE):
         return getNCvx_uint_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1419,7 +1452,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_INT64,NC_BYTE):
-        return getNCvx_longlong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_longlong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT64,NC_UBYTE):
         return getNCvx_longlong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1450,7 +1483,7 @@ readNCv(const NC3_INFO* ncp, const NC_var* varp, const size_t* start,
 	break;
 
     case CASE(NC_UINT64,NC_BYTE):
-        return getNCvx_ulonglong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return getNCvx_ulonglong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT64,NC_UBYTE):
         return getNCvx_ulonglong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1500,10 +1533,14 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_char_char(ncp,varp,start,nelems,(char*)value);
 	break;
     case CASE(NC_BYTE,NC_BYTE):
-        return putNCvx_schar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_schar_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_BYTE,NC_UBYTE):
-        return putNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        if (fIsSet(ncp->flags,NC_64BIT_DATA))
+            return putNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
+        else
+            /* for CDF-1 and CDF-2, NC_BYTE is treated the same type as uchar memtype */
+            return putNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_BYTE,NC_SHORT):
         return putNCvx_schar_short(ncp,varp,start,nelems,(short*)value);
@@ -1530,7 +1567,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_schar_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_SHORT,NC_BYTE):
-        return putNCvx_short_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_short_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_SHORT,NC_UBYTE):
         return putNCvx_short_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1560,7 +1597,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_short_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_INT,NC_BYTE):
-        return putNCvx_int_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_int_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT,NC_UBYTE):
         return putNCvx_int_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1590,7 +1627,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_int_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_FLOAT,NC_BYTE):
-        return putNCvx_float_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_float_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_FLOAT,NC_UBYTE):
         return putNCvx_float_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1620,7 +1657,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_float_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_DOUBLE,NC_BYTE):
-        return putNCvx_double_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_double_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_DOUBLE,NC_UBYTE):
         return putNCvx_double_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1653,7 +1690,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_uchar_uchar(ncp,varp,start,nelems,(unsigned char*)value);
 	break;
     case CASE(NC_UBYTE,NC_BYTE):
-        return putNCvx_uchar_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_uchar_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UBYTE,NC_SHORT):
         return putNCvx_uchar_short(ncp,varp,start,nelems,(short*)value);
@@ -1680,7 +1717,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_uchar_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_USHORT,NC_BYTE):
-        return putNCvx_ushort_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_ushort_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_USHORT,NC_UBYTE):
         return putNCvx_ushort_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1710,7 +1747,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_ushort_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_UINT,NC_BYTE):
-        return putNCvx_uint_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_uint_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT,NC_UBYTE):
         return putNCvx_uint_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1740,7 +1777,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_uint_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_INT64,NC_BYTE):
-        return putNCvx_longlong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_longlong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_INT64,NC_UBYTE):
         return putNCvx_longlong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
@@ -1770,7 +1807,7 @@ writeNCv(NC3_INFO* ncp, const NC_var* varp, const size_t* start,
         return putNCvx_longlong_ushort(ncp,varp,start,nelems,(unsigned short*)value);
 	break;
     case CASE(NC_UINT64,NC_BYTE):
-        return putNCvx_ulonglong_schar(ncp,varp,start,nelems,(signed char*)value);
+        return putNCvx_ulonglong_schar(ncp,varp,start,nelems,(schar*)value);
 	break;
     case CASE(NC_UINT64,NC_UBYTE):
         return putNCvx_ulonglong_uchar(ncp,varp,start,nelems,(unsigned char*)value);
diff --git a/libsrc/t_ncio.c b/libsrc/t_ncio.c
index 4e37900..5805489 100644
--- a/libsrc/t_ncio.c
+++ b/libsrc/t_ncio.c
@@ -4,13 +4,16 @@
  */
 /* $Id: t_ncio.c,v 1.10 2010/05/26 11:11:26 ed Exp $ */
 
+#if HAVE_CONFIG_H
 #include <config.h>
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <assert.h>
-#include "ncio.h" 
+#include "ncio.h"
 #ifndef NC_NOERR
 #define NC_NOERR 0
 #endif
@@ -105,7 +108,7 @@ modify_ex(off_t offset, size_t extent, void *vp)
 
 	while(cp < end)
 	{
-		*cp++ = (unsigned char) (cp - obuf); 
+		*cp++ = (unsigned char) (cp - obuf);
 	}
 }
 
@@ -265,7 +268,7 @@ main(int ac, char *av[])
 
 
 	}
-	
+
 	if(!create)
 	{
 		status = ncio_open(path, flags,
diff --git a/libsrc/t_ncxx.m4 b/libsrc/t_ncxx.m4
index 0166ccb..81589c1 100644
--- a/libsrc/t_ncxx.m4
+++ b/libsrc/t_ncxx.m4
@@ -24,6 +24,10 @@ dnl
  * Otherwise, the program is silent and has exit code 0.
  */ 
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #undef NDEBUG   /* always active assert() in this file */
 
 #include <stdio.h>
diff --git a/libsrc/v1hpg.c b/libsrc/v1hpg.c
index afdeb51..e464c09 100644
--- a/libsrc/v1hpg.c
+++ b/libsrc/v1hpg.c
@@ -3,7 +3,10 @@
  *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
  */
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include "nc3internal.h"
 #include <stdlib.h>
 #include <stdio.h>
@@ -85,11 +88,7 @@ fault_v1hs(v1hs *gsp, size_t extent)
 
 	if(gsp->base != NULL)
 	{
-#ifdef __arm__
-		const ptrdiff_t incr = (signed char *)gsp->pos - (signed char *)gsp->base;
-#else
-        const ptrdiff_t incr = (char *)gsp->pos - (char *)gsp->base;
-#endif
+		const ptrdiff_t incr = (char *)gsp->pos - (char *)gsp->base;
 		status = rel_v1hs(gsp);
 		if(status)
 			return status;
@@ -107,11 +106,7 @@ fault_v1hs(v1hs *gsp, size_t extent)
 
 	gsp->pos = gsp->base;
 
-#ifdef __arm__
-	gsp->end = (signed char *)gsp->base + gsp->extent;
-#else
-    gsp->end = (char *)gsp->base + gsp->extent;
-#endif
+	gsp->end = (char *)gsp->base + gsp->extent;
     return NC_NOERR;
 }
 
@@ -128,13 +123,8 @@ fprintf(stderr, "nextread %lu, remaining %lu\n",
 	(unsigned long)nextread,
 	(unsigned long)((char *)gsp->end - (char *)gsp->pos));
 #endif
-#ifdef __arm__
-if((signed char *)gsp->pos + nextread <= (signed char *)gsp->end)
-        return NC_NOERR;
-#else
- if((char *)gsp->pos + nextread <= (char *)gsp->end)
-        return NC_NOERR;
-#endif
+    if((char *)gsp->pos + nextread <= (char *)gsp->end)
+	return NC_NOERR;
 
     return fault_v1hs(gsp, nextread);
 }
@@ -150,10 +140,12 @@ v1h_put_size_t(v1hs *psp, const size_t *sp)
 		status = check_v1hs(psp, X_SIZEOF_INT64);
 	else
 		status = check_v1hs(psp, X_SIZEOF_SIZE_T);
-    if(status != NC_NOERR)
+	if(status != NC_NOERR)
  		return status;
-        if (psp->version == 5)
-		return ncx_put_int64(&psp->pos, *sp);
+        if (psp->version == 5) {
+                unsigned long long tmp = (unsigned long long) (*sp);
+		return ncx_put_uint64(&psp->pos, tmp);
+        }
         else
 	    return ncx_put_size_t(&psp->pos, sp);
 }
@@ -167,11 +159,11 @@ v1h_get_size_t(v1hs *gsp, size_t *sp)
 		status = check_v1hs(gsp, X_SIZEOF_INT64);
 	else
 		status = check_v1hs(gsp, X_SIZEOF_SIZE_T);
-    if(status != NC_NOERR)
+	if(status != NC_NOERR)
 		return status;
         if (gsp->version == 5) {
-		long long tmp=0;
-		status = ncx_get_int64((const void **)(&gsp->pos), &tmp);
+		unsigned long long tmp=0;
+		status = ncx_get_uint64((const void **)(&gsp->pos), &tmp);
 		*sp = (size_t)tmp;
 		return status;
         }
@@ -187,18 +179,10 @@ v1h_get_size_t(v1hs *gsp, size_t *sp)
 static int
 v1h_put_nc_type(v1hs *psp, const nc_type *typep)
 {
-	const int itype = (int) *typep;
-	int status = check_v1hs(psp, X_SIZEOF_INT);
-    if(status != NC_NOERR)
-		return status;
-	status =  ncx_put_int_int(psp->pos, &itype);
-
-#ifdef __arm__
-	psp->pos = (void *)((signed char *)psp->pos + X_SIZEOF_INT);
-#else
-    psp->pos = (void *)((char *)psp->pos + X_SIZEOF_INT);
-#endif
-
+    const unsigned int itype = (unsigned int) *typep;
+    int status = check_v1hs(psp, X_SIZEOF_INT);
+    if(status != NC_NOERR) return status;
+    status =  ncx_put_uint32(&psp->pos, itype);
     return status;
 }
 
@@ -207,16 +191,10 @@ v1h_put_nc_type(v1hs *psp, const nc_type *typep)
 static int
 v1h_get_nc_type(v1hs *gsp, nc_type *typep)
 {
-	int type = 0;
-	int status = check_v1hs(gsp, X_SIZEOF_INT);
-    if(status != NC_NOERR)
-		return status;
-	status =  ncx_get_int_int(gsp->pos, &type);
-#ifdef __arm__
-	gsp->pos = (void *)((signed char *)gsp->pos + X_SIZEOF_INT);
-#else
-    gsp->pos = (void *)((char *)gsp->pos + X_SIZEOF_INT);
-#endif
+    unsigned int type = 0;
+    int status = check_v1hs(gsp, X_SIZEOF_INT);
+    if(status != NC_NOERR) return status;
+    status =  ncx_get_uint32((const void**)(&gsp->pos), &type);
     if(status != NC_NOERR)
 		return status;
 
@@ -248,16 +226,10 @@ v1h_get_nc_type(v1hs *gsp, nc_type *typep)
 static int
 v1h_put_NCtype(v1hs *psp, NCtype type)
 {
-	const int itype = (int) type;
-	int status = check_v1hs(psp, X_SIZEOF_INT);
-    if(status != NC_NOERR)
-		return status;
-	status = ncx_put_int_int(psp->pos, &itype);
-#ifdef __arm__
-    psp->pos = (void *)((signed char *)psp->pos + X_SIZEOF_INT);
-#else
-	psp->pos = (void *)((char *)psp->pos + X_SIZEOF_INT);
-#endif
+    const unsigned int itype = (unsigned int) type;
+    int status = check_v1hs(psp, X_SIZEOF_INT);
+    if(status != NC_NOERR) return status;
+    status = ncx_put_uint32(&psp->pos, itype);
     return status;
 }
 
@@ -265,21 +237,13 @@ v1h_put_NCtype(v1hs *psp, NCtype type)
 static int
 v1h_get_NCtype(v1hs *gsp, NCtype *typep)
 {
-	int type = 0;
-	int status = check_v1hs(gsp, X_SIZEOF_INT);
-    if(status != NC_NOERR)
-		return status;
-	status =  ncx_get_int_int(gsp->pos, &type);
-
-#ifdef __arm__
-	gsp->pos = (void *)((signed char *)gsp->pos + X_SIZEOF_INT);
-#else
-    gsp->pos = (void *)((char *)gsp->pos + X_SIZEOF_INT);
-#endif
-    if(status != NC_NOERR)
-		return status;
-	/* else */
-	*typep = (NCtype) type;
+    unsigned int type = 0;
+    int status = check_v1hs(gsp, X_SIZEOF_INT);
+    if(status != NC_NOERR) return status;
+    status =  ncx_get_uint32((const void**)(&gsp->pos), &type);
+    if(status != NC_NOERR) return status;
+    /* else */
+    *typep = (NCtype) type;
     return NC_NOERR;
 }
 
@@ -340,11 +304,11 @@ static int
 v1h_get_NC_string(v1hs *gsp, NC_string **ncstrpp)
 {
 	int status;
-	size_t nchars = 0;
+	size_t padding, nchars = 0;
 	NC_string *ncstrp;
 
 	status = v1h_get_size_t(gsp, &nchars);
-    if(status != NC_NOERR)
+	if(status != NC_NOERR)
 		return status;
 
 	ncstrp = new_NC_string(nchars, NULL);
@@ -353,7 +317,6 @@ v1h_get_NC_string(v1hs *gsp, NC_string **ncstrpp)
 		return NC_ENOMEM;
 	}
 
-
 #if 0
 /* assert(ncstrp->nchars == nchars || ncstrp->nchars - nchars < X_ALIGN); */
 	assert(ncstrp->nchars % X_ALIGN == 0);
@@ -362,22 +325,33 @@ v1h_get_NC_string(v1hs *gsp, NC_string **ncstrpp)
 
 	status = check_v1hs(gsp, _RNDUP(ncstrp->nchars, X_ALIGN));
 #endif
-    if(status != NC_NOERR)
+	if(status != NC_NOERR)
 		goto unwind_alloc;
 
 	status = ncx_pad_getn_text((const void **)(&gsp->pos),
 		 nchars, ncstrp->cp);
-    if(status != NC_NOERR)
+	if(status != NC_NOERR)
 		goto unwind_alloc;
 
+	padding = _RNDUP(X_SIZEOF_CHAR * ncstrp->nchars, X_ALIGN)
+		- X_SIZEOF_CHAR * ncstrp->nchars;
+	if (padding > 0) {
+		/* CDF specification: Header padding uses null (\x00) bytes. */
+		char pad[X_ALIGN-1];
+		memset(pad, 0, X_ALIGN-1);
+		if (memcmp((char*)gsp->pos-padding, pad, padding) != 0) {
+			free_NC_string(ncstrp);
+			return NC_EINVAL;
+		}
+	}
+
 	*ncstrpp = ncstrp;
 
-    return NC_NOERR;
+	return NC_NOERR;
 
 unwind_alloc:
 	free_NC_string(ncstrp);
 	return status;
-
 }
 
 /* End NC_string */
@@ -614,6 +588,28 @@ ncx_len_NC_attr(const NC_attr *attrp, int version)
 #undef MIN
 #define MIN(mm,nn) (((mm) < (nn)) ? (mm) : (nn))
 
+/*----< ncmpix_len_nctype() >------------------------------------------------*/
+/* return the length of external data type */
+static int
+ncmpix_len_nctype(nc_type type) {
+    switch(type) {
+        case NC_BYTE:
+        case NC_CHAR:
+        case NC_UBYTE:  return X_SIZEOF_CHAR;
+        case NC_SHORT:  return X_SIZEOF_SHORT;
+        case NC_USHORT: return X_SIZEOF_USHORT;
+        case NC_INT:    return X_SIZEOF_INT;
+        case NC_UINT:   return X_SIZEOF_UINT;
+        case NC_FLOAT:  return X_SIZEOF_FLOAT;
+        case NC_DOUBLE: return X_SIZEOF_DOUBLE;
+        case NC_INT64:  return X_SIZEOF_INT64;
+        case NC_UINT64: return X_SIZEOF_UINT64;
+        default: fprintf(stderr,"ncmpix_len_nctype bad type %d\n",type);
+                 assert(0);
+    }
+    return 0;
+}
+
 /*
  * Put the values of an attribute
  * The loop is necessary since attrp->nelems
@@ -626,7 +622,7 @@ v1h_put_NC_attrV(v1hs *psp, const NC_attr *attrp)
 	const size_t perchunk =  psp->extent;
 	size_t remaining = attrp->xsz;
 	void *value = attrp->xvalue;
-	size_t nbytes;
+	size_t nbytes, padding;
 
 	assert(psp->extent % X_ALIGN == 0);
 
@@ -634,23 +630,24 @@ v1h_put_NC_attrV(v1hs *psp, const NC_attr *attrp)
 		nbytes = MIN(perchunk, remaining);
 
 		status = check_v1hs(psp, nbytes);
-        if(status != NC_NOERR)
+		if(status != NC_NOERR)
 			return status;
 
 		(void) memcpy(psp->pos, value, nbytes);
 
-#ifdef __arm__
-		psp->pos = (void *)((signed char *)psp->pos + nbytes);
-		value = (void *)((signed char *)value + nbytes);
-#else
-        psp->pos = (void *)((char *)psp->pos + nbytes);
+		psp->pos = (void *)((char *)psp->pos + nbytes);
 		value = (void *)((char *)value + nbytes);
-#endif
-        remaining -= nbytes;
+        	remaining -= nbytes;
 
 	} while(remaining != 0);
 
-    return NC_NOERR;
+	padding = attrp->xsz - ncmpix_len_nctype(attrp->type) * attrp->nelems;
+	if (padding > 0) {
+		/* CDF specification: Header padding uses null (\x00) bytes. */
+		memset((char*)psp->pos-padding, 0, padding);
+	}
+
+	return NC_NOERR;
 }
 
 /* Write a NC_attr to the header */
@@ -691,29 +688,34 @@ v1h_get_NC_attrV(v1hs *gsp, NC_attr *attrp)
 	const size_t perchunk =  gsp->extent;
 	size_t remaining = attrp->xsz;
 	void *value = attrp->xvalue;
-	size_t nget;
+	size_t nget, padding;
 
 	do {
 		nget = MIN(perchunk, remaining);
 
 		status = check_v1hs(gsp, nget);
-        if(status != NC_NOERR)
+		if(status != NC_NOERR)
 			return status;
 
 		(void) memcpy(value, gsp->pos, nget);
-#ifdef __arm__
-		gsp->pos = (void *)((signed char *)gsp->pos + nget);
+		gsp->pos = (void*)((unsigned char *)gsp->pos + nget);
+
 		value = (void *)((signed char *)value + nget);
-#else
-        gsp->pos = (void *)((char *)gsp->pos + nget);
-		value = (void *)((char *)value + nget);
-#endif
 
-        remaining -= nget;
+		remaining -= nget;
 
 	} while(remaining != 0);
 
-    return NC_NOERR;
+	padding = attrp->xsz - ncmpix_len_nctype(attrp->type) * attrp->nelems;
+	if (padding > 0) {
+		/* CDF specification: Header padding uses null (\x00) bytes. */
+		char pad[X_ALIGN-1];
+		memset(pad, 0, X_ALIGN-1);
+		if (memcmp((char*)gsp->pos-padding, pad, (size_t)padding) != 0)
+			return NC_EINVAL;
+	}
+
+	return NC_NOERR;
 }
 
 
@@ -939,7 +941,7 @@ v1h_put_NC_var(v1hs *psp, const NC_var *varp)
         if(status != NC_NOERR)
 			return status;
 		status = ncx_putn_longlong_int(&psp->pos,
-				varp->ndims, varp->dimids);
+				varp->ndims, varp->dimids, NULL);
         if(status != NC_NOERR)
 			return status;
 	}
@@ -948,7 +950,7 @@ v1h_put_NC_var(v1hs *psp, const NC_var *varp)
         if(status != NC_NOERR)
 		return status;
 	    status = ncx_putn_int_int(&psp->pos,
-			varp->ndims, varp->dimids);
+			varp->ndims, varp->dimids, NULL);
         if(status != NC_NOERR)
 		return status;
 	}
@@ -1345,21 +1347,23 @@ ncx_put_NC(const NC3_INFO* ncp, void **xpp, off_t offset, size_t extent)
 	}
 
 	if (ps.version == 5)
-	  status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic5), ncmagic5);
+	  status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic5), ncmagic5, NULL);
 	else if (ps.version == 2)
-	  status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic), ncmagic);
+	  status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic), ncmagic, NULL);
 	else
-	  status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic1), ncmagic1);
-    if(status != NC_NOERR)
+	  status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic1), ncmagic1, NULL);
+	if(status != NC_NOERR)
 		goto release;
 
 	{
 	const size_t nrecs = NC_get_numrecs(ncp);
-       	if (ps.version == 5)
-	    status = ncx_put_int64(&ps.pos, nrecs);
+	if (ps.version == 5) {
+            unsigned long long tmp = (unsigned long long) nrecs;
+	    status = ncx_put_uint64(&ps.pos, tmp);
+        }
        	else
 	    status = ncx_put_size_t(&ps.pos, &nrecs);
-    if(status != NC_NOERR)
+	if(status != NC_NOERR)
 		goto release;
 	}
 
@@ -1486,8 +1490,8 @@ nc_get_NC(NC3_INFO* ncp)
 	{
 	size_t nrecs = 0;
        	if (gs.version == 5) {
-		long long tmp = 0;
-		status = ncx_get_int64((const void **)(&gs.pos), &tmp);
+		unsigned long long tmp = 0;
+		status = ncx_get_uint64((const void **)(&gs.pos), &tmp);
 		nrecs = (size_t)tmp;
        	}
        	else
@@ -1497,11 +1501,8 @@ nc_get_NC(NC3_INFO* ncp)
 	NC_set_numrecs(ncp, nrecs);
 	}
 
-#ifdef __arm__
-	assert((signed char *)gs.pos < (signed char *)gs.end);
-#else
-    assert((char *)gs.pos < (char *)gs.end);
-#endif
+	assert((char *)gs.pos < (char *)gs.end);
+
 	status = v1h_get_NC_dimarray(&gs, &ncp->dims);
     if(status != NC_NOERR)
 		goto unwind_get;
@@ -1520,6 +1521,10 @@ nc_get_NC(NC3_INFO* ncp)
     if(status != NC_NOERR)
 		goto unwind_get;
 
+	status = NC_check_vlens(ncp);
+    if(status != NC_NOERR)
+		goto unwind_get;
+
 unwind_get:
 	(void) rel_v1hs(&gs);
 	return status;
diff --git a/libsrc/var.c b/libsrc/var.c
index 27f413c..b6b0bb2 100644
--- a/libsrc/var.c
+++ b/libsrc/var.c
@@ -4,7 +4,10 @@
  */
 /* $Id: var.c,v 1.144 2010/05/30 00:50:35 russ Exp $ */
 
-#include "config.h"
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include "nc3internal.h"
 #include <stdlib.h>
 #include <string.h>
@@ -12,10 +15,12 @@
 #include <limits.h>
 #include "ncx.h"
 #include "rnd.h"
-#include "utf8proc.h"
+#include "ncutf8.h"
 
 #ifndef OFF_T_MAX
-//#define OFF_T_MAX (~ (off_t) 0 - (~ (off_t) 0 << (CHAR_BIT * sizeof (off_t) - 1)))
+#if 0
+#define OFF_T_MAX (~ (off_t) 0 - (~ (off_t) 0 << (CHAR_BIT * sizeof (off_t) - 1)))
+#endif
 
 /* The behavior above is undefined, re: bitshifting a negative value, according
    to warnings thrown by clang/gcc.  An alternative OFF_T_MAX was written
@@ -124,9 +129,11 @@ new_NC_var(const char *uname, nc_type type,
 {
 	NC_string *strp = NULL;
 	NC_var *varp = NULL;
+	int stat;
+	char* name;
 
-	char *name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
+        stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char **)&name);
+        if(stat != NC_NOERR)
 	    return NULL;
 	strp = new_NC_string(strlen(name), name);
 	free(name);
@@ -353,6 +360,7 @@ NC_findvar(const NC_vararray *ncap, const char *uname, NC_var **varpp)
 {
 	int hash_var_id;
 	char *name;
+	int stat;
 
 	assert(ncap != NULL);
 
@@ -361,9 +369,9 @@ NC_findvar(const NC_vararray *ncap, const char *uname, NC_var **varpp)
 
 
 	/* normalized version of uname */
-	name = (char *)utf8proc_NFC((const unsigned char *)uname);
-	if(name == NULL)
-	    return NC_ENOMEM;
+        stat = nc_utf8_normalize((const unsigned char *)uname,(unsigned char **)&name);
+        if(stat != NC_NOERR)
+	    return stat;
 
 	hash_var_id = (int)NC_hashmapGetVar(ncap, name);
 	free(name);
@@ -484,6 +492,7 @@ out :
 		case NC_CHAR :
 		case NC_UBYTE :
 		case NC_SHORT :
+		case NC_USHORT :
 		        if( varp->len%4 != 0 )
 			{
 			        varp->len += 4 - varp->len%4; /* round up */
@@ -752,9 +761,9 @@ NC3_rename_var(int ncid, int varid, const char *unewname)
 
 
 	old = varp->name;
-	newname = (char *)utf8proc_NFC((const unsigned char *)unewname);
-	if(newname == NULL)
-	    return NC_ENOMEM;
+        status = nc_utf8_normalize((const unsigned char *)unewname,(unsigned char **)&newname);
+        if(status != NC_NOERR)
+	    return status;
 	if(NC_indef(ncp))
 	{
 		/* Remove old name from hashmap; add new... */
diff --git a/libsrc/winceio.c b/libsrc/winceio.c
index 4e01e0c..c7a2e14 100644
--- a/libsrc/winceio.c
+++ b/libsrc/winceio.c
@@ -5,7 +5,11 @@
 /* $Id: winceio.c,v 1.2 2010/05/04 17:30:04 dmh Exp $ */
 /* Dennis Heimbigner 2010-3-04 */
 
+
+#if HAVE_CONFIG_H
 #include <config.h>
+#endif
+
 #include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>	/* DEBUG */
@@ -68,7 +72,7 @@ fgrow(FILE* f, const off_t len)
     int status = NC_NOERR;
     long pos = ftell(f);
     long size;
-    pos = ftell(f);    
+    pos = ftell(f);
     status = fseek(f,0,SEEK_END);
     if(ferror(f)) return EIO;
     size = ftell(f);
@@ -99,7 +103,7 @@ fgrow2(FILE* f, const off_t len)
     int status = NC_NOERR;
     long pos = ftell(f);
     long size;
-    pos = ftell(f);    
+    pos = ftell(f);
     status = fseek(f,0,SEEK_END);
     if(ferror(f)) return EIO;
     size = ftell(f);
@@ -121,7 +125,7 @@ fgrow2(FILE* f, const off_t len)
 /* Begin ffio */
 
 static int
-fileio_pgout(ncio *const nciop, 
+fileio_pgout(ncio *const nciop,
 	off_t const offset,  const size_t extent,
 	const void *const vp, off_t *posp)
 {
@@ -180,7 +184,7 @@ fileio_pgin(ncio *const nciop,
 typedef struct ncio_ffio {
 	off_t pos;
 	/* buffer */
-	off_t	bf_offset; 
+	off_t	bf_offset;
 	size_t	bf_extent;
 	size_t	bf_cnt;
 	void	*bf_base;
@@ -230,7 +234,7 @@ ncio_fileio_get(ncio *const nciop,
 #ifdef X_ALIGN
 	size_t rem;
 #endif
-	
+
 	if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE))
 		return EPERM; /* attempt to write readonly file */
 
@@ -304,7 +308,7 @@ ncio_fileio_move(ncio *const nciop, off_t to, off_t from,
 			size_t nbytes, int rflags)
 {
 	int status = NC_NOERR;
-	off_t lower = from;	
+	off_t lower = from;
 	off_t upper = to;
 	char *base;
 	size_t diff = upper - lower;
@@ -315,11 +319,11 @@ ncio_fileio_move(ncio *const nciop, off_t to, off_t from,
 
 	if(to == from)
 		return NC_NOERR; /* NOOP */
-	
+
 	if(to > from)
 	{
 		/* growing */
-		lower = from;	
+		lower = from;
 		upper = to;
 	}
 	else
@@ -339,10 +343,10 @@ ncio_fileio_move(ncio *const nciop, off_t to, off_t from,
 		return status;
 
 	if(to > from)
-		(void) memmove(base + diff, base, nbytes); 
+		(void) memmove(base + diff, base, nbytes);
 	else
-		(void) memmove(base, base + diff, nbytes); 
-		
+		(void) memmove(base, base + diff, nbytes);
+
 	(void) ncio_fileio_rel(nciop, lower, RGN_MODIFIED);
 
 	return status;
@@ -426,7 +430,7 @@ ncio_free(ncio *nciop)
 
 	if(nciop->free != NULL)
 		nciop->free(nciop->pvt);
-	
+
 	free(nciop);
 }
 
@@ -437,7 +441,7 @@ ncio_new(const char *path, int ioflags)
 	size_t sz_path = M_RNDUP(strlen(path) +1);
 	size_t sz_ncio_pvt;
 	ncio *nciop;
- 
+
 #if ALWAYS_NC_SHARE /* DEBUG */
 	fSet(ioflags, NC_SHARE);
 #endif
@@ -450,7 +454,7 @@ ncio_new(const char *path, int ioflags)
 	nciop = (ncio *) malloc(sz_ncio + sz_path + sz_ncio_pvt);
 	if(nciop == NULL)
 		return NULL;
-	
+
 	nciop->ioflags = ioflags;
 	*((int *)&nciop->fd) = -1; /* cast away const */
 
@@ -511,7 +515,7 @@ ncio_create(const char *path, int ioflags,
 	    if(f != NULL) { /* do not overwrite */
 		(void)fclose(f);
 		return EEXIST;
-	    }		
+	    }
 	}
 
 	f = fopen(path, oflags);
@@ -651,8 +655,8 @@ unwind_new:
 }
 
 
-/* 
- * Get file size in bytes.  
+/*
+ * Get file size in bytes.
  * Is use of fstatus = fseek() really necessary, or could we use standard fstat() call
  * and get st_size member?
  */
@@ -672,7 +676,7 @@ ncio_filesize(ncio *nciop, off_t *filesizep)
     status = fseek(f, 0, SEEK_END); /* get size */
     if(ferror(f)) return EIO;
     *filesizep = ftell(f);
-    status = fseek(f, current, SEEK_SET); /* reset */ 
+    status = fseek(f, current, SEEK_SET); /* reset */
     if(ferror(f)) return EIO;
     return NC_NOERR;
 }
@@ -710,7 +714,7 @@ ncio_pad_length(ncio *nciop, off_t length)
 }
 
 
-int 
+int
 ncio_close(ncio *nciop, int doUnlink)
 {
 	int status = NC_NOERR;
@@ -726,7 +730,7 @@ ncio_close(ncio *nciop, int doUnlink)
 	(void) fclose(f);
 
 	descriptors[nciop->fd] = NULL;
-	
+
 	if(doUnlink)
 		(void) unlink(nciop->path);
 
diff --git a/libsrc4/Makefile.am b/libsrc4/Makefile.am
index eb474ae..b064eb2 100644
--- a/libsrc4/Makefile.am
+++ b/libsrc4/Makefile.am
@@ -14,9 +14,9 @@ endif
 
 # This is our output. The netCDF-4 convenience library.
 noinst_LTLIBRARIES = libnetcdf4.la
-libnetcdf4_la_SOURCES = nc4dispatch.c nc4dispatch.h nc4attr.c nc4dim.c	\
+libnetcdf4_la_SOURCES = nc4dispatch.c nc4attr.c nc4dim.c	\
 nc4file.c nc4grp.c nc4hdf.c nc4internal.c nc4type.c nc4var.c ncfunc.c error4.c \
-nc4info.c
+nc4info.c nc4printer.c
 
 EXTRA_DIST=CMakeLists.txt
 
diff --git a/libsrc4/Makefile.in b/libsrc4/Makefile.in
index 0035d50..bce21d7 100644
--- a/libsrc4/Makefile.in
+++ b/libsrc4/Makefile.in
@@ -130,7 +130,7 @@ am_libnetcdf4_la_OBJECTS = libnetcdf4_la-nc4dispatch.lo \
 	libnetcdf4_la-nc4hdf.lo libnetcdf4_la-nc4internal.lo \
 	libnetcdf4_la-nc4type.lo libnetcdf4_la-nc4var.lo \
 	libnetcdf4_la-ncfunc.lo libnetcdf4_la-error4.lo \
-	libnetcdf4_la-nc4info.lo
+	libnetcdf4_la-nc4info.lo libnetcdf4_la-nc4printer.lo
 libnetcdf4_la_OBJECTS = $(am_libnetcdf4_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
@@ -240,6 +240,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -267,12 +268,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -307,6 +310,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -371,13 +375,14 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 libnetcdf4_la_CPPFLAGS = ${AM_CPPFLAGS} $(am__append_3)
 
 # This is our output. The netCDF-4 convenience library.
 noinst_LTLIBRARIES = libnetcdf4.la
-libnetcdf4_la_SOURCES = nc4dispatch.c nc4dispatch.h nc4attr.c nc4dim.c	\
+libnetcdf4_la_SOURCES = nc4dispatch.c nc4attr.c nc4dim.c	\
 nc4file.c nc4grp.c nc4hdf.c nc4internal.c nc4type.c nc4var.c ncfunc.c error4.c \
-nc4info.c
+nc4info.c nc4printer.c
 
 EXTRA_DIST = CMakeLists.txt
 all: all-am
@@ -444,6 +449,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf4_la-nc4hdf.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf4_la-nc4info.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf4_la-nc4internal.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf4_la-nc4printer.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf4_la-nc4type.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf4_la-nc4var.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnetcdf4_la-ncfunc.Plo at am__quote@
@@ -556,6 +562,13 @@ libnetcdf4_la-nc4info.lo: nc4info.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnetcdf4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libnetcdf4_la-nc4info.lo `test -f 'nc4info.c' || echo '$(srcdir)/'`nc4info.c
 
+libnetcdf4_la-nc4printer.lo: nc4printer.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnetcdf4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libnetcdf4_la-nc4printer.lo -MD -MP -MF $(DEPDIR)/libnetcdf4_la-nc4printer.Tpo -c -o libnetcdf4_la-nc4printer.lo `test -f 'nc4printer.c' || echo '$(srcdir)/'`nc4printer.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libnetcdf4_la-nc4printer.Tpo $(DEPDIR)/libnetcdf4_la-nc4printer.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='nc4printer.c' object='libnetcdf4_la-nc4printer.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnetcdf4_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libnetcdf4_la-nc4printer.lo `test -f 'nc4printer.c' || echo '$(srcdir)/'`nc4printer.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/libsrc4/error4.c b/libsrc4/error4.c
index 23f82c3..d38ca7c 100644
--- a/libsrc4/error4.c
+++ b/libsrc4/error4.c
@@ -13,7 +13,7 @@ conditions.
 $Id: error4.c,v 1.4 2010/06/01 17:48:55 ed Exp $
 */
 
-#include <config.h>
+#include "config.h"
 #include <stdarg.h>
 #include <stdlib.h>
 #include <stdio.h>
diff --git a/libsrc4/nc3stub.h b/libsrc4/nc3stub.h
deleted file mode 100644
index e498c08..0000000
--- a/libsrc4/nc3stub.h
+++ /dev/null
@@ -1,1026 +0,0 @@
-/*
- * Copyright 1993-1996 University Corporation for Atmospheric Research/Unidata
- * 
- */
-
-#ifndef _NC3STUB_H
-#define _NC3STUB_H
-
-#ifndef MPI_INCLUDED
-typedef int MPI_Comm;
-typedef int MPI_Info;
-#endif
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-/*
- * The Interface
- */
-
-/* Declaration modifiers for DLL support (MSC et al) */
-
-#if defined(DLL_NETCDF) /* define when library is a DLL */
-#  if defined(DLL_EXPORT) /* define when building the library */
-#   define MSC_EXTRA __declspec(dllexport)
-#  else
-#   define MSC_EXTRA __declspec(dllimport)
-#  endif
-#else
-#define MSC_EXTRA
-#endif	/* defined(DLL_NETCDF) */
-
-# define EXTERNL extern MSC_EXTRA
-
-EXTERNL int
-nc3_delete_mp(const char * path, int basepe);
-
-EXTERNL int
-nc3_create(const char *path, int cmode, size_t initialsz, int basepe,
-	   size_t *chunksizehintp,
-	   MPI_Comm, MPI_Info,
-	   NC**);
-
-EXTERNL int
-nc3_open(const char *path, int mode, int basepe, size_t *chunksizehintp, 
-	 int use_parallel, MPI_Comm, MPI_Info,
-	 NC**);
-
-EXTERNL int
-nc3_redef(int ncid);
-
-EXTERNL int
-nc3__enddef(int ncid, size_t h_minfree, size_t v_align,
-	size_t v_minfree, size_t r_align);
-
-EXTERNL int
-nc3_sync(int ncid);
-
-EXTERNL int
-nc3_abort(int ncid);
-
-EXTERNL int
-nc3_close(int ncid);
-
-EXTERNL int
-nc3_set_fill(int ncid, int fillmode, int *old_modep);
-
-EXTERNL int
-nc3_set_base_pe(int ncid, int pe);
-
-EXTERNL int
-nc3_inq_base_pe(int ncid, int *pe);
-
-EXTERNL int
-nc3_inq_format(int ncid, int *formatp);
-
-EXTERNL int
-nc3_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp);
-
-EXTERNL int
-nc3_inq_type(int,nc_type,char*,size_t*);
-
-/* Begin _dim */
-
-EXTERNL int
-nc3_def_dim(int ncid, const char *name, size_t len, int *idp);
-
-EXTERNL int
-nc3_inq_dimid(int ncid, const char *name, int *idp);
-
-EXTERNL int
-nc3_inq_dim(int ncid, int dimid, char *name, size_t *lenp);
-
-EXTERNL int
-nc3_rename_dim(int ncid, int dimid, const char *name);
-
-/* End _dim */
-/* Begin _att */
-
-EXTERNL int
-nc3_inq_att(int ncid, int varid, const char *name,
-	 nc_type *xtypep, size_t *lenp);
-
-EXTERNL int 
-nc3_inq_attid(int ncid, int varid, const char *name, int *idp);
-
-EXTERNL int
-nc3_inq_attname(int ncid, int varid, int attnum, char *name);
-
-EXTERNL int
-nc3_rename_att(int ncid, int varid, const char *name, const char *newname);
-
-EXTERNL int
-nc3_del_att(int ncid, int varid, const char*);
-
-/* End _att */
-/* Begin {put,get}_att */
-
-EXTERNL int
-nc3_get_att(int ncid, int varid, const char *name, void *value, nc_type);
-
-EXTERNL int
-nc3_put_att(int ncid, int varid, const char *name, nc_type datatype,
-	   size_t len, const void *value, nc_type);
-
-/* End {put,get}_att */
-/* Begin _var */
-
-EXTERNL int
-nc3_def_var(int ncid, const char *name,
-	 nc_type xtype, int ndims, const int *dimidsp, int *varidp);
-
-EXTERNL int
-nc3_inq_var(int ncid, int varid, char *name,
-	 nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp);
-
-EXTERNL int
-nc3_inq_varid(int ncid, const char *name, int *varidp);
-
-EXTERNL int
-nc3_rename_var(int ncid, int varid, const char *name);
-
-EXTERNL int
-nc3_put_vara(int ncid, int varid,
-   	     const size_t *start, const size_t *count,
-             const void *value, nc_type);
-
-EXTERNL int
-nc3_get_vara(int ncid, int varid,
-	     const size_t *start, const size_t *count,
-             void *value, nc_type);
-
-EXTERNL int
-nc3_put_var(int ncid, int varid,  const void *op);
-
-EXTERNL int
-nc3_get_var(int ncid, int varid,  void *ip);
-
-EXTERNL int
-nc3_put_var1(int ncid, int varid,  const size_t *indexp,
-	    const void *op);
-
-EXTERNL int
-nc3_get_var1(int ncid, int varid,  const size_t *indexp, void *ip);
-
-EXTERNL int
-nc3_put_vars(int ncid, int varid,  const size_t *startp, 
-	    const size_t *countp, const ptrdiff_t *stridep,
-	    const void *op);
-
-EXTERNL int
-nc3_get_vars(int ncid, int varid,  const size_t *startp, 
-	    const size_t *countp, const ptrdiff_t *stridep,
-	    void *ip);
-
-EXTERNL int
-nc3_put_varm(int ncid, int varid,  const size_t *startp, 
-	    const size_t *countp, const ptrdiff_t *stridep,
-	    const ptrdiff_t *imapp, const void *op);
-
-EXTERNL int
-nc3_get_varm(int ncid, int varid,  const size_t *startp, 
-	    const size_t *countp, const ptrdiff_t *stridep,
-	    const ptrdiff_t *imapp, void *ip);
-
-
-/* End _var */
-
-/* netCDF4 API only */
-EXTERNL int
-nc3_var_par_access(int,int,int);
-
-EXTERNL int
-nc3_inq_ncid(int,const char*,int*);
-
-EXTERNL int
-nc3_inq_grps(int,int*,int*);
-
-EXTERNL int
-nc3_inq_grpname(int,char*);
-
-EXTERNL int
-nc3_inq_grpname_full(int,size_t*,char*);
-
-EXTERNL int
-nc3_inq_grp_parent(int,int*);
-
-EXTERNL int
-nc3_inq_grp_full_ncid(int,const char*,int*);
-
-EXTERNL int
-nc3_inq_varids(int,int* nvars,int*);
-
-EXTERNL int
-nc3_inq_dimids(int,int* ndims,int*,int);
-
-EXTERNL int
-nc3_inq_typeids(int,int* ntypes,int*);
-
-EXTERNL int
-nc3_inq_type_equal(int,nc_type,int,nc_type,int*);
-
-EXTERNL int
-nc3_def_grp(int,const char*,int*);
-
-EXTERNL int
-nc3_inq_user_type(int,nc_type,char*,size_t*,nc_type*,size_t*,int*);
-
-
-EXTERNL int
-nc3_def_compound(int,size_t,const char*,nc_type*);
-
-EXTERNL int
-nc3_insert_compound(int,nc_type,const char*,size_t,nc_type);
-
-EXTERNL int
-nc3_insert_array_compound(int,nc_type,const char*,size_t,nc_type,int,const int*);
-
-EXTERNL int
-nc3_inq_typeid(int,const char*,nc_type*);
-
-EXTERNL int
-nc3_inq_compound_field(int,nc_type,int,char*,size_t*,nc_type*,int*,int*);
-
-EXTERNL int
-nc3_inq_compound_fieldindex(int,nc_type,const char*,int*);
-
-EXTERNL int
-nc3_def_vlen(int,const char*,nc_type base_typeid,nc_type*);
-
-EXTERNL int
-nc3_put_vlen_element(int,int,void*,size_t,const void*);
-
-EXTERNL int
-nc3_get_vlen_element(int,int,const void*,size_t*,void*);
-
-EXTERNL int
-nc3_def_enum(int,nc_type,const char*,nc_type*);
-
-EXTERNL int
-nc3_insert_enum(int,nc_type,const char*,const void*);
-
-EXTERNL int
-nc3_inq_enum_member(int,nc_type,int,char*,void*);
-
-EXTERNL int
-nc3_inq_enum_ident(int,nc_type,long long,char*);
-
-EXTERNL int
-nc3_def_opaque(int,size_t,const char*,nc_type*);
-
-EXTERNL int
-nc3_def_var_deflate(int,int,int,int,int);
-
-EXTERNL int
-nc3_inq_var_deflate(int,int,int*,int*,int*);
-
-EXTERNL int
-nc3_inq_var_szip(int,int,int*,int*);
-
-EXTERNL int
-nc3_def_var_fletcher32(int,int,int);
-
-EXTERNL int
-nc3_inq_var_fletcher32(int,int,int*);
-
-EXTERNL int
-nc3_def_var_chunking(int,int,int,const size_t*);
-
-EXTERNL int
-nc3_inq_var_chunking(int,int,int*,size_t*);
-
-EXTERNL int
-nc3_def_var_fill(int,int,int,const void*);
-
-EXTERNL int
-nc3_inq_var_fill(int,int,int*,void*);
-
-EXTERNL int
-nc3_def_var_endian(int,int,int);
-
-EXTERNL int
-nc3_inq_var_endian(int,int,int*);
-
-EXTERNL int
-nc3_set_var_chunk_cache(int,int,size_t,size_t,float);
-
-EXTERNL int
-nc3_get_var_chunk_cache(int,int,size_t*,size_t*,float*);
-
-EXTERNL int
-nc3_inq_unlimdims(int,int*,int*);
-
-EXTERNL int 
-nc3_inq_unlimdim(int ncid, int *unlimdimidp);
-
-EXTERNL int
-nc3_show_metadata(int);
-
-EXTERNL int
-nc3_put_att_text(int ncid, int varid, const char *name,
-		size_t len, const char *op);
-
-EXTERNL int
-nc3_get_att_text(int ncid, int varid, const char *name, char *ip);
-
-EXTERNL int
-nc3_put_att_uchar(int ncid, int varid, const char *name, nc_type xtype,
-		 size_t len, const unsigned char *op);
-
-EXTERNL int
-nc3_get_att_uchar(int ncid, int varid, const char *name, unsigned char *ip);
-
-EXTERNL int
-nc3_put_att_schar(int ncid, int varid, const char *name, nc_type xtype,
-		 size_t len, const signed char *op);
-
-EXTERNL int
-nc3_get_att_schar(int ncid, int varid, const char *name, signed char *ip);
-
-EXTERNL int
-nc3_put_att_short(int ncid, int varid, const char *name, nc_type xtype,
-		 size_t len, const short *op);
-
-EXTERNL int
-nc3_get_att_short(int ncid, int varid, const char *name, short *ip);
-
-EXTERNL int
-nc3_put_att_int(int ncid, int varid, const char *name, nc_type xtype,
-	       size_t len, const int *op);
-
-EXTERNL int
-nc3_get_att_int(int ncid, int varid, const char *name, int *ip);
-
-EXTERNL int
-nc3_put_att_long(int ncid, int varid, const char *name, nc_type xtype,
-		size_t len, const long *op);
-
-EXTERNL int
-nc3_get_att_long(int ncid, int varid, const char *name, long *ip);
-
-EXTERNL int
-nc3_put_att_float(int ncid, int varid, const char *name, nc_type xtype,
-		 size_t len, const float *op);
-
-EXTERNL int
-nc3_get_att_float(int ncid, int varid, const char *name, float *ip);
-
-EXTERNL int
-nc3_put_att_double(int ncid, int varid, const char *name, nc_type xtype,
-		  size_t len, const double *op);
-
-EXTERNL int
-nc3_get_att_double(int ncid, int varid, const char *name, double *ip);
-
-EXTERNL int
-nc3_put_att_ubyte(int ncid, int varid, const char *name, nc_type xtype,
-		 size_t len, const unsigned char *op);
-
-EXTERNL int
-nc3_get_att_ubyte(int ncid, int varid, const char *name, 
-		 unsigned char *ip);
-
-EXTERNL int
-nc3_put_att_ushort(int ncid, int varid, const char *name, nc_type xtype,
-		  size_t len, const unsigned short *op);
-
-EXTERNL int
-nc3_get_att_ushort(int ncid, int varid, const char *name, unsigned short *ip);
-
-EXTERNL int
-nc3_put_att_uint(int ncid, int varid, const char *name, nc_type xtype,
-		size_t len, const unsigned int *op);
-
-EXTERNL int
-nc3_get_att_uint(int ncid, int varid, const char *name, unsigned int *ip);
-
-EXTERNL int
-nc3_put_att_longlong(int ncid, int varid, const char *name, nc_type xtype,
-		 size_t len, const long long *op);
-
-EXTERNL int
-nc3_get_att_longlong(int ncid, int varid, const char *name, long long *ip);
-
-EXTERNL int
-nc3_put_att_ulonglong(int ncid, int varid, const char *name, nc_type xtype,
-		     size_t len, const unsigned long long *op);
-
-EXTERNL int
-nc3_get_att_ulonglong(int ncid, int varid, const char *name, 
-		     unsigned long long *ip);
-
-EXTERNL int
-nc3_put_att_string(int ncid, int varid, const char *name, 
-		  size_t len, const char **op);
-
-EXTERNL int
-nc3_get_att_string(int ncid, int varid, const char *name, char **ip);
-
-
-EXTERNL int
-nc3_put_var1_text(int ncid, int varid, const size_t *indexp, const char *op);
-
-EXTERNL int
-nc3_get_var1_text(int ncid, int varid, const size_t *indexp, char *ip);
-
-EXTERNL int
-nc3_put_var1_uchar(int ncid, int varid, const size_t *indexp,
-		  const unsigned char *op);
-
-EXTERNL int
-nc3_get_var1_uchar(int ncid, int varid, const size_t *indexp,
-		  unsigned char *ip);
-
-EXTERNL int
-nc3_put_var1_schar(int ncid, int varid, const size_t *indexp,
-		  const signed char *op);
-
-EXTERNL int
-nc3_get_var1_schar(int ncid, int varid, const size_t *indexp,
-		  signed char *ip);
-
-EXTERNL int
-nc3_put_var1_short(int ncid, int varid, const size_t *indexp,
-		  const short *op);
-
-EXTERNL int
-nc3_get_var1_short(int ncid, int varid, const size_t *indexp,
-		  short *ip);
-
-EXTERNL int
-nc3_put_var1_int(int ncid, int varid, const size_t *indexp, const int *op);
-
-EXTERNL int
-nc3_get_var1_int(int ncid, int varid, const size_t *indexp, int *ip);
-
-EXTERNL int
-nc3_put_var1_long(int ncid, int varid, const size_t *indexp, const long *op);
-
-EXTERNL int
-nc3_get_var1_long(int ncid, int varid, const size_t *indexp, long *ip);
-
-EXTERNL int
-nc3_put_var1_float(int ncid, int varid, const size_t *indexp, const float *op);
-
-EXTERNL int
-nc3_get_var1_float(int ncid, int varid, const size_t *indexp, float *ip);
-
-EXTERNL int
-nc3_put_var1_double(int ncid, int varid, const size_t *indexp, const double *op);
-
-EXTERNL int
-nc3_get_var1_double(int ncid, int varid, const size_t *indexp, double *ip);
-
-EXTERNL int
-nc3_put_var1_ubyte(int ncid, int varid, const size_t *indexp, 
-		  const unsigned char *op);
-
-EXTERNL int
-nc3_get_var1_ubyte(int ncid, int varid, const size_t *indexp, 
-		  unsigned char *ip);
-
-EXTERNL int
-nc3_put_var1_ushort(int ncid, int varid, const size_t *indexp, 
-		   const unsigned short *op);
-
-EXTERNL int
-nc3_get_var1_ushort(int ncid, int varid, const size_t *indexp, 
-		   unsigned short *ip);
-
-EXTERNL int
-nc3_put_var1_uint(int ncid, int varid, const size_t *indexp, 
-		 const unsigned int *op);
-
-EXTERNL int
-nc3_get_var1_uint(int ncid, int varid, const size_t *indexp, 
-		 unsigned int *ip);
-
-EXTERNL int
-nc3_put_var1_longlong(int ncid, int varid, const size_t *indexp, 
-		     const long long *op);
-
-EXTERNL int
-nc3_get_var1_longlong(int ncid, int varid, const size_t *indexp, 
-		  long long *ip);
-
-EXTERNL int
-nc3_put_var1_ulonglong(int ncid, int varid, const size_t *indexp, 
-		   const unsigned long long *op);
-
-EXTERNL int
-nc3_get_var1_ulonglong(int ncid, int varid, const size_t *indexp, 
-		   unsigned long long *ip);
-
-EXTERNL int
-nc3_put_var1_string(int ncid, int varid, const size_t *indexp, 
-		   const char **op);
-
-EXTERNL int
-nc3_get_var1_string(int ncid, int varid, const size_t *indexp, 
-		   char **ip);
-
-/* End {put,get}_var1 */
-/* Begin {put,get}_vara */
-
-EXTERNL int
-nc3_put_vara_text(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const char *op);
-
-EXTERNL int
-nc3_get_vara_text(int ncid, int varid,
-	const size_t *startp, const size_t *countp, char *ip);
-
-EXTERNL int
-nc3_put_vara_uchar(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const unsigned char *op);
-
-EXTERNL int
-nc3_get_vara_uchar(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, unsigned char *ip);
-
-EXTERNL int
-nc3_put_vara_schar(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const signed char *op);
-
-EXTERNL int
-nc3_get_vara_schar(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, signed char *ip);
-
-EXTERNL int
-nc3_put_vara_short(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const short *op);
-
-EXTERNL int
-nc3_get_vara_short(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, short *ip);
-
-EXTERNL int
-nc3_put_vara_int(int ncid, int varid, const size_t *startp, 
-		const size_t *countp, const int *op);
-
-EXTERNL int
-nc3_get_vara_int(int ncid, int varid, const size_t *startp, 
-		const size_t *countp, int *ip);
-
-EXTERNL int
-nc3_put_vara_long(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const long *op);
-
-EXTERNL int
-nc3_get_vara_long(int ncid, int varid,
-	const size_t *startp, const size_t *countp, long *ip);
-
-EXTERNL int
-nc3_put_vara_float(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const float *op);
-
-EXTERNL int
-nc3_get_vara_float(int ncid, int varid,
-	const size_t *startp, const size_t *countp, float *ip);
-
-EXTERNL int
-nc3_put_vara_double(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const double *op);
-
-EXTERNL int
-nc3_get_vara_double(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, double *ip);
-
-EXTERNL int
-nc3_put_vara_ubyte(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const unsigned char *op);
-
-EXTERNL int
-nc3_get_vara_ubyte(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, unsigned char *ip);
-
-EXTERNL int
-nc3_put_vara_ushort(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const unsigned short *op);
-
-EXTERNL int
-nc3_get_vara_ushort(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, unsigned short *ip);
-
-EXTERNL int
-nc3_put_vara_uint(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const unsigned int *op);
-
-EXTERNL int
-nc3_get_vara_uint(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, unsigned int *ip);
-
-EXTERNL int
-nc3_put_vara_longlong(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const long long *op);
-
-EXTERNL int
-nc3_get_vara_longlong(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, long long *ip);
-
-EXTERNL int
-nc3_put_vara_ulonglong(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const unsigned long long *op);
-
-EXTERNL int
-nc3_get_vara_ulonglong(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, unsigned long long *ip);
-
-EXTERNL int
-nc3_put_vara_string(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const char **op);
-
-EXTERNL int
-nc3_get_vara_string(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, char **ip);
-
-/* End {put,get}_vara */
-/* Begin {put,get}_vars */
-
-EXTERNL int
-nc3_put_vars_text(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const char *op);
-
-EXTERNL int
-nc3_get_vars_text(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	char *ip);
-
-EXTERNL int
-nc3_put_vars_uchar(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const unsigned char *op);
-
-EXTERNL int
-nc3_get_vars_uchar(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	unsigned char *ip);
-
-EXTERNL int
-nc3_put_vars_schar(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const signed char *op);
-
-EXTERNL int
-nc3_get_vars_schar(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	signed char *ip);
-
-EXTERNL int
-nc3_put_vars_short(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const short *op);
-
-EXTERNL int
-nc3_get_vars_short(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  short *ip);
-
-EXTERNL int
-nc3_put_vars_int(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const int *op);
-
-EXTERNL int
-nc3_get_vars_int(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	int *ip);
-
-EXTERNL int
-nc3_put_vars_long(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const long *op);
-
-EXTERNL int
-nc3_get_vars_long(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	long *ip);
-
-EXTERNL int
-nc3_put_vars_float(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const float *op);
-
-EXTERNL int
-nc3_get_vars_float(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	float *ip);
-
-EXTERNL int
-nc3_put_vars_double(int ncid, int varid,
-	const size_t *startp, const size_t *countp, const ptrdiff_t *stridep,
-	const double *op);
-
-EXTERNL int
-nc3_get_vars_double(int ncid, int varid,	const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep,
-		   double *ip);
-
-EXTERNL int
-nc3_put_vars_ubyte(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  const unsigned char *op);
-
-EXTERNL int
-nc3_get_vars_ubyte(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  unsigned char *ip);
-
-EXTERNL int
-nc3_put_vars_ushort(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const unsigned short *op);
-
-EXTERNL int
-nc3_get_vars_ushort(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   unsigned short *ip);
-
-EXTERNL int
-nc3_put_vars_uint(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep, 
-		 const unsigned int *op);
-
-EXTERNL int
-nc3_get_vars_uint(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep, 
-		 unsigned int *ip);
-
-EXTERNL int
-nc3_put_vars_longlong(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  const long long *op);
-
-EXTERNL int
-nc3_get_vars_longlong(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  long long *ip);
-
-EXTERNL int
-nc3_put_vars_ulonglong(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const unsigned long long *op);
-
-EXTERNL int
-nc3_get_vars_ulonglong(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   unsigned long long *ip);
-
-EXTERNL int
-nc3_put_vars_string(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const char **op);
-
-EXTERNL int
-nc3_get_vars_string(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   char **ip);
-
-/* End {put,get}_vars */
-/* Begin {put,get}_varm */
-
-EXTERNL int
-nc3_put_varm_text(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep,
-		 const ptrdiff_t *imapp, const char *op);
-
-EXTERNL int
-nc3_get_varm_text(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep,
-		 const ptrdiff_t *imapp, char *ip);
-
-EXTERNL int
-nc3_put_varm_uchar(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, const unsigned char *op);
-
-EXTERNL int
-nc3_get_varm_uchar(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, unsigned char *ip);
-
-EXTERNL int
-nc3_put_varm_schar(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, const signed char *op);
-
-EXTERNL int
-nc3_get_varm_schar(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, signed char *ip);
-
-EXTERNL int
-nc3_put_varm_short(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, const short *op);
-
-EXTERNL int
-nc3_get_varm_short(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, short *ip);
-
-EXTERNL int
-nc3_put_varm_int(int ncid, int varid, const size_t *startp, 
-		const size_t *countp, const ptrdiff_t *stridep,
-		const ptrdiff_t *imapp, const int *op);
-
-EXTERNL int
-nc3_get_varm_int(int ncid, int varid, const size_t *startp, 
-		const size_t *countp, const ptrdiff_t *stridep,
-		const ptrdiff_t *imapp, int *ip);
-
-EXTERNL int
-nc3_put_varm_long(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep,
-		 const ptrdiff_t *imapp, const long *op);
-
-EXTERNL int
-nc3_get_varm_long(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep,
-		 const ptrdiff_t *imapp, long *ip);
-
-EXTERNL int
-nc3_put_varm_float(int ncid, int varid,const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, const float *op);
-
-EXTERNL int
-nc3_get_varm_float(int ncid, int varid,const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep,
-		  const ptrdiff_t *imapp, float *ip);
-
-EXTERNL int
-nc3_put_varm_double(int ncid, int varid,	const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep,
-		   const ptrdiff_t *imapp, const double *op);
-
-EXTERNL int
-nc3_get_varm_double(int ncid, int varid,	const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep,
-		   const ptrdiff_t * imapp, double *ip);
-
-EXTERNL int
-nc3_put_varm_ubyte(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  const ptrdiff_t * imapp, const unsigned char *op);
-
-EXTERNL int
-nc3_get_varm_ubyte(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  const ptrdiff_t * imapp, unsigned char *ip);
-
-EXTERNL int
-nc3_put_varm_ushort(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const ptrdiff_t * imapp, const unsigned short *op);
-
-EXTERNL int
-nc3_get_varm_ushort(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const ptrdiff_t * imapp, unsigned short *ip);
-
-EXTERNL int
-nc3_put_varm_uint(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep, 
-		 const ptrdiff_t * imapp, const unsigned int *op);
-
-EXTERNL int
-nc3_get_varm_uint(int ncid, int varid, const size_t *startp, 
-		 const size_t *countp, const ptrdiff_t *stridep, 
-		 const ptrdiff_t * imapp, unsigned int *ip);
-
-EXTERNL int
-nc3_put_varm_longlong(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  const ptrdiff_t * imapp, const long long *op);
-
-EXTERNL int
-nc3_get_varm_longlong(int ncid, int varid, const size_t *startp, 
-		  const size_t *countp, const ptrdiff_t *stridep, 
-		  const ptrdiff_t * imapp, long long *ip);
-
-EXTERNL int
-nc3_put_varm_ulonglong(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const ptrdiff_t * imapp, const unsigned long long *op);
-
-EXTERNL int
-nc3_get_varm_ulonglong(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const ptrdiff_t * imapp, unsigned long long *ip);
-
-EXTERNL int
-nc3_put_varm_string(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const ptrdiff_t * imapp, const char **op);
-
-EXTERNL int
-nc3_get_varm_string(int ncid, int varid, const size_t *startp, 
-		   const size_t *countp, const ptrdiff_t *stridep, 
-		   const ptrdiff_t * imapp, char **ip);
-
-/* End {put,get}_varm */
-/* Begin {put,get}_var */
-
-EXTERNL int
-nc3_put_var_text(int ncid, int varid, const char *op);
-
-EXTERNL int
-nc3_get_var_text(int ncid, int varid, char *ip);
-
-EXTERNL int
-nc3_put_var_uchar(int ncid, int varid, const unsigned char *op);
-
-EXTERNL int
-nc3_get_var_uchar(int ncid, int varid, unsigned char *ip);
-
-EXTERNL int
-nc3_put_var_schar(int ncid, int varid, const signed char *op);
-
-EXTERNL int
-nc3_get_var_schar(int ncid, int varid, signed char *ip);
-
-EXTERNL int
-nc3_put_var_short(int ncid, int varid, const short *op);
-
-EXTERNL int
-nc3_get_var_short(int ncid, int varid, short *ip);
-
-EXTERNL int
-nc3_put_var_int(int ncid, int varid, const int *op);
-
-EXTERNL int
-nc3_get_var_int(int ncid, int varid, int *ip);
-
-EXTERNL int
-nc3_put_var_long(int ncid, int varid, const long *op);
-
-EXTERNL int
-nc3_get_var_long(int ncid, int varid, long *ip);
-
-EXTERNL int
-nc3_put_var_float(int ncid, int varid, const float *op);
-
-EXTERNL int
-nc3_get_var_float(int ncid, int varid, float *ip);
-
-EXTERNL int
-nc3_put_var_double(int ncid, int varid, const double *op);
-
-EXTERNL int
-nc3_get_var_double(int ncid, int varid, double *ip);
-
-EXTERNL int
-nc3_put_var_ubyte(int ncid, int varid, const unsigned char *op);
-
-EXTERNL int
-nc3_get_var_ubyte(int ncid, int varid, unsigned char *ip);
-
-EXTERNL int
-nc3_put_var_ushort(int ncid, int varid, const unsigned short *op);
-
-EXTERNL int
-nc3_get_var_ushort(int ncid, int varid, unsigned short *ip);
-
-EXTERNL int
-nc3_put_var_uint(int ncid, int varid, const unsigned int *op);
-
-EXTERNL int
-nc3_get_var_uint(int ncid, int varid, unsigned int *ip);
-
-EXTERNL int
-nc3_put_var_longlong(int ncid, int varid, const long long *op);
-
-EXTERNL int
-nc3_get_var_longlong(int ncid, int varid, long long *ip);
-
-EXTERNL int
-nc3_put_var_ulonglong(int ncid, int varid, const unsigned long long *op);
-
-EXTERNL int
-nc3_get_var_ulonglong(int ncid, int varid, unsigned long long *ip);
-
-EXTERNL int
-nc3_put_var_string(int ncid, int varid, const char **op);
-
-EXTERNL int
-nc3_get_var_string(int ncid, int varid, char **ip);
-
-EXTERNL int
-nc3__create_mp(const char *path, int cmode, size_t initialsz, int basepe,
-	 size_t *chunksizehintp, int *ncidp);
-
-EXTERNL int
-nc3__open_mp(const char *path, int mode, int basepe,
-	size_t *chunksizehintp, int *ncidp);
-
-EXTERNL int
-nc3_enddef(int ncid);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif /*_NC3STUB_H*/
diff --git a/libsrc4/nc4attr.c b/libsrc4/nc4attr.c
index d230ee3..3648d15 100644
--- a/libsrc4/nc4attr.c
+++ b/libsrc4/nc4attr.c
@@ -42,7 +42,6 @@ nc4_get_att(int ncid, NC *nc, int varid, const char *name,
    char norm_name[NC_MAX_NAME + 1];
    int i;
    int retval = NC_NOERR;
-   const char** sp;
 
    if (attnum) {
       my_attnum = *attnum;
@@ -56,6 +55,18 @@ nc4_get_att(int ncid, NC *nc, int varid, const char *name,
    if (!(grp = nc4_rec_find_grp(h5->root_grp, (ncid & GRP_ID_MASK))))
       BAIL(NC_EBADGRPID);
 
+   /* Check varid */
+   if (varid != NC_GLOBAL) {
+       if (varid < 0 || varid >= grp->vars.nelems)
+	   return NC_ENOTVAR;
+       if (grp->vars.value[varid] == NULL)
+           return NC_ENOTVAR;
+       assert(grp->vars.value[varid]->varid == varid);
+   }
+
+   if (name == NULL)
+       BAIL(NC_EBADNAME);
+
    /* Normalize name. */
    if ((retval = nc4_normalize_name(name, norm_name)))
       BAIL(retval);
@@ -243,6 +254,22 @@ nc4_put_att(int ncid, NC *nc, int varid, const char *name,
    if (h5->no_write)
      return NC_EPERM;
 
+   /* Find att, if it exists. */
+   if (varid == NC_GLOBAL)
+      attlist = &grp->att;
+   else
+   {
+      if (varid < 0 || varid >= grp->vars.nelems)
+	return NC_ENOTVAR;
+      var = grp->vars.value[varid];
+      if (!var) return NC_ENOTVAR;
+      attlist = &var->att;
+      assert(var->varid == varid);
+   }
+
+   if (!name)
+      return NC_EBADNAME;
+
    /* Check and normalize the name. */
    if ((retval = nc4_check_name(name, norm_name)))
       return retval;
@@ -256,25 +283,18 @@ nc4_put_att(int ncid, NC *nc, int varid, const char *name,
 	}
     }
 
-   /* Find att, if it exists. */
-   if (varid == NC_GLOBAL)
-      attlist = &grp->att;
-   else
-   {
-     for (var = grp->var; var; var = var->l.next)
-       if (var->varid == varid)
-         {
-           attlist = &var->att;
-           break;
-         }
-     if (!var)
-       return NC_ENOTVAR;
-   }
-
    for (att = *attlist; att; att = att->l.next)
      if (!strcmp(att->name, norm_name))
        break;
 
+   /* If len is not zero, then there must be some data. */
+   if (len && !data)
+      return NC_EINVAL;
+
+   LOG((1, "nc4_put_att: ncid 0x%x varid %d name %s "
+	"file_type %d mem_type %d len %d", ncid, varid,
+	name, file_type, mem_type, len));
+
    if (!att)
    {
       /* If this is a new att, require define mode. */
@@ -364,7 +384,6 @@ nc4_put_att(int ncid, NC *nc, int varid, const char *name,
     * attribute). */
    if (!strcmp(att->name, _FillValue) && varid != NC_GLOBAL)
    {
-      NC_ATT_INFO_T *varatt;
       int size;
 
       /* Fill value must be same type and have exactly one value */
@@ -666,14 +685,12 @@ NC4_rename_att(int ncid, int varid, const char *name,
    }
    else
    {
-      for (var = grp->var; var; var = var->l.next)
-	 if (var->varid == varid)
-	 {
-	    list = var->att;
-	    break;
-	 }
-      if (!var)
-	 return NC_ENOTVAR;
+      if (varid < 0 || varid >= grp->vars.nelems)
+	return NC_ENOTVAR;
+      var = grp->vars.value[varid];
+      if (!var) return NC_ENOTVAR;
+      assert(var->varid == varid);
+      list = var->att;
    }
    for (att = list; att; att = att->l.next)
       if (!strncmp(att->name, norm_newname, NC_MAX_NAME))
@@ -777,16 +794,12 @@ NC4_del_att(int ncid, int varid, const char *name)
    }
    else
    {
-      for(var = grp->var; var; var = var->l.next)
-      {
-	 if (var->varid == varid)
-	 {
-	    attlist = &var->att;
-	    break;
-	 }
-      }
-      if (!var)
-	 return NC_ENOTVAR;
+      if (varid < 0 || varid >= grp->vars.nelems)
+	return NC_ENOTVAR;
+      var = grp->vars.value[varid];
+      if (!var) return NC_ENOTVAR;
+      attlist = &var->att;
+      assert(var->varid == varid);
       if (var->created)
 	 locid = var->hdf_datasetid;
    }
@@ -831,12 +844,6 @@ nc4_put_att_tc(int ncid, int varid, const char *name, nc_type file_type,
    NC *nc;
    NC_HDF5_FILE_INFO_T *h5;
 
-   if (!name || strlen(name) > NC_MAX_NAME)
-      return NC_EBADNAME;
-
-   LOG((3, "nc4_put_att_tc: ncid 0x%x varid %d name %s file_type %d "
-	"mem_type %d len %d", ncid, varid, name, file_type, mem_type, len));
-
    /* The length needs to be positive (cast needed for braindead
       systems with signed size_t). */
    if((unsigned long) len > X_INT_MAX)
@@ -850,6 +857,26 @@ nc4_put_att_tc(int ncid, int varid, const char *name, nc_type file_type,
    h5 = NC4_DATA(nc);
    assert(h5);
 
+   /* Check varid */
+   if (varid != NC_GLOBAL) {
+       /* Find info for this file and group, and set pointer to each. */
+       NC_GRP_INFO_T *grp;
+       if (!(grp = nc4_rec_find_grp(h5->root_grp, (ncid & GRP_ID_MASK))))
+          return NC_EBADGRPID;
+
+       if (varid < 0 || varid >= grp->vars.nelems)
+	   return NC_ENOTVAR;
+       if (grp->vars.value[varid] == NULL)
+           return NC_ENOTVAR;
+       assert(grp->vars.value[varid]->varid == varid);
+   }
+
+   if (!name || strlen(name) > NC_MAX_NAME)
+      return NC_EBADNAME;
+
+   LOG((3, "nc4_put_att_tc: ncid 0x%x varid %d name %s file_type %d "
+	"mem_type %d len %d", ncid, varid, name, file_type, mem_type, len));
+
    if(nc->ext_ncid == ncid && varid == NC_GLOBAL) {
       const char** reserved = NC_RESERVED_ATT_LIST;
       for(;*reserved;reserved++) {
diff --git a/libsrc4/nc4dispatch.c b/libsrc4/nc4dispatch.c
index 02d01fb..80b4f97 100644
--- a/libsrc4/nc4dispatch.c
+++ b/libsrc4/nc4dispatch.c
@@ -6,9 +6,8 @@
 
 #include "config.h"
 #include <stdlib.h>
-#include "nc.h"
-#include "ncdispatch.h"
 #include "nc4dispatch.h"
+#include "nc.h"
 
 static NC_Dispatch NC4_dispatcher = {
 
diff --git a/libsrc4/nc4dispatch.h b/libsrc4/nc4dispatch.h
deleted file mode 100644
index b43782a..0000000
--- a/libsrc4/nc4dispatch.h
+++ /dev/null
@@ -1,278 +0,0 @@
-/*********************************************************************
- * Copyright 2010, UCAR/Unidata. See netcdf/COPYRIGHT file for copying
- * and redistribution conditions.
- *
- * This header file contains the prototypes for the netCDF-4 versions
- * of all the netCDF functions.
- *********************************************************************/
-
-#ifndef _NC4DISPATCH_H
-#define _NC4DISPATCH_H
-
-#include "config.h"
-#include <stddef.h> /* size_t, ptrdiff_t */
-#include <errno.h>  /* netcdf functions sometimes return system errors */
-#include "ncdispatch.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-	/* We use EXTERNL instead of extern.
-	   On Windows system, EXTERNL has been defined (see netcdf.h) such
-	   that symbols are properly exported/imported between
-	   libraries and executables.  On non-windows systems,
-	   EXTERNL is defined as extern. */
-
-
-EXTERNL int
-NC4_create(const char *path, int cmode,
-           size_t initialsz, int basepe, size_t *chunksizehintp,
-	   int useparallel, void* parameters,
-	   NC_Dispatch*, NC*);
-
-EXTERNL int
-NC4_open(const char *path, int mode,
-         int basepe, size_t *chunksizehintp, 
-	 int use_parallel, void* parameters,
-	 NC_Dispatch*, NC*);
-
-EXTERNL int
-NC4_redef(int ncid);
-
-EXTERNL int
-NC4__enddef(int ncid, size_t h_minfree, size_t v_align,
-	size_t v_minfree, size_t r_align);
-
-EXTERNL int
-NC4_sync(int ncid);
-
-EXTERNL int
-NC4_abort(int ncid);
-
-EXTERNL int
-NC4_close(int ncid);
-
-EXTERNL int
-NC4_set_fill(int ncid, int fillmode, int *old_modep);
-
-EXTERNL int
-NC4_set_base_pe(int ncid, int pe);
-
-EXTERNL int
-NC4_inq_base_pe(int ncid, int *pe);
-
-EXTERNL int
-NC4_inq_format(int ncid, int *formatp);
-
-EXTERNL int
-NC4_inq_format_extended(int ncid, int *formatp, int *modep);
-
-EXTERNL int
-NC4_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp);
-
-EXTERNL int
-NC4_inq_type(int, nc_type, char *, size_t *);
-
-/* Begin _dim */
-
-EXTERNL int
-NC4_def_dim(int ncid, const char *name, size_t len, int *idp);
-
-EXTERNL int
-NC4_inq_dimid(int ncid, const char *name, int *idp);
-
-EXTERNL int
-NC4_inq_dim(int ncid, int dimid, char *name, size_t *lenp);
-
-EXTERNL int
-NC4_inq_unlimdim(int ncid, int *unlimdimidp);
-
-EXTERNL int
-NC4_rename_dim(int ncid, int dimid, const char *name);
-
-/* End _dim */
-/* Begin _att */
-
-EXTERNL int
-NC4_inq_att(int ncid, int varid, const char *name,
-	    nc_type *xtypep, size_t *lenp);
-
-EXTERNL int 
-NC4_inq_attid(int ncid, int varid, const char *name, int *idp);
-
-EXTERNL int
-NC4_inq_attname(int ncid, int varid, int attnum, char *name);
-
-EXTERNL int
-NC4_rename_att(int ncid, int varid, const char *name, const char *newname);
-
-EXTERNL int
-NC4_del_att(int ncid, int varid, const char*);
-
-/* End _att */
-/* Begin {put,get}_att */
-
-EXTERNL int
-NC4_get_att(int ncid, int varid, const char *name, void *value, nc_type);
-
-EXTERNL int
-NC4_put_att(int ncid, int varid, const char *name, nc_type datatype,
-	   size_t len, const void *value, nc_type);
-
-/* End {put,get}_att */
-/* Begin _var */
-
-EXTERNL int
-NC4_def_var(int ncid, const char *name,
-	 nc_type xtype, int ndims, const int *dimidsp, int *varidp);
-
-EXTERNL int
-NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep, 
-               int *ndimsp, int *dimidsp, int *nattsp, 
-               int *shufflep, int *deflatep, int *deflate_levelp,
-               int *fletcher32p, int *contiguousp, size_t *chunksizesp, 
-               int *no_fill, void *fill_valuep, int *endiannessp, 
-	       int *options_maskp, int *pixels_per_blockp);
-
-EXTERNL int
-NC4_inq_varid(int ncid, const char *name, int *varidp);
-
-EXTERNL int
-NC4_rename_var(int ncid, int varid, const char *name);
-
-EXTERNL int
-NC4_put_vara(int ncid, int varid,
-   	     const size_t *start, const size_t *count,
-             const void *value, nc_type);
-
-EXTERNL int
-NC4_get_vara(int ncid, int varid,
-	     const size_t *start, const size_t *count,
-             void *value, nc_type);
-
-/* End _var */
-
-/* netCDF4 API only */
-EXTERNL int
-NC4_var_par_access(int, int, int);
-
-EXTERNL int
-NC4_inq_ncid(int, const char *, int *);
-
-EXTERNL int
-NC4_inq_grps(int, int *, int *);
-
-EXTERNL int
-NC4_inq_grpname(int, char *);
-
-EXTERNL int
-NC4_inq_grpname_full(int, size_t *, char *);
-
-EXTERNL int
-NC4_inq_grp_parent(int, int *);
-
-EXTERNL int
-NC4_inq_grp_full_ncid(int, const char *, int *);
-
-EXTERNL int
-NC4_inq_varids(int, int * nvars, int *);
-
-EXTERNL int
-NC4_inq_dimids(int, int * ndims, int *, int);
-
-EXTERNL int
-NC4_inq_typeids(int, int * ntypes, int *);
-   
-EXTERNL int
-NC4_inq_type_equal(int, nc_type, int, nc_type, int *);
-
-EXTERNL int
-NC4_def_grp(int, const char *, int *);
-
-EXTERNL int
-NC4_rename_grp(int, const char *);
-
-EXTERNL int
-NC4_inq_user_type(int, nc_type, char *, size_t *, nc_type *, 
-		  size_t *, int *);
-
-EXTERNL int
-NC4_def_compound(int, size_t, const char *, nc_type *);
-
-EXTERNL int
-NC4_insert_compound(int, nc_type, const char *, size_t, nc_type);
-
-EXTERNL int
-NC4_insert_array_compound(int, nc_type, const char *, size_t, 
-			  nc_type, int, const int *);
-
-EXTERNL int
-NC4_inq_typeid(int, const char *, nc_type *);
-
-EXTERNL int
-NC4_inq_compound_field(int, nc_type, int, char *, size_t *, 
-		       nc_type *, int *, int *);
-
-EXTERNL int
-NC4_inq_compound_fieldindex(int, nc_type, const char *, int *);
-
-EXTERNL int
-NC4_def_vlen(int, const char *, nc_type base_typeid, nc_type *);
-
-EXTERNL int
-NC4_put_vlen_element(int, int, void *, size_t, const void *);
-
-EXTERNL int
-NC4_get_vlen_element(int, int, const void *, size_t *, void *);
-
-EXTERNL int
-NC4_def_enum(int, nc_type, const char *, nc_type *);
-
-EXTERNL int
-NC4_insert_enum(int, nc_type, const char *, const void *);
-
-EXTERNL int
-NC4_inq_enum_member(int, nc_type, int, char *, void *);
-
-EXTERNL int
-NC4_inq_enum_ident(int, nc_type, long long, char *);
-
-EXTERNL int
-NC4_def_opaque(int, size_t, const char *, nc_type *);
-
-EXTERNL int
-NC4_def_var_deflate(int, int, int, int, int);
-
-EXTERNL int
-NC4_def_var_fletcher32(int, int, int);
-
-EXTERNL int
-NC4_def_var_chunking(int, int, int, const size_t *);
-
-EXTERNL int
-NC4_def_var_fill(int, int, int, const void *);
-
-EXTERNL int
-NC4_def_var_endian(int, int, int);
-
-EXTERNL int
-NC4_set_var_chunk_cache(int, int, size_t, size_t, float);
-
-EXTERNL int
-NC4_get_var_chunk_cache(int, int, size_t *, size_t *, float *);
-
-EXTERNL int
-NC4_inq_unlimdims(int, int *, int *);
-
-EXTERNL int
-NC4_show_metadata(int);
-
-extern int 
-NC4_initialize(void);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif /*_NC4DISPATCH_H */
diff --git a/libsrc4/nc4file.c b/libsrc4/nc4file.c
index 7667b35..c008097 100644
--- a/libsrc4/nc4file.c
+++ b/libsrc4/nc4file.c
@@ -16,6 +16,9 @@ COPYRIGHT file for copying and redistribution conditions.
 #include "nc4internal.h"
 #include "nc4dispatch.h"
 
+extern int nc4_vararray_add(NC_GRP_INFO_T *grp,
+			    NC_VAR_INFO_T *var);
+
 /* must be after nc4internal.h */
 #include <H5DSpublic.h>
 #include <H5Fpublic.h>
@@ -42,6 +45,74 @@ extern int num_spaces;
 #define MIN_DEFLATE_LEVEL 0
 #define MAX_DEFLATE_LEVEL 9
 
+/*Forward*/
+static int read_hdf5_att(NC_GRP_INFO_T *grp, hid_t attid, NC_ATT_INFO_T *att);
+static void hdf5free(void* memory);
+
+/* Custom iteration callback data */
+typedef struct {
+  NC_GRP_INFO_T *grp;
+  NC_VAR_INFO_T *var;
+} att_iter_info;
+
+static herr_t
+att_read_var_callbk(hid_t loc_id, const char *att_name, const H5A_info_t *ainfo, void *att_data)
+{
+
+  hid_t attid = 0;
+  int retval = NC_NOERR;
+  NC_ATT_INFO_T *att;
+  att_iter_info *att_info = (att_iter_info *)att_data;
+  const char** reserved;
+
+
+  /* Should we ignore this attribute? */
+  for(reserved=NC_RESERVED_VARATT_LIST;*reserved;reserved++) {
+    if (strcmp(att_name, *reserved)==0) break;
+  }
+
+  if(*reserved == NULL) {
+      /* Open the att by name. */
+      if ((attid = H5Aopen(loc_id, att_name, H5P_DEFAULT)) < 0)
+	BAIL(NC_EATTMETA);
+      LOG((4, "%s::  att_name %s", __func__, att_name));
+      /* Add to the end of the list of atts for this var. */
+      if ((retval = nc4_att_list_add(&att_info->var->att, &att)))
+	BAIL(retval);
+      /* Fill in the information we know. */
+      att->attnum = att_info->var->natts++;
+      if (!(att->name = strdup(att_name)))
+	BAIL(NC_ENOMEM);
+
+      /* Read the rest of the info about the att,
+       * including its values. */
+      if ((retval = read_hdf5_att(att_info->grp, attid, att)))
+	{
+	  if (NC_EBADTYPID == retval)
+            {
+	      if ((retval = nc4_att_list_del(&att_info->var->att, att)))
+		BAIL(retval);
+            }
+	  else
+	    BAIL(retval);
+	}
+
+      att->created = NC_TRUE;
+
+      if (attid > 0 && H5Aclose(attid) < 0)
+	BAIL2(NC_EHDFERR);
+
+    } /* endif not HDF5 att */
+  
+  return NC_NOERR;
+
+ exit:
+  if (attid > 0 && H5Aclose(attid) < 0)
+    BAIL2(NC_EHDFERR);
+
+  return retval;
+}
+
 /* Define the illegal mode flags */
 static const int ILLEGAL_OPEN_FLAGS = (NC_MMAP|NC_64BIT_OFFSET);
 
@@ -443,6 +514,11 @@ nc4_create_file(const char *path, int cmode, MPI_Comm comm, MPI_Info info,
       BAIL(NC_EHDFERR);
 
    /* Create the file. */
+#ifdef HDF5_HAS_COLL_METADATA_OPS
+   H5Pset_all_coll_metadata_ops(fapl_id, 1 );
+   H5Pset_coll_metadata_write(fapl_id, 1);
+#endif
+
    if ((nc4_info->hdfid = H5Fcreate(path, flags, fcpl_id, fapl_id)) < 0)
         /*Change the return error from NC_EFILEMETADATA to
           System error EACCES because that is the more likely problem */
@@ -506,7 +582,6 @@ NC4_create(const char* path, int cmode, size_t initialsz, int basepe,
    MPI_Comm comm = MPI_COMM_WORLD;
    MPI_Info info = MPI_INFO_NULL;
    int res;
-   NC* nc;
 
    assert(nc_file && path);
 
@@ -561,7 +636,7 @@ NC4_create(const char* path, int cmode, size_t initialsz, int basepe,
    LOG((2, "cmode after applying default format: 0x%x", cmode));
 
    nc_file->int_ncid = nc_file->ext_ncid;
-   res = nc4_create_file(path, cmode, comm, info, nc_file);
+   res = nc4_create_file(nc_file->path, cmode, comm, info, nc_file);
 
    return res;
 }
@@ -581,7 +656,6 @@ read_scale(NC_GRP_INFO_T *grp, hid_t datasetid, const char *obj_name,
    htri_t attr_exists = -1;             /* Flag indicating hidden attribute exists */
    hid_t attid = -1;                    /* ID of hidden attribute (to store dim ID) */
    int dimscale_created = 0;            /* Remember if a dimension was created (for error recovery) */
-   int initial_grp_ndims = grp->ndims;  /* Retain for error recovery */
    short initial_next_dimid = grp->nc4_info->next_dimid;/* Retain for error recovery */
    int retval;
 
@@ -612,9 +686,6 @@ read_scale(NC_GRP_INFO_T *grp, hid_t datasetid, const char *obj_name,
       new_dim->dimid = grp->nc4_info->next_dimid++;
    }
 
-   /* Increment number of dimensions. */
-   grp->ndims++;
-
    if (!(new_dim->name = strdup(obj_name)))
       BAIL(NC_ENOMEM);
    if (SIZEOF_SIZE_T < 8 && scale_size > NC_MAX_UINT)
@@ -674,7 +745,6 @@ exit:
            BAIL2(retval);
 
       /* Reset the group's information */
-      grp->ndims = initial_grp_ndims;
       grp->nc4_info->next_dimid = initial_next_dimid;
    }
 
@@ -1330,27 +1400,11 @@ read_type(NC_GRP_INFO_T *grp, hid_t hdf_typeid, char *type_name)
                      break;
                }
 
-#ifndef JNA
-
-               /* Free the member name (which HDF5 allocated for us). */
-			   /* On Windows using the microsoft runtime, it is an error
-				  for one library to free memory allocated by a different library.
-                  IF it is available, we should use H5free_memory*/
-
-#ifdef HDF5_HAS_H5FREE
-               if(member_name != NULL) H5free_memory(member_name);
-#else
-#ifndef _MSC_VER
-               if(member_name != NULL) free(member_name);
-#endif
-#endif
-#endif
+	       hdf5free(member_name);
 	       member_name = NULL;
             }
-#ifndef JNA
-	    if(member_name != NULL)
-		free(member_name);
-#endif
+	    hdf5free(member_name);
+	    member_name = NULL;	    	
 	    if(retval) /* error exit from loop */
 		return retval;
          }
@@ -1474,17 +1528,11 @@ read_type(NC_GRP_INFO_T *grp, hid_t hdf_typeid, char *type_name)
 		  break;
                }
 
-#ifndef JNA
-               /* Free the member name (which HDF5 allocated for us). */
-               if(member_name != NULL) free(member_name);
-#endif
+	       hdf5free(member_name);
 	       member_name = NULL;
             }
-
-#ifndef JNA
-	    if(member_name != NULL)
-		free(member_name);
-#endif
+	    hdf5free(member_name);
+	    member_name = NULL;
         if(value) free(value);
         if(retval) /* error exit from loop */
           return retval;
@@ -1513,7 +1561,7 @@ read_var(NC_GRP_INFO_T *grp, hid_t datasetid, const char *obj_name,
    const char** reserved;
 
    NC_ATT_INFO_T *att;
-   hid_t attid = 0;
+   att_iter_info att_info;         /* Custom iteration information */
    char att_name[NC_MAX_HDF5_NAME + 1];
 
 #define CD_NELEMS_ZLIB 1
@@ -1534,7 +1582,7 @@ read_var(NC_GRP_INFO_T *grp, hid_t datasetid, const char *obj_name,
    LOG((4, "%s: obj_name %s", __func__, obj_name));
 
    /* Add a variable to the end of the group's var list. */
-   if ((retval = nc4_var_list_add(&grp->var, &var)))
+   if ((retval = nc4_var_add(&var)))
       BAIL(retval);
 
    /* Fill in what we already know. */
@@ -1761,54 +1809,14 @@ read_var(NC_GRP_INFO_T *grp, hid_t datasetid, const char *obj_name,
 
    /* Now read all the attributes of this variable, ignoring the
       ones that hold HDF5 dimension scale information. */
-   if ((natts = H5Aget_num_attrs(var->hdf_datasetid)) < 0)
-      BAIL(NC_EATTMETA);
-   for (a = 0; a < natts; a++)
-   {
-      /* Close the attribute and try to move on with our
-       * lives. Like bits through the network port, so
-       * flows the Days of Our Lives! */
-      if (attid && H5Aclose(attid) < 0)
-         BAIL(NC_EHDFERR);
 
-      /* Open the att and get its name. */
-      if ((attid = H5Aopen_idx(var->hdf_datasetid, (unsigned int)a)) < 0)
-         BAIL(NC_EATTMETA);
-      if (H5Aget_name(attid, NC_MAX_HDF5_NAME, att_name) < 0)
-         BAIL(NC_EATTMETA);
-      LOG((4, "%s:: a %d att_name %s", __func__, a, att_name));
+   att_info.var = var;
+   att_info.grp = grp;
 
-      /* Should we ignore this attribute? */
-      for(reserved=NC_RESERVED_VARATT_LIST;*reserved;reserved++) {
-          if (strcmp(att_name, *reserved)==0) break;
-      }
-      if(*reserved == NULL) {
-	 /* Add to the end of the list of atts for this var. */
-	 if ((retval = nc4_att_list_add(&var->att, &att)))
-	    BAIL(retval);
+   if ((H5Aiterate2(var->hdf_datasetid, H5_INDEX_CRT_ORDER, H5_ITER_INC, NULL, att_read_var_callbk, &att_info)) < 0)
+     BAIL(NC_EATTMETA);
 
-	 /* Fill in the information we know. */
-	 att->attnum = var->natts++;
-	 if (!(att->name = strdup(att_name)))
-	    BAIL(NC_ENOMEM);
-
-	 /* Read the rest of the info about the att,
-	  * including its values. */
-	 if ((retval = read_hdf5_att(grp, attid, att)))
-         {
-            if (NC_EBADTYPID == retval)
-            {
-                if ((retval = nc4_att_list_del(&var->att, att)))
-                    BAIL(retval);
-                continue;
-            }
-            else
-                BAIL(retval);
-         }
-
-	 att->created = NC_TRUE;
-      } /* endif not HDF5 att */
-   } /* next attribute */
+   nc4_vararray_add(grp, var);
 
    /* Is this a deflated variable with a chunksize greater than the
     * current cache size? */
@@ -1820,7 +1828,7 @@ exit:
    {
        if (incr_id_rc && H5Idec_ref(datasetid) < 0)
           BAIL2(NC_EHDFERR);
-       if (var && nc4_var_list_del(&grp->var, var))
+       if (var && nc4_var_del(var))
           BAIL2(NC_EHDFERR);
    }
    if (access_pid && H5Pclose(access_pid) < 0)
@@ -1833,8 +1841,6 @@ exit:
 #ifdef EXTRA_TESTS
    num_plists--;
 #endif
-   if (attid > 0 && H5Aclose(attid) < 0)
-      BAIL2(NC_EHDFERR);
    return retval;
 }
 
@@ -2102,7 +2108,7 @@ nc4_rec_read_metadata(NC_GRP_INFO_T *grp)
     hid_t pid = 0;
     unsigned crt_order_flags = 0;
     H5_index_t iter_index;
-    int retval = NC_NOERR; /* everything worked! */
+    int i, retval = NC_NOERR; /* everything worked! */
 
     assert(grp && grp->name);
     LOG((3, "%s: grp->name %s", __func__, grp->name));
@@ -2190,6 +2196,10 @@ nc4_rec_read_metadata(NC_GRP_INFO_T *grp)
     if ((retval = read_grp_atts(grp)))
 	BAIL(retval);
 
+   /* when exiting define mode, mark all variable written */
+   for (i=0; i<grp->vars.nelems; i++)
+      grp->vars.value[i]->written_to = NC_TRUE;
+
 exit:
     /* Clean up local information on error, if anything remains */
     if (retval)
@@ -2311,6 +2321,9 @@ nc4_open_file(const char *path, int mode, void* parameters, NC *nc)
    /* The NetCDF-3.x prototype contains an mode option NC_SHARE for
       multiple processes accessing the dataset concurrently.  As there
       is no HDF5 equivalent, NC_SHARE is treated as NC_NOWRITE. */
+#ifdef HDF5_HAS_COLL_METADATA_OPS
+   H5Pset_all_coll_metadata_ops(fapl_id, 1 );
+#endif
    if(inmemory) {
        if((nc4_info->hdfid = H5LTopen_file_image(meminfo->memory,meminfo->size,
 			H5LT_FILE_IMAGE_DONT_COPY|H5LT_FILE_IMAGE_DONT_RELEASE
@@ -2590,14 +2603,16 @@ nc4_open_hdf4_file(const char *path, int mode, NC *nc)
       size_t var_type_size;
       int a;
 
-      /* Add a variable to the end of the group's var list. */
-      if ((retval = nc4_var_list_add(&grp->var, &var)))
+      /* Add a variable. */
+      if ((retval = nc4_var_add(&var)))
 	return retval;
 
       var->varid = grp->nvars++;
       var->created = NC_TRUE;
       var->written_to = NC_TRUE;
 
+      nc4_vararray_add(grp, var);
+
       /* Open this dataset in HDF4 file. */
       if ((var->sdsid = SDselect(h5->sdid, v)) == FAIL)
 	return NC_EVARMETA;
@@ -2705,7 +2720,6 @@ nc4_open_hdf4_file(const char *path, int mode, NC *nc)
 		 dim_name, var->name));
 	    if ((retval = nc4_dim_list_add(&grp->dim, &dim)))
 	       return retval;
-	    grp->ndims++;
 	    dim->dimid = grp->nc4_info->next_dimid++;
 	    if (strlen(dim_name) > NC_MAX_HDF4_NAME)
 	       return NC_EMAXNAME;
@@ -2953,6 +2967,8 @@ static int NC4_enddef(int ncid)
 {
   NC *nc;
    NC_HDF5_FILE_INFO_T* nc4_info;
+   NC_GRP_INFO_T *grp;
+   int i;
 
    LOG((1, "%s: ncid 0x%x", __func__, ncid));
 
@@ -2960,6 +2976,14 @@ static int NC4_enddef(int ncid)
       return NC_EBADID;
    assert(nc4_info);
 
+   /* Find info for this file and group */
+   if (!(grp = nc4_rec_find_grp(nc4_info->root_grp, (ncid & GRP_ID_MASK))))
+      return NC_EBADGRPID;
+
+   /* when exiting define mode, mark all variable written */
+   for (i=0; i<grp->vars.nelems; i++)
+      grp->vars.value[i]->written_to = NC_TRUE;
+
    return nc4_enddef_netcdf4_file(nc4_info);
 }
 
@@ -3205,7 +3229,6 @@ NC4_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp)
    NC_GRP_INFO_T *grp;
    NC_DIM_INFO_T *dim;
    NC_ATT_INFO_T *att;
-   NC_VAR_INFO_T *var;
    int retval;
 
    LOG((2, "%s: ncid 0x%x", __func__, ncid));
@@ -3225,9 +3248,13 @@ NC4_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp)
    }
    if (nvarsp)
    {
+      int i;
       *nvarsp = 0;
-      for (var = grp->var; var; var= var->l.next)
-	(*nvarsp)++;
+      for (i=0; i < grp->vars.nelems; i++)
+      {
+	if (grp->vars.value[i])
+	  (*nvarsp)++;
+      }
    }
    if (nattsp)
      {
@@ -3294,3 +3321,24 @@ nc_use_parallel_enabled()
    return 0;
 }
 #endif /* USE_PARALLEL4 */
+
+
+/*
+Wrap HDF5 allocated memory free operations
+*/
+
+static void
+hdf5free(void* memory)
+{
+#ifndef JNA
+    /* On Windows using the microsoft runtime, it is an error
+       for one library to free memory allocated by a different library.*/
+#ifdef HDF5_HAS_H5FREE
+    if(memory != NULL) H5free_memory(memory);
+#else
+#ifndef _MSC_VER
+	if(memory != NULL) free(memory);
+#endif
+#endif
+#endif
+}
diff --git a/libsrc4/nc4grp.c b/libsrc4/nc4grp.c
index fa8babf..ab85881 100644
--- a/libsrc4/nc4grp.c
+++ b/libsrc4/nc4grp.c
@@ -392,6 +392,7 @@ NC4_inq_varids(int ncid, int *nvars, int *varids)
    NC_VAR_INFO_T *var;
    int v, num_vars = 0;
    int retval;
+   int i;
 
    LOG((2, "nc_inq_varids: ncid 0x%x", ncid));
 
@@ -413,14 +414,13 @@ NC4_inq_varids(int ncid, int *nvars, int *varids)
    {
       /* This is a netCDF-4 group. Round up them doggies and count
        * 'em. The list is in correct (i.e. creation) order. */
-      if (grp->var)
+      for (i=0; i < grp->vars.nelems; i++)
       {
-	 for (var = grp->var; var; var = var->l.next)
-	 {
-	    if (varids)
-	       varids[num_vars] = var->varid;
-	    num_vars++;
-	 }
+	var = grp->vars.value[i];
+	if (!var) continue;
+	if (varids)
+	  varids[num_vars] = var->varid;
+	num_vars++;
       }
    }
 
diff --git a/libsrc4/nc4hdf.c b/libsrc4/nc4hdf.c
index d82d501..53e5f12 100644
--- a/libsrc4/nc4hdf.c
+++ b/libsrc4/nc4hdf.c
@@ -69,7 +69,7 @@ rec_reattach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid)
 {
   NC_VAR_INFO_T *var;
   NC_GRP_INFO_T *child_grp;
-  int d;
+  int d, i;
   int retval;
 
   assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0);
@@ -81,7 +81,10 @@ rec_reattach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid)
       return retval;
 
   /* Find any vars that use this dimension id. */
-  for (var = grp->var; var; var = var->l.next)
+  for (i=0; i < grp->vars.nelems; i++)
+  {
+    var = grp->vars.value[i];
+    if (!var) continue;
     for (d = 0; d < var->ndims; d++)
       if (var->dimids[d] == dimid && !var->dimscale)
         {
@@ -94,7 +97,7 @@ rec_reattach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid)
               var->dimscale_attached[d] = NC_TRUE;
             }
         }
-
+  }
   return NC_NOERR;
 }
 
@@ -109,7 +112,7 @@ rec_detach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid)
 {
   NC_VAR_INFO_T *var;
   NC_GRP_INFO_T *child_grp;
-  int d;
+  int d, i;
   int retval;
 
   assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0);
@@ -121,7 +124,10 @@ rec_detach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid)
       return retval;
 
   /* Find any vars that use this dimension id. */
-  for (var = grp->var; var; var = var->l.next)
+  for (i=0; i < grp->vars.nelems; i++)
+  {
+    var = grp->vars.value[i];
+    if (!var) continue;
     for (d = 0; d < var->ndims; d++)
       if (var->dimids[d] == dimid && !var->dimscale)
         {
@@ -135,7 +141,7 @@ rec_detach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid)
                 var->dimscale_attached[d] = NC_FALSE;
               }
         }
-
+  }
   return NC_NOERR;
 }
 
@@ -146,11 +152,11 @@ nc4_open_var_grp2(NC_GRP_INFO_T *grp, int varid, hid_t *dataset)
   NC_VAR_INFO_T *var;
 
   /* Find the requested varid. */
-  for (var = grp->var; var; var = var->l.next)
-    if (var->varid == varid)
-      break;
-  if (!var)
-    return NC_ENOTVAR;
+   if (varid < 0 || varid >= grp->vars.nelems)
+     return NC_ENOTVAR;
+   var = grp->vars.value[varid];
+   if (!var) return NC_ENOTVAR;
+   assert(var->varid == varid);
 
   /* Open this dataset if necessary. */
   if (!var->hdf_datasetid)
@@ -319,7 +325,7 @@ nc4_get_hdf_typeid(NC_HDF5_FILE_INFO_T *h5, nc_type xtype,
             return NC_EHDFERR;
           if (H5Tset_strpad(typeid, H5T_STR_NULLTERM) < 0)
             BAIL(NC_EVARMETA);
-	  if(H5Tset_cset(typeid, H5T_CSET_UTF8) < 0)
+	  if(H5Tset_cset(typeid, H5T_CSET_ASCII) < 0)
 	    BAIL(NC_EVARMETA);
 
           /* Take ownership of the newly created HDF5 datatype */
@@ -555,6 +561,7 @@ nc4_put_vara(NC *nc, int ncid, int varid, const size_t *startp,
   hsize_t start[NC_MAX_VAR_DIMS], count[NC_MAX_VAR_DIMS];
   char *name_to_use;
   int need_to_extend = 0;
+  int extend_possible = 0;
   int retval = NC_NOERR, range_error = 0, i, d2;
   void *bufr = NULL;
 #ifndef HDF5_CONVERT
@@ -625,8 +632,12 @@ nc4_put_vara(NC *nc, int ncid, int varid, const size_t *startp,
       assert(dim && dim->dimid == var->dimids[d2]);
       if (!dim->unlimited)
         {
+#ifdef RELAX_COORD_BOUND
           if (start[d2] > (hssize_t)fdims[d2] ||
               (start[d2] == (hssize_t)fdims[d2] && count[d2] > 0))
+#else
+          if (start[d2] >= (hssize_t)fdims[d2])
+#endif
             BAIL_QUIET(NC_EINVALCOORDS);
           if (start[d2] + count[d2] > fdims[d2])
             BAIL_QUIET(NC_EEDGE);
@@ -732,6 +743,7 @@ nc4_put_vara(NC *nc, int ncid, int varid, const size_t *startp,
 	  assert(dim && dim->dimid == var->dimids[d2]);
           if (dim->unlimited)
             {
+	      extend_possible = 1;
               if (start[d2] + count[d2] > fdims[d2])
                 {
                   xtend_size[d2] = (long long unsigned)(start[d2] + count[d2]);
@@ -754,7 +766,7 @@ nc4_put_vara(NC *nc, int ncid, int varid, const size_t *startp,
 
 #ifdef USE_PARALLEL4
       /* Check if anyone wants to extend */
-      if (h5->parallel && NC_COLLECTIVE == var->parallel_access)
+      if (extend_possible && h5->parallel && NC_COLLECTIVE == var->parallel_access)
         {
           /* Form consensus opinion among all processes about whether to perform
            * collective I/O
@@ -867,7 +879,7 @@ int
 nc4_get_vara(NC *nc, int ncid, int varid, const size_t *startp,
              const size_t *countp, nc_type mem_nc_type, int is_long, void *data)
 {
-  NC_GRP_INFO_T *grp, *g;
+  NC_GRP_INFO_T *grp;
   NC_HDF5_FILE_INFO_T *h5;
   NC_VAR_INFO_T *var;
   NC_DIM_INFO_T *dim;
@@ -957,8 +969,12 @@ nc4_get_vara(NC *nc, int ncid, int varid, const size_t *startp,
 	  BAIL(retval);
 
         /* Check for out of bound requests. */
+#ifdef RELAX_COORD_BOUND
         if (start[d2] > (hssize_t)ulen ||
             (start[d2] == (hssize_t)ulen && count[d2] > 0))
+#else
+        if (start[d2] >= (hssize_t)ulen && ulen > 0)
+#endif
           BAIL_QUIET(NC_EINVALCOORDS);
         if (start[d2] + count[d2] > ulen)
           BAIL_QUIET(NC_EEDGE);
@@ -981,8 +997,12 @@ nc4_get_vara(NC *nc, int ncid, int varid, const size_t *startp,
     else
       {
         /* Check for out of bound requests. */
+#ifdef RELAX_COORD_BOUND
         if (start[d2] > (hssize_t)fdims[d2] ||
             (start[d2] == (hssize_t)fdims[d2] && count[d2] > 0))
+#else
+        if (start[d2] >= (hssize_t)fdims[d2])
+#endif
           BAIL_QUIET(NC_EINVALCOORDS);
         if (start[d2] + count[d2] > fdims[d2])
           BAIL_QUIET(NC_EEDGE);
@@ -1520,13 +1540,11 @@ write_netcdf4_dimid(hid_t datasetid, int dimid)
 static int
 var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, nc_bool_t write_dimid)
 {
-  NC_GRP_INFO_T *g;
   hid_t plistid = 0, access_plistid = 0, typeid = 0, spaceid = 0;
   hsize_t chunksize[H5S_MAX_RANK], dimsize[H5S_MAX_RANK], maxdimsize[H5S_MAX_RANK];
   int d;
   void *fillp = NULL;
   NC_DIM_INFO_T *dim = NULL;
-  int dims_found = 0;
   char *name_to_use;
   int retval = NC_NOERR;
 
@@ -1954,8 +1972,7 @@ static int
 write_nc3_strict_att(hid_t hdf_grpid)
 {
   hid_t attid = 0, spaceid = 0;
-  int one = 1, num, a;
-  char att_name[NC_MAX_HDF5_NAME + 1];
+  int one = 1;
   int retval = NC_NOERR;
   htri_t attr_exists;
 
@@ -2054,13 +2071,14 @@ attach_dimscales(NC_GRP_INFO_T *grp)
 {
   NC_VAR_INFO_T *var;
   NC_DIM_INFO_T *dim1;
-  NC_GRP_INFO_T *g;
-  int d;
+  int d, i;
   int retval = NC_NOERR;
 
   /* Attach dimension scales. */
-  for (var = grp->var; var; var = var->l.next)
+  for (i=0; i < grp->vars.nelems; i++)
     {
+      var = grp->vars.value[i];
+      if (!var) continue;
       /* Scales themselves do not attach. But I really wish they
        * would. */
       if (var->dimscale)
@@ -2355,6 +2373,7 @@ static int
 write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
 {
   int retval;
+  int i;
 
   /* If there's no dimscale dataset for this dim, create one,
    * and mark that it should be hidden from netCDF as a
@@ -2433,20 +2452,23 @@ write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, nc_bool_t write_dimid)
   /* Did we extend an unlimited dimension? */
   if (dim->extended)
     {
-      NC_VAR_INFO_T *v1;
+      NC_VAR_INFO_T *v1 = NULL;
 
       assert(dim->unlimited);
       /* If this is a dimension without a variable, then update
        * the secret length information at the end of the NAME
        * attribute. */
-      for (v1 = grp->var; v1; v1 = v1->l.next)
-        if (!strcmp(v1->name, dim->name))
+      for (i=0; i < grp->vars.nelems; i++)
+      {
+	if (grp->vars.value[i] && !strcmp(grp->vars.value[i]->name, dim->name))
+	{
+	  v1 = grp->vars.value[i];
           break;
-
+	}
+      }
       if (v1)
         {
           hsize_t *new_size = NULL;
-          NC_DIM_INFO_T *dim1;
           int d1;
 
           /* Extend the dimension scale dataset to reflect the new
@@ -2493,10 +2515,13 @@ nc4_rec_detect_need_to_preserve_dimids(NC_GRP_INFO_T *grp, nc_bool_t *bad_coord_
   NC_GRP_INFO_T *child_grp;
   int last_dimid = -1;
   int retval;
+  int i;
 
   /* Iterate over variables in this group */
-  for (var = grp->var; var; var = var->l.next)
+  for (i=0; i < grp->vars.nelems; i++)
     {
+      var = grp->vars.value[i];
+      if (!var) continue;
       /* Only matters for dimension scale variables, with non-scalar dimensionality */
       if (var->dimscale && var->ndims)
         {
@@ -2549,10 +2574,11 @@ nc4_rec_detect_need_to_preserve_dimids(NC_GRP_INFO_T *grp, nc_bool_t *bad_coord_
 int
 nc4_rec_write_metadata(NC_GRP_INFO_T *grp, nc_bool_t bad_coord_order)
 {
-  NC_DIM_INFO_T *dim;
-  NC_VAR_INFO_T *var;
-  NC_GRP_INFO_T *child_grp;
+  NC_DIM_INFO_T *dim = NULL;
+  NC_VAR_INFO_T *var = NULL;
+  NC_GRP_INFO_T *child_grp = NULL;
   int coord_varid = -1;
+  int var_index = 0;
 
   int retval;
   assert(grp && grp->name && grp->hdf_grpid);
@@ -2564,7 +2590,8 @@ nc4_rec_write_metadata(NC_GRP_INFO_T *grp, nc_bool_t bad_coord_order)
   /* Set the pointers to the beginning of the list of dims & vars in this
    * group. */
   dim = grp->dim;
-  var = grp->var;
+  if (var_index < grp->vars.nelems)
+    var = grp->vars.value[var_index];
 
   /* Because of HDF5 ordering the dims and vars have to be stored in
    * this way to ensure that the dims and coordinate vars come out in
@@ -2591,12 +2618,16 @@ nc4_rec_write_metadata(NC_GRP_INFO_T *grp, nc_bool_t bad_coord_order)
 
       /* Write each var. When we get to the coord var we are waiting
        * for (if any), then we break after writing it. */
-      for (wrote_coord = NC_FALSE; var && !wrote_coord; var = var->l.next)
+      for (wrote_coord = NC_FALSE; var && !wrote_coord; )
         {
           if ((retval = write_var(var, grp, bad_coord_order)))
             return retval;
           if (found_coord && var->varid == coord_varid)
             wrote_coord = NC_TRUE;
+	  if (++var_index < grp->vars.nelems)
+	    var = grp->vars.value[var_index];
+	  else
+	    var = NULL;
         }
     } /* end while */
 
@@ -3630,6 +3661,7 @@ nc4_rec_match_dimscales(NC_GRP_INFO_T *grp)
   NC_VAR_INFO_T *var;
   NC_DIM_INFO_T *dim;
   int retval = NC_NOERR;
+  int i;
 
   assert(grp && grp->name);
   LOG((4, "%s: grp->name %s", __func__, grp->name));
@@ -3641,11 +3673,14 @@ nc4_rec_match_dimscales(NC_GRP_INFO_T *grp)
 
   /* Check all the vars in this group. If they have dimscale info,
    * try and find a dimension for them. */
-  for (var = grp->var; var; var = var->l.next)
+  for (i=0; i < grp->vars.nelems; i++)
     {
-      /* Check all vars and see if dim[i] != NULL if dimids[i] valid. */
-      int ndims = var->ndims;
+      int ndims;
       int d;
+      var = grp->vars.value[i];
+      if (!var) continue;
+      /* Check all vars and see if dim[i] != NULL if dimids[i] valid. */
+      ndims = var->ndims;
       for (d = 0; d < ndims; d++)
 	{
 	  if (var->dim[d] == NULL) {
@@ -3766,7 +3801,6 @@ nc4_rec_match_dimscales(NC_GRP_INFO_T *grp)
                         free(h5dimlen);
                         return retval;
                       }
-                      grp->ndims++;
                       dim->dimid = grp->nc4_info->next_dimid++;
                       sprintf(phony_dim_name, "phony_dim_%d", dim->dimid);
                       if (!(dim->name = strdup(phony_dim_name))) {
@@ -3976,7 +4010,6 @@ reportopenobjectsT(int log, hid_t fid, int ntypes, unsigned int* otypes)
     idlist = (hid_t*)malloc(sizeof(hid_t)*maxobjs);
     for(t=0;t<ntypes;t++) {
 	unsigned int ot = otypes[t];
-	if(ot < 0) break;
         ocount = H5Fget_obj_ids(fid,ot,maxobjs,idlist);
 	for(i=0;i<ocount;i++) {
 	    hid_t o = idlist[i];
@@ -4063,11 +4096,8 @@ done:
 static int
 NC4_get_strict_att(NC_HDF5_FILE_INFO_T* h5)
 {
-    int ncstat = NC_NOERR;
-    size_t size;
     hid_t grp = -1;
     hid_t attid = -1;
-    herr_t herr = 0;
 
     /* Get root group */
     grp = h5->root_grp->hdf_grpid; /* get root group */
diff --git a/libsrc4/nc4info.c b/libsrc4/nc4info.c
index cc16ca7..2424f8e 100644
--- a/libsrc4/nc4info.c
+++ b/libsrc4/nc4info.c
@@ -25,7 +25,6 @@ NC4_fileinfo_init(void)
 {
     int stat = NC_NOERR;
     unsigned major,minor,release;
-    int super;
 
     /* Build nc properties */
     memset((void*)&globalpropinfo,0,sizeof(globalpropinfo));
@@ -145,10 +144,7 @@ int
 NC4_put_propattr(NC_HDF5_FILE_INFO_T* h5)
 {
     int ncstat = NC_NOERR;
-    H5T_class_t t_class;
-    size_t size;
     hid_t grp = -1;
-    hid_t exists = -1;
     hid_t attid = -1;
     hid_t aspace = -1;
     hid_t atype = -1;
@@ -248,12 +244,5 @@ NC4_buildpropinfo(struct NCPROPINFO* info,char** propdatap)
     propdata[total] = '\0';
     *propdatap = propdata;
 
-    /* propdatap is checked against being NULL above already. */
-    //if(propdatap) {
-    //  *propdatap = propdata;
-    //} else {
-    //  free(propdata);
-    //}
-
     return NC_NOERR;
 }
diff --git a/libsrc4/nc4internal.c b/libsrc4/nc4internal.c
index e092f0c..fe6e2f6 100644
--- a/libsrc4/nc4internal.c
+++ b/libsrc4/nc4internal.c
@@ -16,8 +16,8 @@ conditions.
 #include "nc4internal.h"
 #include "nc.h" /* from libsrc */
 #include "ncdispatch.h" /* from libdispatch */
+#include "ncutf8.h"
 #include "H5DSpublic.h"
-#include <utf8proc.h>
 
 #define MEGABYTE 1048576
 
@@ -50,7 +50,7 @@ extern int num_spaces;
 /* This is the severity level of messages which will be logged. Use
    severity 0 for errors, 1 for important log messages, 2 for less
    important, etc. */
-int nc_log_level = -1;
+int nc_log_level = NC_TURN_OFF_LOGGING;
 
 #endif /* LOGGING */
 
@@ -58,7 +58,7 @@ int nc4_hdf5_initialized = 0;
 
 /* Provide a wrapper for H5Eset_auto */
 static herr_t
-set_auto(void* func, void *client_data) 
+set_auto(void* func, void *client_data)
 {
 #ifdef DEBUGH5
     return H5Eset_auto2(H5E_DEFAULT,(H5E_auto2_t)h5catch,client_data);
@@ -99,8 +99,9 @@ nc4_check_name(const char *name, char *norm_name)
       return retval;
 
    /* Normalize the name. */
-   if (!(temp = (char *)utf8proc_NFC((const unsigned char *)name)))
-      return NC_EINVAL;
+   retval = nc_utf8_normalize((const unsigned char *)name,(unsigned char**)&temp);
+   if(retval != NC_NOERR)
+      return retval;
    strcpy(norm_name, temp);
    free(temp);
 
@@ -121,11 +122,11 @@ find_var_dim_max_length(NC_GRP_INFO_T *grp, int varid, int dimid, size_t *maxlen
    *maxlen = 0;
 
    /* Find this var. */
-   for (var = grp->var; var; var = var->l.next)
-      if (var->varid == varid)
-	 break;
-   if (!var)
-      return NC_ENOTVAR;
+   if (varid < 0 || varid >= grp->vars.nelems)
+     return NC_ENOTVAR;
+   var = grp->vars.value[varid];
+   if (!var) return NC_ENOTVAR;
+   assert(var->varid == varid);
 
    /* If the var hasn't been created yet, its size is 0. */
    if (!var->created)
@@ -331,11 +332,9 @@ nc4_find_g_var_nc(NC *nc, int ncid, int varid,
      return NC_ENOTVAR;
 
    /* Find the var info. */
-   for ((*var) = (*grp)->var; (*var); (*var) = (*var)->l.next)
-     if ((*var)->varid == varid)
-       break;
-   if (!(*var))
+   if (varid < 0 || varid >= (*grp)->vars.nelems)
      return NC_ENOTVAR;
+   (*var) = (*grp)->vars.value[varid];
 
    return NC_NOERR;
 }
@@ -375,13 +374,19 @@ nc4_find_dim(NC_GRP_INFO_T *grp, int dimid, NC_DIM_INFO_T **dim,
 int
 nc4_find_var(NC_GRP_INFO_T *grp, const char *name, NC_VAR_INFO_T **var)
 {
+  int i;
    assert(grp && var && name);
 
    /* Find the var info. */
-   for ((*var) = grp->var; (*var); (*var) = (*var)->l.next)
-      if (0 == strcmp(name, (*var)->name))
-         break;
-
+   *var = NULL;
+   for (i=0; i < grp->vars.nelems; i++)
+   {
+     if (0 == strcmp(name, grp->vars.value[i]->name))
+     {
+       *var = grp->vars.value[i];
+       break;
+     }
+   }
    return NC_NOERR;
 }
 
@@ -498,6 +503,7 @@ nc4_find_dim_len(NC_GRP_INFO_T *grp, int dimid, size_t **len)
    NC_GRP_INFO_T *g;
    NC_VAR_INFO_T *var;
    int retval;
+   int i;
 
    assert(grp && len);
    LOG((3, "nc4_find_dim_len: grp->name %s dimid %d", grp->name, dimid));
@@ -510,9 +516,11 @@ nc4_find_dim_len(NC_GRP_INFO_T *grp, int dimid, size_t **len)
 
    /* For all variables in this group, find the ones that use this
     * dimension, and remember the max length. */
-   for (var = grp->var; var; var = var->l.next)
+   for (i=0; i < grp->vars.nelems; i++)
    {
      size_t mylen;
+     var = grp->vars.value[i];
+     if (!var) continue;
 
      /* Find max length of dim in this variable... */
      if ((retval = find_var_dim_max_length(grp, var->varid, dimid, &mylen)))
@@ -541,16 +549,12 @@ nc4_find_grp_att(NC_GRP_INFO_T *grp, int varid, const char *name, int attnum,
       attlist = grp->att;
    else
    {
-      for(var = grp->var; var; var = var->l.next)
-      {
-	 if (var->varid == varid)
-	 {
-	    attlist = var->att;
-	    break;
-	 }
-      }
-      if (!var)
-	 return NC_ENOTVAR;
+      if (varid < 0 || varid >= grp->vars.nelems)
+	return NC_ENOTVAR;
+      var = grp->vars.value[varid];
+      if (!var) return NC_ENOTVAR;
+      attlist = var->att;
+      assert(var->varid == varid);
    }
 
    /* Now find the attribute by name or number. If a name is provided,
@@ -592,16 +596,12 @@ nc4_find_nc_att(int ncid, int varid, const char *name, int attnum,
       attlist = grp->att;
    else
    {
-      for(var = grp->var; var; var = var->l.next)
-      {
-	 if (var->varid == varid)
-	 {
-	    attlist = var->att;
-	    break;
-	 }
-      }
-      if (!var)
-	 return NC_ENOTVAR;
+      if (varid < 0 || varid >= grp->vars.nelems)
+	return NC_ENOTVAR;
+      var = grp->vars.value[varid];
+      if (!var) return NC_ENOTVAR;
+      attlist = var->att;
+      assert(var->varid == varid);
    }
 
    /* Now find the attribute by name or number. If a name is provided, ignore the attnum. */
@@ -667,10 +667,9 @@ obj_list_del(NC_LIST_NODE_T **list, NC_LIST_NODE_T *obj)
       ((NC_LIST_NODE_T *)obj->next)->prev = obj->prev;
 }
 
-/* Add to the end of a var list. Return a pointer to the newly
- * added var. */
+/* Return a pointer to the new var. */
 int
-nc4_var_list_add(NC_VAR_INFO_T **list, NC_VAR_INFO_T **var)
+nc4_var_add(NC_VAR_INFO_T **var)
 {
    NC_VAR_INFO_T *new_var;
 
@@ -683,12 +682,11 @@ nc4_var_list_add(NC_VAR_INFO_T **list, NC_VAR_INFO_T **var)
    new_var->chunk_cache_nelems = nc4_chunk_cache_nelems;
    new_var->chunk_cache_preemption = nc4_chunk_cache_preemption;
 
-   /* Add object to list */
-   obj_list_add((NC_LIST_NODE_T **)list, (NC_LIST_NODE_T *)new_var);
-
    /* Set the var pointer, if one was given */
    if (var)
       *var = new_var;
+   else
+     free(new_var);
 
    return NC_NOERR;
 }
@@ -777,7 +775,8 @@ nc4_check_dup_name(NC_GRP_INFO_T *grp, char *name)
    NC_GRP_INFO_T *g;
    NC_VAR_INFO_T *var;
    uint32_t hash;
-   
+   int i;
+
    /* Any types of this name? */
    for (type = grp->type; type; type = type->l.next)
       if (!strcmp(type->name, name))
@@ -790,10 +789,13 @@ nc4_check_dup_name(NC_GRP_INFO_T *grp, char *name)
 
    /* Any variables of this name? */
    hash =  hash_fast(name, strlen(name));
-   for (var = grp->var; var; var = var->l.next)
+   for (i=0; i < grp->vars.nelems; i++)
+   {
+      var = grp->vars.value[i];
+      if (!var) continue;
       if (var->hash == hash && !strcmp(var->name, name))
 	 return NC_ENAMEINUSE;
-
+   }
    return NC_NOERR;
 }
 
@@ -1002,9 +1004,9 @@ nc4_type_free(NC_TYPE_INFO_T *type)
    return NC_NOERR;
 }
 
-/* Delete a var from a var list, and free the memory. */
+/* Delete a var, and free the memory. */
 int
-nc4_var_list_del(NC_VAR_INFO_T **list, NC_VAR_INFO_T *var)
+nc4_var_del(NC_VAR_INFO_T *var)
 {
    NC_ATT_INFO_T *a, *att;
    int ret;
@@ -1012,9 +1014,6 @@ nc4_var_list_del(NC_VAR_INFO_T **list, NC_VAR_INFO_T *var)
    if(var == NULL)
      return NC_NOERR;
 
-   /* Remove the var from the linked list. */
-   obj_list_del((NC_LIST_NODE_T **)list, (NC_LIST_NODE_T *)var);
-
    /* First delete all the attributes attached to this var. */
    att = var->att;
    while (att)
@@ -1126,11 +1125,12 @@ int
 nc4_rec_grp_del(NC_GRP_INFO_T **list, NC_GRP_INFO_T *grp)
 {
    NC_GRP_INFO_T *g, *c;
-   NC_VAR_INFO_T *v, *var;
+   NC_VAR_INFO_T *var;
    NC_ATT_INFO_T *a, *att;
    NC_DIM_INFO_T *d, *dim;
    NC_TYPE_INFO_T *type, *t;
    int retval;
+   int i;
 
    assert(grp);
    LOG((3, "%s: grp->name %s", __func__, grp->name));
@@ -1159,18 +1159,29 @@ nc4_rec_grp_del(NC_GRP_INFO_T **list, NC_GRP_INFO_T *grp)
    }
 
    /* Delete all vars. */
-   var = grp->var;
-   while (var)
+   for (i=0; i < grp->vars.nelems; i++)
    {
+      var = grp->vars.value[i];
+      if (!var) continue;
+
       LOG((4, "%s: deleting var %s", __func__, var->name));
       /* Close HDF5 dataset associated with this var, unless it's a
        * scale. */
       if (var->hdf_datasetid && H5Dclose(var->hdf_datasetid) < 0)
 	 return NC_EHDFERR;
-      v = var->l.next;
-      if ((retval = nc4_var_list_del(&grp->var, var)))
+      if ((retval = nc4_var_del(var)))
 	 return retval;
-      var = v;
+      grp->vars.value[i] = NULL;
+   }
+
+   /* Vars are all freed above.  When eliminate linked-list,
+      then need to iterate value and free vars from it.
+   */
+   if (grp->vars.nalloc != 0) {
+     assert(grp->vars.value != NULL);
+     free(grp->vars.value);
+     grp->vars.value = NULL;
+     grp->vars.nalloc = 0;
    }
 
    /* Delete all dims. */
@@ -1397,8 +1408,9 @@ int
 nc4_normalize_name(const char *name, char *norm_name)
 {
    char *temp_name;
-   if (!(temp_name = (char *)utf8proc_NFC((const unsigned char *)name)))
-      return NC_EINVAL;
+   int stat = nc_utf8_normalize((const unsigned char *)name,(unsigned char **)&temp_name);
+   if(stat != NC_NOERR)
+      return stat;
    if (strlen(temp_name) > NC_MAX_NAME)
    {
       free(temp_name);
@@ -1459,7 +1471,7 @@ rec_print_metadata(NC_GRP_INFO_T *grp, int tab_count)
    char tabs[MAX_NESTS] = "";
    char *dims_string = NULL;
    char temp_string[10];
-   int t, retval, d;
+   int t, retval, d, i;
 
    /* Come up with a number of tabs relative to the group. */
    for (t = 0; t < tab_count && t < MAX_NESTS; t++)
@@ -1476,8 +1488,10 @@ rec_print_metadata(NC_GRP_INFO_T *grp, int tab_count)
       LOG((2, "%s DIMENSION - dimid: %d name: %s len: %d unlimited: %d",
 	   tabs, dim->dimid, dim->name, dim->len, dim->unlimited));
 
-   for(var = grp->var; var; var = var->l.next)
+   for (i=0; i < grp->vars.nelems; i++)
    {
+      var = grp->vars.value[i];
+      if (!var) continue;
       if(var->ndims > 0)
       {
          dims_string = (char*)malloc(sizeof(char)*(var->ndims*4));
@@ -1589,3 +1603,4 @@ NC4_show_metadata(int ncid)
 #endif /*LOGGING*/
    return retval;
 }
+
diff --git a/libsrc4/nc4printer.c b/libsrc4/nc4printer.c
new file mode 100644
index 0000000..0596b0f
--- /dev/null
+++ b/libsrc4/nc4printer.c
@@ -0,0 +1,786 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/**
+This provides a simple netcdf-4 metadata -> xml printer.
+Primarily for use in debugging, but could be adapted to
+create other tools.
+*/
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "netcdf.h"
+#include "ncbytes.h"
+#include "nclist.h"
+
+#undef DEBUG 
+
+#define BUFSIZE 4096
+
+#define NC_MAX_IDS 8192
+
+typedef enum NCSORT {
+GROUP,
+VAR,
+FIELD,
+DIM,
+ATTR,
+ATOMTYPE,
+USERTYPE,
+} NCSORT;
+
+typedef struct NCID NCID;
+
+typedef struct NC4printer {
+    NCbytes* out;
+    NClist* types;
+    NClist* dims;
+    NClist* allnodes;
+    NCbytes* tmp1;
+    NCbytes* tmp2;
+} NC4printer;
+
+struct NCID {
+    NCSORT sort;
+    struct NCID* parent;
+    int id;
+    char name[NC_MAX_NAME+1];
+    NCID* base;
+    size_t size;
+    struct {nc_type kind;} usertype; /*sort == USERTYPE*/
+    struct {int rank;} var; /*sort == VAR*/
+    struct {int fid;} field; /*sort == FIELD*/
+    struct {int isroot;} group; /*sort == GROUP*/
+};
+
+#define MAKEID(Node,Sort,Parent,Id) \
+NCID* Node = (NCID*)calloc(1,sizeof(NCID)); \
+Node->sort = Sort; Node->parent = Parent; Node->id = Id; \
+track(out,Node);
+
+union NUMVALUE {
+    unsigned char i8[8];
+    unsigned short i16[4];
+    unsigned short i32[2];
+    unsigned long long i64[1];
+};
+
+#define SETNAME(x,y) strncpy((x)->name,(y),NC_MAX_NAME+1);
+#define GRPIDFOR(gid) ((gid) & 0xFFFF)
+#define GROUPOF(x) ((x)->parent->id)
+
+#define FAIL {return ret;}
+
+#define PRINTF(fmt,...) snprintf(out->buf,BUFSIZE,fmt,__VAR_ARGS__)
+#define CAT(x) ncbytescat(out->out,x)
+#define INDENT(x) indent(out,x)
+
+#define hasMetadata(node) (nclistlength(node->attributes) > 0)
+#define hasMaps(var) (nclistlength(node->maps) > 0)
+#define hasDimensions(var) (nclistlength(node->dimrefs) > 0)
+
+static void track(NC4printer* out, NCID* node);
+
+/*Forward*/
+static int buildAtomicTypes(NC4printer* out, NCID* root);
+static void* computeOffset(NCID* base, void* values, size_t index);
+static void entityEscape(NCbytes* buf, const char* s);
+static NCID* findDim(NC4printer* out, int dimid);
+static NCID* findType(NC4printer* out, nc_type t);
+static void fqnWalk(NCID* grp, NCbytes* path);
+static void freeNC4Printer(NC4printer* out);
+static void getAtomicTypeName(nc_type base, char* name);
+static int getPrintValue(NCbytes* out, NCID* basetype, void* value);
+static void indent(NC4printer* out, int depth);
+static unsigned long long getNumericValue(union NUMVALUE numvalue, nc_type base);
+static void makeFQN(NCID* id, NCbytes* path);
+static int printAttribute(NC4printer* out, NCID* attr, int depth);
+static int printDimref(NC4printer* out, NCID* dim, int depth);;
+static int printNode(NC4printer* out, NCID* node, int depth);
+static void printOpaque(NCbytes* out, const unsigned char* s, size_t len, int leadx);
+static void printString(NCbytes* out, const char* s, int quotes);
+static int printValue(NC4printer* out, NCID* basetype, void* value, int depth);
+static int printXMLAttributeInt(NC4printer* out, char* name, long long value);
+static int printXMLAttributeName(NC4printer* out, char* name, char* value);
+static int printXMLAttributeSize(NC4printer* out, char* name, size_t value);
+static int printXMLAttributeString(NC4printer* out, char* name, char* s);
+static int readAttributeValues(NCID* attr,void**);
+static void record(NC4printer* out, NCID* node);
+
+/**************************************************/
+
+int
+NC4print(NCbytes* buf, int ncid)
+{
+    int ret = NC_NOERR;
+    NC4printer* out;
+
+    if(buf == NULL) return NC_EINVAL;
+    out = (NC4printer*)calloc(1,sizeof(NC4printer));
+    if(out == NULL) return NC_ENOMEM;
+    out->out = buf;
+    out->tmp1 = ncbytesnew();
+    out->tmp2 = ncbytesnew();
+    out->allnodes = nclistnew();
+    out->types = nclistnew();
+    out->dims = nclistnew();
+
+    MAKEID(root,GROUP,NULL,ncid);
+	root->group.isroot = 1;
+
+    buildAtomicTypes(out,root);
+
+    ret = printNode(out,root,0);
+
+    freeNC4Printer(out);
+
+    return ret;
+}
+
+/*************************************************/
+
+static void
+freeNC4Printer(NC4printer* out)
+{
+    int i;
+
+    if(out == NULL) return;    
+
+#ifdef DEBUG
+fprintf(stderr,"free: |allnodes=%ld\n",nclistlength(out->allnodes));
+fflush(stderr);
+#endif
+
+    for(i=0;i<nclistlength(out->allnodes);i++) {
+	NCID* node = (NCID*)nclistget(out->allnodes,i);
+#ifdef DEBUG
+fprintf(stderr,"free: node=%lx\n",(unsigned long)node);
+fflush(stderr);
+#endif
+	if(node != NULL) free(node);
+    }
+
+    ncbytesfree(out->tmp1);
+    ncbytesfree(out->tmp2);
+    nclistfree(out->types);
+    nclistfree(out->dims);
+    nclistfree(out->allnodes);
+
+    free(out);
+}
+
+
+/*************************************************/
+
+/**
+ * Print an arbitrary file and its subnodes in xml
+ * Handling newlines is a bit tricky because they may be
+ * embedded for e.g. groups, enums,
+ * etc.  So the rule is that the
+ * last newline is elided and left
+ * for the caller to print.
+ * Exceptions: printMetadata
+ * printDimrefs.
+ *
+ * @param out - the output buffer
+ * @param ncid - the open'd file to print
+ * @param depth - the depth of our code
+ */
+
+static int
+printNode(NC4printer* out, NCID* node, int depth)
+{
+    int ret = NC_NOERR;
+    int i = 0;
+    char name[NC_MAX_NAME+1];
+    int ndims, nvars, natts, nunlim, ntypes, ngroups;
+    int n;
+    int ids[NC_MAX_IDS];
+    nc_type base;
+    size_t len, count, size;
+    union NUMVALUE numvalue;
+
+    switch (node->sort) {
+    case GROUP:
+	/* Get group name */    
+	if((ret=nc_inq_grpname(node->id,name))) FAIL;
+	SETNAME(node,name);
+	/* get group counts */
+	if((ret=nc_inq(node->id,&ndims,&nvars,&natts,&nunlim))) FAIL;
+        if((ret=nc_inq_typeids(node->id,&ntypes,NULL))) FAIL;
+        if((ret=nc_inq_grps(node->id,&ngroups,NULL))) FAIL;
+	if(ndims >= NC_MAX_IDS) FAIL;
+	if(nvars >= NC_MAX_IDS) FAIL;
+	if(nunlim >= NC_MAX_IDS) FAIL;
+	if(ntypes >= NC_MAX_IDS) FAIL;
+	if(ngroups >= NC_MAX_IDS) FAIL;
+
+        INDENT(depth);
+        CAT("<Group");
+	printXMLAttributeName(out,"name",name);
+        CAT(">\n");
+        depth++;
+
+	{
+	   /* Print: dims, types, vars(+attr), group-attr, subgroups */
+           if((ret=nc_inq_dimids(node->id,&n,ids, 0))) FAIL;
+            for(i=0;i<ndims;i++) {
+	        MAKEID(eid,DIM,node,ids[i]);
+                printNode(out,eid,depth);
+                CAT("\n");
+		record(out,eid);
+	    }
+        }
+	{
+	    if((ret=nc_inq_typeids(node->id,&n,ids))) FAIL;
+            for(i=0;i<ntypes;i++) {
+		nc_type kind;
+		if((ret=nc_inq_user_type(node->id, ids[i], name, &size, &base, NULL, &kind))) FAIL;
+		MAKEID(eid,USERTYPE,node,ids[i]);
+			SETNAME(eid,name);
+			eid->size = size;
+			eid->usertype.kind = kind;
+			if(base > 0) eid->base = findType(out,base);
+		record(out,eid);
+		printNode(out,eid,depth);
+	        CAT("\n");
+	    }
+        }
+	{
+	    if((ret=nc_inq_varids(node->id,&n,ids))) FAIL;
+            for(i=0;i<nvars;i++) {
+		nc_type base;
+		if((ret=nc_inq_var(node->id, ids[i], name, &base, &ndims, NULL, NULL))) FAIL;
+		MAKEID(vid,VAR,node,ids[i]);
+			SETNAME(vid,name);
+			vid->base = findType(out,base);
+			vid->var.rank = ndims;
+		printNode(out,vid,depth);
+	        CAT("\n");
+	    }
+        }
+	{
+            for(i=0;i<natts;i++) {
+		if((ret=nc_inq_attname(node->id,NC_GLOBAL,i,name))) FAIL;
+		MAKEID(id,ATTR,node,NC_GLOBAL);
+			SETNAME(id,name);
+		printAttribute(out,id,depth);
+	        CAT("\n");
+	    }
+        }
+
+	{
+	    if((ret=nc_inq_grps(node->id,&n,ids))) FAIL;
+            for(i=0;i<ngroups;i++) {
+		MAKEID(id,GROUP,node,ids[i]);
+		printNode(out,id,depth);
+	        CAT("\n");
+		record(out,id);
+	    }
+        }
+        depth--;
+        INDENT(depth); CAT("</Group>");
+        break;
+
+    case DIM:
+        if((ret=nc_inq_dim(GROUPOF(node),node->id,name,&len))) FAIL;
+		SETNAME(node,name);
+		node->size = len;
+        INDENT(depth);
+        CAT("<Dimension");
+        printXMLAttributeName(out, "name", name);
+        printXMLAttributeSize(out, "size", len);
+        CAT("/>");
+        break;
+
+    case USERTYPE:
+	switch (node->usertype.kind) {
+	case NC_OPAQUE:
+	    INDENT(depth); CAT("<Opaque");
+            printXMLAttributeName(out, "name", node->name);
+            printXMLAttributeSize(out, "size", node->size);
+            CAT("/>");
+	    break;	    	
+	case NC_ENUM:
+            if((ret=nc_inq_enum(GROUPOF(node),node->id,NULL,NULL,NULL,&count))) FAIL;
+	    INDENT(depth); CAT("<Enumeration");
+            printXMLAttributeName(out, "name", node->name);
+            CAT(">\n");
+            depth++;
+            for(i=0;i<count;i++) {
+	        long long value;
+	        if((ret=nc_inq_enum_member(GROUPOF(node),node->id,i,name,&numvalue))) FAIL;
+	        value = getNumericValue(numvalue,node->base->id);
+                INDENT(depth);
+                CAT("<EnumConst");
+                printXMLAttributeName(out, "name", name);
+                printXMLAttributeInt(out, "value", value);
+	        CAT("/>\n");
+            }
+            depth--;
+            INDENT(depth); CAT("</Enumeration>");
+            break;
+
+        case NC_COMPOUND:
+            if((ret=nc_inq_compound(GROUPOF(node),node->id,NULL,NULL,&count))) FAIL;
+            INDENT(depth); CAT("<Compound");
+            printXMLAttributeName(out, "name", node->name);
+            CAT(">\n");
+            depth++;
+            for(i=0;i<count;i++) {
+                if((ret=nc_inq_compound_field(GROUPOF(node),node->id,i,name,NULL,&base,NULL,NULL))) FAIL;
+                MAKEID(id,FIELD,node->parent,node->id);
+                    SETNAME(id,name);
+                    id->base = findType(out,base);
+                    id->field.fid = i;
+                printNode(out,id,depth);
+                CAT("\n");
+            }
+            depth--;
+            INDENT(depth); CAT("</Compound>");
+            break;
+	case NC_VLEN:
+	    abort();
+	    break;
+	default:
+	    abort();
+	    break;
+	}
+	break;
+
+    case VAR:
+        if((ret=nc_inq_var(GROUPOF(node), node->id, name, &base, &ndims, ids, &natts))) FAIL;
+		node->base = findType(out,base);
+		SETNAME(node,name);
+		node->var.rank = ndims;
+        INDENT(depth); CAT("<Var");
+        printXMLAttributeName(out, "name", node->name);
+        makeFQN(node->base,out->tmp2);
+        printXMLAttributeName(out, "type", ncbytescontents(out->tmp2));
+	if(node->var.rank > 0)
+            printXMLAttributeInt(out, "rank", node->var.rank);
+        if(ndims > 0 || natts > 0) {
+            CAT(">\n");
+            depth++;
+            for(i=0;i<ndims;i++) {
+		NCID* dim = findDim(out,ids[i]);
+                printDimref(out,dim,depth);
+		CAT("\n");
+	    }
+            for(i=0;i<natts;i++) {
+                if((ret=nc_inq_attname(GROUPOF(node),node->id,i,name))) FAIL;
+		if((ret=nc_inq_att(GROUPOF(node),node->id,name,&base,&count))) FAIL;
+                MAKEID(id,ATTR,node,node->id);
+                        SETNAME(id,name);
+			id->base = findType(out,base);
+			id->size = count;
+                printAttribute(out,id,depth); 
+		CAT("\n");
+	    }
+            depth--;
+            INDENT(depth); CAT("</Var>");
+        } else
+            CAT("/>");
+        break;
+
+    case ATOMTYPE:
+    default:
+	abort();
+        ret = NC_EINVAL;
+        break;
+    }
+    return ret;
+}
+
+static int
+printXMLAttributeName(NC4printer* out, char* name, char* value)
+{
+    int ret = NC_NOERR;
+    if(name == NULL) return ret;
+    CAT(" "); CAT(name); CAT("=\"");
+    if(value == NULL) value = "";
+    /* add xml entity escaping */
+    entityEscape(out->tmp1,value);
+    CAT(ncbytescontents(out->tmp1));
+    CAT("\"");
+    return ret;
+}
+
+static int
+printXMLAttributeSize(NC4printer* out, char* name, size_t value)
+{
+    return printXMLAttributeInt(out,name,(long long)value);
+}
+
+static int
+printXMLAttributeInt(NC4printer* out, char* name, long long value)
+{
+    int ret = NC_NOERR;
+    char svalue[128+1];
+
+    CAT(" "); CAT(name); CAT("=\"");
+    snprintf(svalue,sizeof(svalue),"%lld",value);
+    CAT(svalue);
+    CAT("\"");
+    return ret;
+}
+
+static int
+printXMLAttributeString(NC4printer* out, char* name, char* s)
+{
+    int ret = NC_NOERR;
+    CAT(" "); CAT(name); CAT("=");
+    printString(out->out,s,1);
+    return ret;
+}
+
+static int
+printAttribute(NC4printer* out, NCID* attr, int depth)
+{
+    int ret = NC_NOERR;
+    int i = 0;
+    void* values;
+
+    INDENT(depth); CAT("<Attribute");
+    printXMLAttributeName(out,"name",attr->name);
+    CAT(">\n");
+    if((ret=readAttributeValues(attr,&values))) FAIL;
+    depth++;
+    for(i=0;i<attr->size;i++) {
+	void* value = computeOffset(attr->base,values,i);
+	if((ret=printValue(out,attr->base,value,depth))) FAIL;
+    }
+    depth--;
+    INDENT(depth);
+    CAT("</Attribute>");
+    return ret;
+}
+
+/**
+ * Print the dimrefs for a variable's dimensions.
+ * If the variable has a non-whole projection, then use size
+ * else use the dimension name.
+ *
+ * @param var whole dimensions are to be printed
+ * @throws DapException
+ */
+static int
+printDimref(NC4printer* out, NCID* d, int depth)
+{
+    INDENT(depth);
+    CAT("<Dim");
+    makeFQN(d,out->tmp2);
+    printXMLAttributeName(out, "name", ncbytescontents(out->tmp2));
+    CAT("/>");
+    return NC_NOERR;
+}
+
+static int
+printValue(NC4printer* out, NCID* basetype, void* value, int depth)
+{
+    int ret;
+    if(basetype->id > NC_MAX_ATOMIC_TYPE && basetype->usertype.kind == NC_ENUM) {
+	basetype = basetype->base;
+    }
+    if((ret=getPrintValue(out->tmp2,basetype,value))) FAIL;
+    INDENT(depth);
+    CAT("<Value");
+    printXMLAttributeString(out,"value",ncbytescontents(out->tmp2));
+    CAT("/>\n");
+    return ret;
+}
+
+/*************************************************/
+/* Misc. Static Utilities */
+
+/* Make public to allow use elsewhere */
+
+static char hexchars[16] = "0123456789abcdef";
+
+static int
+getPrintValue(NCbytes* out, NCID* basetype, void* value)
+{
+    int ret = NC_NOERR;
+    char buf[256];
+    ncbytesclear(out);
+    switch (basetype->id) {
+    case NC_CHAR:
+        snprintf(buf,sizeof(buf),"'%c'",*(char*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_BYTE:
+        snprintf(buf,sizeof(buf),"%d",*(char*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_UBYTE:
+        snprintf(buf,sizeof(buf),"%u",*(unsigned char*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_SHORT:
+        snprintf(buf,sizeof(buf),"%d",*(short*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_USHORT:
+        snprintf(buf,sizeof(buf),"%u",*(unsigned short*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_INT:
+        snprintf(buf,sizeof(buf),"%d",*(int*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_UINT:
+        snprintf(buf,sizeof(buf),"%u",*(unsigned int*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_INT64:
+        snprintf(buf,sizeof(buf),"%lld",*(long long*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_UINT64:
+        snprintf(buf,sizeof(buf),"%llu",*(unsigned long long*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_FLOAT:
+        snprintf(buf,sizeof(buf),"%g",*(float*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_DOUBLE:
+        snprintf(buf,sizeof(buf),"%g",*(double*)value);
+        ncbytescat(out,buf);
+        break;
+    case NC_STRING: {
+        char* s = *(char**)value;
+	printString(out,s,0);
+        } break;
+    case NC_OPAQUE: {
+        unsigned char* s = *(unsigned char**)value;
+	printOpaque(out,s,basetype->size,1);
+        } break;
+    case NC_ENUM:
+        /* use true basetype */
+        ret = getPrintValue(out,basetype->base,value);
+        break;
+    default:
+        break;
+    }
+    return ret;
+}
+
+static void
+getAtomicTypeName(nc_type base, char* name)
+{
+    const char* tname = NULL;
+    switch (base) {
+    case NC_BYTE: tname = "Byte"; break;
+    case NC_UBYTE: tname = "UByte"; break;
+    case NC_SHORT: tname = "Short"; break;
+    case NC_USHORT: tname = "UShort"; break;
+    case NC_INT: tname = "Int"; break;
+    case NC_UINT: tname = "UInt"; break;
+    case NC_FLOAT: tname = "Float"; break;
+    case NC_DOUBLE: tname = "Double"; break;
+    case NC_INT64: tname = "Int64"; break;
+    case NC_UINT64: tname = "UInt64"; break;
+    case NC_STRING: tname = "String"; break;
+    default: tname = ""; break;
+    }
+    strncpy(name,tname,strlen(tname)+1);
+}
+
+static void
+indent(NC4printer* out, int depth)
+{
+    while(depth-- >= 0) ncbytescat(out->out,"  ");
+}
+
+static unsigned long long
+getNumericValue(union NUMVALUE numvalue, nc_type base)
+{
+    switch (base) {
+    case NC_CHAR: case NC_BYTE: return numvalue.i8[0];
+    case NC_SHORT: case NC_USHORT: return numvalue.i16[0];
+    case NC_INT: case NC_UINT: return numvalue.i32[0];
+    case NC_INT64: case NC_UINT64: return numvalue.i64[0];
+    }
+    return NC_MAX_UINT64;
+}
+
+static NCID*
+findType(NC4printer* out, nc_type t)
+{
+    int len = nclistlength(out->types);
+    if(t >= len)
+	abort();
+    return (NCID*)nclistget(out->types,t);
+}
+
+static NCID*
+findDim(NC4printer* out, int dimid)
+{
+    if(nclistlength(out->dims) <= dimid) abort();
+    return (NCID*)nclistget(out->dims,dimid);
+}
+
+static void
+makeFQN(NCID* id, NCbytes* path)
+{
+    NCID* g = id;
+    ncbytesclear(path);
+    if(id->sort != GROUP)
+        g = id->parent;
+    if(!g->group.isroot)
+        fqnWalk(g,path);
+    ncbytesappend(path,'/');
+    if(id->sort != GROUP)
+        ncbytescat(path,id->name);   
+    ncbytesnull(path);
+}
+
+static void
+fqnWalk(NCID* grp, NCbytes* path)
+{
+    if(grp->id != 0) {
+        NCID* parent = grp->parent;
+        fqnWalk(parent,path);
+        ncbytesappend(path,'/');        
+        ncbytescat(path,parent->name);
+    }
+}
+
+static void
+record(NC4printer* out, NCID* node)
+{
+    switch (node->sort) {
+    case DIM:
+	if(nclistlength(out->dims) <= node->id) {
+            nclistsetalloc(out->dims,node->id+1);
+	    nclistsetlength(out->dims,node->id+1);
+	}
+        nclistset(out->dims,node->id,node);
+        break;
+    case ATOMTYPE:
+    case USERTYPE:
+	if(nclistlength(out->types) <= node->id) {
+            nclistsetalloc(out->types,node->id+1);
+	    nclistsetlength(out->types,node->id+1);
+	}
+        nclistset(out->types,node->id,node);
+        break;
+    default: break;
+    }
+}
+
+static void
+track(NC4printer* out, NCID* node)
+{
+    if(out == NULL || node == NULL || out->allnodes == NULL)
+	abort();
+#ifdef DEBUG
+    fprintf(stderr,"track: node=%lx\n",(unsigned long)node);
+#endif
+    nclistpush(out->allnodes,node);
+#ifdef DEBUG
+    fprintf(stderr,"track: |allnodes|=%ld\n",nclistlength(out->allnodes));
+    fflush(stderr);
+#endif
+}
+
+static void
+entityEscape(NCbytes* escaped, const char* s)
+{
+    const char* p;
+    ncbytesclear(escaped);
+    for(p=s;*p;p++) {
+	int c = *p;
+	switch (c) {
+	case '&':  ncbytescat(escaped,"&"); break;
+	case '<':  ncbytescat(escaped,"<"); break;
+	case '>':  ncbytescat(escaped,">"); break;
+	case '"':  ncbytescat(escaped,"""); break;
+	case '\'': ncbytescat(escaped,"'"); break;
+        default:   ncbytesappend(escaped,(c)); break;
+        }
+	ncbytesnull(escaped);
+    }
+}
+
+static int
+buildAtomicTypes(NC4printer* out, NCID* root)
+{
+    int ret = NC_NOERR;
+    nc_type tid;
+    char name[NC_MAX_NAME+1];
+    size_t size;
+    for(tid=NC_NAT+1;tid<=NC_MAX_ATOMIC_TYPE;tid++) {
+	if((ret=nc_inq_type(root->id,tid,NULL,&size))) FAIL;
+        getAtomicTypeName(tid,name);
+        MAKEID(type,ATOMTYPE,root,tid);
+	    SETNAME(type,name);
+	    type->size = size;
+	    type->usertype.kind = tid;
+        record(out, type);
+    }
+    return ret;
+}
+
+static void
+printString(NCbytes* out, const char* s, int quotes)
+{
+    const char* p;
+    if(quotes) ncbytesappend(out,'"');
+    if(s == NULL) s = "";
+    for(p=s;*p;p++) {
+	int c = *p;
+	if(c == '\\') ncbytescat(out,"\\\\");
+        else if(c == '"') ncbytescat(out,"\\\"");
+        else ncbytesappend(out,c);
+    }               
+    if(quotes) ncbytesappend(out,'"');
+    ncbytesnull(out);
+}
+
+static void
+printOpaque(NCbytes* out, const unsigned char* s, size_t len, int leadx)
+{
+    int i;
+    char digit;
+    if(s == NULL) {s = (unsigned char*)""; len = 1;}
+    if(leadx) ncbytescat(out,"0x");
+    for(i=0;i<len;i++) {
+        unsigned int c = s[i];
+        digit = hexchars[(c>>4) & 0xF];
+        ncbytesappend(out,digit);
+        digit = hexchars[c & 0xF];
+        ncbytesappend(out,digit);
+    }
+    ncbytesnull(out);
+}
+
+static void*
+computeOffset(NCID* base, void* values, size_t index)
+{
+    unsigned char* p = (unsigned char*)values; /*so we can do arithmetic */
+    return (void*)(p + ((base->size)*index));
+}
+
+static int
+readAttributeValues(NCID* attr, void** valuesp)
+{
+    int ret;
+    void* values = NULL;
+    NCID* var = attr->parent;
+    NCID* base = attr->base;
+    size_t len;
+
+    len = base->size * attr->size;
+    values = malloc(len);
+    if(values == NULL) return NC_ENOMEM;
+    if((ret=nc_get_att(GROUPOF(var),var->id,attr->name,values))) FAIL;
+    if(valuesp) *valuesp = values;
+    return ret;
+}
+
diff --git a/libsrc4/nc4type.c b/libsrc4/nc4type.c
index b1bf50c..57eb28f 100644
--- a/libsrc4/nc4type.c
+++ b/libsrc4/nc4type.c
@@ -22,7 +22,7 @@ char atomic_name[NUM_ATOMIC_TYPES][NC_MAX_NAME + 1] = {"none", "byte", "char",
 						       "ushort", "uint",
 						       "int64", "uint64", "string"};
 
-EXTERNL int
+extern int
 NC4_inq_type_equal(int ncid1, nc_type typeid1, int ncid2, 
 		  nc_type typeid2, int *equalp)
 {
@@ -81,7 +81,7 @@ NC4_inq_type_equal(int ncid1, nc_type typeid1, int ncid2,
 }
 
 /* Get the id of a type from the name. */
-EXTERNL int
+extern int
 NC4_inq_typeid(int ncid, const char *name, nc_type *typeidp)
 {
    NC_GRP_INFO_T *grp;
@@ -323,7 +323,7 @@ NC4_insert_compound(int ncid, nc_type typeid1, const char *name, size_t offset,
 }
 
 /* Insert a named array into a compound type. */
-EXTERNL int
+extern int
 NC4_insert_array_compound(int ncid, int typeid1, const char *name, 
 			 size_t offset, nc_type field_typeid,
 			 int ndims, const int *dim_sizesp)
diff --git a/libsrc4/nc4var.c b/libsrc4/nc4var.c
index 9edf540..0e9c8b8 100644
--- a/libsrc4/nc4var.c
+++ b/libsrc4/nc4var.c
@@ -94,11 +94,11 @@ NC4_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems,
    assert(nc && grp && h5);
 
    /* Find the var. */
-   for (var = grp->var; var; var = var->l.next)
-      if (var->varid == varid)
-         break;
-   if (!var)
-      return NC_ENOTVAR;
+   if (varid < 0 || varid >= grp->vars.nelems)
+     return NC_ENOTVAR;
+   var = grp->vars.value[varid];
+   if (!var) return NC_ENOTVAR;
+   assert(var->varid == varid);
 
    /* Set the values. */
    var->chunk_cache_size = size;
@@ -157,11 +157,11 @@ NC4_get_var_chunk_cache(int ncid, int varid, size_t *sizep,
    assert(nc && grp && h5);
 
    /* Find the var. */
-   for (var = grp->var; var; var = var->l.next)
-      if (var->varid == varid)
-         break;
-   if (!var)
-      return NC_ENOTVAR;
+   if (varid < 0 || varid >= grp->vars.nelems)
+     return NC_ENOTVAR;
+   var = grp->vars.value[varid];
+   if (!var) return NC_ENOTVAR;
+   assert(var->varid == varid);
 
    /* Give the user what they want. */
    if (sizep)
@@ -340,6 +340,37 @@ nc4_find_default_chunksizes2(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var)
    return NC_NOERR;
 }
 
+#define NC_ARRAY_GROWBY 4
+int nc4_vararray_add(NC_GRP_INFO_T *grp,
+		     NC_VAR_INFO_T *var)
+{
+  NC_VAR_INFO_T **vp = NULL;
+
+  if (grp->vars.nalloc == 0) {
+    assert(grp->vars.nelems == 0);
+    vp = (NC_VAR_INFO_T **) malloc(NC_ARRAY_GROWBY * sizeof(NC_VAR_INFO_T *));
+    if(vp == NULL)
+      return NC_ENOMEM;
+    grp->vars.value = vp;
+    grp->vars.nalloc = NC_ARRAY_GROWBY;
+  }
+  else if(grp->vars.nelems +1 > grp->vars.nalloc) {
+    vp = (NC_VAR_INFO_T **) realloc(grp->vars.value,
+			     (grp->vars.nalloc + NC_ARRAY_GROWBY) * sizeof(NC_VAR_INFO_T *));
+    if(vp == NULL)
+      return NC_ENOMEM;
+    grp->vars.value = vp;
+    grp->vars.nalloc += NC_ARRAY_GROWBY;
+  }
+
+  if(var != NULL) {
+    assert(var->varid == grp->vars.nelems);
+    grp->vars.value[grp->vars.nelems] = var;
+    grp->vars.nelems++;
+  }
+  return NC_NOERR;
+}
+
 /* This is called when a new netCDF-4 variable is defined. Break it
  * down! */
 static int
@@ -386,10 +417,6 @@ nc_def_var_nc4(int ncid, const char *name, nc_type xtype,
    if((unsigned long) ndims > X_INT_MAX) /* Backward compat */
       BAIL(NC_EINVAL);
 
-   /* Classic model files have a limit on number of vars. */
-   if(h5->cmode & NC_CLASSIC_MODEL && h5->nvars >= NC_MAX_VARS)
-      BAIL(NC_EMAXVARS);
-
    /* Check that this name is not in use as a var, grp, or type. */
    if ((retval = nc4_check_dup_name(grp, norm_name)))
       BAIL(retval);
@@ -413,8 +440,8 @@ nc_def_var_nc4(int ncid, const char *name, nc_type xtype,
    }
 #endif
 
-   /* Add the var to the end of the list. */
-   if ((retval = nc4_var_list_add(&grp->var, &var)))
+   /* Add a new var. */
+   if ((retval = nc4_var_add(&var)))
       BAIL(retval);
 
    /* Now fill in the values in the var info structure. */
@@ -426,6 +453,8 @@ nc_def_var_nc4(int ncid, const char *name, nc_type xtype,
    var->ndims = ndims;
    var->is_new_var = NC_TRUE;
 
+   nc4_vararray_add(grp, var);
+
    /* If this is a user-defined type, there is a type_info struct with
     * all the type information. For atomic types, fake up a type_info
     * struct. */
@@ -494,6 +523,13 @@ nc_def_var_nc4(int ncid, const char *name, nc_type xtype,
 	 BAIL(NC_ENOMEM);
    }
 
+   /* Set variables no_fill to match the database default
+    * unless the variable type is variable length (NC_STRING or NC_VLEN)
+    * or is user-defined type.
+    */
+   if (var->type_info->nc_type_class < NC_STRING)
+      var->no_fill = h5->fill_mode;
+
    /* Assign dimensions to the variable */
    /* At the same time, check to see if this is a coordinate
     * variable. If so, it will have the same name as one of its
@@ -671,13 +707,11 @@ NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep,
    }
 
    /* Find the var. */
-   for (var = grp->var; var; var = var->l.next)
-      if (var->varid == varid)
-         break;
-
-   /* Oh no! Maybe we couldn't find it (*sob*)! */
-   if (!var)
-      return NC_ENOTVAR;
+   if (varid < 0 || varid >= grp->vars.nelems)
+     return NC_ENOTVAR;
+   var = grp->vars.value[varid];
+   if (!var) return NC_ENOTVAR;
+   assert(var->varid == varid);
 
    /* Copy the data to the user's data buffers. */
    if (name)
@@ -821,13 +855,11 @@ nc_def_var_extra(int ncid, int varid, int *shuffle, int *deflate,
    assert(nc && grp && h5);
 
    /* Find the var. */
-   for (var = grp->var; var; var = var->l.next)
-      if (var->varid == varid)
-         break;
-
-   /* Oh no! Maybe we couldn't find it (*sob*)! */
-   if (!var)
-      return NC_ENOTVAR;
+   if (varid < 0 || varid >= grp->vars.nelems)
+     return NC_ENOTVAR;
+   var = grp->vars.value[varid];
+   if (!var) return NC_ENOTVAR;
+   assert(var->varid == varid);
 
    /* Can't turn on contiguous and deflate/fletcher32/szip. */
    if (contiguous)
@@ -1129,6 +1161,7 @@ NC4_inq_varid(int ncid, const char *name, int *varidp)
    char norm_name[NC_MAX_NAME + 1];
    int retval;
    uint32_t nn_hash;
+   int i;
    
    if (!name)
       return NC_EINVAL;
@@ -1148,13 +1181,16 @@ NC4_inq_varid(int ncid, const char *name, int *varidp)
    nn_hash = hash_fast(norm_name, strlen(norm_name));
 
    /* Find var of this name. */
-   for (var = grp->var; var; var = var->l.next)
-      if (nn_hash == var->hash && !(strcmp(var->name, norm_name)))
+   for (i=0; i < grp->vars.nelems; i++)
       {
-         *varidp = var->varid;
-         return NC_NOERR;
+	var = grp->vars.value[i];
+	if (!var) continue;
+        if (nn_hash == var->hash && !(strcmp(var->name, norm_name)))
+          {
+             *varidp = var->varid;
+             return NC_NOERR;
+          }
       }
-
    return NC_ENOTVAR;
 }
 
@@ -1171,6 +1207,7 @@ NC4_rename_var(int ncid, int varid, const char *name)
    NC_VAR_INFO_T *var, *tmp_var;
    uint32_t nn_hash;
    int retval = NC_NOERR;
+   int i;
 
    LOG((2, "%s: ncid 0x%x varid %d name %s",
         __func__, ncid, varid, name));
@@ -1197,8 +1234,10 @@ NC4_rename_var(int ncid, int varid, const char *name)
    /* Check if name is in use, and retain a pointer to the correct variable */
    nn_hash = hash_fast(name, strlen(name));
    tmp_var = NULL;
-   for (var = grp->var; var; var = var->l.next)
+   for (i=0; i < grp->vars.nelems; i++)
    {
+      var = grp->vars.value[i];
+      if (!var) continue;
       if (nn_hash == var->hash && !strncmp(var->name, name, NC_MAX_NAME))
          return NC_ENAMEINUSE;
       if (var->varid == varid)
@@ -1293,11 +1332,11 @@ NC4_var_par_access(int ncid, int varid, int par_access)
       return NC_ENOPAR;
 
    /* Find the var, and set its preference. */
-   for (var = grp->var; var; var = var->l.next)
-      if (var->varid == varid)
-         break;
-   if (!var)
-      return NC_ENOTVAR;
+   if (varid < 0 || varid >= grp->vars.nelems)
+     return NC_ENOTVAR;
+   var = grp->vars.value[varid];
+   if (!var) return NC_ENOTVAR;
+   assert(var->varid == varid);
 
    if (par_access)
       var->parallel_access = NC_COLLECTIVE;
@@ -1395,3 +1434,17 @@ NC4_get_vara(int ncid, int varid, const size_t *startp,
 {
    return nc4_get_vara_tc(ncid, varid, memtype, 0, startp, countp, ip);
 }
+
+void
+nc4verify(int ncid, char* name)
+{
+   NC_GRP_INFO_T *grp;
+   NC_HDF5_FILE_INFO_T *h5;
+   int retval;
+
+   /* Find info for this file and group, and set pointer to each. */
+   retval = nc4_find_grp_h5(ncid, &grp, &h5);
+   assert(grp && h5);
+   retval = nc4_check_dup_name(grp, name);
+   return;
+}
diff --git a/libsrc4/ncfunc.c b/libsrc4/ncfunc.c
index a89caf9..c73840f 100644
--- a/libsrc4/ncfunc.c
+++ b/libsrc4/ncfunc.c
@@ -12,7 +12,7 @@ conditions.
 */
 
 #include "nc4internal.h"
-#include "nc3dispatch.h"
+#include "nc4dispatch.h"
 
 /* This will return the length of a netcdf data type in bytes. Since
    we haven't added any new types, I just call the v3 function.
diff --git a/libsrc4/stub3.c b/libsrc4/stub3.c
deleted file mode 100644
index 42a4a96..0000000
--- a/libsrc4/stub3.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "config.h"
-#include "netcdf.h"
-#include "ncdispatch.h"
-
-extern NC_Dispatch* NC3_dispatch_table;
-
-#ifdef USE_DAP
-NC_Dispatch NC3DAP_dispatch_table = NULL;
-#endif
-
-#ifdef USE_NETCDF4
-
-NC_Dispatch NC4_dispatch_table = NULL;
-
-#ifdef USE_DAP
-NC_Dispatch NC4DAP_dispatch_table = NULL
-#endif
-#endif
-
-NC_Dispatch*
-NC_getdefaultdispatch(void)
-{
-    return NC3_dispatch_table;
-}
diff --git a/libsrc4/stub4.c b/libsrc4/stub4.c
deleted file mode 100644
index 17cb10f..0000000
--- a/libsrc4/stub4.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/*********************************************************************
- *   Copyright 2010, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *********************************************************************/
-
-#include "config.h"
-#include "netcdf.h"
-
-extern int NC3_initialize(void);
-extern int NC4_initialize(void);
-
-int
-NC_initialize(void)
-{
-    NC3_initialize();
-    NC4_initialize();
-    return NC_NOERR;
-}
diff --git a/libsrcp/Makefile.in b/libsrcp/Makefile.in
index 2dbfa36..9f4d283 100644
--- a/libsrcp/Makefile.in
+++ b/libsrcp/Makefile.in
@@ -237,6 +237,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -264,12 +265,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -304,6 +307,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -368,6 +372,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 libnetcdfp_la_CPPFLAGS = ${AM_CPPFLAGS} $(am__append_3)
 
 # These files comprise the pnetcdf dispatch library code.
diff --git a/libsrcp/ncpdispatch.c b/libsrcp/ncpdispatch.c
index a4e8c3e..19b2d31 100644
--- a/libsrcp/ncpdispatch.c
+++ b/libsrcp/ncpdispatch.c
@@ -189,7 +189,7 @@ NCP__enddef(int ncid, size_t h_minfree, size_t v_align, size_t v_minfree, size_t
     assert(nc5);
 
     /* causes implicitly defined warning; may be because of old installed pnetcdf? */
-#if 0
+#if 1
     /* In PnetCDF ncmpi__enddef() is only implemented in v1.5.0 and later */
     status = ncmpi__enddef(nc->int_ncid, mpi_h_minfree, mpi_v_align,
                            mpi_v_minfree, mpi_r_align);
@@ -441,6 +441,7 @@ NCP_get_att(
     if(status != NC_NOERR) return status;
 
     status = NCP_inq_att(ncid,varid,name,&xtype,NULL);
+    if(status != NC_NOERR) return status;
 
     if(memtype == NC_NAT) memtype = xtype;
 
@@ -487,6 +488,14 @@ NCP_put_att(
     int status;
     MPI_Offset mpilen;
 
+    /* check if ncid is valid */
+    status = NC_check_id(ncid, &nc);
+    if(status != NC_NOERR) return status;
+
+    /* check if varid is valid */
+    status = ncmpi_inq_varnatts(nc->int_ncid, varid, NULL);
+    if (status != NC_NOERR) return status;
+
     if (!name || (strlen(name) > NC_MAX_NAME))
 	return NC_EBADNAME;
 
@@ -495,9 +504,6 @@ NCP_put_att(
     if(((unsigned long) len) > X_INT_MAX)
 	return NC_EINVAL;
 
-    status = NC_check_id(ncid, &nc);
-    if(status != NC_NOERR) return status;
-
     mpilen = len;
 
     switch (memtype) {
diff --git a/mclean b/mclean
old mode 100755
new mode 100644
diff --git a/nc-config.cmake.in b/nc-config.cmake.in
old mode 100755
new mode 100644
index a6c2488..f04c1f5
--- a/nc-config.cmake.in
+++ b/nc-config.cmake.in
@@ -13,13 +13,17 @@ cc="@CMAKE_C_COMPILER@"
 cflags="-I at CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@"
 libs="-L at CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ @NC_LIBS@"
 
-has_dap="@USE_DAP@"
-if [ -z $has_dap ]; then
-    has_dap="no"
+if [ -z "@USE_DAP@" -o -z "@ENABLE_DAP2@" ] ; then
+has_dap2=ON
+fi
+if [ -z $has_dap2 ]; then
+    has_dap2="no"
 else
-    has_dap="yes"
+    has_dap2="yes"
 fi
 
+has_dap4="@ENABLE_DAP4"
+
 has_nc2="@BUILD_V2@"
 
 
@@ -118,7 +122,9 @@ Available values for OPTION include:
   --has-c++     whether C++ API is installed
   --has-c++4    whether netCDF-4 C++ API is installed
   --has-fortran whether Fortran API is installed
-  --has-dap     whether OPeNDAP is enabled in this build
+  --has-dap2    whether OPeNDAP (DAP2) is enabled in this build
+  --has-dap4    whether DAP4 is enabled in this build
+  --has-dap     same as --has-dp (Deprecated)
   --has-nc2     whether NetCDF-2 API is enabled
   --has-nc4     whether NetCDF-4/HDF-5 is enabled in this build
   --has-hdf5    whether HDF5 is used in build (always the same as --has-nc4)
@@ -193,6 +199,8 @@ if [ -f "$nfconf" ]; then
         echo
 fi
         echo "  --has-dap   -> $has_dap"
+        echo "  --has-dap2  -> $has_dap2"
+        echo "  --has-dap4  -> $has_dap4"
         echo "  --has-nc2   -> $has_nc2"
         echo "  --has-nc4   -> $has_nc4"
         echo "  --has-hdf5  -> $has_hdf5"
@@ -240,7 +248,15 @@ while test $# -gt 0; do
 	;;
 
     --has-dap)
-       	echo $has_dap
+       	echo $has_dap2 $has_dap4
+       	;;
+
+    --has-dap2)
+       	echo $has_dap2
+       	;;
+
+    --has-dap4)
+       	echo $has_dap4
        	;;
 
     --has-nc2)
diff --git a/nc-config.in b/nc-config.in
old mode 100755
new mode 100644
index 1c7198d..d0cadfd
--- a/nc-config.in
+++ b/nc-config.in
@@ -14,6 +14,7 @@ cflags="-I${includedir} @CPPFLAGS@"
 libs="-L${libdir} @NC_LIBS@"
 
 has_dap="@HAS_DAP@"
+has_dap4="@HAS_DAP4@"
 has_nc2="@HAS_NC2@"
 has_nc4="@HAS_NC4@"
 has_hdf4="@HAS_HDF4@"
@@ -65,7 +66,8 @@ Available values for OPTION include:
   --has-c++     whether C++ API is installed
   --has-c++4    whether netCDF-4 C++ API is installed
   --has-fortran whether Fortran API is installed
-  --has-dap     whether OPeNDAP is enabled in this build
+  --has-dap     whether OPeNDAP (DAP2) is enabled in this build
+  --has-dap4    whether DAP4 is enabled in this build
   --has-nc2     whether NetCDF-2 API is enabled
   --has-nc4     whether NetCDF-4/HDF-5 is enabled in this build
   --has-hdf5    whether HDF5 is used in build (always the same as --has-nc4)
@@ -140,6 +142,7 @@ if [ -f "$nfconf" ]; then
         echo
 fi
         echo "  --has-dap   -> $has_dap"
+        echo "  --has-dap4  -> $has_dap4"
         echo "  --has-nc2   -> $has_nc2"
         echo "  --has-nc4   -> $has_nc4"
         echo "  --has-hdf5  -> $has_hdf5"
@@ -190,6 +193,10 @@ while test $# -gt 0; do
        	echo $has_dap
        	;;
 
+    --has-dap4)
+       	echo $has_dap4
+       	;;
+
     --has-nc2)
        	echo $has_nc2
        	;;
diff --git a/nc_test/CMakeLists.txt b/nc_test/CMakeLists.txt
index f46ac17..209bacd 100644
--- a/nc_test/CMakeLists.txt
+++ b/nc_test/CMakeLists.txt
@@ -1,6 +1,14 @@
+message(STATUS "CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR}")
+message(STATUS "CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}")
+message(STATUS "CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}")
+message(STATUS "CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}")
+
+add_definitions(-D"TOPSRCDIR=${CMAKE_SOURCE_DIR}")
+add_definitions(-D"TOPBINDIR=${CMAKE_BINARY_DIR}")
+
 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/include)
 
-SET (nc_test_m4_SOURCES test_get test_put)
+SET (nc_test_m4_SOURCES test_get test_put test_read test_write)
 FOREACH (F ${nc_test_m4_SOURCES})
   GEN_m4(${F})
 ENDFOREACH()
@@ -22,7 +30,7 @@ TARGET_LINK_LIBRARIES(nc_test
   )
 
 # Some extra stand-alone tests
-SET(TESTS t_nc tst_small tst_misc tst_norm tst_names tst_nofill tst_nofill2 tst_nofill3 tst_meta tst_inq_type)
+SET(TESTS t_nc tst_small tst_misc tst_norm tst_names tst_nofill tst_nofill2 tst_nofill3 tst_meta tst_inq_type tst_global_fillval)
 
 IF(NOT HAVE_BASH)
   SET(TESTS ${TESTS} tst_atts3)
@@ -31,6 +39,7 @@ ENDIF()
 IF(USE_NETCDF4)
   SET(TESTS ${TESTS} tst_atts)
   SET(TESTS ${TESTS} tst_put_vars)
+  SET(TESTS ${TESTS} tst_elatefill)
 ENDIF()
 
 IF(USE_PNETCDF)
@@ -50,7 +59,7 @@ IF(LARGE_FILE_TESTS)
 ENDIF()
 
 IF(BUILD_DISKLESS)
-  SET(TESTFILES ${TESTFILES} tst_diskless tst_diskless3 tst_diskless4)
+  SET(TESTFILES ${TESTFILES} tst_diskless tst_diskless3 tst_diskless4 tst_diskless5)
   IF(USE_NETCDF4)
     SET(TESTFILES ${TESTFILES} tst_diskless2)
   ENDIF()
@@ -78,6 +87,7 @@ IF(BUILD_UTILITIES)
     IF(LARGE_FILE_TESTS)
       add_sh_test(nc_test run_diskless2)
     ENDIF(LARGE_FILE_TESTS)
+    add_sh_test(nc_test run_diskless5)
 
   ENDIF(BUILD_DISKLESS)
 ENDIF(BUILD_UTILITIES)
@@ -93,5 +103,5 @@ ENDIF()
 ## Specify files to be distributed by 'make dist'
 FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
 SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am)
-SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} test_get.m4 test_put.m4 ref_tst_diskless2.cdl)
+SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} test_get.m4 test_put.m4 test_read.m4 test_write.m4 ref_tst_diskless2.cdl tst_diskless5.cdl)
 ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
diff --git a/nc_test/Make0 b/nc_test/Make0
index 4e1c2b2..9875dbc 100644
--- a/nc_test/Make0
+++ b/nc_test/Make0
@@ -1,5 +1,5 @@
 # Test c output
-T=tst_small
+T=tst_utf8_normalize2
 #CMD=valgrind --leak-check=full
 CMD=gdb --args
 
diff --git a/nc_test/Makefile.am b/nc_test/Makefile.am
index 2c46c4b..8e03ff3 100644
--- a/nc_test/Makefile.am
+++ b/nc_test/Makefile.am
@@ -7,6 +7,8 @@
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 include $(top_srcdir)/lib_flags.am
 AM_CPPFLAGS += -I$(top_srcdir)/libsrc
+AM_CPPFLAGS += -DTOPSRCDIR=${abs_top_srcdir}
+AM_CPPFLAGS += -DTOPBINDIR=${abs_top_bindir}
 
 # These files are created by the tests.
 CLEANFILES = nc_test_classic.nc nc_test_64bit.nc nc_test_netcdf4.nc	\
@@ -14,15 +16,18 @@ tst_*.nc t_nc.nc large_files.nc quick_large_files.nc \
 tst_diskless.nc tst_diskless2.nc \
 tst_diskless3.nc tst_diskless3_file.cdl tst_diskless3_memory.cdl \
 tst_diskless4.cdl tst_diskless4.nc tst_formatx.nc nc_test_cdf5.nc \
-unlim.nc tst_inq_type.nc
+unlim.nc tst_inq_type.nc tst_elatefill.nc tst_global_fillval.nc
+
+check_PROGRAMS =
 
 # These are the tests which are always run.
 TESTPROGRAMS = t_nc tst_small nc_test tst_misc tst_norm \
 	tst_names tst_nofill tst_nofill2 tst_nofill3 tst_atts3 \
-	tst_meta tst_inq_type
+	tst_meta tst_inq_type tst_utf8_validate tst_utf8_phrases \
+	tst_global_fillval
 
 if USE_NETCDF4
-TESTPROGRAMS += tst_atts tst_put_vars
+TESTPROGRAMS += tst_atts tst_put_vars tst_elatefill
 endif
 
 if USE_PNETCDF
@@ -50,11 +55,11 @@ CLEANFILES += benchmark.nc
 endif
 
 # Set up the tests.
-check_PROGRAMS = $(TESTPROGRAMS)
+check_PROGRAMS += $(TESTPROGRAMS)
 
 # Build Diskless test helpers
 if BUILD_DISKLESS
-check_PROGRAMS += tst_diskless tst_diskless3 tst_diskless4
+check_PROGRAMS += tst_diskless tst_diskless3 tst_diskless4 tst_diskless5
 if USE_NETCDF4
 check_PROGRAMS += tst_diskless2
 endif
@@ -63,15 +68,15 @@ endif
 TESTS = $(TESTPROGRAMS)
 
 if BUILD_UTILITIES
-	if BUILD_DISKLESS
-		TESTS += run_diskless.sh
-		if BUILD_MMAP
-			TESTS += run_mmap.sh
-		endif
-		if LARGE_FILE_TESTS
-			TESTS += run_diskless2.sh
-		endif
-	endif
+if BUILD_DISKLESS
+TESTS += run_diskless.sh run_diskless5.sh
+if BUILD_MMAP
+TESTS += run_mmap.sh
+endif
+if LARGE_FILE_TESTS
+TESTS += run_diskless2.sh
+endif
+endif
 endif
 
 if USE_PNETCDF
@@ -82,9 +87,9 @@ endif
 # checking tool. (Valgrind must be present for this to work.)
 if USE_VALGRIND_TESTS
 if USE_NETCDF4
-TESTS_ENVIRONMENT=USE_NETCDF4=1
+    TESTS_ENVIRONMENT = USE_NETCDF4=1
 else
-TESTS_ENVIRONMENT=USE_NETCDF4=0
+    TESTS_ENVIRONMENT = USE_NETCDF4=0
 endif
 TESTS += run_valgrind_tests.sh
 endif # USE_VALGRIND_TESTS
@@ -92,12 +97,14 @@ endif # USE_VALGRIND_TESTS
 # Distribute the .c files so that m4 isn't required on the users
 # machine.
 EXTRA_DIST = test_get.m4 test_put.m4 run_valgrind_tests.sh \
-run_diskless.sh run_diskless2.sh run_mmap.sh run_pnetcdf_test.sh
+run_diskless.sh run_diskless2.sh run_diskless5.sh \
+run_mmap.sh run_pnetcdf_test.sh \
+test_read.m4 test_write.m4
 
 # ref_tst_diskless2.cdl is for diff comparison and to produce tst_diskless2.c
-EXTRA_DIST += ref_tst_diskless2.cdl CMakeLists.txt
+EXTRA_DIST += ref_tst_diskless2.cdl tst_diskless5.cdl CMakeLists.txt
 
-# Only clean these on mainatiner-clean, because they require m4 to
+# Only clean these on maintainer-clean, because they require m4 to
 # regenerate.
 #MAINTAINERCLEANFILES = test_get.c test_put.c
 
diff --git a/nc_test/Makefile.in b/nc_test/Makefile.in
index ff18402..69f59a4 100644
--- a/nc_test/Makefile.in
+++ b/nc_test/Makefile.in
@@ -105,7 +105,8 @@ target_triplet = @target@
 
 # This turns on declspec magic in netcdf.h for windows DLLs.
 @BUILD_DLL_TRUE at am__append_2 = -DDLL_NETCDF
- at USE_NETCDF4_TRUE@am__append_3 = tst_atts tst_put_vars
+check_PROGRAMS = $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7)
+ at USE_NETCDF4_TRUE@am__append_3 = tst_atts tst_put_vars tst_elatefill
 @USE_PNETCDF_TRUE at am__append_4 = tst_parallel2 tst_pnetcdf tst_addvar tst_formatx_pnetcdf
 
 # If the user asked for large file tests, then add them.
@@ -114,14 +115,17 @@ target_triplet = @target@
 
 @BUILD_BENCHMARKS_TRUE at am__append_6 = testnc3perf
 @BUILD_BENCHMARKS_TRUE at am__append_7 = benchmark.nc
-check_PROGRAMS = $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7)
 
 # Build Diskless test helpers
- at BUILD_DISKLESS_TRUE@am__append_8 = tst_diskless tst_diskless3 tst_diskless4
+ at BUILD_DISKLESS_TRUE@am__append_8 = tst_diskless tst_diskless3 tst_diskless4 tst_diskless5
 @BUILD_DISKLESS_TRUE@@USE_NETCDF4_TRUE at am__append_9 = tst_diskless2
-TESTS = $(am__EXEEXT_5) $(am__append_10) $(am__append_11)
- at USE_PNETCDF_TRUE@am__append_10 = run_pnetcdf_test.sh
- at USE_VALGRIND_TESTS_TRUE@am__append_11 = run_valgrind_tests.sh
+TESTS = $(am__EXEEXT_5) $(am__append_10) $(am__append_11) \
+	$(am__append_12) $(am__append_13) $(am__append_14)
+ at BUILD_DISKLESS_TRUE@@BUILD_UTILITIES_TRUE at am__append_10 = run_diskless.sh run_diskless5.sh
+ at BUILD_DISKLESS_TRUE@@BUILD_MMAP_TRUE@@BUILD_UTILITIES_TRUE at am__append_11 = run_mmap.sh
+ at BUILD_DISKLESS_TRUE@@BUILD_UTILITIES_TRUE@@LARGE_FILE_TESTS_TRUE at am__append_12 = run_diskless2.sh
+ at USE_PNETCDF_TRUE@am__append_13 = run_pnetcdf_test.sh
+ at USE_VALGRIND_TESTS_TRUE@am__append_14 = run_valgrind_tests.sh
 subdir = nc_test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -136,7 +140,7 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 @USE_NETCDF4_TRUE at am__EXEEXT_1 = tst_atts$(EXEEXT) \
- at USE_NETCDF4_TRUE@	tst_put_vars$(EXEEXT)
+ at USE_NETCDF4_TRUE@	tst_put_vars$(EXEEXT) tst_elatefill$(EXEEXT)
 @USE_PNETCDF_TRUE at am__EXEEXT_2 = tst_parallel2$(EXEEXT) \
 @USE_PNETCDF_TRUE@	tst_pnetcdf$(EXEEXT) tst_addvar$(EXEEXT) \
 @USE_PNETCDF_TRUE@	tst_formatx_pnetcdf$(EXEEXT)
@@ -151,11 +155,13 @@ am__EXEEXT_5 = t_nc$(EXEEXT) tst_small$(EXEEXT) nc_test$(EXEEXT) \
 	tst_misc$(EXEEXT) tst_norm$(EXEEXT) tst_names$(EXEEXT) \
 	tst_nofill$(EXEEXT) tst_nofill2$(EXEEXT) tst_nofill3$(EXEEXT) \
 	tst_atts3$(EXEEXT) tst_meta$(EXEEXT) tst_inq_type$(EXEEXT) \
-	$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
-	$(am__EXEEXT_4)
+	tst_utf8_validate$(EXEEXT) tst_utf8_phrases$(EXEEXT) \
+	tst_global_fillval$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
+	$(am__EXEEXT_3) $(am__EXEEXT_4)
 @BUILD_DISKLESS_TRUE at am__EXEEXT_6 = tst_diskless$(EXEEXT) \
 @BUILD_DISKLESS_TRUE@	tst_diskless3$(EXEEXT) \
- at BUILD_DISKLESS_TRUE@	tst_diskless4$(EXEEXT)
+ at BUILD_DISKLESS_TRUE@	tst_diskless4$(EXEEXT) \
+ at BUILD_DISKLESS_TRUE@	tst_diskless5$(EXEEXT)
 @BUILD_DISKLESS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_7 =  \
 @BUILD_DISKLESS_TRUE@@USE_NETCDF4_TRUE@	tst_diskless2$(EXEEXT)
 large_files_SOURCES = large_files.c
@@ -229,11 +235,23 @@ tst_diskless4_SOURCES = tst_diskless4.c
 tst_diskless4_OBJECTS = tst_diskless4.$(OBJEXT)
 tst_diskless4_LDADD = $(LDADD)
 tst_diskless4_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+tst_diskless5_SOURCES = tst_diskless5.c
+tst_diskless5_OBJECTS = tst_diskless5.$(OBJEXT)
+tst_diskless5_LDADD = $(LDADD)
+tst_diskless5_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+tst_elatefill_SOURCES = tst_elatefill.c
+tst_elatefill_OBJECTS = tst_elatefill.$(OBJEXT)
+tst_elatefill_LDADD = $(LDADD)
+tst_elatefill_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 tst_formatx_pnetcdf_SOURCES = tst_formatx_pnetcdf.c
 tst_formatx_pnetcdf_OBJECTS = tst_formatx_pnetcdf.$(OBJEXT)
 tst_formatx_pnetcdf_LDADD = $(LDADD)
 tst_formatx_pnetcdf_DEPENDENCIES =  \
 	${top_builddir}/liblib/libnetcdf.la
+tst_global_fillval_SOURCES = tst_global_fillval.c
+tst_global_fillval_OBJECTS = tst_global_fillval.$(OBJEXT)
+tst_global_fillval_LDADD = $(LDADD)
+tst_global_fillval_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 tst_inq_type_SOURCES = tst_inq_type.c
 tst_inq_type_OBJECTS = tst_inq_type.$(OBJEXT)
 tst_inq_type_LDADD = $(LDADD)
@@ -286,6 +304,14 @@ tst_small_SOURCES = tst_small.c
 tst_small_OBJECTS = tst_small.$(OBJEXT)
 tst_small_LDADD = $(LDADD)
 tst_small_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+tst_utf8_phrases_SOURCES = tst_utf8_phrases.c
+tst_utf8_phrases_OBJECTS = tst_utf8_phrases.$(OBJEXT)
+tst_utf8_phrases_LDADD = $(LDADD)
+tst_utf8_phrases_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+tst_utf8_validate_SOURCES = tst_utf8_validate.c
+tst_utf8_validate_OBJECTS = tst_utf8_validate.$(OBJEXT)
+tst_utf8_validate_LDADD = $(LDADD)
+tst_utf8_validate_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -324,18 +350,22 @@ SOURCES = large_files.c $(nc_test_SOURCES) quick_large_files.c t_nc.c \
 	$(testnc3perf_SOURCES) tst_addvar.c tst_atts.c tst_atts3.c \
 	tst_big_rvar.c tst_big_var.c tst_big_var2.c tst_big_var6.c \
 	tst_diskless.c tst_diskless2.c tst_diskless3.c tst_diskless4.c \
-	tst_formatx_pnetcdf.c tst_inq_type.c tst_large.c tst_meta.c \
+	tst_diskless5.c tst_elatefill.c tst_formatx_pnetcdf.c \
+	tst_global_fillval.c tst_inq_type.c tst_large.c tst_meta.c \
 	tst_misc.c tst_names.c tst_nofill.c tst_nofill2.c \
 	tst_nofill3.c tst_norm.c tst_parallel2.c tst_pnetcdf.c \
-	tst_put_vars.c tst_small.c
+	tst_put_vars.c tst_small.c tst_utf8_phrases.c \
+	tst_utf8_validate.c
 DIST_SOURCES = large_files.c $(nc_test_SOURCES) quick_large_files.c \
 	t_nc.c $(am__testnc3perf_SOURCES_DIST) tst_addvar.c tst_atts.c \
 	tst_atts3.c tst_big_rvar.c tst_big_var.c tst_big_var2.c \
 	tst_big_var6.c tst_diskless.c tst_diskless2.c tst_diskless3.c \
-	tst_diskless4.c tst_formatx_pnetcdf.c tst_inq_type.c \
+	tst_diskless4.c tst_diskless5.c tst_elatefill.c \
+	tst_formatx_pnetcdf.c tst_global_fillval.c tst_inq_type.c \
 	tst_large.c tst_meta.c tst_misc.c tst_names.c tst_nofill.c \
 	tst_nofill2.c tst_nofill3.c tst_norm.c tst_parallel2.c \
-	tst_pnetcdf.c tst_put_vars.c tst_small.c
+	tst_pnetcdf.c tst_put_vars.c tst_small.c tst_utf8_phrases.c \
+	tst_utf8_validate.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -574,7 +604,8 @@ AM_CFLAGS = @AM_CFLAGS@
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 AM_CPPFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) \
-	-I$(top_srcdir)/libsrc -I$(top_builddir)/liblib \
+	-I$(top_srcdir)/libsrc -DTOPSRCDIR=${abs_top_srcdir} \
+	-DTOPBINDIR=${abs_top_bindir} -I$(top_builddir)/liblib \
 	-I$(top_builddir)/include -I$(top_srcdir)/libsrc
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_LDFLAGS = 
@@ -612,6 +643,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -639,12 +671,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -679,6 +713,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -743,6 +778,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # These files are created by the tests.
 CLEANFILES = nc_test_classic.nc nc_test_64bit.nc nc_test_netcdf4.nc \
@@ -750,13 +786,15 @@ CLEANFILES = nc_test_classic.nc nc_test_64bit.nc nc_test_netcdf4.nc \
 	tst_diskless.nc tst_diskless2.nc tst_diskless3.nc \
 	tst_diskless3_file.cdl tst_diskless3_memory.cdl \
 	tst_diskless4.cdl tst_diskless4.nc tst_formatx.nc \
-	nc_test_cdf5.nc unlim.nc tst_inq_type.nc $(am__append_7) ncx.c
+	nc_test_cdf5.nc unlim.nc tst_inq_type.nc tst_elatefill.nc \
+	tst_global_fillval.nc $(am__append_7) ncx.c
 
 # These are the tests which are always run.
 TESTPROGRAMS = t_nc tst_small nc_test tst_misc tst_norm tst_names \
 	tst_nofill tst_nofill2 tst_nofill3 tst_atts3 tst_meta \
-	tst_inq_type $(am__append_3) $(am__append_4) $(am__append_5) \
-	$(am__append_6)
+	tst_inq_type tst_utf8_validate tst_utf8_phrases \
+	tst_global_fillval $(am__append_3) $(am__append_4) \
+	$(am__append_5) $(am__append_6)
 
 # These are the source files for the main workhorse test program,
 # nc_test. If you pass nc_test, you are doing well.
@@ -776,8 +814,9 @@ LDADD = ${top_builddir}/liblib/libnetcdf.la
 
 # ref_tst_diskless2.cdl is for diff comparison and to produce tst_diskless2.c
 EXTRA_DIST = test_get.m4 test_put.m4 run_valgrind_tests.sh \
-	run_diskless.sh run_diskless2.sh run_mmap.sh \
-	run_pnetcdf_test.sh ref_tst_diskless2.cdl CMakeLists.txt
+	run_diskless.sh run_diskless2.sh run_diskless5.sh run_mmap.sh \
+	run_pnetcdf_test.sh test_read.m4 test_write.m4 \
+	ref_tst_diskless2.cdl tst_diskless5.cdl CMakeLists.txt
 all: all-am
 
 .SUFFIXES:
@@ -886,10 +925,22 @@ tst_diskless4$(EXEEXT): $(tst_diskless4_OBJECTS) $(tst_diskless4_DEPENDENCIES) $
 	@rm -f tst_diskless4$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(tst_diskless4_OBJECTS) $(tst_diskless4_LDADD) $(LIBS)
 
+tst_diskless5$(EXEEXT): $(tst_diskless5_OBJECTS) $(tst_diskless5_DEPENDENCIES) $(EXTRA_tst_diskless5_DEPENDENCIES) 
+	@rm -f tst_diskless5$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(tst_diskless5_OBJECTS) $(tst_diskless5_LDADD) $(LIBS)
+
+tst_elatefill$(EXEEXT): $(tst_elatefill_OBJECTS) $(tst_elatefill_DEPENDENCIES) $(EXTRA_tst_elatefill_DEPENDENCIES) 
+	@rm -f tst_elatefill$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(tst_elatefill_OBJECTS) $(tst_elatefill_LDADD) $(LIBS)
+
 tst_formatx_pnetcdf$(EXEEXT): $(tst_formatx_pnetcdf_OBJECTS) $(tst_formatx_pnetcdf_DEPENDENCIES) $(EXTRA_tst_formatx_pnetcdf_DEPENDENCIES) 
 	@rm -f tst_formatx_pnetcdf$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(tst_formatx_pnetcdf_OBJECTS) $(tst_formatx_pnetcdf_LDADD) $(LIBS)
 
+tst_global_fillval$(EXEEXT): $(tst_global_fillval_OBJECTS) $(tst_global_fillval_DEPENDENCIES) $(EXTRA_tst_global_fillval_DEPENDENCIES) 
+	@rm -f tst_global_fillval$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(tst_global_fillval_OBJECTS) $(tst_global_fillval_LDADD) $(LIBS)
+
 tst_inq_type$(EXEEXT): $(tst_inq_type_OBJECTS) $(tst_inq_type_DEPENDENCIES) $(EXTRA_tst_inq_type_DEPENDENCIES) 
 	@rm -f tst_inq_type$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(tst_inq_type_OBJECTS) $(tst_inq_type_LDADD) $(LIBS)
@@ -942,6 +993,14 @@ tst_small$(EXEEXT): $(tst_small_OBJECTS) $(tst_small_DEPENDENCIES) $(EXTRA_tst_s
 	@rm -f tst_small$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(tst_small_OBJECTS) $(tst_small_LDADD) $(LIBS)
 
+tst_utf8_phrases$(EXEEXT): $(tst_utf8_phrases_OBJECTS) $(tst_utf8_phrases_DEPENDENCIES) $(EXTRA_tst_utf8_phrases_DEPENDENCIES) 
+	@rm -f tst_utf8_phrases$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(tst_utf8_phrases_OBJECTS) $(tst_utf8_phrases_LDADD) $(LIBS)
+
+tst_utf8_validate$(EXEEXT): $(tst_utf8_validate_OBJECTS) $(tst_utf8_validate_DEPENDENCIES) $(EXTRA_tst_utf8_validate_DEPENDENCIES) 
+	@rm -f tst_utf8_validate$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(tst_utf8_validate_OBJECTS) $(tst_utf8_validate_LDADD) $(LIBS)
+
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
 
@@ -969,7 +1028,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_diskless2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_diskless3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_diskless4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_diskless5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_elatefill.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_formatx_pnetcdf.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_global_fillval.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_inq_type.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_large.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_meta.Po at am__quote@
@@ -983,6 +1045,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_pnetcdf.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_put_vars.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_small.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_utf8_phrases.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_utf8_validate.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/util.Po at am__quote@
 
 .c.o:
@@ -1292,6 +1356,27 @@ tst_inq_type.log: tst_inq_type$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_utf8_validate.log: tst_utf8_validate$(EXEEXT)
+	@p='tst_utf8_validate$(EXEEXT)'; \
+	b='tst_utf8_validate'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_utf8_phrases.log: tst_utf8_phrases$(EXEEXT)
+	@p='tst_utf8_phrases$(EXEEXT)'; \
+	b='tst_utf8_phrases'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_global_fillval.log: tst_global_fillval$(EXEEXT)
+	@p='tst_global_fillval$(EXEEXT)'; \
+	b='tst_global_fillval'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 tst_atts.log: tst_atts$(EXEEXT)
 	@p='tst_atts$(EXEEXT)'; \
 	b='tst_atts'; \
@@ -1306,6 +1391,13 @@ tst_put_vars.log: tst_put_vars$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_elatefill.log: tst_elatefill$(EXEEXT)
+	@p='tst_elatefill$(EXEEXT)'; \
+	b='tst_elatefill'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 tst_parallel2.log: tst_parallel2$(EXEEXT)
 	@p='tst_parallel2$(EXEEXT)'; \
 	b='tst_parallel2'; \
@@ -1390,6 +1482,34 @@ testnc3perf.log: testnc3perf$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_diskless.sh.log: run_diskless.sh
+	@p='run_diskless.sh'; \
+	b='run_diskless.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_diskless5.sh.log: run_diskless5.sh
+	@p='run_diskless5.sh'; \
+	b='run_diskless5.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_mmap.sh.log: run_mmap.sh
+	@p='run_mmap.sh'; \
+	b='run_mmap.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_diskless2.sh.log: run_diskless2.sh
+	@p='run_diskless2.sh'; \
+	b='run_diskless2.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 run_pnetcdf_test.sh.log: run_pnetcdf_test.sh
 	@p='run_pnetcdf_test.sh'; \
 	b='run_pnetcdf_test.sh'; \
@@ -1579,17 +1699,7 @@ uninstall-am:
 .PRECIOUS: Makefile
 
 
- at BUILD_UTILITIES_TRUE@	if BUILD_DISKLESS
- at BUILD_UTILITIES_TRUE@		TESTS += run_diskless.sh
- at BUILD_UTILITIES_TRUE@		if BUILD_MMAP
- at BUILD_UTILITIES_TRUE@			TESTS += run_mmap.sh
- at BUILD_UTILITIES_TRUE@		endif
- at BUILD_UTILITIES_TRUE@		if LARGE_FILE_TESTS
- at BUILD_UTILITIES_TRUE@			TESTS += run_diskless2.sh
- at BUILD_UTILITIES_TRUE@		endif
- at BUILD_UTILITIES_TRUE@	endif
-
-# Only clean these on mainatiner-clean, because they require m4 to
+# Only clean these on maintainer-clean, because they require m4 to
 # regenerate.
 #MAINTAINERCLEANFILES = test_get.c test_put.c
 
diff --git a/nc_test/error.c b/nc_test/error.c
index e9668de..2d502ca 100644
--- a/nc_test/error.c
+++ b/nc_test/error.c
@@ -59,7 +59,7 @@ ifFail(const int expr, const int line, const char *file)
  * "architecture" of this program.
  */
 void
-print_n_size_t(size_t nelems, const size_t *array)
+print_n_size_t(int nelems, const size_t *array)
 {
 	fprintf(stderr, "[");
 	while(nelems-- > 0)
diff --git a/nc_test/error.h b/nc_test/error.h
index 7ed8fdf..f8ccf3b 100644
--- a/nc_test/error.h
+++ b/nc_test/error.h
@@ -24,10 +24,11 @@ __attribute__ ((format (printf, 1, 2)))
 extern int ifFail(const int expr, const int line, const char *file);
 
 extern void
-print_n_size_t(size_t nelems, const size_t *array);
+print_n_size_t(int nelems, const size_t *array);
 
 #ifdef __cplusplus
 }
 #endif
 
 #define IF(EXPR) if (ifFail(EXPR, __LINE__, __FILE__))
+#define ELSE_NOK else {nok++;}
diff --git a/nc_test/nc_test.c b/nc_test/nc_test.c
index 5e779e3..f4c27e4 100644
--- a/nc_test/nc_test.c
+++ b/nc_test/nc_test.c
@@ -35,11 +35,11 @@ char dim_name[NDIMS][3];
 size_t dim_len[NDIMS];
 char var_name[NVARS][2+MAX_RANK];
 nc_type var_type[NVARS];
-size_t var_rank[NVARS];
+int var_rank[NVARS];
 int var_dimid[NVARS][MAX_RANK];
 size_t var_shape[NVARS][MAX_RANK];
 size_t var_nels[NVARS];
-size_t var_natts[NVARS];
+int var_natts[NVARS];
 char att_name[NVARS][MAX_NATTS][2];
 char gatt_name[NGATTS][3];
 nc_type att_type[NVARS][NGATTS];
@@ -156,7 +156,7 @@ main(int argc, char *argv[])
        /* Initialize global variables defining test file */
        init_gvars();
 
-	/* Write the test file, needed for the read-only tests below. */
+       /* Write the test file, needed for the read-only tests below. */
        write_file(testfile);
 
 	/* delete any existing scratch netCDF file */
@@ -355,6 +355,8 @@ main(int argc, char *argv[])
 	NC_TEST(nc_copy_att);
 	NC_TEST(nc_rename_att);
 	NC_TEST(nc_del_att);
+	NC_TEST(nc_against_pnetcdf);
+        /* keep below the last test, as it changes the default file format */
 	NC_TEST(nc_set_default_format);
     }
 
diff --git a/nc_test/run_diskless.sh b/nc_test/run_diskless.sh
index 73d7bd5..a14e150 100755
--- a/nc_test/run_diskless.sh
+++ b/nc_test/run_diskless.sh
@@ -1,12 +1,15 @@
 #!/bin/sh
 
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 set -e
 
 # Get the target OS and CPU
 CPU=`uname -p`
 OS=`uname`
 
-
 #Constants
 FILE1=tst_diskless.nc
 FILE2=tst_diskless2.nc
@@ -15,26 +18,26 @@ FILE3=tst_diskless3.nc
 echo ""
 echo "*** Testing in-memory (diskless) files with and without persistence"
 
-HASNC4=`../nc-config --has-nc4`
+HASNC4=`${top_builddir}/nc-config --has-nc4`
 
 echo "**** Test diskless netCDF classic file without persistence"
-./tst_diskless
+${execdir}/tst_diskless
 echo "PASS: diskless netCDF classic file without persistence"
 
 if test "x$HASNC4" = "xyes" ; then
 echo ""
 echo "**** Test diskless netCDF enhanced file without persistence"
-./tst_diskless netcdf4
+${execdir}/tst_diskless netcdf4
 echo "PASS: diskless netCDF enhanced file without persistence"
 fi #HASNC4
 
 echo ""
 echo "**** Test diskless netCDF classic file with persistence"
 rm -f $FILE1
-./tst_diskless persist
+${execdir}/tst_diskless persist
 if test -f $FILE1 ; then
 echo "**** $FILE1 created"
-# ../ncdump/ncdump $FILE1
+# ${NCDUMP} $FILE1
 echo "PASS: diskless netCDF classic file with persistence"
 else
 echo "#### $FILE1 not created"
@@ -45,10 +48,10 @@ if test "x$HASNC4" = "xyes" ; then
 echo ""
 echo "**** Test diskless netCDF enhanced file with persistence"
 rm -f $FILE1
-./tst_diskless netcdf4 persist
+${execdir}/tst_diskless netcdf4 persist
 if test -f $FILE1 ; then
 echo "**** $FILE1 created"
-# ../ncdump/ncdump $FILE1
+# ${NCDUMP} $FILE1
 echo "PASS: diskless netCDF enhanced file with persistence"
 else
 echo "$FILE1 not created"
@@ -64,13 +67,13 @@ ok=""
 echo ""
 echo "**** Test extended enhanced diskless netCDF with persistence"
 rm -f $FILE2 tst_diskless2.cdl
-./tst_diskless2
+${execdir}/tst_diskless2
 if test -f $FILE2 ; then
   echo "**** $FILE2 created"
   # Do a cyle test
-  if ../ncdump/ncdump $FILE2 |sed -e s/tst_diskless2/tmp1/ > tmp1.cdl ; then
-    if ../ncgen/ncgen -k nc4 -o tmp1.nc tmp1.cdl ;then
-      if ../ncdump/ncdump tmp1.nc >tmp2.cdl ; then
+  if ${NCDUMP} $FILE2 |sed -e s/tst_diskless2/tmp1/ > tmp1.cdl ; then
+    if ${NCGEN} -k nc4 -o tmp1.nc tmp1.cdl ;then
+      if ${NCDUMP} tmp1.nc >tmp2.cdl ; then
         if diff -wb tmp1.cdl tmp2.cdl ; then
           ok=yes
         fi
@@ -99,14 +102,14 @@ rm -f tst_diskless3_file.cdl tst_diskless3_memory.cdl
 echo ""
 echo "**** Create and modify file without using diskless"
 rm -f $FILE3
-./tst_diskless3
-../ncdump/ncdump $FILE3 >tst_diskless3_file.cdl
+${execdir}/tst_diskless3
+${NCDUMP} $FILE3 >tst_diskless3_file.cdl
 
 echo ""
 echo "**** Create and modify file using diskless"
 rm -f $FILE3
-./tst_diskless3 diskless
-../ncdump/ncdump $FILE3 >tst_diskless3_memory.cdl
+${execdir}/tst_diskless3 diskless
+${NCDUMP} $FILE3 >tst_diskless3_memory.cdl
 
 # compare
 diff tst_diskless3_file.cdl tst_diskless3_memory.cdl
diff --git a/nc_test/run_diskless2.sh b/nc_test/run_diskless2.sh
index 4bd2f82..65cec62 100755
--- a/nc_test/run_diskless2.sh
+++ b/nc_test/run_diskless2.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 set -e
 
 # Get the target OS and CPU
@@ -33,13 +36,13 @@ echo ""
 rm -f $FILE4
 time ./tst_diskless4 $SIZE create
 # Validate it
-../ncdump/ncdump -h $FILE4 |diff -w - tst_diskless4.cdl
+${NCDUMP} -h $FILE4 |diff -w - tst_diskless4.cdl
 
 echo ""
 rm -f $FILE4
 time ./tst_diskless4 $SIZE creatediskless
 # Validate it
-../ncdump/ncdump -h $FILE4 |diff -w - tst_diskless4.cdl
+${NCDUMP} -h $FILE4 |diff -w - tst_diskless4.cdl
 
 echo ""
 time ./tst_diskless4 $SIZE open
diff --git a/nc_test/run_diskless5.sh b/nc_test/run_diskless5.sh
new file mode 100755
index 0000000..858e540
--- /dev/null
+++ b/nc_test/run_diskless5.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+set -e
+
+#Constants
+CDL5=tst_diskless5.cdl
+FILE5=tst_diskless5.nc
+
+echo ""
+rm -f $FILE5
+# Generate FILE5
+${NCGEN} -3 -lb -o ${FILE5} ${srcdir}/${CDL5}
+
+echo ""
+${execdir}/tst_diskless5
+
+# cleanup
+rm -f $FILE5
+
+exit
diff --git a/nc_test/run_mmap.sh b/nc_test/run_mmap.sh
index 0716811..c9a6ff9 100755
--- a/nc_test/run_mmap.sh
+++ b/nc_test/run_mmap.sh
@@ -1,12 +1,15 @@
 #!/bin/sh
 
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 set -e
 
 # Get the target OS and CPU
 CPU=`uname -p`
 OS=`uname`
 
-
 #Constants
 FILE1=tst_diskless.nc
 FILE2=tst_diskless2.nc
@@ -15,19 +18,17 @@ FILE3=tst_diskless3.nc
 echo ""
 echo "*** Testing in-memory (diskless) files with mmap"
 
-HASNC4=`../nc-config --has-nc4`
-
 echo "**** Test diskless+mmap netCDF classic file without persistence"
-./tst_diskless mmap
+${execdir}/tst_diskless mmap
 echo "PASS: diskless+mmap netCDF classic file without persistence"
 
 echo ""
 echo "**** Test diskless+mmap netCDF classic file with persistence"
 rm -f $FILE1
-./tst_diskless mmap persist
+${execdir}/tst_diskless mmap persist
 if test -f $FILE1 ; then
 echo "**** $FILE1 created"
-# ../ncdump/ncdump $FILE1
+# ${NCDUMP} $FILE1
 echo "PASS: diskless+mmap netCDF classic file with persistence"
 else
 echo "#### $FILE1 not created"
@@ -45,14 +46,14 @@ rm -f tst_diskless3_file.cdl tst_diskless3_memory.cdl
 echo ""
 echo "**** Create and modify file without using diskless+mmap"
 rm -f $FILE3
-./tst_diskless3
-../ncdump/ncdump $FILE3 >tst_diskless3_file.cdl
+${execdir}/tst_diskless3
+${NCDUMP} $FILE3 >tst_diskless3_file.cdl
 
 echo ""
 echo "**** Create and modify file using diskless+mmap"
 rm -f $FILE3
-./tst_diskless3 diskless mmap
-../ncdump/ncdump $FILE3 >tst_diskless3_memory.cdl
+${execdir}/tst_diskless3 diskless mmap
+${NCDUMP} $FILE3 >tst_diskless3_memory.cdl
 
 # compare
 diff tst_diskless3_file.cdl tst_diskless3_memory.cdl
diff --git a/nc_test/run_pnetcdf_test.sh b/nc_test/run_pnetcdf_test.sh
index 096a30d..16d4c32 100755
--- a/nc_test/run_pnetcdf_test.sh
+++ b/nc_test/run_pnetcdf_test.sh
@@ -10,6 +10,5 @@ echo "Testing file created with pnetcdf is modifiable with netCDF..."
 echo "Testing file created with pnetcdf works when adding variables..."
 ./tst_addvar tst_pnetcdf.nc
 
-set -x
 # We assume a min of at least 2 processors is available
 mpiexec -n 2 ./tst_parallel2
diff --git a/nc_test/test_get.c b/nc_test/test_get.c
index 5cb14fa..f9629d4 100644
--- a/nc_test/test_get.c
+++ b/nc_test/test_get.c
@@ -1,9223 +1,12203 @@
 /* Do not edit this file. It is produced from the corresponding .m4 source */
-/*********************************************************************
- *   Copyright 1996, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Id: test_get.m4 2785 2014-10-26 05:21:20Z wkliao $
- *********************************************************************/
-
-#ifdef USE_PARALLEL
-#include <mpi.h>
-#endif
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_get.m4 2672 2016-12-03 19:23:53Z wkliao $ */
 
 
 #include "tests.h"
 
+#ifdef USE_PNETCDF
+#include <pnetcdf.h>
+#ifndef PNETCDF_VERSION_MAJOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
+#endif
+#ifndef PNETCDF_VERSION_MINOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
+#endif
+#endif
+
+
+
+
+
+
+
+
 
-void
+
+int
 test_nc_get_var1_text(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    text value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    text value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_text(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_text(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_text(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_text(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_text(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_text(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_TEXT );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_text(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_text(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_text(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_TEXT);
+            err = nc_get_var1_text(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_TEXT)) {
-		    if (expect >= text_min && expect <= text_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_TEXT)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_TEXT)) {
+                    if (1) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_TEXT)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
-test_nc_get_var1_uchar(void)
+int
+test_nc_get_var1_schar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uchar value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    schar value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_schar(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_schar(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_uchar(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_schar(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_uchar(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_uchar(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_UCHAR );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_uchar(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_uchar(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_schar(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_SCHAR);
+            err = nc_get_var1_schar(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_UCHAR)) {
-		    if (expect >= uchar_min && expect <= uchar_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_UCHAR)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_SCHAR)) {
+                    if ((expect >= schar_min && expect <= schar_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_SCHAR)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
-test_nc_get_var1_schar(void)
+int
+test_nc_get_var1_uchar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    schar value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    uchar value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_uchar(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_uchar(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_schar(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_uchar(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_schar(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_schar(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_SCHAR );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_schar(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_schar(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_uchar(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_UCHAR);
+            err = nc_get_var1_uchar(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_SCHAR)) {
-		    if (expect >= schar_min && expect <= schar_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_SCHAR)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_UCHAR)) {
+                    if ((expect >= uchar_min && expect <= uchar_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            /* in put_vars(), API _put_vara_double() is used to
+                             * write the NC_BYTE variables to files. In this
+                             * case, NC_BYTE variables are treated as signed
+                             * for CDF-1 and 2 formats. Thus, we must skip the
+                             * equal test below for uchar.
+                             */
+                            if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect > schar_max) continue;
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_UCHAR)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_short(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    short value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    short value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_short(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_short(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_short(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_short(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_short(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_short(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_SHORT );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_short(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_short(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_short(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_SHORT);
+            err = nc_get_var1_short(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_SHORT)) {
-		    if (expect >= short_min && expect <= short_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_SHORT)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_SHORT)) {
+                    if ((expect >= short_min && expect <= short_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_SHORT)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_int(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    int value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    int value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_int(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_int(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_int(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_int(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_int(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_int(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_INT );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_int(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_int(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_int(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_INT);
+            err = nc_get_var1_int(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_INT)) {
-		    if (expect >= int_min && expect <= int_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_INT)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_INT)) {
+                    if ((expect >= int_min && expect <= int_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_INT)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_long(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    long value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    long value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_long(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_long(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_long(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_long(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_long(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_long(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_LONG );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_long(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_long(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_long(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_LONG);
+            err = nc_get_var1_long(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_LONG)) {
-		    if (expect >= long_min && expect <= long_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_LONG)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_LONG)) {
+                    if ((expect >= long_min && expect <= long_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_LONG)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_float(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    float value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    float value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_float(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_float(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_float(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_float(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_float(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_float(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_FLOAT );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_float(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_float(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_float(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_FLOAT);
+            err = nc_get_var1_float(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_FLOAT)) {
-		    if (expect >= float_min && expect <= float_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_FLOAT)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_FLOAT)) {
+                    if ((expect >= float_min && expect <= float_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_FLOAT)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_double(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    double value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    double value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_double(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_double(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_double(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_double(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_double(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_double(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_DOUBLE );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_double(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_double(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_double(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_DOUBLE);
+            err = nc_get_var1_double(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_DOUBLE)) {
-		    if (expect >= double_min && expect <= double_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_DOUBLE)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_DOUBLE)) {
+                    if ((expect >= double_min && expect <= double_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_DOUBLE)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_ushort(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ushort value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    ushort value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_ushort(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_ushort(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_ushort(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_ushort(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_ushort(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_ushort(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_USHORT );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_ushort(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_ushort(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_ushort(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_USHORT);
+            err = nc_get_var1_ushort(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_USHORT)) {
-		    if (expect >= ushort_min && expect <= ushort_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_USHORT)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_USHORT)) {
+                    if ((expect >= ushort_min && expect <= ushort_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_USHORT)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_uint(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uint value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    uint value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_uint(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_uint(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_uint(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_uint(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_uint(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_uint(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_UINT );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_uint(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_uint(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_uint(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_UINT);
+            err = nc_get_var1_uint(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_UINT)) {
-		    if (expect >= uint_min && expect <= uint_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_UINT)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_UINT)) {
+                    if ((expect >= uint_min && expect <= uint_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_UINT)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_longlong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    longlong value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    longlong value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_longlong(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_longlong(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_longlong(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_longlong(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_longlong(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_longlong(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_LONGLONG );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_longlong(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_longlong(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_longlong(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_LONGLONG);
+            err = nc_get_var1_longlong(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_LONGLONG)) {
-		    if (expect >= longlong_min && expect <= longlong_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_LONGLONG)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_LONGLONG)) {
+                    if ((expect >= longlong_min && expect <= longlong_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_LONGLONG)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var1_ulonglong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ulonglong value;
+    size_t j, index[MAX_RANK];
+    double expect;
+    ulonglong value[1];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1_ulonglong(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1_ulonglong(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_ulonglong(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1_ulonglong(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_ulonglong(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_ulonglong(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_ULONGLONG );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_ulonglong(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_ulonglong(ncid, i, index, &value);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_get_var1_ulonglong(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_ULONGLONG);
+            err = nc_get_var1_ulonglong(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_ULONGLONG)) {
-		    if (expect >= ulonglong_min && expect <= ulonglong_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_ULONGLONG)) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_ULONGLONG)) {
+                    if ((expect >= ulonglong_min && expect <= ulonglong_max)) {
+                        IF (err != NC_NOERR) {
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        } else {
+                            
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_ULONGLONG)) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 
 
-void
+int
 test_nc_get_var_text(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    text value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    text value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_text(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_text(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_text(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_text(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_TEXT);
-	    if (inRange3(expect[j],var_type[i], NCT_TEXT)) {
-		allInIntRange = allInIntRange && expect[j] >= text_min
-			    && expect[j] <= text_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_text(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_TEXT)
-			&& expect[j] >= text_min && expect[j] <= text_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_TEXT)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_TEXT);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_TEXT)) {
+                if (var_type[i] != NC_CHAR)
+                    allInIntRange &= 1;
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_text(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (1) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_TEXT)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_uchar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uchar value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    uchar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_uchar(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_uchar(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_uchar(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_uchar(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_UCHAR);
-	    if (inRange3(expect[j],var_type[i], NCT_UCHAR)) {
-		allInIntRange = allInIntRange && expect[j] >= uchar_min
-			    && expect[j] <= uchar_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_uchar(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_UCHAR)
-			&& expect[j] >= uchar_min && expect[j] <= uchar_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_UCHAR)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_UCHAR);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_UCHAR)) {
+                
+                    allInIntRange &= (expect[j] >= uchar_min && expect[j] <= uchar_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_uchar(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_UCHAR) && (expect[j] >= uchar_min && expect[j] <= uchar_max)) {
+                    
+                    /* in put_vars(), API _put_vara_double() is used to
+                     * write the NC_BYTE variables to files. In this
+                     * case, NC_BYTE variables are treated as signed
+                     * for CDF-1 and 2 formats. Thus, we must skip the
+                     * equal test below for uchar.
+                     */
+                    if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_UCHAR)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_schar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    schar value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    schar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_schar(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_schar(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_schar(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_schar(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SCHAR);
-	    if (inRange3(expect[j],var_type[i], NCT_SCHAR)) {
-		allInIntRange = allInIntRange && expect[j] >= schar_min
-			    && expect[j] <= schar_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_schar(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_SCHAR)
-			&& expect[j] >= schar_min && expect[j] <= schar_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_SCHAR)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_SCHAR);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_SCHAR)) {
+                
+                    allInIntRange &= (expect[j] >= schar_min && expect[j] <= schar_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_schar(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_SCHAR) && (expect[j] >= schar_min && expect[j] <= schar_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_SCHAR)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_short(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    short value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    short value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_short(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_short(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_short(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_short(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SHORT);
-	    if (inRange3(expect[j],var_type[i], NCT_SHORT)) {
-		allInIntRange = allInIntRange && expect[j] >= short_min
-			    && expect[j] <= short_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_short(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_SHORT)
-			&& expect[j] >= short_min && expect[j] <= short_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_SHORT)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_SHORT);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_SHORT)) {
+                
+                    allInIntRange &= (expect[j] >= short_min && expect[j] <= short_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_short(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_SHORT) && (expect[j] >= short_min && expect[j] <= short_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_SHORT)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_int(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    int value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    int value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_int(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_int(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_int(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_int(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_INT);
-	    if (inRange3(expect[j],var_type[i], NCT_INT)) {
-		allInIntRange = allInIntRange && expect[j] >= int_min
-			    && expect[j] <= int_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_int(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_INT)
-			&& expect[j] >= int_min && expect[j] <= int_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_INT)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_INT);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_INT)) {
+                
+                    allInIntRange &= (expect[j] >= int_min && expect[j] <= int_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_int(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_INT) && (expect[j] >= int_min && expect[j] <= int_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_INT)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_long(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    long value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    long value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_long(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_long(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_long(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_long(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_LONG);
-	    if (inRange3(expect[j],var_type[i], NCT_LONG)) {
-		allInIntRange = allInIntRange && expect[j] >= long_min
-			    && expect[j] <= long_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_long(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_LONG)
-			&& expect[j] >= long_min && expect[j] <= long_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_LONG)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_LONG);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_LONG)) {
+                
+                    allInIntRange &= (expect[j] >= long_min && expect[j] <= long_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_long(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONG) && (expect[j] >= long_min && expect[j] <= long_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_LONG)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_float(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    float value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    float value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_float(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_float(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_float(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_float(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_FLOAT);
-	    if (inRange3(expect[j],var_type[i], NCT_FLOAT)) {
-		allInIntRange = allInIntRange && expect[j] >= float_min
-			    && expect[j] <= float_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_float(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_FLOAT)
-			&& expect[j] >= float_min && expect[j] <= float_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_FLOAT)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_FLOAT);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_FLOAT)) {
+                
+                    allInIntRange &= (expect[j] >= float_min && expect[j] <= float_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_float(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_FLOAT) && (expect[j] >= float_min && expect[j] <= float_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_FLOAT)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_double(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    double value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    double value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_double(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_double(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_double(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_double(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_DOUBLE);
-	    if (inRange3(expect[j],var_type[i], NCT_DOUBLE)) {
-		allInIntRange = allInIntRange && expect[j] >= double_min
-			    && expect[j] <= double_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_double(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
-			&& expect[j] >= double_min && expect[j] <= double_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_DOUBLE)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_DOUBLE);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_DOUBLE)) {
+                
+                    allInIntRange &= (expect[j] >= double_min && expect[j] <= double_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_double(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_DOUBLE) && (expect[j] >= double_min && expect[j] <= double_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_DOUBLE)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_ushort(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ushort value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    ushort value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_ushort(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_ushort(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_ushort(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_ushort(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_USHORT);
-	    if (inRange3(expect[j],var_type[i], NCT_USHORT)) {
-		allInIntRange = allInIntRange && expect[j] >= ushort_min
-			    && expect[j] <= ushort_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_ushort(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_USHORT)
-			&& expect[j] >= ushort_min && expect[j] <= ushort_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_USHORT)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_USHORT);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_USHORT)) {
+                
+                    allInIntRange &= (expect[j] >= ushort_min && expect[j] <= ushort_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_ushort(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_USHORT) && (expect[j] >= ushort_min && expect[j] <= ushort_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_USHORT)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_uint(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uint value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    uint value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_uint(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_uint(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_uint(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_uint(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_UINT);
-	    if (inRange3(expect[j],var_type[i], NCT_UINT)) {
-		allInIntRange = allInIntRange && expect[j] >= uint_min
-			    && expect[j] <= uint_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_uint(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_UINT)
-			&& expect[j] >= uint_min && expect[j] <= uint_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_UINT)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_UINT);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_UINT)) {
+                
+                    allInIntRange &= (expect[j] >= uint_min && expect[j] <= uint_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_uint(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_UINT) && (expect[j] >= uint_min && expect[j] <= uint_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_UINT)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_longlong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    longlong value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    longlong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_longlong(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_longlong(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_longlong(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_longlong(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_LONGLONG);
-	    if (inRange3(expect[j],var_type[i], NCT_LONGLONG)) {
-		allInIntRange = allInIntRange && expect[j] >= longlong_min
-			    && expect[j] <= longlong_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_longlong(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_LONGLONG)
-			&& expect[j] >= longlong_min && expect[j] <= longlong_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_LONGLONG)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_LONGLONG);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_LONGLONG)) {
+                
+                    allInIntRange &= (expect[j] >= longlong_min && expect[j] <= longlong_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_longlong(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONGLONG) && (expect[j] >= longlong_min && expect[j] <= longlong_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_LONGLONG)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_var_ulonglong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ulonglong value[MAX_NELS];
+    size_t j, index[MAX_RANK];
     double expect[MAX_NELS];
+    ulonglong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var_ulonglong(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var_ulonglong(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
         err = nc_get_var_ulonglong(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_ulonglong(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_ULONGLONG);
-	    if (inRange3(expect[j],var_type[i], NCT_ULONGLONG)) {
-		allInIntRange = allInIntRange && expect[j] >= ulonglong_min
-			    && expect[j] <= ulonglong_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_ulonglong(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_ULONGLONG)
-			&& expect[j] >= ulonglong_min && expect[j] <= ulonglong_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_ULONGLONG)){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_ULONGLONG);
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_ULONGLONG)) {
+                
+                    allInIntRange &= (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max);
+            } else
+                allInExtRange = 0;
+        }
+        err = nc_get_var_ulonglong(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_ULONGLONG) && (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max)) {
+                    
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_ULONGLONG)){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 
 
-void
+int
 test_nc_get_vara_text(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    text value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    text value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_text(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_text(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_text(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_text(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_text(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_text(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_text(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_text(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_text(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_text(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_text(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_text(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_text(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_text(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_text(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_TEXT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_TEXT) &&
+                1) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_TEXT);
-		if (inRange3(expect[j],var_type[i], NCT_TEXT)) {
-		    allInIntRange = allInIntRange && expect[j] >= text_min
-				&& expect[j] <= text_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_text(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_text(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_TEXT);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_TEXT)) {
+		    if (var_type[i] != NC_CHAR)
+                        allInIntRange &= 1;
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_text(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_TEXT)
-			    && expect[j] >= text_min && expect[j] <= text_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_TEXT)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (1) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_TEXT)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_uchar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uchar value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    uchar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_uchar(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_uchar(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_uchar(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_uchar(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_uchar(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_uchar(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_uchar(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_uchar(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_uchar(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_uchar(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_uchar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_uchar(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_uchar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_uchar(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_uchar(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_UCHAR);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_UCHAR) &&
+                (expect[0] >= uchar_min && expect[0] <= uchar_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+#endif
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_UCHAR);
-		if (inRange3(expect[j],var_type[i], NCT_UCHAR)) {
-		    allInIntRange = allInIntRange && expect[j] >= uchar_min
-				&& expect[j] <= uchar_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_uchar(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_uchar(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_UCHAR);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_UCHAR)) {
+		    
+                        allInIntRange &= (expect[j] >= uchar_min && expect[j] <= uchar_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_uchar(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_UCHAR)
-			    && expect[j] >= uchar_min && expect[j] <= uchar_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_UCHAR)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_UCHAR) && (expect[j] >= uchar_min && expect[j] <= uchar_max)) {
+                        
+                        /* in put_vars(), API _put_vara_double() is used to
+                         * write the NC_BYTE variables to files. In this
+                         * case, NC_BYTE variables are treated as signed
+                         * for CDF-1 and 2 formats. Thus, we must skip the
+                         * equal test below for uchar.
+                         */
+                        if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_UCHAR)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_schar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    schar value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    schar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_schar(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_schar(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_schar(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_schar(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_schar(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_schar(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_schar(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_schar(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_schar(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_schar(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_schar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_schar(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_schar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_schar(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_schar(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_SCHAR);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_SCHAR) &&
+                (expect[0] >= schar_min && expect[0] <= schar_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SCHAR);
-		if (inRange3(expect[j],var_type[i], NCT_SCHAR)) {
-		    allInIntRange = allInIntRange && expect[j] >= schar_min
-				&& expect[j] <= schar_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_schar(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_schar(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_SCHAR);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_SCHAR)) {
+		    
+                        allInIntRange &= (expect[j] >= schar_min && expect[j] <= schar_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_schar(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_SCHAR)
-			    && expect[j] >= schar_min && expect[j] <= schar_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_SCHAR)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_SCHAR) && (expect[j] >= schar_min && expect[j] <= schar_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_SCHAR)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_short(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    short value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    short value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_short(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_short(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_short(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_short(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_short(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_short(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_short(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_short(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_short(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_short(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_short(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_short(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_short(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_short(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_short(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_SHORT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_SHORT) &&
+                (expect[0] >= short_min && expect[0] <= short_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SHORT);
-		if (inRange3(expect[j],var_type[i], NCT_SHORT)) {
-		    allInIntRange = allInIntRange && expect[j] >= short_min
-				&& expect[j] <= short_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_short(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_short(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_SHORT);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_SHORT)) {
+		    
+                        allInIntRange &= (expect[j] >= short_min && expect[j] <= short_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_short(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_SHORT)
-			    && expect[j] >= short_min && expect[j] <= short_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_SHORT)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_SHORT) && (expect[j] >= short_min && expect[j] <= short_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_SHORT)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_int(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    int value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    int value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_int(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_int(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_int(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_int(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_int(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_int(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_int(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_int(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_int(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_int(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_int(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_int(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_int(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_int(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_int(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_INT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_INT) &&
+                (expect[0] >= int_min && expect[0] <= int_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_INT);
-		if (inRange3(expect[j],var_type[i], NCT_INT)) {
-		    allInIntRange = allInIntRange && expect[j] >= int_min
-				&& expect[j] <= int_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_int(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_int(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_INT);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_INT)) {
+		    
+                        allInIntRange &= (expect[j] >= int_min && expect[j] <= int_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_int(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_INT)
-			    && expect[j] >= int_min && expect[j] <= int_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_INT)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_INT) && (expect[j] >= int_min && expect[j] <= int_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_INT)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_long(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    long value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    long value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_long(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_long(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_long(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_long(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_long(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_long(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_long(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_long(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_long(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_long(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_long(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_long(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_long(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_long(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_long(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_LONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_LONG) &&
+                (expect[0] >= long_min && expect[0] <= long_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_LONG);
-		if (inRange3(expect[j],var_type[i], NCT_LONG)) {
-		    allInIntRange = allInIntRange && expect[j] >= long_min
-				&& expect[j] <= long_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_long(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_long(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_LONG);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONG)) {
+		    
+                        allInIntRange &= (expect[j] >= long_min && expect[j] <= long_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_long(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_LONG)
-			    && expect[j] >= long_min && expect[j] <= long_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_LONG)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONG) && (expect[j] >= long_min && expect[j] <= long_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_LONG)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_float(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    float value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    float value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_float(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_float(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_float(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_float(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_float(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_float(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_float(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_float(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_float(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_float(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_float(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_float(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_float(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_float(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_float(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_FLOAT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_FLOAT) &&
+                (expect[0] >= float_min && expect[0] <= float_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_FLOAT);
-		if (inRange3(expect[j],var_type[i], NCT_FLOAT)) {
-		    allInIntRange = allInIntRange && expect[j] >= float_min
-				&& expect[j] <= float_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_float(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_float(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_FLOAT);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_FLOAT)) {
+		    
+                        allInIntRange &= (expect[j] >= float_min && expect[j] <= float_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_float(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_FLOAT)
-			    && expect[j] >= float_min && expect[j] <= float_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_FLOAT)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_FLOAT) && (expect[j] >= float_min && expect[j] <= float_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_FLOAT)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_double(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    double value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    double value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_double(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_double(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_double(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_double(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_double(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_double(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_double(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_double(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_double(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_double(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_double(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_double(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_double(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_double(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_double(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_DOUBLE);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_DOUBLE) &&
+                (expect[0] >= double_min && expect[0] <= double_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                nels *= edge[j];
-            }
-	    allInExtRange = allInIntRange = 1;
-            for (j = 0; j < nels; j++) {
-                err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
-                for (d = 0; d < var_rank[i]; d++)
-                    index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_DOUBLE);
-		if (inRange3(expect[j],var_type[i], NCT_DOUBLE)) {
-		    allInIntRange = allInIntRange && expect[j] >= double_min
-				&& expect[j] <= double_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_double(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_double(ncid, i, start, edge, value);
-            if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
-			    && expect[j] >= double_min && expect[j] <= double_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_DOUBLE)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                nels *= edge[j];
+            }
+            allInExtRange = allInIntRange = 1;
+            for (j = 0; j < nels; j++) {
+                int d;
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_DOUBLE);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_DOUBLE)) {
+		    
+                        allInIntRange &= (expect[j] >= double_min && expect[j] <= double_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_double(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_DOUBLE) && (expect[j] >= double_min && expect[j] <= double_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_DOUBLE)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_ushort(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ushort value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    ushort value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_ushort(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_ushort(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_ushort(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_ushort(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_ushort(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_ushort(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_ushort(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_ushort(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_ushort(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_ushort(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_ushort(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_ushort(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_ushort(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_ushort(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_ushort(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_USHORT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_USHORT) &&
+                (expect[0] >= ushort_min && expect[0] <= ushort_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_USHORT);
-		if (inRange3(expect[j],var_type[i], NCT_USHORT)) {
-		    allInIntRange = allInIntRange && expect[j] >= ushort_min
-				&& expect[j] <= ushort_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_ushort(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_ushort(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_USHORT);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_USHORT)) {
+		    
+                        allInIntRange &= (expect[j] >= ushort_min && expect[j] <= ushort_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_ushort(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_USHORT)
-			    && expect[j] >= ushort_min && expect[j] <= ushort_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_USHORT)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_USHORT) && (expect[j] >= ushort_min && expect[j] <= ushort_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_USHORT)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_uint(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uint value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    uint value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_uint(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_uint(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_uint(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_uint(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_uint(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_uint(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_uint(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_uint(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_uint(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_uint(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_uint(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_uint(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_uint(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_uint(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_uint(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_UINT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_UINT) &&
+                (expect[0] >= uint_min && expect[0] <= uint_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_UINT);
-		if (inRange3(expect[j],var_type[i], NCT_UINT)) {
-		    allInIntRange = allInIntRange && expect[j] >= uint_min
-				&& expect[j] <= uint_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_uint(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_uint(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_UINT);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_UINT)) {
+		    
+                        allInIntRange &= (expect[j] >= uint_min && expect[j] <= uint_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_uint(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_UINT)
-			    && expect[j] >= uint_min && expect[j] <= uint_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_UINT)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_UINT) && (expect[j] >= uint_min && expect[j] <= uint_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_UINT)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_longlong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    longlong value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    longlong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_longlong(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_longlong(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_longlong(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_longlong(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_longlong(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_longlong(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_longlong(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_longlong(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_longlong(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_longlong(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_longlong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_longlong(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_longlong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_longlong(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_longlong(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_LONGLONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_LONGLONG) &&
+                (expect[0] >= longlong_min && expect[0] <= longlong_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_LONGLONG);
-		if (inRange3(expect[j],var_type[i], NCT_LONGLONG)) {
-		    allInIntRange = allInIntRange && expect[j] >= longlong_min
-				&& expect[j] <= longlong_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_longlong(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_longlong(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_LONGLONG);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONGLONG)) {
+		    
+                        allInIntRange &= (expect[j] >= longlong_min && expect[j] <= longlong_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_longlong(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_LONGLONG)
-			    && expect[j] >= longlong_min && expect[j] <= longlong_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_LONGLONG)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONGLONG) && (expect[j] >= longlong_min && expect[j] <= longlong_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_LONGLONG)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vara_ulonglong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ulonglong value[MAX_NELS];
+    size_t j;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    ulonglong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vara_ulonglong(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vara_ulonglong(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_ulonglong(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara_ulonglong(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_ulonglong(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_ulonglong(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_ulonglong(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+        }
+
+        err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ULONGLONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ULONGLONG) &&
+                (expect[0] >= ulonglong_min && expect[0] <= ulonglong_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            size_t nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                nels *= edge[j];
-            }
-	    allInExtRange = allInIntRange = 1;
-            for (j = 0; j < nels; j++) {
-                err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
-                for (d = 0; d < var_rank[i]; d++)
-                    index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_ULONGLONG);
-		if (inRange3(expect[j],var_type[i], NCT_ULONGLONG)) {
-		    allInIntRange = allInIntRange && expect[j] >= ulonglong_min
-				&& expect[j] <= ulonglong_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_ulonglong(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
-            if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_ULONGLONG)
-			    && expect[j] >= ulonglong_min && expect[j] <= ulonglong_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_ULONGLONG)){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                nels *= edge[j];
+            }
+            allInExtRange = allInIntRange = 1;
+            for (j = 0; j < nels; j++) {
+                int d;
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_ULONGLONG);
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_ULONGLONG)) {
+		    
+                        allInIntRange &= (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max);
+                } else
+                    allInExtRange = 0;
+            }
+            err = nc_get_vara_ulonglong(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (j = 0; j < nels; j++) {
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_ULONGLONG) && (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max)) {
+                        
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_ULONGLONG)){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 
 
-void
+int
 test_nc_get_vars_text(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    text value[MAX_NELS];
     double expect[MAX_NELS];
+    text value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_text(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_text(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_text(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_text(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_text(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_text(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_text(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_text(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_text(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_text(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_text(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_text(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_TEXT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_TEXT) &&
+                1) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_TEXT);
-		    if (inRange3(expect[j],var_type[i],NCT_TEXT)) {
-			allInIntRange = allInIntRange && expect[j] >= text_min
-			    && expect[j] <= text_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_text(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_text(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_TEXT)
-				&& expect[j] >= text_min && expect[j] <= text_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_TEXT)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_TEXT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_TEXT)) {
+		        if (var_type[i] != NC_CHAR)
+                            allInIntRange &= 1;
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_text(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (1) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_TEXT)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_uchar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    uchar value[MAX_NELS];
     double expect[MAX_NELS];
+    uchar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_uchar(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_uchar(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_uchar(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_uchar(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_uchar(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+#endif
+        }
+
+        err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_UCHAR);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_UCHAR) &&
+                (expect[0] >= uchar_min && expect[0] <= uchar_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+#endif
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_UCHAR);
-		    if (inRange3(expect[j],var_type[i],NCT_UCHAR)) {
-			allInIntRange = allInIntRange && expect[j] >= uchar_min
-			    && expect[j] <= uchar_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_uchar(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_uchar(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_UCHAR)
-				&& expect[j] >= uchar_min && expect[j] <= uchar_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_UCHAR)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_UCHAR);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_UCHAR)) {
+		        
+                            allInIntRange &= (expect[j] >= uchar_min && expect[j] <= uchar_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_uchar(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_UCHAR) && (expect[j] >= uchar_min && expect[j] <= uchar_max)) {
+                            
+                            /* in put_vars(), API _put_vara_double() is used to
+                             * write the NC_BYTE variables to files. In this
+                             * case, NC_BYTE variables are treated as signed
+                             * for CDF-1 and 2 formats. Thus, we must skip the
+                             * equal test below for uchar.
+                             */
+                            if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_UCHAR)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_schar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    schar value[MAX_NELS];
     double expect[MAX_NELS];
+    schar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_schar(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_schar(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_schar(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_schar(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_schar(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+
+        err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_SCHAR);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_SCHAR) &&
+                (expect[0] >= schar_min && expect[0] <= schar_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_SCHAR);
-		    if (inRange3(expect[j],var_type[i],NCT_SCHAR)) {
-			allInIntRange = allInIntRange && expect[j] >= schar_min
-			    && expect[j] <= schar_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_schar(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_schar(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_SCHAR)
-				&& expect[j] >= schar_min && expect[j] <= schar_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_SCHAR)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_SCHAR);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_SCHAR)) {
+		        
+                            allInIntRange &= (expect[j] >= schar_min && expect[j] <= schar_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_schar(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_SCHAR) && (expect[j] >= schar_min && expect[j] <= schar_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_SCHAR)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_short(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    short value[MAX_NELS];
     double expect[MAX_NELS];
+    short value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_short(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_short(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_short(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_short(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_short(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_short(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_short(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_short(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_short(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_short(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_short(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_short(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_SHORT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_SHORT) &&
+                (expect[0] >= short_min && expect[0] <= short_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_SHORT);
-		    if (inRange3(expect[j],var_type[i],NCT_SHORT)) {
-			allInIntRange = allInIntRange && expect[j] >= short_min
-			    && expect[j] <= short_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_short(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_short(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_SHORT)
-				&& expect[j] >= short_min && expect[j] <= short_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_SHORT)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_SHORT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_SHORT)) {
+		        
+                            allInIntRange &= (expect[j] >= short_min && expect[j] <= short_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_short(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_SHORT) && (expect[j] >= short_min && expect[j] <= short_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_SHORT)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_int(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    int value[MAX_NELS];
     double expect[MAX_NELS];
+    int value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_int(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_int(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_int(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_int(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_int(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_int(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_int(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_int(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_int(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_int(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_int(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_int(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_INT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_INT) &&
+                (expect[0] >= int_min && expect[0] <= int_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_INT);
-		    if (inRange3(expect[j],var_type[i],NCT_INT)) {
-			allInIntRange = allInIntRange && expect[j] >= int_min
-			    && expect[j] <= int_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_int(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_int(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_INT)
-				&& expect[j] >= int_min && expect[j] <= int_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_INT)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_INT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_INT)) {
+		        
+                            allInIntRange &= (expect[j] >= int_min && expect[j] <= int_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_int(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_INT) && (expect[j] >= int_min && expect[j] <= int_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_INT)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_long(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    long value[MAX_NELS];
     double expect[MAX_NELS];
+    long value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_long(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_long(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_long(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_long(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_long(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_long(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_long(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_long(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_long(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_long(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_long(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_long(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_LONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_LONG) &&
+                (expect[0] >= long_min && expect[0] <= long_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_LONG);
-		    if (inRange3(expect[j],var_type[i],NCT_LONG)) {
-			allInIntRange = allInIntRange && expect[j] >= long_min
-			    && expect[j] <= long_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_long(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_long(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_LONG)
-				&& expect[j] >= long_min && expect[j] <= long_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_LONG)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_LONG);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONG)) {
+		        
+                            allInIntRange &= (expect[j] >= long_min && expect[j] <= long_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_long(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONG) && (expect[j] >= long_min && expect[j] <= long_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_LONG)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_float(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    float value[MAX_NELS];
     double expect[MAX_NELS];
+    float value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_float(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_float(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_float(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_float(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_float(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_float(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_float(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_float(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_float(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_float(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_float(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_float(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_FLOAT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_FLOAT) &&
+                (expect[0] >= float_min && expect[0] <= float_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
-*/
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_FLOAT);
-		    if (inRange3(expect[j],var_type[i],NCT_FLOAT)) {
-			allInIntRange = allInIntRange && expect[j] >= float_min
-			    && expect[j] <= float_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_float(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_float(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_FLOAT)
-				&& expect[j] >= float_min && expect[j] <= float_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_FLOAT)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
-                                    error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+*/
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_FLOAT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_FLOAT)) {
+		        
+                            allInIntRange &= (expect[j] >= float_min && expect[j] <= float_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_float(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_FLOAT) && (expect[j] >= float_min && expect[j] <= float_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_FLOAT)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
+                                    error("expect: %g, ", expect[j]);
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_double(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    double value[MAX_NELS];
     double expect[MAX_NELS];
+    double value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_double(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_double(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_double(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_double(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_double(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_double(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_double(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_double(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_double(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_double(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_double(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_double(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_DOUBLE);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_DOUBLE) &&
+                (expect[0] >= double_min && expect[0] <= double_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_DOUBLE);
-		    if (inRange3(expect[j],var_type[i],NCT_DOUBLE)) {
-			allInIntRange = allInIntRange && expect[j] >= double_min
-			    && expect[j] <= double_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_double(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_double(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
-				&& expect[j] >= double_min && expect[j] <= double_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_DOUBLE)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_DOUBLE);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_DOUBLE)) {
+		        
+                            allInIntRange &= (expect[j] >= double_min && expect[j] <= double_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_double(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_DOUBLE) && (expect[j] >= double_min && expect[j] <= double_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_DOUBLE)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_ushort(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    ushort value[MAX_NELS];
     double expect[MAX_NELS];
+    ushort value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_ushort(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_ushort(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_ushort(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_ushort(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_ushort(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_ushort(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_ushort(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_ushort(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_ushort(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_ushort(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_ushort(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_ushort(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_USHORT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_USHORT) &&
+                (expect[0] >= ushort_min && expect[0] <= ushort_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_USHORT);
-		    if (inRange3(expect[j],var_type[i],NCT_USHORT)) {
-			allInIntRange = allInIntRange && expect[j] >= ushort_min
-			    && expect[j] <= ushort_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_ushort(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_ushort(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_USHORT)
-				&& expect[j] >= ushort_min && expect[j] <= ushort_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_USHORT)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_USHORT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_USHORT)) {
+		        
+                            allInIntRange &= (expect[j] >= ushort_min && expect[j] <= ushort_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_ushort(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_USHORT) && (expect[j] >= ushort_min && expect[j] <= ushort_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_USHORT)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_uint(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    uint value[MAX_NELS];
     double expect[MAX_NELS];
+    uint value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_uint(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_uint(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_uint(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_uint(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_uint(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_uint(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_uint(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_uint(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_uint(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_uint(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_uint(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_uint(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_UINT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_UINT) &&
+                (expect[0] >= uint_min && expect[0] <= uint_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_UINT);
-		    if (inRange3(expect[j],var_type[i],NCT_UINT)) {
-			allInIntRange = allInIntRange && expect[j] >= uint_min
-			    && expect[j] <= uint_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_uint(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_uint(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_UINT)
-				&& expect[j] >= uint_min && expect[j] <= uint_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_UINT)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_UINT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_UINT)) {
+		        
+                            allInIntRange &= (expect[j] >= uint_min && expect[j] <= uint_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_uint(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_UINT) && (expect[j] >= uint_min && expect[j] <= uint_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_UINT)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_longlong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    longlong value[MAX_NELS];
     double expect[MAX_NELS];
+    longlong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_longlong(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_longlong(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_longlong(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_longlong(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_longlong(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_longlong(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_longlong(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_longlong(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_longlong(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_longlong(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_longlong(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_longlong(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_LONGLONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_LONGLONG) &&
+                (expect[0] >= longlong_min && expect[0] <= longlong_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_LONGLONG);
-		    if (inRange3(expect[j],var_type[i],NCT_LONGLONG)) {
-			allInIntRange = allInIntRange && expect[j] >= longlong_min
-			    && expect[j] <= longlong_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_longlong(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_longlong(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_LONGLONG)
-				&& expect[j] >= longlong_min && expect[j] <= longlong_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_LONGLONG)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_LONGLONG);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONGLONG)) {
+		        
+                            allInIntRange &= (expect[j] >= longlong_min && expect[j] <= longlong_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_longlong(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONGLONG) && (expect[j] >= longlong_min && expect[j] <= longlong_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_LONGLONG)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_vars_ulonglong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
+    int canConvert;     /* Both text or both numeric */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;     /* Both text or both numeric */
-    ulonglong value[MAX_NELS];
     double expect[MAX_NELS];
+    ulonglong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_vars_ulonglong(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_vars_ulonglong(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_ulonglong(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_ulonglong(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_ulonglong(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_vars_ulonglong(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_vars_ulonglong(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_vars_ulonglong(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars_ulonglong(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_vars_ulonglong(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_vars_ulonglong(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-	  }
+#endif
+        }
+
+        err = nc_get_vars_ulonglong(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ULONGLONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ULONGLONG) &&
+                (expect[0] >= ulonglong_min && expect[0] <= ulonglong_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_ULONGLONG);
-		    if (inRange3(expect[j],var_type[i],NCT_ULONGLONG)) {
-			allInIntRange = allInIntRange && expect[j] >= ulonglong_min
-			    && expect[j] <= ulonglong_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_ulonglong(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_ulonglong(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_ULONGLONG)
-				&& expect[j] >= ulonglong_min && expect[j] <= ulonglong_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_ULONGLONG)){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_ULONGLONG);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_ULONGLONG)) {
+		        
+                            allInIntRange &= (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = nc_get_vars_ulonglong(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_ULONGLONG) && (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_ULONGLONG)){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 
 
-void
+int
 test_nc_get_varm_text(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    text value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    text value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_text(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_text(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_text(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_text(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_text(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_TEXT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_TEXT) &&
+                1) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_TEXT);
-                    if (inRange3(expect[j],var_type[i],NCT_TEXT)) {
-                        allInIntRange = allInIntRange && expect[j] >= text_min
-                            && expect[j] <= text_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_TEXT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_TEXT)) {
+		        if (var_type[i] != NC_CHAR)
+                            allInIntRange &= 1;
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_text(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_text(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_text(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_TEXT)
-                                && expect[j] >= text_min 
-				&& expect[j] <= text_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_TEXT)){
+                        if (1) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_TEXT)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_uchar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uchar value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    uchar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_uchar(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_uchar(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_uchar(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_uchar(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_uchar(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_UCHAR);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_UCHAR) &&
+                (expect[0] >= uchar_min && expect[0] <= uchar_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+#endif
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_UCHAR);
-                    if (inRange3(expect[j],var_type[i],NCT_UCHAR)) {
-                        allInIntRange = allInIntRange && expect[j] >= uchar_min
-                            && expect[j] <= uchar_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_UCHAR);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_UCHAR)) {
+		        
+                            allInIntRange &= (expect[j] >= uchar_min && expect[j] <= uchar_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_uchar(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_uchar(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_uchar(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_UCHAR)
-                                && expect[j] >= uchar_min 
-				&& expect[j] <= uchar_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_UCHAR)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_UCHAR) && (expect[j] >= uchar_min && expect[j] <= uchar_max)) {
+                            
+                            /* in put_vars(), API _put_vara_double() is used to
+                             * write the NC_BYTE variables to files. In this
+                             * case, NC_BYTE variables are treated as signed
+                             * for CDF-1 and 2 formats. Thus, we must skip the
+                             * equal test below for uchar.
+                             */
+                            if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_UCHAR)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_schar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    schar value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    schar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_schar(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_schar(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_schar(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
+            stride[j] = 0;
+            err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-            imap[j] = 1;
         }
-        err = nc_get_varm_schar(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_schar(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
         for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
             start[j] = var_shape[i][j];
             err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-            start[j] = 0;
-            edge[j] = var_shape[i][j] + 1;
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
             err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
-            IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
-            edge[j] = 1;
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
             stride[j] = 0;
             err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_SCHAR);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_SCHAR) &&
+                (expect[0] >= schar_min && expect[0] <= schar_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_SCHAR);
-                    if (inRange3(expect[j],var_type[i],NCT_SCHAR)) {
-                        allInIntRange = allInIntRange && expect[j] >= schar_min
-                            && expect[j] <= schar_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_SCHAR);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_SCHAR)) {
+		        
+                            allInIntRange &= (expect[j] >= schar_min && expect[j] <= schar_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_schar(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_schar(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_schar(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_SCHAR)
-                                && expect[j] >= schar_min 
-				&& expect[j] <= schar_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_SCHAR)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_SCHAR) && (expect[j] >= schar_min && expect[j] <= schar_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_SCHAR)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_short(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    short value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    short value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_short(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_short(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_short(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_short(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_short(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_SHORT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_SHORT) &&
+                (expect[0] >= short_min && expect[0] <= short_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_SHORT);
-                    if (inRange3(expect[j],var_type[i],NCT_SHORT)) {
-                        allInIntRange = allInIntRange && expect[j] >= short_min
-                            && expect[j] <= short_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_SHORT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_SHORT)) {
+		        
+                            allInIntRange &= (expect[j] >= short_min && expect[j] <= short_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_short(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_short(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_short(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_SHORT)
-                                && expect[j] >= short_min 
-				&& expect[j] <= short_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_SHORT)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_SHORT) && (expect[j] >= short_min && expect[j] <= short_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_SHORT)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_int(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    int value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    int value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_int(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_int(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_int(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_int(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_int(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_INT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_INT) &&
+                (expect[0] >= int_min && expect[0] <= int_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_INT);
-                    if (inRange3(expect[j],var_type[i],NCT_INT)) {
-                        allInIntRange = allInIntRange && expect[j] >= int_min
-                            && expect[j] <= int_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_INT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_INT)) {
+		        
+                            allInIntRange &= (expect[j] >= int_min && expect[j] <= int_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_int(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_int(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_int(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_INT)
-                                && expect[j] >= int_min 
-				&& expect[j] <= int_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_INT)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_INT) && (expect[j] >= int_min && expect[j] <= int_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_INT)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_long(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    long value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    long value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_long(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_long(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_long(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_long(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_long(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_LONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_LONG) &&
+                (expect[0] >= long_min && expect[0] <= long_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_LONG);
-                    if (inRange3(expect[j],var_type[i],NCT_LONG)) {
-                        allInIntRange = allInIntRange && expect[j] >= long_min
-                            && expect[j] <= long_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_LONG);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONG)) {
+		        
+                            allInIntRange &= (expect[j] >= long_min && expect[j] <= long_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_long(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_long(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_long(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_LONG)
-                                && expect[j] >= long_min 
-				&& expect[j] <= long_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_LONG)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONG) && (expect[j] >= long_min && expect[j] <= long_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_LONG)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_float(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    float value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    float value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_float(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_float(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_float(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_float(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_float(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_FLOAT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_FLOAT) &&
+                (expect[0] >= float_min && expect[0] <= float_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_FLOAT);
-                    if (inRange3(expect[j],var_type[i],NCT_FLOAT)) {
-                        allInIntRange = allInIntRange && expect[j] >= float_min
-                            && expect[j] <= float_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_FLOAT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_FLOAT)) {
+		        
+                            allInIntRange &= (expect[j] >= float_min && expect[j] <= float_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_float(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_float(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_float(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_FLOAT)
-                                && expect[j] >= float_min 
-				&& expect[j] <= float_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_FLOAT)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_FLOAT) && (expect[j] >= float_min && expect[j] <= float_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_FLOAT)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_double(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    double value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    double value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_double(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_double(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_double(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_double(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_double(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+#endif
+        }
+
+        err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_DOUBLE);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_DOUBLE) &&
+                (expect[0] >= double_min && expect[0] <= double_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_DOUBLE);
-                    if (inRange3(expect[j],var_type[i],NCT_DOUBLE)) {
-                        allInIntRange = allInIntRange && expect[j] >= double_min
-                            && expect[j] <= double_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_DOUBLE);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_DOUBLE)) {
+		        
+                            allInIntRange &= (expect[j] >= double_min && expect[j] <= double_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_double(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_double(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_double(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
-                                && expect[j] >= double_min 
-				&& expect[j] <= double_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_DOUBLE)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_DOUBLE) && (expect[j] >= double_min && expect[j] <= double_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_DOUBLE)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_ushort(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ushort value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    ushort value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_ushort(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_ushort(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_ushort(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_ushort(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_ushort(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_ushort(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_ushort(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_ushort(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_ushort(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_USHORT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_USHORT) &&
+                (expect[0] >= ushort_min && expect[0] <= ushort_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_USHORT);
-                    if (inRange3(expect[j],var_type[i],NCT_USHORT)) {
-                        allInIntRange = allInIntRange && expect[j] >= ushort_min
-                            && expect[j] <= ushort_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_USHORT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_USHORT)) {
+		        
+                            allInIntRange &= (expect[j] >= ushort_min && expect[j] <= ushort_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_ushort(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_ushort(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_ushort(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_USHORT)
-                                && expect[j] >= ushort_min 
-				&& expect[j] <= ushort_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_USHORT)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_USHORT) && (expect[j] >= ushort_min && expect[j] <= ushort_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_USHORT)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_uint(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    uint value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    uint value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_uint(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_uint(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_uint(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_uint(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_uint(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_uint(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_uint(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_uint(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_uint(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_uint(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_uint(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_uint(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_UINT);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_UINT) &&
+                (expect[0] >= uint_min && expect[0] <= uint_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_UINT);
-                    if (inRange3(expect[j],var_type[i],NCT_UINT)) {
-                        allInIntRange = allInIntRange && expect[j] >= uint_min
-                            && expect[j] <= uint_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_UINT);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_UINT)) {
+		        
+                            allInIntRange &= (expect[j] >= uint_min && expect[j] <= uint_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_uint(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_uint(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_uint(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_UINT)
-                                && expect[j] >= uint_min 
-				&& expect[j] <= uint_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_UINT)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_UINT) && (expect[j] >= uint_min && expect[j] <= uint_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_UINT)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_longlong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    longlong value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    longlong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_longlong(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_longlong(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_longlong(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_longlong(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_longlong(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_longlong(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_longlong(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_longlong(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_longlong(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_LONGLONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_LONGLONG) &&
+                (expect[0] >= longlong_min && expect[0] <= longlong_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_LONGLONG);
-                    if (inRange3(expect[j],var_type[i],NCT_LONGLONG)) {
-                        allInIntRange = allInIntRange && expect[j] >= longlong_min
-                            && expect[j] <= longlong_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_LONGLONG);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONGLONG)) {
+		        
+                            allInIntRange &= (expect[j] >= longlong_min && expect[j] <= longlong_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_longlong(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_longlong(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_longlong(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_LONGLONG)
-                                && expect[j] >= longlong_min 
-				&& expect[j] <= longlong_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_LONGLONG)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_LONGLONG) && (expect[j] >= longlong_min && expect[j] <= longlong_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_LONGLONG)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_varm_ulonglong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    ulonglong value[MAX_NELS];
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    ulonglong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_varm_ulonglong(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_varm_ulonglong(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars_ulonglong(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_ulonglong(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_ulonglong(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
             err = nc_get_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
             err = nc_get_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
             edge[j] = 1;
             stride[j] = 0;
             err = nc_get_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = nc_get_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            start[j] = 0;
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)
+            stride[j] = 0;
+            err = nc_get_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
             stride[j] = 1;
-           }
+#endif
+        }
+
+        err = nc_get_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ULONGLONG);
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ULONGLONG) &&
+                (expect[0] >= ulonglong_min && expect[0] <= ulonglong_max)) {
+                IF (err != NC_NOERR) error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            }
+
+            else IF (err != NC_ERANGE) error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
+        } else {
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_ULONGLONG);
-                    if (inRange3(expect[j],var_type[i],NCT_ULONGLONG)) {
-                        allInIntRange = allInIntRange && expect[j] >= ulonglong_min
-                            && expect[j] <= ulonglong_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_ULONGLONG);
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_ULONGLONG)) {
+		        
+                            allInIntRange &= (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_ulonglong(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_ulonglong(ncid,i,index,count,stride,imap,value);
+                err = nc_get_varm_ulonglong(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
                         }
+                        
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_ULONGLONG)
-                                && expect[j] >= ulonglong_min 
-				&& expect[j] <= ulonglong_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_ULONGLONG)){
+                        if (inRange3(cdf_format, expect[j],var_type[i],NCT_ULONGLONG) && (expect[j] >= ulonglong_min && expect[j] <= ulonglong_max)) {
+                            
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_ULONGLONG)){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 
 
-void
+int
 test_nc_get_att_text(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    text value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    text value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_text(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_text(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-	    err = nc_get_att_text(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_text(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_text(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) ;
+
+            err = nc_get_att_text(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_text(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_text(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_TEXT);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_TEXT)) {
-                    allInIntRange = allInIntRange && expect[k] >= text_min
-                                && expect[k] <= text_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_TEXT);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_TEXT)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    if (ATT_TYPE(i,j) != NC_CHAR)
+		    
+                        allInIntRange &= 1;
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_text(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_text(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_TEXT)
-                            && expect[k] >= text_min && expect[k] <= text_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_TEXT)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (1) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_TEXT)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_uchar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    uchar value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    uchar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_uchar(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_uchar(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-	    err = nc_get_att_uchar(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_uchar(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_uchar(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+            err = nc_get_att_uchar(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_uchar(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_uchar(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_UCHAR);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_UCHAR)) {
-                    allInIntRange = allInIntRange && expect[k] >= uchar_min
-                                && expect[k] <= uchar_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_UCHAR);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_UCHAR)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    if (cdf_format > NC_FORMAT_64BIT_OFFSET || (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) != NC_BYTE))
+                        allInIntRange &= (expect[k] >= uchar_min && expect[k] <= uchar_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_uchar(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_uchar(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+#endif
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_UCHAR)
-                            && expect[k] >= uchar_min && expect[k] <= uchar_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_UCHAR)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_UCHAR) && (expect[k] >= uchar_min && expect[k] <= uchar_max)) {
+                        
+                        /* in put_vars(), API _put_vara_double() is used to
+                         * write the NC_BYTE variables to files. In this
+                         * case, NC_BYTE variables are treated as signed
+                         * for CDF-1 and 2 formats. Thus, we must skip the
+                         * equal test below for uchar.
+                         */
+                        if (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max) continue;
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_UCHAR)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_schar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    schar value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    schar value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_schar(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_schar(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-	    err = nc_get_att_schar(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_schar(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_schar(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+            err = nc_get_att_schar(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_schar(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_schar(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_SCHAR);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SCHAR)) {
-                    allInIntRange = allInIntRange && expect[k] >= schar_min
-                                && expect[k] <= schar_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_SCHAR);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_SCHAR)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= schar_min && expect[k] <= schar_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_schar(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_schar(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SCHAR)
-                            && expect[k] >= schar_min && expect[k] <= schar_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_SCHAR)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_SCHAR) && (expect[k] >= schar_min && expect[k] <= schar_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_SCHAR)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_short(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    short value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    short value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_short(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_short(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-	    err = nc_get_att_short(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_short(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_short(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+            err = nc_get_att_short(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_short(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_short(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_SHORT);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SHORT)) {
-                    allInIntRange = allInIntRange && expect[k] >= short_min
-                                && expect[k] <= short_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_SHORT);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_SHORT)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= short_min && expect[k] <= short_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_short(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_short(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SHORT)
-                            && expect[k] >= short_min && expect[k] <= short_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_SHORT)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_SHORT) && (expect[k] >= short_min && expect[k] <= short_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_SHORT)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_int(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    int value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    int value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_int(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_int(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_INT == NCT_TEXT);
-	    err = nc_get_att_int(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_int(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_int(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+            err = nc_get_att_int(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_int(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_int(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_INT);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_INT)) {
-                    allInIntRange = allInIntRange && expect[k] >= int_min
-                                && expect[k] <= int_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_INT);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_INT)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= int_min && expect[k] <= int_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_int(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_int(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_INT)
-                            && expect[k] >= int_min && expect[k] <= int_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_INT)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_INT) && (expect[k] >= int_min && expect[k] <= int_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_INT)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_long(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    long value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    long value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_long(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_long(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-	    err = nc_get_att_long(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_long(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_long(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+            err = nc_get_att_long(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_long(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_long(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_LONG);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_LONG)) {
-                    allInIntRange = allInIntRange && expect[k] >= long_min
-                                && expect[k] <= long_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_LONG);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_LONG)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= long_min && expect[k] <= long_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_long(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_long(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_LONG)
-                            && expect[k] >= long_min && expect[k] <= long_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_LONG)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_LONG) && (expect[k] >= long_min && expect[k] <= long_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_LONG)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_float(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    float value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    float value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_float(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_float(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-	    err = nc_get_att_float(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_float(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_float(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+            err = nc_get_att_float(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_float(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_float(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_FLOAT);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_FLOAT)) {
-                    allInIntRange = allInIntRange && expect[k] >= float_min
-                                && expect[k] <= float_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_FLOAT);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_FLOAT)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= float_min && expect[k] <= float_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_float(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_float(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_FLOAT)
-                            && expect[k] >= float_min && expect[k] <= float_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_FLOAT)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_FLOAT) && (expect[k] >= float_min && expect[k] <= float_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_FLOAT)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_double(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    double value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    double value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_double(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_double(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-	    err = nc_get_att_double(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_double(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_double(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+            err = nc_get_att_double(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_double(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_double(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_DOUBLE);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_DOUBLE)) {
-                    allInIntRange = allInIntRange && expect[k] >= double_min
-                                && expect[k] <= double_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_DOUBLE);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_DOUBLE)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= double_min && expect[k] <= double_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_double(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_double(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_DOUBLE)
-                            && expect[k] >= double_min && expect[k] <= double_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_DOUBLE)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_DOUBLE) && (expect[k] >= double_min && expect[k] <= double_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_DOUBLE)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_ushort(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    ushort value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    ushort value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_ushort(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_ushort(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-	    err = nc_get_att_ushort(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_ushort(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_ushort(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+            err = nc_get_att_ushort(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_ushort(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_ushort(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_USHORT);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_USHORT)) {
-                    allInIntRange = allInIntRange && expect[k] >= ushort_min
-                                && expect[k] <= ushort_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_USHORT);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_USHORT)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= ushort_min && expect[k] <= ushort_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_ushort(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_ushort(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_USHORT)
-                            && expect[k] >= ushort_min && expect[k] <= ushort_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_USHORT)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_USHORT) && (expect[k] >= ushort_min && expect[k] <= ushort_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_USHORT)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_uint(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    uint value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    uint value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_uint(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_uint(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-	    err = nc_get_att_uint(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_uint(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_uint(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+            err = nc_get_att_uint(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_uint(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_uint(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_UINT);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_UINT)) {
-                    allInIntRange = allInIntRange && expect[k] >= uint_min
-                                && expect[k] <= uint_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_UINT);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_UINT)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= uint_min && expect[k] <= uint_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_uint(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_uint(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_UINT)
-                            && expect[k] >= uint_min && expect[k] <= uint_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_UINT)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_UINT) && (expect[k] >= uint_min && expect[k] <= uint_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_UINT)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_longlong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    longlong value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    longlong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_longlong(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_longlong(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-	    err = nc_get_att_longlong(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_longlong(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_longlong(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+            err = nc_get_att_longlong(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_longlong(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_longlong(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_LONGLONG);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_LONGLONG)) {
-                    allInIntRange = allInIntRange && expect[k] >= longlong_min
-                                && expect[k] <= longlong_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_LONGLONG);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_LONGLONG)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= longlong_min && expect[k] <= longlong_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_longlong(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_longlong(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_LONGLONG)
-                            && expect[k] >= longlong_min && expect[k] <= longlong_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_LONGLONG)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_LONGLONG) && (expect[k] >= longlong_min && expect[k] <= longlong_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_LONGLONG)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-void
+int
 test_nc_get_att_ulonglong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    size_t k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    ulonglong value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    ulonglong value[MAX_NELS];
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
+
+    err = nc_get_att_ulonglong(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_get_att_ulonglong(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-	    err = nc_get_att_ulonglong(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_ulonglong(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_ulonglong(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+            err = nc_get_att_ulonglong(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)
+            /* check if can detect a bad name */
+            err = nc_get_att_ulonglong(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+            ELSE_NOK
+#endif
+
+            err = nc_get_att_ulonglong(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_ULONGLONG);
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_ULONGLONG)) {
-                    allInIntRange = allInIntRange && expect[k] >= ulonglong_min
-                                && expect[k] <= ulonglong_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_ULONGLONG);
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_ULONGLONG)) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    
+		    
+                        allInIntRange &= (expect[k] >= ulonglong_min && expect[k] <= ulonglong_max);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_ulonglong(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = nc_get_att_ulonglong(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_ULONGLONG)
-                            && expect[k] >= ulonglong_min && expect[k] <= ulonglong_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_ULONGLONG)){
-			    error("value read not that expected");
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+                }
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_ULONGLONG) && (expect[k] >= ulonglong_min && expect[k] <= ulonglong_max)) {
+                        
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_ULONGLONG)){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
diff --git a/nc_test/test_get.m4 b/nc_test/test_get.m4
index 5b792be..1e81e56 100644
--- a/nc_test/test_get.m4
+++ b/nc_test/test_get.m4
@@ -1,18 +1,71 @@
 dnl This is m4 source.
 dnl Process using m4 to produce 'C' language file.
 dnl
+dnl This file is supposed to be the same as PnetCDF's test_get.m4
+dnl
 dnl If you see this line, you can ignore the next one.
 /* Do not edit this file. It is produced from the corresponding .m4 source */
 dnl
-/*********************************************************************
- *   Copyright 1996, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Id: test_get.m4 2785 2014-10-26 05:21:20Z wkliao $
- *********************************************************************/
-
-#ifdef USE_PARALLEL
-#include <mpi.h>
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_get.m4 2672 2016-12-03 19:23:53Z wkliao $ */
+
+dnl
+dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
+dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types
+dnl (MPI_Offset vs. size_t), and function name substrings for external data
+dnl types.
+dnl
+
+#include "tests.h"
+
+ifdef(`PNETCDF',,`dnl
+#ifdef USE_PNETCDF
+#include <pnetcdf.h>
+#ifndef PNETCDF_VERSION_MAJOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
+#endif
+#ifndef PNETCDF_VERSION_MINOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
 #endif
+#endif')
+
+define(`EXPECT_ERR',`error("expecting $1 but got %s",nc_err_code_name($2));')dnl
+
+define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl
+define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl
+define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_get_$1',`test_nc_get_$1')')dnl
+define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl
+
+define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid)', `file_open($1, $2, &ncid)')')dnl
+
+define(`VarArgs',   `ifdef(`PNETCDF',`int numVars',`void')')dnl
+define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl
+
+define(`GetVar1',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl
+define(`GetVar', `ifdef(`PNETCDF',`ncmpi_get_var_$1_all', `nc_get_var_$1')')dnl
+define(`GetVara',`ifdef(`PNETCDF',`ncmpi_get_vara_$1_all',`nc_get_vara_$1')')dnl
+define(`GetVars',`ifdef(`PNETCDF',`ncmpi_get_vars_$1_all',`nc_get_vars_$1')')dnl
+define(`GetVarm',`ifdef(`PNETCDF',`ncmpi_get_varm_$1_all',`nc_get_varm_$1')')dnl
+define(`GetAtt', `ifdef(`PNETCDF',`ncmpi_get_att_$1',`nc_get_att_$1')')dnl
+
+define(`PNETCDF_CHECK_ERANGE',`dnl
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,`
+`#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)')',
+       `$1',`schar',`ifdef(`PNETCDF',,`
+`#'if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+`#'else')')
+                    else {
+ifelse(`$1',`schar',`ifdef(`PNETCDF',,``#'endif')')
+                        IF (err != NC_ERANGE)
+                            EXPECT_ERR(NC_ERANGE, err)
+                        ELSE_NOK
+                    }
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')'
+)dnl
 
 undefine(`index')dnl
 dnl dnl dnl
@@ -33,94 +86,146 @@ dnl
 define(`NCT_ITYPE', ``NCT_'Upcase($1)')dnl
 dnl
 
-#include "tests.h"
+define(`CheckText', `ifelse(`$1',`text', , `== (NCT_ITYPE($1) == NCT_TEXT)')')dnl
+define(`CheckRange',`ifelse(`$1',`text', `1', `($2 >= $1_min && $2 <= $1_max)')')dnl
+define(`IfCheckTextChar', `ifelse(`$1',`text', `if ($2 != NC_CHAR)')')dnl
+define(`CheckNumRange',`ifelse(`$1',`text', `1',`inRange3(cdf_format, $2,$3,NCT_ITYPE($1)) && ($2 >= $1_min && $2 <= $1_max)')')dnl
 
 dnl TEST_NC_GET_VAR1(TYPE)
 dnl
 define(`TEST_NC_GET_VAR1',dnl
 `dnl
-void
-test_nc_get_var1_$1(void)
+int
+TestFunc(var1)_$1(VarArgs)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
-    double expect;
+    int i, err, ncid, cdf_format;
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    $1 value;
+    IntType j, index[MAX_RANK];
+    double expect;
+    $1 value[1];
+
+    err = FileOpen(testfile, NC_NOWRITE);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = GetVar1($1)(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = GetVar1($1)(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
-    err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1_$1(BAD_ID, i, index, &value);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = GetVar1($1)(BAD_ID, i, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1_$1(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1_$1(ncid, i, index, &value);
-	    if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	    } else IF (err != NC_EINVALCOORDS)
-		error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_ITYPE($1) );
-	    if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1_$1(ncid, i, NULL, &value);
-	    else
-		err = nc_get_var1_$1(ncid, i, index, &value);
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = GetVar1($1)(ncid, i, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
+        }
+        else if (var_rank[i] == 0) {
+            index[0] = 0;
+            expect = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect, var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect)) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = GetVar1($1)(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+            } else IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            /* when file is created the variable contents are generated by
+             * hash functions */
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_ITYPE($1));
+            err = GetVar1($1)(ncid, i, index, value);
             if (canConvert) {
-		if (inRange3(expect,var_type[i], NCT_ITYPE($1))) {
-		    if (expect >= $1_min && expect <= $1_max) {
-			IF (err) {
-			    error("%s", nc_strerror(err));
-			} else {
-			    IF (!equal(value,expect,var_type[i],NCT_ITYPE($1))) {
-				error("expected: %G, got: %G", expect,
-				    (double) value);
-			    } else {
-				nok++;
-			    }
-			}
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
+                if (inRange3(cdf_format, expect,var_type[i], NCT_ITYPE($1))) {
+                    if (CheckRange($1, expect)) {
+                        IF (err != NC_NOERR) {
+                            EXPECT_ERR(NC_NOERR, err)
+                        } else {
+                            ifelse(`$1', `uchar', `
+                            /* in put_vars(), API _put_vara_double() is used to
+                             * write the NC_BYTE variables to files. In this
+                             * case, NC_BYTE variables are treated as signed
+                             * for CDF-1 and 2 formats. Thus, we must skip the
+                             * equal test below for uchar.
+                             */
+                            if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect > schar_max) continue;')
+                            IF (!equal((double)value[0], expect, var_type[i], NCT_ITYPE($1))) {
+                                error("expected: %G, got: %G", expect, (double)value[0]);
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                    PNETCDF_CHECK_ERANGE($1)
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
 }
 ')dnl
 
 TEST_NC_GET_VAR1(text)
-TEST_NC_GET_VAR1(uchar)
 TEST_NC_GET_VAR1(schar)
+TEST_NC_GET_VAR1(uchar)
 TEST_NC_GET_VAR1(short)
 TEST_NC_GET_VAR1(int)
 TEST_NC_GET_VAR1(long)
@@ -136,94 +241,107 @@ dnl TEST_NC_GET_VAR(TYPE)
 dnl
 define(`TEST_NC_GET_VAR',dnl
 `dnl
-void
-test_nc_get_var_$1(void)
+int
+TestFunc(var)_$1(VarArgs)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nok = 0;      /* count of valid comparisons */
-    size_t index[MAX_RANK];
+    int i, err, ncid, cdf_format;
+    int allInExtRange;  /* all values within range of external data type */
+    int allInIntRange;  /* all values within range of internal data type */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    $1 value[MAX_NELS];
+    IntType j, index[MAX_RANK];
     double expect[MAX_NELS];
+    $1 value[MAX_NELS];
+
+    err = FileOpen(testfile, NC_NOWRITE);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = GetVar($1)(BAD_ID, 0, value);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = GetVar($1)(ncid, BAD_VARID, value);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
-    err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_get_var_$1(BAD_ID, i, value);
+
+        /* check if can detect a bad file ID */
+        err = GetVar($1)(BAD_ID, i, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var_$1(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	allInExtRange = allInIntRange = 1;
-	for (j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_ITYPE($1));
-	    if (inRange3(expect[j],var_type[i], NCT_ITYPE($1))) {
-		allInIntRange = allInIntRange && expect[j] >= $1_min
-			    && expect[j] <= $1_max;
-	    } else {
-		allInExtRange = 0;
-	    }
-	}
-	err = nc_get_var_$1(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		if (allInIntRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("Range error: status = %d", err);
-		}
-	    } else {
-		IF (err != 0 && err != NC_ERANGE)
-		    error("OK or Range error: status = %d", err);
-	    }
-	    for (j = 0; j < nels; j++) {
-		if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))
-			&& expect[j] >= $1_min && expect[j] <= $1_max) {
-		    IF (!equal(value[j],expect[j],var_type[i],NCT_ITYPE($1))){
-			error("value read not that expected");
-			if (verbose) {
-			    error("\n");
-			    error("varid: %d, ", i);
-			    error("var_name: %s, ", var_name[i]);
-			    error("element number: %d ", j);
-			    error("expect: %g", expect[j]);
-			    error("got: %g", (double) value[j]);
-			}
-		    } else {
-			nok++;
-		    }
-		}
-	    }
-	} else {
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+        allInExtRange = allInIntRange = 1;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                              NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[j],var_type[i], NCT_ITYPE($1))) {
+                IfCheckTextChar($1, var_type[i])
+                    allInIntRange &= CheckRange($1,expect[j]);
+            } else
+                allInExtRange = 0;
+        }
+        err = GetVar($1)(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                if (allInIntRange) {
+                    IF (err != NC_NOERR)
+                        EXPECT_ERR(NC_NOERR, err)
+                }
+                PNETCDF_CHECK_ERANGE($1)
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
+            }
+            for (j = 0; j < var_nels[i]; j++) {
+                if (CheckNumRange($1, expect[j], var_type[i])) {
+                    ifelse(`$1', `uchar', `
+                    /* in put_vars(), API _put_vara_double() is used to
+                     * write the NC_BYTE variables to files. In this
+                     * case, NC_BYTE variables are treated as signed
+                     * for CDF-1 and 2 formats. Thus, we must skip the
+                     * equal test below for uchar.
+                     */
+                    if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;')
+                    IF (!equal((double)value[j],expect[j],var_type[i],NCT_ITYPE($1))){
+                        error("value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("element number: %d, ", j);
+                            error("expect: %g, ", expect[j]);
+                            error("got: %g", (double) value[j]);
+                        }
+                    }
+                    ELSE_NOK
+                }
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
 }
 ')dnl
 
@@ -245,160 +363,245 @@ dnl TEST_NC_GET_VARA(TYPE)
 dnl
 define(`TEST_NC_GET_VARA',dnl
 `dnl
-void
-test_nc_get_vara_$1(void)
+int
+TestFunc(vara)_$1(VarArgs)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t mid[MAX_RANK];
+    int i, k, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    $1 value[MAX_NELS];
+    IntType j;
+    IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
     double expect[MAX_NELS];
+    $1 value[MAX_NELS];
+
+    err = FileOpen(testfile, NC_NOWRITE);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
+
+    err = GetVara($1)(BAD_ID, 0, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    err = GetVara($1)(ncid, BAD_VARID, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
-    err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	}
-        err = nc_get_vara_$1(BAD_ID, i, start, edge, value);
+
+        /* check if can detect a bad file ID */
+        err = GetVara($1)(BAD_ID, i, NULL, NULL, value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara_$1(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara_$1(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara_$1(ncid, i, start, edge, value);
-            IF (canConvert && err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Check non-scalars for correct error returned even when */
-            /* there is nothing to get (edge[j]==0) */
-	if(var_rank[i] > 0) {
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 0;
-	    }
-	    err = nc_get_vara_$1(BAD_ID, i, start, edge, value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_vara_$1(ncid, BAD_VARID, start, edge, value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_vara_$1(ncid, i, start, edge, value);
-	    if (canConvert) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	    for (j = 0; j < var_rank[i]; j++) {
-		edge[j] = 1;
-	    }
-	}            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = GetVara($1)(ncid, i, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
+        else if (var_rank[i] == 0) {
+            index[0] = 0;
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = GetVara($1)(ncid, i, start, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
+        else if (var_rank[i] == 0) {
+            index[0] = 0;
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+        }
+        else IF (err != NC_EEDGE)
+            EXPECT_ERR(NC_EEDGE, err)
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
+            err = GetVara($1)(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
+            err = GetVara($1)(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDGE, err)
+            edge[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[*]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_rank[i] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = GetVara($1)(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
+            err = GetVara($1)(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            start[j] = 0;
+        }
+
+        err = GetVara($1)(ncid, i, start, edge, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
+        } else {
+            IF (err != NC_NOERR)
+                EXPECT_ERR(NC_NOERR, err)
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
-            nels = 1;
+            IntType nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
                 nels *= edge[j];
             }
-	    allInExtRange = allInIntRange = 1;
+            allInExtRange = allInIntRange = 1;
             for (j = 0; j < nels; j++) {
+                int d;
                 err = toMixedBase(j, var_rank[i], edge, index);
-                IF (err)
-                    error("error in toMixedBase 1");
+                IF (err != 0) error("error in toMixedBase");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_ITYPE($1));
-		if (inRange3(expect[j],var_type[i], NCT_ITYPE($1))) {
-		    allInIntRange = allInIntRange && expect[j] >= $1_min
-				&& expect[j] <= $1_max;
-		} else {
-		    allInExtRange = 0;
-		}
-	    }
-            if (var_rank[i] == 0 && i%2)
-		err = nc_get_vara_$1(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_get_vara_$1(ncid, i, start, edge, value);
+                expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
+                                  NCT_ITYPE($1));
+                if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) {
+		    IfCheckTextChar($1, var_type[i])
+                        allInIntRange &= CheckRange($1,expect[j]);
+                } else
+                    allInExtRange = 0;
+            }
+            err = GetVara($1)(ncid, i, start, edge, value);
             if (canConvert) {
-		if (allInExtRange) {
-		    if (allInIntRange) {
-			IF (err)
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("Range error: status = %d", err);
-		    }
-		} else {
-		    IF (err != 0 && err != NC_ERANGE)
-			error("OK or Range error: status = %d", err);
-		}
-		for (j = 0; j < nels; j++) {
-		    if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))
-			    && expect[j] >= $1_min && expect[j] <= $1_max) {
-			IF (!equal(value[j],expect[j],var_type[i],NCT_ITYPE($1))){
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect[j]);
-				error("got: %g", (double) value[j]);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
+                if (allInExtRange) {
+                    if (allInIntRange) {
+                        IF (err != NC_NOERR)
+                            EXPECT_ERR(NC_NOERR, err)
+                    }
+                    PNETCDF_CHECK_ERANGE($1)
+                } else {
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
+                }
+                for (j = 0; j < nels; j++) {
+                    if (CheckNumRange($1, expect[j], var_type[i])) {
+                        ifelse(`$1', `uchar', `
+                        /* in put_vars(), API _put_vara_double() is used to
+                         * write the NC_BYTE variables to files. In this
+                         * case, NC_BYTE variables are treated as signed
+                         * for CDF-1 and 2 formats. Thus, we must skip the
+                         * equal test below for uchar.
+                         */
+                        if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;')
+                        IF (!equal((double)value[j],expect[j],var_type[i],NCT_ITYPE($1))){
+                            error("value read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("var_type: %s, ", s_nc_type(var_type[i]));
+                                error("element number: %d, ", j);
+                                error("expect: %g, ", expect[j]);
+                                error("got: %g", (double) value[j]);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                }
             } else {
-                IF (nels > 0 && err != NC_ECHAR)
-                    error("wrong type: status = %d", err);
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
 }
 ')dnl
 
@@ -420,178 +623,283 @@ dnl TEST_NC_GET_VARS(TYPE)
 dnl
 define(`TEST_NC_GET_VARS',dnl
 `dnl
-void
-test_nc_get_vars_$1(void)
+int
+TestFunc(vars)_$1(VarArgs)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    PTRDType nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    $1 value[MAX_NELS];
+    IntType j, m, nels;
+    IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType stride[MAX_RANK];
     double expect[MAX_NELS];
+    $1 value[MAX_NELS];
+
+    err = FileOpen(testfile, NC_NOWRITE);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
+
+    err = GetVars($1)(BAD_ID, 0, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    err = GetVars($1)(ncid, BAD_VARID, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
-    err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = GetVars($1)(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars_$1(BAD_ID, i, start, edge, stride, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_vars_$1(ncid, BAD_VARID, start, edge, stride, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = GetVars($1)(ncid, i, NULL, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
+        else if (var_rank[i] == 0) {
+            index[0] = 0;
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = GetVars($1)(ncid, i, start, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
+        else if (var_rank[i] == 0) {
+            index[0] = 0;
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+        }
+        else IF (err != NC_EEDGE)
+            EXPECT_ERR(NC_EEDGE, err)
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
-            err = nc_get_vars_$1(ncid, i, start, edge, stride, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
+            err = GetVars($1)(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                start[j] = 0;
+                continue;
+            }
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+                EXPECT_ERR(NC_EINVALCOORDS, err)
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
-            err = nc_get_vars_$1(ncid, i, start, edge, stride, value);
+            err = GetVars($1)(ncid, i, start, edge, stride, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                EXPECT_ERR(NC_EEDGE, err)
             edge[j] = 1;
             stride[j] = 0;
-            err = nc_get_vars_$1(ncid, i, start, edge, stride, value);
+            err = GetVars($1)(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = GetVars($1)(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = GetVars($1)(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            start[j] = 0;
+ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)')
+            stride[j] = 0;
+            err = GetVars($1)(ncid, i, start, edge, stride, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                EXPECT_ERR(NC_ESTRIDE, err)
             stride[j] = 1;
-	  }
+ifdef(`PNETCDF',,``#'endif')
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+
+        err = GetVars($1)(ncid, i, start, edge, stride, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
+        } else {
+            IF (err != NC_NOERR)
+                EXPECT_ERR(NC_NOERR, err)
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (IntType)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (IntType)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
-		allInExtRange = allInIntRange = 1;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
-			NCT_ITYPE($1));
-		    if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))) {
-			allInIntRange = allInIntRange && expect[j] >= $1_min
-			    && expect[j] <= $1_max;
-		    } else {
-			allInExtRange = 0;
-		    }
-		}
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_vars_$1(ncid, i, NULL, NULL, NULL, value);
-                else
-                    err = nc_get_vars_$1(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			if (allInIntRange) {
-			    IF (err)
-				error("%s", nc_strerror(err));
-			} else {
-			    IF (err != NC_ERANGE)
-				error("Range error: status = %d", err);
-			}
-		    } else {
-			IF (err != 0 && err != NC_ERANGE)
-			    error("OK or Range error: status = %d", err);
-		    }
-		    for (j = 0; j < nels; j++) {
-			if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))
-				&& expect[j] >= $1_min && expect[j] <= $1_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_ITYPE($1))){
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
+                allInExtRange = allInIntRange = 1;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (IntType)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_ITYPE($1));
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) {
+		        IfCheckTextChar($1, var_type[i])
+                            allInIntRange &= CheckRange($1,expect[j]);
+                    } else
+                        allInExtRange = 0;
+                }
+                err = GetVars($1)(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        if (allInIntRange) {
+                            IF (err != NC_NOERR)
+                                EXPECT_ERR(NC_NOERR, err)
+                        }
+                        PNETCDF_CHECK_ERANGE($1)
+                    } else {
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
+                    }
+                    for (j = 0; j < nels; j++) {
+                        if (CheckNumRange($1, expect[j], var_type[i])) {
+                            ifelse(`$1', `uchar', `
+                            /* in put_vars(), API _put_vara_double() is used to
+                             * write the NC_BYTE variables to files. In this
+                             * case, NC_BYTE variables are treated as signed
+                             * for CDF-1 and 2 formats. Thus, we must skip the
+                             * equal test below for uchar.
+                             */
+                            if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;')
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_ITYPE($1))){
+                                error("value read not that expected");
+                                if (verbose) {
+                                    error("\n");
+                                    error("varid: %d, ", i);
+                                    error("var_name: %s, ", var_name[i]);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
-				    error("got: %g", (double) value[j]);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                                    error("got: %g", (double) value[j]);
+                                }
+                            }
+                            ELSE_NOK
+                        }
+                    }
+                } else {
+                    IF (err != NC_ECHAR)
+                        EXPECT_ERR(NC_ECHAR, err)
+                }
+            }
+        }
 
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
 }
 ')dnl
 
@@ -613,186 +921,288 @@ dnl TEST_NC_GET_VARM(TYPE)
 dnl
 define(`TEST_NC_GET_VARM',dnl
 `dnl
-void
-test_nc_get_varm_$1(void)
+int
+TestFunc(varm)_$1(VarArgs)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int allInExtRange;	/* all values within external range? */
-    int allInIntRange;	/* all values within internal range? */
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    int nok = 0;      /* count of valid comparisons */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format;
+    int allInExtRange;  /* all values within external range? */
+    int allInIntRange;  /* all values within internal range? */
+    PTRDType nstarts;   /* number of different starts */
+    int nok = 0;        /* count of valid comparisons */
     int canConvert;     /* Both text or both numeric */
-    $1 value[MAX_NELS];
+    IntType j, m, nels;
+    IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType stride[MAX_RANK], imap[MAX_RANK];
     double expect[MAX_NELS];
+    $1 value[MAX_NELS];
+
+    err = FileOpen(testfile, NC_NOWRITE);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
+
+    err = GetVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    err = GetVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
-    err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-        canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = GetVars($1)(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
             imap[j] = 1;
         }
-        err = nc_get_varm_$1(BAD_ID, i, start, edge, stride, imap, value);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_get_varm_$1(ncid, BAD_VARID, start, edge, stride, imap, value);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = GetVarm($1)(ncid, i, NULL, NULL, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
+        else if (var_rank[i] == 0) {
+            index[0] = 0;
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = GetVarm($1)(ncid, i, start, NULL, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
+        else if (var_rank[i] == 0) {
+            index[0] = 0;
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+        }
+        else IF (err != NC_EEDGE)
+            EXPECT_ERR(NC_EEDGE, err)
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = var_shape[i][j];
-            err = nc_get_varm_$1(ncid, i, start, edge, stride, imap, value);
-	  if(!canConvert) {
-		IF (err != NC_ECHAR)
-               	    error("conversion: status = %d", err);
-	  } else {
-	    IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
+            err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
             start[j] = 0;
             edge[j] = var_shape[i][j] + 1;
-            err = nc_get_varm_$1(ncid, i, start, edge, stride, imap, value);
+            err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_EEDGE)
-                error("bad edge: status = %d", err);
+                EXPECT_ERR(NC_EEDGE, err)
             edge[j] = 1;
             stride[j] = 0;
-            err = nc_get_varm_$1(ncid, i, start, edge, stride, imap, value);
+            err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            stride[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            start[j] = var_shape[i][j]+1;  /* should cause NC_EINVALCOORDS */
+            err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            start[j] = 0;
+ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)')
+            stride[j] = 0;
+            err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
             IF (err != NC_ESTRIDE)
-                error("bad stride: status = %d", err);
+                EXPECT_ERR(NC_ESTRIDE, err)
             stride[j] = 1;
-           }
+ifdef(`PNETCDF',,``#'endif')
+        }
+
+        err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+        } else if (var_rank[i] == 0) {
+            expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
+            if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
+                CheckRange($1, expect[0])) {
+                IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+            }
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
+            else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
+        } else {
+            IF (err != NC_NOERR)
+                EXPECT_ERR(NC_NOERR, err)
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
                 if ((k >> j) & 1) {
                     start[j] = 0;
                     edge[j] = mid[j];
-                }else{
+                } else {
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j]-index[j]-1) / (IntType)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-		    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (IntType)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] > 0) {
-		    j = var_rank[i] - 1;
-		    imap[j] = 1;
-		    for (; j > 0; j--)
-			imap[j-1] = imap[j] * count[j];
-		}
+                if (var_rank[i] > 0) {
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (PTRDType)count[jj];
+                }
                 allInExtRange = allInIntRange = 1;
                 for (j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase 1");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
-                        NCT_ITYPE($1));
-                    if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))) {
-                        allInIntRange = allInIntRange && expect[j] >= $1_min
-                            && expect[j] <= $1_max;
-                    } else {
+                        index2[d] = index[d] + index2[d] * (IntType)stride[d];
+                    expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
+                                      index2, NCT_ITYPE($1));
+                    if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) {
+		        IfCheckTextChar($1, var_type[i])
+                            allInIntRange &= CheckRange($1,expect[j]);
+                    } else
                         allInExtRange = 0;
-                    }
                 }
-                if (var_rank[i] == 0 && i%2 )
-                    err = nc_get_varm_$1(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_get_varm_$1(ncid,i,index,count,stride,imap,value);
+                err = GetVarm($1)(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
                         if (allInIntRange) {
-                            IF (err)
-                                error("%s", nc_strerror(err));
-                        } else {
-                            IF (err != NC_ERANGE)
-                                error("Range error: status = %d", err);
+                            IF (err != NC_NOERR)
+                                EXPECT_ERR(NC_NOERR, err)
                         }
+                        PNETCDF_CHECK_ERANGE($1)
                     } else {
-                        IF (err != 0 && err != NC_ERANGE)
-                            error("OK or Range error: status = %d", err);
+                        IF (err != NC_NOERR && err != NC_ERANGE)
+                            EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
                     }
                     for (j = 0; j < nels; j++) {
-                        if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))
-                                && expect[j] >= $1_min 
-				&& expect[j] <= $1_max) {
-			    IF (!equal(value[j],expect[j],var_type[i], NCT_ITYPE($1))){
+                        if (CheckNumRange($1, expect[j], var_type[i])) {
+                            ifelse(`$1', `uchar', `
+                            /* in put_vars(), API _put_vara_double() is used to
+                             * write the NC_BYTE variables to files. In this
+                             * case, NC_BYTE variables are treated as signed
+                             * for CDF-1 and 2 formats. Thus, we must skip the
+                             * equal test below for uchar.
+                             */
+                            if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;')
+                            IF (!equal((double)value[j],expect[j],var_type[i], NCT_ITYPE($1))){
                                 error("value read not that expected");
                                 if (verbose) {
                                     error("\n");
                                     error("varid: %d, ", i);
                                     error("var_name: %s, ", var_name[i]);
-                                    error("element number: %d ", j);
+                                    error("var_type: %s, ", s_nc_type(var_type[i]));
+                                    error("element number: %d, ", j);
                                     error("expect: %g, ", expect[j]);
                                     error("got: %g", (double) value[j]);
                                 }
-                            } else {
-                                nok++;
                             }
+                            ELSE_NOK
                         }
                     }
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
+                    IF (err != NC_ECHAR)
+                        EXPECT_ERR(NC_ECHAR, err)
                 }
             }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
 }
 ')dnl
 
@@ -814,90 +1224,130 @@ dnl TEST_NC_GET_ATT(TYPE)
 dnl
 define(`TEST_NC_GET_ATT',dnl
 `dnl
-void
-test_nc_get_att_$1(void)
+int
+TestFunc(att)_$1(AttVarArgs)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, cdf_format;
+    IntType k, ndx[1];
     int allInExtRange;
     int allInIntRange;
     int canConvert;     /* Both text or both numeric */
-    $1 value[MAX_NELS];
+    int nok = 0;        /* count of valid comparisons */
     double expect[MAX_NELS];
-    int nok = 0;      /* count of valid comparisons */
+    $1 value[MAX_NELS];
+
+    err = FileOpen(testfile, NC_NOWRITE);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
 
-    err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err) 
-	error("nc_open: %s", nc_strerror(err));
+    err = GetAtt($1)(BAD_ID, 0, NULL, value);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    err = GetAtt($1)(ncid, BAD_VARID, NULL, value);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-	    err = nc_get_att_$1(BAD_ID, i, ATT_NAME(i,j), value);
-	    IF (err != NC_EBADID) 
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att_$1(ncid, BAD_VARID, ATT_NAME(i,j), value);
-	    IF (err != NC_ENOTVAR) 
-		error("bad var id: status = %d", err);
-	    err = nc_get_att_$1(ncid, i, "noSuch", value);
-	    IF (err != NC_ENOTATT) 
-		error("Bad attribute name: status = %d", err);
-	    allInExtRange = allInIntRange = 1;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1);
+
+            err = GetAtt($1)(ncid, BAD_VARID, ATT_NAME(i,j), value);
+            IF (err != NC_ENOTVAR)
+                EXPECT_ERR(NC_ENOTVAR, err)
+            ELSE_NOK
+
+ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')
+            /* check if can detect a bad name */
+            err = GetAtt($1)(ncid, i, NULL, NULL);
+            IF (err != NC_EBADNAME)
+                EXPECT_ERR(NC_EBADNAME, err)
+            ELSE_NOK
+ifdef(`PNETCDF',,``#'endif')
+
+            err = GetAtt($1)(ncid, i, "noSuch", value);
+            IF (err != NC_ENOTATT)
+                EXPECT_ERR(NC_ENOTATT, err)
+            ELSE_NOK
+
+            allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1));
-                if (inRange3(expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))) {
-                    allInIntRange = allInIntRange && expect[k] >= $1_min
-                                && expect[k] <= $1_max;
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_ITYPE($1));
+                if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))) {
+		    /* netCDF specification make a special case for type
+		     * conversion between uchar and scahr: do not check for
+		     * range error. See
+		     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+                     */
+		    IfCheckTextChar($1, ATT_TYPE(i,j))
+		    ifelse(`$1',`uchar', `if (cdf_format > NC_FORMAT_64BIT_OFFSET || (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) != NC_BYTE))')
+                        allInIntRange &= CheckRange($1,expect[k]);
                 } else {
                     allInExtRange = 0;
                 }
-	    }
-	    err = nc_get_att_$1(ncid, i, ATT_NAME(i,j), value);
+            }
+            err = GetAtt($1)(ncid, i, ATT_NAME(i,j), value);
             if (canConvert || ATT_LEN(i,j) == 0) {
                 if (allInExtRange) {
                     if (allInIntRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
+                        IF (err != NC_NOERR)
+                            EXPECT_ERR(NC_NOERR, err)
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
                     } else {
                         IF (err != NC_ERANGE)
-                            error("Range error: status = %d", err);
+                            EXPECT_ERR(NC_ERANGE, err)
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
                     }
                 } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
+                    IF (err != NC_NOERR && err != NC_ERANGE)
+                        EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
                 }
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    if (inRange3(expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))
-                            && expect[k] >= $1_min && expect[k] <= $1_max) {
-			IF (!equal(value[k],expect[k],ATT_TYPE(i,j), NCT_ITYPE($1))){
-			    error("value read not that expected");
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    if (CheckNumRange($1, expect[k], ATT_TYPE(i,j))) {
+                        ifelse(`$1', `uchar', `
+                        /* in put_vars(), API _put_vara_double() is used to
+                         * write the NC_BYTE variables to files. In this
+                         * case, NC_BYTE variables are treated as signed
+                         * for CDF-1 and 2 formats. Thus, we must skip the
+                         * equal test below for uchar.
+                         */
+                        if (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max) continue;')
+                        IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_ITYPE($1))){
+                            error("value read not that expected");
                             if (verbose) {
                                 error("\n");
                                 error("varid: %d, ", i);
+                                if (i == -1)
+                                    error("var_type: GLOBAL, ");
+                                else
+                                    error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
                                 error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g", expect[k]);
+                                error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                                error("element number: %d, ", k);
+                                error("expect: %g, ", expect[k]);
                                 error("got: %g", (double) value[k]);
                             }
-			} else {
-			    nok++;
+                        } else {
+                            nok++;
                         }
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-	}
+                    }
+                }
+            } else {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
 }
 ')dnl
 
diff --git a/nc_test/test_get_p5.m4 b/nc_test/test_get_p5.m4
index 91b09e9..dd2066d 100644
--- a/nc_test/test_get_p5.m4
+++ b/nc_test/test_get_p5.m4
@@ -82,7 +82,7 @@ test_nc_get_var1_$1(void)
 	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
 	    IF (err)
 		error("error in toMixedBase 1");
-	    expect = hash4( var_type[i], var_rank[i], index, NCT_ITYPE($1) );
+	    expect = hash4(cdf_format, var_type[i], var_rank[i], index, NCT_ITYPE($1));
 	    if (var_rank[i] == 0 && i%2 )
 		err = nc_get_var1_$1(ncid, i, NULL, &value);
 	    else
@@ -182,7 +182,7 @@ test_nc_get_var_$1(void)
 	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
 	    IF (err)
 		error("error in toMixedBase 1");
-	    expect[j] = hash4(var_type[i], var_rank[i], index, NCT_ITYPE($1));
+	    expect[j] = hash4(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
 	    if (inRange3(expect[j],var_type[i], NCT_ITYPE($1))) {
 		allInIntRange = allInIntRange && expect[j] >= $1_min
 			    && expect[j] <= $1_max;
@@ -366,7 +366,7 @@ test_nc_get_vara_$1(void)
                     error("error in toMixedBase 1");
                 for (d = 0; d < var_rank[i]; d++)
                     index[d] += start[d];
-                expect[j] = hash4(var_type[i], var_rank[i], index, NCT_ITYPE($1));
+                expect[j] = hash4(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
 		if (inRange3(expect[j],var_type[i], NCT_ITYPE($1))) {
 		    allInIntRange = allInIntRange && expect[j] >= $1_min
 				&& expect[j] <= $1_max;
@@ -560,7 +560,7 @@ test_nc_get_vars_$1(void)
 			error("error in toMixedBase 1");
 		    for (d = 0; d < var_rank[i]; d++)
 			index2[d] = index[d] + index2[d] * stride[d];
-		    expect[j] = hash4(var_type[i], var_rank[i], index2, 
+		    expect[j] = hash4(cdf_format,var_type[i], var_rank[i], index2, 
 			NCT_ITYPE($1));
 		    if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))) {
 			allInIntRange = allInIntRange && expect[j] >= $1_min
@@ -766,7 +766,7 @@ test_nc_get_varm_$1(void)
                         error("error in toMixedBase 1");
                     for (d = 0; d < var_rank[i]; d++)
                         index2[d] = index[d] + index2[d] * stride[d];
-                    expect[j] = hash4(var_type[i], var_rank[i], index2,
+                    expect[j] = hash4(cdf_format,var_type[i], var_rank[i], index2,
                         NCT_ITYPE($1));
                     if (inRange3(expect[j],var_type[i],NCT_ITYPE($1))) {
                         allInIntRange = allInIntRange && expect[j] >= $1_min
@@ -881,7 +881,7 @@ test_nc_get_att_$1(void)
 		error("Bad attribute name: status = %d", err);
 	    allInExtRange = allInIntRange = 1;
             for (k = 0; k < ATT_LEN(i,j); k++) {
-		expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1));
+		expect[k] = hash4(cdf_format,ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1));
                 if (inRange3(expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))) {
                     allInIntRange = allInIntRange && expect[k] >= $1_min
                                 && expect[k] <= $1_max;
diff --git a/nc_test/test_put.c b/nc_test/test_put.c
index a55118f..24a0c89 100644
--- a/nc_test/test_put.c
+++ b/nc_test/test_put.c
@@ -1,11714 +1,13742 @@
 /* Do not edit this file. It is produced from the corresponding .m4 source */
-/*********************************************************************
- *   Copyright 1996, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Id: test_put.m4 2785 2014-10-26 05:21:20Z wkliao $
- *********************************************************************/
-
-#ifdef USE_PARALLEL
-#include <mpi.h>
-#endif
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_put.m4 2672 2016-12-03 19:23:53Z wkliao $ */
 
 
 #include "tests.h"
 
+#ifdef USE_PNETCDF
+#include <pnetcdf.h>
+#ifndef PNETCDF_VERSION_MAJOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
+#endif
+#ifndef PNETCDF_VERSION_MINOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
+#endif
+#endif
+
+
+
+
+
+
+
+
+
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_text(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+text
+hash_text(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = text_min;
-    const double max = text_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    return (text)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_uchar(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+uchar
+hash_uchar(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = uchar_min;
-    const double max = uchar_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > uchar_max) return uchar_max;
+    else if (value < uchar_min) return uchar_min;
+    else return (uchar)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_schar(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+schar
+hash_schar(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = schar_min;
-    const double max = schar_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > schar_max) return schar_max;
+    else if (value < schar_min) return schar_min;
+    else return (schar)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_short(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+short
+hash_short(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = short_min;
-    const double max = short_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > short_max) return short_max;
+    else if (value < short_min) return short_min;
+    else return (short)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_int(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+int
+hash_int(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = int_min;
-    const double max = int_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > int_max) return int_max;
+    else if (value < int_min) return int_min;
+    else return (int)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_long(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+long
+hash_long(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = long_min;
-    const double max = long_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > long_max) return long_max;
+    else if (value < long_min) return long_min;
+    else return (long)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_float(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+float
+hash_float(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = float_min;
-    const double max = float_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > float_max) return float_max;
+    else if (value < float_min) return float_min;
+    else return (float)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
 double
-hash_double(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+hash_double(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = double_min;
-    const double max = double_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > double_max) return double_max;
+    else if (value < double_min) return double_min;
+    else return (double)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_ushort(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+ushort
+hash_ushort(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = ushort_min;
-    const double max = ushort_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > ushort_max) return ushort_max;
+    else if (value < ushort_min) return ushort_min;
+    else return (ushort)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_uint(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+uint
+hash_uint(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = uint_min;
-    const double max = uint_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > uint_max) return uint_max;
+    else if (value < uint_min) return uint_min;
+    else return (uint)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_longlong(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+longlong
+hash_longlong(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = longlong_min;
-    const double max = longlong_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > longlong_max) return longlong_max;
+    else if (value < longlong_min) return longlong_min;
+    else return (longlong)value;
 }
 
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_ulonglong(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+ulonglong
+hash_ulonglong(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const size_t  *index,
+        const nct_itype itype)
 {
-    const double min = ulonglong_min;
-    const double max = ulonglong_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    
+    if (value > ulonglong_max) return ulonglong_max;
+    else if (value < ulonglong_min) return ulonglong_min;
+    else return (ulonglong)value;
 }
 
 
 
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_text(const char *filename)
+int
+check_vars_text(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    text value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    text value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_TEXT);
-		err = nc_get_var1_text(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_TEXT)) {
-                    if (expect >= text_min && expect <= text_max) {
-			IF (err) {
-			    error("nc_get_var1_text: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_TEXT)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) ;
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_TEXT);
+            err = nc_get_var1_text(ncid, i, index, &value);
+            if (1) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_text: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_TEXT)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_uchar(const char *filename)
+int
+check_vars_uchar(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    uchar value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    uchar value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_UCHAR);
-		err = nc_get_var1_uchar(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_UCHAR)) {
-                    if (expect >= uchar_min && expect <= uchar_max) {
-			IF (err) {
-			    error("nc_get_var1_uchar: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_UCHAR)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_UCHAR);
+            err = nc_get_var1_uchar(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_UCHAR) && (expect >= uchar_min && expect <= uchar_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_uchar: %s",  nc_strerror(err));
+                } else {
+                    
+                    /* In put_vars(), nc_put_vara_double() is used to write
+                     * variables of type NC_BYTE to files. For uchar APIs,
+                     * NC_BYTE variables are treated as unsigned for CDF-1 and 2
+                     * formats. Thus, we skip the equal test for out-of-bound
+                     * values below for uchar APIs.
+                     */
+                    if (cdf_format < NC_FORMAT_CDF5 &&
+                        var_type[i] == NC_BYTE && expect > schar_max)
+                        continue;
+                    IF (!equal((double)value,expect,var_type[i],NCT_UCHAR)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_schar(const char *filename)
+int
+check_vars_schar(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    schar value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    schar value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_SCHAR);
-		err = nc_get_var1_schar(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_SCHAR)) {
-                    if (expect >= schar_min && expect <= schar_max) {
-			IF (err) {
-			    error("nc_get_var1_schar: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_SCHAR)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_SCHAR);
+            err = nc_get_var1_schar(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_SCHAR) && (expect >= schar_min && expect <= schar_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_schar: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_SCHAR)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_short(const char *filename)
+int
+check_vars_short(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    short value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    short value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_SHORT);
-		err = nc_get_var1_short(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_SHORT)) {
-                    if (expect >= short_min && expect <= short_max) {
-			IF (err) {
-			    error("nc_get_var1_short: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_SHORT)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_SHORT);
+            err = nc_get_var1_short(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_SHORT) && (expect >= short_min && expect <= short_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_short: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_SHORT)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_int(const char *filename)
+int
+check_vars_int(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    int value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    int value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_INT);
-		err = nc_get_var1_int(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_INT)) {
-                    if (expect >= int_min && expect <= int_max) {
-			IF (err) {
-			    error("nc_get_var1_int: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_INT)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_INT);
+            err = nc_get_var1_int(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_INT) && (expect >= int_min && expect <= int_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_int: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_INT)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_long(const char *filename)
+int
+check_vars_long(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    long value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    long value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_LONG);
-		err = nc_get_var1_long(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_LONG)) {
-                    if (expect >= long_min && expect <= long_max) {
-			IF (err) {
-			    error("nc_get_var1_long: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_LONG)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_LONG);
+            err = nc_get_var1_long(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_LONG) && (expect >= long_min && expect <= long_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_long: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_LONG)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_float(const char *filename)
+int
+check_vars_float(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    float value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    float value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_FLOAT);
-		err = nc_get_var1_float(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_FLOAT)) {
-                    if (expect >= float_min && expect <= float_max) {
-			IF (err) {
-			    error("nc_get_var1_float: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_FLOAT)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_FLOAT);
+            err = nc_get_var1_float(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_FLOAT) && (expect >= float_min && expect <= float_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_float: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_FLOAT)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_double(const char *filename)
+int
+check_vars_double(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    double value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    double value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_DOUBLE);
-		err = nc_get_var1_double(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_DOUBLE)) {
-                    if (expect >= double_min && expect <= double_max) {
-			IF (err) {
-			    error("nc_get_var1_double: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_DOUBLE)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_DOUBLE);
+            err = nc_get_var1_double(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_DOUBLE) && (expect >= double_min && expect <= double_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_double: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_DOUBLE)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_ushort(const char *filename)
+int
+check_vars_ushort(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    ushort value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    ushort value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_USHORT);
-		err = nc_get_var1_ushort(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_USHORT)) {
-                    if (expect >= ushort_min && expect <= ushort_max) {
-			IF (err) {
-			    error("nc_get_var1_ushort: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_USHORT)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_USHORT);
+            err = nc_get_var1_ushort(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_USHORT) && (expect >= ushort_min && expect <= ushort_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_ushort: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_USHORT)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_uint(const char *filename)
+int
+check_vars_uint(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    uint value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    uint value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_UINT);
-		err = nc_get_var1_uint(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_UINT)) {
-                    if (expect >= uint_min && expect <= uint_max) {
-			IF (err) {
-			    error("nc_get_var1_uint: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_UINT)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
-}
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
-/* 
- *  check all vars in file which are (text/numeric) compatible with TYPE
- */
-static
-void
-check_vars_longlong(const char *filename)
-{
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    longlong value;
-    nc_type datatype;
-    int ndims;
-    int dimids[MAX_RANK];
-    double expect;
-    char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
+    for (i = 0; i < numVars; i++) {
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_UINT);
+            err = nc_get_var1_uint(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_UINT) && (expect >= uint_min && expect <= uint_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_uint: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_UINT)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
+}
+
+/*
+ *  check all vars in file which are (text/numeric) compatible with TYPE
+ */
+int
+check_vars_longlong(const char *filename, int numVars)
+{
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
     int nok = 0;      /* count of valid comparisons */
+    int dimids[MAX_RANK];
+    nc_type datatype;
+    char name[NC_MAX_NAME];
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    longlong value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_LONGLONG);
-		err = nc_get_var1_longlong(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_LONGLONG)) {
-                    if (expect >= longlong_min && expect <= longlong_max) {
-			IF (err) {
-			    error("nc_get_var1_longlong: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_LONGLONG)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_LONGLONG);
+            err = nc_get_var1_longlong(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_LONGLONG) && (expect >= longlong_min && expect <= longlong_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_longlong: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_LONGLONG)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_ulonglong(const char *filename)
+int
+check_vars_ulonglong(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    ulonglong value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    size_t j, length, index[MAX_RANK];
+    double expect;
+    ulonglong value;
 
     err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_ULONGLONG);
-		err = nc_get_var1_ulonglong(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_ULONGLONG)) {
-                    if (expect >= ulonglong_min && expect <= ulonglong_max) {
-			IF (err) {
-			    error("nc_get_var1_ulonglong: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_ULONGLONG)) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
-    }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+        if (!canConvert) continue;
+
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err =  nc_inq_dim(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s",  nc_strerror(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_ULONGLONG);
+            err = nc_get_var1_ulonglong(ncid, i, index, &value);
+            if (inRange3(cdf_format, (double)expect,datatype,NCT_ULONGLONG) && (expect >= ulonglong_min && expect <= ulonglong_max)) {
+                IF (err != NC_NOERR) {
+                    error("nc_get_var1_ulonglong: %s",  nc_strerror(err));
+                } else {
+                    
+                    IF (!equal((double)value,expect,var_type[i],NCT_ULONGLONG)){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
+    }
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type text
  */
-static
-void
-check_atts_text(int  ncid)
+int
+check_atts_text(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    text value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    text value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_TEXT);
-		    if (inRange3(expect[k], datatype, NCT_TEXT)) {
-			++nInExtRange;
-			if (expect[k] >= text_min && expect[k] <= text_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_text(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_TEXT)
-                            && expect[k] >= text_min && expect[k] <= text_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_TEXT)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) ;
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_TEXT);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_TEXT)) {
+                    ++nInExtRange;
+                    if (0)
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_text(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (1) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_TEXT)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type uchar
  */
-static
-void
-check_atts_uchar(int  ncid)
+int
+check_atts_uchar(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    uchar value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    uchar value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_UCHAR);
-		    if (inRange3(expect[k], datatype, NCT_UCHAR)) {
-			++nInExtRange;
-			if (expect[k] >= uchar_min && expect[k] <= uchar_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_uchar(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_UCHAR)
-                            && expect[k] >= uchar_min && expect[k] <= uchar_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_UCHAR)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_UCHAR);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_UCHAR)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= uchar_min && expect[k] <= uchar_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_uchar(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_UCHAR) && (expect[k] >= uchar_min && expect[k] <= uchar_max)) {
+                    
+                    /* In put_vars(), nc_put_vara_double() is used to write
+                     * variables of type NC_BYTE to files. For uchar APIs,
+                     * NC_BYTE variables are treated as unsigned for CDF-1 and 2
+                     * formats. Thus, we skip the equal test for out-of-bound
+                     * values below for uchar APIs.
+                     */
+                    if (cdf_format < NC_FORMAT_CDF5 &&
+                        ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max)
+                        continue;
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_UCHAR)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type schar
  */
-static
-void
-check_atts_schar(int  ncid)
+int
+check_atts_schar(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    schar value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    schar value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_SCHAR);
-		    if (inRange3(expect[k], datatype, NCT_SCHAR)) {
-			++nInExtRange;
-			if (expect[k] >= schar_min && expect[k] <= schar_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_schar(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_SCHAR)
-                            && expect[k] >= schar_min && expect[k] <= schar_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_SCHAR)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_SCHAR);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_SCHAR)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= schar_min && expect[k] <= schar_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_schar(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_SCHAR) && (expect[k] >= schar_min && expect[k] <= schar_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_SCHAR)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type short
  */
-static
-void
-check_atts_short(int  ncid)
+int
+check_atts_short(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    short value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    short value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_SHORT);
-		    if (inRange3(expect[k], datatype, NCT_SHORT)) {
-			++nInExtRange;
-			if (expect[k] >= short_min && expect[k] <= short_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_short(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_SHORT)
-                            && expect[k] >= short_min && expect[k] <= short_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_SHORT)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_SHORT);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_SHORT)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= short_min && expect[k] <= short_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_short(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_SHORT) && (expect[k] >= short_min && expect[k] <= short_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_SHORT)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type int
  */
-static
-void
-check_atts_int(int  ncid)
+int
+check_atts_int(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    int value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    int value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_INT == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_INT);
-		    if (inRange3(expect[k], datatype, NCT_INT)) {
-			++nInExtRange;
-			if (expect[k] >= int_min && expect[k] <= int_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_int(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_INT)
-                            && expect[k] >= int_min && expect[k] <= int_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_INT)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_INT == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_INT);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_INT)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= int_min && expect[k] <= int_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_int(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_INT) && (expect[k] >= int_min && expect[k] <= int_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_INT)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type long
  */
-static
-void
-check_atts_long(int  ncid)
+int
+check_atts_long(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    long value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    long value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_LONG);
-		    if (inRange3(expect[k], datatype, NCT_LONG)) {
-			++nInExtRange;
-			if (expect[k] >= long_min && expect[k] <= long_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_long(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_LONG)
-                            && expect[k] >= long_min && expect[k] <= long_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_LONG)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_LONG);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_LONG)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= long_min && expect[k] <= long_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_long(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_LONG) && (expect[k] >= long_min && expect[k] <= long_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_LONG)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type float
  */
-static
-void
-check_atts_float(int  ncid)
+int
+check_atts_float(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    float value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    float value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_FLOAT);
-		    if (inRange3(expect[k], datatype, NCT_FLOAT)) {
-			++nInExtRange;
-			if (expect[k] >= float_min && expect[k] <= float_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_float(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_FLOAT)
-                            && expect[k] >= float_min && expect[k] <= float_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_FLOAT)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_FLOAT);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_FLOAT)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= float_min && expect[k] <= float_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_float(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_FLOAT) && (expect[k] >= float_min && expect[k] <= float_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_FLOAT)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type double
  */
-static
-void
-check_atts_double(int  ncid)
+int
+check_atts_double(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    double value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    double value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_DOUBLE);
-		    if (inRange3(expect[k], datatype, NCT_DOUBLE)) {
-			++nInExtRange;
-			if (expect[k] >= double_min && expect[k] <= double_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_double(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_DOUBLE)
-                            && expect[k] >= double_min && expect[k] <= double_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_DOUBLE)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_DOUBLE);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_DOUBLE)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= double_min && expect[k] <= double_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_double(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_DOUBLE) && (expect[k] >= double_min && expect[k] <= double_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_DOUBLE)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type ushort
  */
-static
-void
-check_atts_ushort(int  ncid)
+int
+check_atts_ushort(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    ushort value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    ushort value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_USHORT);
-		    if (inRange3(expect[k], datatype, NCT_USHORT)) {
-			++nInExtRange;
-			if (expect[k] >= ushort_min && expect[k] <= ushort_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_ushort(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_USHORT)
-                            && expect[k] >= ushort_min && expect[k] <= ushort_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_USHORT)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_USHORT);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_USHORT)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= ushort_min && expect[k] <= ushort_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_ushort(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_USHORT) && (expect[k] >= ushort_min && expect[k] <= ushort_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_USHORT)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type uint
  */
-static
-void
-check_atts_uint(int  ncid)
+int
+check_atts_uint(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    uint value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    uint value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_UINT);
-		    if (inRange3(expect[k], datatype, NCT_UINT)) {
-			++nInExtRange;
-			if (expect[k] >= uint_min && expect[k] <= uint_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_uint(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_UINT)
-                            && expect[k] >= uint_min && expect[k] <= uint_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_UINT)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_UINT);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_UINT)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= uint_min && expect[k] <= uint_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_uint(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_UINT) && (expect[k] >= uint_min && expect[k] <= uint_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_UINT)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type longlong
  */
-static
-void
-check_atts_longlong(int  ncid)
+int
+check_atts_longlong(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    longlong value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    longlong value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_LONGLONG);
-		    if (inRange3(expect[k], datatype, NCT_LONGLONG)) {
-			++nInExtRange;
-			if (expect[k] >= longlong_min && expect[k] <= longlong_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_longlong(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_LONGLONG)
-                            && expect[k] >= longlong_min && expect[k] <= longlong_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_LONGLONG)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_LONGLONG);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_LONGLONG)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= longlong_min && expect[k] <= longlong_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_longlong(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_LONGLONG) && (expect[k] >= longlong_min && expect[k] <= longlong_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_LONGLONG)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type ulonglong
  */
-static
-void
-check_atts_ulonglong(int  ncid)
+int
+check_atts_ulonglong(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    ulonglong value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    size_t k, length, ndx[1];
     nc_type datatype;
-    double expect[MAX_NELS];
-    size_t length;
     size_t nInExtRange;  /* number values within external range */
     size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    double expect[MAX_NELS];
+    ulonglong value[MAX_NELS];
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_ULONGLONG);
-		    if (inRange3(expect[k], datatype, NCT_ULONGLONG)) {
-			++nInExtRange;
-			if (expect[k] >= ulonglong_min && expect[k] <= ulonglong_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_ulonglong(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
-                }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_ULONGLONG)
-                            && expect[k] >= ulonglong_min && expect[k] <= ulonglong_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_ULONGLONG)) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+            if (!canConvert) continue;
+
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s",  nc_strerror(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_ULONGLONG);
+                if (inRange3(cdf_format, expect[k], datatype, NCT_ULONGLONG)) {
+                    ++nInExtRange;
+                    if ((expect[k] >= ulonglong_min && expect[k] <= ulonglong_max))
+                        ++nInIntRange;
+                }
+            }
+            err =  nc_get_att_ulonglong(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    error("expecting NC_NOERR or NC_ERANGE but got %s",nc_err_code_name(err));
+            }
+            for (k = 0; k < length; k++) {
+                if (inRange3(cdf_format, (double)expect[k],datatype,NCT_ULONGLONG) && (expect[k] >= ulonglong_min && expect[k] <= ulonglong_max)) {
+                    
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_ULONGLONG)) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 
 
 
 
-void
+int
 test_nc_put_var1_text(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    text value = 5;	/* any value would do - only for error cases */
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    text value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
-            index[j] = 0;
-        err = nc_put_var1_text(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_text(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_text(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
-        }
-        for (j = 0; j < var_nels[i]; j++) {
-            err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_text( var_type[i], var_rank[i], index, NCT_TEXT);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_text(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_text(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_TEXT)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_text(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_text(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-void
-test_nc_put_var1_uchar(void)
-{
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    uchar value = 5;	/* any value would do - only for error cases */
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_text(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+        value[0] = 5;  /* reset to a value within bounds */
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_text(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_text(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
             index[j] = 0;
-        err = nc_put_var1_uchar(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_uchar(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_uchar(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_uchar( var_type[i], var_rank[i], index, NCT_UCHAR);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_uchar(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_uchar(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_UCHAR)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uchar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_text(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_TEXT);
+            err = nc_put_var1_text(ncid, i, index, value);
+            if (canConvert) {
+                if (1) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
 
-void
-test_nc_put_var1_schar(void)
-{
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    schar value = 5;	/* any value would do - only for error cases */
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
-            index[j] = 0;
-        err = nc_put_var1_schar(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_schar(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_schar(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
-        }
-        for (j = 0; j < var_nels[i]; j++) {
-            err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_schar( var_type[i], var_rank[i], index, NCT_SCHAR);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_schar(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_schar(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_SCHAR)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_schar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_text(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var1_short(void)
+int
+test_nc_put_var1_uchar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    short value = 5;	/* any value would do - only for error cases */
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    uchar value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_uchar(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_uchar(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_uchar(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_uchar(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
             index[j] = 0;
-        err = nc_put_var1_short(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_short(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_short(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_short( var_type[i], var_rank[i], index, NCT_SHORT);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_short(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_short(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_SHORT)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_short(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_uchar(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_UCHAR);
+            err = nc_put_var1_uchar(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_UCHAR)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_uchar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var1_int(void)
+int
+test_nc_put_var1_schar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int value = 5;	/* any value would do - only for error cases */
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    schar value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_schar(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_schar(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_schar(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_schar(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
             index[j] = 0;
-        err = nc_put_var1_int(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_int(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_int(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_int( var_type[i], var_rank[i], index, NCT_INT);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_int(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_int(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_INT)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_int(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_schar(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_SCHAR);
+            err = nc_put_var1_schar(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_SCHAR)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_schar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var1_long(void)
+int
+test_nc_put_var1_short(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    long value = 5;	/* any value would do - only for error cases */
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    short value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_short(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_short(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_short(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_short(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
             index[j] = 0;
-        err = nc_put_var1_long(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_long(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_long(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_long( var_type[i], var_rank[i], index, NCT_LONG);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_long(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_long(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_LONG)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_long(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_short(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_SHORT);
+            err = nc_put_var1_short(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_SHORT)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
 
-void
-test_nc_put_var1_float(void)
-{
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    float value = 5;	/* any value would do - only for error cases */
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
-            index[j] = 0;
-        err = nc_put_var1_float(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_float(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_float(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
-        }
-        for (j = 0; j < var_nels[i]; j++) {
-            err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_float( var_type[i], var_rank[i], index, NCT_FLOAT);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_float(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_float(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_FLOAT)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_float(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_short(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var1_double(void)
+int
+test_nc_put_var1_int(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    double value = 5;	/* any value would do - only for error cases */
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    int value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_int(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_int(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_int(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_int(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
             index[j] = 0;
-        err = nc_put_var1_double(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_double(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_double(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_double( var_type[i], var_rank[i], index, NCT_DOUBLE);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_double(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_double(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_DOUBLE)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_double(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_int(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_INT);
+            err = nc_put_var1_int(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_INT)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
 
-void
-test_nc_put_var1_ushort(void)
-{
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    ushort value = 5;	/* any value would do - only for error cases */
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
-            index[j] = 0;
-        err = nc_put_var1_ushort(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_ushort(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_ushort(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
-        }
-        for (j = 0; j < var_nels[i]; j++) {
-            err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_ushort( var_type[i], var_rank[i], index, NCT_USHORT);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_ushort(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_ushort(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_USHORT)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ushort(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_int(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var1_uint(void)
+int
+test_nc_put_var1_long(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    uint value = 5;	/* any value would do - only for error cases */
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    long value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_long(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_long(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_long(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_long(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
             index[j] = 0;
-        err = nc_put_var1_uint(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_uint(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_uint(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_uint( var_type[i], var_rank[i], index, NCT_UINT);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_uint(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_uint(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_UINT)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uint(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_long(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_LONG);
+            err = nc_put_var1_long(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_LONG)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
 
-void
-test_nc_put_var1_longlong(void)
-{
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    longlong value = 5;	/* any value would do - only for error cases */
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
-            index[j] = 0;
-        err = nc_put_var1_longlong(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_longlong(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_longlong(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
-        }
-        for (j = 0; j < var_nels[i]; j++) {
-            err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_longlong( var_type[i], var_rank[i], index, NCT_LONGLONG);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_longlong(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_longlong(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_LONGLONG)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_longlong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_long(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var1_ulonglong(void)
+int
+test_nc_put_var1_float(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    ulonglong value = 5;	/* any value would do - only for error cases */
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    float value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_float(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_float(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_float(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_float(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
             index[j] = 0;
-        err = nc_put_var1_ulonglong(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_ulonglong(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_ulonglong(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_ulonglong( var_type[i], var_rank[i], index, NCT_ULONGLONG);
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_ulonglong(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_ulonglong(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_ULONGLONG)) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ulonglong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_float(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_FLOAT);
+            err = nc_put_var1_float(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_FLOAT)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
 
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
 
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
+    nok += check_vars_float(scratch, numVars);
 
-void
-test_nc_put_var_text(void)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_var1_double(void)
 {
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    text value[MAX_NELS];
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    double value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_double(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_double(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_text(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_text(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_text(var_type[i], var_rank[i], index, NCT_TEXT);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_TEXT);
-	}
-        err = nc_put_var_text(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_text(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_text(var_type[i], var_rank[i], index, NCT_TEXT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_TEXT);
-	    }
-	    err = nc_put_var_text(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_text(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        value[0] = 5;  /* reset to a value within bounds */
 
-void
-test_nc_put_var_uchar(void)
-{
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    uchar value[MAX_NELS];
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_double(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_double(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_double(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_DOUBLE);
+            err = nc_put_var1_double(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_DOUBLE)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_uchar(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_uchar(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_uchar(var_type[i], var_rank[i], index, NCT_UCHAR);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_UCHAR);
-	}
-        err = nc_put_var_uchar(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_uchar(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_uchar(var_type[i], var_rank[i], index, NCT_UCHAR);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_UCHAR);
-	    }
-	    err = nc_put_var_uchar(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uchar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    nok += check_vars_double(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var_schar(void)
+int
+test_nc_put_var1_ushort(void)
 {
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    schar value[MAX_NELS];
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    ushort value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_ushort(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_ushort(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_schar(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_schar(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_schar(var_type[i], var_rank[i], index, NCT_SCHAR);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_SCHAR);
-	}
-        err = nc_put_var_schar(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_schar(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_schar(var_type[i], var_rank[i], index, NCT_SCHAR);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_SCHAR);
-	    }
-	    err = nc_put_var_schar(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_schar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        value[0] = 5;  /* reset to a value within bounds */
 
-void
-test_nc_put_var_short(void)
-{
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    short value[MAX_NELS];
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_ushort(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_ushort(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_ushort(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_USHORT);
+            err = nc_put_var1_ushort(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_USHORT)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_short(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_short(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_short(var_type[i], var_rank[i], index, NCT_SHORT);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_SHORT);
-	}
-        err = nc_put_var_short(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_short(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_short(var_type[i], var_rank[i], index, NCT_SHORT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_SHORT);
-	    }
-	    err = nc_put_var_short(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_short(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    nok += check_vars_ushort(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var_int(void)
+int
+test_nc_put_var1_uint(void)
 {
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    int value[MAX_NELS];
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    uint value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_uint(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_uint(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_int(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_int(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_int(var_type[i], var_rank[i], index, NCT_INT);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_INT);
-	}
-        err = nc_put_var_int(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_int(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_int(var_type[i], var_rank[i], index, NCT_INT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_INT);
-	    }
-	    err = nc_put_var_int(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_int(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        value[0] = 5;  /* reset to a value within bounds */
 
-void
-test_nc_put_var_long(void)
-{
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    long value[MAX_NELS];
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_uint(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_uint(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_uint(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_UINT);
+            err = nc_put_var1_uint(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_UINT)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_long(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_long(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_long(var_type[i], var_rank[i], index, NCT_LONG);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_LONG);
-	}
-        err = nc_put_var_long(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_long(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_long(var_type[i], var_rank[i], index, NCT_LONG);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_LONG);
-	    }
-	    err = nc_put_var_long(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_long(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    nok += check_vars_uint(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var_float(void)
+int
+test_nc_put_var1_longlong(void)
 {
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    float value[MAX_NELS];
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    longlong value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_longlong(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_longlong(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_float(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_float(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_float(var_type[i], var_rank[i], index, NCT_FLOAT);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_FLOAT);
-	}
-        err = nc_put_var_float(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_float(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_float(var_type[i], var_rank[i], index, NCT_FLOAT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_FLOAT);
-	    }
-	    err = nc_put_var_float(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_float(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        value[0] = 5;  /* reset to a value within bounds */
 
-void
-test_nc_put_var_double(void)
-{
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    double value[MAX_NELS];
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_longlong(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_longlong(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_longlong(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_LONGLONG);
+            err = nc_put_var1_longlong(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_LONGLONG)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_double(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_double(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_double(var_type[i], var_rank[i], index, NCT_DOUBLE);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_DOUBLE);
-	}
-        err = nc_put_var_double(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_double(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_double(var_type[i], var_rank[i], index, NCT_DOUBLE);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_DOUBLE);
-	    }
-	    err = nc_put_var_double(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_double(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    nok += check_vars_longlong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var_ushort(void)
+int
+test_nc_put_var1_ulonglong(void)
 {
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    ushort value[MAX_NELS];
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    size_t j, index[MAX_RANK];
+    ulonglong value[1];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1_ulonglong(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1_ulonglong(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_ushort(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_ushort(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_ushort(var_type[i], var_rank[i], index, NCT_USHORT);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_USHORT);
-	}
-        err = nc_put_var_ushort(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_ushort(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_ushort(var_type[i], var_rank[i], index, NCT_USHORT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_USHORT);
-	    }
-	    err = nc_put_var_ushort(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ushort(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        value[0] = 5;  /* reset to a value within bounds */
 
-void
-test_nc_put_var_uint(void)
-{
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    uint value[MAX_NELS];
+        /* check if can detect a bad file ID */
+        err = nc_put_var1_ulonglong(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = nc_put_var1_ulonglong(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_ulonglong(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_ULONGLONG);
+            err = nc_put_var1_ulonglong(ncid, i, index, value);
+            if (canConvert) {
+                if (inRange3(cdf_format, (double)value[0],var_type[i],NCT_ULONGLONG)) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_uint(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_uint(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_uint(var_type[i], var_rank[i], index, NCT_UINT);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_UINT);
-	}
-        err = nc_put_var_uint(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_uint(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_uint(var_type[i], var_rank[i], index, NCT_UINT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_UINT);
-	    }
-	    err = nc_put_var_uint(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uint(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    nok += check_vars_ulonglong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_var_longlong(void)
+
+
+
+int
+test_nc_put_var_text(void)
 {
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    longlong value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    text value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_text(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_text(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_longlong(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_longlong(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_longlong(var_type[i], var_rank[i], index, NCT_LONGLONG);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_LONGLONG);
-	}
-        err = nc_put_var_longlong(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
-    index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
 
-    for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_longlong(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_longlong(var_type[i], var_rank[i], index, NCT_LONGLONG);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_LONGLONG);
-	    }
-	    err = nc_put_var_longlong(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_longlong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-void
-test_nc_put_var_ulonglong(void)
-{
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    ulonglong value[MAX_NELS];
+        value[0] = 5;  /* reset to a value within bounds */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        /* check if can detect a bad file ID */
+        err = nc_put_var_text(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_text(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_TEXT);
+            if (var_type[i] != NC_CHAR)
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_TEXT);
+        }
+        err = nc_put_var_text(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_ulonglong(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_ulonglong(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_ulonglong(var_type[i], var_rank[i], index, NCT_ULONGLONG);
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_ULONGLONG);
-	}
-        err = nc_put_var_ulonglong(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
-    }
-
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
     index[0] = NRECS-1;
     err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_ulonglong(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_ulonglong(var_type[i], var_rank[i], index, NCT_ULONGLONG);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_ULONGLONG);
-	    }
-	    err = nc_put_var_ulonglong(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ulonglong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
 
+        canConvert = (var_type[i] == NC_CHAR) ;
 
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_text(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_TEXT);
+            if (var_type[i] != NC_CHAR)
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_TEXT);
+        }
+        err = nc_put_var_text(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
 
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-void
-test_nc_put_vara_text(void)
+    nok += check_vars_text(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_var_uchar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    text value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    uchar value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_uchar(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_uchar(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_text(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_text(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_text(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_text(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_text(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-        }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_text(var_type[i], var_rank[i], index, NCT_TEXT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_TEXT);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_text(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_text(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_text(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-void
-test_nc_put_vara_uchar(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    uchar value[MAX_NELS];
+        value[0] = 5;  /* reset to a value within bounds */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        /* check if can detect a bad file ID */
+        err = nc_put_var_uchar(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_uchar(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_UCHAR);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_UCHAR);
         }
-    }
-    }
+        err = nc_put_var_uchar(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 #endif
 
-    value[0] = 0;
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
+
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_uchar(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_uchar(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_uchar(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_uchar(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_uchar(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_uchar(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_UCHAR);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_UCHAR);
         }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
+        err = nc_put_var_uchar(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_uchar(var_type[i], var_rank[i], index, NCT_UCHAR);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_UCHAR);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_uchar(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_uchar(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uchar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_uchar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vara_schar(void)
+int
+test_nc_put_var_schar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
     schar value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_schar(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_schar(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_schar(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_schar(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_schar(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_schar(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_schar(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-        }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_schar(var_type[i], var_rank[i], index, NCT_SCHAR);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_SCHAR);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_schar(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_schar(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_schar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-void
-test_nc_put_vara_short(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    short value[MAX_NELS];
+        value[0] = 5;  /* reset to a value within bounds */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        /* check if can detect a bad file ID */
+        err = nc_put_var_schar(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_schar(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_SCHAR);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_SCHAR);
         }
-    }
-    }
+        err = nc_put_var_schar(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
 #endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_short(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_short(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_short(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_short(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_short(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_schar(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_SCHAR);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_SCHAR);
         }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
+        err = nc_put_var_schar(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_short(var_type[i], var_rank[i], index, NCT_SHORT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_SHORT);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_short(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_short(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_short(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_schar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vara_int(void)
+int
+test_nc_put_var_short(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    int value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    short value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_short(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_short(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_int(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_int(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_int(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_int(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_int(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-        }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_int(var_type[i], var_rank[i], index, NCT_INT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_INT);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_int(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_int(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_int(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-void
-test_nc_put_vara_long(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    long value[MAX_NELS];
+        value[0] = 5;  /* reset to a value within bounds */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        /* check if can detect a bad file ID */
+        err = nc_put_var_short(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
 
-    value[0] = 0;
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_long(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_long(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_long(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_long(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_long(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_short(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_SHORT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_SHORT);
         }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
-
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_long(var_type[i], var_rank[i], index, NCT_LONG);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_LONG);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_long(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_long(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_long(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        err = nc_put_var_short(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
 
-void
-test_nc_put_vara_float(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    float value[MAX_NELS];
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    value[0] = 0;
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
+
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_float(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_float(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_float(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_float(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_float(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_short(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_SHORT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_SHORT);
         }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
+        err = nc_put_var_short(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_float(var_type[i], var_rank[i], index, NCT_FLOAT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_FLOAT);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_float(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_float(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_float(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_short(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vara_double(void)
+int
+test_nc_put_var_int(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    double value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    int value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_int(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_int(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_double(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_double(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_double(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_double(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_double(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-        }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_double(var_type[i], var_rank[i], index, NCT_DOUBLE);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_DOUBLE);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_double(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_double(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_double(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-void
-test_nc_put_vara_ushort(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    ushort value[MAX_NELS];
+        value[0] = 5;  /* reset to a value within bounds */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        /* check if can detect a bad file ID */
+        err = nc_put_var_int(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_int(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_INT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_INT);
+        }
+        err = nc_put_var_int(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    value[0] = 0;
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
+
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_ushort(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_ushort(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_ushort(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_ushort(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_ushort(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_int(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_INT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_INT);
         }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
+        err = nc_put_var_int(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_ushort(var_type[i], var_rank[i], index, NCT_USHORT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_USHORT);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_ushort(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_ushort(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ushort(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_int(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vara_uint(void)
+int
+test_nc_put_var_long(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    uint value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    long value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_long(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_long(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_uint(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_uint(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_uint(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_uint(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_uint(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-        }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_uint(var_type[i], var_rank[i], index, NCT_UINT);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_UINT);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_uint(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_uint(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uint(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-void
-test_nc_put_vara_longlong(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    longlong value[MAX_NELS];
+        value[0] = 5;  /* reset to a value within bounds */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+        /* check if can detect a bad file ID */
+        err = nc_put_var_long(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_long(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_LONG);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_LONG);
+        }
+        err = nc_put_var_long(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    value[0] = 0;
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
+
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-        assert(var_rank[i] <= MAX_RANK);
-        assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_longlong(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_longlong(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_longlong(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_longlong(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_longlong(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_long(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_LONG);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_LONG);
         }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
+        err = nc_put_var_long(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_longlong(var_type[i], var_rank[i], index, NCT_LONGLONG);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_LONGLONG);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_longlong(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_longlong(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_longlong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_long(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vara_ulonglong(void)
+int
+test_nc_put_var_float(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    ulonglong value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    float value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_float(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_float(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        for (j = 0; j < var_rank[i]; j++) {
-            start[j] = 0;
-            edge[j] = 1;
-	}
-        err = nc_put_vara_ulonglong(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_ulonglong(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
-        }
-
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-        }
-*/
-        for (j = 0; j < var_rank[i]; j++) {
-            edge[j] = 1;
-	}
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-            mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
-            for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_ulonglong(var_type[i], var_rank[i], index, NCT_ULONGLONG);
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_ULONGLONG);
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_ulonglong(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-            }
-        }
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ulonglong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
-}
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
+        value[0] = 5;  /* reset to a value within bounds */
 
+        /* check if can detect a bad file ID */
+        err = nc_put_var_float(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
 
-void
-test_nc_put_vars_text(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    text value[MAX_NELS];
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_float(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_FLOAT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_FLOAT);
+        }
+        err = nc_put_var_float(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_text(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_text(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_text(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_text(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_text(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_text(var_type[i], var_rank[i], index2, 
-			NCT_TEXT);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_TEXT);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_text(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_text(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_text(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
-}
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
 
-void
-test_nc_put_vars_uchar(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    uchar value[MAX_NELS];
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+    for (i = 0; i < numVars; i++) {
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_float(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_FLOAT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_FLOAT);
+        }
+        err = nc_put_var_float(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_uchar(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_uchar(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_uchar(var_type[i], var_rank[i], index2, 
-			NCT_UCHAR);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_UCHAR);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_uchar(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_uchar(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uchar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_float(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vars_schar(void)
+int
+test_nc_put_var_double(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    schar value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    double value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_double(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_double(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_schar(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_schar(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_schar(var_type[i], var_rank[i], index2, 
-			NCT_SCHAR);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_SCHAR);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_schar(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_schar(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_schar(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
-}
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
 
-void
-test_nc_put_vars_short(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    short value[MAX_NELS];
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+        value[0] = 5;  /* reset to a value within bounds */
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+        /* check if can detect a bad file ID */
+        err = nc_put_var_double(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_short(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_short(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_short(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_short(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_short(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_short(var_type[i], var_rank[i], index2, 
-			NCT_SHORT);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_SHORT);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_short(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_short(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_short(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
-}
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
 
-void
-test_nc_put_vars_int(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    int value[MAX_NELS];
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_double(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_DOUBLE);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_DOUBLE);
+        }
+        err = nc_put_var_double(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_int(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_int(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_int(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_int(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_int(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_int(var_type[i], var_rank[i], index2, 
-			NCT_INT);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_INT);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_int(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_int(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_int(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
-}
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
 
-void
-test_nc_put_vars_long(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    long value[MAX_NELS];
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+    for (i = 0; i < numVars; i++) {
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_double(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_DOUBLE);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_DOUBLE);
+        }
+        err = nc_put_var_double(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_long(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_long(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_long(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_long(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_long(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_long(var_type[i], var_rank[i], index2, 
-			NCT_LONG);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_LONG);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_long(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_long(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_long(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_double(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vars_float(void)
+int
+test_nc_put_var_ushort(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    float value[MAX_NELS];
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    ushort value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_ushort(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_ushort(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_float(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_float(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_float(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_float(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_float(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_float(var_type[i], var_rank[i], index2, 
-			NCT_FLOAT);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_FLOAT);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_float(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_float(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_float(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
-}
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
 
-void
-test_nc_put_vars_double(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    double value[MAX_NELS];
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
-    }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+        value[0] = 5;  /* reset to a value within bounds */
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+        /* check if can detect a bad file ID */
+        err = nc_put_var_ushort(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_ushort(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_USHORT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_USHORT);
         }
-    }
-    }
-#endif
+        err = nc_put_var_ushort(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_double(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_double(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_double(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_double(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_double(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_double(var_type[i], var_rank[i], index2, 
-			NCT_DOUBLE);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_DOUBLE);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_double(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_double(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_double(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
-}
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
 
-void
-test_nc_put_vars_ushort(void)
-{
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
-    ushort value[MAX_NELS];
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
-    def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
+
+    for (i = 0; i < numVars; i++) {
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_ushort(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_USHORT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_USHORT);
+        }
+        err = nc_put_var_ushort(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_ushort(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_ushort(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_ushort(var_type[i], var_rank[i], index2, 
-			NCT_USHORT);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_USHORT);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_ushort(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_ushort(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ushort(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_ushort(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vars_uint(void)
+int
+test_nc_put_var_uint(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
     uint value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_uint(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_uint(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var_uint(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_uint(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_UINT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_UINT);
+        }
+        err = nc_put_var_uint(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
         }
     }
-    }
-#endif
+
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_uint(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_uint(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
-/* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
-*/
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_uint(var_type[i], var_rank[i], index2, 
-			NCT_UINT);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_UINT);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_uint(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_uint(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_uint(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_uint(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_UINT);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_UINT);
+        }
+        err = nc_put_var_uint(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_uint(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
-test_nc_put_vars_longlong(void)
+int
+test_nc_put_var_longlong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
     longlong value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_longlong(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_longlong(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var_longlong(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_longlong(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_LONGLONG);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_LONGLONG);
+        }
+        err = nc_put_var_longlong(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
+
+    for (i = 0; i < numVars; i++) {
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_longlong(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_LONGLONG);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_LONGLONG);
+        }
+        err = nc_put_var_longlong(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_longlong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_var_ulonglong(void)
+{
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, index[MAX_RANK];
+    ulonglong value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var_ulonglong(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var_ulonglong(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_var_ulonglong(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_ulonglong(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_ULONGLONG);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_ULONGLONG);
+        }
+        err = nc_put_var_ulonglong(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+            
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err =  nc_inq_varid(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s",  nc_strerror(err));
+    index[0] = NRECS-1;
+    err = nc_put_var1_text(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s",  nc_strerror(err));
+
+    for (i = 0; i < numVars; i++) {
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_ulonglong(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_ULONGLONG);
+            
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_ULONGLONG);
+        }
+        err = nc_put_var_ulonglong(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_ulonglong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+
+
+
+int
+test_nc_put_vara_text(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    text value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_text(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_text(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_text(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_text(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_text(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_text(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_text(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_text(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_TEXT);
+                if (var_type[i] != NC_CHAR)
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_TEXT);
+            }
+            err = nc_put_vara_text(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_text(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_uchar(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    uchar value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_uchar(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_uchar(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_uchar(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_uchar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_uchar(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_uchar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_uchar(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_uchar(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_UCHAR);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_UCHAR);
+            }
+            err = nc_put_vara_uchar(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_uchar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_schar(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    schar value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_schar(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_schar(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_schar(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_schar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_schar(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_schar(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_schar(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_schar(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_SCHAR);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_SCHAR);
+            }
+            err = nc_put_vara_schar(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_schar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_short(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    short value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_short(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_short(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_short(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_short(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_short(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_short(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_short(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_short(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_SHORT);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_SHORT);
+            }
+            err = nc_put_vara_short(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_short(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_int(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    int value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_int(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_int(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_int(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_int(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_int(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_int(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_int(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_int(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_INT);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_INT);
+            }
+            err = nc_put_vara_int(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_int(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_long(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    long value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_long(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_long(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_long(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_long(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_long(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_long(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_long(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_long(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_LONG);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_LONG);
+            }
+            err = nc_put_vara_long(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_long(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_float(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    float value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_float(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_float(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_float(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_float(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_float(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_float(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_float(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_float(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_FLOAT);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_FLOAT);
+            }
+            err = nc_put_vara_float(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_float(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_double(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    double value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_double(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_double(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_double(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_double(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_double(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_double(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_double(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_double(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_DOUBLE);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_DOUBLE);
+            }
+            err = nc_put_vara_double(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_double(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_ushort(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    ushort value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_ushort(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_ushort(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_ushort(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_ushort(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_ushort(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_ushort(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_ushort(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_ushort(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_USHORT);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_USHORT);
+            }
+            err = nc_put_vara_ushort(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_ushort(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_uint(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    uint value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_uint(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_uint(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_uint(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_uint(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_uint(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_uint(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_uint(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_uint(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_UINT);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_UINT);
+            }
+            err = nc_put_vara_uint(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_uint(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_longlong(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    longlong value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_longlong(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_longlong(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_longlong(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_longlong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_longlong(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_longlong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_longlong(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_longlong(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_LONGLONG);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_LONGLONG);
+            }
+            err = nc_put_vara_longlong(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_longlong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vara_ulonglong(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    size_t j, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK];
+    size_t mid[MAX_RANK], index[MAX_RANK];
+    ulonglong value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara_ulonglong(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara_ulonglong(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara_ulonglong(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
+            for (allInExtRange = 1, j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_ulonglong(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_ULONGLONG);
+                
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_ULONGLONG);
+            }
+            err = nc_put_vara_ulonglong(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            } else {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_ulonglong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+
+
+
+int
+test_nc_put_vars_text(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    text value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_text(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_text(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_text(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_text(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_text(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_text(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_text(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_text(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_text(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_TEXT);
+                    if (var_type[i] != NC_CHAR)
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_TEXT);
+                }
+                err = nc_put_vars_text(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_text(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_uchar(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    uchar value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_uchar(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_uchar(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_uchar(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_uchar(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_uchar(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_UCHAR);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_UCHAR);
+                }
+                err = nc_put_vars_uchar(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_uchar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_schar(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    schar value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_schar(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_schar(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_schar(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_schar(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_schar(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_SCHAR);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_SCHAR);
+                }
+                err = nc_put_vars_schar(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_schar(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_short(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    short value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_short(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_short(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_short(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_short(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_short(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_short(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_short(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_short(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_short(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_SHORT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_SHORT);
+                }
+                err = nc_put_vars_short(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_short(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_int(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    int value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_int(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_int(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_int(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_int(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_int(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_int(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_int(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_int(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_int(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_INT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_INT);
+                }
+                err = nc_put_vars_int(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_int(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_long(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    long value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_long(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_long(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_long(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_long(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_long(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_long(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_long(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_long(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_long(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_LONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_LONG);
+                }
+                err = nc_put_vars_long(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_long(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_float(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    float value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_float(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_float(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_float(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_float(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_float(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_float(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_float(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_float(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_float(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_FLOAT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_FLOAT);
+                }
+                err = nc_put_vars_float(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_float(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_double(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    double value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_double(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_double(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_double(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_double(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_double(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_double(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_double(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_double(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_double(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_DOUBLE);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_DOUBLE);
+                }
+                err = nc_put_vars_double(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_double(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_ushort(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    ushort value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_ushort(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_ushort(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_ushort(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_ushort(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_ushort(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_USHORT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_USHORT);
+                }
+                err = nc_put_vars_ushort(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_ushort(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_uint(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    uint value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_uint(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_uint(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_uint(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_uint(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+*/
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_uint(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_UINT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_UINT);
+                }
+                err = nc_put_vars_uint(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_uint(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
+}
+
+int
+test_nc_put_vars_longlong(void)
+{
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK];
+    longlong value[MAX_NELS];
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
+    }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
+    def_dims(ncid);
+    def_vars(ncid);
+
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_longlong(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_longlong(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_longlong(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_longlong(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_longlong(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_longlong(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
 */
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_longlong(var_type[i], var_rank[i], index2, 
-			NCT_LONGLONG);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_LONGLONG);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_longlong(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_longlong(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_longlong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_longlong(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_LONGLONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_LONGLONG);
+                }
+                err = nc_put_vars_longlong(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_longlong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_vars_ulonglong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
+    ptrdiff_t nstarts;   /* number of different starts */
     ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
     ulonglong value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars_ulonglong(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars_ulonglong(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars_ulonglong(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
         }
-    }
-    }
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_ulonglong(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_ulonglong(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_ulonglong(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
 */
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_ulonglong(var_type[i], var_rank[i], index2, 
-			NCT_ULONGLONG);
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_ULONGLONG);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_ulonglong(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_ulonglong(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
-    }
-
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
-
-    check_vars_ulonglong(scratch);
-
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_ulonglong(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_ULONGLONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_ULONGLONG);
+                }
+                err = nc_put_vars_ulonglong(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+                } else {
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    nok += check_vars_ulonglong(scratch, numVars);
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
 
 
 
-void
+int
 test_nc_put_varm_text(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     text value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_text(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_text(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_text(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) ;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_text(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_text(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_text(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_text(var_type[i], var_rank[i], index2,
-                        NCT_TEXT);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_TEXT);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_text(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_text(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_text(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_TEXT);
+                    if (var_type[i] != NC_CHAR)
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_TEXT);
+                }
+                err = nc_put_varm_text(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_text(scratch);
+    nok += check_vars_text(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_uchar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     uchar value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_uchar(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_uchar(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_uchar(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_uchar(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_uchar(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_uchar(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_uchar(var_type[i], var_rank[i], index2,
-                        NCT_UCHAR);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_UCHAR);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_uchar(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_uchar(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_uchar(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_UCHAR);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_UCHAR);
+                }
+                err = nc_put_varm_uchar(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+#endif
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_uchar(scratch);
+    nok += check_vars_uchar(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_schar(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     schar value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_schar(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_schar(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_schar(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_schar(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_schar(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_schar(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_schar(var_type[i], var_rank[i], index2,
-                        NCT_SCHAR);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_SCHAR);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_schar(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_schar(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_schar(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_SCHAR);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_SCHAR);
+                }
+                err = nc_put_varm_schar(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_schar(scratch);
+    nok += check_vars_schar(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_short(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     short value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_short(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_short(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_short(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_short(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_short(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_short(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_short(var_type[i], var_rank[i], index2,
-                        NCT_SHORT);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_SHORT);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_short(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_short(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_short(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_SHORT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_SHORT);
+                }
+                err = nc_put_varm_short(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_short(scratch);
+    nok += check_vars_short(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_int(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     int value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_int(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_int(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_int(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_int(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_int(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_int(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_int(var_type[i], var_rank[i], index2,
-                        NCT_INT);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_INT);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_int(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_int(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_int(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_INT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_INT);
+                }
+                err = nc_put_varm_int(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_int(scratch);
+    nok += check_vars_int(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_long(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     long value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_long(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_long(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_long(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_long(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_long(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_long(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_long(var_type[i], var_rank[i], index2,
-                        NCT_LONG);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_LONG);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_long(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_long(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_long(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_LONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_LONG);
+                }
+                err = nc_put_varm_long(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_long(scratch);
+    nok += check_vars_long(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_float(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     float value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_float(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_float(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_float(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_float(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_float(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_float(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_float(var_type[i], var_rank[i], index2,
-                        NCT_FLOAT);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_FLOAT);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_float(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_float(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_float(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_FLOAT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_FLOAT);
+                }
+                err = nc_put_varm_float(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_float(scratch);
+    nok += check_vars_float(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_double(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     double value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_double(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_double(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_double(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_double(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_double(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_double(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_double(var_type[i], var_rank[i], index2,
-                        NCT_DOUBLE);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_DOUBLE);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_double(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_double(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_double(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_DOUBLE);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_DOUBLE);
+                }
+                err = nc_put_varm_double(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_double(scratch);
+    nok += check_vars_double(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_ushort(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     ushort value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_ushort(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_ushort(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_ushort(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_USHORT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_ushort(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_ushort(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_ushort(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_ushort(var_type[i], var_rank[i], index2,
-                        NCT_USHORT);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_USHORT);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_ushort(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_ushort(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_ushort(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_USHORT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_USHORT);
+                }
+                err = nc_put_varm_ushort(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_ushort(scratch);
+    nok += check_vars_ushort(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_uint(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     uint value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_uint(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_uint(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_uint(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_UINT == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_uint(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_uint(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_uint(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_uint(var_type[i], var_rank[i], index2,
-                        NCT_UINT);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_UINT);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_uint(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_uint(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_uint(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_UINT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_UINT);
+                }
+                err = nc_put_varm_uint(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_uint(scratch);
+    nok += check_vars_uint(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_longlong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     longlong value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_longlong(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_longlong(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_longlong(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_LONGLONG == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_longlong(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_longlong(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_longlong(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_longlong(var_type[i], var_rank[i], index2,
-                        NCT_LONGLONG);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_LONGLONG);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_longlong(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_longlong(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_longlong(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_LONGLONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_LONGLONG);
+                }
+                err = nc_put_varm_longlong(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_longlong(scratch);
+    nok += check_vars_longlong(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_varm_ulonglong(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    size_t j, m, nels;
+    size_t start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    size_t index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
     size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    ptrdiff_t nstarts;   /* number of different starts */
+    ptrdiff_t stride[MAX_RANK], imap[MAX_RANK];
     ulonglong value[MAX_NELS];
 
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err =  nc_enddef(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm_ulonglong(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm_ulonglong(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm_ulonglong(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ULONGLONG == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_ulonglong(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_ulonglong(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_ulonglong(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (ptrdiff_t)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_ulonglong(var_type[i], var_rank[i], index2,
-                        NCT_ULONGLONG);
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_ULONGLONG);
-                }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_ulonglong(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_ulonglong(ncid,i,index,count,stride,imap,value);
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value[j] = hash_ulonglong(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_ULONGLONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_ULONGLONG);
+                }
+                err = nc_put_varm_ulonglong(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
+                        IF (err != NC_NOERR)
+                            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+                    
+                    else {
+
                         IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
                     }
+
+
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        error("expecting NC_ECHAR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
 
-    check_vars_ulonglong(scratch);
+    nok += check_vars_ulonglong(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
 
 
-void
+int
 test_nc_put_att_text(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, nok=0;
+    size_t k, ndx[1];
     text value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_text(BAD_ID, 0, NULL, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_text(ncid, BAD_VARID, NULL, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     {
-	const char *const tval = "value for bad name";
-	const size_t tval_len = strlen(tval);
-	
-	err = nc_put_att_text(ncid, 0, "", tval_len, tval);
-	IF (err != NC_EBADNAME)
-	   error("should be NC_EBADNAME: status = %d", err);
+        const char *const tval = "value for bad name";
+        const size_t tval_len = (size_t)strlen(tval);
+
+        err = nc_put_att_text(ncid, 0, "", tval_len, tval);
+        IF (err != NC_EBADNAME)
+           error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+        ELSE_NOK
     }
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (ATT_TYPE(i,j) == NC_CHAR) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_text(BAD_ID, i, ATT_NAME(i,j), ATT_LEN(i,j), 
-		    value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_text(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash(ATT_TYPE(i,j), -1, &k);
-		}
-		err = nc_put_att_text(ncid, i, ATT_NAME(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err) {
-		    error("%s", nc_strerror(err));
-		}
-	    }
-        }
-    }
-
-    check_atts_text(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_text(ncid, BAD_VARID, ATT_NAME(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    double dtmp = hash(ATT_TYPE(i,j), -1, ndx);
+                    value[k] = (text)dtmp;
+                }
+                err = nc_put_att_text(ncid, i, ATT_NAME(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
+        }
+    }
+
+    nok += check_atts_text(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
 
 
-void
+int
 test_nc_put_att_uchar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    uchar value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    uchar value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_uchar(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_uchar(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_uchar(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_uchar(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_uchar(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_uchar(ATT_TYPE(i,j), -1, &k, NCT_UCHAR);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_UCHAR);
-		}
-		err = nc_put_att_uchar(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_uchar(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_uchar(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_uchar(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_uchar(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_uchar(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_UCHAR);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_UCHAR);
+                }
+                err = nc_put_att_uchar(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+#if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+#endif
+
+            }
+        }
+    }
+
+    nok += check_atts_uchar(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_schar(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    schar value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    schar value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_schar(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_schar(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_schar(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_schar(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_schar(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_schar(ATT_TYPE(i,j), -1, &k, NCT_SCHAR);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_SCHAR);
-		}
-		err = nc_put_att_schar(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_schar(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_schar(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_schar(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_schar(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_schar(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_SCHAR);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_SCHAR);
+                }
+                err = nc_put_att_schar(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+#if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+#else
+                    else {
+#endif
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_schar(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_short(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    short value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    short value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_short(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_short(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_short(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_short(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_short(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_short(ATT_TYPE(i,j), -1, &k, NCT_SHORT);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_SHORT);
-		}
-		err = nc_put_att_short(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_short(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_short(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_short(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_short(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_short(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_SHORT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_SHORT);
+                }
+                err = nc_put_att_short(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_short(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_int(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    int value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    int value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_int(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_int(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_int(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_int(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_int(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_int(ATT_TYPE(i,j), -1, &k, NCT_INT);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_INT);
-		}
-		err = nc_put_att_int(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_int(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_int(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_int(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_int(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_int(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_INT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_INT);
+                }
+                err = nc_put_att_int(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_int(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_long(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    long value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    long value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_long(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_long(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_long(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_long(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_long(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_long(ATT_TYPE(i,j), -1, &k, NCT_LONG);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_LONG);
-		}
-		err = nc_put_att_long(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_long(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_long(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_long(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_long(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_long(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_LONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_LONG);
+                }
+                err = nc_put_att_long(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_long(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_float(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    float value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    float value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_float(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_float(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_float(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_float(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_float(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_float(ATT_TYPE(i,j), -1, &k, NCT_FLOAT);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_FLOAT);
-		}
-		err = nc_put_att_float(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_float(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_float(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_float(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_float(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_float(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_FLOAT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_FLOAT);
+                }
+                err = nc_put_att_float(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_float(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_double(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    double value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    double value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_double(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_double(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_double(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_double(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_double(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_double(ATT_TYPE(i,j), -1, &k, NCT_DOUBLE);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_DOUBLE);
-		}
-		err = nc_put_att_double(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_double(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_double(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_double(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_double(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_double(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_DOUBLE);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_DOUBLE);
+                }
+                err = nc_put_att_double(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_double(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_ushort(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    ushort value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    ushort value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_ushort(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_ushort(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_ushort(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_ushort(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_ushort(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_ushort(ATT_TYPE(i,j), -1, &k, NCT_USHORT);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_USHORT);
-		}
-		err = nc_put_att_ushort(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_ushort(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_ushort(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_ushort(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_ushort(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_ushort(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_USHORT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_USHORT);
+                }
+                err = nc_put_att_ushort(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_ushort(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_uint(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    uint value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    uint value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_uint(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_uint(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_uint(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_uint(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_uint(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_uint(ATT_TYPE(i,j), -1, &k, NCT_UINT);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_UINT);
-		}
-		err = nc_put_att_uint(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_uint(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_uint(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_uint(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_uint(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_uint(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_UINT);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_UINT);
+                }
+                err = nc_put_att_uint(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_uint(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_longlong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    longlong value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    longlong value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_longlong(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_longlong(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_longlong(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_longlong(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_longlong(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_longlong(ATT_TYPE(i,j), -1, &k, NCT_LONGLONG);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_LONGLONG);
-		}
-		err = nc_put_att_longlong(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_longlong(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_longlong(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_longlong(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_longlong(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_longlong(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_LONGLONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_LONGLONG);
+                }
+                err = nc_put_att_longlong(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_longlong(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
-void
+int
 test_nc_put_att_ulonglong(void)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    ulonglong value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    size_t k, ndx[1];
+    ulonglong value[MAX_NELS];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s",  nc_strerror(err));
+        return nok;
     }
+
+    err =  nc_inq_format(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s",  nc_strerror(err));
+
     def_dims(ncid);
     def_vars(ncid);
 
+    /* check if can detect a bad file ID */
+    err = nc_put_att_ulonglong(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_att_ulonglong(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_ulonglong(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_ulonglong(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_ulonglong(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_ulonglong(ATT_TYPE(i,j), -1, &k, NCT_ULONGLONG);
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_ULONGLONG);
-		}
-		err = nc_put_att_ulonglong(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
-        }
-    }
-
-    check_atts_ulonglong(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = nc_put_att_ulonglong(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = nc_put_att_ulonglong(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    error("expecting NC_EBADNAME but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                err = nc_put_att_ulonglong(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    error("expecting NC_EBADTYPE but got %s",nc_err_code_name(err));
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_ulonglong(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_ULONGLONG);
+                    
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_ULONGLONG);
+                }
+                err = nc_put_att_ulonglong(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                    ELSE_NOK
+                }
+                
+                    else {
+
+                        IF (err != NC_ERANGE)
+                            error("expecting NC_ERANGE but got %s",nc_err_code_name(err));
+                        ELSE_NOK
+                    }
+
+
+            }
+        }
+    }
+
+    nok += check_atts_ulonglong(ncid, numGatts, numVars);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
 
diff --git a/nc_test/test_put.m4 b/nc_test/test_put.m4
index 32601f5..d586b91 100644
--- a/nc_test/test_put.m4
+++ b/nc_test/test_put.m4
@@ -1,18 +1,75 @@
 dnl This is m4 source.
 dnl Process using m4 to produce 'C' language file.
 dnl
+dnl This file is supposed to be the same as PnetCDF's test_put.m4
+dnl
 dnl If you see this line, you can ignore the next one.
 /* Do not edit this file. It is produced from the corresponding .m4 source */
 dnl
-/*********************************************************************
- *   Copyright 1996, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Id: test_put.m4 2785 2014-10-26 05:21:20Z wkliao $
- *********************************************************************/
-
-#ifdef USE_PARALLEL
-#include <mpi.h>
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_put.m4 2672 2016-12-03 19:23:53Z wkliao $ */
+
+dnl
+dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
+dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types
+dnl (MPI_Offset vs. size_t), and function name substrings for external data
+dnl types.
+dnl
+
+#include "tests.h"
+
+ifdef(`PNETCDF',,`dnl
+#ifdef USE_PNETCDF
+#include <pnetcdf.h>
+#ifndef PNETCDF_VERSION_MAJOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
+#endif
+#ifndef PNETCDF_VERSION_MINOR
+#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
 #endif
+#endif')
+
+define(`EXPECT_ERR',`error("expecting $1 but got %s",nc_err_code_name($2));')dnl
+
+define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl
+define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl
+define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_put_$1',`test_nc_put_$1')')dnl
+define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl
+
+define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid)', `file_open($1, $2, &ncid)')')dnl
+define(`FileCreate',`ifdef(`PNETCDF',`ncmpi_create(comm, $1, $2, info, &ncid)', `file_create($1, $2, &ncid)')')dnl
+define(`FileDelete',`ifdef(`PNETCDF',`ncmpi_delete($1,$2)',`nc_delete($1)')')dnl
+
+define(`VarArgs',   `ifdef(`PNETCDF',`int numVars',`void')')dnl
+define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl
+
+define(`PutVar1',`ifdef(`PNETCDF',`ncmpi_put_var1_$1_all',`nc_put_var1_$1')')dnl
+define(`PutVar', `ifdef(`PNETCDF',`ncmpi_put_var_$1_all', `nc_put_var_$1')')dnl
+define(`PutVara',`ifdef(`PNETCDF',`ncmpi_put_vara_$1_all',`nc_put_vara_$1')')dnl
+define(`PutVars',`ifdef(`PNETCDF',`ncmpi_put_vars_$1_all',`nc_put_vars_$1')')dnl
+define(`PutVarm',`ifdef(`PNETCDF',`ncmpi_put_varm_$1_all',`nc_put_varm_$1')')dnl
+define(`PutAtt', `ifdef(`PNETCDF',`ncmpi_put_att_$1',`nc_put_att_$1')')dnl
+define(`GetVar1',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl
+define(`DefVars',`ifdef(`PNETCDF',`def_vars($1,$2)',`def_vars($1)')')dnl
+
+define(`PNETCDF_CHECK_ERANGE',`dnl
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,`
+`#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)')',
+       `$1',`schar',`ifdef(`PNETCDF',,`
+`#'if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
+                    else if (cdf_format < NC_FORMAT_CDF5) {
+`#'else')')
+                    else {
+ifelse(`$1',`schar',`ifdef(`PNETCDF',,``#'endif')')
+                        IF (err != NC_ERANGE)
+                            EXPECT_ERR(NC_ERANGE, err)
+                        ELSE_NOK
+                    }
+ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')'
+)dnl
 
 undefine(`index')dnl
 dnl dnl dnl
@@ -30,10 +87,22 @@ dnl dnl dnl
 dnl
 dnl NCT_ITYPE(type)
 dnl
-define(`NCT_ITYPE', ``NCT_'Upcase($1)')dnl
+define(`NCT_ITYPE',    ``NCT_'Upcase($1)')dnl
+define(`NC_TYPE',      ``NC_'Upcase($1)')dnl
+define(`X_MIN',        ``X_'Upcase($1)_MIN')dnl
+define(`X_MAX',        ``X_'Upcase($1)_MAX')dnl
 dnl
 
-#include "tests.h"
+define(`CheckText', `ifelse(`$1',`text', , `== (NCT_ITYPE($1) == NCT_TEXT)')')dnl
+define(`IfCheckTextChar', `ifelse(`$1',`text', `if ($2 != NC_CHAR)')')dnl
+define(`CheckNumRange',
+       `ifelse(`$1',`text', `1',
+               `inRange3(cdf_format, (double)$2,$3,NCT_ITYPE($1)) && ($2 >= $1_min && $2 <= $1_max)')')dnl
+define(`CheckRange',
+       `ifelse(`$1',`text', `0', `($2 >= $1_min && $2 <= $1_max)')')dnl
+define(`CheckRange3',
+       `ifelse(`$1',`text', `1',
+               `inRange3(cdf_format, (double)$2,$3,NCT_ITYPE($1))')')dnl
 
 dnl HASH(TYPE)
 dnl
@@ -42,18 +111,20 @@ define(`HASH',dnl
 /*
  *  ensure hash value within range for internal TYPE
  */
-static
-double
-hash_$1(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+$1
+hash_$1(const int       cdf_format,
+        const nc_type   type,
+        const int       rank,
+        const IntType  *index,
+        const nct_itype itype)
 {
-    const double min = $1_min;
-    const double max = $1_max;
+    double value;
 
-    return MAX(min, MIN(max, hash4( type, rank, index, itype)));
+    value = hash4(cdf_format, type, rank, index, itype);
+    ifelse(`$1',`text',`return (text)value;',`
+    if (value > $1_max) return $1_max;
+    else if (value < $1_min) return $1_min;
+    else return ($1)value;')
 }
 ')dnl
 
@@ -75,88 +146,92 @@ dnl CHECK_VARS(TYPE)
 dnl
 define(`CHECK_VARS',dnl
 `dnl
-/* 
+/*
  *  check all vars in file which are (text/numeric) compatible with TYPE
  */
-static
-void
-check_vars_$1(const char *filename)
+int
+check_vars_$1(const char *filename, int numVars)
 {
-    int  ncid;                  /* netCDF id */
-    size_t index[MAX_RANK];
-    int  err;           /* status */
-    int  d;
-    int  i;
-    size_t  j;
-    $1 value;
-    nc_type datatype;
-    int ndims;
+    int i, d, err, ncid, cdf_format, ndims;
+    int canConvert;   /* Both text or both numeric */
+    int nok = 0;      /* count of valid comparisons */
     int dimids[MAX_RANK];
-    double expect;
+    nc_type datatype;
     char name[NC_MAX_NAME];
-    size_t length;
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    IntType j, length, index[MAX_RANK];
+    double expect;
+    $1 value;
+
+    err = FileOpen(filename, NC_NOWRITE);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
 
-    err = file_open(filename, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-	if (canConvert) {
-	    err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
-	    IF (err)
-		error("nc_inq_var: %s", nc_strerror(err));
-	    IF (strcmp(name, var_name[i]) != 0)
-		error("Unexpected var_name");
-	    IF (datatype != var_type[i])
-		error("Unexpected type");
-	    IF (ndims != var_rank[i])
-		error("Unexpected rank");
-	    for (j = 0; j < ndims; j++) {
-		err = nc_inq_dim(ncid, dimids[j], 0, &length);
-		IF (err)
-		    error("nc_inq_dim: %s", nc_strerror(err));
-		IF (length != var_shape[i][j])
-		    error("Unexpected shape");
-	    }
-	    for (j = 0; j < var_nels[i]; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err)
-		    error("error in toMixedBase 2");
-		expect = hash4( var_type[i], var_rank[i], index, NCT_ITYPE($1));
-		err = nc_get_var1_$1(ncid, i, index, &value);
-		if (inRange3(expect,datatype,NCT_ITYPE($1))) {
-                    if (expect >= $1_min && expect <= $1_max) {
-			IF (err) {
-			    error("nc_get_var1_$1: %s", nc_strerror(err));
-			} else {
-                            IF (!equal(value,expect,var_type[i],NCT_ITYPE($1))) {
-				error("Var value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("index:");
-				    for (d = 0; d < var_rank[i]; d++)
-					error(" %d", index[d]);
-				    error(", expect: %g, ", expect);
-				    error("got: %g", (double) value);
-				}
-			    } else {
-				++nok;
-			    }
-			}
-		    }
-		}
-	    }
-	}
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+        if (!canConvert) continue;
+
+        err = APIFunc(inq_var)(ncid, i, name, &datatype, &ndims, dimids, NULL);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        IF (strcmp(name, var_name[i]) != 0)
+            error("Unexpected var_name");
+        IF (datatype != var_type[i])
+            error("Unexpected type");
+        IF (ndims != var_rank[i])
+            error("Unexpected rank");
+        for (j = 0; j < ndims; j++) {
+            err = APIFunc(inq_dim)(ncid, dimids[j], 0, &length);
+            IF (err != NC_NOERR)
+                error("inq_dim: %s", APIFunc(strerror)(err));
+            IF (length != var_shape[i][j])
+                error("Unexpected shape");
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash4(cdf_format, var_type[i], var_rank[i], index,
+                           NCT_ITYPE($1));
+            err = GetVar1($1)(ncid, i, index, &value);
+            if (CheckNumRange($1, expect, datatype)) {
+                IF (err != NC_NOERR) {
+                    error("GetVar1($1): %s", APIFunc(strerror)(err));
+                } else {
+                    ifelse(`$1', `uchar', `
+                    /* In put_vars(), PutVara(double)() is used to write
+                     * variables of type NC_BYTE to files. For uchar APIs,
+                     * NC_BYTE variables are treated as unsigned for CDF-1 and 2
+                     * formats. Thus, we skip the equal test for out-of-bound
+                     * values below for uchar APIs.
+                     */
+                    if (cdf_format < NC_FORMAT_CDF5 &&
+                        var_type[i] == NC_BYTE && expect > schar_max)
+                        continue;')
+                    IF (!equal((double)value,expect,var_type[i],NCT_ITYPE($1))){
+                        error("Var value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("var_type: %s, ", s_nc_type(var_type[i]));
+                            error("index:");
+                            for (d = 0; d < var_rank[i]; d++)
+                                error(" %d", index[d]);
+                            error(", expect: %g, ", expect);
+                            error("got: %g", (double) value);
+                        }
+                    } else {
+                        ++nok;
+                    }
+                }
+            }
+        }
     }
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
 }
 ')dnl
 
@@ -174,83 +249,97 @@ CHECK_VARS(longlong)
 CHECK_VARS(ulonglong)
 
 
-dnl CHECK_ATTS(TYPE)         numeric only
+dnl CHECK_ATTS(TYPE)
 dnl
 define(`CHECK_ATTS',dnl
 `dnl
-/* 
- *  check all attributes in file which are (text/numeric) compatible with TYPE
- *  ignore any attributes containing values outside range of TYPE
+/*
+ *  for _text tests, check all attributes in file which are of text type
+ *  Note no NC_ERANGE check for text attributes as text is not convertible to
+ *  any other numerical data types (i.e. NC_ECHAR)
+ *
+ *  for other tests, check all numerical attributes in file against values
+ *  outside range of type $1
  */
-static
-void
-check_atts_$1(int  ncid)
+int
+check_atts_$1(int ncid, int numGatts, int numVars)
 {
-    int  err;           /* status */
-    int  i;
-    int  j;
-    size_t  k;
-    $1 value[MAX_NELS];
+    int i, j, cdf_format, err;
+    int canConvert;      /* Both text or both numeric */
+    int nok = 0;         /* count of valid comparisons */
+    IntType k, length, ndx[1];
     nc_type datatype;
+    IntType nInExtRange;  /* number values within external range */
+    IntType nInIntRange;  /* number values within internal range */
     double expect[MAX_NELS];
-    size_t length;
-    size_t nInExtRange;  /* number values within external range */
-    size_t nInIntRange;  /* number values within internal range */
-    int canConvert;     /* Both text or both numeric */
-    int nok = 0;      /* count of valid comparisons */
+    $1 value[MAX_NELS];
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s", APIFunc(strerror)(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-	    if (canConvert) {
-		err = nc_inq_att(ncid, i, ATT_NAME(i,j), &datatype, &length);
-		IF (err)
-		    error("nc_inq_att: %s", nc_strerror(err));
-		IF (datatype != ATT_TYPE(i,j))
-		error("nc_inq_att: unexpected type");
-		IF (length != ATT_LEN(i,j))
-		    error("nc_inq_att: unexpected length");
-		assert(length <= MAX_NELS);
-		nInIntRange = nInExtRange = 0;
-		for (k = 0; k < length; k++) {
-		    expect[k] = hash4( datatype, -1, &k, NCT_ITYPE($1));
-		    if (inRange3(expect[k], datatype, NCT_ITYPE($1))) {
-			++nInExtRange;
-			if (expect[k] >= $1_min && expect[k] <= $1_max)
-			    ++nInIntRange;
-		    }
-		}
-		err = nc_get_att_$1(ncid, i, ATT_NAME(i,j), value);
-                if (nInExtRange == length && nInIntRange == length) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-                } else {
-                    IF (err != 0 && err != NC_ERANGE)
-                        error("OK or Range error: status = %d", err);
+            canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1);
+            if (!canConvert) continue;
+
+            err = APIFunc(inq_att)(ncid, i, ATT_NAME(i,j), &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s", APIFunc(strerror)(err));
+            IF (datatype != ATT_TYPE(i,j))
+                error("inq_att: unexpected type");
+            IF (length != ATT_LEN(i,j))
+                error("inq_att: unexpected length");
+            assert(length <= MAX_NELS);
+            nInIntRange = nInExtRange = 0;
+            for (k = 0; k < length; k++) {
+                ndx[0] = k;
+                expect[k] = hash4(cdf_format, datatype, -1, ndx, NCT_ITYPE($1));
+                if (inRange3(cdf_format, expect[k], datatype, NCT_ITYPE($1))) {
+                    ++nInExtRange;
+                    if (CheckRange($1, expect[k]))
+                        ++nInIntRange;
                 }
-		for (k = 0; k < length; k++) {
-                    if (inRange3(expect[k],datatype,NCT_ITYPE($1))
-                            && expect[k] >= $1_min && expect[k] <= $1_max) {
-                        IF (!equal(value[k],expect[k],datatype,NCT_ITYPE($1))) {
-                            error("att. value read not that expected");
-                            if (verbose) {
-                                error("\n");
-                                error("varid: %d, ", i);
-                                error("att_name: %s, ", ATT_NAME(i,j));
-                                error("element number: %d ", k);
-                                error("expect: %g, ", expect[k]);
-                                error("got: %g", (double) value[k]);
-                            }
-                        } else {
-                            nok++;
+            }
+            err = APIFunc(get_att_$1)(ncid, i, ATT_NAME(i,j), value);
+            if (nInExtRange == length && nInIntRange == length) {
+                IF (err != NC_NOERR)
+                    EXPECT_ERR(NC_NOERR, err)
+            } else {
+                IF (err != NC_NOERR && err != NC_ERANGE)
+                    EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
+            }
+            for (k = 0; k < length; k++) {
+                if (CheckNumRange($1, expect[k], datatype)) {
+                    ifelse(`$1', `uchar', `
+                    /* In put_vars(), PutVara(double)() is used to write
+                     * variables of type NC_BYTE to files. For uchar APIs,
+                     * NC_BYTE variables are treated as unsigned for CDF-1 and 2
+                     * formats. Thus, we skip the equal test for out-of-bound
+                     * values below for uchar APIs.
+                     */
+                    if (cdf_format < NC_FORMAT_CDF5 &&
+                        ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max)
+                        continue;')
+                    IF (!equal((double)value[k],expect[k],datatype,NCT_ITYPE($1))) {
+                        error("att. value read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("att_name: %s, ", ATT_NAME(i,j));
+                            error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
+                            error("element number: %d ", k);
+                            error("expect: %g, ", expect[k]);
+                            error("got: %g", (double) value[k]);
                         }
+                    } else {
+                        nok++;
                     }
                 }
-            }                                               
+            }
         }
     }
-
-    print_nok(nok);
+    return nok;
 }
 ')dnl
 
@@ -272,98 +361,123 @@ dnl TEST_NC_PUT_VAR1(TYPE)
 dnl
 define(`TEST_NC_PUT_VAR1',dnl
 `dnl
-void
-test_nc_put_var1_$1(void)
+int
+TestFunc(var1)_$1(VarArgs)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    $1 value = 5;	/* any value would do - only for error cases */
-
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    int i, err, ncid, cdf_format, nok=0;
+    int canConvert;      /* Both text or both numeric */
+    IntType j, index[MAX_RANK];
+    $1 value[1];
+
+    err = FileCreate(scratch, NC_CLOBBER);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
     }
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s", APIFunc(strerror)(err));
+
     def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    DefVars(ncid, numVars);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVar1($1)(BAD_ID, 0, NULL, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVar1($1)(ncid, BAD_VARID, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-        for (j = 0; j < var_rank[i]; j++)
-            index[j] = 0;
-        err = nc_put_var1_$1(BAD_ID, i, index, &value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var1_$1(ncid, BAD_VARID, index, &value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVar1($1)(BAD_ID, i, NULL, value);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVar1($1)(ncid, i, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
+        }
+        else if (var_rank[i] == 0) {
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
         for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		index[j] = var_shape[i][j];
-		err = nc_put_var1_$1(ncid, i, index, &value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		index[j] = 0;
-	    }
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j];     /* out of boundary check */
+            err = PutVar1($1)(ncid, i, index, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+                index[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            index[j] = 0;
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err) 
-		error("error in toMixedBase 1");
-            value = hash_$1( var_type[i], var_rank[i], index, NCT_ITYPE($1));
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_var1_$1(ncid, i, NULL, &value);
-	    else
-		err = nc_put_var1_$1(ncid, i, index, &value);
-	    if (canConvert) {
-		if (inRange3(value, var_type[i],NCT_ITYPE($1))) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE) {
-			error("Range error: status = %d", err);
-			error("\n\t\tfor type %s value %.17e %ld",
-				s_nc_type(var_type[i]),
-				(double)value, (long)value);
-		    }
-		}
-	    } else {
-		IF (err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash_$1(cdf_format, var_type[i], var_rank[i], index,
+                               NCT_ITYPE($1));
+            err = PutVar1($1)(ncid, i, index, value);
+            if (canConvert) {
+                if (CheckRange3($1, value[0], var_type[i])) {
+                    IF (err != NC_NOERR)
+                        EXPECT_ERR(NC_NOERR, err)
+                    ELSE_NOK
+                }
+                PNETCDF_CHECK_ERANGE($1)
+            } else {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
             }
         }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
 
-    check_vars_$1(scratch);
+    nok += check_vars_$1(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 ')dnl
 
@@ -385,141 +499,139 @@ dnl TEST_NC_PUT_VAR(TYPE)
 dnl
 define(`TEST_NC_PUT_VAR',dnl
 `dnl
-void
-test_nc_put_var_$1(void)
+int
+TestFunc(var)_$1(VarArgs)
 {
-    int ncid;
-    int varid;
-    int i;
-    int j;
-    int err;
-    int nels;
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    int i, err, ncid, varid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    IntType j, index[MAX_RANK];
     $1 value[MAX_NELS];
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    err = FileCreate(scratch, NC_CLOBBER);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
     }
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s", APIFunc(strerror)(err));
+
     def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    DefVars(ncid, numVars);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVar($1)(BAD_ID, 0, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVar($1)(ncid, BAD_VARID, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
-        err = nc_put_var_$1(BAD_ID, i, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_var_$1(ncid, BAD_VARID, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-
-	nels = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    nels *= var_shape[i][j];
-	}
-	for (allInExtRange = 1, j = 0; j < nels; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err) 
-		error("error in toMixedBase 1");
-	    value[j]= hash_$1(var_type[i], var_rank[i], index, NCT_ITYPE($1));
-	    allInExtRange = allInExtRange 
-		&& inRange3(value[j], var_type[i], NCT_ITYPE($1));
-	}
-        err = nc_put_var_$1(ncid, i, value);
-	if (canConvert) {
-	    if (allInExtRange) {
-		IF (err) 
-		    error("%s", nc_strerror(err));
-	    } else {
-		IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
-		    error("range error: status = %d", err);
-	    }
-	} else {       /* should flag wrong type even if nothing to write */
-	    IF (nels > 0 && err != NC_ECHAR)
-		error("wrong type: status = %d", err);
-	}
+
+        if (var_dimid[i][0] == RECDIM) continue; /* fixed-size variables only */
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVar($1)(BAD_ID, i, value);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_ITYPE($1));
+            IfCheckTextChar($1, var_type[i])
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_ITYPE($1));
+        }
+        err = PutVar($1)(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    EXPECT_ERR(NC_NOERR, err)
+                ELSE_NOK
+            }
+            PNETCDF_CHECK_ERANGE($1)
+        } else { /* should flag wrong type even if nothing to write */
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
+        }
     }
 
-        /* Preceding has written nothing for record variables, now try */
-        /* again with more than 0 records */
+    /* Preceding has written nothing for record variables, now try */
+    /* again with more than 0 records */
 
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
-    err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err = APIFunc(inq_varid)(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s", APIFunc(strerror)(err));
     index[0] = NRECS-1;
-    err = nc_put_var1_text(ncid, varid, index, "x");
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    err = PutVar1(text)(ncid, varid, index, "x");
+    IF (err != NC_NOERR)
+        error("put_var1_text: %s", APIFunc(strerror)(err));
 
     for (i = 0; i < numVars; i++) {
-        if (var_dimid[i][0] == RECDIM) {  /* only test record variables here */
-	    canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-	    assert(var_rank[i] <= MAX_RANK);
-	    assert(var_nels[i] <= MAX_NELS);
-	    err = nc_put_var_$1(BAD_ID, i, value);
-	    IF (err != NC_EBADID) 
-	        error("bad ncid: status = %d", err);
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		nels *= var_shape[i][j];
-	    }
-	    for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], var_shape[i], index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		value[j]= hash_$1(var_type[i], var_rank[i], index, NCT_ITYPE($1));
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_ITYPE($1));
-	    }
-	    err = nc_put_var_$1(ncid, i, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
-	    }
+        if (var_dimid[i][0] != RECDIM) continue; /* only record variables here */
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+        for (allInExtRange = 1, j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index,
+                              NCT_ITYPE($1));
+            IfCheckTextChar($1, var_type[i])
+                allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                          var_type[i], NCT_ITYPE($1));
+        }
+        err = PutVar($1)(ncid, i, value);
+        if (canConvert) {
+            if (allInExtRange) {
+                IF (err != NC_NOERR)
+                    EXPECT_ERR(NC_NOERR, err)
+                ELSE_NOK
+            } else {
+                IF (err != NC_ERANGE)
+                    EXPECT_ERR(NC_ERANGE, err)
+                ELSE_NOK
+            }
+        } else {
+            IF (err != NC_ECHAR)
+                EXPECT_ERR(NC_ECHAR, err)
+            ELSE_NOK
         }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
 
-    check_vars_$1(scratch);
+    nok += check_vars_$1(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 ')dnl
 
@@ -541,155 +653,206 @@ dnl TEST_NC_PUT_VARA(TYPE)
 dnl
 define(`TEST_NC_PUT_VARA',dnl
 `dnl
-void
-test_nc_put_vara_$1(void)
+int
+TestFunc(vara)_$1(VarArgs)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nslabs;
-    int nels;
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t index[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;        /* Both text or both numeric */
+    int allInExtRange;     /* all values within external range? */
+    IntType j, nels;
+    IntType start[MAX_RANK], edge[MAX_RANK];
+    IntType mid[MAX_RANK], index[MAX_RANK];
     $1 value[MAX_NELS];
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    err = FileCreate(scratch, NC_CLOBBER);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
     }
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s", APIFunc(strerror)(err));
+
     def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    DefVars(ncid, numVars);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
-        }
-    }
-    }
-#endif
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVara($1)(BAD_ID, 0, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVara($1)(ncid, BAD_VARID, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
-    value[0] = 0;
     for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVara($1)(BAD_ID, i, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
-	}
-        err = nc_put_vara_$1(BAD_ID, i, start, edge, value);
-        IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-        err = nc_put_vara_$1(ncid, BAD_VARID, start, edge, value);
-        IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-        for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara_$1(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara_$1(ncid, i, start, edge, value);
-		IF (canConvert && err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
         }
 
-/* wkliao: this test below of put_vara is redundant and incorrectly uses the
-           value[] set from the previously iteration. There is no such test
-           in put_vars and put_varm.
-
-	err = nc_put_vara_$1(ncid, i, start, edge, value);
-	if (canConvert) {
-	    IF (err) 
-		error("%s", nc_strerror(err));
-	} else {
-	    IF (err != NC_ECHAR)
-		error("wrong type: status = %d", err);
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVara($1)(ncid, i, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
         }
-*/
+        else if (var_rank[i] == 0) {
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = PutVara($1)(ncid, i, start, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
+        }
+        else if (var_rank[i] == 0) {
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVara($1)(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = PutVara($1)(ncid, i, start, edge, value);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDG, err)
+            ELSE_NOK
             edge[j] = 1;
-	}
+        }
 
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVara($1)(ncid, i, start, edge, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = PutVara($1)(ncid, i, start, edge, value);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	for (k = 0; k < nslabs; k++) {
-	    nels = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		nels *= edge[j];
-	    }
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+
             for (allInExtRange = 1, j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err) 
-		    error("error in toMixedBase 1");
-		for (d = 0; d < var_rank[i]; d++) 
-		    index[d] += start[d];
-		value[j]= hash_$1(var_type[i], var_rank[i], index, NCT_ITYPE($1));
-		allInExtRange = allInExtRange 
-		    && inRange3(value[j], var_type[i], NCT_ITYPE($1));
-	    }
-	    if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara_$1(ncid, i, NULL, NULL, value);
-	    else
-		err = nc_put_vara_$1(ncid, i, start, edge, value);
-	    if (canConvert) {
-		if (allInExtRange) {
-		    IF (err) 
-			error("%s", nc_strerror(err));
-		} else {
-		    IF (err != NC_ERANGE)
-			error("range error: status = %d", err);
-		}
-	    } else {
-		IF (nels > 0 && err != NC_ECHAR)
-		    error("wrong type: status = %d", err);
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index,
+                                  NCT_ITYPE($1));
+                IfCheckTextChar($1, var_type[i])
+                    allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                              var_type[i], NCT_ITYPE($1));
+            }
+            err = PutVara($1)(ncid, i, start, edge, value);
+            if (canConvert) {
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        EXPECT_ERR(NC_NOERR, err)
+                    ELSE_NOK
+                }
+                PNETCDF_CHECK_ERANGE($1)
+            } else {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
             }
         }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
 
-    check_vars_$1(scratch);
+    nok += check_vars_$1(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 ')dnl
 
@@ -711,176 +874,235 @@ dnl TEST_NC_PUT_VARS(TYPE)
 dnl
 define(`TEST_NC_PUT_VARS',dnl
 `dnl
-void
-test_nc_put_vars_$1(void)
+int
+TestFunc(vars)_$1(VarArgs)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    IntType j, m, nels;
+    IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType nstarts;   /* number of different starts */
+    PTRDType stride[MAX_RANK];
     $1 value[MAX_NELS];
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    err = FileCreate(scratch, NC_CLOBBER);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
     }
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s", APIFunc(strerror)(err));
+
     def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+    DefVars(ncid, numVars);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVars($1)(BAD_ID, 0, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVars($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVars($1)(BAD_ID, i, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
         }
-    }
-    }
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVars($1)(ncid, i, NULL, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
+        }
+        else if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+        
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = PutVars($1)(ncid, i, start, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
+        }
+        else if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = PutVars($1)(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = PutVars($1)(ncid, i, start, edge, stride, value);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDGE, err)
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = PutVars($1)(ncid, i, start, edge, stride, value);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVars($1)(ncid, i, start, edge, stride, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = PutVars($1)(ncid, i, start, edge, stride, value);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	}
-	err = nc_put_vars_$1(BAD_ID, i, start, edge, stride, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_vars_$1(ncid, BAD_VARID, start, edge, stride, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_$1(ncid, i, start, edge, stride, value);
-	      if(!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF(err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars_$1(ncid, i, start, edge, stride, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars_$1(ncid, i, start, edge, stride, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-              }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-		    /* Random choice of forward or backward */
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (IntType)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (IntType)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
 */
-		for (allInExtRange = 1, j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value[j] = hash_$1(var_type[i], var_rank[i], index2, 
-			NCT_ITYPE($1));
-		    allInExtRange = allInExtRange 
-			&& inRange3(value[j], var_type[i], NCT_ITYPE($1));
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars_$1(ncid, i, NULL, NULL, stride, value);
-		else
-		    err = nc_put_vars_$1(ncid, i, index, count, stride, value);
-		if (canConvert) {
-		    if (allInExtRange) {
-			IF (err) 
-			    error("%s", nc_strerror(err));
-		    } else {
-			IF (err != NC_ERANGE)
-			    error("range error: status = %d", err);
-		    }
-		} else {
-		    IF (nels > 0 && err != NC_ECHAR)
-			error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                for (allInExtRange = 1, j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (IntType)stride[d];
+                    value[j] = hash_$1(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_ITYPE($1));
+                    IfCheckTextChar($1, var_type[i])
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_ITYPE($1));
+                }
+                err = PutVars($1)(ncid, i, index, count, stride, value);
+                if (canConvert) {
+                    if (allInExtRange) {
+                        IF (err != NC_NOERR)
+                            EXPECT_ERR(NC_NOERR, err)
+                        ELSE_NOK
+                    }
+                    PNETCDF_CHECK_ERANGE($1)
+                } else {
+                    IF (err != NC_ECHAR)
+                        EXPECT_ERR(NC_ECHAR, err)
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
 
-    check_vars_$1(scratch);
+    nok += check_vars_$1(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 ')dnl
 
@@ -902,184 +1124,243 @@ dnl TEST_NC_PUT_VARM(TYPE)
 dnl
 define(`TEST_NC_PUT_VARM',dnl
 `dnl
-void
-test_nc_put_varm_$1(void)
+int
+TestFunc(varm)_$1(VarArgs)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
-    size_t start[MAX_RANK];
-    size_t edge[MAX_RANK];
-    size_t index[MAX_RANK];
-    size_t index2[MAX_RANK];
-    size_t mid[MAX_RANK];
-    size_t count[MAX_RANK];
-    size_t sstride[MAX_RANK];
-    ptrdiff_t stride[MAX_RANK];
-    ptrdiff_t imap[MAX_RANK];
-    int canConvert;	/* Both text or both numeric */
-    int allInExtRange;	/* all values within external range? */
+    int i, k, d, err, nslabs, ncid, cdf_format, nok=0;
+    int canConvert;     /* Both text or both numeric */
+    int allInExtRange;  /* all values within external range? */
+    IntType j, m, nels;
+    IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
+    IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType nstarts;   /* number of different starts */
+    PTRDType stride[MAX_RANK], imap[MAX_RANK];
     $1 value[MAX_NELS];
 
-    err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-	error("nc_create: %s", nc_strerror(err));
-	return;
+    err = FileCreate(scratch, NC_CLOBBER);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
     }
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s", APIFunc(strerror)(err));
+
     def_dims(ncid);
-    def_vars(ncid);
-    err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+    DefVars(ncid, numVars);
 
-#ifdef USE_PNETCDF
-    {
-    int format;
-    nc_inq_format_extended(ncid, &format, NULL);
-    if (format == NC_FORMATX_PNETCDF) {
-        for (i = 0; i < numVars; i++) {
-            err = nc_var_par_access(ncid, i, NC_COLLECTIVE);
-	    IF (err)
-	        error("nc_var_par_access: %s", nc_strerror(err));
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5; /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVarm($1)(BAD_ID, i, NULL, NULL, NULL, NULL, value);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        canConvert = (var_type[i] == NC_CHAR) CheckText($1);
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
         }
-    }
-    }
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVarm($1)(ncid, i, NULL, NULL, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
+        }
+        else if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+        
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = PutVarm($1)(ncid, i, start, NULL, NULL, NULL, value);
+        if (!canConvert) {
+            IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
+        }
+        else if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];   /* out of boundary check */
+            err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDGE, err)
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, i.e. edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
+            if (!canConvert) {
+                IF (err != NC_ECHAR)
+                    EXPECT_ERR(NC_ECHAR, err)
+                ELSE_NOK
+                start[j] = 0;
+                continue;
+            }
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
 #endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
 
-    for (i = 0; i < numVars; i++) {
-	canConvert = (var_type[i] == NC_CHAR) == (NCT_ITYPE($1) == NCT_TEXT);
-	assert(var_rank[i] <= MAX_RANK);
-	assert(var_nels[i] <= MAX_NELS);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = 0;
-	    edge[j] = 1;
-	    stride[j] = 1;
-	    imap[j] = 1;
-	}
-	err = nc_put_varm_$1(BAD_ID, i, start, edge, stride, imap, value);
-	IF (err != NC_EBADID) 
-	    error("bad ncid: status = %d", err);
-	err = nc_put_varm_$1(ncid, BAD_VARID, start, edge, stride, imap, value);
-	IF (err != NC_ENOTVAR) 
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    if (var_dimid[i][j] > 0) {		/* skip record dim */
-		start[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_$1(ncid, i, start, edge, stride, imap, value);
-	      if (!canConvert) {
-		IF(err != NC_ECHAR)
-			error("conversion: status = %d", err);
-	      } else {
-		IF (err != NC_EINVALCOORDS)
-		    error("bad start: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm_$1(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm_$1(ncid, i, start, edge, stride, imap, value);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	      }
-	    }
-	}
-	    /* Choose a random point dividing each dim into 2 parts */
-	    /* Put 2^rank (nslabs) slabs so defined */
-	nslabs = 1;
-	for (j = 0; j < var_rank[i]; j++) {
-	    mid[j] = roll( var_shape[i][j] );
-	    nslabs *= 2;
-	}
-	    /* bits of k determine whether to put lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	for (k = 0; k < nslabs; k++) {
-	    nstarts = 1;
-	    for (j = 0; j < var_rank[i]; j++) {
-		if ((k >> j) & 1) {
-		    start[j] = 0;
-		    edge[j] = mid[j];
-		}else{
-		    start[j] = mid[j];
-		    edge[j] = var_shape[i][j] - mid[j];
-		}
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		nstarts *= stride[j];
-	    }
+        /* Choose a random point dividing each dim into 2 parts */
+        /* Put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                } else {
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
+                nstarts *= stride[j];
+            }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (IntType)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                    /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (IntType)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
 */
                 if (var_rank[i] > 0) {
-                    j = var_rank[i] - 1;
-                    imap[j] = 1;
-                    for (; j > 0; j--)
-                        imap[j-1] = imap[j] * count[j];
+                    int jj = var_rank[i] - 1;
+                    imap[jj] = 1;
+                    for (; jj > 0; jj--)
+                        imap[jj-1] = imap[jj] * (PTRDType)count[jj];
                 }
                 for (allInExtRange = 1, j = 0; j < nels; j++) {
                     err = toMixedBase(j, var_rank[i], count, index2);
-                    IF (err)
-                        error("error in toMixedBase");
+                    IF (err != 0) error("error in toMixedBase");
                     for (d = 0; d < var_rank[i]; d++)
-                        index2[d] = index[d] + index2[d] * stride[d];
-                    value[j] = hash_$1(var_type[i], var_rank[i], index2,
-                        NCT_ITYPE($1));
-                    allInExtRange = allInExtRange
-                        && inRange3(value[j], var_type[i], NCT_ITYPE($1));
+                        index2[d] = index[d] + index2[d] * (IntType)stride[d];
+                    value[j] = hash_$1(cdf_format,var_type[i], var_rank[i],
+                                       index2, NCT_ITYPE($1));
+                    IfCheckTextChar($1, var_type[i])
+                        allInExtRange &= inRange3(cdf_format, (double)value[j],
+                                                  var_type[i], NCT_ITYPE($1));
                 }
-                if (var_rank[i] == 0 && i%2 == 0)
-                    err = nc_put_varm_$1(ncid,i,NULL,NULL,NULL,NULL,value);
-                else
-                    err = nc_put_varm_$1(ncid,i,index,count,stride,imap,value);
+                err = PutVarm($1)(ncid,i,index,count,stride,imap,value);
                 if (canConvert) {
                     if (allInExtRange) {
-                        IF (err)
-                            error("%s", nc_strerror(err));
-                    } else {
-                        IF (err != NC_ERANGE)
-                            error("range error: status = %d", err);
+                        IF (err != NC_NOERR)
+                            EXPECT_ERR(NC_NOERR, err)
+                        ELSE_NOK
                     }
+                    PNETCDF_CHECK_ERANGE($1)
                 } else {
-                    IF (nels > 0 && err != NC_ECHAR)
-                        error("wrong type: status = %d", err);
-		}
-	    }
-	}
+                    IF (err != NC_ECHAR)
+                        EXPECT_ERR(NC_ECHAR, err)
+                    ELSE_NOK
+                }
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err) 
-	error("nc_close: %s", nc_strerror(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
 
-    check_vars_$1(scratch);
+    nok += check_vars_$1(scratch, numVars);
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 ')dnl
 
@@ -1097,64 +1378,74 @@ TEST_NC_PUT_VARM(longlong)
 TEST_NC_PUT_VARM(ulonglong)
 
 
-void
-test_nc_put_att_text(void)
+int
+TestFunc(att)_text(AttVarArgs)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
+    int i, j, err, ncid, nok=0;
+    IntType k, ndx[1];
     text value[MAX_NELS];
 
-    err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    err = FileCreate(scratch, NC_NOCLOBBER);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
     }
     def_dims(ncid);
-    def_vars(ncid);
+    DefVars(ncid, numVars);
+
+    /* check if can detect a bad file ID */
+    err = PutAtt(text)(BAD_ID, 0, NULL, 0, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutAtt(text)(ncid, BAD_VARID, NULL, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
     {
-	const char *const tval = "value for bad name";
-	const size_t tval_len = strlen(tval);
-	
-	err = nc_put_att_text(ncid, 0, "", tval_len, tval);
-	IF (err != NC_EBADNAME)
-	   error("should be NC_EBADNAME: status = %d", err);
+        const char *const tval = "value for bad name";
+        const IntType tval_len = (IntType)strlen(tval);
+
+        err = PutAtt(text)(ncid, 0, "", tval_len, tval);
+        IF (err != NC_EBADNAME)
+           EXPECT_ERR(NC_EBADNAME, err)
+        ELSE_NOK
     }
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (ATT_TYPE(i,j) == NC_CHAR) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_text(BAD_ID, i, ATT_NAME(i,j), ATT_LEN(i,j), 
-		    value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_text(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash(ATT_TYPE(i,j), -1, &k);
-		}
-		err = nc_put_att_text(ncid, i, ATT_NAME(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err) {
-		    error("%s", nc_strerror(err));
-		}
-	    }
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = PutAtt(text)(ncid, BAD_VARID, ATT_NAME(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    EXPECT_ERR(NC_ENOTVAR, err)
+                ELSE_NOK
+
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    double dtmp = hash(ATT_TYPE(i,j), -1, ndx);
+                    value[k] = (text)dtmp;
+                }
+                err = PutAtt(text)(ncid, i, ATT_NAME(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_NOERR)
+                    EXPECT_ERR(NC_NOERR, err)
+                ELSE_NOK
+            }
         }
     }
 
-    check_atts_text(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    nok += check_atts_text(ncid, numGatts, numVars);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 
 
@@ -1162,67 +1453,86 @@ dnl TEST_NC_PUT_ATT(TYPE)         numeric only
 dnl
 define(`TEST_NC_PUT_ATT',dnl
 `dnl
-void
-test_nc_put_att_$1(void)
+int
+TestFunc(att)_$1(AttVarArgs)
 {
-    int ncid;
-    int i;
-    int j;
-    size_t k;
-    int err;
-    $1 value[MAX_NELS];
+    int i, j, err, ncid, cdf_format, nok=0;
     int allInExtRange;  /* all values within external range? */
+    IntType k, ndx[1];
+    $1 value[MAX_NELS];
 
-    err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    err = FileCreate(scratch, NC_NOCLOBBER);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
     }
+
+    err = APIFunc(inq_format)(ncid, &cdf_format);
+    IF (err != NC_NOERR)
+        error("inq_format: %s", APIFunc(strerror)(err));
+
     def_dims(ncid);
-    def_vars(ncid);
+    DefVars(ncid, numVars);
+
+    /* check if can detect a bad file ID */
+    err = PutAtt($1)(BAD_ID, 0, NULL, 0, 0, NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutAtt($1)(ncid, BAD_VARID, NULL, 0, 0, NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
             if (!(ATT_TYPE(i,j) == NC_CHAR)) {
-		assert(ATT_LEN(i,j) <= MAX_NELS);
-		err = nc_put_att_$1(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADID)
-		    error("bad ncid: status = %d", err);
-		err = nc_put_att_$1(ncid, BAD_VARID, ATT_NAME(i,j), 
-		    ATT_TYPE(i,j), ATT_LEN(i,j), value);
-		IF (err != NC_ENOTVAR)
-		    error("bad var id: status = %d", err);
-		err = nc_put_att_$1(ncid, i, ATT_NAME(i,j), BAD_TYPE, 
-		    ATT_LEN(i,j), value);
-		IF (err != NC_EBADTYPE)
-		    error("bad type: status = %d", err);
-		for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
-		    value[k] = hash_$1(ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1));
-		    allInExtRange = allInExtRange
-			&& inRange3(value[k], ATT_TYPE(i,j), NCT_ITYPE($1));
-		}
-		err = nc_put_att_$1(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j),
-		    ATT_LEN(i,j), value);
-		if (allInExtRange) {
-		    IF (err)
-			error("%s", nc_strerror(err));
-		} else {
-                    IF (err != NC_ERANGE)
-                        error("range error: status = %d", err);
-		}
-	    }
+                assert(ATT_LEN(i,j) <= MAX_NELS);
+
+                err = PutAtt($1)(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                IF (err != NC_ENOTVAR)
+                    EXPECT_ERR(NC_ENOTVAR, err)
+                ELSE_NOK
+
+                /* check if can detect a bad name */
+                err = PutAtt($1)(ncid, i, NULL, 0, 0, NULL);
+                IF (err != NC_EBADNAME)
+                    EXPECT_ERR(NC_EBADNAME, err)
+                ELSE_NOK
+
+                err = PutAtt($1)(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
+                IF (err != NC_EBADTYPE)
+                    EXPECT_ERR(NC_EBADTYPE, err)
+                ELSE_NOK
+
+                for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    value[k] = hash_$1(cdf_format,ATT_TYPE(i,j), -1, ndx, NCT_ITYPE($1));
+                    IfCheckTextChar($1, ATT_TYPE(i,j))
+                        allInExtRange &= inRange3(cdf_format, (double)value[k], ATT_TYPE(i,j), NCT_ITYPE($1));
+                }
+                err = PutAtt($1)(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
+                if (allInExtRange) {
+                    IF (err != NC_NOERR)
+                        EXPECT_ERR(NC_NOERR, err)
+                    ELSE_NOK
+                }
+                PNETCDF_CHECK_ERANGE($1)
+            }
         }
     }
 
-    check_atts_$1(ncid);
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    nok += check_atts_$1(ncid, numGatts, numVars);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
 
-    err = remove(scratch);
-    IF (err)
-        error("remove of %s failed", scratch);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("delete file %s failed", scratch);
+    return nok;
 }
 ')dnl
 
diff --git a/nc_test/test_read.c b/nc_test/test_read.c
index 96edad9..9df36fb 100644
--- a/nc_test/test_read.c
+++ b/nc_test/test_read.c
@@ -1,198 +1,273 @@
-/*********************************************************************
- *   Copyright 1996, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Id: test_read.c 2792 2014-10-27 06:02:59Z wkliao $
- *********************************************************************/
+/* Do not edit this file. It is produced from the corresponding .m4 source */
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_read.m4 2861 2017-02-09 19:38:02Z wkliao $ */
+
+
+#if defined (_WIN32) || defined (_WIN64)
+#include <io.h>
+#endif
+
+#include <sys/types.h> /* open() */
+#include <sys/stat.h>  /* open() */
+#include <fcntl.h>     /* open() */
+#ifdef _MSC_VER
+#include <io.h>
+#else
+#include <unistd.h>    /* unlink(), write() */
+#endif
+#include <errno.h>     /* errno, strerror() */
 
 #include "tests.h"
 
+
+
+
+
+
 /*
- * Test nc_strerror.
+ * Test  nc_strerror.
  *    Try on a bad error status.
  *    Test for each defined error status.
  */
-void
+int
 test_nc_strerror(void)
 {
     int i;
-    const char *message;
+    const char *message, *expected_msg;
+    int nok=0;
 
     static const struct {
-	int status;
-	const char *msg;
+        int status;
+        const char *msg;
     } ncerrs[] = {
-	{NC_NOERR, "No error"},
-	{NC_EBADID, "NetCDF: Not a valid ID"},
-	{NC_ENFILE, "NetCDF: Too many files open"},
-	{NC_EEXIST, "NetCDF: File exists && NC_NOCLOBBER"},
-	{NC_EINVAL, "NetCDF: Invalid argument"},
-	{NC_EPERM, "NetCDF: Write to read only"},
-	{NC_ENOTINDEFINE, "NetCDF: Operation not allowed in data mode"},
-	{NC_EINDEFINE, "NetCDF: Operation not allowed in define mode"},
-	{NC_EINVALCOORDS, "NetCDF: Index exceeds dimension bound"},
-	{NC_EMAXDIMS, "NetCDF: NC_MAX_DIMS exceeded"},
-	{NC_ENAMEINUSE, "NetCDF: String match to name in use"},
-	{NC_ENOTATT, "NetCDF: Attribute not found"},
-	{NC_EMAXATTS, "NetCDF: NC_MAX_ATTRS exceeded"},
-	{NC_EBADTYPE, "NetCDF: Not a valid data type or _FillValue type mismatch"},
-	{NC_EBADDIM, "NetCDF: Invalid dimension ID or name"},
-	{NC_EUNLIMPOS, "NetCDF: NC_UNLIMITED in the wrong index"},
-	{NC_EMAXVARS, "NetCDF: NC_MAX_VARS exceeded"},
-	{NC_ENOTVAR, "NetCDF: Variable not found"},
-	{NC_EGLOBAL, "NetCDF: Action prohibited on NC_GLOBAL varid"},
-	{NC_ENOTNC, "NetCDF: Unknown file format"},
-	{NC_ESTS, "NetCDF: In Fortran, string too short"},
-	{NC_EMAXNAME, "NetCDF: NC_MAX_NAME exceeded"},
-	{NC_EUNLIMIT, "NetCDF: NC_UNLIMITED size already in use"},
-	{NC_ENORECVARS, "NetCDF: nc_rec op when there are no record vars"},
-	{NC_ECHAR, "NetCDF: Attempt to convert between text & numbers"},
-	{NC_EEDGE, "NetCDF: Start+count exceeds dimension bound"},
-	{NC_ESTRIDE, "NetCDF: Illegal stride"},
-	{NC_EBADNAME, "NetCDF: Name contains illegal characters"},
-	{NC_ERANGE, "NetCDF: Numeric conversion not representable"},
-	{NC_ENOMEM, "NetCDF: Memory allocation (malloc) failure"},
-	{NC_EVARSIZE, "NetCDF: One or more variable sizes violate format constraints"},
-	{NC_EDIMSIZE, "NetCDF: Invalid dimension size"}
+        {NC_NOERR, "No error"},
+        {NC_EBADID, "NetCDF: Not a valid ID"},
+        {NC_ENFILE, "NetCDF: Too many files open"},
+        {NC_EEXIST, "NetCDF: File exists && NC_NOCLOBBER"},
+        {NC_EINVAL, "NetCDF: Invalid argument"},
+        {NC_EPERM, "NetCDF: Write to read only"},
+        {NC_ENOTINDEFINE, "NetCDF: Operation not allowed in data mode"},
+        {NC_EINDEFINE, "NetCDF: Operation not allowed in define mode"},
+        {NC_EINVALCOORDS, "NetCDF: Index exceeds dimension bound"},
+        {NC_EMAXDIMS, "NetCDF: NC_MAX_DIMS exceeded"},
+        {NC_ENAMEINUSE, "NetCDF: String match to name in use"},
+        {NC_ENOTATT, "NetCDF: Attribute not found"},
+        {NC_EMAXATTS, "NetCDF: NC_MAX_ATTRS exceeded"},
+        {NC_EBADTYPE, "NetCDF: Not a valid data type or _FillValue type mismatch"},
+        {NC_EBADDIM, "NetCDF: Invalid dimension ID or name"},
+        {NC_EUNLIMPOS, "NetCDF: NC_UNLIMITED in the wrong index"},
+        {NC_EMAXVARS, "NetCDF: NC_MAX_VARS exceeded"},
+        {NC_ENOTVAR, "NetCDF: Variable not found"},
+        {NC_EGLOBAL, "NetCDF: Action prohibited on NC_GLOBAL varid"},
+        {NC_ENOTNC, "NetCDF: Unknown file format"},
+        {NC_ESTS, "NetCDF: In Fortran, string too short"},
+        {NC_EMAXNAME, "NetCDF: NC_MAX_NAME exceeded"},
+        {NC_EUNLIMIT, "NetCDF: NC_UNLIMITED size already in use"},
+        {NC_ENORECVARS, "NetCDF: nc_rec op when there are no record vars"},
+        {NC_ECHAR, "NetCDF: Attempt to convert between text & numbers"},
+        {NC_EEDGE, "NetCDF: Start+count exceeds dimension bound"},
+        {NC_ESTRIDE, "NetCDF: Illegal stride"},
+        {NC_EBADNAME, "NetCDF: Name contains illegal characters"},
+        {NC_ERANGE, "NetCDF: Numeric conversion not representable"},
+        {NC_ENOMEM, "NetCDF: Memory allocation (malloc) failure"},
+        {NC_EVARSIZE, "NetCDF: One or more variable sizes violate format constraints"},
+        {NC_EDIMSIZE, "NetCDF: Invalid dimension size"}
     };
 
     /* Try on a bad error status */
-    /* Dmh: allow trailing extra info */
-    message = nc_strerror(-666);/* should fail */
-    IF (strncmp(message, "Unknown Error", strlen("Unknown Error")) != 0)
-	error("nc_strerror on bad error status returned: %s", message);
+    message =  nc_strerror(-666);/* should fail */
+    expected_msg = "Unknown Error";
+    IF (strncmp(message, expected_msg, strlen(expected_msg)) != 0)
+        error(" nc_strerror on bad error status returned: %s", message);
+    ELSE_NOK
 
     /* Try on each legitimate error status */
-    /* Dmh: allow trailing extra info */
     for (i=0; i<LEN_OF(ncerrs); i++) {
-	const char *message = nc_strerror(ncerrs[i].status);
-	IF (strncmp(message, ncerrs[i].msg, strlen(ncerrs[i].msg)) != 0)
-	    error("nc_strerror(%d) should return `%s', not `%s'",
-		  ncerrs[i].status, ncerrs[i].msg, message);
+        const char *message =  nc_strerror(ncerrs[i].status);
+        IF (strcmp(message, ncerrs[i].msg) != 0)
+            error(" nc_strerror(%d) should return %s, not %s",
+                  ncerrs[i].status, ncerrs[i].msg, message);
+        ELSE_NOK
     }
+    return nok;
 }
 
 
 /*
- * Test nc_open.
+ * Test  nc_open.
  * If in read-only section of tests,
  *    Try to open a non-existent netCDF file, check error return.
  *    Open a file that is not a netCDF file, check error return.
  *    Open a netCDF file with a bad mode argument, check error return.
- *    Open a netCDF file with NC_NOWRITE mode, try to write, check error.
+ *    Open a netCDF file with NC_NOWRITE, read-only mode, try to write, check error.
  *    Try to open a netcdf twice, check whether returned netcdf ids different.
  * If in writable section of tests,
  *    Open a netCDF file with NC_WRITE mode, write something, close it.
  * On exit, any open netCDF files are closed.
  */
-void
+#define NOT_NC_FILE "dummy_not_nc_file"
+int
 test_nc_open(void)
 {
-    int err;
-    int ncid;
-    int ncid2;
+    int err, ncid, ncid2, nok=0;
+#if 0
+    int fd;
+    ssize_t w_len;
+#endif
 
     /* Try to open a nonexistent file */
-    err = file_open("tooth-fairy.nc", NC_NOWRITE, &ncid);/* should fail */
-    IF (err == NC_NOERR)
-	error("nc_open of nonexistent file should have failed");
+    err = file_open("tooth-fairy.nc", NC_NOWRITE, &ncid); /* should fail */
+
+    /* on some systems (such as Lustre), opening an nonexisting file will
+     * actually create the file. In this case, we print the error messages on
+     * screen and move on to the next test, instead of aborting the entire test.
+     * The created file will be of zero-length and PnetCDF should complain it
+     * is not an NC file, i.e. NC_ENOTNC.
+     */
+    IF (err == NC_NOERR) {
+        error("opening a nonexistent file expects to fail, but got NC_NOERR\n");
+    }
+
 #ifndef USE_PARALLEL
     IF (! NC_ISSYSERR(err))
-	error("nc_open of nonexistent file should have returned system error");
+        error("nc_open of nonexistent file should have returned system error");
 #endif
 
     /* Open a file that is not a netCDF file.  But need a portable
      * test that also works for cross-compiles ... */
     /* err = nc_open("nc_test.o", NC_NOWRITE, &ncid);/\* should fail *\/ */
     /* IF (err != NC_ENOTNC) */
-    /* 	error("nc_open of non-netCDF file: status = %d", err); */
+    /*  error("nc_open of non-netCDF file: status = %d", err); */
+
+#if 0
+    /* create a not-nc file */
+    fd = open(NOT_NC_FILE, O_CREAT|O_WRONLY, 0600);
+    IF (fd == -1) {
+        error("Error: creating a non-CDF file (%s)", strerror(errno));
+    }
+    else {
+        w_len = write(fd, "0123456789abcdefghijklmnopqrstuvwxyz", 36);
+        assert(w_len >= 0);
+        close(fd);
+    }
+
+    /* Open a file that is not a netCDF file. */
+    err = file_open(NOT_NC_FILE, NC_NOWRITE, &ncid); /* should fail */
+    IF (err != NC_ENOTNC)
+        error("expecting NC_ENOTNC or NC_EFILE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* delete the not-nc file */
+    unlink(NOT_NC_FILE);
+#endif
 
     /* Open a netCDF file in read-only mode, check that write fails */
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
-    err = nc_redef(ncid);	/* should fail */
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+    ELSE_NOK
+    err =  nc_redef(ncid);        /* should fail */
     IF (err != NC_EPERM)
-	error("nc_redef of read-only file should fail");
+        error("expecting NC_EPERM but got %s", nc_err_code_name(err));
     /* Opened OK, see if can open again and get a different netCDF ID */
     err = file_open(testfile, NC_NOWRITE, &ncid2);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     else {
-	(void) nc_close(ncid2);
+         nc_close(ncid2);
+        nok++;
     }
     IF (ncid2 == ncid)
-	error("netCDF IDs for first and second nc_open calls should differ");
-
-    err = file_create(scratch, NC_NOCLOBBER, &ncid2);
-    IF (err)
-       error("nc_create: %s", nc_strerror(err));
-    else
-       (void) nc_close(ncid2);
-    err = file_open(scratch, NC_WRITE, &ncid2);
-    IF (err)
-       error("nc_open: %s", nc_strerror(err));
-    else
-       (void) nc_close(ncid2);
-    err = remove(scratch);
-    IF (err)
-       error("remove of %s failed", scratch);
-
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+        error("netCDF IDs for first and second open calls should differ");
+
+    
+    {   /* tests using netCDF scratch file */
+        err = file_create(scratch, NC_NOCLOBBER, &ncid2);
+        IF (err != NC_NOERR)
+            error("create: %s",  nc_strerror(err));
+        else
+             nc_close(ncid2);
+        err = file_open(scratch, NC_WRITE, &ncid2);
+        IF (err != NC_NOERR)
+            error("open: %s",  nc_strerror(err));
+        else {
+             nc_close(ncid2);
+            nok++;
+        }
+        err = nc_delete(scratch);
+        IF (err != NC_NOERR)
+            error("remove of %s failed", scratch);
+    }
+
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 /*
- * Test nc_close.
+ * Test  nc_close.
  *    Try to close a netCDF file twice, check whether second close fails.
  *    Try on bad handle, check error return.
  *    Try in define mode and data mode.
  */
-void
+int
 test_nc_close(void)
 {
-    int ncid, err;
+    int ncid, nok=0;
+    int err = file_open(testfile, NC_NOWRITE, &ncid);
 
-    err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     /* Close a netCDF file twice, second time should fail */
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close failed: %s", nc_strerror(err));
-    err = nc_close(ncid);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close failed: %s",  nc_strerror(err));
+    ELSE_NOK
+    err =  nc_close(ncid);
     IF (err != NC_EBADID)
-	error("nc_close of closed file should have failed");
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
     /* Try with a bad netCDF ID */
-    err = nc_close(BAD_ID);/* should fail */
+    err =  nc_close(BAD_ID);/* should fail */
     IF (err != NC_EBADID)
-	error("nc_close with bad netCDF ID returned wrong error (%d)", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
     /* Close in data mode */
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close in data mode failed: %s", nc_strerror(err));
-
-    err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err)
-       error("nc_create: %s", nc_strerror(err));
-    err = nc_close(ncid);
-    IF (err)
-       error("nc_close in define mode: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
-       error("remove of %s failed", scratch);
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close in data mode failed: %s",  nc_strerror(err));
+    ELSE_NOK
+
+    
+    {   /* tests using netCDF scratch file */
+        err = file_create(scratch, NC_NOCLOBBER, &ncid);
+        IF (err != NC_NOERR)
+            error("create: %s",  nc_strerror(err));
+        err =  nc_close(ncid);
+        IF (err != NC_NOERR)
+            error("close in define mode: %s",  nc_strerror(err));
+        ELSE_NOK
+        err = nc_delete(scratch);
+        IF (err != NC_NOERR)
+            error("remove of %s failed", scratch);
+    }
+    return nok;
 }
 
 
 /*
- * Test nc_inq.
+ * Test  nc_inq
  *    Try on bad handle, check error return.
  *    Try in data mode, check returned values.
  *    Try asking for subsets of info.
@@ -200,275 +275,299 @@ test_nc_close(void)
  *    Try in define mode, after adding an unlimited dimension, variable.
  * On exit, any open netCDF files are closed.
  */
-void
+int
 test_nc_inq(void)
 {
     int ncid;
-    int ndims;			/* number of dimensions */
-    int nvars;			/* number of variables */
-    int ngatts;			/* number of global attributes */
-    int recdim;			/* id of unlimited dimension */
+    int ndims;                        /* number of dimensions */
+    int nvars;                        /* number of variables */
+    int ngatts;                       /* number of global attributes */
+    int recdim;                       /* id of unlimited dimension */
     int err;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     /* Try on bad handle */
-    err = nc_inq(BAD_ID, 0, 0, 0, 0);
+    err =  nc_inq(BAD_ID, 0, 0, 0, 0);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-    err = nc_inq(ncid, &ndims, &nvars, &ngatts, &recdim);
-    IF (err)
-	error("nc_inq: %s", nc_strerror(err));
+    err =  nc_inq(ncid, &ndims, &nvars, &ngatts, &recdim);
+    IF (err != NC_NOERR)
+        error("inq: %s",  nc_strerror(err));
     else IF (ndims != NDIMS)
-	error("nc_inq: wrong number of dimensions returned, %d", ndims);
+        error("inq: wrong number of dimensions returned, %d", ndims);
     else IF (nvars != numVars)
-	error("nc_inq: wrong number of variables returned, %d", nvars);
+        error("inq: wrong number of variables returned, %d", nvars);
     else IF (ngatts != numGatts)
-	error("nc_inq: wrong number of global atts returned, %d", ngatts);
+        error("inq: wrong number of global atts returned, %d", ngatts);
     else IF (recdim != RECDIM)
-	error("nc_inq: wrong record dimension ID returned, %d", recdim);
+        error("inq: wrong record dimension ID returned, %d", recdim);
+    ELSE_NOK
 
     /* Inguire for no info (useless, but should still work) */
-    err = nc_inq(ncid, 0, 0, 0, 0);
-    IF (err)
-	error("nc_inq for no info failed: %s", nc_strerror(err));
+    err =  nc_inq(ncid, 0, 0, 0, 0);
+    IF (err != NC_NOERR)
+        error("inq for no info failed: %s",  nc_strerror(err));
+    ELSE_NOK
 
     /* Inguire for subsets of info */
-    ngatts = numGatts - 1;	/* wipe out previous correct value */
-    err = nc_inq(ncid, 0, 0, &ngatts, 0);
-    IF (err)
-	error("nc_inq for one item failed: %s", nc_strerror(err));
+    ngatts = numGatts - 1;        /* wipe out previous correct value */
+    err =  nc_inq(ncid, 0, 0, &ngatts, 0);
+    IF (err != NC_NOERR)
+        error("inq for one item failed: %s",  nc_strerror(err));
     else IF (ngatts != numGatts)
-	error("nc_inq subset: wrong number of global atts returned, %d", ngatts);
+        error("inq subset: wrong number of global atts returned, %d", ngatts);
+    ELSE_NOK
     ndims = NDIMS - 1;
     nvars = numVars - 1;
-    err = nc_inq(ncid, &ndims, &nvars, 0, 0);
-    IF (err)
-	error("nc_inq for two items failed: %s", nc_strerror(err));
+    err =  nc_inq(ncid, &ndims, &nvars, 0, 0);
+    IF (err != NC_NOERR)
+        error("inq for two items failed: %s",  nc_strerror(err));
     else IF (ndims != NDIMS)
-	error("nc_inq subset: wrong number of dimensions returned, %d", ndims);
+        error("inq subset: wrong number of dimensions returned, %d", ndims);
     else IF (nvars != numVars)
-	error("nc_inq subset: wrong number of variables returned, %d", nvars);
-
-    {		/* tests using netCDF scratch file */
-	int ncid2;		/* for scratch netCDF dataset */
-
-#ifdef TEST_PNETCDF
-        err = nc_create_par(scratch, NC_NOCLOBBER|NC_PNETCDF, MPI_COMM_WORLD, MPI_INFO_NULL, &ncid2);
-#else
-        err = nc_create(scratch, NC_NOCLOBBER, &ncid2);
-#endif
-        IF (err) {
-            error("nc_create: %s", nc_strerror(err));
-	} else {		/* add dim, var, gatt, check inq */
-	    int ndims0;
-	    int nvars0;
-	    int ngatts0;
-	    int recdim0;
-	    err = nc_enddef(ncid2); /* enter data mode */
-	    IF (err)
-		error("nc_enddef: %s", nc_strerror(err));
-	    err = nc_inq(ncid2, &ndims0, &nvars0, &ngatts0, &recdim0);
-	    IF (err)
-		error("nc_inq: %s", nc_strerror(err));
-	    err = nc_redef(ncid2); /* enter define mode */
-	    IF (err)
-		error("nc_redef: %s", nc_strerror(err));
-	    /* Check that inquire still works in define mode */
-	    err = nc_inq(ncid2, &ndims, &nvars, &ngatts, &recdim);
-	    IF (err)
-		error("nc_inq in define mode: %s", nc_strerror(err));
-	    else IF (ndims != ndims0)
-		error("nc_inq in define mode: ndims wrong, %d", ndims);
-	    else IF (nvars != nvars0)
-		error("nc_inq in define mode: nvars wrong, %d", nvars);
-	    else IF (ngatts != ngatts0)
-		error("nc_inq in define mode: ngatts wrong, %d", ngatts);
-	    else IF (recdim != recdim0)
-		error("nc_inq in define mode: recdim wrong, %d", recdim);
-
-	    {
-		int did, vid;
-		/* Add dim, var, global att */
-		err = nc_def_dim(ncid2, "inqd", 1L, &did);
-		IF (err)
-		    error("nc_def_dim: %s", nc_strerror(err));
-		err = nc_def_var(ncid2, "inqv", NC_FLOAT, 0, 0, &vid);
-		IF (err)
-		    error("nc_def_var: %s", nc_strerror(err));
-	    }
-	    err = nc_put_att_text(ncid2, NC_GLOBAL, "inqa", 1+strlen("stuff"),
-				   "stuff");
-	    IF (err)
-		error("nc_put_att_text: %s", nc_strerror(err));
-
-	    /* Make sure nc_inq sees the additions while in define mode */
-	    err = nc_inq(ncid2, &ndims, &nvars, &ngatts, &recdim);
-	    IF (err)
-		error("nc_inq in define mode: %s", nc_strerror(err));
-	    else IF (ndims != ndims0 + 1)
-		error("nc_inq in define mode: ndims wrong, %d", ndims);
-	    else IF (nvars != nvars0 + 1)
-		error("nc_inq in define mode: nvars wrong, %d", nvars);
-	    else IF (ngatts != ngatts0 + 1)
-		error("nc_inq in define mode: ngatts wrong, %d", ngatts);
-	    err = nc_enddef(ncid2);
-	    IF (err)
-		error("nc_enddef: %s", nc_strerror(err));
-
-	    /* Make sure nc_inq stills sees additions in data mode */
-	    err = nc_inq(ncid2, &ndims, &nvars, &ngatts, &recdim);
-	    IF (err)
-		error("nc_inq failed in data mode: %s", nc_strerror(err));
-	    else IF (ndims != ndims0 + 1)
-		error("nc_inq in define mode: ndims wrong, %d", ndims);
-	    else IF (nvars != nvars0 + 1)
-		error("nc_inq in define mode: nvars wrong, %d", nvars);
-	    else IF (ngatts != ngatts0 + 1)
-		error("nc_inq in define mode: ngatts wrong, %d", ngatts);
-	    (void) nc_close(ncid2);
-	    err = remove(scratch);
-	    IF (err)
-		error("remove of %s failed", scratch);
-	}
+        error("inq subset: wrong number of variables returned, %d", nvars);
+    ELSE_NOK
+
+    
+    {   /* tests using netCDF scratch file */
+        int ncid2;              /* for scratch netCDF dataset */
+
+        err = file_create(scratch, NC_NOCLOBBER, &ncid2);
+        IF (err != NC_NOERR) {
+            error("create: %s",  nc_strerror(err));
+        } else {                /* add dim, var, gatt, check inq */
+            int ndims0;
+            int nvars0;
+            int ngatts0;
+            int recdim0;
+            err =  nc_enddef(ncid2); /* enter data mode */
+            err =  nc_inq(ncid2, &ndims0, &nvars0, &ngatts0, &recdim0);
+            IF (err != NC_NOERR)
+                error("inq: %s",  nc_strerror(err));
+            ELSE_NOK
+            err =  nc_redef(ncid2); /* enter define mode */
+            /* Check that inquire still works in define mode */
+            err =  nc_inq(ncid2, &ndims, &nvars, &ngatts, &recdim);
+            IF (err != NC_NOERR)
+                error("inq in define mode: %s",  nc_strerror(err));
+            else IF (ndims != ndims0)
+                error("inq in define mode: ndims wrong, %d", ndims);
+            else IF (nvars != nvars0)
+                error("inq in define mode: nvars wrong, %d", nvars);
+            else IF (ngatts != ngatts0)
+                error("inq in define mode: ngatts wrong, %d", ngatts);
+            else IF (recdim != recdim0)
+                error("inq in define mode: recdim wrong, %d", recdim);
+            ELSE_NOK
+
+            {
+                int did, vid;
+                /* Add dim, var, global att */
+                err =  nc_def_dim(ncid2, "inqd", 1L, &did);
+                IF (err != NC_NOERR)
+                    error("def_dim: %s",  nc_strerror(err));
+                err =  nc_def_var(ncid2, "inqv", NC_FLOAT, 0, 0, &vid);
+                IF (err != NC_NOERR)
+                    error("def_var: %s",  nc_strerror(err));
+            }
+            err =  nc_put_att_text(ncid2, NC_GLOBAL, "inqa", 1+strlen("stuff"),
+                                   "stuff");
+            IF (err != NC_NOERR)
+                error("put_att_text: %s",  nc_strerror(err));
+
+            /* Make sure  nc_inq sees the additions while in define mode */
+            err =  nc_inq(ncid2, &ndims, &nvars, &ngatts, &recdim);
+            IF (err != NC_NOERR)
+                error("inq in define mode: %s",  nc_strerror(err));
+            else IF (ndims != ndims0 + 1)
+                error("inq in define mode: ndims wrong, %d", ndims);
+            else IF (nvars != nvars0 + 1)
+                error("inq in define mode: nvars wrong, %d", nvars);
+            else IF (ngatts != ngatts0 + 1)
+                error("inq in define mode: ngatts wrong, %d", ngatts);
+            ELSE_NOK
+            err =  nc_enddef(ncid2);
+            IF (err != NC_NOERR)
+                error("enddef: %s",  nc_strerror(err));
+
+            /* Make sure  nc_inq stills sees additions in data mode */
+            err =  nc_inq(ncid2, &ndims, &nvars, &ngatts, &recdim);
+            IF (err != NC_NOERR)
+                error("inq failed in data mode: %s",  nc_strerror(err));
+            else IF (ndims != ndims0 + 1)
+                error("inq in define mode: ndims wrong, %d", ndims);
+            else IF (nvars != nvars0 + 1)
+                error("inq in define mode: nvars wrong, %d", nvars);
+            else IF (ngatts != ngatts0 + 1)
+                error("inq in define mode: ngatts wrong, %d", ngatts);
+            ELSE_NOK
+             nc_close(ncid2);
+            err = nc_delete(scratch);
+            IF (err != NC_NOERR)
+                error("remove of %s failed", scratch);
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_natts(void)
 {
     int ncid;
-    int ngatts;			/* number of global attributes */
-    int err;
+    int ngatts;                        /* number of global attributes */
+    int err, nok=0;
 
-    err = nc_inq_natts(BAD_ID, &ngatts);
+    err =  nc_inq_natts(BAD_ID, &ngatts);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
-    err = nc_inq_natts(ncid, &ngatts);
-    IF (err)
-	error("nc_inq_natts: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+    err =  nc_inq_natts(ncid, &ngatts);
+    IF (err != NC_NOERR)
+        error("inq_natts: %s",  nc_strerror(err));
     else IF (ngatts != numGatts)
-	error("nc_inq_natts: wrong number of global atts returned, %d", ngatts);
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+        error("inq_natts: wrong number of global atts returned, %d", ngatts);
+    ELSE_NOK
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_ndims(void)
 {
     int ncid;
     int ndims;
     int err;
+    int nok=0;
 
-    err = nc_inq_ndims(BAD_ID, &ndims);
+    err =  nc_inq_ndims(BAD_ID, &ndims);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
-    err = nc_inq_ndims(ncid, &ndims);
-    IF (err)
-	error("nc_inq_ndims: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+    err =  nc_inq_ndims(ncid, &ndims);
+    IF (err != NC_NOERR)
+        error("inq_ndims: %s",  nc_strerror(err));
     else IF (ndims != NDIMS)
-	error("nc_inq_ndims: wrong number returned, %d", ndims);
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+        error("inq_ndims: wrong number returned, %d", ndims);
+    ELSE_NOK
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_nvars(void)
 {
     int ncid;
     int nvars;
     int err;
+    int nok=0;
 
-    err = nc_inq_nvars(BAD_ID, &nvars);
+    err =  nc_inq_nvars(BAD_ID, &nvars);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
-    err = nc_inq_nvars(ncid, &nvars);
-    IF (err)
-	error("nc_inq_nvars: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+    err =  nc_inq_nvars(ncid, &nvars);
+    IF (err != NC_NOERR)
+        error("inq_nvars: %s",  nc_strerror(err));
     else IF (nvars != numVars)
-	error("nc_inq_nvars: wrong number returned, %d", nvars);
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+        error("inq_nvars: wrong number returned, %d", nvars);
+    ELSE_NOK
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_unlimdim(void)
 {
     int ncid;
     int unlimdim;
     int err;
+    int nok=0;
 
-    err = nc_inq_unlimdim(BAD_ID, &unlimdim);
+    err =  nc_inq_unlimdim(BAD_ID, &unlimdim);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
-    err = nc_inq_unlimdim(ncid, &unlimdim);
-    IF (err)
-	error("nc_inq_unlimdim: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+    err =  nc_inq_unlimdim(ncid, &unlimdim);
+    IF (err != NC_NOERR)
+        error("inq_unlimdim: %s",  nc_strerror(err));
     else IF (unlimdim != RECDIM)
-	error("nc_inq_unlimdim: wrong number returned, %d", unlimdim);
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+        error("inq_unlimdim: wrong number returned, %d", unlimdim);
+    ELSE_NOK
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_dimid(void)
 {
     int ncid;
     int dimid;
     int i;
     int err;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
-    err = nc_inq_dimid(ncid, "noSuch", &dimid);
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+    err =  nc_inq_dimid(ncid, "noSuch", &dimid);
     IF (err != NC_EBADDIM)
-	error("bad dim name: status = %d", err);
+        error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+    ELSE_NOK
     for (i = 0; i < NDIMS; i++) {
-	err = nc_inq_dimid(BAD_ID, dim_name[i], &dimid);
-	IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_dimid(ncid, dim_name[i], &dimid);
-	IF (err)
-	    error("nc_inq_dimid: %s", nc_strerror(err));
-	else IF (dimid != i)
-	    error("expected %d, got %d", i, dimid);
+        err =  nc_inq_dimid(BAD_ID, dim_name[i], &dimid);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_dimid(ncid, dim_name[i], &dimid);
+        IF (err != NC_NOERR)
+            error("inq_dimid: %s",  nc_strerror(err));
+        else IF (dimid != i)
+            error("expected %d, got %d", i, dimid);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_dim(void)
 {
     int ncid;
@@ -476,138 +575,161 @@ test_nc_inq_dim(void)
     int err;
     char name[NC_MAX_NAME];
     size_t length;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < NDIMS; i++) {
-	err = nc_inq_dim(BAD_ID, i, name, &length);
+        err =  nc_inq_dim(BAD_ID, i, name, &length);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_dim(ncid, BAD_DIMID, name, &length);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_dim(ncid, BAD_DIMID, name, &length);
         IF (err != NC_EBADDIM)
-	    error("bad dimid: status = %d", err);
-	err = nc_inq_dim(ncid, i, 0, 0);
-	IF (err)
-	    error("nc_inq_dim: %s", nc_strerror(err));
-	err = nc_inq_dim(ncid, i, name, &length);
-	IF (err)
-	    error("nc_inq_dim: %s", nc_strerror(err));
-	else IF (strcmp(dim_name[i],name))
-	    error("name expected: %s, got: %s",dim_name[i],name);
-	else IF (dim_len[i] != length)
-	    error("size expected: %d, got: %d",dim_len[i],length);
-	err = nc_inq_dim(ncid, i, name, 0);
-        IF (err)
-	    error("nc_inq_dim: %s", nc_strerror(err));
-	else IF (strcmp(dim_name[i],name))
-	    error("name expected: %s, got: %s",dim_name[i],name);
-	err = nc_inq_dim(ncid, i, 0, &length);
-        IF (err)
-	    error("nc_inq_dim: %s", nc_strerror(err));
-	else IF (dim_len[i] != length)
-	    error("size expected: %d, got: %d",dim_len[i],length);
+            error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_dim(ncid, i, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s",  nc_strerror(err));
+        ELSE_NOK
+        err =  nc_inq_dim(ncid, i, name, &length);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s",  nc_strerror(err));
+        else IF (strcmp(dim_name[i],name))
+            error("name expected: %s, got: %s",dim_name[i],name);
+        else IF (dim_len[i] != length)
+            error("size expected: %d, got: %d",dim_len[i],length);
+        ELSE_NOK
+        err =  nc_inq_dim(ncid, i, name, 0);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s",  nc_strerror(err));
+        else IF (strcmp(dim_name[i],name))
+            error("name expected: %s, got: %s",dim_name[i],name);
+        ELSE_NOK
+        err =  nc_inq_dim(ncid, i, 0, &length);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s",  nc_strerror(err));
+        else IF (dim_len[i] != length)
+            error("size expected: %d, got: %d",dim_len[i],length);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_dimlen(void)
 {
     int ncid;
     int i;
     int err;
-    size_t length;
+    size_t  length;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < NDIMS; i++) {
-	err = nc_inq_dimlen(BAD_ID, i, &length);
+        err =  nc_inq_dimlen(BAD_ID, i, &length);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_dimlen(ncid, BAD_DIMID, &length);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_dimlen(ncid, BAD_DIMID, &length);
         IF (err != NC_EBADDIM)
-	    error("bad dimid: status = %d", err);
-	err = nc_inq_dimlen(ncid, i, &length);
-	IF (err)
-	    error("nc_inq_dimlen: %s", nc_strerror(err));
-	else IF (dim_len[i] != length)
-	    error("size expected: %d, got: %d",dim_len[i],length);
+            error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_dimlen(ncid, i, &length);
+        IF (err != NC_NOERR)
+            error("inq_dimlen: %s",  nc_strerror(err));
+        else IF (dim_len[i] != length)
+            error("size expected: %d, got: %d",dim_len[i],length);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_dimname(void)
 {
     int ncid;
     int i;
     int err;
     char name[NC_MAX_NAME];
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < NDIMS; i++) {
-	err = nc_inq_dimname(BAD_ID, i, name);
+        err =  nc_inq_dimname(BAD_ID, i, name);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_dimname(ncid, BAD_DIMID, name);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_dimname(ncid, BAD_DIMID, name);
         IF (err != NC_EBADDIM)
-	    error("bad dimid: status = %d", err);
-	err = nc_inq_dimname(ncid, i, name);
-	IF (err)
-	    error("nc_inq_dimname: %s", nc_strerror(err));
-	else IF (strcmp(dim_name[i],name))
-	    error("name expected: %s, got: %s",dim_name[i],name);
+            error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_dimname(ncid, i, name);
+        IF (err != NC_NOERR)
+            error("inq_dimname: %s",  nc_strerror(err));
+        else IF (strcmp(dim_name[i],name))
+            error("name expected: %s, got: %s",dim_name[i],name);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_varid(void)
 {
     int ncid;
     int varid;
     int i;
     int err;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
-    err = nc_inq_varid(ncid, "noSuch", &varid);
+    err =  nc_inq_varid(ncid, "noSuch", &varid);
     IF (err != NC_ENOTVAR)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-	err = nc_inq_varid(BAD_ID, var_name[i], &varid);
+        err =  nc_inq_varid(BAD_ID, var_name[i], &varid);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_varid(ncid, var_name[i], &varid);
-        IF (err)
-	    error("nc_inq_varid: %s", nc_strerror(err));
-	else IF (varid != i)
-	    error("expected %d, got %d", i, varid);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_varid(ncid, var_name[i], &varid);
+        IF (err != NC_NOERR)
+            error("inq_varid: %s",  nc_strerror(err));
+        else IF (varid != i)
+            error("expected %d, got %d", i, varid);
+        ELSE_NOK
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_var(void)
 {
     int ncid;
@@ -618,342 +740,435 @@ test_nc_inq_var(void)
     int ndims;
     int dimids[MAX_RANK];
     int natts;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	err = nc_inq_var(BAD_ID, i, name, &datatype, &ndims, dimids, &natts);
+        err =  nc_inq_var(BAD_ID, i, name, &datatype, &ndims, dimids, &natts);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_var(ncid,BAD_VARID,name,&datatype,&ndims,dimids,&natts);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_var(ncid,BAD_VARID,name,&datatype,&ndims,dimids,&natts);
         IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	err = nc_inq_var(ncid, i, 0, 0, 0, 0, 0);
-	IF (err)
-	    error("nc_inq_var: %s", nc_strerror(err));
-	err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, &natts);
-	IF (err)
-	    error("nc_inq_var: %s", nc_strerror(err));
-	else IF (strcmp(var_name[i],name))
-	    error("name expected: %s, got: %s",var_name[i],name);
-	else IF (var_type[i] != datatype)
-	    error("type expected: %d, got: %d",var_type[i],datatype);
-	else IF (var_rank[i] != ndims)
-	    error("ndims expected: %d, got: %d",var_rank[i],ndims);
-	else IF (!int_vec_eq(var_dimid[i],dimids,ndims))
-	    error("unexpected dimid");
-	else IF (var_natts[i] != natts)
-	    error("natts expected: %d, got: %d",var_natts[i],natts);
-	err = nc_inq_var(ncid, i, name, 0, 0, 0, 0);
-        IF (err)
-	    error("nc_inq_var: %s", nc_strerror(err));
-	else IF (strcmp(var_name[i],name))
-	    error("name expected: %s, got: %s",var_name[i],name);
-	err = nc_inq_var(ncid, i, 0, &datatype, 0, 0, 0);
-        IF (err)
-	    error("nc_inq_var: %s", nc_strerror(err));
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_var(ncid, i, 0, 0, 0, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        ELSE_NOK
+        err =  nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, &natts);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        else IF (strcmp(var_name[i],name))
+            error("name expected: %s, got: %s",var_name[i],name);
+        else IF (var_type[i] != datatype)
+            error("type expected: %d, got: %d",var_type[i],datatype);
+        else IF (var_rank[i] != ndims)
+            error("ndims expected: %d, got: %d",var_rank[i],ndims);
+        else IF (!int_vec_eq(var_dimid[i],dimids,ndims))
+            error("unexpected dimid");
+        else IF (var_natts[i] != natts)
+            error("natts expected: %d, got: %d",var_natts[i],natts);
+        ELSE_NOK
+        err =  nc_inq_var(ncid, i, name, 0, 0, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
+        else IF (strcmp(var_name[i],name))
+            error("name expected: %s, got: %s",var_name[i],name);
+        ELSE_NOK
+        err =  nc_inq_var(ncid, i, 0, &datatype, 0, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
         else IF (var_type[i] != datatype)
             error("type expected: %d, got: %d",var_type[i],datatype);
-	err = nc_inq_var(ncid, i, 0, 0, &ndims, 0, 0);
-        IF (err)
-	    error("nc_inq_var: %s", nc_strerror(err));
+        ELSE_NOK
+        err =  nc_inq_var(ncid, i, 0, 0, &ndims, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
         else IF (var_rank[i] != ndims)
             error("ndims expected: %d, got: %d",var_rank[i],ndims);
-	err = nc_inq_var(ncid, i, 0, 0, 0, dimids, 0);
-        IF (err)
-	    error("nc_inq_var: %s", nc_strerror(err));
+        ELSE_NOK
+        err =  nc_inq_var(ncid, i, 0, 0, 0, dimids, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
         else IF (!int_vec_eq(var_dimid[i],dimids,ndims))
             error("unexpected dimid");
-	err = nc_inq_var(ncid, i, 0, 0, 0, 0, &natts);
-        IF (err)
-	    error("nc_inq_var: %s", nc_strerror(err));
+        ELSE_NOK
+        err =  nc_inq_var(ncid, i, 0, 0, 0, 0, &natts);
+        IF (err != NC_NOERR)
+            error("inq_var: %s",  nc_strerror(err));
         else IF (var_natts[i] != natts)
             error("natts expected: %d, got: %d",var_natts[i],natts);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_vardimid(void)
 {
     int ncid;
     int i;
     int err;
     int dimids[MAX_RANK];
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	err = nc_inq_vardimid(BAD_ID, i, dimids);
+        err =  nc_inq_vardimid(BAD_ID, i, dimids);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_vardimid(ncid, BAD_VARID, dimids);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_vardimid(ncid, BAD_VARID, dimids);
         IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	err = nc_inq_vardimid(ncid, i, dimids);
-	IF (err)
-	    error("nc_inq_vardimid: %s", nc_strerror(err));
-	else IF (!int_vec_eq(var_dimid[i], dimids, var_rank[i]))
-	    error("unexpected dimid");
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_vardimid(ncid, i, dimids);
+        IF (err != NC_NOERR)
+            error("inq_vardimid: %s",  nc_strerror(err));
+        else IF (!int_vec_eq(var_dimid[i], dimids, var_rank[i]))
+            error("unexpected dimid");
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_varname(void)
 {
     int ncid;
     int i;
     int err;
     char name[NC_MAX_NAME];
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	err = nc_inq_varname(BAD_ID, i, name);
+        err =  nc_inq_varname(BAD_ID, i, name);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_varname(ncid, BAD_VARID, name);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        nok++;
+        err =  nc_inq_varname(ncid, BAD_VARID, name);
         IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	err = nc_inq_varname(ncid, i, name);
-	IF (err)
-	    error("nc_inq_varname: %s", nc_strerror(err));
-	else IF (strcmp(var_name[i],name))
-	    error("name expected: %s, got: %s",var_name[i],name);
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_varname(ncid, i, name);
+        IF (err != NC_NOERR)
+            error("inq_varname: %s",  nc_strerror(err));
+        else IF (strcmp(var_name[i],name))
+            error("name expected: %s, got: %s",var_name[i],name);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_varnatts(void)
 {
     int ncid;
     int i;
     int err;
     int natts;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = -1; i < numVars; i++) {
-	err = nc_inq_varnatts(BAD_ID, i, &natts);
+        err =  nc_inq_varnatts(BAD_ID, i, &natts);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_varnatts(ncid, BAD_VARID, &natts);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_varnatts(ncid, BAD_VARID, &natts);
         IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	err = nc_inq_varnatts(ncid, VARID(i), &natts);
-	IF (err)
-	    error("nc_inq_varnatts: %s", nc_strerror(err));
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_varnatts(ncid, VARID(i), &natts);
+        IF (err != NC_NOERR)
+            error("inq_varnatts: %s",  nc_strerror(err));
         else IF (NATTS(i) != natts)
             error("natts expected: %d, got: %d",NATTS(i),natts);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_varndims(void)
 {
     int ncid;
     int i;
     int err;
     int ndims;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	err = nc_inq_varndims(BAD_ID, i, &ndims);
+        err =  nc_inq_varndims(BAD_ID, i, &ndims);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_varndims(ncid, BAD_VARID, &ndims);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_varndims(ncid, BAD_VARID, &ndims);
         IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	err = nc_inq_varndims(ncid, i, &ndims);
-	IF (err)
-	    error("nc_inq_varndims: %s", nc_strerror(err));
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_varndims(ncid, i, &ndims);
+        IF (err != NC_NOERR)
+            error("inq_varndims: %s",  nc_strerror(err));
         else IF (var_rank[i] != ndims)
             error("ndims expected: %d, got: %d",var_rank[i],ndims);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_vartype(void)
 {
     int ncid;
     int i;
     int err;
     nc_type datatype;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	err = nc_inq_vartype(BAD_ID, i, &datatype);
+        err =  nc_inq_vartype(BAD_ID, i, &datatype);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-	err = nc_inq_vartype(ncid, BAD_VARID, &datatype);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_vartype(ncid, BAD_VARID, &datatype);
         IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	err = nc_inq_vartype(ncid, i, &datatype);
-	IF (err)
-	    error("nc_inq_vartype: %s", nc_strerror(err));
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_vartype(ncid, i, &datatype);
+        IF (err != NC_NOERR)
+            error("inq_vartype: %s",  nc_strerror(err));
         else IF (var_type[i] != datatype)
             error("type expected: %d, got: %d", var_type[i], datatype);
+        ELSE_NOK
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 /*
- * Test nc_put_var1
+ * Test nc_get_var1(,,,)
  */
-void
+int
 test_nc_get_var1(void)
 {
     int ncid;
     int i;
-    int j;
     int err;
-    size_t index[MAX_RANK];
     double expect;
-    int nok = 0;		/* count of valid comparisons */
-    double buf[1];		/* (void *) buffer */
-    double value;
+    int nok = 0;                /* count of valid comparisons */
+    double buf[1];              /* (void *) buffer */
+    double value[1];
+    size_t j, index[MAX_RANK];
+    
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR) error("open: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_var1(BAD_ID,0,NULL,NULL);
+    IF (err != NC_EBADID) error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_var1(ncid,BAD_VARID,NULL,NULL);
+    IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+
     for (i = 0; i < numVars; i++) {
-	for (j = 0; j < var_rank[i]; j++)
-	    index[j] = 0;
-        err = nc_get_var1(BAD_ID, i, index, buf);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_var1(BAD_ID,i,NULL,value);
         IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_var1(ncid, BAD_VARID, index, buf);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    index[j] = var_shape[i][j];
-	    err = nc_get_var1(ncid, i, index, buf);
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) {
+            index[j] = var_shape[i][j];
+            err = nc_get_var1(ncid,i,index,buf);
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    index[j] = 0;
-	}
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+        }
+        err = nc_get_var1(ncid,i,index,value);
+        IF (err != NC_NOERR)
+            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        /* check if the contents are supposed to be */
         for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase 2");
-	    expect = hash( var_type[i], var_rank[i], index );
-            if (var_rank[i] == 0 && i%2 )
-		err = nc_get_var1(ncid, i, NULL, buf);
-	    else
-		err = nc_get_var1(ncid, i, index, buf);
-	    IF (err)
-		error("%s", nc_strerror(err));
-	    err = nc2dbl( var_type[i], buf, &value );
-	    IF (err)
-		error("error in nc2dbl");
-	    if (inRange(expect,var_type[i])) {
-		IF (!equal(value,expect,var_type[i],NCT_DOUBLE)) {
-		    error("expected: %G, got: %G", expect, value);
-		} else {
-		    nok++;
-		}
-	    }
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash( var_type[i], var_rank[i], index );
+            err = nc_get_var1(ncid,i,index,buf);
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            err = nc2dbl( var_type[i], buf, &value[0]);
+            IF (err)
+                error("error in nc2dbl");
+            if (inRange(expect,var_type[i])) {
+                IF (!equal2(value[0],expect,var_type[i]))
+                    error("expected: %G, got: %G", expect, value[0]);
+                ELSE_NOK
+            }
         }
     }
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
+
 /*
- * Test nc_get_vara
+ * Test nc_get_vara(,,,,)
  * Choose a random point dividing each dim into 2 parts
  * Get 2^rank (nslabs) slabs so defined
  * Each get overwrites buffer, so check after each get.
  */
-void
+int
 test_nc_get_vara(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nels;
-    int nslabs;
+    int ncid, d, i, k, err, nslabs;
     int nok = 0;      /* count of valid comparisons */
+    size_t j, nels;
     size_t start[MAX_RANK];
     size_t edge[MAX_RANK];
     size_t index[MAX_RANK];
     size_t mid[MAX_RANK];
-    double buf[MAX_NELS];	/* (void *) buffer */
-    char *p;			/* (void *) pointer */
+    
+    double buf[MAX_NELS];        /* (void *) buffer */
     double expect;
-    double got;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_vara(BAD_ID,0,NULL,NULL,NULL);
+    IF (err != NC_EBADID) error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_vara(ncid,BAD_VARID,NULL,NULL,NULL);
+    IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+
     for (i = 0; i < numVars; i++) {
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vara(BAD_ID,i,NULL,NULL,buf);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
         }
-        err = nc_get_vara(BAD_ID, i, start, edge, buf);
-        IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vara(ncid, BAD_VARID, start, edge, buf);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vara(ncid, i, start, edge, buf);
+
+
+        /* test NC_EINVALCOORDS, first when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            index[j] = var_shape[i][j];
+            err = nc_get_vara(ncid,i,index,edge,buf);
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vara(ncid, i, start, edge, buf);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
+            edge[j] = var_shape[i][j] + 1;  /* edge error check */
+            err = nc_get_vara(ncid,i,start,edge,buf);
             IF (err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	}
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vara(ncid,i,start,edge,buf);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1;  /* out of boundary check */
+            err = nc_get_vara(ncid,i,start,edge,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        err = nc_get_vara(ncid,i,start,edge,buf);
+        IF (err != NC_NOERR)
+            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
+        /* bits of k determine whether to get lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
             nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
@@ -966,72 +1181,64 @@ test_nc_get_vara(void)
                 }
                 nels *= edge[j];
             }
-            if (var_rank[i] == 0 && i%2 )
-		err = nc_get_vara(ncid, i, NULL, NULL, buf);
-	    else
-		err = nc_get_vara(ncid, i, start, edge, buf);
-	    IF (err) {
-		error("%s", nc_strerror(err));
-	    } else {
-		for (j = 0; j < nels; j++) {
-                    p = (char *) buf;
-                    p += j * nctypelen(var_type[i]);
-		    err = nc2dbl( var_type[i], p, & got );
-		    IF (err)
-			error("error in nc2dbl");
-		    err = toMixedBase(j, var_rank[i], edge, index);
-		    IF (err)
-			error("error in toMixedBase 1");
-		    for (d = 0; d < var_rank[i]; d++)
-			index[d] += start[d];
-		    expect = hash(var_type[i], var_rank[i], index);
-		    if (inRange(expect,var_type[i])) {
-			IF (!equal(got,expect,var_type[i],NCT_DOUBLE)) {
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ", var_name[i]);
-				error("element number: %d ", j);
-				error("expect: %g", expect);
-				error("got: %g", got);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
-		}
-	    }
-	}
+            err = nc_get_vara(ncid,i,start,edge,buf);
+            IF (err != NC_NOERR)
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+            ELSE_NOK
+
+            for (j = 0; j < nels; j++) {
+                double got;
+                char *p = (char *) buf;
+                p += j * (size_t)nctypelen(var_type[i]);
+                err = nc2dbl( var_type[i], p, & got );
+                IF (err) error("error in nc2dbl");
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                expect = hash(var_type[i], var_rank[i], index);
+                if (inRange(expect,var_type[i])) {
+                    IF (!equal2(got,expect,var_type[i])) {
+                        error("buf read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("element number: %d ", j);
+                            error("expect: %g", expect);
+                            error("got: %g", got);
+                        }
+                    }
+                }
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 /*
- * Test nc_get_vars
+ * Test nc_get_vars(,,,,,)
  * Choose a random point dividing each dim into 2 parts
  * Get 2^rank (nslabs) slabs so defined
  * Each get overwrites buffer, so check after each get.
  */
-void
+int
 test_nc_get_vars(void)
 {
     int ncid;
     int d;
     int i;
-    int j;
     int k;
-    int m;
     int err;
-    int nels;
     int nslabs;
-    int nstarts;	/* number of different starts */
-    int nok = 0;	/* total count of valid comparisons */
-    int n;		/* count of valid comparisons within var */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* total count of valid comparisons */
+    int n;              /* count of valid comparisons within var */
+    size_t j, m, nels;
     size_t start[MAX_RANK];
     size_t edge[MAX_RANK];
     size_t index[MAX_RANK];
@@ -1040,55 +1247,104 @@ test_nc_get_vars(void)
     size_t count[MAX_RANK];
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
+    
     double buf[MAX_NELS];     /* (void *) buffer */
-    char *p;			/* (void *) pointer */
+    char *p;                  /* (void *) pointer */
     double expect;
     double got;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_vars(BAD_ID,0,NULL,NULL,NULL,NULL);
+    IF (err != NC_EBADID) error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_vars(ncid,BAD_VARID,NULL,NULL,NULL,NULL);
+    IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+
     for (i = 0; i < numVars; i++) {
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_vars(BAD_ID,i,NULL,NULL,NULL,buf);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_get_vars(BAD_ID, i, start, edge, stride, buf);
-        IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_vars(ncid, BAD_VARID, start, edge, stride, buf);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_vars(ncid, i, start, edge, stride, buf);
+
+
+        /* test NC_EINVALCOORDS, first when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j];
+            err = nc_get_vars(ncid,i,start,edge,stride,buf);
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_vars(ncid, i, start, edge, stride, buf);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_get_vars(ncid,i,start,edge,stride,buf);
             IF (err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	    stride[j] = 0;
-	    err = nc_get_vars(ncid, i, start, edge, stride, buf);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_get_vars(ncid,i,start,edge,stride,buf);
             IF (err != NC_ESTRIDE)
-		error("bad stride: status = %d", err);
-	    stride[j] = 1;
-	}
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_vars(ncid,i,start,edge,stride,buf);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1;  /* out of boundary check */
+            err = nc_get_vars(ncid,i,start,edge,stride,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        err = nc_get_vars(ncid,i,start,edge,stride,buf);
+        IF (err != NC_NOERR)
+            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
-	n = 0;
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        n = 0;
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
@@ -1099,105 +1355,99 @@ test_nc_get_vars(void)
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
-	    for (m = 0; m < nstarts; m++) {
-		err = toMixedBase(m, var_rank[i], sstride, index);
-		IF (err)
-		    error("error in toMixedBase");
-		nels = 1;
-		for (j = 0; j < var_rank[i]; j++) {
-		    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-		    nels *= count[j];
-		    index[j] += start[j];
-		}
-			/* Random choice of forward or backward */
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
 /* TODO
-		if ( roll(2) ) {
-		    for (j = 0; j < var_rank[i]; j++) {
-			index[j] += (count[j] - 1) * stride[j];
-			stride[j] = -stride[j];
-		    }
-		}
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
  */
-		if (var_rank[i] == 0 && i%2 )
-		    err = nc_get_vars(ncid, i, NULL, NULL, NULL, buf);
-		else
-		    err = nc_get_vars(ncid, i, index, count, stride, buf);
-		IF (err) {
-		    error("%s", nc_strerror(err));
-		} else {
-		    for (j = 0; j < nels; j++) {
-			p = (char *) buf;
-			p += j * nctypelen(var_type[i]);
-			err = nc2dbl( var_type[i], p, & got );
-			IF (err)
-			    error("error in nc2dbl");
-			err = toMixedBase(j, var_rank[i], count, index2);
-			IF (err)
-			    error("error in toMixedBase 1");
-			for (d = 0; d < var_rank[i]; d++)
-			    index2[d] = index[d] + index2[d] * stride[d];
-			expect = hash(var_type[i], var_rank[i], index2);
-			if (inRange(expect,var_type[i])) {
-			    IF (!equal(got,expect,var_type[i],NCT_DOUBLE)) {
-				error("value read not that expected");
-				if (verbose) {
-				    error("\n");
-				    error("varid: %d, ", i);
-				    error("var_name: %s, ", var_name[i]);
-				    error("element number: %d ", j);
-				    error("expect: %g, ", expect);
-				    error("got: %g ", got);
-				}
-			    } else {
-				nok++;
-			    }
-			}
-			n++;
-		    }
-		}
-	    }
-	}
-	IF (n != var_nels[i]) {
-	    error("count != nels");
-	    if (verbose) {
-		error("\n");
-		error("varid: %d, ", i);
-		error("var_name: %s, ", var_name[i]);
-		error("count: %d, ", n);
-		error("nels: %d ", var_nels[i]);
-	    }
-	}
+                err = nc_get_vars(ncid,i,index,count,stride,buf);
+                IF (err != NC_NOERR)
+                    error("%s",  nc_strerror(err));
+                ELSE_NOK
+
+                for (j = 0; j < nels; j++) {
+                    p = (char *) buf;
+                    p += j * (size_t)nctypelen(var_type[i]);
+                    err = nc2dbl( var_type[i], p, & got );
+                    IF (err != NC_NOERR)
+                        error("error in nc2dbl");
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    expect = hash(var_type[i], var_rank[i], index2);
+                    if (inRange(expect,var_type[i])) {
+                        IF (!equal2(got,expect,var_type[i])) {
+                            error("buf read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("element number: %d ", j);
+                                error("expect: %g, ", expect);
+                                error("got: %g ", got);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                    n++;
+                }
+            }
+        }
+        IF (n != var_nels[i]) {
+            error("count != nels");
+            if (verbose) {
+                error("\n");
+                error("varid: %d, ", i);
+                error("var_name: %s, ", var_name[i]);
+                error("count: %d, ", n);
+                error("nels: %d ", var_nels[i]);
+            }
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
 /*
- * Test nc_get_varm
+ * Test nc_get_varm(,,,,,,)
  * Choose a random point dividing each dim into 2 parts
  * Get 2^rank (nslabs) slabs so defined
  * Choose random stride from 1 to edge
  * Buffer should end up being bit image of external variable.
  * So all gets for a variable store in different elements of buffer
  */
-void
+int
 test_nc_get_varm(void)
 {
     int ncid;
     int i;
-    int j;
     int k;
-    int m;
     int err;
     int nslabs;
-    int nstarts;	/* number of different starts */
-    int nok = 0;	/* total count of valid comparisons */
+    ptrdiff_t nstarts;   /* number of different starts */
+    int nok = 0;        /* total count of valid comparisons */
+    size_t j, m, nels;
     size_t start[MAX_RANK];
     size_t edge[MAX_RANK];
     size_t index[MAX_RANK];
@@ -1207,61 +1457,112 @@ test_nc_get_varm(void)
     ptrdiff_t stride[MAX_RANK];
     ptrdiff_t imap[MAX_RANK];
     ptrdiff_t imap2[MAX_RANK];
-    double buf[MAX_NELS];	/* (void *) buffer */
-    char *p;			/* (void *) pointer */
+    
+    double buf[MAX_NELS];        /* (void *) buffer */
+    char *p;                     /* (void *) pointer */
     double expect;
     double got;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_get_varm(BAD_ID,0,NULL,NULL,NULL,NULL,NULL);
+    IF (err != NC_EBADID) error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+
+    /* check if can detect a bad variable ID */
+    err = nc_get_varm(ncid,BAD_VARID,NULL,NULL,NULL,NULL,NULL);
+    IF (err != NC_ENOTVAR) error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+
     for (i = 0; i < numVars; i++) {
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = nc_get_varm(BAD_ID,i,NULL,NULL,NULL,NULL,buf);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
+            imap[j] = 1;
         }
-        if (var_rank[i] > 0) {
-            j = var_rank[i] - 1;
-            /* imap[j] = nctypelen(var_type[i]); in bytes */
-            imap[j] = 1; /* in numbers of elements */
-            for (; j > 0; j--)
-                imap[j-1] = imap[j] * var_shape[i][j];
-        }
-        err = nc_get_varm(BAD_ID, i, start, edge, stride, imap, buf);
-        IF (err != NC_EBADID)
-	    error("bad ncid: status = %d", err);
-        err = nc_get_varm(ncid, BAD_VARID, start, edge, stride, imap, buf);
-        IF (err != NC_ENOTVAR)
-	    error("bad var id: status = %d", err);
-	for (j = 0; j < var_rank[i]; j++) {
-	    start[j] = var_shape[i][j];
-	    err = nc_get_varm(ncid, i, start, edge, stride, imap, buf);
+
+
+        /* test NC_EINVALCOORDS, first when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j];
+            err = nc_get_varm(ncid,i,start,edge,stride,imap,buf);
             IF (err != NC_EINVALCOORDS)
-                error("bad index: status = %d", err);
-	    start[j] = 0;
-	    edge[j] = var_shape[i][j] + 1;
-	    err = nc_get_varm(ncid, i, start, edge, stride, imap, buf);
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_get_varm(ncid,i,start,edge,stride,imap,buf);
             IF (err != NC_EEDGE)
-		error("bad edge: status = %d", err);
-	    edge[j] = 1;
-	    stride[j] = 0;
-	    err = nc_get_varm(ncid, i, start, edge, stride, imap, buf);
+                error("expecting NC_EEDGE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = nc_get_varm(ncid,i,start,edge,stride,imap,buf);
             IF (err != NC_ESTRIDE)
-		error("bad stride: status = %d", err);
-	    stride[j] = 1;
-	}
-            /* Choose a random point dividing each dim into 2 parts */
-            /* get 2^rank (nslabs) slabs so defined */
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_get_varm(ncid,i,start,edge,stride,imap,buf);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1;  /* out of boundary check */
+            err = nc_get_varm(ncid,i,start,edge,stride,imap,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        err = nc_get_varm(ncid,i,start,edge,stride,imap,buf);
+        IF (err != NC_NOERR)
+            error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        if (var_rank[i] > 0) {
+            int jj = var_rank[i] - 1;
+            /* imap[jj] = nctypelen(var_type[i]); */
+            imap[jj] = 1; /* in numbers of elements */
+            for (; jj > 0; jj--)
+                imap[jj-1] = imap[jj] * (ptrdiff_t)var_shape[i][jj];
+        }
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to get lower or upper part of dim */
-	    /* choose random stride from 1 to edge */
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
@@ -1272,142 +1573,146 @@ test_nc_get_varm(void)
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-		sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-		imap2[j] = imap[j] * sstride[j];
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                imap2[j] = imap[j] * stride[j];
                 nstarts *= stride[j];
             }
-	    for (m = 0; m < nstarts; m++) {
-		if (var_rank[i] == 0 && i%2 ) {
-		    err = nc_get_varm(ncid, i, NULL, NULL, NULL, NULL, buf);
-		} else {
-		    err = toMixedBase(m, var_rank[i], sstride, index);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (j = 0; j < var_rank[i]; j++) {
-			count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-			index[j] += start[j];
-		    }
-			    /* Random choice of forward or backward */
+            for (m = 0; m < nstarts; m++) {
+                if (var_rank[i] == 0 && i%2 ) {
+                    err = nc_get_varm(ncid,i,NULL,NULL,NULL,NULL,buf);
+                } else {
+                    err = toMixedBase(m, var_rank[i], sstride, index);
+                    IF (err != 0) error("error in toMixedBase");
+                    nels = 1;
+                    for (j = 0; j < var_rank[i]; j++) {
+                        count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                        index[j] += start[j];
+                        nels *= count[j];
+                    }
+                    /* Random choice of forward or backward */
 /* TODO
-		    if ( roll(2) ) {
-			for (j = 0; j < var_rank[i]; j++) {
-			    index[j] += (count[j] - 1) * stride[j];
-			    stride[j] = -stride[j];
-			}
-		    }
+                    if ( roll(2) ) {
+                        for (j = 0; j < var_rank[i]; j++) {
+                            index[j] += (count[j] - 1) * (size_t)stride[j];
+                            stride[j] = -stride[j];
+                        }
+                    }
  */
-		    j = fromMixedBase(var_rank[i], index, var_shape[i]);
-		    p = (char *) buf + j * nctypelen(var_type[i]);
-		    err = nc_get_varm(ncid, i, index, count, stride, imap2, p);
-		}
-		IF (err)
-		    error("%s", nc_strerror(err));
-	    }
-	}
+                    j = fromMixedBase(var_rank[i], index, var_shape[i]);
+                    p = (char *) buf + j * (size_t)nctypelen(var_type[i]);
+                    err = nc_get_varm(ncid,i,index,count,stride,imap2,p);
+                }
+                IF (err != NC_NOERR)
+                    error("%s",  nc_strerror(err));
+                ELSE_NOK
+            }
+        }
         p = (char *) buf;
-	for (j = 0; j < var_nels[i]; j++) {
+        for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err)
-                error("error in toMixedBase");
+            IF (err != 0) error("error in toMixedBase");
             expect = hash( var_type[i], var_rank[i], index);
-	    err = nc2dbl( var_type[i], p, & got );
-	    IF (err)
-		error("error in nc2dbl");
-	    if (inRange(expect,var_type[i])) {
-		IF (!equal(got,expect,var_type[i],NCT_DOUBLE)) {
-		    error("value read not that expected");
-		    if (verbose) {
-			error("\n");
-			error("varid: %d, ", i);
-			error("var_name: %s, ", var_name[i]);
-			error("element number: %d ", j);
-			error("expect: %g, ", expect);
-			error("got: %g ", got);
-		    }
-		} else {
-		    nok++;
-		}
-	    }
+            err = nc2dbl( var_type[i], p, & got );
+            IF (err != NC_NOERR)
+                error("error in nc2dbl");
+            if (inRange(expect,var_type[i])) {
+                IF (!equal2(got,expect,var_type[i])) {
+                    error("buf read not that expected");
+                    if (verbose) {
+                        error("\n");
+                        error("varid: %d, ", i);
+                        error("var_name: %s, ", var_name[i]);
+                        error("element number: %d ", j);
+                        error("expect: %g, ", expect);
+                        error("got: %g ", got);
+                    }
+                }
+                ELSE_NOK
+            }
             p += nctypelen(var_type[i]);
-	}
+        }
     }
-    err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_get_att(void)
 {
     int ncid;
     int i;
     int j;
-    size_t k;
+    size_t k, ndx[1];
     int err;
-    double buf[MAX_NELS];	/* (void *) buffer */
-    signed char *p;			/* (void *) pointer */
+    double buf[MAX_NELS];        /* (void *) buffer */
+    char *p;                     /* (void *) pointer */
     double expect;
     double got;
     int nok = 0;      /* count of valid comparisons */
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    err = nc_get_att(BAD_ID, i, ATT_NAME(i,j), buf);
-	    IF (err != NC_EBADID)
-		error("bad ncid: status = %d", err);
-	    err = nc_get_att(ncid, BAD_VARID, ATT_NAME(i,j), buf);
-	    IF (err != NC_ENOTVAR)
-		error("bad var id: status = %d", err);
-	    err = nc_get_att(ncid, i, "noSuch", buf);
-	    IF (err != NC_ENOTATT)
-		error("Bad attribute name: status = %d", err);
-	    err = nc_get_att(ncid, i, ATT_NAME(i,j), buf);
-	    IF (err) {
-		error("%s", nc_strerror(err));
-	    } else {
-		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    expect = hash(ATT_TYPE(i,j), -1, &k );
-		    p = (signed char *) buf;
-		    p += k * nctypelen(ATT_TYPE(i,j));
-		    err = nc2dbl( ATT_TYPE(i,j), p, &got );
-		    IF (err)
-			error("error in nc2dbl");
-		    if (inRange(expect,ATT_TYPE(i,j))) {
-              IF (!equal(got,expect,ATT_TYPE(i,j),NCT_DOUBLE)) {
-			    error("value read not that expected");
-			    if (verbose) {
-				error("\n");
-				error("varid: %d, ", i);
-				error("var_name: %s, ",
-					i >= 0 ? var_name[i] : "Global");
-				error("att_name: %s, ", ATT_NAME(i,j));
-				error("element number: %d\n", k);
-				error("expect: %-23.16e\n", expect);
-				error("   got: %-23.16e", got);
-			    }
-			} else {
-			    nok++;
-			}
-		    }
+            err =  nc_get_att(BAD_ID, i, ATT_NAME(i,j), buf);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_get_att(ncid, BAD_VARID, ATT_NAME(i,j), buf);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_get_att(ncid, i, "noSuch", buf);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_get_att(ncid, i, ATT_NAME(i,j), buf);
+            IF (err != NC_NOERR) {
+                error("%s",  nc_strerror(err));
+            } else {
+                nok++;
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    expect = hash(ATT_TYPE(i,j), -1, ndx);
+                    p = (char *) buf;
+                    p += k * (size_t)nctypelen(ATT_TYPE(i,j));
+                    err = nc2dbl( ATT_TYPE(i,j), p, &got );
+                    IF (err != NC_NOERR)
+                        error("error in nc2dbl");
+                    if (inRange(expect,ATT_TYPE(i,j))) {
+                        IF (!equal2(got,expect,ATT_TYPE(i,j))) {
+                            error("buf read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ",
+                                        i >= 0 ? var_name[i] : "Global");
+                                error("att_name: %s, ", ATT_NAME(i,j));
+                                error("element number: %d\n", k);
+                                error("expect: %-23.16e\n", expect);
+                                error("   got: %-23.16e", got);
+                            }
+                        }
+                    }
                 }
-	    }
-	}
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    print_nok(nok);
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_att(void)
 {
     int ncid;
@@ -1416,41 +1721,48 @@ test_nc_inq_att(void)
     int err;
     nc_type t;
     size_t n;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-	error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         for (j = 0; j < NATTS(i); j++) {
-	    err = nc_inq_att(BAD_ID, i, ATT_NAME(i,j), &t, &n);
-	    IF (err != NC_EBADID)
-		error("bad ncid: status = %d", err);
-	    err = nc_inq_att(ncid, BAD_VARID, ATT_NAME(i,j), &t, &n);
-	    IF (err != NC_ENOTVAR)
-		error("bad var id: status = %d", err);
-	    err = nc_inq_att(ncid, i, "noSuch", &t, &n);
-	    IF (err != NC_ENOTATT)
-		error("Bad attribute name: status = %d", err);
-	    err = nc_inq_att(ncid, i, ATT_NAME(i,j), &t, &n);
-	    IF (err) {
-		error("%s", nc_strerror(err));
-	    } else {
-		IF (t != ATT_TYPE(i,j))
-		    error("type not that expected");
-		IF (n != ATT_LEN(i,j))
-		    error("length not that expected");
-	    }
-	}
+            err =  nc_inq_att(BAD_ID, i, ATT_NAME(i,j), &t, &n);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_att(ncid, BAD_VARID, ATT_NAME(i,j), &t, &n);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_att(ncid, i, "noSuch", &t, &n);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_att(ncid, i, ATT_NAME(i,j), &t, &n);
+            IF (err != NC_NOERR) {
+                error("%s",  nc_strerror(err));
+            } else {
+                IF (t != ATT_TYPE(i,j))
+                    error("type not that expected");
+                ELSE_NOK
+                IF (n != ATT_LEN(i,j))
+                    error("length not that expected");
+                ELSE_NOK
+            }
+        }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_attlen(void)
 {
     int ncid;
@@ -1458,39 +1770,45 @@ test_nc_inq_attlen(void)
     int j;
     int err;
     size_t len;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
-	err = nc_inq_attlen(ncid, i, "noSuch", &len);
-	IF (err != NC_ENOTATT)
-	    error("Bad attribute name: status = %d", err);
+        err =  nc_inq_attlen(ncid, i, "noSuch", &len);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
         for (j = 0; j < NATTS(i); j++) {
-            err = nc_inq_attlen(BAD_ID, i, ATT_NAME(i,j), &len);
+            err =  nc_inq_attlen(BAD_ID, i, ATT_NAME(i,j), &len);
             IF (err != NC_EBADID)
-                error("bad ncid: status = %d", err);
-            err = nc_inq_attlen(ncid, BAD_VARID, ATT_NAME(i,j), &len);
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_attlen(ncid, BAD_VARID, ATT_NAME(i,j), &len);
             IF (err != NC_ENOTVAR)
-                error("bad varid: status = %d", err);
-            err = nc_inq_attlen(ncid, i, ATT_NAME(i,j), &len);
-            IF (err) {
-                error("%s", nc_strerror(err));
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_attlen(ncid, i, ATT_NAME(i,j), &len);
+            IF (err != NC_NOERR) {
+                error("%s",  nc_strerror(err));
             } else {
-		IF (len != ATT_LEN(i,j))
-		    error("len not that expected");
+                IF (len != ATT_LEN(i,j))
+                    error("len not that expected");
+                ELSE_NOK
             }
         }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_atttype(void)
 {
     int ncid;
@@ -1498,39 +1816,45 @@ test_nc_inq_atttype(void)
     int j;
     int err;
     nc_type datatype;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
-	err = nc_inq_atttype(ncid, i, "noSuch", &datatype);
-	IF (err != NC_ENOTATT)
-	    error("Bad attribute name: status = %d", err);
+        err =  nc_inq_atttype(ncid, i, "noSuch", &datatype);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
         for (j = 0; j < NATTS(i); j++) {
-            err = nc_inq_atttype(BAD_ID, i, ATT_NAME(i,j), &datatype);
+            err =  nc_inq_atttype(BAD_ID, i, ATT_NAME(i,j), &datatype);
             IF (err != NC_EBADID)
-                error("bad ncid: status = %d", err);
-            err = nc_inq_atttype(ncid, BAD_VARID, ATT_NAME(i,j), &datatype);
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_atttype(ncid, BAD_VARID, ATT_NAME(i,j), &datatype);
             IF (err != NC_ENOTVAR)
-                error("bad varid: status = %d", err);
-            err = nc_inq_atttype(ncid, i, ATT_NAME(i,j), &datatype);
-            IF (err) {
-                error("%s", nc_strerror(err));
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_atttype(ncid, i, ATT_NAME(i,j), &datatype);
+            IF (err != NC_NOERR) {
+                error("%s",  nc_strerror(err));
             } else {
-		IF (datatype != ATT_TYPE(i,j))
-		    error("type not that expected");
+                IF (datatype != ATT_TYPE(i,j))
+                    error("type not that expected");
+                ELSE_NOK
             }
         }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_attname(void)
 {
     int ncid;
@@ -1538,42 +1862,49 @@ test_nc_inq_attname(void)
     int j;
     int err;
     char name[NC_MAX_NAME];
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
-	err = nc_inq_attname(ncid, i, BAD_ATTNUM, name);
-	IF (err != NC_ENOTATT)
-	    error("Bad attribute number: status = %d", err);
-	err = nc_inq_attname(ncid, i, NATTS(i), name);
-	IF (err != NC_ENOTATT)
-	    error("Bad attribute number: status = %d", err);
+        err =  nc_inq_attname(ncid, i, BAD_ATTNUM, name);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err =  nc_inq_attname(ncid, i, NATTS(i), name);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
         for (j = 0; j < NATTS(i); j++) {
-            err = nc_inq_attname(BAD_ID, i, j, name);
+            err =  nc_inq_attname(BAD_ID, i, j, name);
             IF (err != NC_EBADID)
-                error("bad ncid: status = %d", err);
-            err = nc_inq_attname(ncid, BAD_VARID, j, name);
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_attname(ncid, BAD_VARID, j, name);
             IF (err != NC_ENOTVAR)
-                error("bad var id: status = %d", err);
-            err = nc_inq_attname(ncid, i, j, name);
-            IF (err) {
-                error("%s", nc_strerror(err));
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_attname(ncid, i, j, name);
+            IF (err != NC_NOERR) {
+                error("%s",  nc_strerror(err));
             } else {
-		IF (strcmp(ATT_NAME(i,j), name) != 0)
-		    error("name not that expected");
+                IF (strcmp(ATT_NAME(i,j), name) != 0)
+                    error("name not that expected");
+                ELSE_NOK
             }
         }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
 
 
-void
+int
 test_nc_inq_attid(void)
 {
     int ncid;
@@ -1581,33 +1912,39 @@ test_nc_inq_attid(void)
     int j;
     int err;
     int attnum;
+    int nok=0;
 
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s",  nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
-	err = nc_inq_attid(ncid, i, "noSuch", &attnum);
-	IF (err != NC_ENOTATT)
-	    error("Bad attribute name: status = %d", err);
+        err =  nc_inq_attid(ncid, i, "noSuch", &attnum);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
         for (j = 0; j < NATTS(i); j++) {
-            err = nc_inq_attid(BAD_ID, i, ATT_NAME(i,j), &attnum);
+            err =  nc_inq_attid(BAD_ID, i, ATT_NAME(i,j), &attnum);
             IF (err != NC_EBADID)
-                error("bad ncid: status = %d", err);
-            err = nc_inq_attid(ncid, BAD_VARID, ATT_NAME(i,j), &attnum);
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_attid(ncid, BAD_VARID, ATT_NAME(i,j), &attnum);
             IF (err != NC_ENOTVAR)
-                error("bad varid: status = %d", err);
-            err = nc_inq_attid(ncid, i, ATT_NAME(i,j), &attnum);
-            IF (err) {
-                error("%s", nc_strerror(err));
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err =  nc_inq_attid(ncid, i, ATT_NAME(i,j), &attnum);
+            IF (err != NC_NOERR) {
+                error("%s",  nc_strerror(err));
             } else {
-		IF (attnum != j)
-		    error("attnum not that expected");
+                IF (attnum != j)
+                    error("attnum not that expected");
+                ELSE_NOK
             }
         }
     }
 
-    err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    err =  nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s",  nc_strerror(err));
+    return nok;
 }
diff --git a/nc_test/test_read.m4 b/nc_test/test_read.m4
new file mode 100644
index 0000000..a091b3f
--- /dev/null
+++ b/nc_test/test_read.m4
@@ -0,0 +1,2054 @@
+dnl This is m4 source.
+dnl Process using m4 to produce 'C' language file.
+dnl
+dnl This file is supposed to be the same as PnetCDF's test_read.m4
+dnl
+dnl If you see this line, you can ignore the next one.
+/* Do not edit this file. It is produced from the corresponding .m4 source */
+dnl
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_read.m4 2861 2017-02-09 19:38:02Z wkliao $ */
+
+dnl
+dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
+dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types
+dnl (MPI_Offset vs. size_t), and function name substrings for external data
+dnl types.
+dnl
+
+#if defined (_WIN32) || defined (_WIN64)
+#include <io.h>
+#endif
+
+#include <sys/types.h> /* open() */
+#include <sys/stat.h>  /* open() */
+#include <fcntl.h>     /* open() */
+#ifdef _MSC_VER
+#include <io.h>
+#else
+#include <unistd.h>    /* unlink(), write() */
+#endif
+#include <errno.h>     /* errno, strerror() */
+
+#include "tests.h"
+
+define(`EXPECT_ERR',`error("expecting $1 but got %s",nc_err_code_name($2));')dnl
+
+define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl
+define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl
+define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_$1',`test_nc_$1')')dnl
+define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl
+
+define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, $3)', `file_open($1, $2, $3)')')dnl
+define(`FileCreate',`ifdef(`PNETCDF',`ncmpi_create(comm, $1, $2, info, $3)', `file_create($1, $2, $3)')')dnl
+define(`FileDelete',`ifdef(`PNETCDF',`ncmpi_delete($1,$2)',`nc_delete($1)')')dnl
+
+define(`VarArgs',   `ifdef(`PNETCDF',`int numVars',`void')')dnl
+define(`AttArgs',   `ifdef(`PNETCDF',`int numGatts',`void')')dnl
+define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts, int numVars',`void')')dnl
+
+define(`GetVar1', `ifdef(`PNETCDF',`ncmpi_get_var1_all($1,$2,$3,$4,$5,$6)',          `nc_get_var1($1,$2,$3,$4)')')dnl
+define(`GetVar',  `ifdef(`PNETCDF',`ncmpi_get_var_all( $1,$2,$3,$4,$5)',             `nc_get_var( $1,$2,$3)')')dnl
+define(`GetVara', `ifdef(`PNETCDF',`ncmpi_get_vara_all($1,$2,$3,$4,$5,$6,$7)',       `nc_get_vara($1,$2,$3,$4,$5)')')dnl
+define(`GetVars', `ifdef(`PNETCDF',`ncmpi_get_vars_all($1,$2,$3,$4,$5,$6,$7,$8)',    `nc_get_vars($1,$2,$3,$4,$5,$6)')')dnl
+define(`GetVarm', `ifdef(`PNETCDF',`ncmpi_get_varm_all($1,$2,$3,$4,$5,$6,$7,$8,$9)', `nc_get_varm($1,$2,$3,$4,$5,$6,$7)')')dnl
+
+/*
+ * Test APIFunc(strerror).
+ *    Try on a bad error status.
+ *    Test for each defined error status.
+ */
+int
+TestFunc(strerror)(void)
+{
+    int i;
+    const char *message, *expected_msg;
+    int nok=0;
+
+    static const struct {
+        int status;
+        const char *msg;
+    } ncerrs[] = {
+        {NC_NOERR, "No error"},
+        {NC_EBADID, "NetCDF: Not a valid ID"},
+        {NC_ENFILE, "NetCDF: Too many files open"},
+        {NC_EEXIST, "NetCDF: File exists && NC_NOCLOBBER"},
+        {NC_EINVAL, "NetCDF: Invalid argument"},
+        {NC_EPERM, "NetCDF: Write to read only"},
+        {NC_ENOTINDEFINE, "NetCDF: Operation not allowed in data mode"},
+        {NC_EINDEFINE, "NetCDF: Operation not allowed in define mode"},
+        {NC_EINVALCOORDS, "NetCDF: Index exceeds dimension bound"},
+        {NC_EMAXDIMS, "NetCDF: NC_MAX_DIMS exceeded"},
+        {NC_ENAMEINUSE, "NetCDF: String match to name in use"},
+        {NC_ENOTATT, "NetCDF: Attribute not found"},
+        {NC_EMAXATTS, "NetCDF: NC_MAX_ATTRS exceeded"},
+        {NC_EBADTYPE, "NetCDF: Not a valid data type or _FillValue type mismatch"},
+        {NC_EBADDIM, "NetCDF: Invalid dimension ID or name"},
+        {NC_EUNLIMPOS, "NetCDF: NC_UNLIMITED in the wrong index"},
+        {NC_EMAXVARS, "NetCDF: NC_MAX_VARS exceeded"},
+        {NC_ENOTVAR, "NetCDF: Variable not found"},
+        {NC_EGLOBAL, "NetCDF: Action prohibited on NC_GLOBAL varid"},
+        {NC_ENOTNC, "NetCDF: Unknown file format"},
+        {NC_ESTS, "NetCDF: In Fortran, string too short"},
+        {NC_EMAXNAME, "NetCDF: NC_MAX_NAME exceeded"},
+        {NC_EUNLIMIT, "NetCDF: NC_UNLIMITED size already in use"},
+        {NC_ENORECVARS, "NetCDF: nc_rec op when there are no record vars"},
+        {NC_ECHAR, "NetCDF: Attempt to convert between text & numbers"},
+        {NC_EEDGE, "NetCDF: Start+count exceeds dimension bound"},
+        {NC_ESTRIDE, "NetCDF: Illegal stride"},
+        {NC_EBADNAME, "NetCDF: Name contains illegal characters"},
+        {NC_ERANGE, "NetCDF: Numeric conversion not representable"},
+        {NC_ENOMEM, "NetCDF: Memory allocation (malloc) failure"},
+        {NC_EVARSIZE, "NetCDF: One or more variable sizes violate format constraints"},
+        {NC_EDIMSIZE, "NetCDF: Invalid dimension size"}
+    };
+
+    /* Try on a bad error status */
+    message = APIFunc(strerror)(-666);/* should fail */
+    expected_msg = "Unknown Error";
+    IF (strncmp(message, expected_msg, strlen(expected_msg)) != 0)
+        error("APIFunc(strerror) on bad error status returned: %s", message);
+    ELSE_NOK
+
+    /* Try on each legitimate error status */
+    for (i=0; i<LEN_OF(ncerrs); i++) {
+        const char *message = APIFunc(strerror)(ncerrs[i].status);
+        IF (strcmp(message, ncerrs[i].msg) != 0)
+            error("APIFunc(strerror)(%d) should return `%s', not `%s'",
+                  ncerrs[i].status, ncerrs[i].msg, message);
+        ELSE_NOK
+    }
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(open).
+ * If in read-only section of tests,
+ *    Try to open a non-existent netCDF file, check error return.
+ *    Open a file that is not a netCDF file, check error return.
+ *    Open a netCDF file with a bad mode argument, check error return.
+ *    Open a netCDF file with NC_NOWRITE, read-only mode, try to write, check error.
+ *    Try to open a netcdf twice, check whether returned netcdf ids different.
+ * If in writable section of tests,
+ *    Open a netCDF file with NC_WRITE mode, write something, close it.
+ * On exit, any open netCDF files are closed.
+ */
+#define NOT_NC_FILE "dummy_not_nc_file"
+int
+TestFunc(open)(void)
+{
+    int err, ncid, ncid2, nok=0;
+ifdef(`PNETCDF', ``#'if 1', ``#'if 0')
+    int fd;
+    ssize_t w_len;
+#endif
+
+    /* Try to open a nonexistent file */
+    err = FileOpen("tooth-fairy.nc", NC_NOWRITE, &ncid); /* should fail */
+
+    /* on some systems (such as Lustre), opening an nonexisting file will
+     * actually create the file. In this case, we print the error messages on
+     * screen and move on to the next test, instead of aborting the entire test.
+     * The created file will be of zero-length and PnetCDF should complain it
+     * is not an NC file, i.e. NC_ENOTNC.
+     */
+    IF (err == NC_NOERR) {
+        error("opening a nonexistent file expects to fail, but got NC_NOERR\n");
+    }
+ifdef(`PNETCDF',
+    `else IF (err == NC_ENOTNC) {
+        error("opening a nonexistent file actually creates the file, indicating an MPI-IO internal error\n");
+    }
+    else IF (err != NC_ENOENT && err != NC_EFILE) {
+        /* older version of OpenMPI and MPICH may return MPI_ERR_IO instead of
+         * MPI_ERR_NO_SUCH_FILE */
+        error("expecting NC_ENOENT or NC_EFILE but got %s, indicating an MPI-IO internal error", nc_err_code_name(err));
+    }
+    else {
+        nok++;
+    }', `
+`#'ifndef USE_PARALLEL
+    IF (! NC_ISSYSERR(err))
+        error("nc_open of nonexistent file should have returned system error");
+`#'endif')
+
+    /* Open a file that is not a netCDF file.  But need a portable
+     * test that also works for cross-compiles ... */
+    /* err = nc_open("nc_test.o", NC_NOWRITE, &ncid);/\* should fail *\/ */
+    /* IF (err != NC_ENOTNC) */
+    /*  error("nc_open of non-netCDF file: status = %d", err); */
+
+ifdef(`PNETCDF', ``#'if 1', ``#'if 0')
+    /* create a not-nc file */
+    fd = open(NOT_NC_FILE, O_CREAT|O_WRONLY, 0600);
+    IF (fd == -1) {
+        error("Error: creating a non-CDF file (%s)", strerror(errno));
+    }
+    else {
+        w_len = write(fd, "0123456789abcdefghijklmnopqrstuvwxyz", 36);
+        assert(w_len >= 0);
+        close(fd);
+    }
+
+    /* Open a file that is not a netCDF file. */
+    err = FileOpen(NOT_NC_FILE, NC_NOWRITE, &ncid); /* should fail */
+    IF (err != NC_ENOTNC)
+        error("expecting NC_ENOTNC or NC_EFILE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* delete the not-nc file */
+    unlink(NOT_NC_FILE);
+#endif
+
+    /* Open a netCDF file in read-only mode, check that write fails */
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    err = APIFunc(redef)(ncid);        /* should fail */
+    IF (err != NC_EPERM)
+        error("expecting NC_EPERM but got %s", nc_err_code_name(err));
+    /* Opened OK, see if can open again and get a different netCDF ID */
+    err = FileOpen(testfile, NC_NOWRITE, &ncid2);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    else {
+        APIFunc(close)(ncid2);
+        nok++;
+    }
+    IF (ncid2 == ncid)
+        error("netCDF IDs for first and second open calls should differ");
+
+    ifdef(`PNETCDF', `if (! read_only)')
+    {   /* tests using netCDF scratch file */
+        err = FileCreate(scratch, NC_NOCLOBBER, &ncid2);
+        IF (err != NC_NOERR)
+            error("create: %s", APIFunc(strerror)(err));
+        else
+            APIFunc(close)(ncid2);
+        err = FileOpen(scratch, NC_WRITE, &ncid2);
+        IF (err != NC_NOERR)
+            error("open: %s", APIFunc(strerror)(err));
+        else {
+            APIFunc(close)(ncid2);
+            nok++;
+        }
+        err = FileDelete(scratch, info);
+        IF (err != NC_NOERR)
+            error("remove of %s failed", scratch);
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(close).
+ *    Try to close a netCDF file twice, check whether second close fails.
+ *    Try on bad handle, check error return.
+ *    Try in define mode and data mode.
+ */
+int
+TestFunc(close)(void)
+{
+    int ncid, nok=0;
+    int err = FileOpen(testfile, NC_NOWRITE, &ncid);
+
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    /* Close a netCDF file twice, second time should fail */
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* Try with a bad netCDF ID */
+    err = APIFunc(close)(BAD_ID);/* should fail */
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* Close in data mode */
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close in data mode failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+
+    ifdef(`PNETCDF', `if (! read_only)')
+    {   /* tests using netCDF scratch file */
+        err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+        IF (err != NC_NOERR)
+            error("create: %s", APIFunc(strerror)(err));
+        err = APIFunc(close)(ncid);
+        IF (err != NC_NOERR)
+            error("close in define mode: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        err = FileDelete(scratch, info);
+        IF (err != NC_NOERR)
+            error("remove of %s failed", scratch);
+    }
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(inq)
+ *    Try on bad handle, check error return.
+ *    Try in data mode, check returned values.
+ *    Try asking for subsets of info.
+ * If in writable section of tests,
+ *    Try in define mode, after adding an unlimited dimension, variable.
+ * On exit, any open netCDF files are closed.
+ */
+int
+TestFunc(inq)(AttVarArgs)
+{
+    int ncid;
+    int ndims;                        /* number of dimensions */
+    int nvars;                        /* number of variables */
+    int ngatts;                       /* number of global attributes */
+    int recdim;                       /* id of unlimited dimension */
+    int err;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    /* Try on bad handle */
+    err = APIFunc(inq)(BAD_ID, 0, 0, 0, 0);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    err = APIFunc(inq)(ncid, &ndims, &nvars, &ngatts, &recdim);
+    IF (err != NC_NOERR)
+        error("inq: %s", APIFunc(strerror)(err));
+    else IF (ndims != NDIMS)
+        error("inq: wrong number of dimensions returned, %d", ndims);
+    else IF (nvars != numVars)
+        error("inq: wrong number of variables returned, %d", nvars);
+    else IF (ngatts != numGatts)
+        error("inq: wrong number of global atts returned, %d", ngatts);
+    else IF (recdim != RECDIM)
+        error("inq: wrong record dimension ID returned, %d", recdim);
+    ELSE_NOK
+
+    /* Inguire for no info (useless, but should still work) */
+    err = APIFunc(inq)(ncid, 0, 0, 0, 0);
+    IF (err != NC_NOERR)
+        error("inq for no info failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+
+    /* Inguire for subsets of info */
+    ngatts = numGatts - 1;        /* wipe out previous correct value */
+    err = APIFunc(inq)(ncid, 0, 0, &ngatts, 0);
+    IF (err != NC_NOERR)
+        error("inq for one item failed: %s", APIFunc(strerror)(err));
+    else IF (ngatts != numGatts)
+        error("inq subset: wrong number of global atts returned, %d", ngatts);
+    ELSE_NOK
+    ndims = NDIMS - 1;
+    nvars = numVars - 1;
+    err = APIFunc(inq)(ncid, &ndims, &nvars, 0, 0);
+    IF (err != NC_NOERR)
+        error("inq for two items failed: %s", APIFunc(strerror)(err));
+    else IF (ndims != NDIMS)
+        error("inq subset: wrong number of dimensions returned, %d", ndims);
+    else IF (nvars != numVars)
+        error("inq subset: wrong number of variables returned, %d", nvars);
+    ELSE_NOK
+
+    ifdef(`PNETCDF', `if (! read_only)')
+    {   /* tests using netCDF scratch file */
+        int ncid2;              /* for scratch netCDF dataset */
+
+        err = FileCreate(scratch, NC_NOCLOBBER, &ncid2);
+        IF (err != NC_NOERR) {
+            error("create: %s", APIFunc(strerror)(err));
+        } else {                /* add dim, var, gatt, check inq */
+            int ndims0;
+            int nvars0;
+            int ngatts0;
+            int recdim0;
+            err = APIFunc(enddef)(ncid2); /* enter data mode */
+            err = APIFunc(inq)(ncid2, &ndims0, &nvars0, &ngatts0, &recdim0);
+            IF (err != NC_NOERR)
+                error("inq: %s", APIFunc(strerror)(err));
+            ELSE_NOK
+            err = APIFunc(redef)(ncid2); /* enter define mode */
+            /* Check that inquire still works in define mode */
+            err = APIFunc(inq)(ncid2, &ndims, &nvars, &ngatts, &recdim);
+            IF (err != NC_NOERR)
+                error("inq in define mode: %s", APIFunc(strerror)(err));
+            else IF (ndims != ndims0)
+                error("inq in define mode: ndims wrong, %d", ndims);
+            else IF (nvars != nvars0)
+                error("inq in define mode: nvars wrong, %d", nvars);
+            else IF (ngatts != ngatts0)
+                error("inq in define mode: ngatts wrong, %d", ngatts);
+            else IF (recdim != recdim0)
+                error("inq in define mode: recdim wrong, %d", recdim);
+            ELSE_NOK
+
+            {
+                int did, vid;
+                /* Add dim, var, global att */
+                err = APIFunc(def_dim)(ncid2, "inqd", 1L, &did);
+                IF (err != NC_NOERR)
+                    error("def_dim: %s", APIFunc(strerror)(err));
+                err = APIFunc(def_var)(ncid2, "inqv", NC_FLOAT, 0, 0, &vid);
+                IF (err != NC_NOERR)
+                    error("def_var: %s", APIFunc(strerror)(err));
+            }
+            err = APIFunc(put_att_text)(ncid2, NC_GLOBAL, "inqa", 1+strlen("stuff"),
+                                   "stuff");
+            IF (err != NC_NOERR)
+                error("put_att_text: %s", APIFunc(strerror)(err));
+
+            /* Make sure APIFunc(inq) sees the additions while in define mode */
+            err = APIFunc(inq)(ncid2, &ndims, &nvars, &ngatts, &recdim);
+            IF (err != NC_NOERR)
+                error("inq in define mode: %s", APIFunc(strerror)(err));
+            else IF (ndims != ndims0 + 1)
+                error("inq in define mode: ndims wrong, %d", ndims);
+            else IF (nvars != nvars0 + 1)
+                error("inq in define mode: nvars wrong, %d", nvars);
+            else IF (ngatts != ngatts0 + 1)
+                error("inq in define mode: ngatts wrong, %d", ngatts);
+            ELSE_NOK
+            err = APIFunc(enddef)(ncid2);
+            IF (err != NC_NOERR)
+                error("enddef: %s", APIFunc(strerror)(err));
+
+            /* Make sure APIFunc(inq) stills sees additions in data mode */
+            err = APIFunc(inq)(ncid2, &ndims, &nvars, &ngatts, &recdim);
+            IF (err != NC_NOERR)
+                error("inq failed in data mode: %s", APIFunc(strerror)(err));
+            else IF (ndims != ndims0 + 1)
+                error("inq in define mode: ndims wrong, %d", ndims);
+            else IF (nvars != nvars0 + 1)
+                error("inq in define mode: nvars wrong, %d", nvars);
+            else IF (ngatts != ngatts0 + 1)
+                error("inq in define mode: ngatts wrong, %d", ngatts);
+            ELSE_NOK
+            APIFunc(close)(ncid2);
+            err = FileDelete(scratch, info);
+            IF (err != NC_NOERR)
+                error("remove of %s failed", scratch);
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_natts)(AttArgs)
+{
+    int ncid;
+    int ngatts;                        /* number of global attributes */
+    int err, nok=0;
+
+    err = APIFunc(inq_natts)(BAD_ID, &ngatts);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_natts)(ncid, &ngatts);
+    IF (err != NC_NOERR)
+        error("inq_natts: %s", APIFunc(strerror)(err));
+    else IF (ngatts != numGatts)
+        error("inq_natts: wrong number of global atts returned, %d", ngatts);
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_ndims)(void)
+{
+    int ncid;
+    int ndims;
+    int err;
+    int nok=0;
+
+    err = APIFunc(inq_ndims)(BAD_ID, &ndims);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_ndims)(ncid, &ndims);
+    IF (err != NC_NOERR)
+        error("inq_ndims: %s", APIFunc(strerror)(err));
+    else IF (ndims != NDIMS)
+        error("inq_ndims: wrong number returned, %d", ndims);
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_nvars)(VarArgs)
+{
+    int ncid;
+    int nvars;
+    int err;
+    int nok=0;
+
+    err = APIFunc(inq_nvars)(BAD_ID, &nvars);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_nvars)(ncid, &nvars);
+    IF (err != NC_NOERR)
+        error("inq_nvars: %s", APIFunc(strerror)(err));
+    else IF (nvars != numVars)
+        error("inq_nvars: wrong number returned, %d", nvars);
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_unlimdim)(void)
+{
+    int ncid;
+    int unlimdim;
+    int err;
+    int nok=0;
+
+    err = APIFunc(inq_unlimdim)(BAD_ID, &unlimdim);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_unlimdim)(ncid, &unlimdim);
+    IF (err != NC_NOERR)
+        error("inq_unlimdim: %s", APIFunc(strerror)(err));
+    else IF (unlimdim != RECDIM)
+        error("inq_unlimdim: wrong number returned, %d", unlimdim);
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_dimid)(void)
+{
+    int ncid;
+    int dimid;
+    int i;
+    int err;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_dimid)(ncid, "noSuch", &dimid);
+    IF (err != NC_EBADDIM)
+        error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    for (i = 0; i < NDIMS; i++) {
+        err = APIFunc(inq_dimid)(BAD_ID, dim_name[i], &dimid);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_dimid)(ncid, dim_name[i], &dimid);
+        IF (err != NC_NOERR)
+            error("inq_dimid: %s", APIFunc(strerror)(err));
+        else IF (dimid != i)
+            error("expected %d, got %d", i, dimid);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_dim)(void)
+{
+    int ncid;
+    int i;
+    int err;
+    char name[NC_MAX_NAME];
+    IntType length;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < NDIMS; i++) {
+        err = APIFunc(inq_dim)(BAD_ID, i, name, &length);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_dim)(ncid, BAD_DIMID, name, &length);
+        IF (err != NC_EBADDIM)
+            error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_dim)(ncid, i, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        err = APIFunc(inq_dim)(ncid, i, name, &length);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s", APIFunc(strerror)(err));
+        else IF (strcmp(dim_name[i],name))
+            error("name expected: %s, got: %s",dim_name[i],name);
+        else IF (dim_len[i] != length)
+            error("size expected: %d, got: %d",dim_len[i],length);
+        ELSE_NOK
+        err = APIFunc(inq_dim)(ncid, i, name, 0);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s", APIFunc(strerror)(err));
+        else IF (strcmp(dim_name[i],name))
+            error("name expected: %s, got: %s",dim_name[i],name);
+        ELSE_NOK
+        err = APIFunc(inq_dim)(ncid, i, 0, &length);
+        IF (err != NC_NOERR)
+            error("inq_dim: %s", APIFunc(strerror)(err));
+        else IF (dim_len[i] != length)
+            error("size expected: %d, got: %d",dim_len[i],length);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_dimlen)(void)
+{
+    int ncid;
+    int i;
+    int err;
+    IntType  length;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < NDIMS; i++) {
+        err = APIFunc(inq_dimlen)(BAD_ID, i, &length);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_dimlen)(ncid, BAD_DIMID, &length);
+        IF (err != NC_EBADDIM)
+            error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_dimlen)(ncid, i, &length);
+        IF (err != NC_NOERR)
+            error("inq_dimlen: %s", APIFunc(strerror)(err));
+        else IF (dim_len[i] != length)
+            error("size expected: %d, got: %d",dim_len[i],length);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_dimname)(void)
+{
+    int ncid;
+    int i;
+    int err;
+    char name[NC_MAX_NAME];
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < NDIMS; i++) {
+        err = APIFunc(inq_dimname)(BAD_ID, i, name);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_dimname)(ncid, BAD_DIMID, name);
+        IF (err != NC_EBADDIM)
+            error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_dimname)(ncid, i, name);
+        IF (err != NC_NOERR)
+            error("inq_dimname: %s", APIFunc(strerror)(err));
+        else IF (strcmp(dim_name[i],name))
+            error("name expected: %s, got: %s",dim_name[i],name);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_varid)(VarArgs)
+{
+    int ncid;
+    int varid;
+    int i;
+    int err;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(inq_varid)(ncid, "noSuch", &varid);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(inq_varid)(BAD_ID, var_name[i], &varid);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_varid)(ncid, var_name[i], &varid);
+        IF (err != NC_NOERR)
+            error("inq_varid: %s", APIFunc(strerror)(err));
+        else IF (varid != i)
+            error("expected %d, got %d", i, varid);
+        ELSE_NOK
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_var)(VarArgs)
+{
+    int ncid;
+    int i;
+    int err;
+    char name[NC_MAX_NAME];
+    nc_type datatype;
+    int ndims;
+    int dimids[MAX_RANK];
+    int natts;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(inq_var)(BAD_ID, i, name, &datatype, &ndims, dimids, &natts);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid,BAD_VARID,name,&datatype,&ndims,dimids,&natts);
+        IF (err != NC_ENOTVAR)
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid, i, 0, 0, 0, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid, i, name, &datatype, &ndims, dimids, &natts);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        else IF (strcmp(var_name[i],name))
+            error("name expected: %s, got: %s",var_name[i],name);
+        else IF (var_type[i] != datatype)
+            error("type expected: %d, got: %d",var_type[i],datatype);
+        else IF (var_rank[i] != ndims)
+            error("ndims expected: %d, got: %d",var_rank[i],ndims);
+        else IF (!int_vec_eq(var_dimid[i],dimids,ndims))
+            error("unexpected dimid");
+        else IF (var_natts[i] != natts)
+            error("natts expected: %d, got: %d",var_natts[i],natts);
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid, i, name, 0, 0, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        else IF (strcmp(var_name[i],name))
+            error("name expected: %s, got: %s",var_name[i],name);
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid, i, 0, &datatype, 0, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        else IF (var_type[i] != datatype)
+            error("type expected: %d, got: %d",var_type[i],datatype);
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid, i, 0, 0, &ndims, 0, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        else IF (var_rank[i] != ndims)
+            error("ndims expected: %d, got: %d",var_rank[i],ndims);
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid, i, 0, 0, 0, dimids, 0);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        else IF (!int_vec_eq(var_dimid[i],dimids,ndims))
+            error("unexpected dimid");
+        ELSE_NOK
+        err = APIFunc(inq_var)(ncid, i, 0, 0, 0, 0, &natts);
+        IF (err != NC_NOERR)
+            error("inq_var: %s", APIFunc(strerror)(err));
+        else IF (var_natts[i] != natts)
+            error("natts expected: %d, got: %d",var_natts[i],natts);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_vardimid)(VarArgs)
+{
+    int ncid;
+    int i;
+    int err;
+    int dimids[MAX_RANK];
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(inq_vardimid)(BAD_ID, i, dimids);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_vardimid)(ncid, BAD_VARID, dimids);
+        IF (err != NC_ENOTVAR)
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_vardimid)(ncid, i, dimids);
+        IF (err != NC_NOERR)
+            error("inq_vardimid: %s", APIFunc(strerror)(err));
+        else IF (!int_vec_eq(var_dimid[i], dimids, var_rank[i]))
+            error("unexpected dimid");
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_varname)(VarArgs)
+{
+    int ncid;
+    int i;
+    int err;
+    char name[NC_MAX_NAME];
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(inq_varname)(BAD_ID, i, name);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        nok++;
+        err = APIFunc(inq_varname)(ncid, BAD_VARID, name);
+        IF (err != NC_ENOTVAR)
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_varname)(ncid, i, name);
+        IF (err != NC_NOERR)
+            error("inq_varname: %s", APIFunc(strerror)(err));
+        else IF (strcmp(var_name[i],name))
+            error("name expected: %s, got: %s",var_name[i],name);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_varnatts)(AttVarArgs)
+{
+    int ncid;
+    int i;
+    int err;
+    int natts;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = -1; i < numVars; i++) {
+        err = APIFunc(inq_varnatts)(BAD_ID, i, &natts);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_varnatts)(ncid, BAD_VARID, &natts);
+        IF (err != NC_ENOTVAR)
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_varnatts)(ncid, VARID(i), &natts);
+        IF (err != NC_NOERR)
+            error("inq_varnatts: %s", APIFunc(strerror)(err));
+        else IF (NATTS(i) != natts)
+            error("natts expected: %d, got: %d",NATTS(i),natts);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_varndims)(VarArgs)
+{
+    int ncid;
+    int i;
+    int err;
+    int ndims;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(inq_varndims)(BAD_ID, i, &ndims);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_varndims)(ncid, BAD_VARID, &ndims);
+        IF (err != NC_ENOTVAR)
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_varndims)(ncid, i, &ndims);
+        IF (err != NC_NOERR)
+            error("inq_varndims: %s", APIFunc(strerror)(err));
+        else IF (var_rank[i] != ndims)
+            error("ndims expected: %d, got: %d",var_rank[i],ndims);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_vartype)(VarArgs)
+{
+    int ncid;
+    int i;
+    int err;
+    nc_type datatype;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(inq_vartype)(BAD_ID, i, &datatype);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_vartype)(ncid, BAD_VARID, &datatype);
+        IF (err != NC_ENOTVAR)
+            error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_vartype)(ncid, i, &datatype);
+        IF (err != NC_NOERR)
+            error("inq_vartype: %s", APIFunc(strerror)(err));
+        else IF (var_type[i] != datatype)
+            error("type expected: %d, got: %d", var_type[i], datatype);
+        ELSE_NOK
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+/*
+ * Test GetVar1
+ */
+int
+TestFunc(get_var1)(VarArgs)
+{
+    int ncid;
+    int i;
+    int err;
+    double expect;
+    int nok = 0;                /* count of valid comparisons */
+    double buf[1];              /* (void *) buffer */
+    double value[1];
+    IntType j, index[MAX_RANK];
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = GetVar1(BAD_ID, 0, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID) EXPECT_ERR(NC_EBADID, err)
+
+    /* check if can detect a bad variable ID */
+    err = GetVar1(ncid, BAD_VARID, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR) EXPECT_ERR(NC_ENOTVAR, err)
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = GetVar1(BAD_ID, i, NULL, value, 1, MPI_DATATYPE_NULL);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+ifdef(`PNETCDF',`dnl
+        err = GetVar1(ncid, i, NULL, value, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) {
+            index[j] = var_shape[i][j];
+            err = GetVar1(ncid, i, index, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            index[j] = 0;
+        }
+        err = GetVar1(ncid, i, index, value, 1, datatype);
+        IF (err != NC_NOERR)
+            EXPECT_ERR(NC_NOERR, err)
+        ELSE_NOK
+
+        /* check if the contents are supposed to be */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash( var_type[i], var_rank[i], index );
+            err = GetVar1(ncid, i, index, buf, 1, datatype);
+            IF (err != NC_NOERR)
+                EXPECT_ERR(NC_NOERR, err)
+            ELSE_NOK
+            err = nc2dbl( var_type[i], buf, &value[0]);
+            IF (err)
+                error("error in nc2dbl");
+            if (inRange(expect,var_type[i])) {
+                IF (!equal2(value[0],expect,var_type[i]))
+                    error("expected: %G, got: %G", expect, value[0]);
+                ELSE_NOK
+            }
+        }
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+/*
+ * Test GetVara
+ * Choose a random point dividing each dim into 2 parts
+ * Get 2^rank (nslabs) slabs so defined
+ * Each get overwrites buffer, so check after each get.
+ */
+int
+TestFunc(get_vara)(VarArgs)
+{
+    int ncid, d, i, k, err, nslabs;
+    int nok = 0;      /* count of valid comparisons */
+    IntType j, nels;
+    IntType start[MAX_RANK];
+    IntType edge[MAX_RANK];
+    IntType index[MAX_RANK];
+    IntType mid[MAX_RANK];
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+    double buf[MAX_NELS];        /* (void *) buffer */
+    double expect;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = GetVara(BAD_ID, 0, NULL, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID) EXPECT_ERR(NC_EBADID, err)
+
+    /* check if can detect a bad variable ID */
+    err = GetVara(ncid, BAD_VARID, NULL, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR) EXPECT_ERR(NC_ENOTVAR, err)
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = GetVara(BAD_ID, i, NULL, NULL, buf, 1, MPI_DATATYPE_NULL);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+ifdef(`PNETCDF',`dnl
+        err = GetVara(ncid, i, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+        err = GetVara(ncid, i, start, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* test NC_EINVALCOORDS, first when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            index[j] = var_shape[i][j];
+            err = GetVara(ncid, i, index, edge, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            index[j] = 0;
+            edge[j] = var_shape[i][j] + 1;  /* edge error check */
+            err = GetVara(ncid, i, start, edge, buf, 1, datatype);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDGE, err)
+            ELSE_NOK
+            edge[j] = 1;
+        }
+
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = GetVara(ncid, i, start, edge, buf, 0, datatype);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1;  /* out of boundary check */
+            err = GetVara(ncid, i, start, edge, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        err = GetVara(ncid, i, start, edge, buf, 1, datatype);
+        IF (err != NC_NOERR)
+            EXPECT_ERR(NC_NOERR, err)
+        ELSE_NOK
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to get lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                }else{
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+            err = GetVara(ncid, i, start, edge, buf, nels, datatype);
+            IF (err != NC_NOERR)
+                EXPECT_ERR(NC_NOERR, err)
+            ELSE_NOK
+
+            for (j = 0; j < nels; j++) {
+                double got;
+                char *p = (char *) buf;
+                p += j * (IntType)nctypelen(var_type[i]);
+                err = nc2dbl( var_type[i], p, & got );
+                IF (err) error("error in nc2dbl");
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                expect = hash(var_type[i], var_rank[i], index);
+                if (inRange(expect,var_type[i])) {
+                    IF (!equal2(got,expect,var_type[i])) {
+                        error("buf read not that expected");
+                        if (verbose) {
+                            error("\n");
+                            error("varid: %d, ", i);
+                            error("var_name: %s, ", var_name[i]);
+                            error("element number: %d ", j);
+                            error("expect: %g", expect);
+                            error("got: %g", got);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+/*
+ * Test GetVars
+ * Choose a random point dividing each dim into 2 parts
+ * Get 2^rank (nslabs) slabs so defined
+ * Each get overwrites buffer, so check after each get.
+ */
+int
+TestFunc(get_vars)(VarArgs)
+{
+    int ncid;
+    int d;
+    int i;
+    int k;
+    int err;
+    int nslabs;
+    PTRDType nstarts;   /* number of different starts */
+    int nok = 0;        /* total count of valid comparisons */
+    int n;              /* count of valid comparisons within var */
+    IntType j, m, nels;
+    IntType start[MAX_RANK];
+    IntType edge[MAX_RANK];
+    IntType index[MAX_RANK];
+    IntType index2[MAX_RANK];
+    IntType mid[MAX_RANK];
+    IntType count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType stride[MAX_RANK];
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+    double buf[MAX_NELS];     /* (void *) buffer */
+    char *p;                  /* (void *) pointer */
+    double expect;
+    double got;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = GetVars(BAD_ID, 0, NULL, NULL, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID) EXPECT_ERR(NC_EBADID, err)
+
+    /* check if can detect a bad variable ID */
+    err = GetVars(ncid, BAD_VARID, NULL, NULL, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR) EXPECT_ERR(NC_ENOTVAR, err)
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = GetVars(BAD_ID, i, NULL, NULL, NULL, buf, 1, MPI_DATATYPE_NULL);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+ifdef(`PNETCDF',`dnl
+        err = GetVars(ncid, i, NULL, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+        err = GetVars(ncid, i, start, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* test NC_EINVALCOORDS, first when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j];
+            err = GetVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = GetVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDGE, err)
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = GetVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = GetVars(ncid, i, start, edge, stride, buf, 0, datatype);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1;  /* out of boundary check */
+            err = GetVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        err = GetVars(ncid, i, start, edge, stride, buf, 1, datatype);
+        IF (err != NC_NOERR)
+            EXPECT_ERR(NC_NOERR, err)
+        ELSE_NOK
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        n = 0;
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                }else{
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (IntType)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (IntType)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+ */
+                err = GetVars(ncid, i, index, count, stride, buf, nels, datatype);
+                IF (err != NC_NOERR)
+                    error("%s", APIFunc(strerror)(err));
+                ELSE_NOK
+
+                for (j = 0; j < nels; j++) {
+                    p = (char *) buf;
+                    p += j * (IntType)nctypelen(var_type[i]);
+                    err = nc2dbl( var_type[i], p, & got );
+                    IF (err != NC_NOERR)
+                        error("error in nc2dbl");
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (IntType)stride[d];
+                    expect = hash(var_type[i], var_rank[i], index2);
+                    if (inRange(expect,var_type[i])) {
+                        IF (!equal2(got,expect,var_type[i])) {
+                            error("buf read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ", var_name[i]);
+                                error("element number: %d ", j);
+                                error("expect: %g, ", expect);
+                                error("got: %g ", got);
+                            }
+                        }
+                        ELSE_NOK
+                    }
+                    n++;
+                }
+            }
+        }
+        IF (n != var_nels[i]) {
+            error("count != nels");
+            if (verbose) {
+                error("\n");
+                error("varid: %d, ", i);
+                error("var_name: %s, ", var_name[i]);
+                error("count: %d, ", n);
+                error("nels: %d ", var_nels[i]);
+            }
+        }
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+/*
+ * Test GetVarm
+ * Choose a random point dividing each dim into 2 parts
+ * Get 2^rank (nslabs) slabs so defined
+ * Choose random stride from 1 to edge
+ * Buffer should end up being bit image of external variable.
+ * So all gets for a variable store in different elements of buffer
+ */
+int
+TestFunc(get_varm)(VarArgs)
+{
+    int ncid;
+    int i;
+    int k;
+    int err;
+    int nslabs;
+    PTRDType nstarts;   /* number of different starts */
+    int nok = 0;        /* total count of valid comparisons */
+    IntType j, m, nels;
+    IntType start[MAX_RANK];
+    IntType edge[MAX_RANK];
+    IntType index[MAX_RANK];
+    IntType mid[MAX_RANK];
+    IntType count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType stride[MAX_RANK];
+    PTRDType imap[MAX_RANK];
+    PTRDType imap2[MAX_RANK];
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+    double buf[MAX_NELS];        /* (void *) buffer */
+    char *p;                     /* (void *) pointer */
+    double expect;
+    double got;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = GetVarm(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID) EXPECT_ERR(NC_EBADID, err)
+
+    /* check if can detect a bad variable ID */
+    err = GetVarm(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL, 0, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR) EXPECT_ERR(NC_ENOTVAR, err)
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        /* check if can detect a bad file ID */
+        err = GetVarm(BAD_ID, i, NULL, NULL, NULL, NULL, buf, 1, MPI_DATATYPE_NULL);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
+        }
+
+ifdef(`PNETCDF',`dnl
+        err = GetVarm(ncid, i, NULL, NULL, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+        err = GetVarm(ncid, i, start, NULL, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* test NC_EINVALCOORDS, first when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = var_shape[i][j];
+            err = GetVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = GetVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDGE, err)
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;
+            err = GetVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check non-scalars for correct error returned even when there is
+         * nothing to get (edge[j]==0) */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = GetVarm(ncid, i, start, edge, stride, imap, buf, 0, datatype);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1;  /* out of boundary check */
+            err = GetVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        err = GetVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+        IF (err != NC_NOERR)
+            EXPECT_ERR(NC_NOERR, err)
+        ELSE_NOK
+
+        if (var_rank[i] > 0) {
+            int jj = var_rank[i] - 1;
+            /* imap[jj] = nctypelen(var_type[i]); */
+            imap[jj] = 1; /* in numbers of elements */
+            for (; jj > 0; jj--)
+                imap[jj-1] = imap[jj] * (PTRDType)var_shape[i][jj];
+        }
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* get 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to get lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                }else{
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
+                imap2[j] = imap[j] * stride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                if (var_rank[i] == 0 && i%2 ) {
+                    err = GetVarm(ncid, i, NULL, NULL, NULL, NULL, buf, var_nels[i], datatype);
+                } else {
+                    err = toMixedBase(m, var_rank[i], sstride, index);
+                    IF (err != 0) error("error in toMixedBase");
+                    nels = 1;
+                    for (j = 0; j < var_rank[i]; j++) {
+                        count[j] = 1 + (edge[j] - index[j] - 1) / (IntType)stride[j];
+                        index[j] += start[j];
+                        nels *= count[j];
+                    }
+                    /* Random choice of forward or backward */
+/* TODO
+                    if ( roll(2) ) {
+                        for (j = 0; j < var_rank[i]; j++) {
+                            index[j] += (count[j] - 1) * (IntType)stride[j];
+                            stride[j] = -stride[j];
+                        }
+                    }
+ */
+                    j = fromMixedBase(var_rank[i], index, var_shape[i]);
+                    p = (char *) buf + j * (IntType)nctypelen(var_type[i]);
+                    err = GetVarm(ncid, i, index, count, stride, imap2, p, nels, datatype);
+                }
+                IF (err != NC_NOERR)
+                    error("%s", APIFunc(strerror)(err));
+                ELSE_NOK
+            }
+        }
+        p = (char *) buf;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            expect = hash( var_type[i], var_rank[i], index);
+            err = nc2dbl( var_type[i], p, & got );
+            IF (err != NC_NOERR)
+                error("error in nc2dbl");
+            if (inRange(expect,var_type[i])) {
+                IF (!equal2(got,expect,var_type[i])) {
+                    error("buf read not that expected");
+                    if (verbose) {
+                        error("\n");
+                        error("varid: %d, ", i);
+                        error("var_name: %s, ", var_name[i]);
+                        error("element number: %d ", j);
+                        error("expect: %g, ", expect);
+                        error("got: %g ", got);
+                    }
+                }
+                ELSE_NOK
+            }
+            p += nctypelen(var_type[i]);
+        }
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(get_att)(AttVarArgs)
+{
+    int ncid;
+    int i;
+    int j;
+    IntType k, ndx[1];
+    int err;
+    double buf[MAX_NELS];        /* (void *) buffer */
+    char *p;                     /* (void *) pointer */
+    double expect;
+    double got;
+    int nok = 0;      /* count of valid comparisons */
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        for (j = 0; j < NATTS(i); j++) {
+            err = APIFunc(get_att)(BAD_ID, i, ATT_NAME(i,j), buf);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(get_att)(ncid, BAD_VARID, ATT_NAME(i,j), buf);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(get_att)(ncid, i, "noSuch", buf);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(get_att)(ncid, i, ATT_NAME(i,j), buf);
+            IF (err != NC_NOERR) {
+                error("%s", APIFunc(strerror)(err));
+            } else {
+                nok++;
+                for (k = 0; k < ATT_LEN(i,j); k++) {
+                    ndx[0] = k;
+                    expect = hash(ATT_TYPE(i,j), -1, ndx);
+                    p = (char *) buf;
+                    p += k * (IntType)nctypelen(ATT_TYPE(i,j));
+                    err = nc2dbl( ATT_TYPE(i,j), p, &got );
+                    IF (err != NC_NOERR)
+                        error("error in nc2dbl");
+                    if (inRange(expect,ATT_TYPE(i,j))) {
+                        IF (!equal2(got,expect,ATT_TYPE(i,j))) {
+                            error("buf read not that expected");
+                            if (verbose) {
+                                error("\n");
+                                error("varid: %d, ", i);
+                                error("var_name: %s, ",
+                                        i >= 0 ? var_name[i] : "Global");
+                                error("att_name: %s, ", ATT_NAME(i,j));
+                                error("element number: %d\n", k);
+                                error("expect: %-23.16e\n", expect);
+                                error("   got: %-23.16e", got);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_att)(AttVarArgs)
+{
+    int ncid;
+    int i;
+    int j;
+    int err;
+    nc_type t;
+    IntType n;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        for (j = 0; j < NATTS(i); j++) {
+            err = APIFunc(inq_att)(BAD_ID, i, ATT_NAME(i,j), &t, &n);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_att)(ncid, BAD_VARID, ATT_NAME(i,j), &t, &n);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_att)(ncid, i, "noSuch", &t, &n);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_att)(ncid, i, ATT_NAME(i,j), &t, &n);
+            IF (err != NC_NOERR) {
+                error("%s", APIFunc(strerror)(err));
+            } else {
+                IF (t != ATT_TYPE(i,j))
+                    error("type not that expected");
+                ELSE_NOK
+                IF (n != ATT_LEN(i,j))
+                    error("length not that expected");
+                ELSE_NOK
+            }
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_attlen)(AttVarArgs)
+{
+    int ncid;
+    int i;
+    int j;
+    int err;
+    IntType len;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        err = APIFunc(inq_attlen)(ncid, i, "noSuch", &len);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        for (j = 0; j < NATTS(i); j++) {
+            err = APIFunc(inq_attlen)(BAD_ID, i, ATT_NAME(i,j), &len);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_attlen)(ncid, BAD_VARID, ATT_NAME(i,j), &len);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_attlen)(ncid, i, ATT_NAME(i,j), &len);
+            IF (err != NC_NOERR) {
+                error("%s", APIFunc(strerror)(err));
+            } else {
+                IF (len != ATT_LEN(i,j))
+                    error("len not that expected");
+                ELSE_NOK
+            }
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_atttype)(AttVarArgs)
+{
+    int ncid;
+    int i;
+    int j;
+    int err;
+    nc_type datatype;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        err = APIFunc(inq_atttype)(ncid, i, "noSuch", &datatype);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        for (j = 0; j < NATTS(i); j++) {
+            err = APIFunc(inq_atttype)(BAD_ID, i, ATT_NAME(i,j), &datatype);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_atttype)(ncid, BAD_VARID, ATT_NAME(i,j), &datatype);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_atttype)(ncid, i, ATT_NAME(i,j), &datatype);
+            IF (err != NC_NOERR) {
+                error("%s", APIFunc(strerror)(err));
+            } else {
+                IF (datatype != ATT_TYPE(i,j))
+                    error("type not that expected");
+                ELSE_NOK
+            }
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_attname)(AttVarArgs)
+{
+    int ncid;
+    int i;
+    int j;
+    int err;
+    char name[NC_MAX_NAME];
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        err = APIFunc(inq_attname)(ncid, i, BAD_ATTNUM, name);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(inq_attname)(ncid, i, NATTS(i), name);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        for (j = 0; j < NATTS(i); j++) {
+            err = APIFunc(inq_attname)(BAD_ID, i, j, name);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_attname)(ncid, BAD_VARID, j, name);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_attname)(ncid, i, j, name);
+            IF (err != NC_NOERR) {
+                error("%s", APIFunc(strerror)(err));
+            } else {
+                IF (strcmp(ATT_NAME(i,j), name) != 0)
+                    error("name not that expected");
+                ELSE_NOK
+            }
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
+
+
+int
+TestFunc(inq_attid)(AttVarArgs)
+{
+    int ncid;
+    int i;
+    int j;
+    int err;
+    int attnum;
+    int nok=0;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        err = APIFunc(inq_attid)(ncid, i, "noSuch", &attnum);
+        IF (err != NC_ENOTATT)
+            error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        for (j = 0; j < NATTS(i); j++) {
+            err = APIFunc(inq_attid)(BAD_ID, i, ATT_NAME(i,j), &attnum);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_attid)(ncid, BAD_VARID, ATT_NAME(i,j), &attnum);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(inq_attid)(ncid, i, ATT_NAME(i,j), &attnum);
+            IF (err != NC_NOERR) {
+                error("%s", APIFunc(strerror)(err));
+            } else {
+                IF (attnum != j)
+                    error("attnum not that expected");
+                ELSE_NOK
+            }
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    return nok;
+}
diff --git a/nc_test/test_write.c b/nc_test/test_write.c
index a5fd560..a554f68 100644
--- a/nc_test/test_write.c
+++ b/nc_test/test_write.c
@@ -1,12 +1,33 @@
-/*********************************************************************
- *   Copyright 1996, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Id: test_write.c 2796 2014-10-28 03:40:29Z wkliao $
- *********************************************************************/
+/* Do not edit this file. It is produced from the corresponding .m4 source */
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_write.m4 2687 2016-12-08 18:32:13Z wkliao $ */
+
+
+#if defined (_WIN32) || defined (_WIN64)
+#include <io.h>
+#endif
+
+#include <sys/types.h>  /* open() */
+#include <sys/stat.h>   /* open() */
+#include <fcntl.h>      /* open() */
+#ifdef _MSC_VER
+#include <io.h>
+#else
+#include <unistd.h>     /* read() */
+#endif
 
 #include "tests.h"
 #include "math.h"
-#include <stdio.h> /* For FILE stuff. */
+
+
+
+
+
+
+
 
 /*
  * Test nc_create
@@ -16,50 +37,55 @@
  *    Try again in NC_NOCLOBBER mode, check error return
  * On exit, delete this file
  */
-void
+int
 test_nc_create(void)
 {
-    int clobber;		/* 0 for NC_NOCLOBBER, 1 for NC_CLOBBER */
+    int clobber; /* 0 for NC_NOCLOBBER, 1 for NC_CLOBBER */
     int err;
     int ncid;
-    int ndims;                  /* number of dimensions */
-    int nvars;                  /* number of variables */
-    int ngatts;                 /* number of global attributes */
-    int recdim;                 /* id of unlimited dimension */
+    int ndims;   /* number of dimensions */
+    int nvars;   /* number of variables */
+    int ngatts;  /* number of global attributes */
+    int recdim;  /* id of unlimited dimension */
+    int nok=0;
 
     for (clobber = 0; clobber < 2; clobber++) {
-        int cmode = clobber ? NC_CLOBBER : NC_NOCLOBBER;
-	err = file_create(scratch, cmode, &ncid);
-	IF (err)
-	    error("nc_create: %s", nc_strerror(err));
-	err = nc_close(ncid);
-	IF (err)
-	    error("nc_close: %s", nc_strerror(err));
-	err = file_open(scratch, NC_NOWRITE, &ncid);
-	IF (err)
-	    error("nc_open: %s", nc_strerror(err));
-	err = nc_inq(ncid, &ndims, &nvars, &ngatts, &recdim);
-	IF (err)
-	    error("nc_inq: %s", nc_strerror(err));
-	else IF (ndims != 0)
-	    error("nc_inq: wrong number of dimensions returned, %d", ndims);
-	else IF (nvars != 0)
-	    error("nc_inq: wrong number of variables returned, %d", nvars);
-	else IF (ngatts != 0)
-	    error("nc_inq: wrong number of global atts returned, %d", ngatts);
-	else IF (recdim != -1)
-	    error("nc_inq: wrong record dimension ID returned, %d", recdim);
-	err = nc_close(ncid);
-	IF (err)
-	    error("nc_close: %s", nc_strerror(err));
+        err = file_create(scratch, clobber ? NC_CLOBBER : NC_NOCLOBBER, &ncid);
+        IF (err != NC_NOERR)
+            error("create: %s", nc_strerror(err));
+        ELSE_NOK
+        err = nc_close(ncid);
+        IF (err != NC_NOERR)
+            error("close: %s", nc_strerror(err));
+        err = file_open(scratch, NC_NOWRITE, &ncid);
+        IF (err != NC_NOERR)
+            error("open: %s", nc_strerror(err));
+        err = nc_inq(ncid, &ndims, &nvars, &ngatts, &recdim);
+        IF (err != NC_NOERR)
+            error("inq: %s", nc_strerror(err));
+        else IF (ndims != 0)
+            error("inq: wrong number of dimensions returned, %d", ndims);
+        else IF (nvars != 0)
+            error("inq: wrong number of variables returned, %d", nvars);
+        else IF (ngatts != 0)
+            error("inq: wrong number of global atts returned, %d", ngatts);
+        else IF (recdim != -1)
+            error("inq: wrong record dimension ID returned, %d", recdim);
+        ELSE_NOK
+        err = nc_close(ncid);
+        IF (err != NC_NOERR)
+            error("close: %s", nc_strerror(err));
     }
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
     IF (err != NC_EEXIST)
-	error("attempt to overwrite file: status = %d", err);
-    err = remove(scratch);
-    IF (err)
-	error("remove of %s failed", scratch);
+        error("expecting NC_EEXIST but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -82,186 +108,200 @@ test_nc_create(void)
  *    check file: vars & atts
  *    check reopening with NC_WRITE and adding new dims, atts, vars
  */
-void
+int
 test_nc_redef(void)
 {
-    int ncid;                   /* netcdf id */
+    int ncid;          /* netcdf id */
     /* used to force effective test of ncio->move() in redef */
     size_t sizehint = 8192;
     int dimid;         /* dimension id */
     int varid;         /* variable id */
     int varid1;        /* variable id */
-    int err;
+    int nok=0, err;
     const char * title = "Not funny";
     double var;
     char name[NC_MAX_NAME];
     size_t length;
     int fmt_variant1, fmt_variant2;
 
-	/* BAD_ID tests */
+    /* BAD_ID tests */
     err = nc_redef(BAD_ID);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_enddef(BAD_ID);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-	/* read-only tests */
+    /* read-only tests */
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
     err = nc_redef(ncid);
     IF (err != NC_EPERM)
-	error("nc_redef in NC_NOWRITE mode: status = %d", err);
+        error("expecting NC_EPERM but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_enddef(ncid);
     IF (err != NC_ENOTINDEFINE)
-	error("nc_redef in NC_NOWRITE mode: status = %d", err);
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-
-	/* tests using scratch file */
-    err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+
+    /* tests using scratch file */
+    err = file__create(scratch, NC_NOCLOBBER, 0, &sizehint, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     /* limit for ncio implementations which have infinite chunksize */
-    if(sizehint > 32768)
-	sizehint = 16384;
+    if(sizehint > 32768) sizehint = 16384;
     def_dims(ncid);
     def_vars(ncid);
     put_atts(ncid);
     err = nc_inq_varid(ncid, "d", &varid);
-    IF (err)
-	error("nc_inq_varid: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("inq_varid: %s", nc_strerror(err));
     var = 1.0;
+
+
     err = nc_put_var1_double(ncid, varid, NULL, &var);
     IF (err != NC_EINDEFINE)
-        error("nc_put_var... in define mode: status = %d", err);
+        error("expecting NC_EINDEFINE but got %s", nc_err_code_name(err));
+
+
     err = nc_redef(ncid);
     IF (err != NC_EINDEFINE)
-        error("nc_redef in define mode: status = %d", err);
+        error("expecting NC_EINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
+    ELSE_NOK
     put_vars(ncid);
     err = nc_def_dim(ncid, "abc", sizehint, &dimid);
     IF (err != NC_ENOTINDEFINE)
-        error("nc_def_dim in define mode: status = %d", err);
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
     err = nc_redef(ncid);
-    IF (err)
-        error("nc_redef: %s", nc_strerror(err));
-#if 0
+    IF (err != NC_NOERR)
+        error("redef: %s", nc_strerror(err));
+    ELSE_NOK
+
     err = nc_set_fill(ncid, NC_NOFILL, NULL);
-    IF (err)
-        error("nc_set_fill: %s", nc_strerror(err));
-#endif
+    IF (err != NC_NOERR)
+        error("set_fill: %s", nc_strerror(err));
+
     err = nc_def_dim(ncid, "abc", sizehint, &dimid);
-    IF (err)
-        error("nc_def_dim: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("def_dim: %s", nc_strerror(err));
     err = nc_def_var(ncid, "abcScalar", NC_INT, 0, NULL, &varid);
-    IF (err)
-        error("nc_def_var: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("def_var: %s", nc_strerror(err));
     err = nc_def_var(ncid, "abc", NC_INT, 1, &dimid, &varid1);
-    IF (err)
-        error("nc_def_var: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("def_var: %s", nc_strerror(err));
     {
-	int dimids[NDIMS +1];
-	int ii = 0;
-	for(ii = 0; ii < NDIMS; ii++)
-		dimids[ii] = ii;
-	dimids[NDIMS] = dimid;
-    	err = nc_def_var(ncid, "abcRec", NC_INT, NDIMS, dimids, &varid1);
-    	IF (err)
-        	error("nc_def_var: %s", nc_strerror(err));
+        int dimids[NDIMS +1];
+        int ii = 0;
+        for(ii = 0; ii < NDIMS; ii++) dimids[ii] = ii;
+        dimids[NDIMS] = dimid;
+        err = nc_def_var(ncid, "abcRec", NC_INT, NDIMS, dimids, &varid1);
+        IF (err != NC_NOERR)
+            error("def_var: %s", nc_strerror(err));
     }
     err = nc_put_att_text(ncid, NC_GLOBAL, "title", 1+strlen(title), title);
-    IF (err)
-        error("nc_put_att_text: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("put_att_text: %s", nc_strerror(err));
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
+    ELSE_NOK
     var = 1.0;
+
+
     err = nc_put_var1_double(ncid, varid, NULL, &var);
-    IF (err)
-        error("nc_put_var1_double: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("put_var1_double: %s", nc_strerror(err));
     err = nc_inq_format(ncid, &fmt_variant1);
     IF (err)
-	error("nc_inq_format: %s", nc_strerror(err));
+        error("inq_format: %s", nc_strerror(err));
     err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
     /* check scratch file written as expected */
-    check_file(scratch);  /* checks all except "abc" stuff added above */
+    check_file(scratch); /* checks all except "abc" stuff added above */
 
     IF ((err = file_open(scratch, NC_NOWRITE, &ncid)))
-        error("nc_open: %s", nc_strerror(err));
+        error("open: %s", nc_strerror(err));
     IF ((err = nc_inq_dim(ncid, dimid, name, &length)))
-	error("nc_inq_dim: %s", nc_strerror(err));
+        error("inq_dim: %s", nc_strerror(err));
     IF (strcmp(name, "abc") != 0)
-	error("Unexpected dim name");
+        error("Unexpected dim name");
     IF (length != sizehint)
-	error("Unexpected dim length");
+        error("Unexpected dim length");
     IF ((err = nc_get_var1_double(ncid, varid, NULL, &var)))
-        error("nc_get_var1_double: %s", nc_strerror(err));
+        error("get_var1_double: %s", nc_strerror(err));
     IF (var != 1.0)
-        error("nc_get_var1_double: unexpected value");
+        error("get_var1_double: unexpected value");
     IF ((err = nc_close(ncid)))
-        error("nc_close: %s", nc_strerror(err));
+        error("close: %s", nc_strerror(err));
 
     /* open scratch file for writing, add another dim, var, att, then check */
     IF ((err = file_open(scratch, NC_WRITE, &ncid)))
-        error("nc_open: %s", nc_strerror(err));
+        error("open: %s", nc_strerror(err));
     IF ((err = nc_redef(ncid)))
-        error("nc_redef: %s", nc_strerror(err));
+        error("redef: %s", nc_strerror(err));
     IF ((err = nc_def_dim(ncid, "def", sizehint, &dimid)))
-        error("nc_def_dim: %s", nc_strerror(err));
+        error("def_dim: %s", nc_strerror(err));
     IF ((err = nc_def_var(ncid, "defScalar", NC_INT, 0, NULL, &varid)))
-        error("nc_def_var: %s", nc_strerror(err));
+        error("def_var: %s", nc_strerror(err));
     IF ((err = nc_def_var(ncid, "def", NC_INT, 1, &dimid, &varid1)))
-        error("nc_def_var: %s", nc_strerror(err));
+        error("def_var: %s", nc_strerror(err));
     IF ((err = nc_put_att_text(ncid, NC_GLOBAL, "Credits", 1+strlen("Thanks!"), "Thanks!")))
-        error("nc_put_att_text: %s", nc_strerror(err));
+        error("put_att_text: %s", nc_strerror(err));
     IF ((err = nc_enddef(ncid)))
-        error("nc_enddef: %s", nc_strerror(err));
+        error("enddef: %s", nc_strerror(err));
     var = 2.0;
     IF ((err = nc_put_var1_double(ncid, varid, NULL, &var)))
-        error("nc_put_var1_double: %s", nc_strerror(err));
+        error("put_var1_double: %s", nc_strerror(err));
     IF ((err = nc_close(ncid)))
-	error("nc_close: %s", nc_strerror(err));
+        error("close: %s", nc_strerror(err));
 
     /* check scratch file written as expected */
     check_file(scratch);
 
-        err = file_open(scratch, NC_NOWRITE, &ncid);
+    err = file_open(scratch, NC_NOWRITE, &ncid);
     IF (err)
-        error("nc_open: %s", nc_strerror(err));
+        error("open: %s", nc_strerror(err));
     err = nc_inq_dim(ncid, dimid, name, &length);
     IF (err)
-	error("nc_inq_dim: %s", nc_strerror(err));
+        error("inq_dim: %s", nc_strerror(err));
     IF (strcmp(name, "def") != 0)
-	error("Unexpected dim name");
+        error("Unexpected dim name");
     IF (length != sizehint)
-	error("Unexpected dim length");
+        error("Unexpected dim length");
     err = nc_get_var1_double(ncid, varid, NULL, &var);
     IF (err)
-        error("nc_get_var1_double: %s", nc_strerror(err));
+        error("get_var1_double: %s", nc_strerror(err));
     IF (var != 2.0)
-        error("nc_get_var1_double: unexpected value");
+        error("get_var1_double: unexpected value");
     /* make sure format variant hasn't changed from when created */
     err = nc_inq_format(ncid, &fmt_variant2);
     IF (err)
-	error("nc_inq_format: %s", nc_strerror(err));
+        error("inq_format: %s", nc_strerror(err));
     IF (fmt_variant1 != fmt_variant2)
-	error("nc_enddef changed format variant");
+        error("enddef changed format variant");
     err = nc_close(ncid);
     IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
+        error("close: %s", nc_strerror(err));
+
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -269,10 +309,10 @@ test_nc_redef(void)
  * Test nc_enddef
  * Simply calls test_nc_redef which tests both nc_redef & nc_enddef
  */
-void
+int
 test_nc_enddef(void)
 {
-    test_nc_redef();
+    return test_nc_redef();
 }
 
 
@@ -282,62 +322,67 @@ test_nc_enddef(void)
  *    try in define mode, check error
  *    try writing with one handle, reading with another on same netCDF
  */
-void
+int
 test_nc_sync(void)
 {
     int ncidw;         /* netcdf id for writing */
     int ncidr;         /* netcdf id for reading */
-    int err;
+    int nok=0, err;
 
-        /* BAD_ID test */
+    /* BAD_ID test */
     err = nc_sync(BAD_ID);
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-        /* create scratch file & try nc_sync in define mode */
+    /* create scratch file & try nc_sync in define mode */
     err = file_create(scratch, NC_NOCLOBBER, &ncidw);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-	return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     err = nc_sync(ncidw);
     IF (err != NC_EINDEFINE)
-        error("nc_sync called in define mode: status = %d", err);
+        error("expecting NC_EINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-        /* write using same handle */
+    /* write using same handle */
     def_dims(ncidw);
     def_vars(ncidw);
     put_atts(ncidw);
     err = nc_enddef(ncidw);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     put_vars(ncidw);
     err = nc_sync(ncidw);
-    IF (err)
-        error("nc_sync of ncidw failed: %s", nc_strerror(err));
-
-        /* open another handle, nc_sync, read (check) */
-        err = file_open(scratch, NC_NOWRITE, &ncidr);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("sync of ncidw failed: %s", nc_strerror(err));
+    ELSE_NOK
+
+    /* open another handle, nc_sync, read (check) */
+    err = file_open(scratch, NC_NOWRITE, &ncidr);
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
     err = nc_sync(ncidr);
-    IF (err)
-        error("nc_sync of ncidr failed: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("sync of ncidr failed: %s", nc_strerror(err));
+    ELSE_NOK
     check_dims(ncidr);
     check_atts(ncidr);
     check_vars(ncidr);
 
-        /* close both handles */
+    /* close both handles */
     err = nc_close(ncidr);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
     err = nc_close(ncidw);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -348,7 +393,7 @@ test_nc_sync(void)
  *    try after nc_enddef, nc_redef, define new dims, vars, atts
  *    try after writing variable
  */
-void
+int
 test_nc_abort(void)
 {
     int ncid;          /* netcdf id */
@@ -356,96 +401,101 @@ test_nc_abort(void)
     int ndims;
     int nvars;
     int ngatts;
+    int nok=0;
 
-        /* BAD_ID test */
+    /* BAD_ID test */
     err = nc_abort(BAD_ID);
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-        /* create scratch file & try nc_abort in define mode */
+    /* create scratch file & try nc_abort in define mode */
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     def_dims(ncid);
     def_vars(ncid);
     put_atts(ncid);
     err = nc_abort(ncid);
-    IF (err)
-        error("nc_abort of ncid failed: %s", nc_strerror(err));
-    err = nc_close(ncid);	/* should already be closed */
+    IF (err != NC_NOERR)
+        error("abort of ncid failed: %s", nc_strerror(err));
+    ELSE_NOK
+    err = nc_close(ncid);        /* should already be closed */
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
-    err = remove(scratch);	/* should already be deleted */
-    IF (!err)
-        error("file %s should not exist", scratch);
-
-        /*
-         * create scratch file
-	 * do nc_enddef & nc_redef
-	 * define new dims, vars, atts
-	 * try nc_abort: should restore previous state (no dims, vars, atts)
-	 */
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    err = nc_delete(scratch);        /* should already be deleted */
+IF (err != ENOENT && err != NC_EIO)
+        error("expecting ENOENT or NC_EIO but got %s", nc_err_code_name(err));
+    /*
+     * create scratch file
+     * do nc_enddef & nc_redef
+     * define new dims, vars, atts
+     * try nc_abort: should restore previous state (no dims, vars, atts)
+     */
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     err = nc_redef(ncid);
-    IF (err)
-        error("nc_redef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("redef: %s", nc_strerror(err));
     def_dims(ncid);
     def_vars(ncid);
     put_atts(ncid);
     err = nc_abort(ncid);
-    IF (err)
-        error("nc_abort of ncid failed: %s", nc_strerror(err));
-    err = nc_close(ncid);	/* should already be closed */
+    IF (err != NC_NOERR)
+        error("abort of ncid failed: %s", nc_strerror(err));
+    ELSE_NOK
+    err = nc_close(ncid);        /* should already be closed */
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
-        err = file_open(scratch, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
-    err = nc_inq (ncid, &ndims, &nvars, &ngatts, NULL);
-    IF (err)
-        error("nc_inq: %s", nc_strerror(err));
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    err = file_open(scratch, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
+    err = nc_inq(ncid, &ndims, &nvars, &ngatts, NULL);
+    IF (err != NC_NOERR)
+        error("inq: %s", nc_strerror(err));
     IF (ndims != 0)
         error("ndims should be 0");
     IF (nvars != 0)
         error("nvars should be 0");
     IF (ngatts != 0)
         error("ngatts should be 0");
-    err = nc_close (ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    err = nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-        /* try nc_abort in data mode - should just close */
+    /* try nc_abort in data mode - should just close */
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     def_dims(ncid);
     def_vars(ncid);
     put_atts(ncid);
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     put_vars(ncid);
     err = nc_abort(ncid);
-    IF (err)
-        error("nc_abort of ncid failed: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("abort of ncid failed: %s", nc_strerror(err));
+    ELSE_NOK
     err = nc_close(ncid);       /* should already be closed */
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
     check_file(scratch);
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -459,92 +509,101 @@ test_nc_abort(void)
  *    make sure unlimited size works, shows up in nc_inq_unlimdim
  *    try to define a second unlimited dimension, check error
  */
-void
+int
 test_nc_def_dim(void)
 {
     int ncid;
-    int  err;             /* status */
-    int  i;
+    int  err;           /* status */
+    int  i, nok=0;
     int  dimid;         /* dimension id */
     size_t length;
 
-        /* BAD_ID test */
+    /* BAD_ID test */
     err = nc_def_dim(BAD_ID, "abc", 8, &dimid);
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-        /* data mode test */
+    /* data mode test */
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     err = nc_def_dim(ncid, "abc", 8, &dimid);
     IF (err != NC_ENOTINDEFINE)
-        error("bad ncid: status = %d", err);
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-        /* define-mode tests: unlimited dim */
+    /* define-mode tests: unlimited dim */
     err = nc_redef(ncid);
-    IF (err)
-        error("nc_redef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("redef: %s", nc_strerror(err));
     err = nc_def_dim(ncid, dim_name[0], NC_UNLIMITED, &dimid);
-    IF (err)
-	error("nc_def_dim: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("def_dim: %s", nc_strerror(err));
+    ELSE_NOK
     IF (dimid != 0)
-	error("Unexpected dimid");
+        error("Unexpected dimid");
+    ELSE_NOK
     err = nc_inq_unlimdim(ncid, &dimid);
-    IF (err)
-	error("nc_inq_unlimdim: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("inq_unlimdim: %s", nc_strerror(err));
     IF (dimid != 0)
-	error("Unexpected recdim");
+        error("Unexpected recdim");
     err = nc_inq_dimlen(ncid, dimid, &length);
-    IF (err)
-	error("nc_inq_dimlen: %s", nc_strerror(err));
     IF (length != 0)
-	error("Unexpected length");
+        error("Unexpected length");
     err = nc_def_dim(ncid, "abc", NC_UNLIMITED, &dimid);
     IF (err != NC_EUNLIMIT)
-        error("2nd unlimited dimension: status = %d", err);
+        error("expecting NC_EUNLIMIT but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
     /* define-mode tests: remaining dims */
     for (i = 1; i < NDIMS; i++) {
         err = nc_def_dim(ncid, dim_name[i-1], dim_len[i], &dimid);
-	IF (err != NC_ENAMEINUSE)
-	    error("duplicate name: status = %d", err);
-	err = nc_def_dim(ncid, BAD_NAME, dim_len[i], &dimid);
-	IF (err != NC_EBADNAME)
-	    error("bad name: status = %d", err);
-	/* Fix: dmh 11/4/2011: works only if sizeof(long) > 4 */
-	if(sizeof(long) > 4) {
-            err = nc_def_dim(ncid, dim_name[i], NC_UNLIMITED-1, &dimid);
-    	    IF (err != NC_EDIMSIZE)
-	        error("bad size: status = %d", err);
-	}
+        IF (err != NC_ENAMEINUSE)
+            error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = nc_def_dim(ncid, BAD_NAME, dim_len[i], &dimid);
+        IF (err != NC_EBADNAME)
+            error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
+        ELSE_NOK
+if(sizeof(long) > 4) /* Fix: dmh 11/4/2011: works only if sizeof(long) > 4 */
+        {
+            err = nc_def_dim(ncid, dim_name[i], (size_t)(NC_UNLIMITED-1), &dimid);
+            IF (err != NC_EDIMSIZE)
+                error("expecting NC_EDIMSIZE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+        }
         err = nc_def_dim(ncid, dim_name[i], dim_len[i], &dimid);
-        IF (err)
-	    error("nc_def_dim: %s", nc_strerror(err));
-	IF (dimid != i)
-	    error("Unexpected dimid");
+        IF (err != NC_NOERR)
+            error("def_dim: %s", nc_strerror(err));
+        ELSE_NOK
+        IF (dimid != i)
+            error("Unexpected dimid");
     }
 
-        /* Following just to expand unlimited dim */
+    /* Following just to expand unlimited dim */
     def_vars(ncid);
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     put_vars(ncid);
 
-        /* Check all dims */
+    /* Check all dims */
     check_dims(ncid);
 
     err = nc_close(ncid);
-    IF (err)
-	error("nc_close: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -555,46 +614,49 @@ test_nc_def_dim(void)
  *    try renaming to existing dimension name, check error
  *    try with bad dimension handle, check error
  */
-void
+int
 test_nc_rename_dim(void)
 {
     int ncid;
-    int  err;             /* status */
+    int  err, nok=0;             /* status */
     char name[NC_MAX_NAME];
 
-        /* BAD_ID test */
+    /* BAD_ID test */
     err = nc_rename_dim(BAD_ID, 0, "abc");
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-        /* main tests */
+    /* main tests */
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     def_dims(ncid);
     err = nc_rename_dim(ncid, BAD_DIMID, "abc");
     IF (err != NC_EBADDIM)
-        error("bad dimid: status = %d", err);
+        error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_rename_dim(ncid, 2, "abc");
-    IF (err)
-        error("nc_rename_dim: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("rename_dim: %s", nc_strerror(err));
+    ELSE_NOK
     err = nc_inq_dimname(ncid, 2, name);
-    IF (err)
-        error("nc_inq_dimname: %s", nc_strerror(err));
     IF (strcmp(name, "abc") != 0)
         error("Unexpected name: %s", name);
     err = nc_rename_dim(ncid, 0, "abc");
     IF (err != NC_ENAMEINUSE)
-        error("duplicate name: status = %d", err);
+        error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -611,12 +673,12 @@ test_nc_rename_dim(void)
  *    check that returned id is one more than previous id
  *    try with bad dimension ids, check error
  */
-void
+int
 test_nc_def_var(void)
 {
     int  ncid;
     int  varid;
-    int  err;             /* status */
+    int  err, nok=0;             /* status */
     int  i;
     int  ndims;
     int  natts;
@@ -624,23 +686,25 @@ test_nc_def_var(void)
     int dimids[MAX_RANK];
     nc_type datatype;
 
-        /* BAD_ID test */
+    /* BAD_ID test */
     err = nc_def_var(BAD_ID, "abc", NC_SHORT, 0, NULL, &varid);
     IF (err != NC_EBADID)
-        error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
-        /* scalar tests */
+    /* scalar tests */
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     err = nc_def_var(ncid, "abc", NC_SHORT, 0, NULL, &varid);
-    IF (err)
-        error("nc_def_var: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("def_var: %s", nc_strerror(err));
+    ELSE_NOK
     err = nc_inq_var(ncid, varid, name, &datatype, &ndims, dimids, &natts);
-    IF (err)
-        error("nc_inq_var: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("inq_var: %s", nc_strerror(err));
     IF (strcmp(name, "abc") != 0)
         error("Unexpected name: %s", name);
     IF (datatype != NC_SHORT)
@@ -649,205 +713,271 @@ test_nc_def_var(void)
         error("Unexpected rank");
     err = nc_def_var(ncid, BAD_NAME, NC_SHORT, 0, NULL, &varid);
     IF (err != NC_EBADNAME)
-        error("bad name: status = %d", err);
+        error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_def_var(ncid, "abc", NC_SHORT, 0, NULL, &varid);
     IF (err != NC_ENAMEINUSE)
-        error("duplicate name: status = %d", err);
+        error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_def_var(ncid, "ABC", BAD_TYPE, -1, dimids, &varid);
     IF (err != NC_EBADTYPE)
-        error("bad type: status = %d", err);
+        error("expecting NC_EBADTYPE but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_def_var(ncid, "ABC", NC_SHORT, -1, dimids, &varid);
     IF (err != NC_EINVAL)
-        error("bad rank: status = %d", err);
+        error("expecting NC_EINVAL but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_enddef(ncid);
-    IF (err)
-	error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     err = nc_def_var(ncid, "ABC", NC_SHORT, 0, dimids, &varid);
     IF (err != NC_ENOTINDEFINE)
-        error("nc_def_var called in data mode: status = %d", err);
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
 
-        /* general tests using global vars */
+    /* general tests using global vars */
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     def_dims(ncid);
     for (i = 0; i < numVars; i++) {
         err = nc_def_var(ncid, var_name[i], var_type[i], var_rank[i],
             var_dimid[i], &varid);
-        IF (err)
-	    error("nc_def_var: %s", nc_strerror(err));
-	IF (varid != i)
-	    error("Unexpected varid");
+        IF (err != NC_NOERR)
+            error("def_var: %s", nc_strerror(err));
+        ELSE_NOK
+        IF (varid != i)
+            error("Unexpected varid");
+        ELSE_NOK
     }
 
-        /* try bad dim ids */
+    /* try bad dim ids */
     dimids[0] = BAD_DIMID;
     err = nc_def_var(ncid, "abc", NC_SHORT, 1, dimids, &varid);
     IF (err != NC_EBADDIM)
-        error("bad dim ids: status = %d", err);
+        error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+    ELSE_NOK
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
 /*
- * Test nc_put_var1
+ * Test nc_put_var1(,,,)
  */
-void
+int
 test_nc_put_var1(void)
 {
-    int ncid;
-    int i;
-    int j;
-    int err;
-    size_t index[MAX_RANK];
-    double value;
-    double buf[1];		/* (void *) buffer */
+    int i, err, ncid, nok=0;
+    size_t j, index[MAX_RANK];
+    double value[1];
+    double buf[1];                /* (void *) buffer */
+    
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
+
     def_dims(ncid);
     def_vars(ncid);
+
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_var1(BAD_ID,0,NULL,NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_var1(ncid,BAD_VARID,NULL,NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
-        for (j = 0; j < var_rank[i]; j++)
-            index[j] = 0;
-        err = nc_put_var1(BAD_ID, i, index, buf);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_put_var1(ncid, BAD_VARID, index, buf);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        
+
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
         for (j = 0; j < var_rank[i]; j++) {
-            if (var_dimid[i][j] > 0) {          /* skip record dim */
-                index[j] = var_shape[i][j];
-                err = nc_put_var1(ncid, i, index, buf);
-                IF (err != NC_EINVALCOORDS)
-                    error("bad index: status = %d", err);
-                index[j] = 0;
-            }
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j]; /* out of boundary check */
+            err = nc_put_var1(ncid,i,index,value);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            index[j] = 0;
         }
+
         for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err)
-                error("error in toMixedBase");
-            value = hash( var_type[i], var_rank[i], index);
-	    if (inRange(value, var_type[i])) {
-		err = dbl2nc(value, var_type[i], buf);
-		IF (err)
-		    error("error in dbl2nc");
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_var1(ncid, i, NULL, buf);
-		else
-		    err = nc_put_var1(ncid, i, index, buf);
-		IF (err)
-		    error("%s", nc_strerror(err));
-	    }
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash(var_type[i], var_rank[i], index);
+            if (inRange(value[0], var_type[i])) {
+                err = dbl2nc(value[0], var_type[i], buf);
+                IF (err != NC_NOERR)
+                    error("error in dbl2nc var:%s type:%s",
+                          var_name[i],s_nc_type(var_type[i]));
+                err = nc_put_var1(ncid,i,index,buf);
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
+            }
         }
     }
 
     check_vars(ncid);
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
 /*
- * Test nc_put_vara
+ * Test nc_put_vara(,,,,)
  * Choose a random point dividing each dim into 2 parts
  * Put 2^rank (nslabs) slabs so defined
  * Redefine buffer for each put.
- * At end check all variables using check_vars
+ * At end check all variables using check_vars()
  */
-void
+int
 test_nc_put_vara(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int err;
-    int nels;
-    int nslabs;
+    int d, i, k, err, nslabs, ncid, nok=0;
+    size_t j, nels;
     size_t start[MAX_RANK];
     size_t edge[MAX_RANK];
     size_t index[MAX_RANK];
     size_t mid[MAX_RANK];
-    double buf[MAX_NELS]; 	/* (void *) buffer */
-    char *p;			/* (void *) pointer */
+    double buf[MAX_NELS];         /* (void *) buffer */
+    char *p;                      /* (void *) pointer */
     double value;
+    
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
+
     def_dims(ncid);
     def_vars(ncid);
+
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vara(BAD_ID,0,start,edge,buf);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vara(ncid,BAD_VARID,start,edge,buf);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        buf[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vara(BAD_ID,i,start,edge,buf);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
         }
-        err = nc_put_vara(BAD_ID, i, start, edge, buf);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_put_vara(ncid, BAD_VARID, start, edge, buf);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara(ncid,i,start,edge,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = nc_put_vara(ncid,i,start,edge,buf);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
         for (j = 0; j < var_rank[i]; j++) {
-            if (var_dimid[i][j] > 0) {          /* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vara(ncid, i, start, edge, buf);
-		IF (err != NC_EINVALCOORDS)
-		    error("bad index: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vara(ncid, i, start, edge, buf);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-	    }
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vara(ncid,i,start,edge,buf);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vara(ncid,i,start,edge,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* put 2^rank (nslabs) slabs so defined */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* put 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to put lower or upper part of dim */
+        /* bits of k determine whether to put lower or upper part of dim */
         for (k = 0; k < nslabs; k++) {
             nels = 1;
             for (j = 0; j < var_rank[i]; j++) {
@@ -860,63 +990,53 @@ test_nc_put_vara(void)
                 }
                 nels *= edge[j];
             }
-	    p = (char *) buf;
-	    for (j = 0; j < nels; j++) {
-		err = toMixedBase(j, var_rank[i], edge, index);
-		IF (err)
-		    error("error in toMixedBase");
-		for (d = 0; d < var_rank[i]; d++)
-		    index[d] += start[d];
-		value = hash( var_type[i], var_rank[i], index);
-		if (!inRange(value, var_type[i]))
-		    value = 0;
-		err = dbl2nc(value, var_type[i], p);
-		IF (err)
-		    error("error in dbl2nc");
-		p += nctypelen(var_type[i]);
+            p = (char *) buf;
+            for (j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value = hash(var_type[i], var_rank[i], index);
+                if (!inRange(value, var_type[i]))
+                    value = 0;
+                err = dbl2nc(value, var_type[i], p);
+                IF (err != NC_NOERR)
+                    error("error in dbl2nc");
+                p += nctypelen(var_type[i]);
             }
-            if (var_rank[i] == 0 && i%2 == 0)
-		err = nc_put_vara(ncid, i, NULL, NULL, buf);
-            else
-		err = nc_put_vara(ncid, i, start, edge, buf);
-            IF (err) {
+            err = nc_put_vara(ncid,i,start,edge,buf);
+            IF (err != NC_NOERR)
                 error("%s", nc_strerror(err));
-            }
+            ELSE_NOK
         }
     }
 
     check_vars(ncid);
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
 /*
- * Test nc_put_vars
+ * Test nc_put_vars(,,,,,)
  * Choose a random point dividing each dim into 2 parts
  * Put 2^rank (nslabs) slabs so defined
  * Choose random stride from 1 to edge
  * Redefine buffer for each put.
- * At end check all variables using check_vars
+ * At end check all variables using check_vars()
  */
-void
+int
 test_nc_put_vars(void)
 {
-    int ncid;
-    int d;
-    int i;
-    int j;
-    int k;
-    int m;
-    int err;
-    int nels;
-    int nslabs;
-    int nstarts;        /* number of different starts */
+    int ncid, d, i, k, err, nslabs, nok=0;
+    ptrdiff_t nstarts;        /* number of different starts */
+    size_t j, m, nels;
     size_t start[MAX_RANK];
     size_t edge[MAX_RANK];
     size_t index[MAX_RANK];
@@ -926,62 +1046,111 @@ test_nc_put_vars(void)
     size_t sstride[MAX_RANK];
     ptrdiff_t stride[MAX_RANK];
     double buf[MAX_NELS]; /* (void *) buffer */
-    char *p;			/* (void *) pointer */
+    char *p;              /* (void *) pointer */
     double value;
+    
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
+
     def_dims(ncid);
     def_vars(ncid);
+
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_vars(BAD_ID,0,NULL,NULL,NULL,NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_vars(ncid,BAD_VARID,NULL,NULL,NULL,NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        buf[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_vars(BAD_ID,i,NULL,NULL,NULL,buf);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
         }
-        err = nc_put_vars(BAD_ID, i, start, edge, stride, buf);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_put_vars(ncid, BAD_VARID, start, edge, stride, buf);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
-            if (var_dimid[i][j] > 0) {          /* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_vars(ncid, i, start, edge, stride, buf);
-		IF (err != NC_EINVALCOORDS && err != NC_EEDGE)
-		    error("bad index: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_vars(ncid, i, start, edge, stride, buf);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_vars(ncid, i, start, edge, stride, buf);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	    }
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars(ncid,i,start,edge,stride,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;  /* edge error check */
+            err = nc_put_vars(ncid,i,start,edge,stride,buf);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;  /* strided edge error check */
+            err = nc_put_vars(ncid,i,start,edge,stride,buf);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* put 2^rank (nslabs) slabs so defined */
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_vars(ncid,i,start,edge,stride,buf);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_vars(ncid,i,start,edge,stride,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* put 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to put lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
@@ -992,85 +1161,81 @@ test_nc_put_vars(void)
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
                 err = toMixedBase(m, var_rank[i], sstride, index);
-                IF (err)
-                    error("error in toMixedBase");
+                IF (err != 0) error("error in toMixedBase");
                 nels = 1;
                 for (j = 0; j < var_rank[i]; j++) {
-                    count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
                     nels *= count[j];
                     index[j] += start[j];
                 }
-                        /* Random choice of forward or backward */
+                /* Random choice of forward or backward */
 /* TODO
                 if ( roll(2) ) {
                     for (j = 0; j < var_rank[i]; j++) {
-                        index[j] += (count[j] - 1) * stride[j];
+                        index[j] += (count[j] - 1) * (size_t)stride[j];
                         stride[j] = -stride[j];
                     }
                 }
  */
-		p = (char *) buf;
-		for (j = 0; j < nels; j++) {
-		    err = toMixedBase(j, var_rank[i], count, index2);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (d = 0; d < var_rank[i]; d++)
-			index2[d] = index[d] + index2[d] * stride[d];
-		    value = hash( var_type[i], var_rank[i], index2);
-		    if (!inRange(value, var_type[i]))
-			value = 0;
-		    err = dbl2nc(value, var_type[i], p);
-		    IF (err)
-			error("error in dbl2nc");
-		    p += nctypelen(var_type[i]);
-		}
-		if (var_rank[i] == 0 && i%2 == 0)
-		    err = nc_put_vars(ncid, i, NULL, NULL, NULL, buf);
-		else
-		    err = nc_put_vars(ncid, i, index, count, stride, buf);
-		IF (err) {
-		    error("%s", nc_strerror(err));
-		}
+                p = (char *) buf;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (size_t)stride[d];
+                    value = hash(var_type[i], var_rank[i], index2);
+                    if (!inRange(value, var_type[i]))
+                        value = 0;
+                    err = dbl2nc(value, var_type[i], p);
+                    IF (err != NC_NOERR)
+                        error("error in dbl2nc");
+                    p += nctypelen(var_type[i]);
+                }
+                err = nc_put_vars(ncid,i,index,count,stride,buf);
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
             }
         }
     }
 
     check_vars(ncid);
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
 /*
- * Test nc_put_varm
+ * Test nc_put_varm(,,,,,,)
  * Choose a random point dividing each dim into 2 parts
  * Put 2^rank (nslabs) slabs so defined
  * Choose random stride from 1 to edge
  * Buffer is bit image of whole external variable.
  * So all puts for a variable put different elements of buffer
- * At end check all variables using check_vars
+ * At end check all variables using check_vars()
  */
-void
+int
 test_nc_put_varm(void)
 {
-    int ncid;
+    int ncid, nok=0;
     int i;
-    int j;
     int k;
-    int m;
     int err;
     int nslabs;
-    int nstarts;        /* number of different starts */
+    size_t j, m;
+    ptrdiff_t nstarts;        /* number of different starts */
     size_t start[MAX_RANK];
     size_t edge[MAX_RANK];
     size_t index[MAX_RANK];
@@ -1080,83 +1245,134 @@ test_nc_put_varm(void)
     ptrdiff_t stride[MAX_RANK];
     ptrdiff_t imap[MAX_RANK];
     ptrdiff_t imap2[MAX_RANK];
+    
     double buf[MAX_NELS];       /* (void *) buffer */
-    char *p;			/* (void *) pointer */
+    char *p;                    /* (void *) pointer */
     double value;
+    
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
+
     def_dims(ncid);
     def_vars(ncid);
+
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
+
+    /* check if can detect a bad file ID */
+    err = nc_put_varm(NC_EBADID,0,NULL,NULL,NULL,NULL,NULL);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = nc_put_varm(ncid,BAD_VARID,NULL,NULL,NULL,NULL,NULL);
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s",nc_err_code_name(err));
+    ELSE_NOK
 
     for (i = 0; i < numVars; i++) {
         assert(var_rank[i] <= MAX_RANK);
         assert(var_nels[i] <= MAX_NELS);
+
+        buf[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = nc_put_varm(BAD_ID,i,NULL,NULL,NULL,NULL,buf);
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s",nc_err_code_name(err));
+        ELSE_NOK
+
+        
+
         for (j = 0; j < var_rank[i]; j++) {
             start[j] = 0;
             edge[j] = 1;
             stride[j] = 1;
+            imap[j] = 1;
         }
-	if (var_rank[i] > 0) {
-	    j = var_rank[i] - 1;
-            // imap[j] = nctypelen(var_type[i]); /* in bytes */
-            imap[j] = 1; /* in numbers of elements */
-	    for (; j > 0; j--)
-		imap[j-1] = imap[j] * var_shape[i][j];
-	}
-	p = (char *) buf;
-	for (j = 0; j < var_nels[i]; j++) {
-	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
-	    IF (err)
-		error("error in toMixedBase");
-	    value = hash( var_type[i], var_rank[i], index);
-	    if (!inRange(value, var_type[i]))
-		value = 0;
-	    err = dbl2nc(value, var_type[i], p);
-	    IF (err)
-		error("error in dbl2nc");
-	    p += nctypelen(var_type[i]);
-	}
-        err = nc_put_varm(BAD_ID, i, start, edge, stride, imap, buf);
-        IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
-        err = nc_put_varm(ncid, BAD_VARID, start, edge, stride, imap, buf);
-        IF (err != NC_ENOTVAR)
-            error("bad var id: status = %d", err);
+
+
+        /* first test when edge[*] > 0 */
         for (j = 0; j < var_rank[i]; j++) {
-            if (var_dimid[i][j] > 0) {          /* skip record dim */
-		start[j] = var_shape[i][j];
-		err = nc_put_varm(ncid, i, start, edge, stride, imap, buf);
-		IF (err != NC_EINVALCOORDS && err != NC_EEDGE)
-		    error("bad index: status = %d", err);
-		start[j] = 0;
-		edge[j] = var_shape[i][j] + 1;
-		err = nc_put_varm(ncid, i, start, edge, stride, imap, buf);
-		IF (err != NC_EEDGE)
-		    error("bad edge: status = %d", err);
-		edge[j] = 1;
-		stride[j] = 0;
-		err = nc_put_varm(ncid, i, start, edge, stride, imap, buf);
-		IF (err != NC_ESTRIDE)
-		    error("bad stride: status = %d", err);
-		stride[j] = 1;
-	    }
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm(ncid,i,start,edge,stride,imap,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;  /* edge error check */
+            err = nc_put_varm(ncid,i,start,edge,stride,imap,buf);
+            IF (err != NC_EEDGE)
+                error("expecting NC_EEDG but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;  /* strided edge error check */
+            err = nc_put_varm(ncid,i,start,edge,stride,imap,buf);
+            IF (err != NC_ESTRIDE)
+                error("expecting NC_ESTRIDE but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = nc_put_varm(ncid,i,start,edge,stride,imap,buf);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = nc_put_varm(ncid,i,start,edge,stride,imap,buf);
+            IF (err != NC_EINVALCOORDS)
+                error("expecting NC_EINVALCOORDS but got %s",nc_err_code_name(err));
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        if (var_rank[i] > 0) {
+            int jj = var_rank[i] - 1;
+            imap[jj] = nctypelen(var_type[i]); /*  netCDF considers imap in bytes */
+            imap[jj] = 1;                      /* PnetCDF considers imap in elements */
+            for (; jj > 0; jj--)
+                imap[jj-1] = imap[jj] * (ptrdiff_t)var_shape[i][jj];
+        }
+        p = (char *) buf;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value = hash(var_type[i], var_rank[i], index);
+            if (!inRange(value, var_type[i]))
+                value = 0;
+            err = dbl2nc(value, var_type[i], p);
+            IF (err != NC_NOERR)
+                error("error in dbl2nc");
+            p += nctypelen(var_type[i]);
         }
-            /* Choose a random point dividing each dim into 2 parts */
-            /* put 2^rank (nslabs) slabs so defined */
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* put 2^rank (nslabs) slabs so defined */
         nslabs = 1;
         for (j = 0; j < var_rank[i]; j++) {
             mid[j] = roll( var_shape[i][j] );
             nslabs *= 2;
         }
-            /* bits of k determine whether to put lower or upper part of dim */
-            /* choose random stride from 1 to edge */
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
         for (k = 0; k < nslabs; k++) {
             nstarts = 1;
             for (j = 0; j < var_rank[i]; j++) {
@@ -1167,49 +1383,51 @@ test_nc_put_varm(void)
                     start[j] = mid[j];
                     edge[j] = var_shape[i][j] - mid[j];
                 }
-                sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
-                imap2[j] = imap[j] * sstride[j];
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (ptrdiff_t)sstride[j];
+                imap2[j] = imap[j] * (ptrdiff_t)sstride[j];
                 nstarts *= stride[j];
             }
             for (m = 0; m < nstarts; m++) {
-		if (var_rank[i] == 0 && i%2 == 0) {
-		    err = nc_put_varm(ncid, i, NULL, NULL, NULL, NULL, buf);
-		} else {
-		    err = toMixedBase(m, var_rank[i], sstride, index);
-		    IF (err)
-			error("error in toMixedBase");
-		    for (j = 0; j < var_rank[i]; j++) {
-			count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
-			index[j] += start[j];
-		    }
-			    /* Random choice of forward or backward */
+                if (var_rank[i] == 0 && i%2 == 0) {
+                    err = nc_put_varm(ncid,i,NULL,NULL,NULL,NULL,buf);
+                } else {
+                    err = toMixedBase(m, var_rank[i], sstride, index);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (j = 0; j < var_rank[i]; j++) {
+                        count[j] = 1 + (edge[j] - index[j] - 1) / (size_t)stride[j];
+                        index[j] += start[j];
+                    }
+                    /* Random choice of forward or backward */
 /* TODO
-		    if ( roll(2) ) {
-			for (j = 0; j < var_rank[i]; j++) {
-			    index[j] += (count[j] - 1) * stride[j];
-			    stride[j] = -stride[j];
-			}
-		    }
+                    if ( roll(2) ) {
+                        for (j = 0; j < var_rank[i]; j++) {
+                            index[j] += (count[j] - 1) * (size_t)stride[j];
+                            stride[j] = -stride[j];
+                        }
+                    }
  */
-		    j = fromMixedBase(var_rank[i], index, var_shape[i]);
-                    p = (char *) buf + j * nctypelen(var_type[i]);
-		    err = nc_put_varm(ncid, i, index, count, stride, imap2, p);
-		}
-		IF (err) {
-		    error("%s", nc_strerror(err));
-		}
+                    j = fromMixedBase(var_rank[i], index, var_shape[i]);
+                    p = (char *) buf + (int)j * nctypelen(var_type[i]);
+                    
+                    err = nc_put_varm(ncid,i,index,count,stride,imap2,p);
+                }
+                IF (err != NC_NOERR)
+                    error("expecting NC_NOERR but got %s",nc_err_code_name(err));
+                ELSE_NOK
             }
         }
     }
 
     check_vars(ncid);
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -1221,147 +1439,160 @@ test_nc_put_varm(void)
  *    check that proper rename worked with nc_inq_varid
  *    try in data mode, check error
  */
-void
+int
 test_nc_rename_var(void)
 {
     int ncid;
     int varid;
-    int err;
+    int err, nok=0;
     int i;
     char name[NC_MAX_NAME];
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     err = nc_rename_var(ncid, BAD_VARID, "newName");
     IF (err != NC_ENOTVAR)
-	error("bad var id: status = %d", err);
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
     def_dims(ncid);
     def_vars(ncid);
 
-	/* Prefix "new_" to each name */
+    /* Prefix "new_" to each name */
     for (i = 0; i < numVars; i++) {
         err = nc_rename_var(BAD_ID, i, "newName");
         IF (err != NC_EBADID)
-            error("bad ncid: status = %d", err);
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
         err = nc_rename_var(ncid, i, var_name[numVars-1]);
         IF (err != NC_ENAMEINUSE)
-            error("duplicate name: status = %d", err);
-	(void) strcpy(name, "new_");
-	(void) strcat(name, var_name[i]);
+            error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        strcpy(name, "new_");
+        strcat(name, var_name[i]);
         err = nc_rename_var(ncid, i, name);
-        IF (err)
-	    error("nc_rename_var: %s", nc_strerror(err));
+        IF (err != NC_NOERR)
+            error("rename_var: %s", nc_strerror(err));
+        ELSE_NOK
         err = nc_inq_varid(ncid, name, &varid);
-        IF (err)
-	    error("nc_inq_varid: %s", nc_strerror(err));
+        IF (err != NC_NOERR)
+            error("inq_varid: %s", nc_strerror(err));
         IF (varid != i)
-	    error("Unexpected varid");
+            error("Unexpected varid");
     }
 
-	/* Change to data mode */
-	/* Try making names even longer. Then restore original names */
+    /* Change to data mode */
+    /* Try making names even longer. Then restore original names */
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	(void) strcpy(name, "even_longer_");
-	(void) strcat(name, var_name[i]);
+        strcpy(name, "even_longer_");
+        strcat(name, var_name[i]);
         err = nc_rename_var(ncid, i, name);
         IF (err != NC_ENOTINDEFINE)
-            error("longer name in data mode: status = %d", err);
+            error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+        ELSE_NOK
         err = nc_rename_var(ncid, i, var_name[i]);
-        IF (err)
-	    error("nc_rename_var: %s", nc_strerror(err));
+        IF (err != NC_NOERR)
+            error("rename_var: %s", nc_strerror(err));
+        ELSE_NOK
         err = nc_inq_varid(ncid, var_name[i], &varid);
-        IF (err)
-	    error("nc_inq_varid: %s", nc_strerror(err));
+        IF (err != NC_NOERR)
+            error("inq_varid: %s", nc_strerror(err));
         IF (varid != i)
-	    error("Unexpected varid");
+            error("Unexpected varid");
     }
 
     put_vars(ncid);
     check_vars(ncid);
 
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
-void
+int
 test_nc_put_att(void)
 {
-    int ncid;
+    int ncid, nok=0;
     int varid;
     int i;
     int j;
-    size_t k;
+    size_t k, ndx[1];
     int err;
     double buf[MAX_NELS];       /* (void *) buffer */
     char *p;                    /* (void *) pointer */
-    char *name;			/* of att */
-    nc_type datatype;		/* of att */
-    size_t length;		/* of att */
+    char *name;                 /* of att */
+    nc_type datatype;           /* of att */
+    size_t length;             /* of att */
     double value;
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     def_dims(ncid);
     def_vars(ncid);
 
     for (i = -1; i < numVars; i++) {
-	varid = VARID(i);
+        varid = VARID(i);
         for (j = 0; j < NATTS(i); j++) {
-	    name = ATT_NAME(i,j);
-	    datatype = ATT_TYPE(i,j);
-	    length = ATT_LEN(i,j);
+            name = ATT_NAME(i,j);
+            datatype = ATT_TYPE(i,j);
+            length = ATT_LEN(i,j);
             err = nc_put_att(BAD_ID, varid, name, datatype, length, buf);
             IF (err != NC_EBADID)
-                error("bad ncid: status = %d", err);
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
             err = nc_put_att(ncid, varid, BAD_NAME, datatype, length, buf);
-	    IF (err != NC_EBADNAME)
-		error("bad name: status = %d", err);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
+            ELSE_NOK
             err = nc_put_att(ncid, BAD_VARID, name, datatype, length, buf);
             IF (err != NC_ENOTVAR)
-                error("bad var id: status = %d", err);
-	    err = nc_put_att(ncid, varid, name, BAD_TYPE, length, buf);
-	    IF (err != NC_EBADTYPE)
-		error("bad type: status = %d", err);
-	    p = (char *) buf;
-	    for (k = 0; k < length; k++) {
-		value = hash(datatype, -1, &k );
-		if (!inRange(value, datatype))
-		    value = 0;
-		err = dbl2nc(value, datatype, p);
-		IF (err)
-		    error("error in dbl2nc");
-		p += nctypelen(datatype);
-	    }
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_put_att(ncid, varid, name, BAD_TYPE, length, buf);
+            IF (err != NC_EBADTYPE)
+                error("expecting NC_EBADTYPE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            p = (char *) buf;
+            for (k=0; k<length; k++) {
+                ndx[0] = k;
+                value = hash(datatype, -1, ndx);
+                if (!inRange(value, datatype))
+                    value = 0;
+                err = dbl2nc(value, datatype, p);
+                IF (err != NC_NOERR)
+                    error("error in dbl2nc");
+                p += nctypelen(datatype);
+            }
             err = nc_put_att(ncid, varid, name, datatype, length, buf);
-            IF (err) {
+            IF (err != NC_NOERR)
                 error("%s", nc_strerror(err));
-            }
+            ELSE_NOK
         }
     }
 
     check_atts(ncid);
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -1377,27 +1608,27 @@ test_nc_put_att(void)
  *    try with same ncid for source and target, different variables
  *    try with same ncid for source and target, same variable
  */
-void
+int
 test_nc_copy_att(void)
 {
     int ncid_in;
     int ncid_out;
     int varid;
-    int err;
+    int err, nok=0;
     int i;
-    int j;
+    int j=0;
     char *name;                 /* of att */
     nc_type datatype;           /* of att */
-    size_t length;              /* of att */
+    size_t length;             /* of att */
     char  value;
 
     err = file_open(testfile, NC_NOWRITE, &ncid_in);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
     err = file_create(scratch, NC_NOCLOBBER, &ncid_out);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     def_dims(ncid_out);
     def_vars(ncid_out);
@@ -1406,106 +1637,115 @@ test_nc_copy_att(void)
         varid = VARID(i);
         for (j = 0; j < NATTS(i); j++) {
             name = ATT_NAME(i,j);
-	    err = nc_copy_att(ncid_in, BAD_VARID, name, ncid_out, varid);
-	    IF (err != NC_ENOTVAR)
-		error("bad var id: status = %d", err);
-	    err = nc_copy_att(ncid_in, varid, name, ncid_out, BAD_VARID);
-	    IF (err != NC_ENOTVAR)
-		error("bad var id: status = %d", err);
-	    err = nc_copy_att(BAD_ID, varid, name, ncid_out, varid);
-	    IF (err != NC_EBADID)
-		error("bad ncid: status = %d", err);
-	    err = nc_copy_att(ncid_in, varid, name, BAD_ID, varid);
-	    IF (err != NC_EBADID)
-		error("bad ncid: status = %d", err);
-	    err = nc_copy_att(ncid_in, varid, "noSuch", ncid_out, varid);
-	    IF (err != NC_ENOTATT)
-		error("bad attname: status = %d", err);
-	    err = nc_copy_att(ncid_in, varid, name, ncid_out, varid);
-	    IF (err)
-		error("nc_copy_att: %s", nc_strerror(err));
-	    err = nc_copy_att(ncid_out, varid, name, ncid_out, varid);
-	    IF (err)
-		error("source = target: %s", nc_strerror(err));
-	}
+            err = nc_copy_att(ncid_in, BAD_VARID, name, ncid_out, varid);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_copy_att(ncid_in, varid, name, ncid_out, BAD_VARID);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_copy_att(BAD_ID, varid, name, ncid_out, varid);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_copy_att(ncid_in, varid, name, BAD_ID, varid);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_copy_att(ncid_in, varid, "noSuch", ncid_out, varid);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_copy_att(ncid_in, varid, name, ncid_out, varid);
+            IF (err != NC_NOERR)
+                error("copy_att: %s", nc_strerror(err));
+            ELSE_NOK
+            err = nc_copy_att(ncid_out, varid, name, ncid_out, varid);
+            IF (err != NC_NOERR)
+                error("source = target: %s", nc_strerror(err));
+            ELSE_NOK
+        }
     }
 
     err = nc_close(ncid_in);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-        /* Close scratch. Reopen & check attributes */
+    /* Close scratch. Reopen & check attributes */
     err = nc_close(ncid_out);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
     err = file_open(scratch, NC_WRITE, &ncid_out);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
     check_atts(ncid_out);
 
-       /*
-	* change to define mode
-	* define single char. global att. ':a' with value 'A'
-	* This will be used as source for following copies
-	*/
+   /*
+    * change to define mode
+    * define single char. global att. ':a' with value 'A'
+    * This will be used as source for following copies
+    */
     err = nc_redef(ncid_out);
-    IF (err)
-        error("nc_redef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("redef: %s", nc_strerror(err));
     err = nc_put_att_text(ncid_out, NC_GLOBAL, "a", 1, "A");
-    IF (err)
-	error("nc_put_att_text: %s", nc_strerror(err));
-
-       /*
-	* change to data mode
-	* Use scratch as both source & dest.
-	* try copy to existing att. change type & decrease length
-	* rename 1st existing att of each var (if any) 'a'
-	* if this att. exists them copy ':a' to it
-	*/
+    IF (err != NC_NOERR)
+        error("put_att_text: %s", nc_strerror(err));
+
+   /*
+    * change to data mode
+    * Use scratch as both source & dest.
+    * try copy to existing att. change type & decrease length
+    * rename 1st existing att of each var (if any) 'a'
+    * if this att. exists them copy ':a' to it
+    */
     err = nc_enddef(ncid_out);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	if (NATTS(i) > 0 && ATT_LEN(i,j) > 0) {
-	    err = nc_rename_att(ncid_out, i, att_name[i][0], "a");
-	    IF (err)
-		error("nc_rename_att: %s", nc_strerror(err));
-	    err = nc_copy_att(ncid_out, NC_GLOBAL, "a", ncid_out, i);
-	    IF (err)
-		error("nc_copy_att: %s", nc_strerror(err));
-	}
+        if (NATTS(i) > 0 && ATT_LEN(i,j) > 0) {
+            err = nc_rename_att(ncid_out, i, att_name[i][0], "a");
+            IF (err != NC_NOERR)
+                error("rename_att: %s", nc_strerror(err));
+            err = nc_copy_att(ncid_out, NC_GLOBAL, "a", ncid_out, i);
+            IF (err != NC_NOERR)
+                error("copy_att: %s", nc_strerror(err));
+            ELSE_NOK
+        }
     }
     err = nc_close(ncid_out);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-	/* Reopen & check */
+    /* Reopen & check */
     err = file_open(scratch, NC_WRITE, &ncid_out);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
     for (i = 0; i < numVars; i++) {
-	if (NATTS(i) > 0 && ATT_LEN(i,j) > 0) {
-	    err = nc_inq_att(ncid_out, i, "a", &datatype, &length);
-	    IF (err)
-		error("nc_inq_att: %s", nc_strerror(err));
-	    IF (datatype != NC_CHAR)
-		error("Unexpected type");
-	    IF (length != 1)
-		error("Unexpected length");
-	    err = nc_get_att_text(ncid_out, i, "a", &value);
-	    IF (err)
-		error("nc_get_att_text: %s", nc_strerror(err));
-	    IF (value != 'A')
-		error("Unexpected value");
-	}
+        if (NATTS(i) > 0 && ATT_LEN(i,j) > 0) {
+            err = nc_inq_att(ncid_out, i, "a", &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s", nc_strerror(err));
+            IF (datatype != NC_CHAR)
+                error("Unexpected type");
+            IF (length != 1)
+                error("Unexpected length");
+            err = nc_get_att_text(ncid_out, i, "a", &value);
+            IF (err != NC_NOERR)
+                error("get_att_text: %s", nc_strerror(err));
+            IF (value != 'A')
+                error("Unexpected value");
+        }
     }
 
     err = nc_close(ncid_out);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -1518,7 +1758,7 @@ test_nc_copy_att(void)
  *    check that proper rename worked with nc_inq_attid
  *    try in data mode, check error
  */
-void
+int
 test_nc_rename_att(void)
 {
     int ncid;
@@ -1526,7 +1766,7 @@ test_nc_rename_att(void)
     int err;
     int i;
     int j;
-    size_t  k;
+    size_t k, ndx[1];
     int attnum;
     char *attname;
     char name[NC_MAX_NAME];
@@ -1537,18 +1777,19 @@ test_nc_rename_att(void)
     nc_type atttype;
     size_t length;
     size_t attlength;
-    signed char  text[MAX_NELS];
+    char  text[MAX_NELS];
     double value[MAX_NELS];
     double expect;
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     err = nc_rename_att(ncid, BAD_VARID, "abc", "newName");
     IF (err != NC_ENOTVAR)
-	error("bad var id: status = %d", err);
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
     def_dims(ncid);
     def_vars(ncid);
     put_atts(ncid);
@@ -1556,117 +1797,118 @@ test_nc_rename_att(void)
     for (i = -1; i < numVars; i++) {
         varid = VARID(i);
         for (j = 0; j < NATTS(i); j++) {
-	    attname = ATT_NAME(i,j);
-	    err = nc_rename_att(BAD_ID, varid, attname, "newName");
-	    IF (err != NC_EBADID)
-		error("bad ncid: status = %d", err);
-	    err = nc_rename_att(ncid, varid, "noSuch", "newName");
-	    IF (err != NC_ENOTATT)
-		error("bad attname: status = %d", err);
-	    (void) strcpy(newname, "new_");
-	    (void) strcat(newname, attname);
-	    err = nc_rename_att(ncid, varid, attname, newname);
-	    IF (err)
-		error("nc_rename_att: %s", nc_strerror(err));
-	    err = nc_inq_attid(ncid, varid, newname, &attnum);
-	    IF (err)
-		error("nc_inq_attid: %s", nc_strerror(err));
-	    IF (attnum != j)
-		error("Unexpected attnum");
-	}
+            attname = ATT_NAME(i,j);
+            err = nc_rename_att(BAD_ID, varid, attname, "newName");
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_rename_att(ncid, varid, "noSuch", "newName");
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            strcpy(newname, "new_");
+            strcat(newname, attname);
+            err = nc_rename_att(ncid, varid, attname, newname);
+            IF (err != NC_NOERR)
+                error("rename_att: %s", nc_strerror(err));
+            ELSE_NOK
+            err = nc_inq_attid(ncid, varid, newname, &attnum);
+            IF (err != NC_NOERR)
+                error("inq_attid: %s", nc_strerror(err));
+            IF (attnum != j)
+                error("Unexpected attnum");
+        }
     }
 
-        /* Close. Reopen & check */
+    /* Close. Reopen & check */
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
     err = file_open(scratch, NC_WRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
         varid = VARID(i);
         for (j = 0; j < NATTS(i); j++) {
-	    attname = ATT_NAME(i,j);
-	    atttype = ATT_TYPE(i,j);
-	    attlength = ATT_LEN(i,j);
-            (void) strcpy(newname, "new_");
-            (void) strcat(newname, attname);
+            attname = ATT_NAME(i,j);
+            atttype = ATT_TYPE(i,j);
+            attlength = ATT_LEN(i,j);
+            strcpy(newname, "new_");
+            strcat(newname, attname);
             err = nc_inq_attname(ncid, varid, j, name);
-            IF (err)
-                error("nc_inq_attname: %s", nc_strerror(err));
+            IF (err != NC_NOERR)
+                error("inq_attname: %s", nc_strerror(err));
             IF (strcmp(name, newname) != 0)
-                error("nc_inq_attname: unexpected name");
+                error("inq_attname: unexpected name");
             err = nc_inq_att(ncid, varid, name, &datatype, &length);
-            IF (err)
-                error("nc_inq_att: %s", nc_strerror(err));
+            IF (err != NC_NOERR)
+                error("inq_att: %s", nc_strerror(err));
             IF (datatype != atttype)
-                error("nc_inq_att: unexpected type");
+                error("inq_att: unexpected type");
             IF (length != attlength)
-                error("nc_inq_att: unexpected length");
+                error("inq_att: unexpected length");
             if (datatype == NC_CHAR) {
                 err = nc_get_att_text(ncid, varid, name, text);
-                IF (err)
-                    error("nc_get_att_text: %s", nc_strerror(err));
+                IF (err != NC_NOERR)
+                    error("get_att_text: %s", nc_strerror(err));
                 for (k = 0; k < attlength; k++) {
-                    expect = hash(datatype, -1, &k);
-                    IF (text[k] != expect) {
-                        error("nc_get_att_text: unexpected value");
-                    } else {
-                        nok++;
-                    }
+                    ndx[0] = k;
+                    expect = hash(datatype, -1, ndx);
+                    IF (text[k] != (char)expect)
+                        error("get_att_text: unexpected value");
                 }
             } else {
                 err = nc_get_att_double(ncid, varid, name, value);
-                IF (err)
-                    error("nc_get_att_double: %s", nc_strerror(err));
+                IF (err != NC_NOERR)
+                    error("get_att_double: %s", nc_strerror(err));
                 for (k = 0; k < attlength; k++) {
-                    expect = hash(datatype, -1, &k);
-		    if (inRange(expect, datatype)) {
-			IF (!equal(value[k],expect,datatype,NCT_DOUBLE)) {
-			    error("nc_get_att_double: unexpected value");
-			} else {
-			    nok++;
-			}
+                    ndx[0] = k;
+                    expect = hash(datatype, -1, ndx);
+                    if (inRange(expect, datatype)) {
+                        IF (!equal(value[k],expect,datatype,NCT_DOUBLE))
+                            error("get_att_double: unexpected value");
                     }
                 }
             }
         }
     }
-    print_nok(nok);
 
-	/* Now in data mode */
-	/* Try making names even longer. Then restore original names */
+    /* Now in data mode */
+    /* Try making names even longer. Then restore original names */
 
     for (i = -1; i < numVars; i++) {
         varid = VARID(i);
         for (j = 0; j < NATTS(i); j++) {
-	    attname = ATT_NAME(i,j);
-	    (void) strcpy(oldname, "new_");
-	    (void) strcat(oldname, attname);
-	    (void) strcpy(newname, "even_longer_");
-	    (void) strcat(newname, attname);
-	    err = nc_rename_att(ncid, varid, oldname, newname);
-	    IF (err != NC_ENOTINDEFINE)
-		error("longer name in data mode: status = %d", err);
-	    err = nc_rename_att(ncid, varid, oldname, attname);
-	    IF (err)
-		error("nc_rename_att: %s", nc_strerror(err));
-	    err = nc_inq_attid(ncid, varid, attname, &attnum);
-	    IF (err)
-		error("nc_inq_attid: %s", nc_strerror(err));
-	    IF (attnum != j)
-		error("Unexpected attnum");
-	}
+            attname = ATT_NAME(i,j);
+            strcpy(oldname, "new_");
+            strcat(oldname, attname);
+            strcpy(newname, "even_longer_");
+            strcat(newname, attname);
+            err = nc_rename_att(ncid, varid, oldname, newname);
+            IF (err != NC_ENOTINDEFINE)
+                error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_rename_att(ncid, varid, oldname, attname);
+            IF (err != NC_NOERR)
+                error("rename_att: %s", nc_strerror(err));
+            ELSE_NOK
+            err = nc_inq_attid(ncid, varid, attname, &attnum);
+            IF (err != NC_NOERR)
+                error("inq_attid: %s", nc_strerror(err));
+            IF (attnum != j)
+                error("Unexpected attnum");
+        }
     }
 
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-    err = remove(scratch);
-    IF (err)
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -1678,11 +1920,11 @@ test_nc_rename_att(void)
  *    check that proper delete worked using:
  *      nc_inq_attid, nc_inq_natts, nc_inq_varnatts
  */
-void
+int
 test_nc_del_att(void)
 {
     int ncid;
-    int err;
+    int err, nok=0;
     int i;
     int j;
     int attnum;
@@ -1692,96 +1934,102 @@ test_nc_del_att(void)
     char *name;                 /* of att */
 
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     err = nc_del_att(ncid, BAD_VARID, "abc");
     IF (err != NC_ENOTVAR)
-	error("bad var id: status = %d", err);
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
     def_dims(ncid);
     def_vars(ncid);
     put_atts(ncid);
 
     for (i = -1; i < numVars; i++) {
-	varid = VARID(i);
-	numatts = NATTS(i);
+        varid = VARID(i);
+        numatts = NATTS(i);
         for (j = 0; j < numatts; j++) {
-	    name = ATT_NAME(i,j);
-	    err = nc_del_att(BAD_ID, varid, name);
-	    IF (err != NC_EBADID)
-		error("bad ncid: status = %d", err);
-	    err = nc_del_att(ncid, varid, "noSuch");
-	    IF (err != NC_ENOTATT)
-		error("bad attname: status = %d", err);
-	    err = nc_del_att(ncid, varid, name);
-	    IF (err)
-		error("nc_del_att: %s", nc_strerror(err));
-	    err = nc_inq_attid(ncid, varid, name, &attnum);
-	    IF (err != NC_ENOTATT)
-		error("bad attname: status = %d", err);
-	    if (i < 0) {
-		err = nc_inq_natts(ncid, &natts);
-		IF (err)
-		    error("nc_inq_natts: %s", nc_strerror(err));
-		IF (natts != numatts-j-1)
-		    error("natts: expected %d, got %d", numatts-j-1, natts);
-	    }
-	    err = nc_inq_varnatts(ncid, varid, &natts);
-	    IF (err)
-		error("nc_inq_varnatts: %s", nc_strerror(err));
-	    IF (natts != numatts-j-1)
-		error("natts: expected %d, got %d", numatts-j-1, natts);
-	}
+            name = ATT_NAME(i,j);
+            err = nc_del_att(BAD_ID, varid, name);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_del_att(ncid, varid, "noSuch");
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = nc_del_att(ncid, varid, name);
+            IF (err != NC_NOERR)
+                error("del_att: %s", nc_strerror(err));
+            ELSE_NOK
+            err = nc_inq_attid(ncid, varid, name, &attnum);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            if (i < 0) {
+                err = nc_inq_natts(ncid, &natts);
+                IF (err != NC_NOERR)
+                    error("inq_natts: %s", nc_strerror(err));
+                IF (natts != numatts-j-1)
+                    error("natts: expected %d, got %d", numatts-j-1, natts);
+            }
+            err = nc_inq_varnatts(ncid, varid, &natts);
+            IF (err != NC_NOERR)
+                error("inq_natts: %s", nc_strerror(err));
+            IF (natts != numatts-j-1)
+                error("natts: expected %d, got %d", numatts-j-1, natts);
+        }
     }
 
-        /* Close. Reopen & check no attributes left */
+    /* Close. Reopen & check no attributes left */
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
     err = file_open(scratch, NC_WRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
     err = nc_inq_natts(ncid, &natts);
-    IF (err)
-	error("nc_inq_natts: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("inq_natts: %s", nc_strerror(err));
     IF (natts != 0)
-	error("natts: expected %d, got %d", 0, natts);
+        error("natts: expected %d, got %d", 0, natts);
     for (i = -1; i < numVars; i++) {
-	varid = VARID(i);
-	err = nc_inq_varnatts(ncid, varid, &natts);
-	IF (err)
-	    error("nc_inq_natts: %s", nc_strerror(err));
-	IF (natts != 0)
-	    error("natts: expected %d, got %d", 0, natts);
+        varid = VARID(i);
+        err = nc_inq_varnatts(ncid, varid, &natts);
+        IF (err != NC_NOERR)
+            error("inq_natts: %s", nc_strerror(err));
+        IF (natts != 0)
+            error("natts: expected %d, got %d", 0, natts);
     }
 
-	/* restore attributes. change to data mode. try to delete */
+    /* restore attributes. change to data mode. try to delete */
     err = nc_redef(ncid);
-    IF (err)
-        error("nc_redef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("redef: %s", nc_strerror(err));
     put_atts(ncid);
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
 
     for (i = -1; i < numVars; i++) {
-	varid = VARID(i);
-	numatts = NATTS(i);
+        varid = VARID(i);
+        numatts = NATTS(i);
         for (j = 0; j < numatts; j++) {
-	    name = ATT_NAME(i,j);
-	    err = nc_del_att(ncid, varid, name);
-	    IF (err != NC_ENOTINDEFINE)
-		error("in data mode: status = %d", err);
-	}
+            name = ATT_NAME(i,j);
+            err = nc_del_att(ncid, varid, name);
+            IF (err != NC_ENOTINDEFINE)
+                error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+        }
     }
 
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+    return nok;
 }
 
 
@@ -1795,14 +2043,14 @@ test_nc_del_att(void)
  *    (note that it is not possible to test NC_NOFILL mode!)
  *    close file & create again for test using attribute _FillValue
  */
-void
+int
 test_nc_set_fill(void)
 {
     int ncid;
     int varid;
     int err;
     int i;
-    int j;
+    size_t j;
     int old_fillmode;
     int nok = 0;      /* count of valid comparisons */
     char text = 0;
@@ -1810,170 +2058,178 @@ test_nc_set_fill(void)
     double fill;
     size_t index[MAX_RANK];
 
-	/* bad ncid */
+    /* bad ncid */
     err = nc_set_fill(BAD_ID, NC_NOFILL, &old_fillmode);
     IF (err != NC_EBADID)
-	error("bad ncid: status = %d", err);
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
 
-	/* try in read-only mode */
+    /* try in read-only mode */
     err = file_open(testfile, NC_NOWRITE, &ncid);
-    IF (err)
-        error("nc_open: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("open: %s", nc_strerror(err));
     err = nc_set_fill(ncid, NC_NOFILL, &old_fillmode);
     IF (err != NC_EPERM)
-	error("read-only: status = %d", err);
+        error("expecting NC_EPERM but got %s", nc_err_code_name(err));
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
 
-	/* create scratch */
+    /* create scratch */
     err = file_create(scratch, NC_NOCLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
 
-	/* BAD_FILLMODE */
+    /* BAD_FILLMODE */
     err = nc_set_fill(ncid, BAD_FILLMODE, &old_fillmode);
     IF (err != NC_EINVAL)
-        error("bad fillmode: status = %d", err);
+        error("expecting NC_EINVAL but got %s", nc_err_code_name(err));
 
-	/* proper calls */
+    /* proper calls */
     err = nc_set_fill(ncid, NC_NOFILL, &old_fillmode);
-    IF (err)
-        error("nc_set_fill: %s", nc_strerror(err));
-    IF (old_fillmode != NC_FILL)
+    IF (err != NC_NOERR)
+        error("set_fill: %s", nc_strerror(err));
+    IF (old_fillmode != NC_NOFILL)
         error("Unexpected old fill mode: %d", old_fillmode);
     err = nc_set_fill(ncid, NC_FILL, &old_fillmode);
-    IF (err)
-        error("nc_set_fill: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("set_fill: %s", nc_strerror(err));
     IF (old_fillmode != NC_NOFILL)
         error("Unexpected old fill mode: %d", old_fillmode);
 
-	/* define dims & vars */
+    /* define dims & vars */
     def_dims(ncid);
     def_vars(ncid);
 
-	/* Change to data mode. Set fillmode again */
+    /* Change to data mode. Set fillmode again */
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     err = nc_set_fill(ncid, NC_FILL, &old_fillmode);
-    IF (err)
+IF (err)
         error("nc_set_fill: %s", nc_strerror(err));
     IF (old_fillmode != NC_FILL)
         error("Unexpected old fill mode: %d", old_fillmode);
-
-	/* Write record number NRECS to force writing of preceding records */
-	/* Assumes variable cr is char vector with UNLIMITED dimension */
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
     err = nc_inq_varid(ncid, "cr", &varid);
-    IF (err)
-        error("nc_inq_varid: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("inq_varid: %s", nc_strerror(err));
     index[0] = NRECS;
+
+
     err = nc_put_var1_text(ncid, varid, index, &text);
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("put_var1_text_all: %s", nc_strerror(err));
 
-	/* get all variables & check all values equal default fill */
+    /* get all variables & check all values equal default fill */
     for (i = 0; i < numVars; i++) {
-	switch (var_type[i]) {
-	    case NC_CHAR:   fill = NC_FILL_CHAR; break;
-	    case NC_BYTE:   fill = NC_FILL_BYTE; break;
-	    case NC_SHORT:  fill = NC_FILL_SHORT; break;
-	    case NC_INT:   fill = NC_FILL_INT; break;
-	    case NC_FLOAT:  fill = NC_FILL_FLOAT; break;
-	    case NC_DOUBLE: fill = NC_FILL_DOUBLE; break;
-	    default: assert(0);
-	}
-	for (j = 0; j < var_nels[i]; j++) {
+        
+        switch (var_type[i]) {
+            case NC_CHAR:   fill = (double)NC_FILL_CHAR;   break;
+            case NC_BYTE:   fill = (double)NC_FILL_BYTE;   break;
+            case NC_SHORT:  fill = (double)NC_FILL_SHORT;  break;
+            case NC_INT:    fill = (double)NC_FILL_INT;    break;
+            case NC_FLOAT:  fill = (double)NC_FILL_FLOAT;  break;
+            case NC_DOUBLE: fill = (double)NC_FILL_DOUBLE; break;
+            case NC_UBYTE:  fill = (double)NC_FILL_UBYTE;  break;
+            case NC_USHORT: fill = (double)NC_FILL_USHORT; break;
+            case NC_UINT:   fill = (double)NC_FILL_UINT;   break;
+            case NC_INT64:  fill = (double)NC_FILL_INT64;  break;
+            case NC_UINT64: fill = (double)NC_FILL_UINT64; break;
+            default: assert(0);
+        }
+        for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err)
-                error("error in toMixedBase");
-	    if (var_type[i] == NC_CHAR) {
-		err = nc_get_var1_text(ncid, i, index, &text);
-		IF (err)
-		    error("nc_get_var1_text failed: %s", nc_strerror(err));
-		value = text;
-	    } else {
-		err = nc_get_var1_double(ncid, i, index, &value);
-		IF (err)
-		    error("nc_get_var1_double failed: %s", nc_strerror(err));
-	    }
-	    IF (value != fill && fabs((fill - value)/fill) > DBL_EPSILON)
-		error("\n\t\tValue expected: %-23.17e,\n\t\t          read: %-23.17e\n",
-			fill, value);
-	    else
-		nok++;
+            IF (err != 0) error("error in toMixedBase");
+            if (var_type[i] == NC_CHAR) {
+                err = nc_get_var1_text(ncid, i, index, &text);
+                IF (err != NC_NOERR)
+                    error("get_var1_text_all failed: %s", nc_strerror(err));
+                value = text;
+            } else {
+                err = nc_get_var1_double(ncid, i, index, &value);
+                IF (err != NC_NOERR)
+                    error("get_var1_double_all failed: %s", nc_strerror(err));
+            }
+            IF (value != fill && fabs((fill - value)/fill) > DBL_EPSILON)
+                error("\n\t\t%s Value expected: %-23.17e,\n\t\t          read: %-23.17e\n",
+                        var_name[i],fill, value);
+            ELSE_NOK
         }
     }
 
-	/* close scratch & create again for test using attribute _FillValue */
+    /* close scratch & create again for test using attribute _FillValue */
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
     err = file_create(scratch, NC_CLOBBER, &ncid);
-    IF (err) {
-        error("nc_create: %s", nc_strerror(err));
-        return;
+    IF (err != NC_NOERR) {
+        error("create: %s", nc_strerror(err));
+        return nok;
     }
     def_dims(ncid);
     def_vars(ncid);
 
-	/* set _FillValue = 42 for all vars */
-    text = fill = 42;
+    /* set _FillValue = 42 for all vars */
+    fill = 42;
+    text = 42;
     for (i = 0; i < numVars; i++) {
-	if (var_type[i] == NC_CHAR) {
-	    err = nc_put_att_text(ncid, i, "_FillValue", 1, &text);
-	    IF (err)
-		error("nc_put_att_text: %s", nc_strerror(err));
-	} else {
-	    err = nc_put_att_double(ncid, i, "_FillValue",var_type[i],1,&fill);
-	    IF (err)
-		error("nc_put_att_double: %s", nc_strerror(err));
-	}
+        if (var_type[i] == NC_CHAR) {
+            err = nc_put_att_text(ncid, i, "_FillValue", 1, &text);
+            IF (err != NC_NOERR)
+                error("put_att_text: %s", nc_strerror(err));
+        } else {
+            err = nc_put_att_double(ncid, i, "_FillValue",var_type[i],1,&fill);
+            IF (err != NC_NOERR)
+                error("put_att_double: %s", nc_strerror(err));
+        }
     }
 
-	/* data mode. write records */
+    /* data mode. write records */
     err = nc_enddef(ncid);
-    IF (err)
-        error("nc_enddef: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("enddef: %s", nc_strerror(err));
     index[0] = NRECS;
+
+
     err = nc_put_var1_text(ncid, varid, index, &text);
-    IF (err)
-        error("nc_put_var1_text: %s", nc_strerror(err));
+    IF (err != NC_NOERR)
+        error("put_var1_text_all: %s", nc_strerror(err));
 
-	/* get all variables & check all values equal 42 */
+    /* get all variables & check all values equal 42 */
     for (i = 0; i < numVars; i++) {
-	for (j = 0; j < var_nels[i]; j++) {
+        if (var_dimid[i][0] == RECDIM) continue; /* skip record variables */
+        for (j = 0; j < var_nels[i]; j++) {
             err = toMixedBase(j, var_rank[i], var_shape[i], index);
-            IF (err)
-                error("error in toMixedBase");
-	    if (var_type[i] == NC_CHAR) {
-		err = nc_get_var1_text(ncid, i, index, &text);
-		IF (err)
-		    error("nc_get_var1_text failed: %s", nc_strerror(err));
-		value = text;
-	    } else {
-		err = nc_get_var1_double(ncid, i, index, &value);
-		IF (err)
-		    error("nc_get_var1_double failed: %s", nc_strerror(err));
-	    }
-	    IF (value != fill)
-		error(" Value expected: %g, read: %g\n", fill, value);
-	    else
-		nok++;
+            IF (err != 0) error("error in toMixedBase");
+            if (var_type[i] == NC_CHAR) {
+                err = nc_get_var1_text(ncid, i, index, &text);
+                IF (err != NC_NOERR)
+                    error("get_var1_text_all failed: %s", nc_strerror(err));
+                value = text;
+            } else {
+                err = nc_get_var1_double(ncid, i, index, &value);
+                IF (err != NC_NOERR)
+                    error("get_var1_double_all failed: %s", nc_strerror(err));
+            }
+            IF (value != fill)
+                error(" %s Value expected: %g, read: %g\n", var_name[i],fill, value);
+            ELSE_NOK
         }
     }
-    print_nok(nok);
-
     err = nc_close(ncid);
-    IF (err)
-        error("nc_close: %s", nc_strerror(err));
-    err = remove(scratch);
-    IF (err)
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
         error("remove of %s failed", scratch);
+
+    return nok;
 }
 
+
 /* This function gets the version of a netCDF file, 1 is for netCDF
    classic, 2 for 64-bit offset format, (someday) 3 for HDF5 format,
    5 for 64-bit data format (CDF-5).
@@ -1983,7 +2239,8 @@ static
 int
 nc_get_file_version(char *path, int *version)
 {
-   FILE *fp;
+   int fd;
+   ssize_t read_len;
    char magic[MAGIC_NUM_LEN];
 
    /* Need two valid pointers - check for NULL. */
@@ -1991,23 +2248,30 @@ nc_get_file_version(char *path, int *version)
       return NC_EINVAL;
 
    /* Figure out if this is a netcdf or hdf5 file. */
-   if (!(fp = fopen(path, "r")) ||
-       fread(magic, MAGIC_NUM_LEN, 1, fp) != 1) {
-     fclose(fp);
-     return errno;
+   fd = open(path, O_RDONLY, 0600);
+   if (fd == -1) return errno;
+
+   read_len = read(fd, magic, MAGIC_NUM_LEN);
+   if (-1 == close(fd)) return errno;
+
+   if (read_len == -1)
+       return errno;
+
+   if (read_len != MAGIC_NUM_LEN) {
+       printf("Error: reading NC magic string unexpected short read\n");
+       return 0;
    }
-   fclose(fp);
-   if (strncmp(magic, "CDF", MAGIC_NUM_LEN-1)==0)
-   {
+
+   if (strncmp(magic, "CDF", MAGIC_NUM_LEN-1)==0) {
       if (magic[MAGIC_NUM_LEN-1] == NC_FORMAT_CLASSIC ||
-	  magic[MAGIC_NUM_LEN-1] == NC_FORMAT_64BIT_OFFSET ||
-	  magic[MAGIC_NUM_LEN-1] == NC_FORMAT_CDF5)
-	 *version = magic[MAGIC_NUM_LEN-1];
+          magic[MAGIC_NUM_LEN-1] == NC_FORMAT_64BIT_OFFSET ||
+          magic[MAGIC_NUM_LEN-1] == NC_FORMAT_CDF5)
+         *version = magic[MAGIC_NUM_LEN-1];
       else
-	 return NC_ENOTNC;
+        return NC_ENOTNC;
    }
    /*   tomorrow, tomorrow, I love you tomorrow, you're always a day
-	away! */
+       away! */
    /*if (magic[1] == 'H' && magic[2] == 'D' && magic[3] == 'F')
       *version = 3;*/
    return NC_NOERR;
@@ -2022,55 +2286,91 @@ nc_get_file_version(char *path, int *version)
  *    (note that it is not possible to test NC_NOFILL mode!)
  *    close file & create again for test using attribute _FillValue
  */
-void
+int
 test_nc_set_default_format(void)
 {
-    int ncid;
+    int ncid, nok=0;
     int err;
     int i;
-    int version;
+    int version=1;
     int old_format;
 
     /* bad format */
     err = nc_set_default_format(BAD_DEFAULT_FORMAT, &old_format);
     IF (err != NC_EINVAL)
-	error("bad default format: status = %d", err);
+        error("expecting NC_EINVAL but got %s", nc_err_code_name(err));
+    ELSE_NOK
 
     /* NULL old_formatp */
     err = nc_set_default_format(NC_FORMAT_64BIT_OFFSET, NULL);
-    IF (err)
-	error("null old_fortmatp: status = %d", err);
+    IF (err != NC_NOERR)
+       error("null old_fortmatp: status = %d", err);
+    ELSE_NOK
 
     /* Cycle through available formats. */
     for(i=NC_FORMAT_CLASSIC; i<NC_FORMAT_64BIT_DATA; i++)
     {
        if (i == NC_FORMAT_NETCDF4 || i == NC_FORMAT_NETCDF4_CLASSIC)
-	  continue; /* test classic formats only */
+           continue; /* test classic formats only */
        if ((err = nc_set_default_format(i, NULL)))
-	  error("setting classic format: status = %d", err);
-       if ((file_create(scratch, NC_CLOBBER, &ncid)))
-	  error("bad nc_create: status = %d", err);
-       if ((err=nc_put_att_text(ncid, NC_GLOBAL, "testatt",
-				sizeof("blah"), "blah")))
-	  error("bad put_att: status = %d", err);
-       if ((err=nc_close(ncid)))
-	  error("bad close: status = %d", err);
-       if ((err = nc_get_file_version(scratch, &version)))
-	  error("bad file version = %d", version);
+           error("setting classic format: status = %d", err);
+       ELSE_NOK
+       err = file_create(scratch, NC_CLOBBER, &ncid);
+       if (err != NC_NOERR)
+           error("bad nc_create: status = %d", err);
+       err = nc_put_att_text(ncid, NC_GLOBAL, "testatt", sizeof("blah"), "blah");
+       if (err != NC_NOERR)
+           error("bad put_att: status = %d", err);
+       err = nc_close(ncid);
+       if (err != NC_NOERR)
+           error("bad close: status = %d", err);
+       err = nc_get_file_version(scratch, &version);
+       if (err != NC_NOERR)
+           error("bad file version = %d", err);
        if (version != i) {
 #if 0
           if (i == 4) {
               if (version == 3) continue;
-	      printf("expect version 3 but got %d (file=%s)",version,scratch);
+              printf("expect version 3 but got %d (file=%s)",version,scratch);
               continue;
           }
 #endif
-	  printf("expect version %d but got %d (file=%s)",i,version,scratch);
-	  error("bad file version = %d", version);
-	}
+          printf("expect version %d but got %d (file=%s)",i,version,scratch);
+          error("bad file version = %d", version);
+        }
     }
 
     /* Remove the left-over file. */
-    if (remove(scratch))
-       error("remove of %s failed", scratch);
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+
+    return nok;
+}
+
+
+
+
+/*
+ * Test nc_delete()
+ *         create netcdf file 'scratch.nc' with no data, close it
+ *         delete the file
+ */
+int
+test_nc_delete(void)
+{
+    int err, nok=0;;
+    int ncid;
+
+    err = file_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR)
+        error("error creating scratch file %s, status = %d\n", scratch,err);
+    err = nc_close(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    ELSE_NOK
+    return nok;
 }
diff --git a/nc_test/test_write.m4 b/nc_test/test_write.m4
new file mode 100644
index 0000000..f43294f
--- /dev/null
+++ b/nc_test/test_write.m4
@@ -0,0 +1,2517 @@
+dnl This is m4 source.
+dnl Process using m4 to produce 'C' language file.
+dnl
+dnl This file is supposed to be the same as PnetCDF's test_write.m4
+dnl
+dnl If you see this line, you can ignore the next one.
+/* Do not edit this file. It is produced from the corresponding .m4 source */
+dnl
+/*
+ *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
+ *  See COPYRIGHT notice in top-level directory.
+ */
+/* $Id: test_write.m4 2687 2016-12-08 18:32:13Z wkliao $ */
+
+dnl
+dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
+dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types
+dnl (MPI_Offset vs. size_t), and function name substrings for external data
+dnl types.
+dnl
+
+#if defined (_WIN32) || defined (_WIN64)
+#include <io.h>
+#endif
+
+#include <sys/types.h>  /* open() */
+#include <sys/stat.h>   /* open() */
+#include <fcntl.h>      /* open() */
+#ifdef _MSC_VER
+#include <io.h>
+#else
+#include <unistd.h>     /* read() */
+#endif
+
+#include "tests.h"
+#include "math.h"
+
+define(`EXPECT_ERR',`error("expecting $1 but got %s",nc_err_code_name($2));')dnl
+
+define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl
+define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl
+define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_$1',`test_nc_$1')')dnl
+define(`APIFunc', `ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl
+
+define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, $3)', `file_open($1, $2, $3)')')dnl
+define(`FileCreate',`ifdef(`PNETCDF',`ncmpi_create(comm, $1, $2, info, $3)', `file_create($1, $2, $3)')')dnl
+define(`FileDelete',`ifdef(`PNETCDF',`ncmpi_delete($1,$2)',`nc_delete($1)')')dnl
+
+define(`Def_Vars',  `ifdef(`PNETCDF',`def_vars($1,$2)',`def_vars($1)')')dnl
+define(`Put_Atts',  `ifdef(`PNETCDF',`put_atts($1,$2,$3)',`put_atts($1)')')dnl
+define(`Put_Vars',  `ifdef(`PNETCDF',`put_vars($1,$2)',`put_vars($1)')')dnl
+define(`Check_File',`ifdef(`PNETCDF',`check_file($1,$2,$3)',`check_file($1)')')dnl
+define(`Check_Atts',`ifdef(`PNETCDF',`check_atts($1,$2,$3)',`check_atts($1)')')dnl
+define(`Check_Vars',`ifdef(`PNETCDF',`check_vars($1,$2)',`check_vars($1)')')dnl
+define(`VarArgs',   `ifdef(`PNETCDF',`int numVars',`void')')dnl
+define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts, int numVars',`void')')dnl
+
+define(`GetVar1TYPE',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl
+define(`PutVar1TYPE',`ifdef(`PNETCDF',`ncmpi_put_var1_$1_all',`nc_put_var1_$1')')dnl
+
+define(`PutVar1', `ifdef(`PNETCDF',`ncmpi_put_var1_all($1,$2,$3,$4,$5,$6)',          `nc_put_var1($1,$2,$3,$4)')')dnl
+define(`PutVar',  `ifdef(`PNETCDF',`ncmpi_put_var_all( $1,$2,$3,$4,$5)',             `nc_put_var( $1,$2,$3)')')dnl
+define(`PutVara', `ifdef(`PNETCDF',`ncmpi_put_vara_all($1,$2,$3,$4,$5,$6,$7)',       `nc_put_vara($1,$2,$3,$4,$5)')')dnl
+define(`PutVars', `ifdef(`PNETCDF',`ncmpi_put_vars_all($1,$2,$3,$4,$5,$6,$7,$8)',    `nc_put_vars($1,$2,$3,$4,$5,$6)')')dnl
+define(`PutVarm', `ifdef(`PNETCDF',`ncmpi_put_varm_all($1,$2,$3,$4,$5,$6,$7,$8,$9)', `nc_put_varm($1,$2,$3,$4,$5,$6,$7)')')dnl
+
+
+/*
+ * Test APIFunc(create)
+ *    For mode in NC_NOCLOBBER, NC_CLOBBER do:
+ *       create netcdf file 'scratch.nc' with no data, close it
+ *       test that it can be opened, do APIFunc(inq) to check nvars = 0, etc.
+ *    Try again in NC_NOCLOBBER mode, check error return
+ * On exit, delete this file
+ */
+int
+TestFunc(create)(void)
+{
+    int clobber; /* 0 for NC_NOCLOBBER, 1 for NC_CLOBBER */
+    int err;
+    int ncid;
+    int ndims;   /* number of dimensions */
+    int nvars;   /* number of variables */
+    int ngatts;  /* number of global attributes */
+    int recdim;  /* id of unlimited dimension */
+    int nok=0;
+
+    for (clobber = 0; clobber < 2; clobber++) {
+        err = FileCreate(scratch, clobber ? NC_CLOBBER : NC_NOCLOBBER, &ncid);
+        IF (err != NC_NOERR)
+            error("create: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        err = APIFunc(close)(ncid);
+        IF (err != NC_NOERR)
+            error("close: %s", APIFunc(strerror)(err));
+        err = FileOpen(scratch, NC_NOWRITE, &ncid);
+        IF (err != NC_NOERR)
+            error("open: %s", APIFunc(strerror)(err));
+        err = APIFunc(inq)(ncid, &ndims, &nvars, &ngatts, &recdim);
+        IF (err != NC_NOERR)
+            error("inq: %s", APIFunc(strerror)(err));
+        else IF (ndims != 0)
+            error("inq: wrong number of dimensions returned, %d", ndims);
+        else IF (nvars != 0)
+            error("inq: wrong number of variables returned, %d", nvars);
+        else IF (ngatts != 0)
+            error("inq: wrong number of global atts returned, %d", ngatts);
+        else IF (recdim != -1)
+            error("inq: wrong record dimension ID returned, %d", recdim);
+        ELSE_NOK
+        err = APIFunc(close)(ncid);
+        IF (err != NC_NOERR)
+            error("close: %s", APIFunc(strerror)(err));
+    }
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_EEXIST)
+        error("expecting NC_EEXIST but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(redef)
+ * (In fact also tests APIFunc(enddef) - called from TestFunc(enddef))
+ *    BAD_ID
+ *    attempt redef (error) & enddef on read-only file
+ *    create file, define dims & vars.
+ *    attempt put var (error)
+ *    attempt redef (error) & enddef.
+ *    put vars
+ *    attempt def new dims (error)
+ *    redef
+ *    def new dims, vars.
+ *    put atts
+ *    enddef
+ *    put vars
+ *    close
+ *    check file: vars & atts
+ *    check reopening with NC_WRITE and adding new dims, atts, vars
+ */
+int
+TestFunc(redef)(AttVarArgs)
+{
+    int ncid;          /* netcdf id */
+    /* used to force effective test of ncio->move() in redef */
+    IntType sizehint = 8192;
+    int dimid;         /* dimension id */
+    int varid;         /* variable id */
+    int varid1;        /* variable id */
+    int nok=0, err;
+    const char * title = "Not funny";
+    double var;
+    char name[NC_MAX_NAME];
+    IntType length;
+    int fmt_variant1, fmt_variant2;
+
+    /* BAD_ID tests */
+    err = APIFunc(redef)(BAD_ID);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(enddef)(BAD_ID);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* read-only tests */
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(redef)(ncid);
+    IF (err != NC_EPERM)
+        error("expecting NC_EPERM but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_ENOTINDEFINE)
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* tests using scratch file */
+ifdef(`PNETCDF',`dnl
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);',`dnl
+    err = file__create(scratch, NC_NOCLOBBER, 0, &sizehint, &ncid);')
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+ifdef(`PNETCDF',,`dnl
+    /* limit for ncio implementations which have infinite chunksize */
+    if(sizehint > 32768) sizehint = 16384;')
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+    Put_Atts(ncid, numGatts, numVars);
+    err = APIFunc(inq_varid)(ncid, "d", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s", APIFunc(strerror)(err));
+    var = 1.0;
+
+ifdef(`PNETCDF', `
+    err = ncmpi_begin_indep_data(ncid);
+    IF (err != NC_EINDEFINE)
+        error("expecting NC_EINDEFINE but got %s", nc_err_code_name(err));')dnl
+
+    err = PutVar1TYPE(double)(ncid, varid, NULL, &var);
+    IF (err != NC_EINDEFINE)
+        error("expecting NC_EINDEFINE but got %s", nc_err_code_name(err));
+
+ifdef(`PNETCDF', `
+    err = ncmpi_end_indep_data(ncid);
+    IF (err != NC_ENOTINDEP)
+        error("expecting NC_ENOTINDEP but got %s", nc_err_code_name(err));')dnl
+
+    err = APIFunc(redef)(ncid);
+    IF (err != NC_EINDEFINE)
+        error("expecting NC_EINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    Put_Vars(ncid, numVars);
+    err = APIFunc(def_dim)(ncid, "abc", sizehint, &dimid);
+    IF (err != NC_ENOTINDEFINE)
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+    err = APIFunc(redef)(ncid);
+    IF (err != NC_NOERR)
+        error("redef: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+
+    err = APIFunc(set_fill)(ncid, NC_NOFILL, NULL);
+    IF (err != NC_NOERR)
+        error("set_fill: %s", APIFunc(strerror)(err));
+
+    err = APIFunc(def_dim)(ncid, "abc", sizehint, &dimid);
+    IF (err != NC_NOERR)
+        error("def_dim: %s", APIFunc(strerror)(err));
+    err = APIFunc(def_var)(ncid, "abcScalar", NC_INT, 0, NULL, &varid);
+    IF (err != NC_NOERR)
+        error("def_var: %s", APIFunc(strerror)(err));
+    err = APIFunc(def_var)(ncid, "abc", NC_INT, 1, &dimid, &varid1);
+    IF (err != NC_NOERR)
+        error("def_var: %s", APIFunc(strerror)(err));
+    {
+        int dimids[NDIMS +1];
+        int ii = 0;
+        for(ii = 0; ii < NDIMS; ii++) dimids[ii] = ii;
+        dimids[NDIMS] = dimid;
+        err = APIFunc(def_var)(ncid, "abcRec", NC_INT, NDIMS, dimids, &varid1);
+        IF (err != NC_NOERR)
+            error("def_var: %s", APIFunc(strerror)(err));
+    }
+    err = APIFunc(put_att_text)(ncid, NC_GLOBAL, "title", 1+strlen(title), title);
+    IF (err != NC_NOERR)
+        error("put_att_text: %s", APIFunc(strerror)(err));
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    var = 1.0;
+
+ifdef(`PNETCDF', `
+    err = ncmpi_end_indep_data(ncid);
+    IF (err != NC_ENOTINDEP)
+        error("expecting NC_ENOTINDEP but got %s", nc_err_code_name(err));')dnl
+
+    err = PutVar1TYPE(double)(ncid, varid, NULL, &var);
+    IF (err != NC_NOERR)
+        error("put_var1_double: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_format)(ncid, &fmt_variant1);
+    IF (err)
+        error("inq_format: %s", APIFunc(strerror)(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* check scratch file written as expected */
+    Check_File(scratch, numGatts, numVars); /* checks all except "abc" stuff added above */
+
+    IF ((err = FileOpen(scratch, NC_NOWRITE, &ncid)))
+        error("open: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(inq_dim)(ncid, dimid, name, &length)))
+        error("inq_dim: %s", APIFunc(strerror)(err));
+    IF (strcmp(name, "abc") != 0)
+        error("Unexpected dim name");
+    IF (length != sizehint)
+        error("Unexpected dim length");
+    IF ((err = GetVar1TYPE(double)(ncid, varid, NULL, &var)))
+        error("get_var1_double: %s", APIFunc(strerror)(err));
+    IF (var != 1.0)
+        error("get_var1_double: unexpected value");
+    IF ((err = APIFunc(close)(ncid)))
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* open scratch file for writing, add another dim, var, att, then check */
+    IF ((err = FileOpen(scratch, NC_WRITE, &ncid)))
+        error("open: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(redef)(ncid)))
+        error("redef: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(def_dim)(ncid, "def", sizehint, &dimid)))
+        error("def_dim: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(def_var)(ncid, "defScalar", NC_INT, 0, NULL, &varid)))
+        error("def_var: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(def_var)(ncid, "def", NC_INT, 1, &dimid, &varid1)))
+        error("def_var: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(put_att_text)(ncid, NC_GLOBAL, "Credits", 1+strlen("Thanks!"), "Thanks!")))
+        error("put_att_text: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(enddef)(ncid)))
+        error("enddef: %s", APIFunc(strerror)(err));
+    var = 2.0;
+    IF ((err = PutVar1TYPE(double)(ncid, varid, NULL, &var)))
+        error("put_var1_double: %s", APIFunc(strerror)(err));
+    IF ((err = APIFunc(close)(ncid)))
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* check scratch file written as expected */
+    Check_File(scratch, numGatts, numVars);
+
+    err = FileOpen(scratch, NC_NOWRITE, &ncid);
+    IF (err)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_dim)(ncid, dimid, name, &length);
+    IF (err)
+        error("inq_dim: %s", APIFunc(strerror)(err));
+    IF (strcmp(name, "def") != 0)
+        error("Unexpected dim name");
+    IF (length != sizehint)
+        error("Unexpected dim length");
+    err = GetVar1TYPE(double)(ncid, varid, NULL, &var);
+    IF (err)
+        error("get_var1_double: %s", APIFunc(strerror)(err));
+    IF (var != 2.0)
+        error("get_var1_double: unexpected value");
+    /* make sure format variant hasn't changed from when created */
+    err = APIFunc(inq_format)(ncid, &fmt_variant2);
+    IF (err)
+        error("inq_format: %s", APIFunc(strerror)(err));
+    IF (fmt_variant1 != fmt_variant2)
+        error("enddef changed format variant");
+    err = APIFunc(close)(ncid);
+    IF (err)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(enddef)
+ * Simply calls TestFunc(redef) which tests both APIFunc(redef) & APIFunc(enddef)
+ */
+int
+TestFunc(enddef)(AttVarArgs)
+{
+    ifdef(`PNETCDF',
+    `return test_ncmpi_redef(numGatts, numVars);',
+    `return test_nc_redef();')
+}
+
+
+/*
+ * Test APIFunc(sync)
+ *    try with bad handle, check error
+ *    try in define mode, check error
+ *    try writing with one handle, reading with another on same netCDF
+ */
+int
+TestFunc(sync)(AttVarArgs)
+{
+    int ncidw;         /* netcdf id for writing */
+    int ncidr;         /* netcdf id for reading */
+    int nok=0, err;
+
+    /* BAD_ID test */
+    err = APIFunc(sync)(BAD_ID);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* create scratch file & try APIFunc(sync) in define mode */
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncidw);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    err = APIFunc(sync)(ncidw);
+    IF (err != NC_EINDEFINE)
+        error("expecting NC_EINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* write using same handle */
+    def_dims(ncidw);
+    Def_Vars(ncidw, numVars);
+    Put_Atts(ncidw, numGatts, numVars);
+    err = APIFunc(enddef)(ncidw);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    Put_Vars(ncidw, numVars);
+    err = APIFunc(sync)(ncidw);
+    IF (err != NC_NOERR)
+        error("sync of ncidw failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+
+    /* open another handle, APIFunc(sync), read (check) */
+    err = FileOpen(scratch, NC_NOWRITE, &ncidr);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(sync)(ncidr);
+    IF (err != NC_NOERR)
+        error("sync of ncidr failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    check_dims(ncidr);
+    Check_Atts(ncidr, numGatts, numVars);
+    Check_Vars(ncidr, numVars);
+
+    /* close both handles */
+    err = APIFunc(close)(ncidr);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = APIFunc(close)(ncidw);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(abort)
+ *    try with bad handle, check error
+ *    try in define mode before anything written, check that file was deleted
+ *    try after APIFunc(enddef), APIFunc(redef), define new dims, vars, atts
+ *    try after writing variable
+ */
+int
+TestFunc(abort)(AttVarArgs)
+{
+    int ncid;          /* netcdf id */
+    int err;
+    int ndims;
+    int nvars;
+    int ngatts;
+    int nok=0;
+
+    /* BAD_ID test */
+    err = APIFunc(abort)(BAD_ID);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* create scratch file & try APIFunc(abort) in define mode */
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+    Put_Atts(ncid, numGatts, numVars);
+    err = APIFunc(abort)(ncid);
+    IF (err != NC_NOERR)
+        error("abort of ncid failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    err = APIFunc(close)(ncid);        /* should already be closed */
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    err = FileDelete(scratch, info);        /* should already be deleted */
+ifdef(`PNETCDF',
+    `IF (err != NC_ENOENT && err != NC_EFILE)
+        error("expecting NC_ENOENT or NC_EFILE but got %s", nc_err_code_name(err));',
+    `IF (err != ENOENT && err != NC_EIO)
+        error("expecting ENOENT or NC_EIO but got %s", nc_err_code_name(err));')dnl
+
+    /*
+     * create scratch file
+     * do APIFunc(enddef) & APIFunc(redef)
+     * define new dims, vars, atts
+     * try APIFunc(abort): should restore previous state (no dims, vars, atts)
+     */
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    err = APIFunc(redef)(ncid);
+    IF (err != NC_NOERR)
+        error("redef: %s", APIFunc(strerror)(err));
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+    Put_Atts(ncid, numGatts, numVars);
+    err = APIFunc(abort)(ncid);
+    IF (err != NC_NOERR)
+        error("abort of ncid failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    err = APIFunc(close)(ncid);        /* should already be closed */
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    err = FileOpen(scratch, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq)(ncid, &ndims, &nvars, &ngatts, NULL);
+    IF (err != NC_NOERR)
+        error("inq: %s", APIFunc(strerror)(err));
+    IF (ndims != 0)
+        error("ndims should be 0");
+    IF (nvars != 0)
+        error("nvars should be 0");
+    IF (ngatts != 0)
+        error("ngatts should be 0");
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* try APIFunc(abort) in data mode - should just close */
+    err = FileCreate(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+    Put_Atts(ncid, numGatts, numVars);
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    Put_Vars(ncid, numVars);
+    err = APIFunc(abort)(ncid);
+    IF (err != NC_NOERR)
+        error("abort of ncid failed: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    err = APIFunc(close)(ncid);       /* should already be closed */
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    Check_File(scratch, numGatts, numVars);
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(def_dim)
+ *    try with bad netCDF handle, check error
+ *    try in data mode, check error
+ *    check that returned id is one more than previous id
+ *    try adding same dimension twice, check error
+ *    try with illegal sizes, check error
+ *    make sure unlimited size works, shows up in APIFunc(inq_unlimdim)
+ *    try to define a second unlimited dimension, check error
+ */
+int
+TestFunc(def_dim)(VarArgs)
+{
+    int ncid;
+    int  err;           /* status */
+    int  i, nok=0;
+    int  dimid;         /* dimension id */
+    IntType length;
+
+    /* BAD_ID test */
+    err = APIFunc(def_dim)(BAD_ID, "abc", 8, &dimid);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* data mode test */
+    err = FileCreate(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    err = APIFunc(def_dim)(ncid, "abc", 8, &dimid);
+    IF (err != NC_ENOTINDEFINE)
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* define-mode tests: unlimited dim */
+    err = APIFunc(redef)(ncid);
+    IF (err != NC_NOERR)
+        error("redef: %s", APIFunc(strerror)(err));
+    err = APIFunc(def_dim)(ncid, dim_name[0], NC_UNLIMITED, &dimid);
+    IF (err != NC_NOERR)
+        error("def_dim: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    IF (dimid != 0)
+        error("Unexpected dimid");
+    ELSE_NOK
+    err = APIFunc(inq_unlimdim)(ncid, &dimid);
+    IF (err != NC_NOERR)
+        error("inq_unlimdim: %s", APIFunc(strerror)(err));
+    IF (dimid != 0)
+        error("Unexpected recdim");
+    err = APIFunc(inq_dimlen)(ncid, dimid, &length);
+    IF (length != 0)
+        error("Unexpected length");
+    err = APIFunc(def_dim)(ncid, "abc", NC_UNLIMITED, &dimid);
+    IF (err != NC_EUNLIMIT)
+        error("expecting NC_EUNLIMIT but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* define-mode tests: remaining dims */
+    for (i = 1; i < NDIMS; i++) {
+        err = APIFunc(def_dim)(ncid, dim_name[i-1], dim_len[i], &dimid);
+        IF (err != NC_ENAMEINUSE)
+            error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(def_dim)(ncid, BAD_NAME, dim_len[i], &dimid);
+        IF (err != NC_EBADNAME)
+            error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
+        ELSE_NOK
+ifdef(`PNETCDF', ,`if(sizeof(long) > 4) /* Fix: dmh 11/4/2011: works only if sizeof(long) > 4 */')
+        {
+            err = APIFunc(def_dim)(ncid, dim_name[i], (IntType)(NC_UNLIMITED-1), &dimid);
+            IF (err != NC_EDIMSIZE)
+                error("expecting NC_EDIMSIZE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+        }
+        err = APIFunc(def_dim)(ncid, dim_name[i], dim_len[i], &dimid);
+        IF (err != NC_NOERR)
+            error("def_dim: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        IF (dimid != i)
+            error("Unexpected dimid");
+    }
+
+    /* Following just to expand unlimited dim */
+    Def_Vars(ncid, numVars);
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    Put_Vars(ncid, numVars);
+
+    /* Check all dims */
+    check_dims(ncid);
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(rename_dim)
+ *    try with bad netCDF handle, check error
+ *    check that proper rename worked with APIFunc(inq_dim)
+ *    try renaming to existing dimension name, check error
+ *    try with bad dimension handle, check error
+ */
+int
+TestFunc(rename_dim)(void)
+{
+    int ncid;
+    int  err, nok=0;             /* status */
+    char name[NC_MAX_NAME];
+
+    /* BAD_ID test */
+    err = APIFunc(rename_dim)(BAD_ID, 0, "abc");
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* main tests */
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    def_dims(ncid);
+    err = APIFunc(rename_dim)(ncid, BAD_DIMID, "abc");
+    IF (err != NC_EBADDIM)
+        error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(rename_dim)(ncid, 2, "abc");
+    IF (err != NC_NOERR)
+        error("rename_dim: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    err = APIFunc(inq_dimname)(ncid, 2, name);
+    IF (strcmp(name, "abc") != 0)
+        error("Unexpected name: %s", name);
+    err = APIFunc(rename_dim)(ncid, 0, "abc");
+    IF (err != NC_ENAMEINUSE)
+        error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(def_var)
+ *    try with bad netCDF handle, check error
+ *    try with bad name, check error
+ *    scalar tests:
+ *      check that proper define worked with APIFunc(inq_var)
+ *      try redefining an existing variable, check error
+ *      try with bad datatype, check error
+ *      try with bad number of dimensions, check error
+ *      try in data mode, check error
+ *    check that returned id is one more than previous id
+ *    try with bad dimension ids, check error
+ */
+int
+TestFunc(def_var)(VarArgs)
+{
+    int  ncid;
+    int  varid;
+    int  err, nok=0;             /* status */
+    int  i;
+    int  ndims;
+    int  natts;
+    char name[NC_MAX_NAME];
+    int dimids[MAX_RANK];
+    nc_type datatype;
+
+    /* BAD_ID test */
+    err = APIFunc(def_var)(BAD_ID, "abc", NC_SHORT, 0, NULL, &varid);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* scalar tests */
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    err = APIFunc(def_var)(ncid, "abc", NC_SHORT, 0, NULL, &varid);
+    IF (err != NC_NOERR)
+        error("def_var: %s", APIFunc(strerror)(err));
+    ELSE_NOK
+    err = APIFunc(inq_var)(ncid, varid, name, &datatype, &ndims, dimids, &natts);
+    IF (err != NC_NOERR)
+        error("inq_var: %s", APIFunc(strerror)(err));
+    IF (strcmp(name, "abc") != 0)
+        error("Unexpected name: %s", name);
+    IF (datatype != NC_SHORT)
+        error("Unexpected datatype");
+    IF (ndims != 0)
+        error("Unexpected rank");
+    err = APIFunc(def_var)(ncid, BAD_NAME, NC_SHORT, 0, NULL, &varid);
+    IF (err != NC_EBADNAME)
+        error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(def_var)(ncid, "abc", NC_SHORT, 0, NULL, &varid);
+    IF (err != NC_ENAMEINUSE)
+        error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(def_var)(ncid, "ABC", BAD_TYPE, -1, dimids, &varid);
+    IF (err != NC_EBADTYPE)
+        error("expecting NC_EBADTYPE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(def_var)(ncid, "ABC", NC_SHORT, -1, dimids, &varid);
+    IF (err != NC_EINVAL)
+        error("expecting NC_EINVAL but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    err = APIFunc(def_var)(ncid, "ABC", NC_SHORT, 0, dimids, &varid);
+    IF (err != NC_ENOTINDEFINE)
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+
+    /* general tests using global vars */
+    err = FileCreate(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    def_dims(ncid);
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(def_var)(ncid, var_name[i], var_type[i], var_rank[i],
+            var_dimid[i], &varid);
+        IF (err != NC_NOERR)
+            error("def_var: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        IF (varid != i)
+            error("Unexpected varid");
+        ELSE_NOK
+    }
+
+    /* try bad dim ids */
+    dimids[0] = BAD_DIMID;
+    err = APIFunc(def_var)(ncid, "abc", NC_SHORT, 1, dimids, &varid);
+    IF (err != NC_EBADDIM)
+        error("expecting NC_EBADDIM but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test PutVar1
+ */
+int
+TestFunc(put_var1)(VarArgs)
+{
+    int i, err, ncid, nok=0;
+    IntType j, index[MAX_RANK];
+    double value[1];
+    double buf[1];                /* (void *) buffer */
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVar1(BAD_ID, 0, NULL, NULL, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVar1(ncid, BAD_VARID, NULL, NULL, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        value[0] = 5;  /* reset to a value within bounds */
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVar1(ncid, i, NULL, value, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* test NC_EINVALCOORDS */
+        for (j = 0; j < var_rank[i]; j++) index[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            index[j] = var_shape[i][j]; /* out of boundary check */
+            err = PutVar1(ncid, i, index, value, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            index[j] = 0;
+        }
+
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value[0] = hash(var_type[i], var_rank[i], index);
+            if (inRange(value[0], var_type[i])) {
+                err = dbl2nc(value[0], var_type[i], buf);
+                IF (err != NC_NOERR)
+                    error("error in dbl2nc var:%s type:%s",
+                          var_name[i],s_nc_type(var_type[i]));
+                err = PutVar1(ncid, i, index, buf, 1, datatype);
+                IF (err != NC_NOERR)
+                    EXPECT_ERR(NC_NOERR, err)
+                ELSE_NOK
+            }
+        }
+    }
+
+    Check_Vars(ncid, numVars);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test PutVara
+ * Choose a random point dividing each dim into 2 parts
+ * Put 2^rank (nslabs) slabs so defined
+ * Redefine buffer for each put.
+ * At end check all variables using Check_Vars
+ */
+int
+TestFunc(put_vara)(VarArgs)
+{
+    int d, i, k, err, nslabs, ncid, nok=0;
+    IntType j, nels;
+    IntType start[MAX_RANK];
+    IntType edge[MAX_RANK];
+    IntType index[MAX_RANK];
+    IntType mid[MAX_RANK];
+    double buf[MAX_NELS];         /* (void *) buffer */
+    char *p;                      /* (void *) pointer */
+    double value;
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVara(BAD_ID, 0, start, edge, buf, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVara(ncid, BAD_VARID, start, edge, buf, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        buf[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVara(BAD_ID, i, start, edge, buf, 1, MPI_DATATYPE_NULL);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+        }
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVara(ncid, i, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = PutVara(ncid, i, start, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) {
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVara(ncid, i, start, edge, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;
+            err = PutVara(ncid, i, start, edge, buf, 1, datatype);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDG, err)
+            ELSE_NOK
+            edge[j] = 1;
+        }
+        /* Check correct error returned when nothing to put, when edge[*]==0 */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVara(ncid, i, start, edge, buf, 0, datatype);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = PutVara(ncid, i, start, edge, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        for (k = 0; k < nslabs; k++) {
+            nels = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                }else{
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                nels *= edge[j];
+            }
+            p = (char *) buf;
+            for (j = 0; j < nels; j++) {
+                err = toMixedBase(j, var_rank[i], edge, index);
+                IF (err != 0) error("error in toMixedBase");
+                for (d = 0; d < var_rank[i]; d++)
+                    index[d] += start[d];
+                value = hash(var_type[i], var_rank[i], index);
+                if (!inRange(value, var_type[i]))
+                    value = 0;
+                err = dbl2nc(value, var_type[i], p);
+                IF (err != NC_NOERR)
+                    error("error in dbl2nc");
+                p += nctypelen(var_type[i]);
+            }
+            err = PutVara(ncid, i, start, edge, buf, nels, datatype);
+            IF (err != NC_NOERR)
+                error("%s", APIFunc(strerror)(err));
+            ELSE_NOK
+        }
+    }
+
+    Check_Vars(ncid, numVars);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test PutVars
+ * Choose a random point dividing each dim into 2 parts
+ * Put 2^rank (nslabs) slabs so defined
+ * Choose random stride from 1 to edge
+ * Redefine buffer for each put.
+ * At end check all variables using Check_Vars
+ */
+int
+TestFunc(put_vars)(VarArgs)
+{
+    int ncid, d, i, k, err, nslabs, nok=0;
+    PTRDType nstarts;        /* number of different starts */
+    IntType j, m, nels;
+    IntType start[MAX_RANK];
+    IntType edge[MAX_RANK];
+    IntType index[MAX_RANK];
+    IntType index2[MAX_RANK];
+    IntType mid[MAX_RANK];
+    IntType count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType stride[MAX_RANK];
+    double buf[MAX_NELS]; /* (void *) buffer */
+    char *p;              /* (void *) pointer */
+    double value;
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVars(BAD_ID, 0, NULL, NULL, NULL, NULL, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVars(ncid, BAD_VARID, NULL, NULL, NULL, NULL, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        buf[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVars(BAD_ID, i, NULL, NULL, NULL, buf, 1, MPI_DATATYPE_NULL);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+        }
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVars(ncid, i, NULL, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = PutVars(ncid, i, start, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) {
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;  /* edge error check */
+            err = PutVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDG, err)
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;  /* strided edge error check */
+            err = PutVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVars(ncid, i, start, edge, stride, buf, 0, datatype);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = PutVars(ncid, i, start, edge, stride, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                }else{
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                err = toMixedBase(m, var_rank[i], sstride, index);
+                IF (err != 0) error("error in toMixedBase");
+                nels = 1;
+                for (j = 0; j < var_rank[i]; j++) {
+                    count[j] = 1 + (edge[j] - index[j] - 1) / (IntType)stride[j];
+                    nels *= count[j];
+                    index[j] += start[j];
+                }
+                /* Random choice of forward or backward */
+/* TODO
+                if ( roll(2) ) {
+                    for (j = 0; j < var_rank[i]; j++) {
+                        index[j] += (count[j] - 1) * (IntType)stride[j];
+                        stride[j] = -stride[j];
+                    }
+                }
+ */
+                p = (char *) buf;
+                for (j = 0; j < nels; j++) {
+                    err = toMixedBase(j, var_rank[i], count, index2);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (d = 0; d < var_rank[i]; d++)
+                        index2[d] = index[d] + index2[d] * (IntType)stride[d];
+                    value = hash(var_type[i], var_rank[i], index2);
+                    if (!inRange(value, var_type[i]))
+                        value = 0;
+                    err = dbl2nc(value, var_type[i], p);
+                    IF (err != NC_NOERR)
+                        error("error in dbl2nc");
+                    p += nctypelen(var_type[i]);
+                }
+                err = PutVars(ncid, i, index, count, stride, buf, nels, datatype);
+                IF (err != NC_NOERR)
+                    EXPECT_ERR(NC_NOERR, err)
+                ELSE_NOK
+            }
+        }
+    }
+
+    Check_Vars(ncid, numVars);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test PutVarm
+ * Choose a random point dividing each dim into 2 parts
+ * Put 2^rank (nslabs) slabs so defined
+ * Choose random stride from 1 to edge
+ * Buffer is bit image of whole external variable.
+ * So all puts for a variable put different elements of buffer
+ * At end check all variables using Check_Vars
+ */
+int
+TestFunc(put_varm)(VarArgs)
+{
+    int ncid, nok=0;
+    int i;
+    int k;
+    int err;
+    int nslabs;
+    IntType j, m;
+    PTRDType nstarts;        /* number of different starts */
+    IntType start[MAX_RANK];
+    IntType edge[MAX_RANK];
+    IntType index[MAX_RANK];
+    IntType mid[MAX_RANK];
+    IntType count[MAX_RANK];
+    IntType sstride[MAX_RANK];
+    PTRDType stride[MAX_RANK];
+    PTRDType imap[MAX_RANK];
+    PTRDType imap2[MAX_RANK];
+    ifdef(`PNETCDF', `IntType bufcount;')
+    double buf[MAX_NELS];       /* (void *) buffer */
+    char *p;                    /* (void *) pointer */
+    double value;
+    ifdef(`PNETCDF', `MPI_Datatype datatype;')
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    /* check if can detect a bad file ID */
+    err = PutVarm(NC_EBADID, 0, NULL, NULL, NULL, NULL, NULL, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_EBADID)
+        EXPECT_ERR(NC_EBADID, err)
+    ELSE_NOK
+
+    /* check if can detect a bad variable ID */
+    err = PutVarm(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL, 1, MPI_DATATYPE_NULL);
+    IF (err != NC_ENOTVAR)
+        EXPECT_ERR(NC_ENOTVAR, err)
+    ELSE_NOK
+
+    for (i = 0; i < numVars; i++) {
+        assert(var_rank[i] <= MAX_RANK);
+        assert(var_nels[i] <= MAX_NELS);
+
+        buf[0] = 5;  /* reset to a value within bounds */
+
+        /* check if can detect a bad file ID */
+        err = PutVarm(BAD_ID, i, NULL, NULL, NULL, NULL, buf, 1, MPI_DATATYPE_NULL);
+        IF (err != NC_EBADID)
+            EXPECT_ERR(NC_EBADID, err)
+        ELSE_NOK
+
+        ifdef(`PNETCDF', `datatype = nc_mpi_type(var_type[i]);')
+
+        for (j = 0; j < var_rank[i]; j++) {
+            start[j] = 0;
+            edge[j] = 1;
+            stride[j] = 1;
+            imap[j] = 1;
+        }
+
+ifdef(`PNETCDF',`dnl
+        /* for non-scalar variables, argument start cannot be NULL */
+        err = PutVarm(ncid, i, NULL, NULL, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) { /* scalar variable */
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EINVALCOORDS) {
+            EXPECT_ERR(NC_EINVALCOORDS, err)
+        }
+        ELSE_NOK
+
+        /* for non-scalar variables, argument count cannot be NULL */
+        err = PutVarm(ncid, i, start, NULL, NULL, NULL, buf, 1, datatype);
+        if (var_rank[i] == 0) {
+            IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
+        }
+        else IF (err != NC_EEDGE) {
+            EXPECT_ERR(NC_EEDGE, err)
+        }
+        ELSE_NOK
+')dnl
+
+        /* first test when edge[*] > 0 */
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+            edge[j] = var_shape[i][j] + 1;  /* edge error check */
+            err = PutVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_EEDGE)
+                EXPECT_ERR(NC_EEDG, err)
+            ELSE_NOK
+            edge[j] = 1;
+            stride[j] = 0;  /* strided edge error check */
+            err = PutVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_ESTRIDE)
+                EXPECT_ERR(NC_ESTRIDE, err)
+            ELSE_NOK
+            stride[j] = 1;
+        }
+        /* Check correct error returned even when nothing to put */
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
+
+        for (j = 0; j < var_rank[i]; j++) {
+            if (var_dimid[i][j] == 0) continue; /* skip record dim */
+            start[j] = var_shape[i][j];
+            err = PutVarm(ncid, i, start, edge, stride, imap, buf, 0, datatype);
+#ifdef RELAX_COORD_BOUND
+            IF (err != NC_NOERR) /* allowed when edge[j]==0 */
+                EXPECT_ERR(NC_NOERR, err)
+#else
+            IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+#endif
+            ELSE_NOK
+            start[j] = var_shape[i][j]+1; /* out of boundary check */
+            err = PutVarm(ncid, i, start, edge, stride, imap, buf, 1, datatype);
+            IF (err != NC_EINVALCOORDS)
+                EXPECT_ERR(NC_EINVALCOORDS, err)
+            ELSE_NOK
+            start[j] = 0;
+        }
+        for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
+
+        if (var_rank[i] > 0) {
+            int jj = var_rank[i] - 1;
+            imap[jj] = nctypelen(var_type[i]); /*  netCDF considers imap in bytes */
+            imap[jj] = 1;                      /* PnetCDF considers imap in elements */
+            for (; jj > 0; jj--)
+                imap[jj-1] = imap[jj] * (PTRDType)var_shape[i][jj];
+        }
+        p = (char *) buf;
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            value = hash(var_type[i], var_rank[i], index);
+            if (!inRange(value, var_type[i]))
+                value = 0;
+            err = dbl2nc(value, var_type[i], p);
+            IF (err != NC_NOERR)
+                error("error in dbl2nc");
+            p += nctypelen(var_type[i]);
+        }
+
+        /* Choose a random point dividing each dim into 2 parts */
+        /* put 2^rank (nslabs) slabs so defined */
+        nslabs = 1;
+        for (j = 0; j < var_rank[i]; j++) {
+            mid[j] = roll( var_shape[i][j] );
+            nslabs *= 2;
+        }
+        /* bits of k determine whether to put lower or upper part of dim */
+        /* choose random stride from 1 to edge */
+        for (k = 0; k < nslabs; k++) {
+            nstarts = 1;
+            for (j = 0; j < var_rank[i]; j++) {
+                if ((k >> j) & 1) {
+                    start[j] = 0;
+                    edge[j] = mid[j];
+                }else{
+                    start[j] = mid[j];
+                    edge[j] = var_shape[i][j] - mid[j];
+                }
+                sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
+                stride[j] = (PTRDType)sstride[j];
+                imap2[j] = imap[j] * (PTRDType)sstride[j];
+                nstarts *= stride[j];
+            }
+            for (m = 0; m < nstarts; m++) {
+                if (var_rank[i] == 0 && i%2 == 0) {
+                    err = PutVarm(ncid, i, NULL, NULL, NULL, NULL, buf, 1, datatype);
+                } else {
+                    err = toMixedBase(m, var_rank[i], sstride, index);
+                    IF (err != 0) error("error in toMixedBase");
+                    for (j = 0; j < var_rank[i]; j++) {
+                        count[j] = 1 + (edge[j] - index[j] - 1) / (IntType)stride[j];
+                        index[j] += start[j];
+                    }
+                    /* Random choice of forward or backward */
+/* TODO
+                    if ( roll(2) ) {
+                        for (j = 0; j < var_rank[i]; j++) {
+                            index[j] += (count[j] - 1) * (IntType)stride[j];
+                            stride[j] = -stride[j];
+                        }
+                    }
+ */
+                    j = fromMixedBase(var_rank[i], index, var_shape[i]);
+                    p = (char *) buf + (int)j * nctypelen(var_type[i]);
+                    ifdef(`PNETCDF', `for (bufcount=1,j=0; j<var_rank[i]; j++) bufcount *= count[j];')
+                    err = PutVarm(ncid, i, index, count, stride, imap2, p, bufcount, datatype);
+                }
+                IF (err != NC_NOERR)
+                    EXPECT_ERR(NC_NOERR, err)
+                ELSE_NOK
+            }
+        }
+    }
+
+    Check_Vars(ncid, numVars);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(rename_var)
+ *    try with bad netCDF handle, check error
+ *    try with bad variable handle, check error
+ *    try renaming to existing variable name, check error
+ *    check that proper rename worked with APIFunc(inq_varid)
+ *    try in data mode, check error
+ */
+int
+TestFunc(rename_var)(VarArgs)
+{
+    int ncid;
+    int varid;
+    int err, nok=0;
+    int i;
+    char name[NC_MAX_NAME];
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    err = APIFunc(rename_var)(ncid, BAD_VARID, "newName");
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    /* Prefix "new_" to each name */
+    for (i = 0; i < numVars; i++) {
+        err = APIFunc(rename_var)(BAD_ID, i, "newName");
+        IF (err != NC_EBADID)
+            error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(rename_var)(ncid, i, var_name[numVars-1]);
+        IF (err != NC_ENAMEINUSE)
+            error("expecting NC_ENAMEINUSE but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        strcpy(name, "new_");
+        strcat(name, var_name[i]);
+        err = APIFunc(rename_var)(ncid, i, name);
+        IF (err != NC_NOERR)
+            error("rename_var: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        err = APIFunc(inq_varid)(ncid, name, &varid);
+        IF (err != NC_NOERR)
+            error("inq_varid: %s", APIFunc(strerror)(err));
+        IF (varid != i)
+            error("Unexpected varid");
+    }
+
+    /* Change to data mode */
+    /* Try making names even longer. Then restore original names */
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        strcpy(name, "even_longer_");
+        strcat(name, var_name[i]);
+        err = APIFunc(rename_var)(ncid, i, name);
+        IF (err != NC_ENOTINDEFINE)
+            error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+        ELSE_NOK
+        err = APIFunc(rename_var)(ncid, i, var_name[i]);
+        IF (err != NC_NOERR)
+            error("rename_var: %s", APIFunc(strerror)(err));
+        ELSE_NOK
+        err = APIFunc(inq_varid)(ncid, var_name[i], &varid);
+        IF (err != NC_NOERR)
+            error("inq_varid: %s", APIFunc(strerror)(err));
+        IF (varid != i)
+            error("Unexpected varid");
+    }
+
+    Put_Vars(ncid, numVars);
+    Check_Vars(ncid, numVars);
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+int
+TestFunc(put_att)(AttVarArgs)
+{
+    int ncid, nok=0;
+    int varid;
+    int i;
+    int j;
+    IntType k, ndx[1];
+    int err;
+    double buf[MAX_NELS];       /* (void *) buffer */
+    char *p;                    /* (void *) pointer */
+    char *name;                 /* of att */
+    nc_type datatype;           /* of att */
+    IntType length;             /* of att */
+    double value;
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        for (j = 0; j < NATTS(i); j++) {
+            name = ATT_NAME(i,j);
+            datatype = ATT_TYPE(i,j);
+            length = ATT_LEN(i,j);
+            err = APIFunc(put_att)(BAD_ID, varid, name, datatype, length, buf);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(put_att)(ncid, varid, BAD_NAME, datatype, length, buf);
+            IF (err != NC_EBADNAME)
+                error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(put_att)(ncid, BAD_VARID, name, datatype, length, buf);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(put_att)(ncid, varid, name, BAD_TYPE, length, buf);
+            IF (err != NC_EBADTYPE)
+                error("expecting NC_EBADTYPE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            p = (char *) buf;
+            for (k=0; k<length; k++) {
+                ndx[0] = k;
+                value = hash(datatype, -1, ndx);
+                if (!inRange(value, datatype))
+                    value = 0;
+                err = dbl2nc(value, datatype, p);
+                IF (err != NC_NOERR)
+                    error("error in dbl2nc");
+                p += nctypelen(datatype);
+            }
+            err = APIFunc(put_att)(ncid, varid, name, datatype, length, buf);
+            IF (err != NC_NOERR)
+                error("%s", APIFunc(strerror)(err));
+            ELSE_NOK
+        }
+    }
+
+    Check_Atts(ncid, numGatts, numVars);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(copy_att)
+ *    try with bad source or target netCDF handles, check error
+ *    try with bad source or target variable handle, check error
+ *    try with nonexisting attribute, check error
+ *    check that NC_GLOBAL variable for source or target works
+ *    check that new attribute put works with target in define mode
+ *    check that old attribute put works with target in data mode
+ *    check that changing type and length of an attribute work OK
+ *    try with same ncid for source and target, different variables
+ *    try with same ncid for source and target, same variable
+ */
+int
+TestFunc(copy_att)(AttVarArgs)
+{
+    int ncid_in;
+    int ncid_out;
+    int varid;
+    int err, nok=0;
+    int i;
+    int j=0;
+    char *name;                 /* of att */
+    nc_type datatype;           /* of att */
+    IntType length;             /* of att */
+    char  value;
+
+    err = FileOpen(testfile, NC_NOWRITE, &ncid_in);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid_out);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    def_dims(ncid_out);
+    Def_Vars(ncid_out, numVars);
+
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        for (j = 0; j < NATTS(i); j++) {
+            name = ATT_NAME(i,j);
+            err = APIFunc(copy_att)(ncid_in, BAD_VARID, name, ncid_out, varid);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(copy_att)(ncid_in, varid, name, ncid_out, BAD_VARID);
+            IF (err != NC_ENOTVAR)
+                error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(copy_att)(BAD_ID, varid, name, ncid_out, varid);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(copy_att)(ncid_in, varid, name, BAD_ID, varid);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(copy_att)(ncid_in, varid, "noSuch", ncid_out, varid);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(copy_att)(ncid_in, varid, name, ncid_out, varid);
+            IF (err != NC_NOERR)
+                error("copy_att: %s", APIFunc(strerror)(err));
+            ELSE_NOK
+            err = APIFunc(copy_att)(ncid_out, varid, name, ncid_out, varid);
+            IF (err != NC_NOERR)
+                error("source = target: %s", APIFunc(strerror)(err));
+            ELSE_NOK
+        }
+    }
+
+    err = APIFunc(close)(ncid_in);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* Close scratch. Reopen & check attributes */
+    err = APIFunc(close)(ncid_out);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileOpen(scratch, NC_WRITE, &ncid_out);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    Check_Atts(ncid_out, numGatts, numVars);
+
+   /*
+    * change to define mode
+    * define single char. global att. ':a' with value 'A'
+    * This will be used as source for following copies
+    */
+    err = APIFunc(redef)(ncid_out);
+    IF (err != NC_NOERR)
+        error("redef: %s", APIFunc(strerror)(err));
+    err = APIFunc(put_att_text)(ncid_out, NC_GLOBAL, "a", 1, "A");
+    IF (err != NC_NOERR)
+        error("put_att_text: %s", APIFunc(strerror)(err));
+
+   /*
+    * change to data mode
+    * Use scratch as both source & dest.
+    * try copy to existing att. change type & decrease length
+    * rename 1st existing att of each var (if any) 'a'
+    * if this att. exists them copy ':a' to it
+    */
+    err = APIFunc(enddef)(ncid_out);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        if (NATTS(i) > 0 && ATT_LEN(i,j) > 0) {
+            err = APIFunc(rename_att)(ncid_out, i, att_name[i][0], "a");
+            IF (err != NC_NOERR)
+                error("rename_att: %s", APIFunc(strerror)(err));
+            err = APIFunc(copy_att)(ncid_out, NC_GLOBAL, "a", ncid_out, i);
+            IF (err != NC_NOERR)
+                error("copy_att: %s", APIFunc(strerror)(err));
+            ELSE_NOK
+        }
+    }
+    err = APIFunc(close)(ncid_out);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* Reopen & check */
+    err = FileOpen(scratch, NC_WRITE, &ncid_out);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    for (i = 0; i < numVars; i++) {
+        if (NATTS(i) > 0 && ATT_LEN(i,j) > 0) {
+            err = APIFunc(inq_att)(ncid_out, i, "a", &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s", APIFunc(strerror)(err));
+            IF (datatype != NC_CHAR)
+                error("Unexpected type");
+            IF (length != 1)
+                error("Unexpected length");
+            err = APIFunc(get_att_text)(ncid_out, i, "a", &value);
+            IF (err != NC_NOERR)
+                error("get_att_text: %s", APIFunc(strerror)(err));
+            IF (value != 'A')
+                error("Unexpected value");
+        }
+    }
+
+    err = APIFunc(close)(ncid_out);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(rename_att)
+ *    try with bad netCDF handle, check error
+ *    try with bad variable handle, check error
+ *    try with nonexisting att name, check error
+ *    try renaming to existing att name, check error
+ *    check that proper rename worked with APIFunc(inq_attid)
+ *    try in data mode, check error
+ */
+int
+TestFunc(rename_att)(AttVarArgs)
+{
+    int ncid;
+    int varid;
+    int err;
+    int i;
+    int j;
+    IntType k, ndx[1];
+    int attnum;
+    char *attname;
+    char name[NC_MAX_NAME];
+    char oldname[NC_MAX_NAME];
+    char newname[NC_MAX_NAME];
+    int nok = 0;      /* count of valid comparisons */
+    nc_type datatype;
+    nc_type atttype;
+    IntType length;
+    IntType attlength;
+    char  text[MAX_NELS];
+    double value[MAX_NELS];
+    double expect;
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    err = APIFunc(rename_att)(ncid, BAD_VARID, "abc", "newName");
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+    Put_Atts(ncid, numGatts, numVars);
+
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        for (j = 0; j < NATTS(i); j++) {
+            attname = ATT_NAME(i,j);
+            err = APIFunc(rename_att)(BAD_ID, varid, attname, "newName");
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(rename_att)(ncid, varid, "noSuch", "newName");
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            strcpy(newname, "new_");
+            strcat(newname, attname);
+            err = APIFunc(rename_att)(ncid, varid, attname, newname);
+            IF (err != NC_NOERR)
+                error("rename_att: %s", APIFunc(strerror)(err));
+            ELSE_NOK
+            err = APIFunc(inq_attid)(ncid, varid, newname, &attnum);
+            IF (err != NC_NOERR)
+                error("inq_attid: %s", APIFunc(strerror)(err));
+            IF (attnum != j)
+                error("Unexpected attnum");
+        }
+    }
+
+    /* Close. Reopen & check */
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileOpen(scratch, NC_WRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        for (j = 0; j < NATTS(i); j++) {
+            attname = ATT_NAME(i,j);
+            atttype = ATT_TYPE(i,j);
+            attlength = ATT_LEN(i,j);
+            strcpy(newname, "new_");
+            strcat(newname, attname);
+            err = APIFunc(inq_attname)(ncid, varid, j, name);
+            IF (err != NC_NOERR)
+                error("inq_attname: %s", APIFunc(strerror)(err));
+            IF (strcmp(name, newname) != 0)
+                error("inq_attname: unexpected name");
+            err = APIFunc(inq_att)(ncid, varid, name, &datatype, &length);
+            IF (err != NC_NOERR)
+                error("inq_att: %s", APIFunc(strerror)(err));
+            IF (datatype != atttype)
+                error("inq_att: unexpected type");
+            IF (length != attlength)
+                error("inq_att: unexpected length");
+            if (datatype == NC_CHAR) {
+                err = APIFunc(get_att_text)(ncid, varid, name, text);
+                IF (err != NC_NOERR)
+                    error("get_att_text: %s", APIFunc(strerror)(err));
+                for (k = 0; k < attlength; k++) {
+                    ndx[0] = k;
+                    expect = hash(datatype, -1, ndx);
+                    IF (text[k] != (char)expect)
+                        error("get_att_text: unexpected value");
+                }
+            } else {
+                err = APIFunc(get_att_double)(ncid, varid, name, value);
+                IF (err != NC_NOERR)
+                    error("get_att_double: %s", APIFunc(strerror)(err));
+                for (k = 0; k < attlength; k++) {
+                    ndx[0] = k;
+                    expect = hash(datatype, -1, ndx);
+                    if (inRange(expect, datatype)) {
+                        IF (!equal(value[k],expect,datatype,NCT_DOUBLE))
+                            error("get_att_double: unexpected value");
+                    }
+                }
+            }
+        }
+    }
+
+    /* Now in data mode */
+    /* Try making names even longer. Then restore original names */
+
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        for (j = 0; j < NATTS(i); j++) {
+            attname = ATT_NAME(i,j);
+            strcpy(oldname, "new_");
+            strcat(oldname, attname);
+            strcpy(newname, "even_longer_");
+            strcat(newname, attname);
+            err = APIFunc(rename_att)(ncid, varid, oldname, newname);
+            IF (err != NC_ENOTINDEFINE)
+                error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(rename_att)(ncid, varid, oldname, attname);
+            IF (err != NC_NOERR)
+                error("rename_att: %s", APIFunc(strerror)(err));
+            ELSE_NOK
+            err = APIFunc(inq_attid)(ncid, varid, attname, &attnum);
+            IF (err != NC_NOERR)
+                error("inq_attid: %s", APIFunc(strerror)(err));
+            IF (attnum != j)
+                error("Unexpected attnum");
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(del_att)
+ *    try with bad netCDF handle, check error
+ *    try with bad variable handle, check error
+ *    try with nonexisting att name, check error
+ *    check that proper delete worked using:
+ *      APIFunc(inq_attid), APIFunc(inq_natts), APIFunc(inq_varnatts)
+ */
+int
+TestFunc(del_att)(AttVarArgs)
+{
+    int ncid;
+    int err, nok=0;
+    int i;
+    int j;
+    int attnum;
+    int natts;
+    int numatts;
+    int varid;
+    char *name;                 /* of att */
+
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    err = APIFunc(del_att)(ncid, BAD_VARID, "abc");
+    IF (err != NC_ENOTVAR)
+        error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
+    ELSE_NOK
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+    Put_Atts(ncid, numGatts, numVars);
+
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        numatts = NATTS(i);
+        for (j = 0; j < numatts; j++) {
+            name = ATT_NAME(i,j);
+            err = APIFunc(del_att)(BAD_ID, varid, name);
+            IF (err != NC_EBADID)
+                error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(del_att)(ncid, varid, "noSuch");
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            ELSE_NOK
+            err = APIFunc(del_att)(ncid, varid, name);
+            IF (err != NC_NOERR)
+                error("del_att: %s", APIFunc(strerror)(err));
+            ELSE_NOK
+            err = APIFunc(inq_attid)(ncid, varid, name, &attnum);
+            IF (err != NC_ENOTATT)
+                error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
+            if (i < 0) {
+                err = APIFunc(inq_natts)(ncid, &natts);
+                IF (err != NC_NOERR)
+                    error("inq_natts: %s", APIFunc(strerror)(err));
+                IF (natts != numatts-j-1)
+                    error("natts: expected %d, got %d", numatts-j-1, natts);
+            }
+            err = APIFunc(inq_varnatts)(ncid, varid, &natts);
+            IF (err != NC_NOERR)
+                error("inq_natts: %s", APIFunc(strerror)(err));
+            IF (natts != numatts-j-1)
+                error("natts: expected %d, got %d", numatts-j-1, natts);
+        }
+    }
+
+    /* Close. Reopen & check no attributes left */
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileOpen(scratch, NC_WRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(inq_natts)(ncid, &natts);
+    IF (err != NC_NOERR)
+        error("inq_natts: %s", APIFunc(strerror)(err));
+    IF (natts != 0)
+        error("natts: expected %d, got %d", 0, natts);
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        err = APIFunc(inq_varnatts)(ncid, varid, &natts);
+        IF (err != NC_NOERR)
+            error("inq_natts: %s", APIFunc(strerror)(err));
+        IF (natts != 0)
+            error("natts: expected %d, got %d", 0, natts);
+    }
+
+    /* restore attributes. change to data mode. try to delete */
+    err = APIFunc(redef)(ncid);
+    IF (err != NC_NOERR)
+        error("redef: %s", APIFunc(strerror)(err));
+    Put_Atts(ncid, numGatts, numVars);
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+
+    for (i = -1; i < numVars; i++) {
+        varid = VARID(i);
+        numatts = NATTS(i);
+        for (j = 0; j < numatts; j++) {
+            name = ATT_NAME(i,j);
+            err = APIFunc(del_att)(ncid, varid, name);
+            IF (err != NC_ENOTINDEFINE)
+                error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));
+            ELSE_NOK
+        }
+    }
+
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    return nok;
+}
+
+
+/*
+ * Test APIFunc(set_fill)
+ *    try with bad netCDF handle, check error
+ *    try in read-only mode, check error
+ *    try with bad new_fillmode, check error
+ *    try in data mode, check error
+ *    check that proper set to NC_FILL works for record & non-record variables
+ *    (note that it is not possible to test NC_NOFILL mode!)
+ *    close file & create again for test using attribute _FillValue
+ */
+int
+TestFunc(set_fill)(VarArgs)
+{
+    int ncid;
+    int varid;
+    int err;
+    int i;
+    IntType j;
+    int old_fillmode;
+    int nok = 0;      /* count of valid comparisons */
+    char text = 0;
+    double value = 0;
+    double fill;
+    IntType index[MAX_RANK];
+
+    /* bad ncid */
+    err = APIFunc(set_fill)(BAD_ID, NC_NOFILL, &old_fillmode);
+    IF (err != NC_EBADID)
+        error("expecting NC_EBADID but got %s", nc_err_code_name(err));
+
+    /* try in read-only mode */
+    err = FileOpen(testfile, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR)
+        error("open: %s", APIFunc(strerror)(err));
+    err = APIFunc(set_fill)(ncid, NC_NOFILL, &old_fillmode);
+    IF (err != NC_EPERM)
+        error("expecting NC_EPERM but got %s", nc_err_code_name(err));
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+
+    /* create scratch */
+    err = FileCreate(scratch, NC_NOCLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+
+    /* BAD_FILLMODE */
+    err = APIFunc(set_fill)(ncid, BAD_FILLMODE, &old_fillmode);
+    IF (err != NC_EINVAL)
+        error("expecting NC_EINVAL but got %s", nc_err_code_name(err));
+
+    /* proper calls */
+    err = APIFunc(set_fill)(ncid, NC_NOFILL, &old_fillmode);
+    IF (err != NC_NOERR)
+        error("set_fill: %s", APIFunc(strerror)(err));
+    IF (old_fillmode != NC_NOFILL)
+        error("Unexpected old fill mode: %d", old_fillmode);
+    err = APIFunc(set_fill)(ncid, NC_FILL, &old_fillmode);
+    IF (err != NC_NOERR)
+        error("set_fill: %s", APIFunc(strerror)(err));
+    IF (old_fillmode != NC_NOFILL)
+        error("Unexpected old fill mode: %d", old_fillmode);
+
+    /* define dims & vars */
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    /* Change to data mode. Set fillmode again */
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    err = APIFunc(set_fill)(ncid, NC_FILL, &old_fillmode);
+ifdef(`PNETCDF',
+    `IF (err != NC_ENOTINDEFINE)
+        error("expecting NC_ENOTINDEFINE but got %s", nc_err_code_name(err));',
+    `IF (err)
+        error("nc_set_fill: %s", nc_strerror(err));
+    IF (old_fillmode != NC_FILL)
+        error("Unexpected old fill mode: %d", old_fillmode);')dnl
+
+    /* Write record number NRECS to force writing of preceding records */
+    /* Assumes variable cr is char vector with UNLIMITED dimension */
+    err = APIFunc(inq_varid)(ncid, "cr", &varid);
+    IF (err != NC_NOERR)
+        error("inq_varid: %s", APIFunc(strerror)(err));
+    index[0] = NRECS;
+
+ifdef(`PNETCDF', `
+    for (i=0; i<=index[0]; i++)
+        err = APIFunc(fill_var_rec)(ncid, varid, i);')dnl
+
+    err = PutVar1TYPE(text)(ncid, varid, index, &text);
+    IF (err != NC_NOERR)
+        error("put_var1_text_all: %s", APIFunc(strerror)(err));
+
+    /* get all variables & check all values equal default fill */
+    for (i = 0; i < numVars; i++) {
+        ifdef(`PNETCDF', `if (var_dimid[i][0] == RECDIM) continue; /* skip record variables */')
+        switch (var_type[i]) {
+            case NC_CHAR:   fill = (double)NC_FILL_CHAR;   break;
+            case NC_BYTE:   fill = (double)NC_FILL_BYTE;   break;
+            case NC_SHORT:  fill = (double)NC_FILL_SHORT;  break;
+            case NC_INT:    fill = (double)NC_FILL_INT;    break;
+            case NC_FLOAT:  fill = (double)NC_FILL_FLOAT;  break;
+            case NC_DOUBLE: fill = (double)NC_FILL_DOUBLE; break;
+            case NC_UBYTE:  fill = (double)NC_FILL_UBYTE;  break;
+            case NC_USHORT: fill = (double)NC_FILL_USHORT; break;
+            case NC_UINT:   fill = (double)NC_FILL_UINT;   break;
+            case NC_INT64:  fill = (double)NC_FILL_INT64;  break;
+            case NC_UINT64: fill = (double)NC_FILL_UINT64; break;
+            default: assert(0);
+        }
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            if (var_type[i] == NC_CHAR) {
+                err = GetVar1TYPE(text)(ncid, i, index, &text);
+                IF (err != NC_NOERR)
+                    error("get_var1_text_all failed: %s", APIFunc(strerror)(err));
+                value = text;
+            } else {
+                err = GetVar1TYPE(double)(ncid, i, index, &value);
+                IF (err != NC_NOERR)
+                    error("get_var1_double_all failed: %s", APIFunc(strerror)(err));
+            }
+            IF (value != fill && fabs((fill - value)/fill) > DBL_EPSILON)
+                error("\n\t\t%s Value expected: %-23.17e,\n\t\t          read: %-23.17e\n",
+                        var_name[i],fill, value);
+            ELSE_NOK
+        }
+    }
+
+    /* close scratch & create again for test using attribute _FillValue */
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileCreate(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) {
+        error("create: %s", APIFunc(strerror)(err));
+        return nok;
+    }
+    def_dims(ncid);
+    Def_Vars(ncid, numVars);
+
+    /* set _FillValue = 42 for all vars */
+    fill = 42;
+    text = 42;
+    for (i = 0; i < numVars; i++) {
+        if (var_type[i] == NC_CHAR) {
+            err = APIFunc(put_att_text)(ncid, i, "_FillValue", 1, &text);
+            IF (err != NC_NOERR)
+                error("put_att_text: %s", APIFunc(strerror)(err));
+        } else {
+            err = APIFunc(put_att_double)(ncid, i, "_FillValue",var_type[i],1,&fill);
+            IF (err != NC_NOERR)
+                error("put_att_double: %s", APIFunc(strerror)(err));
+        }
+    }
+
+    /* data mode. write records */
+    err = APIFunc(enddef)(ncid);
+    IF (err != NC_NOERR)
+        error("enddef: %s", APIFunc(strerror)(err));
+    index[0] = NRECS;
+
+ifdef(`PNETCDF', `
+    for (i=0; i<=index[0]; i++)
+        err = APIFunc(fill_var_rec)(ncid, varid, i);')dnl
+
+    err = PutVar1TYPE(text)(ncid, varid, index, &text);
+    IF (err != NC_NOERR)
+        error("put_var1_text_all: %s", APIFunc(strerror)(err));
+
+    /* get all variables & check all values equal 42 */
+    for (i = 0; i < numVars; i++) {
+        if (var_dimid[i][0] == RECDIM) continue; /* skip record variables */
+        for (j = 0; j < var_nels[i]; j++) {
+            err = toMixedBase(j, var_rank[i], var_shape[i], index);
+            IF (err != 0) error("error in toMixedBase");
+            if (var_type[i] == NC_CHAR) {
+                err = GetVar1TYPE(text)(ncid, i, index, &text);
+                IF (err != NC_NOERR)
+                    error("get_var1_text_all failed: %s", APIFunc(strerror)(err));
+                value = text;
+            } else {
+                err = GetVar1TYPE(double)(ncid, i, index, &value);
+                IF (err != NC_NOERR)
+                    error("get_var1_double_all failed: %s", APIFunc(strerror)(err));
+            }
+            IF (value != fill)
+                error(" %s Value expected: %g, read: %g\n", var_name[i],fill, value);
+            ELSE_NOK
+        }
+    }
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+
+    return nok;
+}
+
+
+/* This function gets the version of a netCDF file, 1 is for netCDF
+   classic, 2 for 64-bit offset format, (someday) 3 for HDF5 format,
+   5 for 64-bit data format (CDF-5).
+*/
+#define MAGIC_NUM_LEN 4
+static
+int
+APIFunc(get_file_version)(char *path, int *version)
+{
+   int fd;
+   ssize_t read_len;
+   char magic[MAGIC_NUM_LEN];
+
+   /* Need two valid pointers - check for NULL. */
+   if (!version || !path)
+      return NC_EINVAL;
+
+   /* Figure out if this is a netcdf or hdf5 file. */
+   fd = open(path, O_RDONLY, 0600);
+   if (fd == -1) return errno;
+
+   read_len = read(fd, magic, MAGIC_NUM_LEN);
+   if (-1 == close(fd)) return errno;
+
+   if (read_len == -1)
+       return errno;
+
+   if (read_len != MAGIC_NUM_LEN) {
+       printf("Error: reading NC magic string unexpected short read\n");
+       return 0;
+   }
+
+   if (strncmp(magic, "CDF", MAGIC_NUM_LEN-1)==0) {
+      if (magic[MAGIC_NUM_LEN-1] == NC_FORMAT_CLASSIC ||
+          magic[MAGIC_NUM_LEN-1] == NC_FORMAT_64BIT_OFFSET ||
+          magic[MAGIC_NUM_LEN-1] == NC_FORMAT_CDF5)
+         *version = magic[MAGIC_NUM_LEN-1];
+      else
+        return NC_ENOTNC;
+   }
+   /*   tomorrow, tomorrow, I love you tomorrow, you're always a day
+       away! */
+   /*if (magic[1] == 'H' && magic[2] == 'D' && magic[3] == 'F')
+      *version = 3;*/
+   return NC_NOERR;
+}
+
+/*
+ * Test APIFunc(set_default_format)
+ *    try with bad default format
+ *    try with NULL old_formatp
+ *    try in data mode, check error
+ *    check that proper set to NC_FILL works for record & non-record variables
+ *    (note that it is not possible to test NC_NOFILL mode!)
+ *    close file & create again for test using attribute _FillValue
+ */
+int
+TestFunc(set_default_format)(void)
+{
+    int ncid, nok=0;
+    int err;
+    int i;
+    int version=1;
+    int old_format;
+
+    /* bad format */
+    err = APIFunc(set_default_format)(BAD_DEFAULT_FORMAT, &old_format);
+    IF (err != NC_EINVAL)
+        error("expecting NC_EINVAL but got %s", nc_err_code_name(err));
+    ELSE_NOK
+
+    /* NULL old_formatp */
+    err = APIFunc(set_default_format)(NC_FORMAT_64BIT_OFFSET, NULL);
+    IF (err != NC_NOERR)
+       error("null old_fortmatp: status = %d", err);
+    ELSE_NOK
+
+    /* Cycle through available formats. */
+    for(i=NC_FORMAT_CLASSIC; i<NC_FORMAT_64BIT_DATA; i++)
+    {
+       if (i == NC_FORMAT_NETCDF4 || i == NC_FORMAT_NETCDF4_CLASSIC)
+           continue; /* test classic formats only */
+       if ((err = APIFunc(set_default_format)(i, NULL)))
+           error("setting classic format: status = %d", err);
+       ELSE_NOK
+       err = FileCreate(scratch, NC_CLOBBER, &ncid);
+       if (err != NC_NOERR)
+           error("bad nc_create: status = %d", err);
+       err = APIFunc(put_att_text)(ncid, NC_GLOBAL, "testatt", sizeof("blah"), "blah");
+       if (err != NC_NOERR)
+           error("bad put_att: status = %d", err);
+       err = APIFunc(close)(ncid);
+       if (err != NC_NOERR)
+           error("bad close: status = %d", err);
+       err = APIFunc(get_file_version)(scratch, &version);
+       if (err != NC_NOERR)
+           error("bad file version = %d", err);
+       if (version != i) {
+#if 0
+          if (i == 4) {
+              if (version == 3) continue;
+              printf("expect version 3 but got %d (file=%s)",version,scratch);
+              continue;
+          }
+#endif
+          printf("expect version %d but got %d (file=%s)",i,version,scratch);
+          error("bad file version = %d", version);
+        }
+    }
+
+    /* Remove the left-over file. */
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+
+    return nok;
+}
+
+
+
+
+/*
+ * Test FileDelete
+ *         create netcdf file 'scratch.nc' with no data, close it
+ *         delete the file
+ */
+int
+TestFunc(delete)(void)
+{
+    int err, nok=0;;
+    int ncid;
+
+    err = FileCreate(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR)
+        error("error creating scratch file %s, status = %d\n", scratch,err);
+    err = APIFunc(close)(ncid);
+    IF (err != NC_NOERR)
+        error("close: %s", APIFunc(strerror)(err));
+    err = FileDelete(scratch, info);
+    IF (err != NC_NOERR)
+        error("remove of %s failed", scratch);
+    ELSE_NOK
+    return nok;
+}
diff --git a/nc_test/testnc3perf.c b/nc_test/testnc3perf.c
old mode 100755
new mode 100644
diff --git a/nc_test/tests.h b/nc_test/tests.h
index 4223ee6..908fabc 100644
--- a/nc_test/tests.h
+++ b/nc_test/tests.h
@@ -18,6 +18,10 @@
 #endif
 #include "error.h"
 
+#ifndef HAVE_SSIZE_T
+typedef int ssize_t;
+#endif
+
 #if defined(_CRAY) && !defined(_CRAYIEEE) && !defined(__crayx1)
 #define CRAYFLOAT 1 /* CRAY Floating point */
 #elif defined(_SX) && defined(_FLOAT2)	/* NEC SUPER-UX in CRAY mode */
@@ -26,13 +30,12 @@
 
     /* Limits of external types (based on those in ncx.h) */
 
-#ifdef __CHAR_UNSIGNED__
-#define X_CHAR_MIN	SCHAR_MIN
-#define X_CHAR_MAX	SCHAR_MAX
-#else
-#define X_CHAR_MIN	CHAR_MIN
-#define X_CHAR_MAX	CHAR_MAX
-#endif //__unsigned_char__
+/* Note: In CDF format specification, NC_CHAR is for text characters, which
+ * is considered an 8-bit unsigned integer. Since it is for printable text
+ * characters, its values should range from 0 (X_CHAR_MIN) to 255 (X_CHAR_MAX).
+ */
+#define X_CHAR_MIN      0
+#define X_CHAR_MAX      255
 
 #define X_BYTE_MIN	(-128)
 #define X_BYTE_MAX	127
@@ -205,7 +208,7 @@ extern "C" {
 # include <sys/types.h>
 #endif
 
-typedef signed char text;
+typedef char text;
 typedef signed char schar;
 
 #ifndef HAVE_USHORT
@@ -243,11 +246,11 @@ extern char dim_name[NDIMS][3];
 extern size_t dim_len[NDIMS];
 extern char var_name[NVARS][2+MAX_RANK];
 extern nc_type var_type[NVARS];
-extern size_t var_rank[NVARS];
+extern int var_rank[NVARS];
 extern int var_dimid[NVARS][MAX_RANK];
 extern size_t var_shape[NVARS][MAX_RANK];
 extern size_t var_nels[NVARS];
-extern size_t var_natts[NVARS];
+extern int var_natts[NVARS];
 extern char att_name[NVARS][MAX_NATTS][2];
 extern char gatt_name[NGATTS][3];
 extern nc_type att_type[NVARS][NGATTS];
@@ -267,220 +270,221 @@ extern size_t gatt_len[NGATTS];
 
 extern const char *s_nc_type(nc_type);
 
-extern void test_nc_strerror(void);
-extern void test_nc_open(void);
-extern void test_nc_close(void);
-
-extern void test_nc_inq(void);
-extern void test_nc_inq_natts(void);
-extern void test_nc_inq_ndims(void);
-extern void test_nc_inq_nvars(void);
-extern void test_nc_inq_unlimdim(void);
-
-extern void test_nc_inq_dimid(void);
-extern void test_nc_inq_dim(void);
-extern void test_nc_inq_dimlen(void);
-extern void test_nc_inq_dimname(void);
-
-extern void test_nc_inq_varid(void);
-extern void test_nc_inq_vardimid(void);
-extern void test_nc_inq_varname(void);
-extern void test_nc_inq_varnatts(void);
-extern void test_nc_inq_varndims(void);
-extern void test_nc_inq_vartype(void);
-extern void test_nc_inq_var(void);
-
-extern void test_nc_get_var_double(void);
-extern void test_nc_get_var_float(void);
-extern void test_nc_get_var_int(void);
-extern void test_nc_get_var_long(void);
-extern void test_nc_get_var_schar(void);
-extern void test_nc_get_var_short(void);
-extern void test_nc_get_var_text(void);
-extern void test_nc_get_var_uchar(void);
-extern void test_nc_get_var(void);
-extern void test_nc_get_var_ushort(void);
-extern void test_nc_get_var_uint(void);
-extern void test_nc_get_var_longlong(void);
-extern void test_nc_get_var_ulonglong(void);
-
-extern void test_nc_get_var1_double(void);
-extern void test_nc_get_var1_float(void);
-extern void test_nc_get_var1_int(void);
-extern void test_nc_get_var1_long(void);
-extern void test_nc_get_var1_schar(void);
-extern void test_nc_get_var1_short(void);
-extern void test_nc_get_var1_text(void);
-extern void test_nc_get_var1_uchar(void);
-extern void test_nc_get_var1(void);
-extern void test_nc_get_var1_ushort(void);
-extern void test_nc_get_var1_uint(void);
-extern void test_nc_get_var1_longlong(void);
-extern void test_nc_get_var1_ulonglong(void);
-
-extern void test_nc_get_vara_double(void);
-extern void test_nc_get_vara_float(void);
-extern void test_nc_get_vara_int(void);
-extern void test_nc_get_vara_long(void);
-extern void test_nc_get_vara_schar(void);
-extern void test_nc_get_vara_short(void);
-extern void test_nc_get_vara_text(void);
-extern void test_nc_get_vara_uchar(void);
-extern void test_nc_get_vara(void);
-extern void test_nc_get_vara_ushort(void);
-extern void test_nc_get_vara_uint(void);
-extern void test_nc_get_vara_longlong(void);
-extern void test_nc_get_vara_ulonglong(void);
-
-extern void test_nc_get_vars(void);
-extern void test_nc_get_vars_double(void);
-extern void test_nc_get_vars_float(void);
-extern void test_nc_get_vars_int(void);
-extern void test_nc_get_vars_long(void);
-extern void test_nc_get_vars_schar(void);
-extern void test_nc_get_vars_short(void);
-extern void test_nc_get_vars_text(void);
-extern void test_nc_get_vars_uchar(void);
-extern void test_nc_get_vars(void);
-extern void test_nc_get_vars_ushort(void);
-extern void test_nc_get_vars_uint(void);
-extern void test_nc_get_vars_longlong(void);
-extern void test_nc_get_vars_ulonglong(void);
-
-extern void test_nc_get_varm(void);
-extern void test_nc_get_varm_double(void);
-extern void test_nc_get_varm_float(void);
-extern void test_nc_get_varm_int(void);
-extern void test_nc_get_varm_long(void);
-extern void test_nc_get_varm_schar(void);
-extern void test_nc_get_varm_short(void);
-extern void test_nc_get_varm_text(void);
-extern void test_nc_get_varm_uchar(void);
-extern void test_nc_get_varm(void);
-extern void test_nc_get_varm_ushort(void);
-extern void test_nc_get_varm_uint(void);
-extern void test_nc_get_varm_longlong(void);
-extern void test_nc_get_varm_ulonglong(void);
-
-extern void test_nc_get_att(void);
-extern void test_nc_get_att_double(void);
-extern void test_nc_get_att_float(void);
-extern void test_nc_get_att_int(void);
-extern void test_nc_get_att_long(void);
-extern void test_nc_get_att_schar(void);
-extern void test_nc_get_att_short(void);
-extern void test_nc_get_att_text(void);
-extern void test_nc_get_att_uchar(void);
-extern void test_nc_get_att_ushort(void);
-extern void test_nc_get_att_uint(void);
-extern void test_nc_get_att_longlong(void);
-extern void test_nc_get_att_ulonglong(void);
-
-extern void test_nc_put_att(void);
-extern void test_nc_put_var_double(void);
-extern void test_nc_put_var_float(void);
-extern void test_nc_put_var_int(void);
-extern void test_nc_put_var_long(void);
-extern void test_nc_put_var_schar(void);
-extern void test_nc_put_var_short(void);
-extern void test_nc_put_var_text(void);
-extern void test_nc_put_var_uchar(void);
-extern void test_nc_put_var(void);
-extern void test_nc_put_var_ushort(void);
-extern void test_nc_put_var_uint(void);
-extern void test_nc_put_var_longlong(void);
-extern void test_nc_put_var_ulonglong(void);
-
-extern void test_nc_put_var1_double(void);
-extern void test_nc_put_var1_float(void);
-extern void test_nc_put_var1_int(void);
-extern void test_nc_put_var1_long(void);
-extern void test_nc_put_var1_schar(void);
-extern void test_nc_put_var1_short(void);
-extern void test_nc_put_var1_text(void);
-extern void test_nc_put_var1_uchar(void);
-extern void test_nc_put_var1(void);
-extern void test_nc_put_var1_ushort(void);
-extern void test_nc_put_var1_uint(void);
-extern void test_nc_put_var1_longlong(void);
-extern void test_nc_put_var1_ulonglong(void);
-
-extern void test_nc_put_vara_double(void);
-extern void test_nc_put_vara_float(void);
-extern void test_nc_put_vara_int(void);
-extern void test_nc_put_vara_long(void);
-extern void test_nc_put_vara_schar(void);
-extern void test_nc_put_vara_short(void);
-extern void test_nc_put_vara_text(void);
-extern void test_nc_put_vara_uchar(void);
-extern void test_nc_put_vara(void);
-extern void test_nc_put_vara_ushort(void);
-extern void test_nc_put_vara_uint(void);
-extern void test_nc_put_vara_longlong(void);
-extern void test_nc_put_vara_ulonglong(void);
-
-extern void test_nc_put_vars_double(void);
-extern void test_nc_put_vars_float(void);
-extern void test_nc_put_vars_int(void);
-extern void test_nc_put_vars_long(void);
-extern void test_nc_put_vars_schar(void);
-extern void test_nc_put_vars_short(void);
-extern void test_nc_put_vars_text(void);
-extern void test_nc_put_vars_uchar(void);
-extern void test_nc_put_vars(void);
-extern void test_nc_put_vars_ushort(void);
-extern void test_nc_put_vars_uint(void);
-extern void test_nc_put_vars_longlong(void);
-extern void test_nc_put_vars_ulonglong(void);
-
-extern void test_nc_put_varm_double(void);
-extern void test_nc_put_varm_float(void);
-extern void test_nc_put_varm_int(void);
-extern void test_nc_put_varm_long(void);
-extern void test_nc_put_varm_schar(void);
-extern void test_nc_put_varm_short(void);
-extern void test_nc_put_varm_text(void);
-extern void test_nc_put_varm_uchar(void);
-extern void test_nc_put_varm(void);
-extern void test_nc_put_varm_ushort(void);
-extern void test_nc_put_varm_uint(void);
-extern void test_nc_put_varm_longlong(void);
-extern void test_nc_put_varm_ulonglong(void);
-
-extern void test_nc_put_att_double(void);
-extern void test_nc_put_att_float(void);
-extern void test_nc_put_att_int(void);
-extern void test_nc_put_att_long(void);
-extern void test_nc_put_att_schar(void);
-extern void test_nc_put_att_short(void);
-extern void test_nc_put_att_text(void);
-extern void test_nc_put_att_uchar(void);
-extern void test_nc_put_att_ushort(void);
-extern void test_nc_put_att_uint(void);
-extern void test_nc_put_att_longlong(void);
-extern void test_nc_put_att_ulonglong(void);
-
-extern void test_nc_create(void);
-extern void test_nc_redef(void);
-extern void test_nc_enddef(void);
-extern void test_nc_sync(void);
-extern void test_nc_abort(void);
-extern void test_nc_def_dim(void);
-extern void test_nc_rename_dim(void);
-extern void test_nc_def_var(void);
-extern void test_nc_rename_var(void);
-extern void test_nc_copy_att(void);
-
-extern void test_nc_inq_att(void);
-extern void test_nc_inq_attname(void);
-extern void test_nc_inq_attid(void);
-extern void test_nc_inq_attlen(void);
-extern void test_nc_inq_atttype(void);
-
-extern void test_nc_rename_att(void);
-extern void test_nc_del_att(void);
-extern void test_nc_set_fill(void);
-extern void test_nc_set_default_format(void);
+extern int test_nc_strerror(void);
+extern int test_nc_open(void);
+extern int test_nc_close(void);
+
+extern int test_nc_inq(void);
+extern int test_nc_inq_natts(void);
+extern int test_nc_inq_ndims(void);
+extern int test_nc_inq_nvars(void);
+extern int test_nc_inq_unlimdim(void);
+
+extern int test_nc_inq_dimid(void);
+extern int test_nc_inq_dim(void);
+extern int test_nc_inq_dimlen(void);
+extern int test_nc_inq_dimname(void);
+
+extern int test_nc_inq_varid(void);
+extern int test_nc_inq_vardimid(void);
+extern int test_nc_inq_varname(void);
+extern int test_nc_inq_varnatts(void);
+extern int test_nc_inq_varndims(void);
+extern int test_nc_inq_vartype(void);
+extern int test_nc_inq_var(void);
+
+extern int test_nc_get_var_double(void);
+extern int test_nc_get_var_float(void);
+extern int test_nc_get_var_int(void);
+extern int test_nc_get_var_long(void);
+extern int test_nc_get_var_schar(void);
+extern int test_nc_get_var_short(void);
+extern int test_nc_get_var_text(void);
+extern int test_nc_get_var_uchar(void);
+extern int test_nc_get_var(void);
+extern int test_nc_get_var_ushort(void);
+extern int test_nc_get_var_uint(void);
+extern int test_nc_get_var_longlong(void);
+extern int test_nc_get_var_ulonglong(void);
+
+extern int test_nc_get_var1_double(void);
+extern int test_nc_get_var1_float(void);
+extern int test_nc_get_var1_int(void);
+extern int test_nc_get_var1_long(void);
+extern int test_nc_get_var1_schar(void);
+extern int test_nc_get_var1_short(void);
+extern int test_nc_get_var1_text(void);
+extern int test_nc_get_var1_uchar(void);
+extern int test_nc_get_var1(void);
+extern int test_nc_get_var1_ushort(void);
+extern int test_nc_get_var1_uint(void);
+extern int test_nc_get_var1_longlong(void);
+extern int test_nc_get_var1_ulonglong(void);
+
+extern int test_nc_get_vara_double(void);
+extern int test_nc_get_vara_float(void);
+extern int test_nc_get_vara_int(void);
+extern int test_nc_get_vara_long(void);
+extern int test_nc_get_vara_schar(void);
+extern int test_nc_get_vara_short(void);
+extern int test_nc_get_vara_text(void);
+extern int test_nc_get_vara_uchar(void);
+extern int test_nc_get_vara(void);
+extern int test_nc_get_vara_ushort(void);
+extern int test_nc_get_vara_uint(void);
+extern int test_nc_get_vara_longlong(void);
+extern int test_nc_get_vara_ulonglong(void);
+
+extern int test_nc_get_vars(void);
+extern int test_nc_get_vars_double(void);
+extern int test_nc_get_vars_float(void);
+extern int test_nc_get_vars_int(void);
+extern int test_nc_get_vars_long(void);
+extern int test_nc_get_vars_schar(void);
+extern int test_nc_get_vars_short(void);
+extern int test_nc_get_vars_text(void);
+extern int test_nc_get_vars_uchar(void);
+extern int test_nc_get_vars(void);
+extern int test_nc_get_vars_ushort(void);
+extern int test_nc_get_vars_uint(void);
+extern int test_nc_get_vars_longlong(void);
+extern int test_nc_get_vars_ulonglong(void);
+
+extern int test_nc_get_varm(void);
+extern int test_nc_get_varm_double(void);
+extern int test_nc_get_varm_float(void);
+extern int test_nc_get_varm_int(void);
+extern int test_nc_get_varm_long(void);
+extern int test_nc_get_varm_schar(void);
+extern int test_nc_get_varm_short(void);
+extern int test_nc_get_varm_text(void);
+extern int test_nc_get_varm_uchar(void);
+extern int test_nc_get_varm(void);
+extern int test_nc_get_varm_ushort(void);
+extern int test_nc_get_varm_uint(void);
+extern int test_nc_get_varm_longlong(void);
+extern int test_nc_get_varm_ulonglong(void);
+
+extern int test_nc_get_att(void);
+extern int test_nc_get_att_double(void);
+extern int test_nc_get_att_float(void);
+extern int test_nc_get_att_int(void);
+extern int test_nc_get_att_long(void);
+extern int test_nc_get_att_schar(void);
+extern int test_nc_get_att_short(void);
+extern int test_nc_get_att_text(void);
+extern int test_nc_get_att_uchar(void);
+extern int test_nc_get_att_ushort(void);
+extern int test_nc_get_att_uint(void);
+extern int test_nc_get_att_longlong(void);
+extern int test_nc_get_att_ulonglong(void);
+
+extern int test_nc_put_att(void);
+extern int test_nc_put_var_double(void);
+extern int test_nc_put_var_float(void);
+extern int test_nc_put_var_int(void);
+extern int test_nc_put_var_long(void);
+extern int test_nc_put_var_schar(void);
+extern int test_nc_put_var_short(void);
+extern int test_nc_put_var_text(void);
+extern int test_nc_put_var_uchar(void);
+extern int test_nc_put_var(void);
+extern int test_nc_put_var_ushort(void);
+extern int test_nc_put_var_uint(void);
+extern int test_nc_put_var_longlong(void);
+extern int test_nc_put_var_ulonglong(void);
+
+extern int test_nc_put_var1_double(void);
+extern int test_nc_put_var1_float(void);
+extern int test_nc_put_var1_int(void);
+extern int test_nc_put_var1_long(void);
+extern int test_nc_put_var1_schar(void);
+extern int test_nc_put_var1_short(void);
+extern int test_nc_put_var1_text(void);
+extern int test_nc_put_var1_uchar(void);
+extern int test_nc_put_var1(void);
+extern int test_nc_put_var1_ushort(void);
+extern int test_nc_put_var1_uint(void);
+extern int test_nc_put_var1_longlong(void);
+extern int test_nc_put_var1_ulonglong(void);
+
+extern int test_nc_put_vara_double(void);
+extern int test_nc_put_vara_float(void);
+extern int test_nc_put_vara_int(void);
+extern int test_nc_put_vara_long(void);
+extern int test_nc_put_vara_schar(void);
+extern int test_nc_put_vara_short(void);
+extern int test_nc_put_vara_text(void);
+extern int test_nc_put_vara_uchar(void);
+extern int test_nc_put_vara(void);
+extern int test_nc_put_vara_ushort(void);
+extern int test_nc_put_vara_uint(void);
+extern int test_nc_put_vara_longlong(void);
+extern int test_nc_put_vara_ulonglong(void);
+
+extern int test_nc_put_vars_double(void);
+extern int test_nc_put_vars_float(void);
+extern int test_nc_put_vars_int(void);
+extern int test_nc_put_vars_long(void);
+extern int test_nc_put_vars_schar(void);
+extern int test_nc_put_vars_short(void);
+extern int test_nc_put_vars_text(void);
+extern int test_nc_put_vars_uchar(void);
+extern int test_nc_put_vars(void);
+extern int test_nc_put_vars_ushort(void);
+extern int test_nc_put_vars_uint(void);
+extern int test_nc_put_vars_longlong(void);
+extern int test_nc_put_vars_ulonglong(void);
+
+extern int test_nc_put_varm_double(void);
+extern int test_nc_put_varm_float(void);
+extern int test_nc_put_varm_int(void);
+extern int test_nc_put_varm_long(void);
+extern int test_nc_put_varm_schar(void);
+extern int test_nc_put_varm_short(void);
+extern int test_nc_put_varm_text(void);
+extern int test_nc_put_varm_uchar(void);
+extern int test_nc_put_varm(void);
+extern int test_nc_put_varm_ushort(void);
+extern int test_nc_put_varm_uint(void);
+extern int test_nc_put_varm_longlong(void);
+extern int test_nc_put_varm_ulonglong(void);
+
+extern int test_nc_put_att_double(void);
+extern int test_nc_put_att_float(void);
+extern int test_nc_put_att_int(void);
+extern int test_nc_put_att_long(void);
+extern int test_nc_put_att_schar(void);
+extern int test_nc_put_att_short(void);
+extern int test_nc_put_att_text(void);
+extern int test_nc_put_att_uchar(void);
+extern int test_nc_put_att_ushort(void);
+extern int test_nc_put_att_uint(void);
+extern int test_nc_put_att_longlong(void);
+extern int test_nc_put_att_ulonglong(void);
+
+extern int test_nc_create(void);
+extern int test_nc_redef(void);
+extern int test_nc_enddef(void);
+extern int test_nc_sync(void);
+extern int test_nc_abort(void);
+extern int test_nc_def_dim(void);
+extern int test_nc_rename_dim(void);
+extern int test_nc_def_var(void);
+extern int test_nc_rename_var(void);
+extern int test_nc_copy_att(void);
+
+extern int test_nc_inq_att(void);
+extern int test_nc_inq_attname(void);
+extern int test_nc_inq_attid(void);
+extern int test_nc_inq_attlen(void);
+extern int test_nc_inq_atttype(void);
+
+extern int test_nc_rename_att(void);
+extern int test_nc_del_att(void);
+extern int test_nc_set_fill(void);
+extern int test_nc_set_default_format(void);
+extern int test_nc_against_pnetcdf(void);
 
 void print_nok(int nok);
 
@@ -508,26 +512,28 @@ typedef enum {
 #define NCT_ULONGLONG NCT_UINT64
 } nct_itype;
 
-int inRange3(const double value, const nc_type datatype, const nct_itype itype);
+int inRange3(const int cdf_format, const double value, const nc_type datatype, const nct_itype itype);
 
 int equal(const double x, const double y, nc_type extType, nct_itype itype);
 
+int equal2(const double x, const double y, nc_type extType);
+
 int int_vec_eq(const int *v1, const int *v2, const int n);
 
-int roll( int n );
+size_t roll( size_t n );
 
 int
 toMixedBase(
     size_t number,        /* number to be converted to mixed base */
-    size_t length,
-    const size_t base[],        /* dimensioned [length], base[0] ignored */
-    size_t result[]);      /* dimensioned [length] */
+    int    length,
+    const size_t base[],  /* dimensioned [length], base[0] ignored */
+    size_t result[]);     /* dimensioned [length] */
 
 size_t
 fromMixedBase(
-    size_t length,
+    int    length,
     size_t number[],      /* dimensioned [length] */
-    size_t base[]);        /* dimensioned [length], base[0] ignored */
+    size_t base[]);       /* dimensioned [length], base[0] ignored */
 
 int nc2dbl ( const nc_type datatype, const void *p, double *result);
 
@@ -536,6 +542,7 @@ int dbl2nc ( const double d, const nc_type datatype, void *p);
 double hash( const nc_type type, const int rank, const size_t *index );
 
 double hash4(
+    const int cdf_format,
     const nc_type type,
     const int rank,
     const size_t *index,
@@ -563,8 +570,12 @@ void check_file(char *filename);
 
 int file_create(const char *filename, int cmode, int *ncid);
 
+int file__create(const char *filename, int cmode, size_t initialsz, size_t *bufrsizehintp, int *ncid);
+
 int file_open(const char *filename, int omode, int *ncid);
 
+char* nc_err_code_name(int err);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/nc_test/tst_atts3.c b/nc_test/tst_atts3.c
index 3855e01..e5ffc25 100644
--- a/nc_test/tst_atts3.c
+++ b/nc_test/tst_atts3.c
@@ -136,7 +136,7 @@ main(int argc, char **argv)
     signed char schar_in[ATT_LEN], schar_out[ATT_LEN] = {NC_MIN_BYTE, 1, NC_MAX_BYTE};
     unsigned char uchar_in[ATT_LEN];
     short short_in[ATT_LEN], short_out[ATT_LEN] = {NC_MIN_SHORT, -128, NC_MAX_SHORT};
-    int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 128, 100000};
+    int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 127, 100000};
     float float_in[ATT_LEN], float_out[ATT_LEN] = {-0.5, 0.25, 0.125};
     double double_in[ATT_LEN], double_out[ATT_LEN] = {-0.25, .5, 0.125};
     long long longlong_in[ATT_LEN] = {-1LL, -1LL, -1LL};
@@ -211,8 +211,10 @@ main(int argc, char **argv)
        * supported C types. though the conversion may encounter
        * out-of-range values */
       if (nc_get_att_uchar(ncid, NC_GLOBAL, ATT_INT_NAME, uchar_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
+      for (i = 0; i < ATT_LEN; i++) {
+        if (i == 0 || i == 2) continue;
 	if (uchar_in[i] != (unsigned char) int_out[i]) ERR;
+      }
 
       /* This was bug NCF-171: on 32-bit platforms, bad values returned */
       if (nc_get_att_longlong(ncid, NC_GLOBAL, ATT_INT_NAME, longlong_in)) ERR;
@@ -346,8 +348,10 @@ main(int argc, char **argv)
       for (i = 0; i < ATT_LEN; i++)
 	 if (short_in[i] != short_out[i]) ERR;
       if (nc_get_att_short(ncid, NC_GLOBAL, ATT_INT_NAME, short_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
+      for (i = 0; i < ATT_LEN; i++) {
+          if (i == 0 || i == 2) continue;
 	  if (short_in[i] != (short) int_out[i]) ERR;
+      }
       if (nc_get_att_short(ncid, NC_GLOBAL, ATT_FLOAT_NAME, short_in)) ERR;
       for (i = 0; i < ATT_LEN; i++)
 	  if (short_in[i] != (short) float_out[i]) ERR;
@@ -360,11 +364,15 @@ main(int argc, char **argv)
       for (i = 0; i < ATT_LEN; i++)
 	 if (schar_in[i] != schar_out[i]) ERR;
       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_SHORT_NAME, schar_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
+      for (i = 0; i < ATT_LEN; i++) {
+         if (i == 0 || i == 2) continue;
 	 if (schar_in[i] != (signed char) short_out[i]) ERR;
+      }
       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_INT_NAME, schar_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
+      for (i = 0; i < ATT_LEN; i++) {
+         if (i == 0 || i == 2) continue;
 	 if (schar_in[i] != (signed char) int_out[i]) ERR;
+      }
       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_FLOAT_NAME, schar_in)) ERR;
       for (i = 0; i < ATT_LEN; i++)
 	 if (schar_in[i] != (signed char) float_out[i]) ERR;
@@ -373,22 +381,25 @@ main(int argc, char **argv)
 	 if (schar_in[i] != (signed char) double_out[i]) ERR;
 
       /* Read all atts (except text) as uchar. */
-      /* Shouldn't this get an NC_ERANGE error for storing -128 into an unsigned char?  Possible bug ... */
       if (nc_get_att_uchar(ncid, NC_GLOBAL, ATT_SCHAR_NAME, uchar_in)) ERR;
       for (i = 0; i < ATT_LEN; i++)
 	 if (uchar_in[i] != (unsigned char) schar_out[i]) ERR;
       if (nc_get_att_uchar(ncid, NC_GLOBAL, ATT_SHORT_NAME, uchar_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
-	 if (uchar_in[i] != (unsigned char) short_out[i]) ERR;
       if (nc_get_att_uchar(ncid, NC_GLOBAL, ATT_INT_NAME, uchar_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
+      for (i = 0; i < ATT_LEN; i++) {
+         if (i == 0 || i == 2) continue;
 	 if (uchar_in[i] != (unsigned char) int_out[i]) ERR;
+      }
       if (nc_get_att_uchar(ncid, NC_GLOBAL, ATT_FLOAT_NAME, uchar_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
+      for (i = 0; i < ATT_LEN; i++) {
+         if (i == 0) continue;
 	 if (uchar_in[i] != (unsigned char) float_out[i]) ERR;
+      }
       if (nc_get_att_uchar(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, uchar_in) != NC_ERANGE) ERR;
-      for (i = 0; i < ATT_LEN; i++)
+      for (i = 0; i < ATT_LEN; i++) {
+         if (i == 0) continue;
 	 if (uchar_in[i] != (unsigned char) double_out[i]) ERR;
+      }
 
       /* Read all atts (except text) into long long variable. */
       if (nc_get_att_longlong(ncid, NC_GLOBAL, ATT_SCHAR_NAME, longlong_in)) ERR;
diff --git a/nc_test/tst_diskless5.c b/nc_test/tst_diskless5.c
new file mode 100644
index 0000000..1dcf1b3
--- /dev/null
+++ b/nc_test/tst_diskless5.c
@@ -0,0 +1,4336 @@
+/* Diskless test in support of https://github.com/Unidata/netcdf-c/issues/400 */
+
+
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <sys/types.h>
+#if defined (_WIN32) || defined (_WIN64) || defined _MSC_VER
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+#include <fcntl.h>
+#include "netcdf.h"
+#include "netcdf_mem.h"
+
+#undef MEM
+#define DISKLESS
+#define USEINT
+
+#undef DUMP
+#undef DEBUG
+
+#ifdef MEM
+static int mem = 1;
+#else
+static int mem = 0;
+#endif
+
+#ifdef DISKLESS
+#define MODE NC_NOCLOBBER|NC_DISKLESS
+static int diskless = 1;
+#else
+#define MODE NC_NOCLOBBER
+static int diskless = 0;
+#endif
+
+#define PATH "tst_diskless5.nc"
+
+#ifdef USEINT
+#define T int
+#define NC_GET_VARA nc_get_vara_int
+static const char* type = "int";
+#else
+#define T float
+#define NC_GET_VARA nc_get_vara_float
+static const char* type = "float";
+#endif
+
+#define    HRAPY  200
+#define    HRAPX  333
+
+static T amountofprecip[HRAPY*HRAPX];
+
+#ifdef DEBUG
+static void fill();
+#endif
+
+static size_t value_count[] = {HRAPY, HRAPX};
+static size_t start[] = {0, 0};
+
+int
+main(int argc, const char* argv[])
+{
+    int status;
+    int ncid;
+    int rh_id;
+    T rh_vals[HRAPY*HRAPX];
+    int i;
+#ifdef MEM
+    int fd;
+    char buffer[1000000];
+    size_t count;
+    off_t off;
+#endif
+
+    fprintf(stderr,"PATH: %s\n",PATH);
+    fprintf(stderr,"FLAGS: MEM=%d DISKLESS=%d TYPE=%s\n",mem,diskless,type);
+
+#ifdef DEBUG
+    fill();
+#endif
+
+#ifdef MEM
+    fd = open(PATH,O_RDONLY);
+    if(fd < 0) {
+	fprintf(stderr,"could not open foo.nc\n");
+	assert(0);
+    }
+    off = lseek(fd,0,SEEK_END);
+    lseek(fd,0,SEEK_SET);
+    fprintf(stderr,"off=%lld\n",off);
+    count = (size_t)read(fd, buffer, sizeof(buffer));
+    fprintf(stderr,"count=%u |rh_vals|=%u\n",count,sizeof(rh_vals));
+    close(fd);
+#endif
+
+#ifdef MEM
+    status = nc_open_mem(PATH, MODE, count, buffer, &ncid);
+#else
+    status = nc_open(PATH, MODE, &ncid);
+#endif
+    if(status != NC_NOERR) {
+        fprintf(stderr,"%s\n",nc_strerror(status));
+	assert(0);
+    }
+    status = nc_inq_varid(ncid, "amountofprecip", &rh_id);
+    if(status != NC_NOERR) {
+        fprintf(stderr,"%s\n", nc_strerror(status));
+        assert(0);
+    }
+    status = NC_GET_VARA(ncid, rh_id, start, value_count, rh_vals);
+    if(status != NC_NOERR) {
+        fprintf(stderr,"%s", nc_strerror(status));
+        assert(0);
+    }
+    nc_close(ncid);
+    fprintf(stderr,"|amountofprecip|=%d\n",HRAPY*HRAPX);
+    for(i=0;i<HRAPY*HRAPX;i++) {
+	if(amountofprecip[i] != rh_vals[i]) {
+	    fprintf(stderr,"mismatch: %u\n",i);
+	    exit(1);
+	}
+    }
+    return 0;
+}
+
+#ifdef DEBUG
+static void fill()
+{
+    int i,j;
+    for(i=0;i<(HRAPY*HRAPX);i++) {
+	amountofprecip[i] = (T)i;
+    }
+#ifdef DUMP
+    for(i=0;i<HRAPY;i++) {
+      for(j=0;j<HRAPX;j++) {
+#ifdef USEINT
+	printf(" %d",(i*HRAPX)+j);
+#else
+	float f = (float)(i*HRAPX)+j;
+	printf(" %f",f);
+#endif
+      }
+      printf("\n");
+    }
+#endif
+}
+
+#else
+static T amountofprecip[HRAPY*HRAPX] = {
+  -47, 2, -36, -48, 78, -23, -99, -48, -4, 90, -47, 80, -20, 35, -63, -45,
+    52, -40, 58, -52, 75, 56, -80, -26, 72, 18, -28, -12, -79, -23, 34, 24,
+    5, -11, 73, -8, 40, -69, 46, -20, -6, 23, -36, 96, 34, 42, 27, 91, 72,
+    -26, 38, 47, -22, 41, -77, 31, -61, 36, -10, 68, 71, 24, 25, 44, -25, 49,
+    -7, -20, 97, 0, -13, -21, 58, 56, -50, 75, 35, 53, 5, 96, -5, -60, 36,
+    75, -72, 19, -58, -72, -75, 16, 22, 73, 34, 92, 56, -50, -6, 25, 79, -63,
+    -61, -40, -37, -99, 53, 49, -57, 5, -17, -100, 68, 0, -87, -88, 38, 77,
+    -83, -81, 48, -73, 82, 92, -77, 63, -8, 99, -83, 27, 64, 17, 73, 79, -66,
+    45, 71, -53, 40, 86, -84, -8, 20, -94, -100, 60, -87, 92, -73, -32, -74,
+    66, 47, -32, -82, -14, -21, 84, -100, -41, -7, -19, -50, 57, -76, -95,
+    85, -16, 35, 72, -11, -45, 40, 53, -64, 61, 17, 66, 44, 82, 45, -37, 9,
+    66, 89, -13, -1, -32, -78, 62, 10, 80, 93, -65, -57, -92, 78, 32, 4, -51,
+    66, -5, 36, 82, 33, -100, -34, 28, 74, 32, 84, -6, -67, -39, -61, 52, 53,
+    60, -80, -89, 60, -22, 58, 72, 20, -28, 19, 2, -89, -40, -86, 60, -5, 68,
+    26, 14, 86, -33, 64, -67, -26, -50, -7, -65, 8, -40, -19, 10, -93, -33,
+    -60, -30, -85, 22, 25, 43, -59, 82, -45, 43, -49, -65, -31, 50, 21, -87,
+    -41, -72, 8, 28, 75, 56, 28, -72, -32, -84, 76, -42, -78, -16, -94, -16,
+    57, 73, -22, 54, 32, -100, -87, 39, -41, -1, 87, -51, -95, -88, -28, 25,
+    30, -6, -83, -60, -16, -27, 7, -46, 29, 83, 2, 57, -78, -26, -96, 64, 40,
+    -60, 11, -78, -41, -82, -44, -82, 48, 85, 52, 36, 81, -33, -20, -62, -67,
+    9, -53, -96, 52,
+  -98, 7, -49, -59, 89, 86, -68, -77, -44, 69, -79, 85, 55, 35, 21, 44, -33,
+    83, 28, -96, 79, 31, 34, -76, 9, 61, -60, 12, 94, -5, 13, -85, -88, -28,
+    -81, 61, -13, 5, 58, -44, 22, -14, -20, -47, -44, 98, -16, 8, -18, -22,
+    -63, -15, -85, -67, -61, 66, 2, 4, -12, -26, -1, 29, 25, 21, -52, -55,
+    91, 42, -11, -36, 26, -60, 10, 19, -93, 71, 7, 49, 69, -58, -77, 72, 46,
+    -61, -90, -43, 78, -52, 95, 89, 90, -97, -96, 31, -79, 42, 53, -54, 4,
+    -32, -56, 9, 68, 19, 40, -17, -26, 88, -21, 66, -20, -23, -22, -84, -69,
+    12, -80, -60, -88, -82, 30, 34, 72, 46, -3, 96, 48, 91, -67, 95, 53, 92,
+    -40, -22, 35, -27, 99, -78, -14, 21, 39, 52, -6, -22, -93, 87, -79, -74,
+    0, -50, -5, -63, 50, -31, 78, -66, 61, 31, 80, 99, -72, 10, 56, 99, 84,
+    -26, -76, 22, 53, -87, -88, -98, -39, -57, -43, -97, -93, -22, 52, -88,
+    0, -39, -95, -12, -1, 20, 90, -78, -42, -70, 15, 89, -84, 39, -59, 82,
+    -16, -35, -95, -23, -49, -90, 86, -10, 39, -7, -83, 18, 7, -31, -9, -47,
+    -13, -48, -80, 33, 69, -1, 89, 81, -36, -28, -74, -97, -87, -61, 55, 77,
+    28, -86, 4, 77, 35, 44, 98, 64, 60, 74, 15, -67, 58, 95, 58, -53, -15,
+    76, -89, 62, 4, -80, 16, -7, 17, -96, -78, 32, -91, -29, -49, -59, -98,
+    89, -1, -32, 24, 67, 59, -47, -49, 36, -57, -55, -80, -26, 7, -9, 41,
+    -12, -79, 60, -60, 46, -67, 2, -94, 84, 36, 44, -28, 31, -46, 13, 30, 0,
+    -2, -27, -59, 18, -21, -42, 18, -46, -33, 37, -77, 17, -86, 37, -41, 53,
+    -17, -98, -1, -88, 4, 46, 42, -80, -61, -34, -60, 35, -94, 29, 16, -82,
+    -47, 40, 21, 80, -82, -44, 65,
+  -46, 4, 35, 21, -10, -49, -77, 56, -96, 11, -43, -11, 87, 13, -43, 8, 14,
+    11, -21, 82, 66, -12, -89, -2, 86, 2, -29, 51, 98, -7, -42, -30, -45,
+    -48, 74, -13, -30, 78, -14, -46, 7, 49, 72, -16, -65, 53, -72, -7, 25,
+    82, 83, 59, 95, -53, 75, 59, -81, -21, 13, 67, 76, 18, -70, 87, 32, 40,
+    -77, -46, 29, -93, -71, 59, 53, -13, -52, 83, -76, -24, -34, -86, 93,
+    -54, 69, 71, 53, -77, -17, -20, 95, 38, -83, -71, -44, -71, 31, -32, -11,
+    -57, -93, 0, 54, -8, 92, 79, 84, 84, 6, 18, -86, -80, 74, -91, 98, 81,
+    77, -91, -50, -78, 6, 39, -17, 50, -43, 14, -72, -33, -50, -60, 74, -63,
+    -19, -75, -91, -24, 99, 50, 1, -82, 1, 42, -26, 20, 74, -78, 3, -7, -67,
+    14, -13, 65, -67, -33, -61, -81, -4, 0, 28, 81, 12, -76, -13, 53, -80,
+    16, 54, 37, -18, -99, 22, -49, 58, -20, 37, -30, 58, -38, 23, 98, -27,
+    53, 48, -2, 62, -91, -5, -77, -23, -60, -61, -55, 67, 8, 9, 47, -2, -66,
+    -27, -91, -16, 35, -62, -18, -71, -24, 5, 20, -6, -65, 84, -70, 72, -47,
+    64, 70, 30, -24, 60, 5, -59, 35, -100, -87, -24, -45, 36, 45, -84, -73,
+    41, 33, 50, 23, 75, 87, 99, -26, -37, -26, -73, -58, -64, 87, 32, -96,
+    86, -23, -82, 38, -52, -15, -47, 15, 99, 83, -64, 43, 98, -57, -77, -8,
+    -76, 8, 79, -72, 99, 94, -8, 84, 8, 31, -55, -23, 52, -14, 62, 74, -97,
+    48, -67, 67, -76, -1, -38, -10, 87, 58, 42, 26, -13, 13, -59, 15, 69,
+    -66, -10, 79, 16, 86, -13, 41, -65, 46, 57, 30, 48, -100, -4, -5, -24,
+    89, -71, -31, -36, -60, -7, 49, 2, 18, 89, -6, 52, -76, 24, -64, -49,
+    -93, -92, 81, -4, -64, -14, -79, 10,
+  1, -3, -38, 45, 20, 49, -67, -7, 19, 82, -65, 96, -1, 58, 34, -8, 90, -79,
+    22, 65, 29, -84, 21, -33, 79, -30, -74, 60, 41, -49, 61, -8, -76, 51,
+    -76, -54, -24, -97, -30, 21, 87, 20, 29, -94, 79, -16, -70, -27, 95, 60,
+    -47, -83, -7, 74, -65, -39, 38, -43, 94, -79, 35, -58, 36, -39, 73, -89,
+    85, -45, -88, 27, 77, -60, 29, 8, 74, 74, -17, 97, -84, 72, 96, 63, 41,
+    -64, 42, 8, 76, -40, 80, -96, 73, 68, 87, -3, -25, 32, 83, -44, -29, -42,
+    25, -44, 48, -15, 74, -62, -89, -47, -61, 49, 35, 76, 49, -80, 75, -64,
+    43, 13, 63, 32, 88, -37, -69, 90, -31, 24, -7, 39, -100, 39, -95, -65,
+    -21, 8, -54, 80, -88, 72, -11, -24, 27, 69, 89, 91, -94, 15, -95, 96, 37,
+    69, 26, -20, -3, 93, -67, 84, 40, 48, -78, 10, -95, 31, -8, -33, -71, 23,
+    -52, -59, 60, -91, -21, 73, -14, -92, 22, -100, -45, 95, 49, -19, 12,
+    -41, 36, 46, -64, -51, -100, 81, 8, -79, -8, 55, 33, -49, -42, 64, -31,
+    -68, 64, 43, -60, 27, -66, -29, -3, -100, 91, -100, 33, -92, -48, -81,
+    -15, -35, -8, 34, -87, -32, 33, -77, 47, -80, 3, 84, 60, -6, -18, 50,
+    -79, -89, 16, 94, 44, -4, 80, 6, 57, 71, -69, -26, -7, -53, -59, 91, 93,
+    92, 54, 91, 2, 18, -48, 13, 7, -92, -62, 59, -49, -1, -51, 82, 36, -15,
+    -1, 98, 8, 74, 98, -84, -51, -86, 40, -74, 53, -42, 0, 63, -67, 13, 32,
+    -64, -74, 41, 8, -90, 64, 18, -78, -78, 72, -36, 63, 0, -3, -83, -40, 0,
+    -7, -93, -61, 1, 2, 94, 77, 96, 35, 28, 18, -3, 58, -49, -81, 90, 89,
+    -23, 6, -33, -80, 86, -51, -11, 51, 12, -9, -54, 86, -33, 43, 41, -52,
+    76, -25, -14, -18,
+  43, -95, 27, -41, -28, 46, 10, -88, 4, 52, -72, -7, -67, 94, 0, -5, 85, 82,
+    8, 66, 80, -54, 8, 18, -77, 62, 93, 86, -35, 86, 6, 69, -30, 31, 70, 8,
+    23, -77, -14, -51, 71, -6, 56, 86, -53, 56, 74, -48, 94, -31, 17, -25,
+    46, -12, 27, 8, 95, -21, 72, -57, 32, -13, -23, -49, -71, 61, 96, -11,
+    12, -78, -24, -24, 59, -66, 28, 63, -40, -76, -95, 99, 44, 23, -20, 3, 1,
+    -74, 76, -25, -52, 26, -31, 82, -85, 14, 66, -42, -87, -16, 6, -68, 34,
+    -22, -3, -75, 90, 49, -40, -83, 91, -48, 13, 95, -34, 8, 75, -35, 74,
+    -71, 6, 59, 19, 22, -97, 24, -23, -39, 6, -11, 83, -9, -33, 48, -32, -56,
+    -41, 87, -64, -51, -72, -54, -46, -83, 19, -44, -96, -39, -74, 1, -38,
+    40, -46, 70, -27, -83, 59, 43, -93, -5, 6, -23, -72, -89, 65, -33, 75,
+    -1, 45, 22, 39, -86, -97, 41, 0, 20, 14, 75, -30, -36, 7, -28, 97, 19,
+    -90, -70, -52, 99, 55, -87, -69, -61, -70, -20, 31, -5, -80, 40, -10, 2,
+    -82, -78, 94, -73, -71, -75, 92, 83, 21, 36, 54, -72, 9, 1, -99, -49, 19,
+    -79, 62, -42, -25, -19, 78, 20, 82, 89, -3, -9, 85, -99, -68, 91, 27, 31,
+    -97, -45, -75, 80, -89, -37, -97, -37, 25, 6, 49, 51, -74, 87, 91, -3,
+    -90, 63, 2, -39, -72, 27, 55, 84, 70, 4, 39, -88, -16, 61, 77, -30, 22,
+    -75, 40, 63, 71, 62, -37, -99, 2, -66, 58, -20, -12, 85, 37, 73, -16, 31,
+    7, -71, 65, -93, 41, -66, -48, -5, 27, -19, -26, 82, 55, 54, 60, 75, 44,
+    -14, -89, 31, 46, -84, 92, -90, 80, 55, 56, -92, 89, 38, -11, 47, 87,
+    -98, -69, 1, -57, -87, -76, 41, -22, 69, -100, -40, 46, -31, 14, 16, 24,
+    43, 77,
+  13, -11, -88, -34, -19, 8, -55, 56, 35, -10, 71, 35, 93, 89, 62, 93, -92,
+    -13, -43, 7, -78, 29, -48, 28, -69, -74, -74, 98, 4, -34, -90, 26, 9,
+    -82, -69, -92, 19, -70, -55, 42, 51, 99, 15, 19, -21, 89, 56, 58, 17,
+    -51, 9, 1, -91, -30, -21, 13, 95, -38, 38, 40, 54, -32, 90, -19, 50, -71,
+    -33, -37, 28, 68, 20, -10, 66, 3, -29, 42, -5, 80, -7, 42, 86, 77, 67,
+    43, -83, 9, -54, 12, -80, -87, -44, -1, 99, -38, 18, -7, 20, 10, -94,
+    -47, 63, -86, -24, -37, 73, 95, -28, 73, -9, -86, 97, -43, 93, 65, -91,
+    -16, 45, -27, -78, 43, 6, 4, 59, 6, 15, -75, 96, -27, -75, -88, -99, -74,
+    -43, 57, 7, -47, -19, 83, -78, 2, -69, 21, -5, 57, 94, -35, 81, 56, 76,
+    -99, -25, -26, 42, 43, -49, -28, -47, -33, 14, 25, 45, 15, 52, -78, 49,
+    -11, 68, 53, -42, -66, -64, 27, -57, 8, -83, -80, 64, 28, 34, 33, 55, 23,
+    -65, 58, -52, 30, 8, -85, 17, 8, 17, -32, 63, 70, 77, 29, 88, 98, 37,
+    -44, 18, 39, 20, -98, -27, 35, 75, 59, 92, 98, 97, 20, -8, -62, -85, -39,
+    -24, 97, -74, 63, 17, -74, -27, 74, -18, -56, -41, -96, -63, -16, 75,
+    -42, 59, -5, 39, 59, 23, -36, 50, -46, 58, -25, -12, 3, -35, 30, -46, 45,
+    10, 82, -93, -20, -85, -98, 80, -58, 0, 56, 81, 39, 16, -58, -5, -71, 37,
+    -68, -42, -85, -87, 4, -10, 77, -17, 14, -38, -72, -22, 73, -63, 44, -19,
+    27, -77, -98, -19, -86, 48, 71, 5, -66, -21, 59, -66, -8, -88, 46, -13,
+    -1, -39, 9, 67, 92, 32, -81, -53, -35, 50, -35, -53, -68, -72, 63, -5,
+    -68, 23, -16, -3, 36, 34, -45, -68, 43, 33, -61, 47, -1, 96, 86, -6, 69,
+    28, 60, -65,
+  -78, 3, 9, 97, 63, -76, -56, -100, -28, 40, 5, 14, -49, 13, -62, -71, 68,
+    50, 61, 67, -97, 32, 2, 50, 1, 41, 12, -53, 17, -50, -94, -13, -36, -1,
+    -41, -82, -70, -28, -72, 99, 82, -32, 48, -20, -17, 77, 31, -1, 90, -79,
+    -48, -83, 65, 80, 83, 77, -28, 22, 3, -18, 69, 31, -14, 10, -49, -13,
+    -16, 98, -58, -59, -53, -7, 52, 45, 87, -62, 28, -62, -3, 1, 8, 46, -84,
+    56, 88, -38, -77, -73, -57, -64, 33, 83, 21, -33, 11, -52, 52, -39, -74,
+    -42, -38, -65, 72, 19, -18, 26, -55, -6, 0, 94, 98, 56, -4, 98, 7, -45,
+    26, -91, 91, 53, 51, 63, -25, -37, 43, -41, 46, -47, 31, 13, -47, 1, 97,
+    -34, 45, 49, 81, 67, 72, 52, -57, 74, 99, 5, -78, -22, -79, -79, 30, -98,
+    -11, -74, 68, 44, -76, 13, 5, -37, 4, -47, 73, -87, -44, 10, 21, -92,
+    -26, 55, 44, -52, -2, -31, -28, -40, 42, -92, 62, 4, 36, 1, 63, -68, 3,
+    -6, -10, 62, -9, -99, -91, -81, -92, -56, 71, -65, 72, 86, -37, 59, -36,
+    13, 48, -31, -44, 11, -67, 70, -50, 50, -56, 52, 12, -67, -3, 9, -41, -8,
+    24, 50, 10, 75, 36, 2, -25, -59, 33, -53, 90, -95, 92, 78, -28, 37, 20,
+    -58, 46, 65, -100, -59, 73, -20, -4, -7, 2, -67, 72, 25, 52, -55, 40,
+    -51, 75, -80, -22, 49, -79, 14, 78, -19, -27, 91, 17, -25, 41, 34, -11,
+    -94, -94, 37, -98, -61, -59, -30, 8, 61, -15, 29, -65, -54, 9, -14, -38,
+    62, 49, -27, -35, 96, 93, 17, 70, -59, 63, -19, -21, 75, -50, -5, -44,
+    18, -48, 30, -3, 67, 7, -31, -84, 97, 73, -41, 40, -62, -41, -94, 95,
+    -53, 80, -75, 2, 77, -21, -52, 41, 13, -40, 97, -76, -39, -18, 93, -97,
+    43, 94, -98, -92,
+  -56, 36, 82, -94, 53, 2, 66, -63, -72, 7, -39, 72, 69, -44, 12, -9, -66,
+    -20, -81, -94, -44, 8, -61, -59, 89, 58, 57, -43, -57, 71, -66, 45, -81,
+    47, -97, 24, 52, -14, 60, -12, 33, -71, 91, 45, -35, 2, 84, 62, -93, 26,
+    -99, 3, 6, 9, -50, 76, -37, -19, 83, -78, -56, -64, -93, 34, 46, -17,
+    -12, 73, -22, 41, -55, 25, 75, -24, -53, 88, 39, 58, -92, -83, -30, 81,
+    -20, 64, 97, -54, -30, 15, -72, -49, 15, 5, 19, 3, 45, 7, -62, 76, 59,
+    75, -97, 56, 38, 14, -28, -83, 82, 27, -96, 80, -33, -12, -5, 57, -47,
+    56, 40, -72, 15, 73, -46, -42, -42, -23, 57, 44, 91, -68, -9, -50, 56,
+    94, 29, 2, 4, -46, 76, -22, 93, -38, 98, 29, -85, 88, -32, -92, -83, 72,
+    6, -44, -59, 11, -60, 89, -6, 35, 40, -9, 71, -30, 82, -30, -74, 89, 59,
+    53, 90, 54, 25, -51, -76, 55, -92, -8, -52, 86, -43, -67, 50, -12, 12,
+    36, -83, -12, 52, -49, 32, 92, 19, -50, 7, 70, -64, 0, 89, 71, 9, 35,
+    -92, -87, -90, -33, 54, -26, -44, 38, 6, -2, 92, -15, -9, 4, 91, 35, -86,
+    11, 48, 95, 31, 44, -5, -97, 19, 92, 25, 46, 29, -42, -51, -1, 89, -12,
+    15, 18, -11, 77, 12, -97, -21, -49, -50, -53, 17, -13, 93, 29, -67, -71,
+    18, 85, -28, -74, -18, 86, 12, -100, -99, 29, 17, 46, 58, 77, 9, -89, 37,
+    1, -60, 79, 72, -18, -74, -76, -71, 89, -94, 91, -100, 8, 29, -32, 61,
+    -66, -19, -35, -62, -7, -36, 90, 96, 55, 6, 76, -78, 70, -80, 25, -93,
+    50, -9, 74, 39, 17, -92, 67, -57, -21, 40, 79, 18, -58, 92, 20, 3, -23,
+    -64, -89, 35, 46, 53, -75, -2, -34, -27, -86, 27, 85, 67, 45, 14, -94,
+    54, -32, 58,
+  79, 74, 33, 3, 35, -11, -20, 61, -41, 35, -3, 81, -62, -9, 24, -44, 50, 68,
+    -33, 42, 30, 47, 82, -8, -7, 12, -95, 69, 85, -17, -65, 77, 51, -25, -49,
+    -88, -30, -7, 52, -63, 43, 34, 64, 37, 62, 50, 25, 84, 91, 53, 41, 80,
+    15, 78, 86, -45, 4, 14, 69, 98, -6, 61, 22, -73, -23, 93, 86, -1, 99, -7,
+    -20, 87, -26, 77, 27, 51, 29, -93, -91, 13, 66, 63, 12, 4, 25, 24, 69,
+    -36, -10, 96, 85, -73, 59, 45, -22, 46, -100, 53, 39, -95, -7, 29, -38,
+    92, -35, 46, 98, -93, 11, 41, -22, -55, 42, -59, -15, -51, 85, -12, 91,
+    -5, 94, 78, 79, 59, 45, -41, -51, 37, 9, 10, -89, -61, 6, 94, 63, -31,
+    65, 73, 74, -2, 93, 98, -55, 21, 8, 92, 30, 22, 2, -37, 0, -67, 78, 75,
+    -2, -87, 10, -86, 2, -19, 43, -62, 5, -68, -54, -57, -12, -95, 94, -72,
+    -27, 61, 3, 46, -7, 39, 58, 50, 58, -15, 14, -39, 99, 12, 70, -47, 98,
+    -17, 75, -36, 77, 84, -63, -21, -85, 87, -59, 76, -32, 51, -48, 37, 79,
+    93, 36, 1, -44, -87, 60, 34, -26, 70, -53, 72, -92, -93, 1, -77, -93,
+    -48, -32, 53, 20, -63, -62, -39, 76, -100, -12, 94, -64, 99, 98, -91,
+    -85, 49, -76, 58, 53, -5, -36, -41, 4, -61, 24, 85, -63, 72, 41, -84, 10,
+    19, 15, 63, 94, 16, -80, -22, 84, -99, -61, 51, -37, 21, 27, -67, -18,
+    94, 64, -2, 76, -87, -88, 21, 53, 58, -10, 16, -74, 82, -42, -42, -76,
+    -14, 85, -82, -1, 34, -10, 64, -41, 87, -6, 84, 77, 85, -47, 27, 36, 89,
+    13, -83, -37, 12, 10, 47, 43, -75, -41, 73, -14, -2, -10, 86, 93, 1, -17,
+    66, -60, 99, 73, 24, 65, 2, -77, -82, -57, 3, 24, -35, -79, 9, 3,
+  2, 47, 22, -45, 77, -45, -81, -69, 63, -7, 11, 4, 41, 14, -57, -17, 47, 98,
+    13, 91, 63, -8, 41, -47, -28, -45, -88, 44, -63, -19, 30, -16, -41, 94,
+    -55, -91, -93, -27, -85, -49, 65, -38, 38, -17, 18, 78, -81, -16, 32, 9,
+    -76, -57, 80, -11, 72, -71, 87, -95, 85, -8, 85, -9, 49, 1, 1, -10, -27,
+    14, -47, 44, 50, -10, -66, 7, 63, 12, -99, 27, 15, -20, 72, 65, 71, 71,
+    17, 95, 47, -98, -8, -13, 0, 15, -29, -90, 17, -60, 56, 19, 37, -66, -34,
+    -58, 81, -75, -47, 13, 95, 95, 22, -25, -44, 54, -72, 66, 46, 94, -6,
+    -75, -61, 36, -81, -50, 59, -40, -32, 27, 90, 18, -48, -73, 81, -46, -91,
+    57, 89, -46, -18, 59, -58, -99, 33, -41, 23, 68, -22, 17, 93, -57, 3,
+    -74, 27, 46, 71, -54, -30, -88, -82, -73, -87, -29, 92, 14, -30, -63,
+    -54, -15, -1, -55, 34, 40, 77, 18, -86, -97, 56, -43, -72, -42, -63, -54,
+    -9, 54, 63, 34, -75, -84, -3, 60, -88, 28, -29, 56, 0, -38, 71, -81, -68,
+    38, 74, -44, 94, 26, -53, 33, 90, 72, 20, 10, 48, 97, -48, 55, 11, -27,
+    -92, -73, 24, 42, -12, 37, -89, -71, 60, 92, 68, 36, 86, 70, 63, -88, 0,
+    -9, 21, -28, 56, 65, 33, -58, 45, -54, -83, 22, -3, 41, -28, -89, 36,
+    -80, -75, 3, -21, -98, -51, -73, -82, -26, -86, -26, -55, -16, -64, -84,
+    -55, -73, 31, -29, -36, 15, 39, -27, -79, 9, 8, 21, -77, 6, 42, -1, -70,
+    -95, 73, -100, 46, -34, 36, -66, -5, -39, -45, -52, -56, -96, 91, -34,
+    69, 24, -89, 0, -11, 91, -41, -86, -8, -44, -10, -24, -10, 43, -30, -29,
+    -76, -19, 61, 76, 29, 83, -28, -15, 66, 8, -26, -74, -57, -21, 32, 61,
+    -49, -57, -90, 50, 54, -33, -68,
+  -13, -4, 35, 3, -17, 74, -74, -56, -77, 21, -5, 72, -43, -29, -54, 22, -47,
+    5, 92, -12, 13, 68, 15, -57, -34, 20, 70, -36, 63, 94, 12, 14, 12, 27,
+    -33, -85, -72, 11, 99, -84, -85, -23, 82, 63, -80, 72, -4, 19, 60, -44,
+    92, 75, -55, -84, -70, -29, -94, 21, 40, 71, -81, 88, 66, 58, -40, 81,
+    -15, 32, 82, -56, -17, 44, 62, 18, -29, 72, -70, -79, 77, 22, 95, 59, 80,
+    -73, -58, -35, 60, 89, -82, -47, -18, 45, -61, -97, -14, -24, 13, 43, 66,
+    -44, -18, -48, -7, 26, -56, 66, 34, -62, 23, 44, 69, -85, -5, -57, 93,
+    -54, -26, -92, -17, 54, -79, 52, -48, 74, -38, 89, 23, 58, 93, 4, -31,
+    69, 5, 82, -42, 9, 57, 60, -27, -22, -66, -26, 8, -44, -88, 68, -60, 26,
+    88, 37, -90, -80, -38, 2, 41, -11, -40, -16, 1, -13, -27, -19, 36, 78,
+    -47, 80, -94, -68, 23, 2, 97, -62, 49, -49, -14, -92, 63, -64, -55, -71,
+    40, -84, 79, -1, -76, 47, -96, -36, 15, 47, 30, -17, 22, -85, 96, 69,
+    -40, 67, -9, -46, 15, 38, -86, 56, -55, -76, 94, -62, -9, -25, 46, 80,
+    -1, -97, -68, 0, -21, -24, 58, -28, -74, -90, -8, -16, 9, 36, -90, 91,
+    64, -70, -31, -28, -11, -62, 35, 99, 15, 25, -48, 92, 97, 13, -58, 38, 8,
+    -59, 38, 35, -43, 73, 39, -80, 41, 19, 12, 97, 44, -75, 58, 40, -91, -80,
+    -85, 14, 97, 11, 13, -6, 25, 39, -10, 14, 47, -34, -49, 12, 49, 26, 10,
+    11, -78, -7, -92, 47, 93, -27, 57, -41, -22, -78, -30, 4, -30, 3, -70,
+    14, 75, -76, -31, -22, -88, 65, -61, -31, -95, -96, 59, -14, -28, 2, 81,
+    96, -6, -13, 19, -90, 39, -51, -33, -91, 95, -34, 79, 31, -96, -60, 71,
+    25, 3, 27, 45, 30, 58,
+  -88, -41, -8, -60, 48, 88, 51, -57, -82, -37, 74, -51, 72, 6, -82, -34,
+    -39, -93, 26, -94, -98, -67, 45, -36, -68, -57, 10, -100, -40, 38, -88,
+    -1, -89, 59, -98, 35, -2, -60, -91, 32, -57, -30, 17, -18, 87, 6, -19,
+    -54, 14, 33, -55, 54, 70, 35, -53, 41, -64, 24, -46, -32, -69, 70, 0, 90,
+    19, 45, 28, -68, -47, -49, 83, 38, -79, 0, 99, -17, -83, 71, -11, -17,
+    -93, 14, -33, -41, -39, 80, -78, -70, -22, 49, -68, -74, -28, 66, -75,
+    96, 6, 21, -9, 21, 33, -69, 40, -47, 54, 13, 74, -84, -57, -48, -23, -13,
+    23, -90, 80, -29, -78, 97, 96, -57, -58, 89, 52, -13, 0, -57, -48, -45,
+    -88, 1, 74, -86, -91, -95, -85, -34, 75, -52, -20, -57, 64, 49, -29, 88,
+    -45, 25, -26, 82, 77, -33, 58, 10, 30, -41, 62, 80, -8, 95, 7, -21, -25,
+    -48, 78, -2, -72, -98, -53, 51, 25, -11, 63, -24, -87, 75, 17, 30, 59,
+    30, -53, -34, 91, 54, -78, -43, 93, -40, -44, 5, 99, 67, 8, -36, 39, 87,
+    -28, 22, -66, -99, -32, 85, -94, -80, -8, 17, -7, -81, -69, 34, 94, 86,
+    -7, 62, -71, 53, 96, -35, 28, 21, -34, 51, -39, -5, 68, 17, -95, 34, 43,
+    43, -41, -20, 33, -2, 59, -83, -55, 62, -80, -48, -83, -53, 11, -36, 69,
+    1, 30, -93, -54, -73, 15, 20, 81, -30, 55, -94, -96, 12, -93, 68, -100,
+    -18, -73, 71, -82, -33, 88, 49, 87, -2, -7, 19, -23, -97, 46, 37, -15,
+    -49, 9, 19, 16, 74, 65, -7, 24, -16, 88, -20, 86, -37, -88, -63, 36, -37,
+    -22, -20, 21, 84, 8, -1, -23, -77, 91, -90, 2, 35, -52, -66, 13, -40, 38,
+    -29, -46, 80, 22, 49, -33, 16, 85, -15, -82, 31, -88, 86, 11, -30, -90,
+    -51, -19, -10, -18, -24, -52, -68, -92,
+  -8, 56, 89, -65, 6, -49, -39, 93, -46, 15, 77, -27, 47, 53, 45, -39, 37,
+    -92, -47, -2, -81, 84, 44, 37, 49, -94, 39, -18, -44, -23, 39, -3, -100,
+    69, 48, -2, 44, 25, -59, -44, -93, 25, 91, 25, 13, -54, 9, 63, 8, 86, 76,
+    19, -45, 25, 78, 46, -50, -67, 66, -28, -99, -33, 1, 99, -43, 94, 35,
+    -53, 78, 66, -13, 9, 4, 63, -27, 35, -43, -31, 39, -60, -97, 66, -3, 53,
+    18, -17, -40, -42, -57, 84, 89, 7, -71, -53, -17, -73, 70, 90, 32, 62, 5,
+    -11, -93, 87, -5, 3, 66, -2, -1, -41, -43, 68, 50, -3, 34, -56, 35, -51,
+    24, 88, -53, 19, 37, 48, 93, 26, -4, -1, 99, 37, -57, -39, -22, 4, -34,
+    95, 56, 26, 66, 48, -66, 88, 65, 19, -65, 53, -33, 60, -99, -41, -10, 92,
+    -51, -18, 19, -79, -28, 85, 27, -47, -74, -84, -30, 68, 73, -62, -15, 84,
+    72, 49, 37, -54, -14, -91, 32, 97, 55, -6, -41, 68, -75, -65, -63, -15,
+    -22, 65, 28, -99, -62, -98, 42, -99, 74, -98, -99, -66, -20, 68, 95, -63,
+    -24, 44, -40, 89, 56, -73, 10, 58, 0, -73, -6, -38, 99, -38, -19, 43, 99,
+    53, 41, -79, 71, 17, 46, 4, -16, -80, 20, -50, -33, -23, 11, 88, -13, 2,
+    -81, 55, 53, 43, -37, -99, -53, 82, 26, 98, 65, 7, -92, -3, 5, -30, 59,
+    -23, 44, -56, 58, 69, -14, -13, -9, -94, -83, -13, -64, 71, -29, 72, 95,
+    39, 58, 64, -81, -93, -33, -69, 95, 88, 26, 49, -90, -13, -72, -42, -22,
+    83, -65, -27, -51, 41, 5, 94, -19, -86, 18, 28, 42, 93, -92, -24, 42, 30,
+    99, -19, -64, 84, 23, -22, 37, 90, -89, -43, -27, 13, -8, -87, 72, 4,
+    -18, 25, -38, 84, -15, 92, -24, 96, -31, 59, -26, -88, 27, 82, 10, 10, 37,
+  29, 97, 59, 6, 9, 40, -85, -48, -10, -80, -66, -21, 24, -49, 25, -49, -39,
+    9, -56, -39, 56, -70, -46, 65, -63, 80, 77, 6, 28, 40, -57, 4, 32, 6, 94,
+    -18, -85, 94, -9, 75, 21, 24, -8, -23, 74, -92, 34, 92, -19, 84, -94, 49,
+    33, 29, -9, -9, 94, -8, -2, -68, -40, -14, -14, -20, 57, 41, 4, 33, -66,
+    57, 74, -82, 95, -42, 7, -69, -87, -13, -69, 68, -95, -35, 66, 43, -62,
+    22, -86, -80, -84, -86, -92, 36, 57, -59, 20, -45, 7, -95, -12, -2, 7, 6,
+    -73, -72, 6, -95, -78, 80, 96, -74, -44, 56, -28, 20, 54, -13, -22, -16,
+    -63, 69, 11, 76, -39, -78, 61, 60, -42, 49, -39, -95, 60, 85, 76, -89,
+    56, 46, -21, 71, -13, 0, 45, 82, 88, 57, -26, -14, -67, -55, -77, -97,
+    -50, 12, -78, 27, 60, -50, 78, 72, 93, -70, -61, -2, 81, 62, -87, 75,
+    -72, 25, -5, -21, -100, 55, -13, -11, 87, -20, 43, -33, 38, 31, 1, 21,
+    -98, 47, 61, 15, 77, -18, 49, -30, 97, 48, -11, 37, -74, 45, -77, 29, 25,
+    60, 52, -61, 55, -11, -40, 39, 32, -28, -36, 51, 56, 42, 13, -82, -82,
+    -100, -71, 5, -37, 45, 9, -47, 23, -29, -42, 62, 93, -100, -77, 43, -97,
+    -86, 25, -80, 73, -74, -99, 3, -74, 96, -43, -69, 58, -51, 41, 78, 3,
+    -86, 47, -21, -8, -3, -64, -99, 54, 22, -59, -22, 4, 40, -5, -70, 35,
+    -39, -63, -54, 29, 44, 99, 65, 59, -43, -6, -71, -45, 42, 21, -30, -49,
+    -11, 77, 74, -19, -43, 53, 8, -35, 87, -59, 40, 67, 21, -23, -1, 18, -52,
+    -75, -87, -11, 11, -74, 21, 78, -97, -90, -73, 36, 65, 95, -76, 48, 65,
+    48, 41, 95, -36, 83, 15, 45, -81, 58, -32, 0, 92, 68, -26, -91, 96, -89,
+    12, -76, 29, -6,
+  68, -49, -49, -42, -56, 98, -85, -7, 24, -27, -15, -45, -38, -34, -79, -71,
+    96, -61, -48, -90, 11, -8, 15, -45, -34, -18, -17, 30, 75, -73, 88, -94,
+    68, 58, 16, 37, -35, 65, 5, -61, -2, 44, -61, -61, -18, 37, -69, -58,
+    -100, -55, -46, -40, -96, -54, -65, -65, -93, 55, 28, -81, 14, 43, 18,
+    72, 74, -24, 53, -21, -55, 45, -97, -43, -95, -79, -19, -50, 62, -67, 43,
+    -92, -18, -97, 22, 56, -17, -20, 18, -77, -79, 92, 0, 74, 16, -2, 61, -3,
+    94, 47, 66, -59, 26, -96, -20, -60, 80, 41, 70, -59, -67, -27, 14, -92,
+    -39, -85, 90, -95, 80, 27, 42, 77, 27, -79, 11, 4, -100, 17, 74, -57, 37,
+    70, -29, -83, 6, -16, 44, 2, 10, -80, -79, -52, -29, 28, 75, -68, -96,
+    -4, 86, -34, 18, -76, -21, -58, -59, -1, 54, 38, 11, 34, -11, -82, 66,
+    -59, -59, -69, 76, 19, -21, -38, -96, -14, -46, 43, -44, -27, -69, -6,
+    -56, 77, 45, 90, -46, 4, -36, 76, 40, -88, -40, -65, 39, 98, 12, 59, 50,
+    -83, 14, -18, 89, -33, 74, 81, 96, 37, -90, 50, -24, -54, 34, 88, -97,
+    -18, -96, -42, -7, 10, 12, -9, -44, 33, -52, 85, -59, -34, 20, 74, 53,
+    44, 63, -99, -3, -24, 36, -62, -9, -26, 91, -54, 42, -37, 98, 42, -48,
+    -17, -73, 45, 25, 47, 79, 81, 24, 26, 36, -66, 51, -89, 17, -62, -54, 61,
+    23, -85, -25, 65, -18, 27, -17, 4, -27, -99, 36, 82, -26, -87, -73, 32,
+    88, 25, 46, -48, -2, 11, -41, 61, 9, -91, -29, -91, -91, -99, 23, -70,
+    17, -64, -60, -98, -52, -2, -2, 33, 73, -64, 30, 77, -70, 44, 44, -51,
+    93, 64, 23, 93, -98, -52, -67, -2, -91, 94, 41, -76, -6, -16, 27, -14,
+    -1, -79, 4, -61, -10, 95, -77, 65, 44, -48, 48,
+  -47, 40, 8, -59, -7, 76, 59, 80, -60, -41, -67, 79, 40, -59, 58, -84, 95,
+    56, 21, 72, 31, 65, 48, 74, 96, -52, 43, 74, 29, -87, 76, 46, -39, 81,
+    90, -46, 67, 64, 63, -98, 71, -83, 6, 47, -15, 63, 30, 17, -5, 7, -83,
+    44, 73, 57, -91, 68, 92, -16, 65, -83, 35, -99, 50, 44, 11, -8, 58, 2,
+    77, -90, 56, -12, -6, 87, 4, 29, -83, 30, 3, 89, -25, 96, -25, 5, -98,
+    -25, 64, 67, -3, -18, 3, -8, -83, -15, -91, 86, 50, -95, -50, 71, -90,
+    -32, -80, 60, -21, 42, -73, -13, -81, -9, 92, 85, 19, -31, -79, 25, -18,
+    -60, 93, 79, -95, 70, -71, 78, 77, 8, 37, -92, 74, 81, -39, 31, -94, -9,
+    -33, 2, 96, 40, -3, -1, -16, 35, 89, 37, -76, -78, 59, 15, -84, -95, -54,
+    72, -5, -57, 76, -94, 87, -25, 45, -70, -73, 78, 62, 72, -46, -78, -1,
+    -93, -65, -13, 40, 69, 90, -6, 22, -52, -58, -87, -24, -66, -42, -29, -7,
+    -100, -29, 19, -11, -49, -33, 98, 80, -87, -89, -24, -29, -96, 93, 14,
+    -8, -35, 38, 53, 44, 15, 56, -81, 65, -87, 52, 25, 79, -34, 18, -92, -50,
+    63, -53, -2, 45, 16, -52, -28, 86, 62, 72, -52, -40, -79, -27, -63, -76,
+    -63, -10, -72, -52, 72, -16, -35, -49, 8, -44, -22, 64, -78, -50, 5, 69,
+    29, 61, 93, -52, 44, -95, -77, 72, -1, 68, 13, -97, -97, 21, -91, 28,
+    -18, -95, -54, 86, 40, -41, 34, -58, 57, 83, 97, -38, -53, 89, -90, 57,
+    -96, 64, -78, 49, 71, 58, 54, -52, 53, 7, 98, 38, -51, -72, 37, 35, 58,
+    -83, 71, -4, -83, 19, 96, -33, 53, -52, 73, -9, -31, 56, 35, -74, -69,
+    -76, -78, -45, 88, 36, -18, 39, -65, 2, -18, -31, 80, -3, -40, 12, 65,
+    12, 51, -49, -94, -63,
+  17, 94, 9, 92, 31, 90, 62, 98, -52, 5, -70, -44, 40, 6, -2, 26, 27, 0, -73,
+    -82, -36, -76, 25, -45, -44, -10, 59, -39, -94, -11, -30, 99, -83, 26,
+    -59, -21, -74, 23, 45, -33, -73, -62, -8, -30, 9, 92, -75, 11, 93, -16,
+    -16, 5, 14, -36, 91, -28, 19, -57, -4, -24, -19, -34, -11, -85, 63, 48,
+    10, -74, 49, -37, -29, -52, -79, 11, -86, 14, 32, -58, -32, -76, 15, 20,
+    92, -2, -32, -23, -95, -99, 46, -38, -66, -4, 8, -94, -45, 45, -37, 25,
+    -2, 58, 23, -76, 89, -100, -67, 77, -76, 0, 22, 69, 36, -20, -93, -95,
+    53, -44, -15, -100, 58, -93, -72, 23, 32, -61, 18, 30, -22, 62, -3, -15,
+    -30, -27, -60, -63, -15, 38, 10, -61, -6, -98, -27, 90, -6, -1, -100, 64,
+    -9, -72, 75, 27, -65, -61, 90, -91, 15, -100, -9, 30, 88, 17, -71, 74,
+    -44, -10, 86, -67, 5, 5, 41, 27, 52, 51, -93, -28, 6, -40, 3, 21, -57,
+    17, 0, 46, -27, 6, -87, 41, 85, 59, 22, 60, -77, -41, -55, 27, 19, 48,
+    -26, 9, -53, -70, 52, 52, 97, -26, 38, 10, 18, -62, 28, 36, 74, 35, 8,
+    -94, -37, 16, 79, -35, 76, -9, 62, -62, -31, -90, 28, -36, 91, 40, 94,
+    91, -49, -34, -6, -9, -3, 61, 2, -91, -28, -70, 46, 13, -50, -96, 52,
+    -30, -56, -53, 75, -20, -31, -12, 77, -91, 11, -7, 36, -65, -55, 30, -47,
+    -68, -7, 55, 76, 9, 61, -94, -16, -89, 42, 29, -100, 58, 82, -60, -90,
+    -46, 53, 40, 18, 63, 99, -28, -14, -90, -79, 95, -44, 58, 3, 61, 46, -9,
+    13, -87, -14, -49, -9, 0, -94, 53, 34, 39, 19, -20, 59, -87, -43, -87,
+    28, 62, -79, 99, 92, -55, 50, -87, 74, 29, -90, 63, -66, 16, -90, 60, 7,
+    -28, 30, 81, -57, -32, 74,
+  65, 98, -63, -38, 53, -60, -25, -14, 14, 80, 16, -34, 81, 73, 77, 50, -79,
+    -90, 54, 85, -16, -67, 91, 54, -37, -40, -61, -74, -28, -78, -14, 48, -3,
+    3, 63, -75, 85, -52, 77, -21, -77, 49, -73, -57, -65, 48, -83, -10, -86,
+    67, -83, -55, 84, 22, -32, -64, -81, -4, 60, 89, -21, 49, -89, -6, -31,
+    -64, 70, 33, -43, -38, -44, 65, 95, 20, -60, 78, 25, 88, -15, -74, 59,
+    -72, -83, 91, 51, 71, -96, 8, 53, -25, 81, 54, 5, 64, 79, -67, 95, -10,
+    -69, 97, 71, 94, -87, -24, 16, 99, -13, -67, -21, 93, -28, 21, -25, 0,
+    78, -67, 14, 79, 28, 3, 13, -33, -99, 85, 91, -87, -15, -22, -15, -1,
+    -95, -66, -70, -59, 93, 47, -5, 52, -58, -47, 94, -47, 37, 58, 88, -57,
+    -54, -51, 33, -11, 74, 3, 73, 2, 71, 40, -36, 91, 43, 39, -69, 37, -74,
+    -57, 95, 10, -25, 55, 40, -52, -7, -73, -76, 61, 44, -3, 73, -65, -86,
+    34, 96, -18, -67, -51, 56, 80, 0, -72, -67, -49, 19, -61, 61, -44, -81,
+    -88, -29, -73, -25, -8, -4, -77, -83, 47, -71, -12, 11, -50, -99, 77,
+    -96, -64, 55, 37, -96, 54, 94, -15, 90, 2, 74, -99, -63, -57, 2, -33,
+    -60, -25, 49, -39, 75, -20, 65, -66, 51, -33, -26, 1, -8, -95, -34, 40,
+    -67, -2, 69, 40, 50, 58, 54, -7, 92, -55, 6, 51, 83, -46, 87, -81, 42,
+    30, -39, 62, -22, -57, -27, -19, -75, 81, -12, 46, 58, -49, 23, -55, 77,
+    67, -42, -40, 79, 74, 62, 77, -47, 82, 35, 28, 30, 77, 20, 85, -32, -47,
+    -63, -76, -94, 10, 93, 54, -11, -70, 7, 55, -31, 38, 11, -36, 68, -83,
+    -33, -61, -33, -95, -39, 42, 60, -27, -11, -4, 43, 30, 93, -45, -60, 12,
+    27, 93, -30, 92, 47, 17, -29, -13, 0,
+  -83, -12, -18, 85, 87, 58, 46, -1, 38, -16, 58, 93, -30, 96, 22, -44, 83,
+    62, 65, 28, -31, -79, 51, 62, -73, -53, 31, 27, -44, 7, -18, -9, 3, -95,
+    11, 59, -15, 53, 51, 64, 52, -85, -58, -95, 85, -28, 17, 81, 77, -78, 22,
+    78, -98, 57, -82, 25, -50, 50, 94, 15, -62, -76, 26, -55, -100, -15, 7,
+    54, -60, -17, 8, 16, 99, 48, -31, -40, -49, 94, 85, 44, 0, 3, -23, 18,
+    -22, -41, -81, -36, 49, 60, -3, -41, 36, 4, 83, -21, 67, 15, -29, -44,
+    -72, -64, -19, -47, 45, -78, 26, -41, 43, 57, 2, -13, 84, -9, -36, -71,
+    -91, -95, 30, 14, 42, 46, 47, 46, -40, 67, -24, -46, 54, 54, -8, -97,
+    -31, -52, 89, -6, 9, -13, -20, 93, 23, -67, 72, -65, 50, -74, -51, -68,
+    68, -84, 48, -21, -94, -68, -17, -95, 83, -21, 25, -77, -73, 6, -4, -59,
+    -79, -41, -71, -96, -42, 38, -54, -35, -32, -31, -21, 68, -58, 48, 2, 92,
+    -10, -32, -10, 19, -22, 4, 20, 30, 94, -31, 29, -91, -81, -78, 90, -68,
+    74, -17, -32, 68, -29, 79, -58, -38, -80, -31, 73, -91, 11, 65, 48, -19,
+    -93, 36, 48, -60, -63, 60, 61, 50, -49, -43, -78, -48, 78, 7, 55, -32,
+    79, -87, 42, -54, -88, -52, 51, 32, 31, 56, 92, 61, -25, 6, 69, -74, 96,
+    3, -12, -37, 17, 74, 73, 80, -32, 82, 38, -44, -61, 31, 0, -8, -13, -14,
+    -39, 86, -7, -69, -29, 82, 50, 34, 19, 17, 73, 10, 61, 82, -58, -12, -4,
+    -53, -76, -9, -33, -11, 84, 72, -29, -13, -45, -70, -15, 47, -52, 84,
+    -39, 18, 51, 70, -80, 3, 36, -71, -2, 64, 94, -77, 83, 39, -75, -69, -95,
+    15, -87, -53, 98, 11, 70, -34, -37, -64, -69, 97, -93, -54, -41, 99, -18,
+    -22, 58, -56, -21, -57, -19,
+  84, 79, -12, -29, 77, -7, -48, -76, -72, 3, 43, 69, 60, 2, 90, -8, -94, 67,
+    -14, -32, -26, -6, 37, -70, -46, -62, -60, 83, -69, -96, -51, 55, -39,
+    79, -82, -50, -14, -74, -10, 34, 95, -19, 15, -35, -34, 47, -95, 10, -61,
+    -7, -92, -94, -45, -100, -52, -52, 41, 48, 49, -84, 10, -78, -95, -37,
+    -100, -48, 12, -15, 47, 1, -75, -33, 69, -27, 60, -59, 39, -68, -22, 73,
+    89, 99, 6, -68, -61, 61, 22, -70, 48, 61, 13, -24, -75, 72, -11, -42, -2,
+    -39, 3, 90, 93, -24, -24, -78, 74, -1, 69, -10, -97, 67, -9, -25, -86,
+    67, 64, -91, -89, 92, -53, -70, -90, -29, -6, 23, 48, 59, -17, 72, -49,
+    -35, 44, 34, 43, -79, 22, -77, 63, -53, -32, 3, -59, -1, 86, 65, 86, 14,
+    -72, 10, 44, 24, -69, -86, 24, 37, 31, 22, 52, 97, 34, -43, 80, -86, -33,
+    -89, 29, -10, -63, 61, 16, -43, 53, 89, -47, 15, -81, -20, 83, -81, -81,
+    -83, -50, 88, 88, 43, -13, 60, 80, -97, -2, -11, 71, -75, 42, 29, -30,
+    27, -35, 23, -16, 31, 22, 63, -29, 25, 77, 59, -93, -38, 23, -84, 7, 72,
+    -57, -89, -4, 4, 8, -92, 42, 93, 88, 98, -9, 60, 14, -25, -81, -81, 40,
+    83, -4, -32, -61, 70, -34, -54, 10, -75, -6, 60, 74, -79, -71, 2, 65,
+    -55, 47, -48, -32, 97, 27, 82, 52, -47, -26, -85, -62, 65, 4, 13, 1, 58,
+    -42, -70, 73, -51, 84, 1, -9, -3, 77, -61, 54, 2, 81, -60, 7, -21, 27,
+    53, -11, -14, -96, 54, 12, -78, -72, -76, 17, 7, -18, 41, -20, 92, 59,
+    -24, -39, -11, 34, -32, 26, 94, -16, 96, 18, 76, 74, 73, 6, -21, 71, -56,
+    -40, 41, -79, 78, -5, 15, 10, -100, 1, 36, -94, -29, 55, -79, 35, 55,
+    -61, -5, -60, 5, 64,
+  -24, -17, -78, 90, 48, 49, 95, -60, 98, 99, 43, 42, 34, 90, 35, -17, -8,
+    82, 48, 80, -27, -66, -9, 60, -60, 59, 38, -53, -83, 1, 69, -18, -20, 73,
+    74, 70, -23, 96, 47, 77, 86, -100, 26, -54, -48, -56, 32, -90, -90, -9,
+    69, 55, 26, 5, -85, 6, -92, 9, 30, -92, -53, 37, 41, -17, 67, -68, -95,
+    60, 96, 33, -6, -43, 72, -10, -7, 68, 41, -12, -57, 63, 0, 62, -74, 66,
+    59, -12, -46, -25, -69, -32, 82, -52, -37, -12, 61, 24, 72, 13, -25, -68,
+    77, 55, 68, 24, -83, 71, 55, 90, 1, -26, 88, -2, 87, 75, 24, 44, -8, 72,
+    -100, 57, 59, -20, 57, 83, 34, -88, -2, -48, -15, -28, 54, 31, -59, 71,
+    91, 66, 31, 38, 92, 22, 83, 23, 87, -92, 39, -96, -94, 78, 24, -10, -79,
+    -66, 42, -83, -93, 4, 87, -8, 47, 24, 47, 78, 36, 8, -97, -32, -30, -78,
+    -22, 3, 73, -72, 67, 14, -21, 65, -41, -49, 97, 69, 44, 68, -65, -85, 62,
+    -88, -94, 20, -82, 19, -59, -57, 13, 11, -88, 28, 7, -50, -87, -96, -39,
+    38, 36, 38, 39, -44, 37, 80, -81, 59, 82, 82, -48, 78, -16, -32, 23, -96,
+    -2, 77, -46, -53, -100, -63, -59, 7, 23, -97, -95, -29, -25, -53, -29, 0,
+    60, -29, 84, 45, -82, 59, 73, -95, 31, 17, -23, -40, -92, 76, 18, 86, 24,
+    19, -65, 40, -45, -62, -58, -27, -54, -45, 89, -5, -39, -73, 58, -29,
+    -31, 17, 32, 23, 5, -95, -65, -6, 35, 48, 85, 3, -48, -92, 3, 76, 86,
+    -27, 68, -92, -77, -26, 31, 23, 68, -73, -58, -47, 35, -89, -75, -19, 32,
+    -69, 18, 25, 20, 52, -89, -82, -11, 65, -2, -8, 26, 75, 98, 48, 71, -30,
+    1, -20, 68, -87, 56, 86, -28, -87, -51, 10, -26, -90, 69, 42, -70, 89, 31,
+  1, 45, 97, -29, -78, -76, -72, 36, -53, -44, 16, -100, -93, -63, -5, -41,
+    -53, -54, -17, -90, 51, 72, 26, 10, 33, -30, 38, 61, -16, -92, -37, -67,
+    8, 75, 67, 2, 16, 25, -26, -88, 14, -15, -78, 97, -98, 61, -63, -25, 77,
+    76, -71, -57, 65, 31, 15, 79, 44, -89, 25, -15, -57, 29, 68, -67, 93,
+    -47, 61, 76, 52, 15, -95, -29, 19, 32, -57, 74, 7, -96, 5, -37, -23, -49,
+    79, -81, 92, -82, 52, -29, 26, -38, -26, 78, 66, -87, -40, 85, 11, 83,
+    89, -46, 27, 24, 18, -26, -48, -45, 43, 63, -44, -35, 48, -67, -49, -96,
+    63, -26, 8, -84, -47, -84, -26, 22, -45, -8, -89, -92, -5, 73, 64, -9,
+    -60, -100, 76, 55, -40, -12, -9, 13, -24, 96, 49, 91, 98, 36, 15, -10,
+    38, 79, 79, -20, 98, 2, -39, 14, -3, 93, -97, -42, -15, -22, 97, 98, 8,
+    29, -25, 49, 12, -5, 82, -55, -14, -29, -42, 90, -48, 11, 93, 24, 42, 30,
+    -52, -47, -21, 25, 68, 69, 37, -68, 91, 1, -85, -80, 20, -7, -85, 52,
+    -71, 2, 88, -9, 37, -94, 52, -5, -68, 41, -57, 38, 0, -16, -33, -32, -71,
+    52, -98, -80, -51, 43, 32, 81, -54, -13, 89, 38, 99, 38, 33, -37, 10,
+    -30, -85, -6, 96, -19, 66, -54, 1, -32, -3, 13, -68, 54, -39, -94, -7,
+    -88, 93, -3, -96, 11, 1, 30, -96, 83, 81, -83, 78, 31, -33, 19, -70, -56,
+    89, 77, 31, 24, -40, 21, -61, 51, 50, 24, 27, 35, -47, 31, 91, 14, 59,
+    -92, -47, -4, -4, 63, 55, -64, 42, -56, -46, 38, 8, -12, 37, -50, -89,
+    -37, 38, 33, -32, 90, 84, 63, 3, -47, -19, 89, 51, -41, -80, 10, -34,
+    -46, -91, 1, -10, 37, -3, -57, 78, 86, 55, -37, 17, 92, 52, -1, -50, -57,
+    -71, 95, 65, 38, 27,
+  -29, 51, -86, 83, 24, -63, 18, -20, 8, -46, 27, -82, 58, -17, -67, -88,
+    -41, 89, 91, 57, 64, 62, -57, 31, -51, -87, 27, -98, -67, 44, 57, 84, 37,
+    -58, 3, 34, 40, 53, 64, -71, -35, -66, 42, -81, -44, -20, 49, 76, 28,
+    -13, 32, -93, -15, -79, 49, 53, -75, 72, 29, -62, -41, 70, 19, -43, -9,
+    -11, 3, 97, 31, 62, 37, -9, 60, 15, 73, -85, -48, -58, -97, 91, -97, -61,
+    -92, -68, -39, 51, -30, 88, 45, 3, 17, -9, 9, -48, 80, 51, 88, -34, -43,
+    -42, 65, -89, 30, 39, 84, 70, 89, -25, -32, 57, 33, -58, -88, -27, 59,
+    -84, -99, 15, 13, -5, 90, 80, 78, 76, 23, -15, -4, -25, -5, 11, 8, 55,
+    68, -85, -91, 68, 88, -19, -22, 61, -95, -42, -52, 34, 20, 35, -20, 24,
+    26, -95, -71, 89, -54, -96, -59, -43, -12, -3, -10, -10, -37, -29, 91, 6,
+    76, -58, -31, 85, -36, -21, 2, -79, 62, 30, -55, 2, -29, -14, 65, 53, 84,
+    -67, 55, 57, 72, -30, 41, 81, -31, -52, -14, 80, -68, 63, 43, 86, -85,
+    16, 63, -29, -91, -55, 32, -26, -32, -76, -73, -28, -57, 0, -85, -22, 43,
+    94, 62, -55, -95, 36, 96, 94, -62, -92, -44, -16, -9, -7, -62, -11, -53,
+    30, -7, -82, 88, -37, -21, 0, -60, 14, 88, -64, -47, -70, -64, 76, 31,
+    36, -42, -58, 9, 24, -9, 12, -71, -37, 34, -25, 79, 10, 48, -95, 41, -14,
+    -77, -60, -74, 59, 20, 69, -1, 41, 97, -43, 21, -73, 49, 9, -55, -71,
+    -50, 97, -2, -22, -73, -92, -83, 86, -50, 73, 0, -6, -57, 30, 61, 38, -1,
+    -88, -95, -88, 55, 54, -44, 3, -55, -5, -73, 60, -90, 64, 28, -23, -90,
+    -80, 93, -16, 60, 82, -84, -86, -60, 44, 90, 96, 57, -100, 76, -83, 34,
+    37, -54, -45, -52, 25, 7,
+  51, -86, -88, 48, -91, -61, -60, 52, 76, 0, 72, 52, 0, -8, -36, 43, 48,
+    -58, -41, 40, 41, 54, 15, 39, -64, 84, -60, 9, 22, -26, 89, 20, 64, -88,
+    63, -17, 38, -58, 85, 82, 98, -9, -32, 18, -67, 40, -77, 66, 3, 34, -89,
+    -84, -30, 51, -95, -34, -42, 64, 48, 62, -89, -2, 29, 11, 94, -96, 93,
+    67, -81, -47, -90, -21, -90, 71, -78, -24, -21, -10, -11, -67, 80, 59,
+    -44, -26, -66, 7, -71, -19, 59, 62, 81, 41, -15, 44, 42, 95, 69, -11, 98,
+    -78, 19, 39, 44, -55, 5, -82, -3, -28, 30, 5, 32, 18, 24, -50, 39, 12,
+    72, 20, 48, 85, 91, 74, 25, -71, 55, -12, -16, 39, 40, -82, 72, -34, -73,
+    39, 88, -15, 83, 54, -79, -48, -51, 50, 57, 32, -90, 43, 18, 42, -20,
+    -38, -7, 96, 12, -67, 1, -46, 13, -14, -69, -46, 97, 24, 90, -47, -30,
+    -57, -1, 47, 74, -40, 38, 43, -77, -77, -96, 71, -62, -93, -18, -48, -34,
+    -78, -93, -14, 39, -70, -26, -76, 91, -56, -60, 89, -91, -23, -47, 28,
+    89, 69, 97, -83, -47, 62, 45, 43, 47, 68, 5, 0, 6, 76, 57, -35, 80, 31,
+    36, -93, -94, 66, 5, -17, -22, -7, 72, 43, 13, -4, -18, 96, -66, -60,
+    -36, -34, 59, 20, -81, 74, 3, -5, 29, -15, -21, 78, 89, -45, 18, -64, 5,
+    -35, 88, -28, -32, -88, -90, 35, -86, -82, -4, -79, 55, -57, 70, -71, 79,
+    -48, -64, 35, 90, 49, -94, -83, -51, -56, -3, 94, -89, -13, 18, 40, -47,
+    -28, -3, -12, -24, -70, -83, -75, -11, -28, 70, -3, -49, 1, 87, -77, 42,
+    -30, 83, 46, -11, 6, -44, -77, 51, 40, 82, 51, 46, 53, 96, 74, -10, -48,
+    -15, -33, -80, -79, 21, 26, -31, 23, -46, 17, 28, -58, 8, 35, -2, 99,
+    -21, -38, -74, 86, -89,
+  -70, -10, 18, -2, -78, 91, -65, 96, -34, 55, -51, -58, 15, 61, -20, 87,
+    -69, -74, -17, -35, 67, 60, -82, 94, 2, 50, 62, -70, -56, 61, 64, -41,
+    64, 24, 85, -15, -76, -27, -70, 20, -29, -38, -1, 30, 61, -4, 67, -25,
+    -39, -12, 58, -79, -79, -58, -7, -69, -78, -64, 78, -11, -20, 55, 42, 28,
+    32, 49, 75, -94, 58, 55, 98, -99, 9, 38, -89, 21, -7, -72, 68, -29, -6,
+    -61, -95, -41, 43, -60, 5, -79, -90, 14, -95, -56, 66, -90, 29, -96, -18,
+    49, 56, -50, 57, -49, -58, 21, -68, 92, 32, -34, 18, -29, 83, -83, 63,
+    -61, 71, -57, 31, -81, 42, -52, -34, -72, 59, 34, -9, 25, 92, 60, 87,
+    -25, -44, 82, -63, 62, -97, -49, 40, -13, -5, -75, -29, 82, -42, -37, 76,
+    83, 73, -12, -92, 24, 70, -53, 11, 12, -6, -29, 40, 80, -56, 35, 11, 92,
+    -25, -20, -23, -23, -1, 25, -4, 22, -84, -44, 84, 51, -47, -51, 27, 78,
+    -5, 49, -65, 91, 6, -62, -7, 86, -63, -45, -99, 65, -44, -54, 69, 19,
+    -100, -42, 19, 41, -17, 66, -57, -95, 52, 59, 51, -100, -5, -92, -32,
+    -96, 11, -17, -92, -59, -50, -69, -74, 71, -26, 90, 97, 58, 73, 8, -20,
+    -87, -25, 64, -84, -34, -46, 54, 97, 98, 11, -92, -18, 73, 44, -100, 16,
+    -79, 76, 9, 52, -60, 21, -62, 45, -49, -89, 71, 96, 84, 36, 30, -19, -11,
+    -88, 87, -24, 10, 79, 50, -39, -66, 63, -80, 16, 14, -28, -20, -54, -40,
+    31, 9, 26, 36, -73, -42, 79, -5, 76, -8, -89, 32, -60, 4, 28, 26, -85,
+    -94, 72, -69, 26, -68, 30, -95, -72, -38, 49, -22, 65, -4, -30, 32, 28,
+    51, 46, 45, -48, -23, -22, 16, -98, -35, 94, 20, -7, -95, -19, 7, -22,
+    30, -75, -51, -52, 16, -60, -25, -37, 15, -97,
+  77, 9, 14, -31, 69, 63, 32, -39, -87, 88, -25, -41, 91, 44, 85, 90, 69,
+    -23, 57, 33, -71, -50, 42, -8, 3, -75, -53, 39, 73, 90, 45, 35, -46, 55,
+    26, -43, -42, -20, -10, 8, 36, 53, 69, -48, -58, -21, -24, -99, 12, -53,
+    -33, 92, 92, -98, -86, -67, 48, -18, 33, -96, 24, -94, -73, 43, -21, -40,
+    -37, -77, 14, 28, 14, -91, 64, 71, 57, 79, -15, 39, -16, -62, -89, 75,
+    49, 25, 54, -39, -63, -64, -38, 23, 33, -46, 25, 4, -76, 21, 8, 67, 19,
+    30, 45, -100, 12, -68, 9, 35, -36, -3, 12, -62, 91, -55, -46, -10, -8,
+    22, 83, -20, -98, -74, 25, -60, -54, 85, -91, -89, -11, -52, -65, -5,
+    -14, -20, 2, 92, 11, -17, -48, 22, -82, 89, 28, 15, -24, 77, -16, -61,
+    84, -14, 33, -26, 55, 15, 85, 57, -44, 86, 31, -55, -58, 97, 6, -88, 5,
+    31, -58, 67, 31, -96, 99, 65, 78, -72, -3, 9, -1, 31, -70, -78, 36, -82,
+    -50, -42, 41, -14, -51, -39, -23, -65, 70, -17, 31, -12, 32, 72, -48, -3,
+    -73, 19, -23, 72, 35, -78, -74, -97, -5, 90, -70, -21, -47, 65, 79, -20,
+    82, -93, -11, -29, 81, -3, 40, 64, 10, 24, -5, -42, -15, 82, 46, -21, 41,
+    -65, -89, -66, 81, -75, 57, -99, 51, -46, 4, 26, -47, -71, -44, -14, 51,
+    3, -42, -62, 82, 3, -77, 48, 40, 36, 66, -34, -85, 23, -59, 99, 29, -87,
+    -70, 95, -42, -60, -53, 80, 36, 74, -45, 46, 93, 67, -13, 77, -4, 77,
+    -92, -48, -1, 45, -87, 24, 83, 34, -76, -61, 68, -84, 74, 7, -53, -20,
+    -77, 55, 15, 31, -8, -38, 85, 21, -63, -20, 88, -85, 38, -28, 0, 95, -40,
+    -6, -18, 65, -80, 55, -28, -22, -7, 75, 93, -77, -58, 69, -51, -26, -25,
+    39, 11, 93, -51, 29, -56,
+  -24, 64, -93, -14, -41, 64, -59, -90, 17, -81, 5, 81, 76, 24, -92, -75, 33,
+    -12, -58, -65, -17, -46, 79, 87, 56, -28, 18, 24, 60, -21, 49, -13, 7,
+    -21, -98, -56, -71, 59, -10, -24, -30, -29, -22, 42, -36, 29, 50, 14, 76,
+    96, -92, 85, 16, -64, -81, 23, -1, 88, -14, -84, 47, -22, 89, -51, -81,
+    -51, -36, 8, 27, 69, -94, 81, -94, -49, 82, -49, 41, 89, -13, -17, 38,
+    -54, 83, -21, -54, 66, -32, 39, -30, 24, -60, -88, 2, 84, -100, -9, -10,
+    -29, -92, -46, -25, -44, -16, 44, -1, 56, 10, -54, 30, -43, 30, 22, 46,
+    -46, -89, -66, -15, -37, -7, -5, -26, 50, -72, 21, -35, 24, -45, 85, -16,
+    72, -58, -18, -59, 0, -35, 7, 43, 38, 56, -94, -91, 77, 56, 72, 53, -83,
+    -58, 54, -12, 42, -65, 70, 10, 73, -21, 47, -83, 7, -50, 23, 23, 76, -79,
+    33, -60, -40, -34, -63, 33, -50, -84, 53, 58, 8, -95, -80, 25, 39, -65,
+    -9, 17, 9, 47, -60, -16, 71, -62, -90, -37, 19, 51, 16, -81, -88, 5, -23,
+    -94, 51, -2, -11, -30, 15, -12, 20, 31, -56, 30, 18, 91, -77, -49, -47,
+    14, 95, 8, 43, -29, 61, -90, 16, 82, 29, -11, 80, 89, 36, -64, -10, 71,
+    -11, -99, 61, -85, 70, -39, -63, 77, 54, 8, 75, -46, 27, 90, 77, 92, -89,
+    -32, -32, 19, 48, 22, 89, 81, -31, -18, 34, 21, -50, -68, 50, -98, -46,
+    53, -90, -59, 4, 47, -41, -15, 44, 63, -66, -63, 52, -66, -48, -91, 75,
+    2, -86, 96, 45, 68, -25, -37, -17, 19, 74, 18, -28, 34, -65, -76, 63,
+    -58, 12, 95, -87, -61, -84, -92, 5, 34, -15, -43, -78, -20, -51, -12, 93,
+    -71, -53, 78, -82, 88, -10, 62, -22, 99, 29, -63, -35, -82, 17, 72, 59,
+    -16, -1, -27, 19, 61, 86, -58,
+  10, 52, -70, 71, 84, 71, -29, -99, -2, -80, -44, 76, -70, 49, -65, 19, 46,
+    4, -55, 64, -36, 38, -94, 55, 44, 91, 98, -28, -26, 89, -58, -16, 56,
+    -10, 55, 21, -17, 34, -34, -66, 3, 54, 1, 17, 20, -30, -92, 72, -91, -36,
+    -46, -57, -8, -5, 36, -63, -73, -91, 50, -41, 49, -73, 47, 4, 16, -96, 4,
+    -67, 78, -59, -42, -8, -46, -8, -10, -7, 56, 98, 12, -72, -40, 85, -48,
+    24, 26, -28, 99, -92, 20, 33, 91, -41, 19, 81, 26, 45, -35, -79, -12,
+    -24, -56, 71, 56, 87, -3, 85, 54, -83, 50, -34, 65, 65, 31, -57, 4, 78,
+    32, -15, -54, -26, -36, 21, -98, 45, 68, 99, 41, -50, -19, 75, 51, 68,
+    20, 31, 2, 1, 90, -29, -48, 34, 89, 61, -40, 81, -24, 86, 3, 68, 48, -86,
+    53, -81, 79, 46, 36, 30, -23, 10, -76, 42, -22, 35, 86, 25, -67, 75, 47,
+    -37, 45, 75, 30, 29, 93, 14, -8, 13, -44, -23, 39, 84, -58, 68, 69, 67,
+    33, 67, 22, -24, 64, -3, 57, -71, -21, 31, -8, 96, -37, -73, -64, -36,
+    51, -4, 88, 88, -56, 47, -58, -44, -75, -10, -37, 79, -97, 5, 9, 16, -41,
+    17, 83, 80, -70, 94, -41, -1, 0, -32, 42, -45, -37, 81, 72, -22, -77,
+    -14, 81, 69, -19, 13, -29, -38, -52, 50, 77, -29, -60, 89, -8, 65, 50,
+    62, -93, -17, -23, -91, 85, 51, -63, -95, 52, 87, -70, -55, -50, -55, 6,
+    -23, -52, -9, -80, 92, 13, -83, 59, 60, 98, -26, 48, 1, -73, 56, -66, 22,
+    27, -92, -35, -85, 53, 63, -22, 67, 41, 55, -77, 28, 19, -30, 38, -96,
+    44, -71, -61, -3, -90, 14, 41, 84, 99, -47, 41, 30, -61, -42, -20, -60,
+    30, 6, -58, 45, -1, 80, 72, 15, -43, -55, 95, -75, 99, -92, 75, -58, 41,
+    15, 39,
+  -52, 24, 59, -73, 48, 3, 96, 84, -83, 41, 81, 14, 3, 31, -72, -51, 64, -26,
+    -12, -10, 65, 76, 99, -25, 6, 57, 9, 23, -69, -66, 14, 56, 2, -18, -65,
+    -7, 42, 58, 47, 94, -54, 61, 46, 92, -53, -25, 23, 32, -47, 71, 90, -61,
+    -54, 35, 94, 3, -81, 85, -60, -18, 8, -44, 66, -50, 5, 0, 42, -50, -62,
+    9, 98, 52, -68, -66, -33, -36, 49, 90, 53, -68, 83, 98, -50, 88, -93, 38,
+    -41, -3, -70, -93, -11, 80, -65, -72, -21, -23, 56, -78, -72, 26, 30, 94,
+    86, 32, 4, 39, 5, -62, 1, -28, 73, 73, -2, 40, 82, 35, -85, -34, -49,
+    -84, -68, 69, 96, 80, 69, 71, 70, 20, -15, 69, 1, -78, 50, 50, 24, -100,
+    81, -38, 55, 75, 78, 67, 22, -9, -48, 18, 23, 50, -76, -47, 21, 46, 70,
+    -35, 21, -47, 78, 70, -3, 84, 86, 43, 10, 60, -44, 17, -12, -33, 77, 36,
+    41, 84, 42, 9, 0, 25, -99, 92, -88, 28, 32, 96, 25, -44, -96, -10, 17,
+    72, 94, 33, -87, -39, -19, 44, -49, -8, -65, 25, -75, -82, -56, 65, 27,
+    97, -92, -70, 19, -57, 29, 19, -87, -46, 69, 66, -41, 46, -72, -17, -26,
+    21, -25, -45, -98, 59, 70, -40, 92, -48, -36, 99, -14, 56, 36, -15, -40,
+    -89, -71, -41, 6, 33, 71, -100, -20, -86, 86, 0, -58, 8, 78, 75, -86,
+    -88, 63, -90, 76, 0, -20, -98, 35, -34, -35, 95, -50, 90, -22, -47, -11,
+    -44, 48, -69, 84, -20, -3, -99, 6, 74, -66, 44, -70, 97, -85, 45, 70, 17,
+    -83, -8, 13, -81, -95, -76, -20, -77, 12, 97, -50, -54, 53, 91, 92, 21,
+    -5, 50, -91, 79, 95, -41, 26, -42, 64, -70, -56, 59, 39, 4, 49, -77, 73,
+    -41, -75, 73, -48, -4, 92, -8, 29, 92, 31, -48, 16, -79, -22, 54, 33,
+  67, 50, 91, -53, 52, -79, -73, 51, -83, 58, -2, 24, -5, 65, 51, 46, 58, 79,
+    65, -82, 46, 95, 64, -26, -21, 5, 87, -31, 3, -19, 9, 75, -12, 81, -14,
+    18, -94, -12, 72, -14, 5, 47, 85, -97, 31, 46, -79, 52, 88, -17, -14, 47,
+    62, -44, -18, 94, 98, 42, 96, -46, -28, -31, 49, 54, -43, -52, 64, 48,
+    -26, -88, -43, -48, 92, 91, 76, -32, -67, 6, -73, -88, -38, 18, 40, -27,
+    97, 1, -4, -37, -83, 84, -27, -95, 61, -80, -97, -58, 20, -48, -16, -44,
+    -97, -34, 45, 35, 54, -87, 90, -27, 2, -89, -91, 40, -74, 19, 13, 25,
+    -49, -45, 15, -19, -54, 1, 32, 15, 66, -11, -52, -15, -95, 92, 81, -12,
+    9, -45, -78, 31, -64, -9, 2, 45, -83, 46, -85, 57, 39, 21, 31, 94, -75,
+    -24, 3, 13, -16, 48, 16, -68, 28, -67, -7, 8, -42, -14, 40, -38, 70, 68,
+    51, -17, 83, 90, 32, 70, -84, 76, 35, -20, -93, 94, 15, 52, 4, -4, 40,
+    -14, 46, 49, 96, -21, -14, -20, -53, -48, -54, 27, -18, 22, 29, 64, 63,
+    45, 19, 57, 6, -43, 91, 40, -63, -4, 52, -39, 96, -7, 43, -49, -12, -69,
+    -5, -52, -17, -74, 57, 4, 47, -92, -28, 90, 49, 29, -72, 78, 22, -65,
+    -14, 81, 63, 93, -94, 88, -87, 58, 42, -6, 87, -16, -61, -31, -62, 24,
+    -9, 54, -10, -72, -77, -37, 59, 34, 65, -27, -50, 44, 53, 63, -31, -24,
+    -53, 27, -89, 36, 63, 86, -94, 74, 60, 73, 66, 9, -11, -16, -40, -10, 66,
+    12, 73, 88, -73, 86, 73, 35, -32, -56, 0, -36, -89, -60, 50, 36, 38, -56,
+    -20, 48, 23, -65, -18, 55, -15, 42, -100, -85, 90, 12, 80, -16, -14, -68,
+    -31, -98, 3, -20, 90, -65, 77, -41, -57, 85, 98, 91, 83, 93, 1, 89, -16,
+    13, 33,
+  -73, 72, 59, -25, 18, -43, -2, -19, 50, -100, -76, 18, -44, -23, -6, 17,
+    -91, 30, -76, 11, -39, -25, -76, 73, 91, -85, -10, 8, 0, -79, -13, 32,
+    94, -53, 24, -4, 21, 67, -95, 31, 15, 90, 96, -50, -53, -47, 71, 8, -33,
+    -21, -3, -8, 63, 19, -18, 10, -88, 94, 67, -83, -88, 98, -29, -80, -95,
+    -22, -74, 31, 6, -23, 29, -5, -58, 24, 72, 81, 34, 66, 33, -62, -23, -85,
+    78, 52, -72, 2, 93, -51, 12, 17, -89, -67, 81, 45, 65, -91, 19, -97, -60,
+    -72, -97, -12, -64, 99, -5, -66, -56, -50, -99, -16, -7, -77, 15, 65,
+    -27, -15, -36, 63, -34, 36, -27, 10, 32, -94, 33, -34, -80, 47, -97, -79,
+    23, 31, 6, 60, 32, -24, 14, 29, -23, 86, 21, -90, 39, -31, -85, -10, 67,
+    -37, 7, 52, 21, -55, 94, -72, 31, -57, -1, 32, -22, 45, 93, -72, -24,
+    -59, 15, 44, -46, 38, -91, -8, 25, -87, -10, 19, -24, -41, 66, -99, -58,
+    38, -83, -93, -39, -96, -1, -36, 42, 99, -50, -29, -54, 77, -91, -80, 74,
+    -8, -26, 8, 88, 79, -34, -30, 37, 68, 19, -28, 88, -15, 48, -61, -30, 73,
+    89, -10, -9, -46, 1, -34, -93, -53, -45, 99, -48, 68, 29, 40, 44, -50,
+    -78, -84, 52, -36, 26, 21, -96, -2, -18, -46, 84, 62, 24, 73, -48, 93,
+    58, 79, 94, 3, 78, -90, -94, 50, -67, -33, 85, -95, -49, -67, 7, -52, 87,
+    46, -87, -33, 78, 53, -99, -69, -82, 41, 97, 38, -79, 81, 62, 0, 33, -64,
+    -66, -98, 74, -37, 57, -63, 98, 73, 16, 12, -34, 93, -95, -83, 13, 58,
+    -86, -81, 25, 5, 24, 21, 93, 86, 25, 51, 4, 79, -42, -28, -35, 76, 73,
+    -79, 49, 15, -54, -47, -19, 71, -95, 84, -3, 83, 57, 66, 76, -72, -44, 9,
+    19, -40, -8, 10, 29,
+  15, 39, -32, -30, 11, -7, -35, 97, 93, 97, 58, -78, 28, 79, -43, 42, 53,
+    -92, -34, 68, -54, -26, 48, 25, -3, 51, 12, 71, 46, -4, -67, -46, 83,
+    -13, 28, 5, 32, 1, 39, -66, 50, -61, 18, 50, -96, -82, -4, -56, -14, -97,
+    -80, 14, -27, -75, -62, -81, -31, 32, 22, 89, -7, -85, 60, 90, 29, 99,
+    -52, -11, 80, 84, -6, -96, -53, -87, 26, 72, 6, -100, 70, -29, 39, 70,
+    -2, 23, 23, -33, -48, 23, 66, -53, 30, 56, 98, 23, -24, 76, -57, 33, -45,
+    -74, -52, 33, 27, 19, -13, -90, 4, 83, 43, 35, 12, 62, 24, -17, -60, 82,
+    49, -95, -99, 71, 0, 43, 52, 50, 27, -82, 4, 20, 19, -7, -15, 11, -81,
+    15, 79, 10, 25, 36, -33, -47, 29, -75, -36, -23, -9, 11, 57, 7, 52, -21,
+    -89, -57, -61, -46, -96, 16, -43, 84, 18, 64, 84, -89, -25, -64, 1, 26,
+    -78, 19, -52, -1, -63, -35, 16, 59, 15, -62, -64, 10, -72, -51, 90, 5,
+    -34, -61, -47, -47, 92, -73, -12, 19, 97, -49, 47, -68, -72, -34, -41,
+    14, 42, 14, -29, -32, -90, 21, 85, 44, 60, -16, 89, 0, 61, 41, 25, -37,
+    0, -52, 63, -60, -65, 53, -29, 68, 80, 70, 80, 65, -14, -12, -83, -9, 74,
+    -19, -20, -40, -100, 18, 44, -28, -41, 27, 23, 72, 34, -77, 16, -58, -93,
+    70, -6, 40, 3, -35, -43, 23, 24, -27, 30, 21, 71, -94, 49, 88, 48, 72,
+    31, -30, 63, -79, -3, 12, -42, -90, -62, 12, 37, 92, -4, 25, -54, -50,
+    -86, -14, -53, 27, 20, 7, 39, 60, 56, 12, 91, 8, -64, -37, -36, -68, -55,
+    76, -28, -32, -29, 1, -90, 30, -59, -49, 88, -12, 67, -53, 2, -1, -47,
+    -87, 47, 80, 17, 71, 61, 55, 90, 46, -19, 51, 48, -74, 33, -19, -25, 54,
+    41, 49, 32,
+  -95, -60, 80, 54, -36, -21, 37, 89, -10, 84, 57, -11, 98, -81, -43, -25,
+    -11, -94, -57, 71, -9, 44, 64, 4, -83, 16, 6, -83, 97, 51, -9, 96, -53,
+    18, 4, 70, -2, -11, -8, -87, 22, 38, -9, -9, -20, 30, -13, 93, -56, 16,
+    93, -25, -55, -23, -38, 3, 30, 39, 43, 38, 13, -39, -92, 64, 81, -52,
+    -30, -8, -1, -3, 27, 19, 22, -41, -1, -41, 13, -84, -80, 64, -71, 73, 15,
+    -73, -14, 14, -40, -60, 56, -9, 46, -40, -20, -78, 29, -2, -1, 86, -80,
+    21, -68, -84, -15, 88, -85, -86, 83, -43, 54, -8, -1, 74, 12, 17, 27, 41,
+    -17, 66, 20, 8, 64, 27, 14, -40, 6, 62, -71, -3, 1, -5, -91, -43, -81,
+    46, 83, 10, 37, -12, 36, 6, -3, -1, 59, 89, -17, 35, -22, -19, -53, -92,
+    40, -58, -11, 28, 74, 50, 89, 39, 30, 42, -38, -52, -32, -44, -36, -89,
+    23, -11, -71, 38, 90, 65, 63, -3, -86, 78, -31, -82, -41, -74, 29, 5, 22,
+    1, -93, -86, 15, -77, -68, 48, -14, -63, 95, 11, -5, 50, 64, 62, -1, 36,
+    -2, 60, 32, 56, -25, -27, 36, -79, 33, -25, -90, -40, 32, 98, -21, -81,
+    -37, 67, -30, 84, 44, 23, 71, 56, 45, -53, 80, -89, -51, -83, -14, -51,
+    -44, 26, 78, -71, -25, -18, 66, -37, 48, 2, -59, 78, -63, -89, -19, -49,
+    -45, 39, 31, 99, 12, -59, 34, 12, -31, 67, 51, -45, -3, 25, -7, -78, 47,
+    72, -100, 74, 28, 31, -23, -9, -12, -27, 71, 25, -82, 48, 51, -54, 85,
+    81, 75, 45, 68, 14, -34, 7, -13, -4, -44, 18, -26, 20, 6, -4, -47, -91,
+    -15, -94, -70, -5, 77, 97, 19, -49, -40, 70, 46, 31, 31, 33, 31, 60, 93,
+    -79, 66, 91, -7, 82, 75, -13, -76, 8, 15, 28, 88, -6, 35, -36, -52, -75, -8,
+  69, -25, -82, 50, -85, 99, 61, 30, -45, -18, 63, 24, 71, -71, -28, -61, 44,
+    -92, -100, 47, -33, 15, 9, -99, -20, -36, -36, -87, -67, -17, 83, -100,
+    -13, 9, -88, -84, -89, -78, 52, 52, -43, 64, 10, -2, 40, 82, 63, 24, 79,
+    40, -20, -61, -74, 68, 91, -77, -7, -71, 42, -49, -36, -97, -85, 92, 69,
+    71, -26, 67, -58, 65, -1, 50, -90, -48, -30, -89, -94, 69, -14, 75, 40,
+    39, 14, -67, -39, -89, -54, 17, 26, -52, -12, 68, 19, -81, -94, -41, 2,
+    -94, -26, 54, -20, -63, -47, 30, -64, 28, 19, 11, 81, -75, 26, 47, 43, 8,
+    45, -52, -1, -95, 21, 96, -91, -60, -20, 27, 90, -17, -71, -16, -18, 5,
+    77, -81, 99, -70, -13, 51, 16, -90, -99, 2, -68, -53, 27, -80, -97, -4,
+    8, -58, 90, -56, 49, 21, -61, -66, 29, -100, 18, 27, -94, -44, -94, 62,
+    47, 15, -20, 18, 48, -21, 81, 27, 59, 86, 13, 43, -30, 89, -52, -98, 20,
+    -35, -53, -5, -87, 50, -16, -13, -8, -78, 33, 85, -75, 1, 1, 64, -80,
+    -10, -15, -44, -66, -45, -37, 40, -43, -72, -46, 29, 56, 54, 76, -36, -7,
+    -50, 84, -31, -76, 79, 34, -52, 93, -97, 64, -88, -74, -99, 19, 74, 38,
+    41, -3, 22, -56, -94, 73, -77, -39, 72, 23, -57, -86, -3, 43, -6, 8, 42,
+    -68, -45, 32, -90, -45, 2, -88, 67, 72, 7, -46, 69, 5, -46, 66, -8, 56,
+    83, 15, 36, 69, -88, 45, 30, 17, 2, -94, -54, 62, 63, -64, 3, -99, -9,
+    -24, -90, 71, 59, -95, -43, -83, 54, 48, -14, -80, 11, 35, 85, -100, 50,
+    -15, -67, 87, 54, -83, -35, -40, 28, -7, 2, -23, 31, -35, 51, -41, 39,
+    80, -32, -61, 96, -20, -52, -94, -14, -40, -76, -59, 75, -15, -80, -28,
+    20, 54, -85, -2, -67, -13, -82, -32,
+  -33, 90, -14, 75, -78, 45, 44, 37, 31, 67, -28, -29, -45, -95, -100, -2,
+    -55, 97, -70, -5, -63, -97, 10, -35, 30, 19, 98, -47, 76, 92, -87, -63,
+    -22, 58, -97, 49, -93, 16, 14, 6, 1, 71, 42, -30, 70, -37, 27, 8, 26,
+    -76, 41, 85, -27, 20, -30, -96, -74, 23, -25, 78, -12, 21, 37, 36, 35,
+    61, 76, 99, 69, 61, 41, 77, 18, -17, 54, -70, 73, -33, -45, 31, -100,
+    -90, 30, -13, -69, -41, -85, -7, -43, -9, 72, -75, 50, 53, -41, -89, -95,
+    7, -81, 56, 30, 63, -21, -4, 6, 12, -65, 52, 25, -41, -97, 41, 44, -14,
+    77, -64, 22, 77, 57, 47, 47, -34, -19, -65, -12, 82, 31, -48, -52, -27,
+    86, 37, -44, 53, 61, 64, 7, 62, -33, -9, 0, 37, 38, -78, 96, 9, -60, 3,
+    -71, -58, -2, -55, -49, 79, -100, -1, -23, 13, 49, 48, -15, 26, 28, 6,
+    -30, -57, 21, -64, -86, 7, -29, -2, -75, -38, 53, -34, -50, -83, 63, 42,
+    81, -97, -98, 43, 10, 36, -90, -22, 46, 9, -15, -64, -10, 3, -64, -86,
+    -80, -77, -86, 76, -88, 41, -22, -28, 63, 44, 89, 40, -57, 60, -45, 43,
+    76, 62, -11, 31, 0, -54, 38, -81, -69, 55, -66, 91, -47, -67, -60, -11,
+    27, -88, 43, 40, -88, 66, -30, -58, 96, 56, 18, 10, 8, 6, -34, -21, -66,
+    -11, 14, -82, -83, -39, 32, 27, 5, 95, 70, 73, -19, 42, -25, -21, -21,
+    39, 98, -76, 54, -69, -78, -47, 2, 94, 93, 23, -60, 49, -34, -7, -5, 80,
+    -75, -15, 37, -15, 39, -93, -15, -6, 83, 79, 19, -86, 72, 55, -9, 81, 53,
+    -32, 75, 63, 21, -63, -27, -90, -11, 65, 87, -65, -95, 89, 70, 24, -77,
+    -14, -64, -73, 52, -59, 40, -99, 82, 59, 18, 74, 39, 50, 74, -98, 72,
+    -24, -23, -11, 78, 72, 73,
+  -62, 17, 43, -54, -11, -34, 57, -45, -74, -81, 81, -67, 49, 94, -19, -42,
+    -64, -33, 58, 37, 10, -75, 77, 38, 88, -53, -48, 26, 86, -94, 13, 67,
+    -71, 46, -33, 85, 9, -59, 81, -73, -98, -23, 45, 78, 17, 49, 57, -54, -7,
+    28, 83, -10, 15, 77, 63, -25, -73, -74, 7, -60, -30, 59, 11, -55, 31, 51,
+    -51, 77, 73, -60, -10, 74, 60, 88, 73, -39, -74, -30, -15, -90, 72, 40,
+    -41, -20, 82, -88, -85, -47, -31, 26, 77, 6, -41, 36, -2, -26, 77, 71,
+    -90, -67, -98, -89, 48, -57, -90, 73, -100, 42, 35, 94, -40, -86, -34,
+    38, -88, 61, 63, 74, -72, -100, 80, 31, -73, 55, -2, 9, 48, 52, 16, 80,
+    49, 26, -27, -31, 38, -90, -47, -19, -7, 4, -14, 51, -45, 98, -61, -15,
+    -11, 72, 69, -74, 11, 53, -35, -23, -20, 63, 1, -56, 35, 36, 89, 5, -30,
+    89, -81, 82, -78, 88, 94, 75, -71, -94, 61, -42, -98, -26, 0, -6, 7, -22,
+    69, 33, 72, -47, 96, 71, -8, 43, 82, 19, 92, 31, 85, -49, -4, -8, 97,
+    -51, -100, 74, -48, -50, 42, 22, -58, 72, -33, -10, 3, 73, 2, -74, -77,
+    90, -25, -97, -60, 63, 47, 1, -17, -89, -41, 84, -47, -79, 80, 67, 37,
+    -1, -4, -26, 21, 90, -33, 38, -73, -3, -66, -23, 90, 26, 39, -34, 93, -2,
+    -21, -86, -74, -13, -59, 8, 81, 88, 83, 44, 57, 85, -69, 61, 63, 80, -36,
+    -52, -64, -67, 60, -96, -33, -1, 70, 97, -93, 79, -64, 10, 43, -6, 83,
+    51, -80, 33, 68, -73, -30, 72, -76, -5, 96, 17, -68, 81, -69, -12, -52,
+    93, 6, -54, 62, -90, -58, 13, 73, -8, 64, 93, -68, -71, 45, -89, 17, 82,
+    87, 40, 63, -44, -92, -74, -58, -72, -33, 90, 45, 52, -19, 67, -80, 61,
+    78, 92, -12, 31, -28,
+  48, -83, -12, -7, 88, -22, 53, -67, 88, 52, -31, -86, -60, -100, -6, 55,
+    -76, 74, -55, 89, 80, -53, -34, -96, 48, 73, 26, -88, -84, 81, -72, -54,
+    29, 47, 60, -24, 62, -84, 26, 1, 71, -84, 36, -68, -43, -53, 89, -6, -81,
+    -45, -17, -5, 66, 20, 66, 31, -56, 29, -60, 24, 99, 43, -78, 34, 28, -97,
+    13, -63, -42, 28, -40, 0, -47, 92, -28, 64, 96, 80, -15, -30, -77, -59,
+    30, 64, -36, 87, -31, 81, 37, 92, 18, 56, -21, -60, 99, 78, -34, 65, -30,
+    -62, 46, -44, 62, -8, 96, 21, 31, 7, -43, 38, -13, 2, 88, 36, 12, -71,
+    93, -98, -21, -19, -85, 9, -91, 93, 73, 42, -91, -60, 88, 95, -43, 68,
+    42, -35, 70, 29, 57, 87, 12, 62, -72, 71, -88, 43, 63, -54, -27, 36, -76,
+    -9, -94, 83, -23, -85, -15, -71, -40, -14, 46, 70, 27, 23, -55, 52, 29,
+    38, -97, -62, -28, 75, -67, -18, -27, -39, 19, -95, 53, -26, -41, -59,
+    63, -38, 77, -78, -54, -66, -18, 11, -21, 90, -97, -73, -35, -27, -11,
+    92, -22, 27, 3, 40, -73, -99, 76, 33, -41, -44, 83, -13, 11, 68, -45,
+    -84, 61, 67, 31, -24, -62, 48, -57, 37, -98, 63, -10, 49, 61, 32, -37,
+    -88, 39, 93, -77, 57, 30, -52, -10, -68, -34, -87, 94, -47, 58, 86, -14,
+    -27, 87, 1, -47, -99, -98, 76, -33, -56, 22, -80, -73, 75, 63, -21, -12,
+    20, -79, -1, -46, -5, 73, 34, -30, 79, 34, -78, 76, 62, -37, -77, 61,
+    -44, -3, -85, -69, 62, -98, -36, 34, -29, -12, 86, -47, -84, -86, 90, 36,
+    -24, 97, 72, 49, 10, 5, 89, -48, 26, 7, -40, 8, 14, -85, -93, 50, -47,
+    28, 13, -4, 9, -5, 72, 62, 25, -24, -73, -79, 68, -13, -13, -12, -55, 87,
+    47, -61, 34, -52, -20, -26, -36, 35,
+  86, -99, -54, 77, 5, 35, -56, -33, -38, -41, -63, 23, 87, 12, 83, -12, -1,
+    40, 40, -57, 80, 13, 59, -100, -24, -79, -17, -35, 63, -27, -42, -7, -77,
+    -60, 64, -95, -42, 64, -2, 38, 68, 18, 99, 55, 70, 23, 94, -61, -87, 31,
+    1, 26, 68, -42, -79, -9, -82, -43, -46, 67, 11, 6, -87, -49, 56, -54, 88,
+    93, -7, -13, 77, 56, 35, 49, -46, 51, -37, -13, 96, -6, -28, -8, -57, 99,
+    -3, 14, 20, -8, -72, -33, 26, 45, 7, -75, 38, 66, -59, 39, -61, 46, -91,
+    93, -12, -10, 43, -57, -43, 80, 9, 5, -28, -65, 55, 24, -59, -32, -76,
+    -42, -88, -5, -11, 8, 55, 20, -53, 22, 34, 61, 60, -55, -90, -43, -80,
+    93, 87, -59, 62, 38, -36, 89, 22, -71, -21, -86, 40, 18, 71, 79, -65, 69,
+    16, -47, -4, -44, 3, -57, -25, -22, -82, -28, -61, -19, -92, -27, 83, 24,
+    -71, 39, 4, 77, -72, 73, -69, -47, -51, 78, 97, 19, -39, 62, 33, -18,
+    -48, 31, -93, 29, 45, 21, 94, -88, 61, 35, 6, 78, 71, 26, 45, 87, -76, 3,
+    -49, 61, 53, 68, -11, -52, -49, -58, 21, -73, -73, -31, 16, 28, 71, -57,
+    -92, -78, 47, -96, -48, -88, 65, 30, 31, -82, -15, -93, -64, 65, 41, -22,
+    -52, 87, -58, -67, -53, -71, -80, 87, 73, 46, 1, 29, 4, 36, -44, 2, 97,
+    -50, -70, -95, -62, -69, 38, -50, 28, -40, -98, 58, 35, -90, 95, -91, -4,
+    23, -74, -52, 17, 66, 91, 98, 39, -84, 64, 3, 23, -74, -93, 23, 7, -37,
+    25, 36, 93, -25, 21, -35, 3, 28, 6, -40, -54, 0, -69, -74, -100, -49, 91,
+    26, -16, 2, 20, -90, -65, 38, -49, 78, -30, -11, -14, 74, -61, -2, 68,
+    -99, -16, -18, -80, -74, -11, 67, -95, -43, 59, 2, 45, -11, -31, 4, -24,
+    39, 96,
+  87, -79, -98, -18, 57, -46, 46, -13, -17, -28, 13, 15, 66, -31, -77, 80,
+    -38, 82, -84, -63, 79, 24, -49, -96, -39, 14, -22, 55, 40, 58, -18, -3,
+    -32, -54, -46, -91, -88, -7, -16, 17, -72, 20, -31, 87, 4, 36, 83, -28,
+    -43, 49, -38, 37, 13, -31, -29, -96, -96, 62, -85, 24, 0, 71, -51, -59,
+    63, -23, 66, 7, -66, 2, -5, 3, 30, -57, 89, 99, 76, -24, 82, -46, 22,
+    -52, -39, 2, -44, -67, -60, 18, -33, -41, -14, 66, -37, -60, -67, 3, 70,
+    -14, -1, 53, 35, -2, 17, 16, -97, -3, -47, -64, -56, 81, 74, -13, 44, 24,
+    -11, -34, -57, 59, -12, 97, 85, 10, 1, -19, -47, 56, 62, -29, -59, -97,
+    14, -95, -63, -19, -67, -79, 56, -59, 29, -73, 83, -49, -83, 31, 64, 63,
+    -88, 83, 41, -77, 3, -33, -31, 99, 92, 99, -30, 81, -98, -39, -90, -56,
+    23, 75, 14, -79, -93, -36, 25, 2, 23, -49, -95, 46, -61, -90, 67, -66, 6,
+    90, -92, 69, -51, 64, -14, -75, 95, 92, 63, 54, -1, 22, 80, 1, 94, -1,
+    50, -67, 6, 35, 33, -25, 43, 2, -90, -51, -62, 65, 92, -48, -70, 26, 74,
+    -90, -38, 3, -11, 22, 47, 50, -50, -45, 36, 74, 96, 63, -88, 17, -99,
+    -84, 1, -96, 41, -12, -63, 16, 92, -80, 91, -88, 65, -73, -55, 48, 54,
+    38, -79, -86, 91, -82, -50, 77, -9, 18, -77, 65, -27, 5, -73, 83, -45,
+    82, -18, -63, 80, -52, -29, 95, 66, 29, -60, 1, 77, 83, 11, -8, 98, 64,
+    -11, -8, 9, -90, -35, 86, 72, 17, 25, -19, -32, -36, -41, 82, 9, 56, 68,
+    5, -61, -34, -21, 6, 92, -38, 30, -72, 30, 71, -70, 24, 13, 40, -8, -24,
+    48, -25, 53, 96, -73, 11, 87, -66, 92, 83, -31, 19, 18, -78, -72, -35,
+    27, -83, 38, 92, -66,
+  75, -70, -92, 64, -32, -59, -79, -63, -100, 18, -12, -34, 78, 62, 76, 16,
+    -27, 99, 8, -54, -57, 55, -34, 21, 43, -54, 12, -44, -62, -82, 39, 85,
+    -1, -88, 45, -38, 42, -47, 82, 55, -51, 42, -81, -11, -8, -94, -37, 92,
+    19, 94, -63, 93, -16, -9, -74, -30, -89, -8, 8, -72, 40, -43, 53, -99,
+    10, 25, -14, 46, -43, 56, -77, 27, -86, 37, 36, 34, 10, 96, 82, 76, 89,
+    -61, -82, -66, 91, -77, 33, 26, -40, -52, 46, -69, 53, 73, -49, -98, 23,
+    82, -33, -57, 38, -35, 25, 8, 61, -45, 40, 61, 50, -79, -18, -24, -64,
+    -76, 44, -73, 94, -20, 21, 77, -14, -83, 4, -24, 38, -23, -33, 21, -79,
+    43, -19, -90, -49, 58, 87, -68, -74, -73, 96, 29, -76, -2, 50, -11, 85,
+    70, -17, -79, 60, 95, -47, 75, -23, 92, -81, 8, 96, -62, 6, 55, 91, 87,
+    -2, 62, 72, 39, -89, -49, 33, -60, -27, -45, 56, 73, -85, 22, 98, 95, 25,
+    -18, 81, -98, 86, -82, 32, -83, -47, -37, -33, -42, -50, 84, -79, 9, -9,
+    79, -66, -50, 81, -85, -83, -49, -28, -33, 40, 78, 70, -98, -74, 7, 94,
+    -34, 15, 42, 89, 5, 32, 34, 65, -27, 79, 90, 32, 92, 3, -18, 28, -70,
+    -29, -71, -21, -75, 31, -10, -13, 66, -66, 7, 6, -62, 99, -45, 47, 66,
+    -57, -100, -13, -67, 43, -84, 60, -52, -89, -31, 92, 16, -64, 96, -86,
+    13, 79, 58, 59, -20, -17, -15, 20, 88, -77, 30, -58, -11, -95, 41, 28,
+    -42, -96, 81, -23, -56, -96, 3, 91, 91, -11, 17, 16, 1, -29, -67, 44, 15,
+    70, 30, -4, 89, 99, 34, 46, -42, -24, 17, 28, 29, 23, -71, -26, -53, -27,
+    -40, 24, -3, -72, 34, -12, -5, 58, -71, 75, 62, -67, 4, 92, -60, -62, 78,
+    35, 6, -51, 11, 83, -48, -76,
+  -59, -71, -2, 4, -75, 21, -26, -33, 64, 4, 59, -76, -37, 2, 62, -51, -17,
+    30, -64, 98, -12, 7, 93, -38, -64, 71, 34, 95, 41, -21, -4, 43, 71, 38,
+    -9, -48, 92, -25, 5, 71, -38, 14, -83, 18, 66, 3, 1, 61, 50, 74, -46,
+    -50, -5, -25, 47, -94, 76, -99, 57, -17, -76, -7, -28, -59, 72, -9, -54,
+    -73, 95, -53, 5, -89, 88, -12, -74, 41, 30, 22, -98, -62, 59, 17, -32,
+    -73, -95, -17, -94, 81, -37, -14, 3, -29, 43, -88, -78, 96, -48, 75, -16,
+    -83, 64, 8, 16, 26, -94, -98, -36, -20, -93, -40, 84, 16, 12, -92, -29,
+    31, -35, -57, 94, -35, -11, 52, 28, -56, -36, 32, 38, -27, 28, 99, -5,
+    -51, 38, -39, -75, -72, 28, 0, -37, -20, -65, -45, 56, 66, 85, -10, 43,
+    78, -70, -60, 86, -15, 35, -32, -18, -88, -38, -84, 19, 56, -19, 54, 54,
+    32, -49, -38, -51, 58, -21, 97, -41, -86, -42, -30, 40, -17, -96, 31,
+    -17, -65, 61, -77, -1, 81, -33, -15, 86, 68, 24, 90, -61, -99, 38, 97,
+    -6, 98, 91, 44, -31, 76, -14, 91, 96, 37, -85, 48, 9, -43, -62, -40, -34,
+    -43, 61, 41, -13, 13, 5, 10, -26, -59, -48, 12, -54, -88, 2, 0, -27, -89,
+    -23, -83, 7, -41, 75, 29, -57, -8, -47, -29, -55, -20, 26, -82, -23, 21,
+    -44, 30, -88, 95, 82, 26, -85, 29, 40, -97, -38, -59, 88, -49, 53, 21,
+    -5, -47, -95, -27, -98, 27, 43, 9, 15, 41, 12, 64, 73, 95, -75, 8, -28,
+    -38, -98, 58, -54, -70, 94, 52, -6, -71, 58, 70, -49, 62, 36, 78, 73, 26,
+    43, -64, 52, 37, -14, 16, -4, -75, 37, 8, -51, 70, 29, 7, -17, 10, -93,
+    72, -60, 56, -58, 42, 91, -22, 5, -28, 5, -36, -51, -92, 67, -56, -68, 7,
+    -36, -91, -15, -12, 54,
+  -96, -80, 5, -18, 11, -77, -72, -31, -5, 26, -91, -92, 11, -57, -77, 65,
+    32, 29, 69, 68, 29, 96, -41, -73, -26, 95, -34, 91, 72, 5, 89, 13, 86,
+    91, -52, 74, 72, -96, -97, -29, -27, 45, -55, -11, -86, -83, -25, 32,
+    -38, 13, -92, -1, -98, -11, -29, 85, 99, 69, -88, 42, 81, -88, -56, 3,
+    -65, -68, 38, -60, -68, 1, -37, 82, -96, 78, 33, 60, -50, -16, 5, -40,
+    -90, -36, -39, -23, 5, -8, -19, -79, -74, -1, -68, 57, 32, -12, 74, -59,
+    -20, -73, 91, 82, -65, 0, 48, 56, 92, -37, -65, 21, 25, 90, -17, 5, -38,
+    63, -49, 4, 11, -20, 59, -51, -94, 65, 65, 94, -17, 19, -16, -6, -88, 50,
+    -27, 51, -31, 87, -99, 33, 4, 50, -80, 30, 4, 34, 8, -49, 82, 19, -68,
+    66, -73, -69, 6, 99, -82, 43, -92, 30, -5, 87, 15, -69, 18, 95, -59, 71,
+    -20, 60, -90, -35, -61, 53, -58, 46, 76, 28, -33, 73, 9, -90, -3, -39,
+    70, -48, 76, 80, -9, 1, -5, -68, -18, 86, 38, -43, -84, 35, -94, 91, 34,
+    -85, -31, -19, 35, -75, 97, -2, 32, -43, 37, -75, -93, -56, 92, -70, 28,
+    -63, 4, -11, 76, 42, -8, 46, 62, -24, -70, -43, -78, -97, 32, 87, 35, 3,
+    -82, -8, -44, 73, 30, 97, -10, -51, 2, 60, -10, -33, 87, -32, -98, -20,
+    -79, -66, -54, -97, 53, 78, -27, -47, -52, -97, -90, -74, -73, 43, 66,
+    80, 87, -53, 45, 17, 11, -57, 2, 11, 8, 50, -79, -73, 45, -75, -14, 89,
+    60, 75, 77, -55, -69, 32, 69, -8, -40, -44, -4, 91, -60, -57, -7, 72, 98,
+    47, 25, -76, -71, -60, -12, 10, -57, -85, 96, 96, 90, -24, -75, -8, 1,
+    26, -98, 38, -33, 54, -71, -92, -35, 83, -89, -37, -8, -15, -24, 98, -3,
+    -43, -74, -20, -96, 49, 97,
+  86, -65, -60, -75, -98, -75, -48, 43, -81, 49, -52, 25, -72, -11, 67, -80,
+    -22, -32, -5, 2, -91, -11, 86, 41, -14, 73, -7, 55, 9, -1, 35, -80, -25,
+    -75, 0, -75, -87, -85, 13, 16, -75, -76, -10, 66, -47, 93, -91, 54, -38,
+    -62, -26, 23, -20, -18, -67, 76, -5, 34, 77, 88, 19, 86, -72, 15, -66,
+    -98, -48, -72, -71, -69, -7, 65, 46, 79, 0, -100, -37, -86, 1, -58, 91,
+    77, 73, 38, -32, 58, 96, -3, -10, 15, 38, -73, 24, -32, 42, 22, 63, -27,
+    -2, -16, -98, -24, 85, -58, 85, -54, -43, -98, -54, -33, 46, 84, 71, 39,
+    -81, -33, 76, -87, -58, 56, -30, -89, 11, 82, 75, -52, -27, 63, 90, 37,
+    -92, 42, -40, 89, -13, 24, 64, 7, 33, -7, -54, -56, 35, -4, 59, 68, 85,
+    3, 57, -83, 49, -53, 95, 18, -53, 35, 64, -56, 28, -48, -16, 46, -40, 51,
+    16, 50, -16, -67, 59, 3, 91, -81, -86, 57, -34, -7, 37, -69, -1, -77, 28,
+    53, 63, -93, 16, 70, 16, -87, 10, -39, 46, 73, 26, -97, -35, -71, -87,
+    -17, 7, -4, 31, 72, -43, -44, -65, -85, -14, 61, 19, -70, -90, 77, 89,
+    -14, -25, 8, -62, 13, 91, -68, -83, 13, -29, -97, -47, 6, 66, -7, -97,
+    -50, -25, -21, 38, 1, 76, 48, 79, 84, -7, -89, 18, 0, -20, -95, -89, -7,
+    78, -83, -73, 32, 62, -44, 85, 93, 52, 10, 91, 50, 90, -5, 51, 78, 63,
+    72, -51, -49, -80, -18, -86, 32, -45, 34, -53, -72, 2, -95, 86, 18, -72,
+    -54, 75, -27, -7, 21, 69, 54, 34, 20, -6, 65, 69, -96, -23, 8, -67, 26,
+    -13, -16, 95, -93, -8, 56, 41, -35, 40, 64, 12, 33, -24, -69, -28, 7,
+    -82, 0, 82, -65, -90, -77, 27, -69, 7, 79, -4, 60, 20, -42, -61, 16, 59,
+    -85, 69, 34, 24,
+  -8, 7, -86, -37, 92, -37, 57, -38, 92, -57, 61, -100, -37, 99, 18, -19, 1,
+    31, 14, 56, -1, -51, 5, -44, 23, -50, 17, 45, 37, -9, 11, -15, 78, -61,
+    -72, 63, 21, -41, -86, 79, 20, -61, -58, -13, -41, 59, -60, -70, -85,
+    -16, 1, 63, -46, -12, 4, 12, -2, 30, -18, 35, 23, 18, 87, -95, -34, -82,
+    -4, -88, 47, -24, -7, -48, -58, 13, -95, -6, -57, -57, 22, 24, 33, -67,
+    71, -48, -98, -14, -18, 10, 52, -9, -54, -14, 52, 78, -76, 38, 73, 80,
+    43, -22, 77, 66, 7, -13, -19, 1, 31, -64, 4, -11, -19, -17, 28, 76, -81,
+    -5, 18, 85, -16, -22, 12, -76, -92, -7, -16, -42, 62, -58, 90, 19, 51,
+    36, -91, 74, -83, 90, 35, 8, 9, 80, -45, -23, -52, -39, 76, -12, -70,
+    -52, -21, 32, -79, 19, -85, 43, 36, -29, 31, -82, -87, 92, 80, 88, -80,
+    28, 42, -81, 62, 10, 77, -1, -7, -37, -26, -18, 34, -88, -20, -76, -100,
+    -14, -26, -26, 25, -54, 63, 28, 40, -38, 65, 70, 8, 18, -29, -5, -40,
+    -91, -27, 94, -36, 79, 79, 22, 58, 34, 25, -30, -92, 74, -44, 79, -1,
+    -52, -58, 41, 97, 68, -20, -39, -12, 54, -86, 64, -7, -46, 53, -71, -95,
+    -60, -100, -34, -62, 51, 85, 90, 65, 36, 63, 98, 40, 96, -10, 45, -22,
+    66, -55, -87, 3, -30, 77, 67, 80, -39, -97, 11, 7, -46, 9, 54, -44, -61,
+    -83, 65, -96, -84, -74, 6, -71, -43, -3, -98, 18, -68, 96, 70, 27, 98,
+    56, -72, -11, -38, 52, -40, -94, -46, 40, -2, 16, 40, 45, -88, -76, 25,
+    -50, 31, -44, -67, 94, -47, -25, -21, 6, 86, 72, 9, -50, 36, 48, 85, 8,
+    43, -44, 73, -7, 62, -92, 86, 26, -87, 12, 4, 48, -88, 40, 36, -15, 86,
+    -24, 65, 2, -88, 79, -63, -83,
+  25, -52, -47, -14, 83, -96, 1, 47, -32, 80, 68, -18, -71, 27, 84, 69, -39,
+    -35, 94, -68, -93, -5, 28, 0, 60, -25, 11, 30, 57, 25, -84, 57, 59, 19,
+    -6, -6, -82, -98, 98, -35, 68, -83, -99, 2, -38, 15, 67, 86, 87, -42,
+    -38, -84, 8, 9, 30, -73, -17, 93, -32, -65, 51, -8, -8, 66, 74, -32, 92,
+    -6, 9, -19, 24, 37, 6, 50, -46, -80, 19, -79, -63, 11, -41, -30, -96, -5,
+    -81, -16, -53, -83, 78, 2, 53, -87, -41, 45, 55, -16, 9, 53, -99, -3,
+    -63, 42, -95, -19, -25, 29, 57, -88, 6, 45, -91, 51, 46, -23, -71, -97,
+    46, -35, -51, -71, -19, 12, -61, 92, -70, 58, 64, -85, 28, -34, 96, -26,
+    -31, -54, -54, 81, -75, 93, 93, -10, -83, 85, -10, 58, 27, -28, 24, -81,
+    -10, 47, -85, 68, -46, -15, 12, 70, -82, -78, -17, 59, 4, 43, -100, 29,
+    -57, 50, 31, 25, 10, 9, 92, -51, 66, 12, 45, 54, 82, 28, 51, -20, 85, 46,
+    -4, -62, 73, 68, 17, 50, -96, 87, -39, 70, 75, -42, 51, -85, 55, 5, -81,
+    16, 39, -68, 92, -96, 71, 11, 44, -95, -98, 17, -90, -70, 26, -90, -40,
+    -2, 0, 89, 27, -62, -79, -19, -49, 59, -69, 90, -98, -82, -82, -24, 54,
+    -82, -90, -69, -89, -72, 15, 22, 86, -70, 33, -67, 53, -70, -27, 97, -97,
+    81, -38, 96, -71, -75, -59, 74, 32, 26, -40, 34, 29, -69, -28, -23, 56,
+    28, 32, 4, 56, -99, 45, -58, -72, -17, -2, 41, 25, 0, 79, 73, 67, -35,
+    -82, 24, 41, -72, 23, 85, -52, 53, 50, 41, 99, -81, 66, -86, -47, 65, 83,
+    0, 49, -66, 62, -23, 34, 17, 54, 71, -15, 4, -18, 36, 55, 84, -19, -26,
+    75, -38, 1, -87, 5, 51, -1, -71, 91, -43, 25, -67, -48, -72, 87, 41, -51,
+    14, 60,
+  74, -54, -15, 16, 61, -8, -54, 92, 55, 7, 40, 84, 5, -44, 18, -49, 12, -65,
+    -36, -82, 99, 92, -52, 7, 96, -62, -61, -60, -52, -45, -13, 47, 17, -84,
+    92, 18, -84, -67, -70, -10, -23, -82, 47, 39, 38, 88, -10, 18, -12, -96,
+    -63, 9, 74, 58, -43, 42, 71, -56, 11, -100, 61, -65, 43, -36, 28, 81, -5,
+    -86, 33, -46, -78, 98, 46, 24, 3, 75, 75, 17, -8, -92, 23, 96, 20, 51,
+    64, 39, -5, -88, 53, 92, 50, -25, -82, 50, -56, -16, -9, 66, 45, 39, -71,
+    -34, 32, 2, -83, 5, 90, 91, -55, -74, 67, 55, 4, 81, -5, -41, -90, -91,
+    38, -58, 8, 56, 72, -51, -12, 96, -17, -50, 1, 97, -17, 67, -1, 43, -65,
+    35, 43, 48, -98, -100, -18, 10, 62, 48, 80, -93, -52, -52, 42, 45, 55,
+    -18, 25, -50, -69, -24, -90, 55, -91, 87, 67, -46, 55, -28, -39, 23, 96,
+    39, 79, 77, 95, -26, 96, -75, -40, 85, -2, 45, 99, -41, 81, 9, 8, 83, 96,
+    -24, 1, 79, -34, -66, -64, -4, 11, 22, 5, 60, -78, 31, 78, -31, -84, -9,
+    56, -71, 49, 55, -57, 92, 43, 61, -27, 72, -5, 54, -24, 34, 19, 44, 86,
+    19, 44, 56, -28, 2, 47, -61, -30, 19, -90, 78, 58, 52, -25, 13, -97, 18,
+    55, 56, 26, -78, 6, 81, 40, -55, 54, -20, 13, 90, 46, -67, 12, 80, 71,
+    32, 12, -49, 66, 89, 83, -51, -52, -40, -39, 24, 89, -35, 7, 83, 95, -47,
+    -75, 54, 1, -29, 69, 89, -25, 57, 94, 85, -54, -25, 82, 75, 50, 23, -61,
+    -84, -79, 10, 13, -49, -68, -38, -49, -22, -100, -63, 99, -90, -97, 99,
+    44, 39, -63, -99, -58, -89, 77, -57, -70, -17, 47, 24, -90, -8, -94, 23,
+    46, 70, -70, -37, 77, 54, 74, -31, -2, 26, 13, -8, -23, 58, 11,
+  -69, 49, -64, -31, 18, -78, 6, 54, 23, 33, -83, -77, 36, 10, 46, 51, 69,
+    -2, -77, 79, -85, 6, -33, 4, 41, 86, 31, 9, -20, 70, 37, -3, -52, -53,
+    97, -69, -12, -46, 63, 18, -64, 4, 97, -99, -81, 26, 99, 23, -49, 84,
+    -70, -68, 7, 72, -68, -100, 99, 67, 4, 95, -65, -78, 61, 48, -51, -21,
+    -33, 93, -59, 91, -16, -75, -29, 98, -3, -34, -13, 61, 64, -75, 88, 33,
+    46, -31, 6, 15, 37, 97, 69, -42, 13, -11, -65, -5, 80, 41, 54, -44, 92,
+    45, 5, 71, -77, 83, 54, 43, -22, 75, 50, -19, -52, 69, 47, -73, 39, -18,
+    69, 63, -26, 58, -20, -47, 1, 54, -35, 77, -91, -23, -67, 78, -4, 37,
+    -57, -32, -44, 4, 45, 1, -21, -94, -29, -94, -5, 6, 32, 48, -80, -55, -9,
+    41, -10, -67, -87, 10, 43, 62, 6, -32, -42, -75, -73, -31, -5, -64, -94,
+    76, -77, 45, 5, 32, -94, 75, -76, -56, 44, -37, 52, 89, -70, 23, 77, -8,
+    -68, 78, 71, -100, -6, -17, -6, 39, 83, -29, 84, -99, -13, -59, 34, 34,
+    20, -42, 71, -64, 84, -94, 22, 85, 44, -54, 41, 38, -9, -49, -74, 28,
+    -83, 37, -68, -28, -38, -60, 42, 39, -58, -12, -80, -44, -47, 8, -94, 16,
+    -53, -81, -63, 81, 25, 9, -90, 68, 69, -53, -75, 90, -16, -98, -98, -21,
+    94, 24, -60, 67, -92, 98, -50, -41, -45, -70, 74, 85, -37, 32, 26, 84,
+    96, 27, -55, -85, -18, 13, -17, 66, -46, 21, 81, -19, 81, 38, 67, -20,
+    10, 43, -98, -71, -61, 97, 84, -36, 46, -77, 20, 59, -72, 67, 81, 54, 85,
+    -40, -84, 50, -53, 12, -52, -83, 40, -17, 48, -88, 52, -76, 50, 89, 60,
+    -83, 58, -22, 13, -94, 88, -12, -88, 86, -79, 54, 46, 77, -37, 85, 91,
+    26, 70, 8, -2, -20, 83,
+  0, -24, 8, 44, 99, -5, -40, 4, -51, -93, 97, 24, 31, -23, -13, 12, -82, 91,
+    25, -6, -32, -40, -4, -72, 62, -8, -45, 76, -92, -42, 86, 92, -67, -55,
+    -61, 76, -33, 86, -5, -36, 85, -99, -34, -84, -50, 38, -99, -31, 94, -75,
+    85, -79, 64, 7, -53, -94, 5, 17, 57, -6, -49, -58, 69, 47, -90, 51, -97,
+    45, -15, 0, -33, -6, -41, 57, 87, 56, 72, 18, 34, -92, -83, -52, 48, 6,
+    -70, 32, -71, 82, 56, -1, 60, 20, 79, 60, 78, 65, -4, 70, -47, 4, -19,
+    44, -6, 28, -41, 13, 24, -5, -89, -49, -73, 71, 64, -96, -82, -31, -75,
+    15, 68, 65, -7, -99, -21, 30, -15, -97, 94, -27, 30, 43, 99, -24, -26,
+    -32, -60, 53, 73, -34, 70, -30, -70, -14, 53, -66, 45, -27, 84, 34, 60,
+    -26, -58, 34, -18, -53, -79, 54, -99, 29, 71, -73, -43, 84, 33, -16, 96,
+    54, -52, 35, -17, -16, -90, -66, -72, 11, 71, 16, -92, 17, -28, 61, -81,
+    -54, 82, 73, 40, -78, -87, 66, -38, 33, -66, 60, 0, 42, -9, -60, 13, 97,
+    13, -2, 68, -6, 58, -15, 23, 6, -52, -79, 72, 44, 26, -27, 78, 29, -47,
+    -26, -78, -6, 44, -48, -53, -3, -3, 33, 17, 81, 45, 87, -39, 61, 44, 11,
+    22, 5, 11, 68, 11, -55, -30, -84, -90, -32, -75, -49, 38, 99, -94, 5, 78,
+    -38, 25, -68, -46, 82, 19, 71, -70, 40, 13, 21, 19, -37, 19, 12, 87, -9,
+    56, -85, 2, -4, -95, 13, 21, 34, 62, -25, -1, 20, 57, 62, -53, -43, 55,
+    71, 75, 29, -37, 29, -79, -40, -68, -95, -23, 53, -13, 50, 47, -34, 26,
+    23, -17, 46, -99, 10, 6, -99, 77, -26, -26, 21, -67, 22, -78, 93, 14,
+    -30, 78, 40, -28, 78, -34, -40, 27, 65, 26, 65, -55, 71, 71, 99, -73,
+    -13, 5,
+  -41, -74, 59, -27, 2, -34, -5, -42, 96, -80, -11, -20, 43, -93, -10, -33,
+    -27, 14, -73, 86, 72, 78, 13, 83, 31, 43, 3, 0, 30, 53, 92, 16, -68, -68,
+    -67, -54, -81, -18, -97, -24, -65, 41, 75, -40, 93, 69, -94, -9, 6, 23,
+    -78, -3, 14, 9, -10, -2, -66, 35, -58, -28, 88, 43, 5, -52, 21, 20, -8,
+    -32, -29, -52, 11, 75, -24, 91, 55, -54, -71, 70, 77, -31, -46, -56, -40,
+    89, -91, -9, 73, 57, 63, 53, 96, -55, -46, -37, 47, -68, -26, 92, 81,
+    -49, 85, 38, 93, 11, 3, 75, -77, -57, -45, -19, 91, -61, -46, 23, -47,
+    -86, 89, -69, 10, 31, 49, 27, 24, 77, -48, 22, 82, 26, -95, -37, -44, 36,
+    14, 43, 36, 58, 35, -25, -15, 19, 54, 96, -51, 76, -71, 24, 37, 23, 89,
+    -80, -64, 67, -21, 93, 92, -9, 45, -32, 51, -52, -30, -67, -92, -59, -50,
+    67, -29, 15, -31, -39, -25, 16, -88, 12, 77, 37, 78, -92, -100, 16, 83,
+    4, -33, 88, -97, 6, 61, 12, 64, 0, -63, 35, -97, -50, 93, 65, 20, -56,
+    87, 84, 59, 82, 26, 46, -51, -67, 26, -54, 71, -68, -78, 50, -82, 16, 9,
+    -35, -56, -12, -78, 69, -2, -8, -29, 39, 15, -48, 63, 81, 23, 43, -37,
+    -99, -70, -28, 40, 80, -4, 49, -98, -10, 32, -16, -87, 46, 72, 94, -95,
+    77, -55, 48, -4, 31, 79, -77, 2, 56, 4, 6, -17, 26, -42, 49, -57, 59,
+    -28, 4, 89, -48, -2, 81, -10, -74, -13, -75, 72, -4, -32, 67, -3, 8, 35,
+    53, 48, -59, 10, 40, 0, 76, 13, 4, 48, 32, 9, 21, 79, 39, -57, -48, 32,
+    -59, 20, -87, 73, 6, 16, 90, -82, 90, 85, -91, 24, -36, -75, 31, 57, -24,
+    -25, -66, 23, -10, 22, 58, 13, 62, 0, -1, 84, 21, -57, -13, 26, -57, 12,
+  26, 15, 96, -17, 78, 27, -37, -96, 0, 95, -67, 48, 71, 65, -43, 39, -99,
+    28, -2, 83, 13, -19, -63, 17, 83, 47, 76, 21, 17, -73, -2, -19, 38, -2,
+    -89, -46, -80, -54, 67, -3, 69, 44, -96, 56, -15, -84, -49, -13, 22, 63,
+    58, -37, -97, -86, -89, 87, -33, 95, -51, -67, -79, -75, 5, 90, -70, 54,
+    -97, 80, 35, 11, 48, -49, -99, -63, -93, 41, -56, -63, -19, -7, -26, -8,
+    -65, 99, -15, -30, 40, -41, -92, -58, 22, 23, 23, -90, 48, 69, 71, 1, 11,
+    -68, -75, -33, -16, 59, -89, -55, 43, 19, -42, -100, 0, -43, -26, -17,
+    -37, 52, -90, 12, -95, 54, 17, -80, -52, -2, -19, 72, -5, 80, 93, -89,
+    89, -90, -39, -51, 0, 40, -87, 77, -12, 59, -19, 56, 81, 64, 87, -5, -3,
+    62, 98, -31, -37, 54, -3, -29, -72, -9, 12, 80, 91, 46, -26, -75, 13, 98,
+    2, -16, 44, -54, -7, 89, -48, -31, 51, 1, -90, -69, 8, -70, -34, -8, 59,
+    -60, -15, -64, 74, 12, -80, 67, -14, 82, -85, -38, -69, 0, -23, -42, -51,
+    50, -52, -17, -30, -58, -60, 41, 40, 29, -65, -35, -71, 82, -27, 5, 14,
+    8, 19, -25, 84, 40, -1, 60, 10, 12, 46, -98, -55, 42, -71, -88, -52, -29,
+    23, 59, -26, 62, 13, 56, -75, -53, -49, 73, 88, 9, 52, 10, -43, -21, -71,
+    94, -58, 79, -81, 3, -85, -2, -6, 66, 82, -32, -68, -79, 2, 29, -36,
+    -100, -17, -33, -98, -22, -44, -1, 54, -22, -75, -30, -99, 75, -57, -61,
+    48, -8, -59, -71, 51, 48, 36, 37, 62, -37, -51, -9, -26, -29, 54, -19,
+    -13, 66, -46, 48, 80, 40, -79, 98, 14, 71, 82, 46, -60, -8, 87, -69, 90,
+    -59, -17, -4, 0, 26, 96, -14, -25, 27, -15, 88, -59, 46, -90, -95, -4,
+    -38, -99, -34, -90, 22, -26,
+  -62, 88, 95, 70, -30, -68, -78, 27, -43, -85, -43, -97, -64, -49, -96, -36,
+    -52, -93, 89, 70, -48, -62, 8, 21, 71, 67, -48, -56, 79, 82, -83, 29, 65,
+    30, 64, -7, -16, -59, 79, -31, -95, 41, 66, -36, 11, 85, -91, -97, -82,
+    55, 56, -21, -49, 37, 89, 99, 26, -76, 0, 58, -67, -100, -18, 28, -9, 41,
+    -57, 51, 60, -87, 55, -98, 14, 43, 72, -83, -56, -67, 64, -24, 64, -80,
+    61, -80, -22, 13, -38, -11, 51, 3, 66, 94, 26, -31, -4, -59, -23, 61,
+    -62, -36, 19, -78, -61, 76, -33, -7, 67, 36, -43, -59, -35, -56, 34, -19,
+    -35, -29, 38, -42, 82, -61, -7, -28, 91, 84, 87, 80, -54, 11, 63, 85,
+    -31, -85, 22, -88, -66, -10, -27, -25, -48, -1, -78, -79, 62, -1, -73,
+    14, -43, -32, 53, -89, 78, -64, -64, -33, 10, 20, 51, 22, -58, -91, 85,
+    -37, -31, 86, -51, -95, 80, 91, 25, -88, 32, 46, 7, 99, -32, -76, -57,
+    -57, 7, 79, -35, -36, 60, -26, 82, -18, 3, 54, 91, -51, 69, -31, -97, 41,
+    89, -53, -88, 72, 48, 99, 35, 14, 22, 26, -32, -46, 17, 94, 13, 44, 16,
+    89, 63, -29, -40, -34, -2, 25, -33, 46, 46, 14, -94, -35, 60, -17, 80,
+    -56, -77, -62, 1, 52, 22, -74, -18, 18, -97, -59, 80, -29, -53, -92, 24,
+    81, 47, 19, 29, -12, -74, 63, 27, 12, -45, 80, -4, -67, -42, 19, 7, 23,
+    13, 15, 30, 94, 8, 81, 96, 78, 6, -67, 74, 47, 79, 50, 82, 84, -34, 80,
+    -5, 47, -22, 9, -86, 34, -52, -54, -72, -2, 2, 2, 81, 79, 27, 78, 83, 60,
+    -38, -90, -18, -89, 29, -70, 86, 26, -48, 32, 31, -64, 55, -9, -52, 92,
+    67, -34, 26, 99, 24, 29, -51, 82, 36, 6, -50, 69, -70, 81, 40, -62, -91,
+    71, -35, -66, 39,
+  -91, 19, 75, 12, -63, -30, 71, -20, -35, -57, 55, 56, -98, -6, 59, -91,
+    -35, 8, -46, 39, 98, 99, 30, 78, -56, -82, -48, 83, 94, 89, 12, 67, 58,
+    78, 76, -87, 13, -58, 76, 86, 53, 30, 79, 60, 62, 92, 73, 89, -44, 95,
+    -49, 84, -2, 94, 14, 86, -94, -47, -71, -39, 8, 87, 16, -67, 64, -73,
+    -49, -72, -35, 21, -16, 23, -41, -31, 95, -34, -86, -87, -84, -86, 48,
+    -41, -48, 17, -74, 69, 6, 57, -28, 77, -97, -52, -55, 58, -19, -50, -35,
+    17, -64, 53, 51, 17, 34, 3, 13, 35, 49, 37, -53, 90, -2, -59, -77, -19,
+    -78, -63, 81, -26, 1, 39, 73, -73, -22, -53, -45, -71, -1, -92, 3, -89,
+    -56, -51, 31, 81, 68, 33, 79, 72, 58, 23, -71, 65, 42, 44, 58, -61, 98,
+    8, 49, 57, 78, 70, -23, 41, -36, -48, 97, -55, -6, -25, -23, 7, 71, 84,
+    -18, -90, 21, -67, 31, 20, 73, -77, 81, -76, -39, -15, 10, -31, -26, -97,
+    -92, 49, -72, -96, 15, 89, -16, -12, 95, 7, -73, 80, 31, 8, -43, -79,
+    -71, -53, 75, 80, -24, 87, 21, 32, -42, 88, 81, -61, 62, -69, -31, -62,
+    91, 9, 67, 21, 57, -40, 62, 86, -20, -8, 30, -86, -100, -44, 64, 75, 5,
+    -84, -37, 79, -63, -94, 91, -71, -97, 17, 82, 29, -20, -43, 50, 90, -100,
+    96, -30, -92, 46, -79, 29, 26, 98, -81, -23, 79, 36, 11, -53, -100, -18,
+    54, 56, 34, 0, 58, 19, -30, 46, 35, -84, 18, 44, -23, 32, -76, -69, 55,
+    -66, 26, 46, -27, 99, -37, -27, 91, -27, 70, -10, 36, 85, 37, -95, 89,
+    -53, -81, 97, -59, 68, 56, 67, 92, -77, -47, -5, 82, -77, 38, 34, -95,
+    -54, -61, 49, 99, -63, -33, -21, 85, 73, -17, 54, 14, -50, 41, -31, -4,
+    45, -17, -71, 26, 3, -13, 95,
+  -23, 70, -40, -6, 38, -75, 97, 36, 41, -29, 1, 89, 13, 77, -31, 68, 68,
+    -32, 24, -9, 17, -25, -8, 34, 12, -41, -72, 49, 40, -87, 10, 27, 1, 40,
+    76, 5, -39, 42, -11, -92, 59, 25, -93, 42, -36, -36, 76, 28, -65, -99, 1,
+    -54, -32, 68, -26, -82, -44, -99, 80, 44, 88, 86, -7, -70, 43, -32, 62,
+    61, 74, -8, -49, 36, -23, 83, 44, 63, 71, 52, -37, -28, -28, -100, 82,
+    -10, 2, 6, 33, 49, 3, 63, -2, -40, -48, 16, 92, -57, 5, -69, 75, -72, 94,
+    -42, 20, -25, 79, -66, 63, 78, 78, 79, -60, -80, 37, 98, -55, 65, -52,
+    88, -74, 25, 78, -6, -96, -40, -25, -72, 84, -42, -62, 73, -51, 5, -14,
+    5, -13, -91, -51, -63, 63, 28, -74, -44, -74, 84, 93, -9, 67, -60, -4,
+    -5, 41, -62, -89, -22, 79, -97, 23, 18, -90, -66, 16, -79, -95, -59, -59,
+    -1, -96, 84, 50, -19, -18, 40, -91, -64, 45, 54, 62, 99, -41, 64, 78, 29,
+    -46, 7, 31, 19, -97, -68, 78, -13, -40, 22, 95, -2, -11, -78, -48, 21,
+    59, -50, -73, 14, -89, -18, 81, 49, 33, -38, -51, -50, -69, 73, 16, 43,
+    -10, 6, 82, -20, -72, -14, 38, 6, -45, 62, -6, 0, -73, 1, 4, 40, 95, 4,
+    -73, 58, 67, -69, 31, 30, -3, -47, 11, 36, -6, 44, 61, -41, 23, -44, 8,
+    14, -87, -11, -74, 7, -76, -14, 18, 11, -7, -2, -96, -45, 82, -70, 26,
+    18, -3, -31, 28, 15, -29, -85, -87, -2, -12, -47, -66, 79, 81, 67, -8,
+    86, 19, -70, 54, -63, -46, -75, 40, -66, -9, -79, 55, -7, -60, -90, 77,
+    2, 86, -28, 19, -13, 0, 7, 81, 5, -93, -92, -79, 67, -43, 2, -58, -24,
+    97, 2, -54, 32, -66, -30, 89, -84, 0, 35, 61, 48, 85, 44, 31, -58, -59,
+    98, 94,
+  38, 49, 49, 86, -40, 55, 44, 59, 12, -18, -79, 54, -78, -92, 56, -7, 51,
+    -97, 40, 66, 77, -58, 34, -28, -13, -4, -79, -80, -11, 95, -74, 41, -96,
+    -75, 60, 28, 54, -10, -75, -90, -18, 43, 86, -17, -81, -82, 23, -60, -43,
+    -87, -65, -82, 34, -63, 20, -94, 24, 63, -61, 96, -46, -30, -97, 40, 66,
+    17, 77, 21, -44, 45, 60, -28, 15, -71, -25, 31, 55, 21, 10, 58, -27, 84,
+    -70, -61, -100, -62, 9, 97, 77, -83, -94, -67, 68, -52, 14, -44, -10,
+    -81, 56, -86, -76, 30, 64, 31, -39, 77, -49, 96, -44, -1, -14, -63, -8,
+    23, 29, -77, 31, -8, 7, -71, -4, 46, -88, 84, -13, -21, 26, -78, -51,
+    -21, -6, 41, -59, -10, 15, 25, 64, 95, -2, -29, -59, 48, 0, -40, 23, -18,
+    -70, -24, 35, -12, 0, 55, -43, 36, -2, -51, -60, 91, -84, -76, -97, 95,
+    84, 98, -16, -56, 58, 50, -36, -18, -39, -4, -30, 17, 97, -62, -20, 92,
+    -18, 17, 15, -61, 57, -98, 78, 95, -60, 36, 23, 2, -78, -7, 96, -96, 69,
+    -75, -20, -58, 20, -100, -2, -72, -40, -26, 83, -41, 1, 76, -94, 18, 69,
+    -85, -5, -56, 30, -33, -77, 11, 1, -48, -82, 83, 27, -38, -61, 93, -36,
+    36, 84, -81, 37, -55, 94, -41, -55, -38, 56, -19, 99, -13, -98, -18, -81,
+    -78, 82, -17, -79, -74, 89, -22, -35, -92, 25, 78, -63, 38, 92, 21, -65,
+    -59, -32, 0, 79, -67, -31, -6, -74, 37, -10, -66, 75, 54, 18, 69, -4,
+    -71, 28, 36, 15, 63, -95, 99, 67, 57, -52, 67, -11, -61, -39, 50, -34,
+    -43, -82, 19, 74, -38, 69, -43, -37, 67, 32, -65, 55, -19, 82, -92, 35,
+    -64, 59, -30, -94, 72, 34, -76, -81, -82, 91, 63, -65, 83, 99, 79, -40,
+    -88, 67, -74, -9, 14, 81, 19, 32, -98, -33,
+  26, -66, -78, -43, -29, 42, 83, 45, -48, -92, 29, -28, 14, 3, -59, -78,
+    -83, -48, -47, 35, 45, 52, -85, 37, 2, -91, 33, -19, 11, -21, -45, -48,
+    -38, -12, 60, 15, -74, 9, -28, -49, -31, 67, 19, 75, 16, 77, 43, -86, 71,
+    -15, -45, 16, -48, -32, -28, 32, 40, -52, 46, 60, -12, 72, -46, 87, -54,
+    26, 47, -36, 33, 79, -55, 50, -54, -21, -23, 61, -32, -34, -45, -25, 56,
+    28, -56, -2, -15, -92, 89, 69, -25, 15, -74, 59, -85, 84, 26, -29, -40,
+    75, -85, -61, 81, 43, 95, 44, 68, -63, 30, -94, 63, 36, 29, -77, -12, 9,
+    -90, 18, -99, -15, 41, -68, 83, -56, 21, -96, 81, -31, 78, -27, 8, 38,
+    -78, -76, -8, -45, -46, 54, -79, 22, 89, 45, -89, 94, 19, -21, 30, -46,
+    -67, 2, -93, 82, 20, 27, -65, -13, 54, -36, -13, 87, 46, -50, 72, -63,
+    73, -77, -46, -94, -36, 30, -30, -27, 86, 16, 21, 4, 25, -55, 89, 52, 69,
+    -20, -55, -10, -62, 10, 90, 19, -98, -16, -28, 68, 72, 48, -61, 40, 90,
+    -38, -38, -82, -39, -40, 34, -19, 27, 76, -78, -28, 37, 77, -99, -20,
+    -53, -7, -61, 59, 79, -36, -1, 32, -21, 21, -18, 3, -12, 10, 63, -74,
+    -18, -40, 68, 73, 87, 82, 41, -27, -22, 60, -66, 81, -82, 53, -90, 99,
+    -97, -16, -19, 24, -12, -99, 59, -29, 42, -14, 59, 67, -54, 69, -35, 6,
+    -99, -79, 42, -6, 71, 85, 84, -25, -26, -98, 12, -98, -84, 39, 0, 54,
+    -67, 4, -50, -59, -56, -3, 34, -64, -24, 63, 91, 57, 60, 44, -88, 23, 4,
+    -60, 54, -52, -83, 88, -59, -79, 8, 48, 80, -41, -86, -38, 18, 54, 85,
+    -31, 57, -45, -15, 61, -41, -61, -65, -2, -38, -53, -13, -75, -26, -98,
+    81, 79, -83, -14, -82, -24, -20, 52, 39, 66, 26,
+  52, 52, -91, 6, -52, -31, 31, -65, -98, 7, -29, 36, 29, -34, -52, 29, -89,
+    43, 24, -97, -66, -73, 12, 96, 34, 2, 66, -52, -78, -88, -19, -24, 64,
+    -35, -22, 31, 23, -18, 31, -38, 35, -8, 90, -75, 75, -61, -61, -23, 53,
+    13, -49, 24, 30, 88, -82, -67, 78, 19, -82, 34, 46, 34, -72, -35, -18,
+    -20, 16, 56, 24, -85, 1, -79, 13, 42, -52, -95, -42, -35, 23, 10, -34,
+    87, -5, 12, -78, 12, -83, 41, 81, -27, 48, 84, -13, 87, -56, 22, 90, -13,
+    -9, 35, -3, -45, -100, 8, 44, 48, -78, 85, 50, -44, 70, 74, 84, -12, -55,
+    31, 59, 17, 41, 5, 54, -1, 20, -20, 81, 42, 65, -2, -11, -30, -23, -97,
+    60, -11, -83, -53, -74, 55, 91, 38, -73, 48, 21, 73, 62, 55, 60, 53, -54,
+    -53, -44, -21, -30, 63, 31, 57, 92, 51, -38, -77, 65, 9, -78, -25, 40,
+    -67, -5, -22, 2, -28, 73, -29, 33, 46, 24, -36, -58, 88, 24, -84, 73,
+    -90, 81, -96, 90, -2, 94, 47, 84, 0, -46, 6, -27, 58, 41, -73, 44, 63,
+    -35, 4, -87, 71, -53, 56, -53, -69, -10, -61, 57, 15, -59, 13, -15, -21,
+    45, -78, -11, 2, -70, 18, -20, 20, 19, -91, 88, -55, -35, -26, 78, 14,
+    42, -36, -94, -87, 1, -13, -49, 75, 45, -29, 70, 34, -12, 77, -19, -78,
+    -95, 98, -29, 73, -16, -21, -53, -73, -43, -92, 88, -75, 64, -87, 74,
+    -94, -5, 99, -76, 91, -92, 35, 87, -34, 12, -67, 95, -21, 77, -6, 87,
+    -65, -77, 76, 89, -80, -69, 67, 52, -89, 30, 37, -23, -100, -35, 32, 97,
+    -17, -95, 78, 25, 71, 24, 97, 28, -42, -8, -87, -30, -25, 89, 34, 3, -84,
+    -84, -85, -51, 62, 72, 28, 4, 83, -26, 96, 19, -95, 50, 81, -27, 31, 59,
+    -7, -98, 75, -52, 50, 89,
+  38, 56, 32, -99, -68, 75, 3, 32, -76, 12, 47, 75, -14, 7, -22, 84, 85, 33,
+    19, 10, -96, -52, -2, -66, 9, -10, -66, -77, 7, -58, -72, -66, -21, -63,
+    46, 65, 28, 34, 80, 19, 24, -88, 50, 20, -3, -38, 73, -24, -27, -2, 72,
+    -3, 15, 79, 79, -21, -52, 33, -56, -87, 97, -59, 67, -56, -86, 7, 35, 93,
+    -19, -81, -29, -76, -75, -94, 97, -8, 24, 79, -35, 4, 63, 43, -84, -2,
+    -72, -31, 8, 30, -38, -36, -6, -47, 50, 8, 95, 29, -17, -23, 94, -29,
+    -31, -96, 89, -46, -87, -28, -98, -9, -83, 1, -50, -47, -52, 40, -81,
+    -61, -27, -10, 31, -73, -57, -100, -80, 85, 35, -37, -33, -67, -13, -25,
+    82, -57, -18, -23, 19, -71, 16, 96, -83, 79, -2, -89, 5, 89, -73, 5, -37,
+    57, 42, -56, -35, -87, -81, -57, 94, 85, -14, 2, -41, -60, 13, -10, -61,
+    2, -17, 6, -94, 91, -88, 10, 24, 86, -97, 24, -60, 81, 48, -42, 87, 75,
+    -88, 84, 77, 72, -60, -56, -5, 90, -39, -26, -4, 45, -78, -50, 8, -35,
+    -30, 88, 19, -14, 70, 14, -20, 54, 24, 85, -73, 62, 94, -90, 58, 43, 19,
+    -75, -46, 95, -57, -61, 30, -29, -36, 21, -51, 23, 22, -72, -85, -4, 39,
+    -13, -40, -46, 31, -36, -35, -76, 4, -22, -27, -26, 11, -18, 70, -75, 95,
+    -30, -48, -40, -83, 83, 34, -44, 55, 28, -52, -17, 43, 8, -25, 15, 50,
+    -96, -99, 74, -81, -50, -85, 93, -73, 62, -47, 32, -50, 76, 67, 47, 42,
+    19, -88, 4, 10, -18, -89, 23, 94, 66, -31, -33, -24, -50, -73, 27, -97,
+    34, 13, -48, 17, -74, -22, 66, -72, -92, -3, -12, -21, 35, 9, -100, 97,
+    -78, 12, 40, -46, -2, 47, 43, 64, 93, -66, 57, 14, -31, 80, 1, -22, -100,
+    -23, -86, -11, 7, 80, 62, 99,
+  -49, -47, 40, 74, 17, -71, -26, 32, -6, 25, 26, -88, 5, 3, -61, -81, 24,
+    96, 77, 69, 46, -21, -35, -76, 80, 27, -8, 39, 93, 27, 79, -37, 97, -70,
+    -50, -25, 90, 3, -28, -14, 89, 82, -59, -27, 57, -55, 58, 81, -70, 98,
+    -87, 53, 55, 26, -42, 28, 95, 68, 50, 78, 73, -69, 27, 89, 78, 34, 14,
+    -20, 66, 33, -69, 67, -71, 86, 46, 83, 53, -32, -68, -69, -89, 63, 82,
+    -83, 90, -11, -76, -51, 9, 11, -59, -73, 80, -39, -45, 39, 98, 62, 75,
+    41, -42, 27, -58, -25, -63, -14, 99, 99, -38, -63, 88, 0, 36, 24, 5, 40,
+    -87, -63, 52, 3, 27, -10, -49, 94, 72, 10, 75, 51, -54, -31, 86, 90, -89,
+    83, -69, 8, 47, -22, -98, -62, -53, 91, 73, -31, -73, -59, -46, -7, 25,
+    56, -8, 24, -71, -91, -60, -13, -5, 62, 76, 35, -34, 59, 88, 42, -94,
+    -92, -38, 19, 96, -22, -80, -27, 61, 29, 13, 70, -63, -1, 10, -52, 48,
+    -45, 4, -93, 98, 71, -48, -40, -89, -68, 11, -19, -89, -25, 83, -59, 93,
+    85, 91, 22, -24, 90, -91, -96, -85, 30, 19, 56, -41, -31, -86, -26, 77,
+    54, -51, 4, 31, -10, -72, -73, -13, 96, 50, 20, -25, 14, 75, 94, -50,
+    -52, 26, -93, -64, -11, -73, -96, 89, -30, -14, -4, -12, -67, 95, 76, 94,
+    -98, -90, 21, 77, 7, -50, -32, 54, 86, 30, -12, -80, -89, -79, 75, 60,
+    28, 39, -1, 86, -56, 56, 41, 6, 19, -33, -18, 77, 21, -7, -33, -27, 15,
+    -2, -61, 40, 75, 49, 69, -26, -82, -36, 30, 69, 66, -90, 72, -96, -72,
+    55, -60, 57, 19, -1, -24, -26, -95, 40, 0, 72, 65, 61, -25, 12, 71, -11,
+    1, 28, -99, 40, 9, -12, 73, -78, 75, 41, -29, -51, -60, 12, 67, 49, -82,
+    -32, -59, -84, -91, 49,
+  -55, 95, -57, 8, -76, 40, -52, 24, 37, -75, -99, -48, 34, 45, 48, 39, -33,
+    40, 6, -83, -14, 40, 43, -95, -68, 49, -98, -38, -78, -65, 25, -79, 63,
+    19, 7, -25, -90, -8, -84, 22, 32, -62, -38, 38, -67, 93, 70, -71, -72,
+    -80, -89, 56, 54, -17, -96, -7, -28, -83, 63, -62, -6, 8, 43, -90, 18,
+    -4, 52, 3, -56, -44, 72, -100, 55, 2, 4, 2, -58, -15, 58, -51, -45, 9,
+    -47, 10, -43, -38, -69, 7, -20, 22, -92, -79, -50, 36, -65, -61, 26, 60,
+    -80, -86, -3, -98, -92, 83, 84, -85, -76, -78, -14, -23, -67, 31, 6, 36,
+    -21, 4, 88, -54, 89, 16, -49, 40, -76, 54, -85, -43, 27, -15, -24, -78,
+    -65, 2, -37, -36, -73, -8, 65, 85, -9, -70, -99, 11, -93, 90, -82, 0, -6,
+    -16, -21, -67, 25, -25, 83, -35, -2, 93, 82, -80, -68, 2, -11, -66, -12,
+    -8, 34, -37, 24, -78, 40, -88, 38, 47, 79, -67, -14, -43, -67, 48, 8,
+    -99, -19, 26, 27, 45, 34, -63, 4, -14, 18, -13, -52, -40, 93, 67, -59,
+    -67, 85, -1, -20, -38, 36, -67, -44, -35, -65, -73, 16, -93, -70, -45,
+    62, 62, -39, 40, 25, 3, 67, 17, -98, -67, -34, -13, -89, -2, 71, 97, -91,
+    -66, 0, -17, 42, 14, 44, -3, -64, -56, -85, -100, -2, -59, -29, 95, 9,
+    -67, -72, 88, -61, 85, 4, 43, 92, -90, -92, -39, 82, 29, 53, 98, 69, -33,
+    -100, -58, -45, -40, 43, 56, 71, -90, -15, 51, 91, -61, 50, -20, 24, 84,
+    41, 16, -79, -57, 38, -75, 99, 61, -2, 73, 86, 7, -91, 52, 2, -50, 20,
+    98, -12, 45, 3, -41, 61, -77, 24, -16, -98, 59, -22, 42, -84, 8, 30, 3,
+    -90, 1, 56, -51, 72, -98, 6, 64, -44, 84, 44, -69, -61, 18, 5, 96, -25,
+    80, 32, 97, 45, 2, 5,
+  -49, 89, -29, -40, 61, 81, 81, 35, -38, 9, -45, 12, -88, 48, 93, -22, -5,
+    60, -78, -50, -2, -18, 65, 45, 62, 37, -84, 1, 87, -43, -8, 22, -79, -31,
+    84, 87, -77, -9, -27, -12, 83, -36, -35, 10, -18, 75, 31, 94, -1, -96,
+    -28, 58, -97, -23, -73, 77, -20, 10, -60, 63, 64, -58, 36, -62, -44, 11,
+    76, 5, 55, -68, -99, -56, -96, -7, -85, 62, 33, 34, -5, 98, -73, -27, 18,
+    61, -99, 53, 20, 28, 99, 90, 33, -62, 48, 51, 84, 0, 18, 51, -46, -65,
+    29, -65, -80, 6, -64, 35, 28, -34, 52, -33, 49, 82, 77, -25, 58, -42,
+    -57, -37, -33, -48, -70, -13, 56, -33, -24, -67, -31, 64, -53, -86, 56,
+    49, -89, -4, 83, -48, 56, 76, -12, 48, 39, 14, -64, 94, 88, 55, -35, 54,
+    53, -48, 22, -4, 12, 69, -36, 32, 31, -26, -98, -81, -24, -79, 68, 0, 99,
+    0, -42, -6, -74, 97, 18, -92, -5, -11, -64, 63, 56, -26, -75, -11, -38,
+    14, 70, 55, 85, 56, 8, -59, 50, 65, 96, 14, 66, 17, -77, 98, 92, -15,
+    -97, 9, 92, 8, 92, -41, 42, -84, 92, 65, 42, 69, -55, -13, 33, 66, -83,
+    96, 61, -87, -79, 1, -80, -95, 47, 15, 99, 49, -41, 29, 50, -50, 97, 86,
+    -49, 78, 46, 55, 57, -94, -32, -96, -97, -90, -53, -4, -1, 11, 93, 48,
+    33, 42, 9, 81, -1, 70, 86, -53, -68, -96, 81, -81, -66, -29, -57, -98, 7,
+    64, 12, 48, 29, 97, -3, 75, -41, -31, -81, 85, 75, 29, 88, 68, -35, 94,
+    27, -65, -37, 55, 58, 24, -51, -61, 82, 72, -91, 74, -15, -45, 94, 49,
+    -24, -42, -25, -42, 86, 56, 77, 72, 92, -6, -89, 58, -52, 80, -33, 25,
+    -78, 75, 51, 75, -56, -75, -83, 15, 87, -54, 84, 23, -20, -81, -41, -22,
+    20, 82, 11,
+  -51, 35, 43, 66, 39, -72, 10, 57, -99, 37, -73, 83, -6, -65, 58, -39, -99,
+    -45, -42, 87, -83, -93, 77, -26, -21, -39, 27, -64, -31, 46, 50, 70, -46,
+    -43, -96, -36, -51, 85, -5, 93, 69, -75, -20, 9, 39, 1, 80, 19, 51, -3,
+    75, 2, 76, -47, 67, 51, 36, -61, 20, 15, -74, 38, 0, 20, 60, 38, 95, -18,
+    26, -19, 68, -25, -99, 42, 64, -94, 48, -53, -93, 84, -49, -75, 42, 89,
+    -41, 5, 6, -8, 89, -74, 71, 43, -41, -15, 3, -75, -82, 3, -69, -37, -67,
+    -20, 71, -89, -100, 11, -95, -36, 70, 87, 90, -40, 99, 71, -14, 93, -80,
+    -19, 7, -17, -17, -45, -25, 43, 72, 96, 64, 81, 52, -43, 81, 26, 10, 29,
+    -28, -31, -5, -98, 84, 31, 7, -45, -50, -96, 40, 74, 42, 26, -66, -90,
+    -35, -67, -16, -91, -30, 30, -72, 94, -86, -14, 32, -65, -82, -13, -88,
+    22, 76, 37, -27, -78, 86, 33, -51, 74, 68, 94, -82, 29, -78, -2, 83, -78,
+    -46, 59, 91, -15, 57, -39, -21, -3, 27, -9, 39, -90, -82, -86, -28, 98,
+    -58, -99, -51, -56, 57, -55, -50, -10, -90, 98, -94, 32, -100, -26, 26,
+    -2, 77, -86, -33, 84, -12, 42, -82, 20, -31, -99, 48, 85, -87, -3, -64,
+    -83, -22, 24, 90, 21, 77, 8, 30, -19, 23, 34, 18, -17, -32, 83, -67, -74,
+    43, 78, 81, -46, -7, 12, -35, 55, -54, 56, -84, 72, -9, 77, 97, 36, -9,
+    -97, -35, 80, -82, -48, 90, -92, -88, 70, -23, -84, -71, 55, -7, 59, -53,
+    56, 38, 29, 61, -27, -24, -61, -15, 52, -97, -87, 90, -19, 32, 83, -5,
+    99, -62, 21, -25, 71, -2, 48, -37, 17, -48, -53, -73, 11, 45, 12, -89,
+    20, 26, 45, -36, 46, -67, -100, -3, 24, -77, -2, -84, -19, -13, -91, -36,
+    -9, -74, -31, 54, -74, 10,
+  66, -21, -38, 52, 34, -38, 79, -15, -2, 70, -45, -38, 11, 23, -11, 40, -22,
+    -65, 83, -67, 50, -42, 21, -85, 71, 75, 12, 53, 83, -72, -39, 44, -61,
+    29, 44, 66, -54, 6, -96, -31, -40, -43, 58, -94, 34, 8, -87, 23, 28, -29,
+    64, 46, 75, 87, -58, 98, 54, -30, -39, 1, 32, 66, -38, -70, -45, 20, 68,
+    -3, 37, -64, -63, 80, -22, 85, 91, 20, 5, -79, -80, 83, 55, -73, -95, 31,
+    -28, -23, -46, 59, 24, 64, -94, 1, -72, 1, -67, 36, -34, 47, 34, -95, -4,
+    -60, 22, -10, -92, 66, -11, -22, 16, -17, 25, -72, 39, 91, -96, -37, 45,
+    54, -73, 50, -32, 40, -26, 43, -40, 31, -71, 86, -66, -56, -80, 36, 92,
+    92, -56, 57, -25, 85, 94, -58, 27, -70, 81, 61, 82, -52, -64, 93, -17,
+    66, 18, 88, -62, -19, 53, -58, -11, -25, -98, -84, -75, 87, 93, 55, 33,
+    -7, -79, -12, -30, -84, -46, 94, -10, -52, -77, -94, -45, -25, -55, -84,
+    -25, 15, 44, 53, 32, -18, -55, 30, -71, 28, -7, -72, 14, -83, 39, 48,
+    -74, 8, -85, 99, 39, 38, -62, 49, 95, 82, -71, -24, -50, -46, 14, 66, 69,
+    83, -100, -92, 17, 85, -53, 97, 46, 55, -62, 18, 53, 38, 39, 18, 70, 13,
+    -52, -65, -64, -16, 44, -100, 92, 96, 72, 43, 1, 8, -30, -51, 72, -18,
+    29, -37, -8, -21, 58, -18, -69, -45, -6, -6, -11, -12, 81, 5, 35, 74,
+    -80, -77, -37, -29, 85, -22, -31, -19, -21, -93, 9, 75, 35, -11, -55, 68,
+    -8, -99, 51, -25, 49, 45, -71, 50, 24, -36, -85, 54, -6, 2, -21, 14, -74,
+    90, -46, 85, -13, -17, -72, 33, -11, 60, 60, -48, 28, 66, -60, -28, -74,
+    66, 4, 72, 67, -71, -13, -20, -60, 79, 85, -54, 11, -26, -55, 74, 12, 76,
+    -26, -49, 80, 95, 68,
+  -16, -58, 83, 56, 22, 85, -36, 93, 28, 58, -15, -19, -6, -78, -44, 62, -3,
+    73, 86, -38, -65, -28, 93, 88, 87, 98, -70, 22, 59, -12, -96, -60, -88,
+    24, -18, -10, 61, -66, -81, 1, -91, -4, 86, 97, 28, 63, -73, -99, 63,
+    -19, -2, -52, -66, -23, -38, 0, -46, -80, -26, 15, -84, -53, -51, 99, 45,
+    94, 88, -27, 42, -32, -89, 86, 47, -29, -99, 90, 94, -99, -15, 71, -91,
+    81, -22, -40, 16, -20, -40, 32, -43, -40, -32, 99, -49, -64, 94, 63, -32,
+    29, 26, 93, 58, -33, 28, 20, -39, -45, -64, 38, -23, -45, 63, 57, 5, 34,
+    36, 65, 84, 92, 58, 89, 93, -23, -65, -2, 29, 10, -51, -22, -40, 59, 53,
+    -69, 97, -37, 35, -53, 59, 92, 69, 86, 82, -72, -12, 17, 29, 67, 95, -76,
+    -96, 82, 66, 40, 63, 14, -95, -68, 69, 72, 14, -70, -56, 51, -38, -4, 63,
+    -24, -35, -77, -1, 67, -26, 32, 59, 25, 87, 85, -6, 35, 24, 44, 90, 76,
+    72, 69, 66, -12, -93, -29, -56, 14, -52, 64, 14, 75, 0, -50, -49, 78,
+    -100, 99, 94, 89, -47, -59, 56, 2, -42, 8, -3, 72, 70, 41, -3, 5, -34,
+    43, 13, -33, -4, -43, -23, 25, 53, -48, -6, -23, 81, 12, -57, -18, -66,
+    -1, 49, -19, 90, 40, 76, -46, -11, 20, -99, -47, 65, -40, 53, -67, -52,
+    -11, 35, -3, 48, 74, 81, -11, -63, 77, -80, -83, -85, -20, -3, -9, 74, 6,
+    -75, -21, 94, -39, 18, -7, -84, -77, -29, 97, -3, 2, 42, 23, 66, 63, 82,
+    -35, -5, 67, -24, -78, -1, -72, 79, -94, -53, 64, -70, -57, -22, 79, -35,
+    67, -92, 10, 33, 86, -13, 41, -70, 32, -88, -9, 25, 40, -12, 67, -64,
+    -32, -59, 60, -76, -3, 96, -26, -39, 39, -90, 72, -100, -20, -5, 79, 93,
+    -1, -30, 12, -98,
+  -99, -14, -53, 26, -47, -34, 24, 98, -52, -89, -45, 53, 23, 89, -53, 65,
+    -69, -48, -26, 93, 65, 79, 65, -97, 25, -26, -64, -16, -32, 29, -8, 89,
+    -32, 39, 28, 60, -87, -88, 72, -60, -50, -46, -39, -4, 39, 72, 33, -35,
+    50, -58, -38, 23, 70, 35, 30, -38, -49, 85, 58, -56, -38, -29, -11, -32,
+    -88, -30, -73, 27, 23, 54, 92, 76, 41, -86, -12, -39, 87, 74, -4, -72,
+    85, -29, -15, -30, 24, 83, -18, -54, -35, 43, -89, -26, 39, -60, 59, 40,
+    22, 77, -27, -11, 70, 26, -2, -40, 89, 94, -20, 25, 66, 29, 66, 6, 73,
+    55, 78, 4, 22, -42, -15, -29, 72, 4, -60, 62, 4, -4, 47, -95, -82, -14,
+    1, 52, -82, -4, 14, -22, 48, -28, 87, -83, -34, -65, 36, -8, -11, 24, 15,
+    60, 59, 69, 67, -7, 33, -28, 62, 25, 97, -92, -65, 59, -59, -79, 69, -51,
+    31, -5, -58, 89, -18, 14, -83, 19, -46, -7, 28, 82, 0, 46, -86, -77, 56,
+    12, 54, 21, -90, -47, -16, -66, 95, 44, 32, 4, 73, 19, 43, 93, -61, 94,
+    35, -55, -98, -93, -8, 59, -87, -69, 47, 32, 28, 19, 28, 67, 41, 58, -83,
+    -67, -64, -55, 56, -85, -42, -86, 35, 14, -57, 93, -11, 21, -1, -87, 44,
+    -6, 71, 16, -46, -17, -62, 16, -21, 66, -14, 45, -73, -68, 84, -50, 82,
+    20, 5, -57, 61, -32, 46, 38, 83, -51, 77, -19, -20, 19, -87, 77, -91, 85,
+    -58, -95, -40, 76, -96, 9, 40, -70, 43, -33, -84, -49, -42, -41, -79, 89,
+    6, 0, 29, -43, -50, 46, -40, -55, -58, -54, -80, 29, -23, -54, -87, -22,
+    -78, -33, -55, -74, 27, 77, -5, -38, 55, 26, -33, -98, -57, -94, -56, 54,
+    91, -33, -98, -45, 74, -73, 43, 61, -73, -69, -47, -91, -60, 78, 74, 61,
+    67, 13, -64, 96, -8,
+  -51, -67, -13, 31, -49, -28, 4, 14, 88, -30, 29, 16, 91, 50, 66, 83, 40,
+    -65, 35, 90, 73, -69, -47, 47, 33, 93, 97, 53, 43, 60, 48, -83, 25, -46,
+    1, -75, -62, -78, 63, -35, -1, 49, -99, -7, 28, 18, -18, 96, -29, -58,
+    -80, -67, -56, 47, 10, 75, -97, 66, 14, 81, -22, -88, -65, -38, 22, -42,
+    48, -37, -77, -58, -90, 82, 73, 99, -65, -90, 26, -55, 71, -85, -12, 32,
+    39, 91, 83, -39, -73, -18, -39, 93, 60, -34, -43, 20, -86, -50, 40, 34,
+    77, -59, -72, -95, -67, -25, -3, 49, 41, 41, -49, -77, 24, 17, 13, 23,
+    -62, 9, -8, -54, -66, -31, -32, -50, -8, 46, -71, 77, 96, -92, 0, 32,
+    -47, -86, 11, 22, -78, 59, -51, 21, 6, -83, -33, -61, 79, 83, -40, -8,
+    62, 56, 35, -46, -15, 90, 43, 34, -85, -33, -27, 26, 3, 94, 85, -48, 73,
+    29, -100, 93, -50, -3, -51, 73, 4, 48, -51, -64, 34, -31, 46, 77, -13,
+    61, -18, -14, 38, 67, 5, 40, -14, -10, 12, -62, -44, -45, 41, 51, 80, 30,
+    -28, -33, 49, -46, -99, 84, -89, -65, -24, 75, 2, 71, 32, 97, 0, -54,
+    -40, 13, -49, -93, -13, 52, -100, 0, 9, 98, 19, -63, -63, 36, -55, -55,
+    -76, 30, 13, 62, -51, 65, 17, 75, -53, 65, -83, -6, -14, -75, 86, -64,
+    13, 76, -68, 19, 14, -95, 50, 33, 76, -92, 10, 39, 0, 44, -22, 28, -36,
+    -48, 93, 62, -55, 66, -68, 26, -58, 46, 98, 96, 5, 48, -98, 13, 77, -22,
+    -65, 8, -6, -93, -53, 59, 5, 38, 17, 98, -40, -36, -66, -100, -65, -74,
+    96, 89, 48, 55, 93, -83, -77, -95, -91, 96, 98, 48, 37, -15, 80, 86, 14,
+    92, -78, 61, 4, -64, 97, 89, -86, -32, 26, -53, 19, 97, 61, -13, -2, 64,
+    -82, 98, 82, 57, 66,
+  -59, -93, -97, -84, 45, -36, -46, 98, 74, -19, 43, 9, 2, 3, 37, 99, 88,
+    -81, 3, -82, -70, 45, -38, -26, -87, 2, 56, -92, 29, 35, -3, -80, 17, 68,
+    -68, -13, 71, 10, -53, -84, 16, -68, -76, 65, 93, -13, 34, 94, 46, 9,
+    -90, -85, 54, -43, -57, -26, 52, -84, -17, 29, 78, 35, -6, -29, -48, -70,
+    -4, 68, 42, 22, -54, 30, -86, 46, 60, -46, -8, -25, 60, -83, 9, 37, -26,
+    75, 97, 94, -7, -95, -93, 69, 56, -2, -77, 24, 0, -18, 45, -1, -50, -15,
+    -93, -54, -83, 21, -17, -42, -21, -41, -39, -54, 74, -17, 78, -63, -77,
+    -64, -82, 19, 62, 14, 39, -67, -43, -7, -26, -13, -6, -24, 15, -90, -14,
+    66, 9, 11, 8, 41, -54, 3, -68, -81, -81, 57, 99, -40, 34, 88, -66, 20,
+    30, 32, 22, -64, 41, 27, 14, -35, 53, 1, -78, -49, -52, -2, 86, 14, 86,
+    -24, 33, 69, 52, 35, -35, -5, 0, 17, -3, -72, 47, 97, 35, 6, 32, -91,
+    -89, 63, -25, 45, 27, 8, 84, -45, 89, 25, -56, -40, -53, 31, 30, 2, -40,
+    51, 59, 69, 70, -59, 30, 31, -30, -74, -58, 16, 94, -79, -90, -74, 89,
+    -22, -38, 11, 97, 21, 14, -17, -67, 60, 96, 44, -41, -19, -51, -69, -66,
+    9, 39, 20, -23, 53, 2, 46, 17, -42, -14, 85, 44, 69, -73, -1, 80, 97, 99,
+    53, -17, -46, -60, 70, -19, 69, 98, -53, -28, -83, -52, -26, -17, -30,
+    -96, -24, 26, 92, -20, 58, 17, 42, 60, 27, -26, -50, -21, 9, 97, -7, -82,
+    -61, -11, 8, -43, -10, -91, 16, 21, -53, -81, 32, 15, -49, -30, -47, -25,
+    -68, -70, -10, -86, -16, -40, -33, -81, -47, 17, 33, 46, -38, 34, -42,
+    10, -92, -47, -71, -7, -15, -60, 61, -83, 8, 51, 37, -24, 26, -44, -5,
+    29, 77, 61, -71, -64,
+  78, 3, -55, -40, -68, -10, -55, 59, -62, 58, -8, 38, -56, -89, 99, -18,
+    -82, -71, 98, 38, 23, 20, 47, 28, -23, -61, -21, -78, 4, -92, 74, -13,
+    72, 53, 85, -52, -28, -29, 70, 39, -23, -83, -76, 28, 23, -100, -95, 98,
+    -59, 4, -77, 54, 89, 16, -70, 13, 15, -71, 32, 67, 36, 44, -85, -51, -47,
+    -57, 37, 66, 33, -83, 12, 3, 59, 84, 98, -79, 3, -91, 10, -50, -32, 14,
+    63, 21, 65, -100, 73, -26, -14, 58, -47, -81, -54, -74, -72, -92, -83,
+    -22, -97, -33, -95, 38, 49, -66, -23, -96, -67, -46, 38, 90, 83, -61,
+    -63, 48, 74, -93, -29, 58, -70, 0, -12, 36, 59, 72, -78, -21, 27, -22, 1,
+    -20, -97, 12, -30, -51, 40, 20, -79, -42, 6, 80, 94, -8, -30, -47, -65,
+    -27, 69, 43, 3, 71, 73, 22, 42, 80, 47, -42, 54, 38, -14, -47, 37, -3,
+    -59, -37, 38, 72, -44, 33, -62, -33, 62, -11, -16, -47, 41, 6, 49, -96,
+    -29, -44, -29, 92, 79, -6, -33, 83, -79, 75, 10, -68, -85, -86, 68, 79,
+    63, -33, 27, -79, 50, -50, -62, 40, -5, 65, 29, -87, -20, -5, -62, -4,
+    -78, -97, 5, -20, 63, -77, 37, 61, -11, -19, -67, 1, 45, 40, 88, 94, -74,
+    39, 84, 0, 58, -79, 50, 20, -88, -32, 61, 1, -42, 99, -82, 81, -44, 44,
+    72, 4, 99, 53, 42, -20, -88, 26, 23, 22, -72, 72, -55, -74, -14, 6, -39,
+    -5, 49, 68, 43, 6, 87, -23, 58, 38, -41, -56, -11, 97, 87, -94, -37, -58,
+    -19, -67, -38, -85, 2, -37, -3, 48, 21, 77, -69, -98, -87, -84, 42, 16,
+    -94, -2, -80, -36, -87, -4, 69, 98, -4, 23, -75, 24, -72, 68, 67, 49, 54,
+    -72, -25, -99, -95, -66, -96, 70, -17, 26, -83, -31, -9, -34, -9, -15,
+    -83, -18, 76, 58, 78, -6, -71,
+  58, -10, 10, 55, 30, 1, 38, 44, -23, -94, -49, -83, 18, -78, 88, 53, 56,
+    -25, -52, -11, -69, 83, -81, -1, -35, 35, -97, -96, 19, -30, 24, -74, 83,
+    79, 82, 23, 26, 40, 55, 2, -82, 80, 50, 18, -26, -35, -47, 14, -63, -64,
+    -74, 66, 97, 74, 70, 16, -14, -23, -85, -96, -66, 59, 58, 23, -94, -6,
+    75, 56, 42, -13, 97, 67, 15, -90, -59, -34, 33, 94, -29, 3, -70, 42, 58,
+    -37, -34, -62, -60, -16, -31, 19, 58, 56, -8, -47, 29, 43, -26, 26, -65,
+    56, -48, -76, 75, -79, -50, 75, 71, -9, -16, -9, -40, -44, -100, 19, -71,
+    -73, 25, -68, 40, -100, -86, 76, 45, 65, -4, -11, 91, 16, 12, 21, 52,
+    -49, -38, 70, -2, -65, 34, 2, 19, -21, 46, 9, -67, 63, 44, 99, -58, 18,
+    79, 87, -2, -43, -33, -62, -9, -79, -32, 17, -56, 82, -8, -88, 65, -94,
+    -87, -58, -76, 95, -96, -24, -20, -57, 30, 80, 17, -6, -11, 71, -50, 75,
+    -34, -28, 43, -5, 27, -15, -97, -32, 53, -68, 97, 44, 51, 47, 6, -19, -1,
+    -43, 65, -89, -91, 21, -63, -59, 31, -9, 26, -79, -74, 43, 30, -38, 32,
+    86, -55, -48, -48, 42, 17, 70, 18, -40, 11, 74, -20, -35, -37, -64, 38,
+    -53, 28, -76, -39, 83, 50, 25, 59, -2, 44, -40, -81, -90, -17, 40, -45,
+    87, 12, -60, -31, -81, -76, 96, 79, -69, 58, 73, 12, 17, -34, 67, -70,
+    85, 25, -87, -86, 59, 13, -68, -5, -53, -60, 31, -5, -51, -7, -61, -76,
+    91, -12, -42, -42, -16, 23, 50, -17, 66, -55, 72, 56, 84, 80, -19, 73,
+    -79, -97, 57, 44, -96, -65, 83, -31, 40, 74, 98, -44, -42, -89, 64, -50,
+    49, -28, -26, -17, -23, 57, -58, 89, 51, -57, 62, 97, 31, -12, -15, -18,
+    -73, -91, -70, 75, -65, -11, 72, 29,
+  36, -94, -100, 67, -24, -92, -40, 15, -79, -45, -72, 99, 98, 93, -39, 40,
+    34, -55, 40, -38, 54, -46, -70, -86, -32, -72, 60, 25, 66, -97, 24, -41,
+    8, 94, -9, -48, -34, 55, -46, 22, -92, -37, 80, 20, -43, 18, -78, -37,
+    78, -43, -13, 74, -72, 71, 72, -6, -21, -30, 75, 64, -73, -42, 40, -50,
+    -11, -90, 91, 92, -19, -16, 51, -20, -61, 87, 61, 24, -93, 28, -9, -32,
+    -13, -10, 51, 14, 68, 88, 33, 42, -79, 4, -25, 35, -78, 25, -64, -45,
+    -96, 14, 1, -73, 91, -19, -9, 42, 0, 56, -53, -78, -35, -96, 82, -92,
+    -17, 62, -86, -80, -41, -98, -24, -49, 43, -15, -67, 92, -10, -50, 74,
+    -16, 27, 12, -25, -3, 42, 0, -78, -82, -74, 12, -38, -74, -2, 23, -41,
+    -20, 6, 85, -49, -89, 71, -3, -49, -95, 23, -53, 61, 29, 4, 33, -41, 51,
+    -8, -22, -72, -77, -54, 81, -87, -81, 98, 40, -21, -55, 86, 23, -99, 80,
+    59, -5, -58, -18, -77, -14, 5, -74, -94, 57, -67, -6, -86, -32, -39, -68,
+    -8, 3, -68, 71, -49, 59, -100, 2, 68, -53, 55, -69, 88, 25, -14, -59, 6,
+    -15, 18, -99, -10, -17, 44, -39, -63, 25, -65, 31, -75, -26, 73, 52, 60,
+    72, 85, 25, -40, -84, 79, -7, -33, -50, 9, 60, 83, 80, -83, 90, 10, 42,
+    -67, -40, -59, -54, -96, -76, 74, 16, -99, 34, -63, -51, 11, -51, -2, 19,
+    32, 15, -47, 25, 86, 98, 20, 72, -6, -17, 67, 4, 35, -77, -16, -54, -98,
+    -63, -16, 92, -52, -51, 90, -28, -62, -23, 50, -54, 16, -6, 40, 29, -10,
+    86, -24, 14, 94, 99, -84, -43, -35, 13, -49, -98, 50, 27, -28, -13, 36,
+    2, -7, 79, 59, -49, -17, 10, 98, -5, -87, 15, -24, 8, 25, 92, -50, 42,
+    -88, -70, -21, 14, -76, 61, -61, -10, 22,
+  16, -82, -59, -14, -3, 83, -70, -35, -54, 97, -86, 34, 47, 11, -50, -52,
+    -71, 80, 57, 58, 29, 7, -95, 79, -63, 35, 42, 24, -59, -51, 54, -61, 21,
+    -33, 20, -77, 25, -7, -30, 70, -81, 92, 70, 29, -12, -89, 53, 50, -46,
+    57, 37, 71, 64, -9, -74, 69, -24, -11, 46, -90, -14, -21, 45, 40, 61,
+    -32, 2, 96, -91, -79, 26, -23, -56, 70, 69, -91, -61, -18, -92, 69, 90,
+    -55, 28, -57, 59, -54, -37, 46, 36, 91, -30, 78, 76, 0, -81, 81, -7, 87,
+    -91, -1, -13, 81, -60, -50, -34, 76, 90, 55, 72, -21, 28, -14, 60, 20,
+    97, -98, -3, 9, 9, -46, -46, -91, -100, -39, -82, 15, 46, -73, -66, 72,
+    64, 73, 14, -30, 20, -1, 90, 18, -72, -51, 9, 21, -81, -91, 6, -28, 9, 6,
+    21, -75, 42, 65, 79, -24, 4, 12, -12, 65, -100, -83, 55, 97, 88, 31, 97,
+    -85, 57, 61, -57, -75, -26, 2, -62, 31, 3, 92, 54, 37, -60, -54, -13, 46,
+    -91, 53, 21, 95, -34, 52, -38, -28, 97, 8, -51, -95, 79, 26, 26, 36, 1,
+    -69, 83, -36, -12, -22, -94, -95, 97, 8, -52, -4, -18, 78, 50, -55, 16,
+    42, -96, 87, 88, -98, -70, 64, 57, 90, -26, -80, 20, -49, -34, 56, 77,
+    17, -7, 95, 29, -43, -99, 40, 56, -77, -4, 98, -90, 27, -27, -13, 76,
+    -97, 22, 39, 45, -3, 77, -10, 12, -20, 10, -85, 48, 22, -1, -55, -21,
+    -39, 15, -28, -49, 73, 72, 66, -99, 3, -63, 2, -32, -94, 1, 25, -62, -90,
+    39, -85, 85, -37, -93, 74, 21, -86, -7, 26, -17, 44, 49, 8, 59, 19, -21,
+    50, 31, 91, 55, -55, 13, 66, -88, 95, 52, -12, 13, -17, -68, -3, 98, 21,
+    -70, -7, 28, -85, 37, -100, 46, 93, 93, -30, 80, 19, 54, 36, -2, -80, 3,
+    65, 1,
+  -7, -61, 52, 80, -85, -56, -77, -91, -22, -37, -87, -58, -57, -43, 42, 7,
+    -74, 18, -5, 10, -59, -18, 52, -22, -53, -99, -90, 27, -84, -6, 93, 25,
+    26, -46, 6, -54, -85, 50, 9, 46, -25, -95, -48, 40, -6, 49, 58, -22, 78,
+    -25, 11, -41, -26, 68, -59, 29, 51, 1, -59, 9, 67, -58, -29, 8, 13, 76,
+    78, -81, 82, 93, 86, -10, 62, -88, 19, 76, 77, -8, 0, -63, 76, -70, -12,
+    38, -100, 81, -88, -72, 20, -95, 66, 92, -78, -37, 23, 68, -85, 4, -4,
+    71, -95, -84, 49, 55, 71, 41, 50, -51, -51, -32, 57, 40, 10, -83, -73,
+    -59, -11, 23, -58, 21, -8, -13, -68, 85, 66, -64, 74, -59, -72, -39, 74,
+    -43, 88, -3, -49, -11, -42, -12, -43, -63, -78, 70, -34, 17, -9, -10, -5,
+    98, 31, -91, -49, 66, -39, 5, 9, 22, -58, 33, 67, 67, -5, 0, 8, 60, -96,
+    -76, -40, 85, 96, 84, 89, 82, -56, -85, 38, -17, -58, -98, -95, -62, -86,
+    72, 4, -97, -25, -9, 48, -93, 35, 46, -25, 77, -29, -6, -24, -5, -93,
+    -88, -100, -63, -36, -36, -10, -99, 70, 86, -91, -70, 20, 6, -20, 51,
+    -51, 22, -92, -59, 67, 22, -77, 28, -55, 0, 60, -17, 35, -44, -9, 46, 89,
+    23, 46, 76, 73, -42, 87, -43, 80, 4, 99, -80, -76, 63, -10, 31, 62, 9,
+    -73, -79, 61, -98, -58, -29, 64, -49, -51, -60, -86, 33, -28, 35, -78,
+    41, 87, -42, -85, 34, -45, -97, 47, -43, 10, -20, 0, 16, 15, 41, -65, 8,
+    -74, -7, -53, 76, 34, 83, -45, -23, 87, -33, 40, -71, -31, 56, 57, -49,
+    49, -6, 7, -77, -50, -93, -10, -80, 38, -40, -80, -40, -79, -59, 6, 71,
+    24, -33, -50, 84, -13, 56, 56, 16, 31, -33, 96, -48, 53, 83, -49, -72,
+    -57, -36, -82, 22, -78, -10, 58,
+  -36, -7, 66, -38, -31, -53, -3, 57, 55, -95, 75, -63, -42, 52, -5, -57,
+    -100, -85, 35, 48, 61, 29, -29, -80, -35, -30, -71, 46, 8, 40, -24, 68,
+    90, 5, -68, -85, 34, -96, -39, -98, 54, -71, 79, 74, 88, -73, -50, -85,
+    32, -48, 48, 6, 68, -87, -29, -80, 97, 95, 76, 83, -92, -23, 74, 64, -13,
+    64, 30, -41, 98, 38, -2, -18, -14, 57, -32, -34, 62, -55, 64, 33, 82, 39,
+    -94, -12, -58, 27, 10, -66, -87, 41, -68, 9, -90, -14, 37, -71, -74, -78,
+    31, 92, -16, 82, 94, 55, 48, 92, -12, -26, -97, 35, -75, 0, 32, -52, -48,
+    -61, 95, -19, 67, -61, 50, 61, -66, 89, -54, -6, -55, -2, 1, -46, -91,
+    -7, 77, -14, 31, 89, -9, -52, 18, 99, 24, 65, -8, -12, -15, 98, 80, -5,
+    -48, 58, 76, -7, -32, -2, -14, -97, -71, 3, -78, -81, -71, -38, -91, -89,
+    -19, -14, -20, 28, -82, 66, 24, -44, -17, 35, 93, 57, -14, 42, -78, -2,
+    80, 48, -62, 81, -72, -8, -46, -99, -9, -3, -29, 76, -87, 22, -35, -81,
+    -33, 33, 45, 99, -23, -47, 20, -44, 36, -27, -1, 74, -69, 50, 55, -5,
+    -91, 86, -29, 26, -42, -60, 51, -16, -5, 47, -10, -47, -56, -8, 29, 1,
+    -71, 50, -70, 57, -64, -97, 21, -9, -75, -76, 22, 72, 25, 41, -25, -19,
+    22, -13, -75, -80, -38, -13, 88, -23, -24, 45, -11, 25, -75, 40, 7, 60,
+    18, -53, -6, 18, -99, -21, 67, 22, 20, 55, -37, 76, -98, 17, -13, 51, 86,
+    83, 58, -27, 41, 6, -1, -86, -9, 34, -95, -4, 72, -79, 81, 90, -39, -92,
+    -10, 63, 37, -22, -47, -80, -60, -2, -81, -75, -1, -21, -6, -28, -14,
+    -99, 34, 13, 86, -81, -75, -61, -7, -38, -87, -51, -18, 42, 77, -80, 97,
+    -69, 99, 24, -59, 2, -7, 46, -67,
+  62, -29, 3, -27, 58, 58, 46, -67, -33, -10, -40, -16, 46, -27, 2, 71, -81,
+    -53, -34, 5, -84, -68, 51, 4, 8, 81, -11, -32, -47, 96, 50, -80, -89,
+    -60, -48, -88, -42, 17, -67, 15, 14, 92, -42, -2, -35, -78, 11, 92, 90,
+    61, -95, -25, 51, 28, 33, 50, 73, 12, -51, 45, -51, 48, -5, -57, -4, 61,
+    51, -71, -24, -36, -76, -65, -1, -55, -35, 91, -11, 41, -33, -16, 25,
+    -48, -73, 23, 96, 61, -65, 80, -52, 43, 63, 14, -92, -94, -43, 15, 50,
+    -28, 46, 77, -57, 31, 81, -5, 82, -46, 92, -25, 67, -37, -11, 31, 4, 79,
+    -55, -99, -69, 93, -87, 79, 81, 8, -80, -63, -36, 25, -42, 62, -96, -88,
+    -25, 21, 4, -78, 52, 53, 82, 4, 51, -53, -23, -95, 27, -79, -99, -96, 2,
+    89, 93, 24, -5, -19, 80, -51, 29, 20, -76, -31, 6, 30, 12, -85, -91, 58,
+    -89, -99, -6, 4, 0, -56, 16, -70, 37, 93, -80, 79, 57, 16, -5, -7, 20,
+    14, -56, -10, -89, -74, 86, -75, -61, -76, -17, 33, 13, -66, -3, -3, 38,
+    -4, 67, -55, -69, 60, -64, 54, -35, 61, 44, 25, 81, -67, 87, 64, -67, 79,
+    -7, 19, 64, 82, 74, 28, -89, 52, 38, 47, -13, 80, -61, 14, 47, -70, -98,
+    42, -19, -49, -84, 56, -74, -99, -11, 98, -53, -55, -52, -35, -79, 6, 39,
+    -50, -35, 70, -30, -46, -28, 46, 18, 59, 8, -16, -20, -77, 82, -80, 60,
+    43, 25, -75, 39, -19, 71, -72, 65, -21, -20, -77, -24, -66, -25, -22, 24,
+    71, 1, -97, -20, -91, 34, -92, -33, -30, 32, 93, 65, 67, -36, 82, 35,
+    -51, -77, -39, 42, 85, -2, 50, -1, -93, 32, -98, -99, 17, -34, 69, -45,
+    -47, -4, -22, 80, 70, -13, 93, 45, 83, 49, 45, -29, -22, -80, 91, -51,
+    60, 52, -80, 57, 24, -73,
+  97, -15, 32, 76, -25, 67, -27, -83, -14, -40, 95, 15, -92, -48, 41, -19,
+    87, -55, -2, 99, 92, -54, 53, 36, -73, 28, 25, 6, 85, -69, 58, -88, 84,
+    38, 50, -96, 60, 66, -93, -66, -66, 99, -52, 56, 62, -63, -79, -96, -72,
+    3, 58, 65, 76, -9, -8, 71, -82, 84, -37, 39, -31, -36, -83, 45, -62, -86,
+    69, -39, -93, -1, -39, -29, 98, 3, 79, 15, 11, -18, 94, 49, -79, 47, -92,
+    78, -67, -8, 99, 8, -17, -9, -32, 49, 49, 67, -3, 45, -61, 71, 51, 37,
+    96, 56, 86, -53, -89, 49, 37, 61, -47, 52, -63, 46, 59, -81, 86, -10,
+    -18, -35, 52, -31, 81, -82, 80, -45, 92, -4, 2, -79, -61, 21, 75, -91, 1,
+    -4, -23, -42, 57, -33, -18, 30, -62, -20, 80, 26, -61, 57, -90, 22, -12,
+    -78, 22, -19, 22, -77, 39, -1, -73, -90, -33, 0, 43, -81, 40, -9, 93, 3,
+    61, -76, -75, -11, -15, 81, -61, -35, -84, -25, -90, -100, 39, -49, 13,
+    37, 37, -5, 65, -62, -11, 55, 28, -95, 84, 57, -98, -77, -61, 43, 57, 80,
+    -34, -72, -92, -41, -84, -77, 41, 8, -58, -68, 83, -77, -28, -74, 92,
+    -39, -94, -17, -54, 25, -1, -41, 69, -30, 24, 60, -97, -28, -82, -83, 98,
+    -83, -86, -99, -30, -18, -86, -35, -21, -49, -21, -98, -80, -94, 12, 59,
+    -71, 55, -54, -97, 0, -35, 7, -66, 18, -36, -86, 3, 43, -87, -71, 39, 92,
+    80, -5, 32, -85, -53, -81, -72, -96, 79, -42, 45, 95, -39, -82, -67, -66,
+    -64, -23, 11, 92, 94, 87, 33, -42, -61, 79, -54, 15, -69, -47, -53, -40,
+    78, -97, -48, -12, -49, -75, 1, 99, 28, -26, 20, -64, 44, -84, 7, 13, 29,
+    40, 26, 5, -77, 0, 30, -47, 52, 33, -67, 57, -93, 64, -2, -91, 99, -62,
+    45, -94, 81, -9, -11, -35,
+  98, -9, -78, -20, 25, -20, 94, -5, 85, -65, 10, 46, 97, 12, -12, -90, 67,
+    49, 39, -44, 73, 20, -58, -34, 30, -75, 2, -98, 24, -56, -38, -28, -38,
+    -26, 75, -56, 37, 36, 7, 32, 36, 18, 92, -84, -67, 27, -99, -38, 61, -16,
+    -77, 65, -80, -75, -23, 15, -13, -73, -70, 70, 2, -98, 24, 23, 34, 7, 29,
+    27, 13, 92, 61, 73, -79, -7, -23, -79, -15, -18, 71, -24, 96, 86, -25,
+    94, -51, 95, -84, -54, -12, 52, -10, 44, 32, -86, -8, -29, -100, -72,
+    -100, -71, -20, -56, -9, 76, -98, 63, -7, -56, 55, -6, 51, -88, -100, 87,
+    -89, 64, -96, 85, -18, 86, 0, -97, -1, 85, 48, -17, 60, -9, -62, 47, -22,
+    42, -10, 27, -62, 98, -78, 32, 26, -14, -8, 53, 84, -19, -85, -46, 31,
+    29, 84, 69, -7, -98, 61, 54, -16, 15, 22, 29, 71, 65, 96, -44, -90, 51,
+    -14, 78, 61, -94, -22, -88, -81, -15, 80, 6, 9, -29, 60, 94, -13, 79, 7,
+    -54, -24, -71, 33, 45, -73, 75, -91, -87, 7, 23, 54, 31, -62, 57, -9, 87,
+    -7, -51, 98, 4, 32, 79, -25, 39, 63, -100, -93, -54, -90, 17, 19, 33,
+    -53, -46, 50, 57, -53, -20, -43, -30, -15, -10, -64, 20, -35, 37, 7, 71,
+    86, -85, 34, 70, 19, 85, 57, 34, -34, -69, 30, -88, 51, 30, 52, 88, -94,
+    14, -25, -42, 86, 21, -74, 56, 98, -68, 14, -80, -88, 45, 79, 83, -30,
+    -87, 27, 10, 96, -25, -19, -18, -67, 62, -98, -60, -73, 26, 41, 8, 50,
+    -81, -49, -89, 26, 33, 70, 16, 21, -27, -36, -76, -99, 41, -72, 41, 13,
+    -3, -53, 37, -71, 68, -37, -99, -79, 69, 54, -13, -36, -80, -23, 69, 49,
+    -46, 44, 19, 94, 85, -94, 8, -95, 7, 87, 54, 96, 36, -4, 17, -7, -87, 88,
+    4, -34, 33, 48,
+  -41, 96, -88, -48, -23, 36, 12, 91, 15, -16, 22, -18, 17, -23, 30, -73,
+    -42, -94, -20, -33, -33, 89, -45, -26, 29, 7, -64, 43, -36, -59, -38,
+    -47, 11, 35, -34, 48, 30, 54, 52, 8, 36, -89, -43, -35, 24, -28, 74, 49,
+    -70, -71, 8, 82, -26, -95, 68, 9, -60, 63, 20, 98, -55, -76, -9, 85, -72,
+    72, -96, 11, -14, 54, 61, -7, 31, -5, 54, 88, -86, 15, -62, 95, 12, 56,
+    -48, 25, -71, -14, -51, -4, -40, 2, 88, 90, 90, -47, -21, -1, -71, -9,
+    34, 91, -22, 65, -19, -92, 37, 50, 42, -22, -52, 49, 61, -8, 22, 17, -56,
+    31, 20, 29, 6, 69, -13, 80, -26, 78, 75, 20, 69, -19, 66, 41, -8, -21,
+    34, -30, 46, 56, -96, -1, -71, -80, -67, 51, -25, -45, 81, 47, 31, -62,
+    88, 27, -86, 56, 83, -97, -14, 65, 94, -82, 23, 20, -26, -83, -89, 68,
+    66, 35, 7, -24, -71, 13, 37, 18, 6, -59, 61, -90, 30, -94, -88, 40, 91,
+    -77, 89, -88, -69, -40, -8, -91, -69, 86, 41, 27, -25, 44, 25, 56, -97,
+    -81, 0, -62, -58, 70, 10, -7, -49, 2, -69, 17, -91, -95, 54, -72, -80,
+    21, 9, -20, -13, 3, -39, 28, 24, 91, -26, 20, -100, 73, -57, 50, 88, -10,
+    -13, 99, 41, 81, 73, -37, 92, -2, -11, -75, 2, 99, 42, -6, 66, 29, 49,
+    -25, 45, 65, 79, 17, -13, -16, -4, 24, 50, -33, -36, 24, 68, -14, -38, 6,
+    -56, 53, 42, -99, -38, 25, -95, -71, 81, 96, -12, -69, 10, -85, -86, -19,
+    -76, 75, -69, -86, -90, -98, 53, -79, 97, 19, -53, -44, -70, 35, -76, -2,
+    76, 0, -71, 33, 66, 86, 77, 93, 41, 58, -9, -24, -28, -4, -87, 10, -42,
+    15, 36, 43, -37, -10, -1, 38, -43, -87, 33, -23, 99, -56, 59, 26, 24, 67,
+    49, 79, 81,
+  92, -97, 27, 62, 52, -89, 51, 25, -60, 75, -3, 71, 30, -89, 55, -34, 29,
+    68, -50, 80, 30, -46, -81, -46, 70, 32, 14, 47, -23, -51, -97, -77, -11,
+    15, -15, -48, -87, -13, 83, 71, -76, -58, 15, 16, -81, 35, -6, 39, 60,
+    -90, -5, -63, 67, -72, 92, -26, -49, -12, -97, -80, 58, -18, -62, -13,
+    -41, -55, -48, 96, -80, -10, 11, 52, 81, 19, 32, 51, -83, 62, -21, -89,
+    14, -73, 46, 46, 25, 41, -40, -44, -62, 87, 67, 51, -58, -18, 55, -33,
+    -48, 89, 82, -52, -81, -36, 99, 55, 62, -45, -73, -47, 98, -79, 32, -2,
+    62, -65, -95, 55, 25, -58, -18, 38, 89, 33, 39, 88, -10, 86, 4, -2, 55,
+    90, -87, -22, -17, -15, 24, 99, -63, -88, -36, 96, 89, -83, -34, -75, 82,
+    -80, -7, 75, -82, 73, -9, 12, 49, 32, 14, 13, 76, -10, -1, 68, -77, 96,
+    -63, 25, -82, -35, 17, 5, -86, 18, 62, 83, 34, -85, -51, -75, -82, -24,
+    -27, -64, -74, 18, -88, -100, 81, 48, -30, -5, 33, 40, 48, 95, 0, 13, 4,
+    -16, -40, -31, 56, 57, 55, -91, -25, 80, 76, -34, -64, -67, -77, -60, 71,
+    0, 59, -37, -9, -15, 35, 92, -45, 2, 74, 70, -42, -58, -87, 88, 57, 48,
+    14, 29, -94, -92, 43, 25, 29, -97, 40, 63, -75, -81, 51, 0, 17, 15, 24,
+    -95, -14, 68, 9, 64, -28, 27, -19, -23, -43, 99, -77, -92, 77, 65, 35,
+    -55, 33, 31, 26, -92, -36, -97, -62, -49, 16, -94, -41, -42, -21, -62,
+    94, 27, 43, 52, 2, 45, 90, -97, 85, -80, 18, 59, 92, 47, 26, -51, -93,
+    55, 16, -29, 18, -56, -7, -95, -79, -72, 47, -11, 81, -96, -49, -42, -23,
+    -9, -75, -13, 35, 30, 40, -95, 58, 11, 43, -17, 83, -92, -42, 83, 71,
+    -45, -85, -41, 49, -10, 64, 13, -2,
+  -57, -38, 70, -39, 23, 92, 57, 61, -70, -98, 82, 98, 12, 58, -31, 8, -26,
+    7, 51, 71, 29, -8, -10, 63, 74, 31, -95, 25, 9, -64, -40, -62, 62, -55,
+    22, -21, -40, 53, -54, -34, -36, -91, 58, -69, -96, 25, 91, 6, -58, -80,
+    -66, 39, 25, -38, -76, 79, -16, 26, -34, -1, -96, 49, 54, -57, -13, -40,
+    -70, 37, -20, -64, -95, 68, 9, -18, -25, 58, -44, -27, -43, -19, 76, -71,
+    62, -77, 69, 60, 93, -61, -28, 82, 90, 16, -43, -67, 24, -16, 11, -89,
+    11, 84, -38, 91, 20, 76, -15, -1, 56, -19, 21, 18, 60, 40, 92, -89, 55,
+    -62, -88, 45, 37, -41, 56, 13, 65, 33, -47, -56, -51, -35, 66, -88, 92,
+    35, -18, 17, 75, 61, 98, 66, -83, -53, 98, -45, -69, 66, 44, 87, 80, -50,
+    96, -3, 69, 94, 92, -13, -30, -82, -70, -88, -23, -66, 81, 70, -91, -43,
+    -51, -6, -66, -26, -81, -64, 79, 63, 38, -19, 48, 25, 72, -50, -52, 44,
+    -64, 53, -79, -2, 68, 94, 67, -5, 52, 20, 58, -69, 79, -34, 44, -79, -36,
+    -24, -55, -96, 78, 56, -78, -62, 56, -67, 90, 13, -20, 15, -63, 38, -74,
+    -15, 64, 8, -20, -19, 5, -89, -10, -31, -65, 40, 2, 87, -52, 26, -19,
+    -31, 81, -99, 51, 41, -23, -87, 59, -89, -30, 33, -92, 98, -49, 92, 47,
+    90, 44, 95, -20, -37, 27, -34, -70, 0, -83, 75, 13, 90, 60, -15, -100,
+    40, 47, 60, 73, 69, 84, 8, -43, 49, 49, 64, -18, -11, -43, 50, -88, -16,
+    -71, -23, 69, -22, -55, 70, -42, 6, -77, -80, 47, 84, -88, -51, -42, 97,
+    11, 55, 9, 35, -59, -31, 47, 7, -69, -88, 10, -94, 64, -66, -28, -49, 55,
+    27, 57, 33, -39, -21, 17, 22, 73, 18, 42, 87, 52, -74, -14, -81, 65, 21,
+    -15, -100, 62, 44, -69,
+  22, -59, 8, -46, 24, 10, -71, -64, -63, -1, 94, -82, 14, 10, -17, 25, -60,
+    45, 58, 31, 67, -54, -81, -73, -44, 43, 59, 9, 85, -89, -7, -88, 23, 65,
+    -75, -97, -40, -76, 38, 89, 8, 46, -46, -35, -78, -94, 31, -18, 86, 20,
+    -99, 31, 10, -15, -78, -63, 92, -15, -71, 35, -79, -30, 94, 12, 99, -89,
+    -79, 40, 90, -89, -75, 31, 92, -16, 49, -70, -30, 9, 75, -7, 17, -46,
+    -59, -96, 3, -55, 48, 16, 85, 72, 68, -21, -84, -14, 31, 43, -30, 39,
+    -82, -36, 95, -17, -46, 29, 89, -99, 18, -52, 40, 61, -9, -36, -27, 0,
+    15, 93, 75, 20, -35, 49, -25, -37, 11, 74, 11, 18, -46, 46, 17, 98, 91,
+    70, -32, -41, -96, -56, 13, 5, -16, 24, 50, -76, -60, 75, 85, -78, -62,
+    98, 39, 13, 7, 72, -54, 27, 30, -92, -98, 82, 57, 25, 86, -14, 12, -56,
+    -10, -30, -53, -38, 25, -49, 35, 46, 97, 19, 45, -30, -80, -72, -82, -40,
+    31, -48, 39, -31, -100, -47, -94, 74, -8, -49, -39, -7, -78, -44, -71,
+    -10, 35, -92, 33, -84, -81, -62, -65, -79, -39, 67, 62, -4, 96, 94, -64,
+    -54, -100, -49, 15, 1, -13, -96, -38, -83, -15, 76, 61, 54, 10, 98, -31,
+    31, -64, -74, -72, 75, -100, 20, -41, -33, 62, 67, 0, -30, -22, 35, 65,
+    -95, 81, 56, -68, -96, -77, 43, 88, -4, 46, 26, -23, -7, -21, -16, -22,
+    -46, 91, 33, -88, 31, -37, 92, -14, 3, 80, 34, -86, -12, -92, 73, -18,
+    -4, -89, 18, 97, 3, 21, 3, -63, -11, 0, 63, -73, 70, -18, 78, 33, 26, 63,
+    -23, -37, 82, -52, -53, 60, -59, -17, -22, -14, 44, -86, 10, -96, -98,
+    64, 66, 16, -58, -96, -93, 89, 29, 71, -52, -36, -74, 25, -15, -16, -93,
+    -24, -97, -94, -100, 58, -38, 46, -60, -47,
+  32, -18, 80, -98, 32, 43, 56, -32, 33, 10, -25, -28, -46, 34, 87, 76, -31,
+    -51, -94, 65, 84, -94, -19, -64, 41, 27, 68, -83, 20, 10, 30, 12, -55,
+    98, 52, -74, 56, -90, 23, -52, -14, 37, 65, 49, -89, -56, 2, -50, 51,
+    -55, -41, 84, 9, -88, 2, -43, 48, 80, -47, 9, 42, -83, -89, 40, -92, 54,
+    -16, 57, -10, -67, 42, -48, 12, -90, -46, 9, 62, 42, -41, -83, 92, 60,
+    -46, -81, 78, -32, -86, 28, -55, -84, 81, -27, -91, -38, -31, 90, -33,
+    59, -45, -28, 37, -57, 75, 30, 85, -15, 25, 74, 74, -68, 55, 42, -51, 74,
+    95, -42, -25, 90, 9, 99, 40, -62, -50, -10, 97, -52, -70, -48, -55, -79,
+    19, 39, -53, -64, 35, 8, 36, 34, 40, 59, -85, 68, -7, 74, 97, 17, -73,
+    50, -37, -7, -75, -67, 81, 70, 29, 28, 95, 69, 16, 18, 5, 55, -37, -46,
+    -21, 61, 25, 62, 77, 49, 72, 62, -2, -15, -50, -77, -17, 24, -60, 50,
+    -13, 23, 83, 4, 74, -56, 96, -1, -72, -66, -73, 85, -58, -83, -24, -80,
+    -17, -66, 32, -82, 15, -46, 40, 62, 48, -57, 80, -46, -2, 47, -42, -98,
+    14, -17, -42, 22, -83, -6, -35, 95, -68, 19, 43, -21, -100, -29, 17, -12,
+    48, 97, 7, 3, 29, 70, 7, -62, -33, -79, 80, 79, -41, -87, 48, 12, 7, -22,
+    8, -29, -11, 87, -56, 75, -98, 79, -17, -10, -10, -71, 79, 50, -57, -13,
+    68, 78, 61, -28, -31, -62, 7, 65, -96, -78, -64, 27, 21, 27, 19, 15, -73,
+    80, 2, 22, -38, -90, -74, -57, -7, 40, -94, -65, -82, -6, -46, -8, 74,
+    94, -27, -84, -23, -10, 91, -85, 82, -33, 51, 54, -61, 19, 31, -61, 47,
+    -20, 44, 33, -89, -40, -53, 86, -2, -86, -53, 78, 22, -97, -85, -8, 94,
+    -38, -41, 32, 34, -20, 78,
+  -85, -22, 61, 79, -25, -15, -83, -46, -1, -53, 22, -62, -66, -66, 98, 26,
+    83, 56, -92, -91, -39, -19, 21, 87, 58, -43, -97, -33, -49, -92, 72, 11,
+    61, -5, 77, 62, 24, -1, -57, 57, -45, 85, -77, 45, -52, 56, 44, -82, -81,
+    -73, 6, 94, -35, 56, -49, -64, 45, 69, 53, 40, 36, -31, 26, -84, 68, 10,
+    27, 15, 56, -14, 54, -94, 57, -74, 98, -71, 62, 5, 50, 66, -48, -2, 50,
+    79, 31, -2, -18, -80, 18, 19, 51, -61, -25, -39, -5, -29, -7, -92, -11,
+    -76, -62, -70, 15, -93, 7, 7, 62, -58, 67, -10, -26, -52, -66, 64, 83,
+    35, -16, 37, -16, -95, 4, -26, 14, -16, -81, 40, 81, 47, -76, -70, 34,
+    79, -12, 50, -71, 65, 35, 27, -86, 91, -79, -8, 88, 41, 54, 5, 30, -42,
+    89, 50, 65, -57, -49, 20, -26, 8, -61, -69, -27, -38, 16, -98, 79, 66,
+    12, 94, -94, 67, 10, 53, -44, -37, -80, -90, -94, 16, 72, 38, -68, 92,
+    95, -78, -52, 15, -85, 27, -58, -98, -51, -36, 18, -33, -76, 98, -94,
+    -30, -63, 9, 9, -6, 83, -69, -66, -45, 10, 86, -39, -38, 70, -61, 62,
+    -82, -23, 86, -16, 75, 50, -1, 52, -87, 62, -95, -56, 36, -42, -43, 77,
+    44, -65, 95, 28, -63, 98, -88, -46, 89, 59, 90, -61, 13, 14, 27, 87, 46,
+    -5, 15, -25, 84, 0, 1, -29, -64, 42, -74, 81, 13, -65, -55, 53, -90, 40,
+    50, -48, 68, -63, 65, 25, 5, 84, -32, -68, 29, -65, 95, 69, 30, -23, -50,
+    23, -2, 28, -6, -56, 10, -26, -79, 25, 3, -40, 42, -66, -25, -28, -41,
+    47, -30, 53, 99, 61, -57, -23, -6, 32, 24, 76, 17, -5, -99, 45, 64, 56,
+    84, 23, -47, -54, 3, -41, -53, 78, 34, -38, -19, -14, 64, -1, -20, 23,
+    -37, 43, 41, 11, -99, 94,
+  -12, 37, -100, 28, -69, 28, -80, -93, 65, -52, 77, 46, -82, 56, -76, -15,
+    -60, -14, 92, -41, 48, -47, -52, 31, 35, -24, 21, -33, 57, -27, 66, 54,
+    38, 37, 12, -96, 37, 90, -19, 73, -18, 61, -98, -45, 12, 63, -94, 83,
+    -73, 59, -32, -53, -15, -76, -91, 21, -81, -45, 33, 32, -74, -83, 59, 90,
+    54, 15, 39, 93, 40, 10, -33, -13, 63, 94, -24, -29, 75, 58, -64, 58, 68,
+    -40, 22, 89, 50, 75, -2, 66, -96, -96, -78, 9, 65, 4, 84, -4, -10, -32,
+    -6, -38, -20, 91, 26, 32, 80, 74, -90, 48, 59, -74, 63, -99, 64, -73,
+    -17, -88, 33, 56, -91, 71, -96, -97, -20, -31, 0, -78, 86, 36, -90, -42,
+    -2, -9, -89, 25, -89, -68, -10, 60, 84, -48, 12, 56, -14, -21, -69, 48,
+    4, -42, -12, -66, 69, -53, 76, 18, 67, -4, -7, -55, -77, 6, 98, 4, 9, 18,
+    -27, -21, -97, 56, 64, -73, -79, -72, 49, 9, -15, 88, 44, -44, 29, -37,
+    64, 61, 36, 46, -87, 10, 18, 72, -25, -68, 61, 66, -86, 41, -20, -26,
+    -13, -24, 25, -54, 49, -98, -97, -87, -49, 97, 96, -58, 36, -76, 16, -44,
+    -98, 29, -61, 5, 6, 19, -76, -25, -30, 19, -5, 43, 98, -8, 46, 98, -53,
+    -52, 96, -65, 15, 37, -84, 12, 1, -95, 55, -82, -100, -86, 27, 79, 30,
+    -20, -32, -37, -70, 26, 74, -79, 70, -63, 62, -65, 52, 18, -41, -73, -8,
+    -96, -7, -52, -96, -46, 98, 38, -28, -26, -81, 54, -15, -69, 34, -32, 23,
+    -3, -100, -48, 32, 97, -86, 4, -3, 68, 43, -51, -44, -70, 5, 40, 59, 62,
+    -80, 21, 49, -34, -91, -75, 55, -7, 62, 43, 13, 43, 23, -31, 45, 43, 14,
+    54, 70, -35, -85, 71, -42, 73, 21, 85, -66, 33, 81, 90, -24, -71, 28, -1,
+    -7, 2, -43, 37, -29,
+  31, 81, 97, 7, -97, 23, -41, -50, -77, 22, 86, 15, 93, 96, -87, -33, -6, 0,
+    18, 9, 51, -77, -48, 19, -53, 8, -32, 2, -77, -69, 8, -9, 1, 97, 21, 88,
+    30, 47, 24, -28, -70, 63, -93, 43, -88, 55, 69, 95, -18, -17, 88, 75, -1,
+    81, -4, -13, -55, 24, 27, 13, -79, -69, -92, -66, -18, 87, 80, -33, 97,
+    -68, 45, 75, -74, -32, -62, -3, -18, 72, 55, -91, -81, 28, 82, -24, 60,
+    34, -57, 70, -4, 70, 8, -25, -1, 75, 96, 96, 36, 74, 79, 40, 35, -68,
+    -81, -49, 81, 57, -83, 19, -100, 77, 2, 47, 84, -29, -91, -90, 47, -10,
+    71, -8, -65, -84, -38, 24, 2, 52, -92, 37, 16, 37, 13, -41, -26, -77, 58,
+    -32, 75, 89, -12, -17, 41, 92, 1, 36, -25, 53, -7, 69, -57, 19, -89, -77,
+    -9, -2, -83, 71, -49, -47, -60, -77, 30, 75, 57, -51, -24, 11, -54, -32,
+    16, -39, -40, -28, 35, 6, -10, -38, -19, -55, -43, -50, 56, 43, 78, 38,
+    10, -15, -38, 26, 51, -32, -86, 83, -18, 87, 83, 62, -15, 60, -70, -98,
+    -44, -81, -53, -30, -8, -55, 81, -43, 32, 15, -86, 26, 54, 53, -66, -31,
+    26, -91, -23, 9, 2, 38, 69, 28, -40, 83, 68, -91, -35, -7, -22, -38, 44,
+    -82, -13, 41, 61, 47, 58, -26, -81, -78, -41, -98, -13, 35, 12, -94, -14,
+    -45, 33, -31, -67, -21, -94, 73, 12, -59, -47, -5, -94, -75, 64, 56, -8,
+    28, 21, 93, 57, 92, 37, 77, 50, 95, 58, -25, -61, -39, -45, 88, -42, -37,
+    78, 31, 51, -64, -59, 95, -70, -91, -12, 46, -31, -12, 12, -43, -14, 46,
+    12, 2, 63, 7, 38, 21, -12, -11, -65, -96, 26, 37, -13, -66, -14, 69, -3,
+    -68, 75, 77, -77, 99, 49, -21, -26, -46, 92, -77, 45, -95, 29, -6, 51,
+    -17, -52,
+  11, 94, -31, -64, -39, -33, 45, -48, -22, -6, -94, -27, 96, 48, -7, 55, 11,
+    -37, -82, -66, -24, -17, 74, -53, 53, -7, -30, 15, 16, -16, -25, 96, 4,
+    -3, 57, -9, -6, -3, 32, 88, -62, -7, 29, 57, 9, -90, -42, 68, 87, -73,
+    56, 14, -73, -73, -45, 45, 61, 89, -70, 55, 80, 1, -7, -78, -28, 7, 83,
+    -63, 34, 12, -10, 51, -79, -75, -31, -92, 81, 18, 28, -86, 61, -19, 62,
+    -74, 43, 95, 99, 60, 68, 85, 48, -93, 48, -79, 13, -27, 57, 24, -77, -83,
+    22, -84, 35, -11, -59, 63, 7, -27, -31, 69, 19, -4, 86, 52, -62, 3, 29,
+    -75, -42, -85, -95, -48, -9, 86, 40, -59, -52, 19, -67, -18, -77, 0, 99,
+    62, 16, 54, 38, -64, -93, -72, 1, 87, 99, 5, -99, 24, 77, 29, -64, -53,
+    83, 72, -29, -78, -4, 60, -42, 99, -25, 50, -27, -43, 83, -97, -94, 27,
+    52, -69, 43, 67, -73, -78, -98, 30, 35, 85, 27, 89, -29, -95, -47, -32,
+    -26, -59, -15, -60, -58, 90, 93, -39, 83, -64, 12, 28, 99, -62, 97, -45,
+    -80, 89, 55, 59, 99, -74, -64, -4, -4, -1, -39, 80, 23, 18, -25, 66, -10,
+    -59, 56, -5, 48, 28, -11, 47, 76, 51, 71, 84, -51, -52, 44, 16, 96, -80,
+    87, 66, -84, -64, -41, -43, -87, -16, 12, 53, 91, 89, -98, 92, 70, 19,
+    -7, 38, -93, -68, 39, 42, -44, 92, 87, 91, -3, 85, -95, -88, -55, -19, 0,
+    26, 8, 86, 73, 31, 97, -31, 91, 80, -85, -63, -71, -78, -26, 69, -20,
+    -92, 39, -8, 50, 60, -38, -46, 83, -62, -76, 31, 16, 38, 69, -27, -16,
+    68, 58, -80, -77, -46, 91, -13, 10, 94, 87, -89, 4, -8, 84, -60, -97,
+    -48, -5, -59, -65, 79, -39, 66, 95, -13, 92, -1, -60, -36, 20, 33, 21,
+    -89, -54, -90, 25,
+  78, -72, 46, -58, -70, 39, -89, 16, 1, -50, -77, -66, 27, -73, 30, 85, 87,
+    52, -27, -2, 85, -21, -23, -3, 91, 4, -42, 63, -3, -14, 48, -10, -43, 81,
+    77, 95, 43, 32, -37, 75, -31, 40, -44, 31, 81, 70, -28, 53, 98, 66, -10,
+    24, -15, 6, -64, -51, -3, -31, 67, -13, -51, 95, 23, 7, 83, -54, 37, -61,
+    -48, -52, -11, 24, 65, 83, 86, 2, 82, -50, 62, 11, -43, -55, 33, 34, -6,
+    0, 88, 17, 68, 89, 39, -95, -74, -66, 13, 8, -23, 92, 53, 72, 10, -49,
+    59, -80, -48, -11, 36, 44, -41, -81, 11, 42, -30, -76, -86, -14, 75, -9,
+    46, -90, 13, 28, 23, 40, 42, -17, 42, -61, 5, -59, -68, -31, -69, -99,
+    -78, 42, 67, 13, 51, -15, 26, 41, 21, 12, 61, -39, 60, 52, 90, -66, 28,
+    -97, 38, -73, 74, -5, -33, 18, 93, -79, -42, 44, -8, -59, -55, 59, -67,
+    -41, -91, -86, -71, -98, -86, -32, -62, 72, -47, 84, 11, -98, 46, -57,
+    32, -21, -2, 84, -2, -95, -87, -81, -37, -37, 52, -95, 24, -41, 29, -97,
+    78, 57, 2, 87, -87, 35, -45, 44, 68, -20, -30, -66, 70, -59, -22, -84,
+    -32, 30, 7, 89, -93, -8, 87, 83, -3, 54, -63, 29, -84, -31, -46, -63,
+    -19, -48, 26, 58, -16, 58, 91, -99, -58, 91, -12, -80, 58, 14, -87, 93,
+    -56, -28, -2, -58, 51, -44, -16, -79, -40, 9, 43, 38, -41, -60, -48, 12,
+    -92, 0, 90, -49, -87, -52, -77, 10, -24, 41, -91, -46, -77, -47, -21, 59,
+    -49, 59, -14, -8, 27, 79, -2, -96, 57, -86, 11, -84, -45, -56, 27, -16,
+    -21, -42, 47, 25, 44, 87, 22, 53, -95, 78, 78, -72, 16, 55, 84, -22, 92,
+    58, 18, 71, 76, -40, 10, -77, 28, -31, -48, -37, 71, 92, 76, -97, 97,
+    -100, 76, -54, -89, -13, 77,
+  64, 76, -57, -18, -5, -57, 94, 55, -38, 30, 96, 21, 91, -73, 16, -2, -33,
+    -63, -22, -84, -28, 15, -16, 44, -40, -8, 47, 40, -16, -75, 29, 55, 31,
+    -66, 96, 61, 8, 29, -34, -59, -15, 69, 87, -13, 35, 72, 84, -20, -69,
+    -31, 43, 87, -52, 6, -75, -22, 26, -47, -45, 78, -53, -4, 67, 89, -81,
+    -40, 38, -49, 13, -6, 70, 11, -23, -78, -4, -60, 74, 30, 17, -41, -95,
+    -80, 10, -72, 53, 76, -66, -64, -86, 97, -92, -73, 3, -69, -23, 68, -72,
+    -46, -54, 96, 86, 60, -30, 87, 16, -20, -82, 89, -30, -51, 55, -58, 46,
+    -1, 57, -100, -11, -91, -29, -57, -23, -55, -66, 97, 51, -50, -95, -66,
+    -9, -23, -93, 13, 77, -12, -57, 23, -100, -25, -60, -98, -49, 53, -14,
+    47, 95, 44, 59, -49, -28, -16, 43, 46, -70, -34, -99, -86, -18, -51, 4,
+    46, 64, 7, -100, -66, -17, -78, 76, -98, -76, -31, 4, -54, -79, 97, 56,
+    -28, 87, -98, -88, 16, 15, 30, 8, -51, -91, 4, -7, -43, 63, -83, 44, -97,
+    21, 72, -72, -99, -20, 67, -15, -71, -98, -24, -35, -1, 58, 20, -48, -46,
+    -49, 8, 68, 76, -100, 95, -7, 84, -34, -7, -82, 43, 18, 82, -67, -91, 76,
+    -64, 61, 89, -62, 16, -71, 24, 54, 46, -44, 96, -83, -34, 5, 65, -65, 74,
+    -17, -31, 24, 5, -95, -65, -74, -48, 32, -90, 45, 81, -18, -47, -91, 74,
+    68, -78, 92, -12, -87, -82, -94, -70, 58, -98, -22, -35, 71, 48, -43,
+    -55, 91, -72, -80, 41, -35, 65, 22, -29, -51, -98, -45, -21, -7, -67, -2,
+    5, 27, 5, -86, 14, -59, -17, 61, -16, -71, 82, -96, 52, -43, -3, -87, 86,
+    31, 3, -40, 53, -66, -88, 68, 18, 37, 38, -36, 66, 57, 94, 21, -83, 52,
+    -35, 1, 75, 73, 49, 74, 82, 52, 90, -59,
+  22, -23, 89, -11, -35, 59, -17, 71, -88, -27, 74, 38, 99, -74, 63, -39, 93,
+    87, -32, -81, 48, -68, 88, -86, -25, 41, 47, 73, -50, 98, -31, 60, 53,
+    84, -72, -46, -42, 74, -45, 60, -15, 63, -40, -42, 53, 54, -12, -22, 38,
+    -26, 90, 27, -55, -9, 43, -45, 51, 25, -32, -2, 41, -56, -16, -32, 36,
+    -32, -99, 29, -12, -57, 64, 34, -35, -66, 80, 49, 43, 62, -25, -50, 21,
+    42, 71, -39, -84, 80, -13, -74, -97, -6, -14, -11, -84, 92, 37, -79, 7,
+    -21, 47, -61, -92, -68, -46, 60, -16, 3, 25, 24, -55, -62, -18, 72, -17,
+    -69, -3, -60, -82, -9, -24, -15, -44, -88, 19, -55, -23, -98, 18, -81,
+    -35, 68, -97, 71, -34, 23, -48, -48, 27, -23, 70, -72, 89, -17, 94, -79,
+    -27, -22, 51, 1, 54, -66, -87, 3, 20, 73, 97, 17, 19, 64, -47, -13, -55,
+    -96, 46, -67, 49, -7, -77, -14, -83, 37, 70, 41, 32, -77, 41, -34, 38,
+    34, -9, -22, -93, -67, 49, -40, -94, 44, -37, -33, 18, -89, -91, 50, 54,
+    -30, -85, -59, -44, 13, 21, 44, 43, 30, 9, -74, -18, 40, 11, -41, -71,
+    52, 56, 0, -71, -93, -50, -54, -49, 53, 58, -67, -83, 49, -21, 98, 14,
+    -34, -13, -58, -39, -71, 22, -77, 88, 91, -91, 97, -13, 36, 34, -9, -36,
+    81, 18, 24, 19, 36, 1, -24, -44, -70, 68, -87, -53, 8, -41, -1, 6, -67,
+    89, -40, -27, 23, -68, -65, -39, -26, 5, 56, 59, 61, 12, 75, -73, -44,
+    94, -76, 13, 63, -91, 94, 34, -16, -88, -3, -63, -23, -94, 28, 33, -27,
+    -57, 8, 61, -16, 45, -53, -100, -76, 38, -58, 98, -23, 0, -10, -61, -36,
+    63, -29, -51, 31, 78, -77, 6, 94, 30, 50, 90, 14, -38, 42, 66, 96, -47,
+    11, 31, 1, 84, -17, -90, 18, 76, 87, 42,
+  72, -82, 40, 88, 46, 53, 83, 97, -92, 39, -47, -34, 43, -86, -10, 89, -1,
+    98, -12, -19, -31, -36, 91, 3, -6, -58, -18, -96, 5, -34, 7, -87, -27,
+    -5, 70, 0, 71, -63, -68, -4, -51, 56, 78, 62, 79, 31, 96, 89, 99, -94,
+    88, 21, 59, 1, -95, 57, 48, 21, 56, -43, -42, -92, 30, -68, -53, -4, -87,
+    -15, -38, -99, -22, -49, 0, -50, -40, 2, 92, -16, -81, 83, 46, -66, -35,
+    -11, -69, 96, -75, 24, 44, 37, -79, 54, 30, -24, 12, -30, -65, 70, -50,
+    54, -1, -60, 73, -64, 3, 68, -50, -5, -81, 52, -18, -91, -91, 68, 47,
+    -93, 16, -22, -81, 16, 12, 81, -85, 40, -1, 99, 58, -90, 81, 63, 45, 6,
+    -2, -99, -30, 55, -76, 35, -30, -97, 98, 13, 44, 32, 53, -3, -85, -20,
+    -95, 92, -19, 26, 81, -25, 54, -86, 62, 14, 91, -44, -4, -69, -76, 71,
+    92, 25, 55, -35, 70, -100, -13, -47, -7, -16, 46, -28, -64, -37, -61, 21,
+    -21, 54, -86, 14, 13, 0, -85, 65, 53, 55, 35, 54, -72, -91, 37, 10, 94,
+    19, -50, -19, -7, 64, -96, -88, -56, 44, -87, 1, 28, 37, 58, 99, 33, 9,
+    70, -87, -81, 89, 46, -47, 22, 44, 13, 80, -44, -44, -70, 83, 97, 20, 81,
+    -79, -59, 62, -38, -69, 13, -21, 4, 64, -95, -6, 63, -94, 27, 68, 49,
+    -11, -92, -76, -43, 59, -37, -62, -7, 48, -20, -51, 42, 4, 14, 95, -12,
+    3, 27, 87, -76, 82, 60, -63, 92, -29, 88, 60, 60, 70, 30, 94, -12, 88,
+    -16, -30, -82, -48, 75, 74, -48, -76, -80, -33, -1, -12, -15, -45, -59,
+    66, -38, -100, 73, -39, 89, -45, 41, 71, 39, -17, -26, 90, 42, 12, 82,
+    -97, -68, -6, -59, -30, 65, -19, 68, 28, -33, 91, 45, 21, -32, -96, 80,
+    -25, 22, -94, 57, 64, 64,
+  30, 52, -7, -47, 20, 16, 28, -17, -83, 32, -15, 7, -52, -86, -99, 11, 52,
+    -52, -16, 72, -4, 7, -25, -80, -100, 87, -56, 84, 97, 92, -33, -4, 26,
+    -35, -63, 19, 46, 79, 67, 36, 60, 26, -19, -50, 81, -96, -65, -56, -42,
+    -84, -48, 90, -83, -58, 69, -32, 59, 96, 40, 95, -84, -78, -100, 61, -54,
+    69, -67, -13, 60, 26, -49, -97, -27, 64, 33, 50, -16, 30, -24, -50, 94,
+    -75, 90, -25, 55, 84, 86, 59, -69, -95, -63, 95, -81, -61, 5, 7, -93,
+    -40, 74, -10, 36, -32, 82, -6, -67, 78, 6, -59, 36, -65, 49, 60, -61, 23,
+    -64, -78, 47, -67, -45, -8, -80, 68, 27, -15, 90, -21, 15, -78, 56, -12,
+    3, -41, 67, -38, -93, -30, 10, 39, -68, 51, -94, -19, -36, -72, 22, -93,
+    -31, -62, 41, -12, -94, -32, -37, 15, 49, 51, 35, 20, -39, 8, -51, -34,
+    91, 52, -21, -5, 96, -70, -39, 22, -19, -30, 64, 91, 77, 88, -88, -49,
+    84, 72, 89, -91, -68, 25, -48, -19, 45, 53, 15, -90, 69, 21, 11, -3, -26,
+    -71, 77, 44, 5, -72, 24, 23, 90, 65, 93, -62, -40, -85, -5, 30, 49, 36,
+    61, 47, -99, -100, 40, -57, -83, -93, -98, 40, -57, 58, 79, 38, -4, 55,
+    89, -22, 66, 63, 78, -92, -60, 2, -57, 23, -96, -35, -93, -43, -90, -80,
+    -28, 75, -35, -20, 21, 95, 43, 84, -62, -58, 98, 29, -97, -26, 78, 41,
+    -18, -100, -71, 42, -50, -55, -87, -40, 83, -58, -54, 6, -83, 57, -39,
+    -72, -78, 12, -24, 15, -95, 55, -55, 18, 31, -57, 74, 96, -36, -81, -98,
+    78, 48, -18, 72, -72, -97, -12, 34, -56, -98, 24, 98, -95, -19, -89, -38,
+    81, -11, 44, -22, 34, 80, 36, -88, 50, 86, 95, 0, -44, 14, 83, 73, 29,
+    -56, 58, 88, 9, 23, 39, -18, -91, -10,
+  -28, -24, 22, -57, 37, 75, 36, -4, -17, -18, 99, -11, -99, 91, 25, -99, 93,
+    28, -18, 61, -62, -9, -49, 87, -62, 60, -85, 2, -91, 69, -22, -40, 17,
+    -6, -54, -33, -38, 58, 81, -16, 23, -74, 2, 63, 35, 23, -54, 41, 49, -33,
+    -6, 94, 44, 92, -57, -83, -34, 85, -73, 41, -24, 90, 5, 18, 61, -44, 52,
+    87, 32, -72, -67, 31, 72, 1, -66, 5, 52, -48, 14, -91, -43, -14, 16, 58,
+    -47, -97, -62, 63, -83, -54, 41, -54, 59, 60, -51, 23, 43, 83, -96, -40,
+    28, -28, -31, 41, 50, 20, -20, -60, -51, -2, -75, -16, -6, -12, 6, -77,
+    -28, -12, -98, 49, 86, -77, 88, -98, -96, 5, 30, -89, -79, -49, -19, 1,
+    -43, -22, -6, -96, -74, -4, -61, -44, -18, 91, 38, -34, -44, -2, 6, -38,
+    -7, 82, -62, 96, 23, -80, 49, -34, -18, -16, -90, 53, 20, 41, 47, -47,
+    -93, 30, 1, -37, 34, 65, 41, 20, -6, -83, -2, 25, 45, 97, 61, 42, 52, 75,
+    70, -70, -36, 69, -16, -10, -5, -1, -36, 62, -45, 87, -42, -44, -95, -60,
+    -89, 60, 97, -93, -100, -43, 19, 47, 43, 19, 70, 52, -10, -9, 58, 19,
+    -10, -1, -33, 95, 29, 41, -93, 41, 50, -48, -12, -5, -47, 77, -75, -18,
+    -44, 58, -68, -77, 72, 66, -60, -52, -62, -6, 10, 51, 73, 55, 94, -90,
+    40, -54, 58, 2, 22, 84, 58, 44, -57, -58, 65, -62, -21, 47, -95, 28, 64,
+    -25, -18, -63, 84, -31, 96, -39, -5, 1, 0, 12, -37, 71, 96, -17, -59,
+    -19, 53, 43, 34, 58, -10, -78, 53, 27, 49, 44, 42, 98, 59, -75, -11, 62,
+    -22, -51, -39, 39, 9, -95, -49, 17, -25, 73, 28, -67, -43, -95, -24, -16,
+    5, -53, -5, -96, -99, -54, -69, 60, 55, 56, -43, -28, 95, -47, -10, -68,
+    -50, -85, -51, -88, -18,
+  -78, 92, 68, 75, 68, -72, 47, 38, -31, -35, 7, -34, -55, -95, -84, -99,
+    -99, 72, 45, 66, 87, -98, -53, -33, 11, 60, -94, 3, 50, 57, -42, -1, -42,
+    -54, 19, -49, 28, -24, -27, -91, -32, -58, -84, 10, 80, 81, 5, 56, 0, 27,
+    34, -32, 23, -90, 29, -40, 75, -79, 71, -16, 20, 35, 5, -43, -34, -36,
+    -45, 97, 90, 58, -13, 46, -24, -40, -27, -62, -73, -25, -61, -27, 89, 58,
+    -23, 38, 59, -36, -65, -47, -76, -39, -66, 25, 82, 82, 79, 29, -13, -27,
+    57, -7, -30, -21, 26, 85, -22, -84, -29, -87, 44, 72, -23, 16, -86, -89,
+    97, -57, -69, -46, 46, -25, 71, 30, -6, 72, 68, -47, -53, -83, -89, -22,
+    27, 97, 66, 11, -79, 18, 60, 16, 69, -64, 15, 86, -61, -21, 17, 2, -97,
+    33, -79, -94, 68, -26, 40, 98, 92, -2, -85, 91, -44, -64, 13, 80, -18,
+    -21, -87, -33, -45, -42, 12, -61, 6, -69, 37, -43, -56, -74, -59, -2,
+    -26, -45, -77, 61, 74, 62, 27, -6, -43, -91, -59, 49, -6, 11, 29, -85,
+    -23, 13, 84, -68, -88, -92, -38, -75, 60, -23, 7, -24, 30, 6, 62, 85,
+    -77, 44, -81, 35, -1, 33, -2, -78, 21, -74, 88, -90, 70, -100, 75, -69,
+    -6, 95, -19, -57, -85, 48, -30, -90, -17, -11, 26, 79, -31, -91, 49, -24,
+    24, 82, -98, 64, 28, 36, -24, -94, -51, -38, 58, 24, -29, 18, -21, -25,
+    27, 4, -87, 9, -59, 31, -31, -86, -74, -14, -53, 74, 74, -97, 56, -37,
+    -33, 92, 23, 4, 92, -59, 27, -52, 88, 19, 52, 58, 88, -84, 66, -74, -64,
+    82, 45, -10, -44, -18, -79, 92, 11, -71, -18, 51, -82, -94, -66, 14, -30,
+    -5, -59, -44, 3, 32, 87, -44, -98, 40, 82, 26, 55, 98, 23, 1, 97, -57,
+    -63, -24, 28, 49, 7, -96, 26, 22, 64,
+  -95, 35, -39, 82, -50, 14, 15, 3, 99, 83, 3, 57, 60, 98, -96, -60, -63, 87,
+    24, -80, -9, -90, 83, -53, -56, -6, -57, 77, -96, 68, -80, 94, -79, -17,
+    -37, -5, -20, -4, -38, -44, 15, -39, 87, 47, 1, -40, -17, -63, -21, 98,
+    -15, 49, 97, 29, 85, -62, -1, -38, -39, 1, 44, -6, -63, 2, 72, -1, 14,
+    91, -72, 31, -55, -28, -24, -82, -35, -58, -3, 99, 41, 57, -1, -60, 6,
+    81, -2, 19, -90, 95, 89, 40, -38, 61, -38, -1, -27, -96, 49, -34, -72,
+    46, -82, -73, -80, -9, 71, 84, 93, -33, 46, -84, -46, -67, 25, 86, 6, 99,
+    -1, 8, -86, 99, 24, 41, -67, 69, 8, -56, 37, -23, -46, 15, 56, -100, 27,
+    -76, -56, 77, -4, -82, -15, -59, 62, -39, 19, -34, -77, 28, -3, -99, 56,
+    -53, -32, 84, -25, 75, -82, -55, 3, -64, 70, 87, -76, 46, 92, 29, 75, 64,
+    -96, 80, 56, -88, -95, -6, -85, 99, -31, 20, -10, 61, -5, 83, 16, -7,
+    -17, -28, -35, -33, 52, -41, -65, -1, -36, 55, -97, -44, 94, -46, -31,
+    41, -85, 47, -3, -48, 37, 45, 47, 7, 67, 35, -14, -30, -36, 13, 94, 77,
+    -31, -58, -37, 37, 13, 66, -17, -48, 36, -70, 80, -19, -32, 68, 54, 44,
+    -63, -45, 0, 59, -5, -78, 1, -84, 71, 97, 78, 9, -86, -43, 32, -48, -15,
+    83, 77, -54, 20, -70, -93, 83, 56, 75, 13, -86, -45, -87, 20, 2, 29, -50,
+    28, -92, 20, -50, -46, 92, 41, 56, -19, 23, 91, 5, 11, 34, 89, -66, 6,
+    23, 82, 63, -67, -40, -16, -18, -37, 18, 27, -45, 31, -30, 45, 21, 97,
+    75, 11, 63, 5, -80, -62, 96, 4, -69, -69, -66, 44, -55, -5, -17, 70, 11,
+    70, -19, 81, 6, -9, -75, -77, 37, 57, -31, 33, 25, -69, -20, -88, -40,
+    37, 16, 27,
+  52, 43, -67, 68, 85, -40, -32, 13, 39, -32, -54, 63, -30, -11, -65, 40,
+    -93, -22, 24, -56, 57, -31, -19, -13, 78, -24, -49, 63, 93, -52, -46,
+    -19, 62, -60, -79, -54, -46, 45, -59, -73, 82, -46, 9, -58, 25, 51, -74,
+    62, 6, 86, -7, 40, 26, -88, -70, 3, 61, -3, 97, 27, -26, -21, -8, -69,
+    -30, -45, -42, -46, 8, -88, -34, 4, -43, 9, -38, -23, 34, 50, 10, -46,
+    23, 45, -44, -86, 8, -16, -74, -16, 81, -13, 16, -93, 82, -52, 28, -61,
+    16, 88, -24, 26, 29, 37, -73, -65, 84, -19, -67, 6, 62, -46, 91, -48, 55,
+    -27, 4, -2, 82, -19, 4, 37, 98, 62, -30, -61, -79, 75, -34, 29, 34, -74,
+    61, -15, 82, -70, 1, -26, -27, 17, -39, -75, 98, 29, -14, 90, 59, -4, 28,
+    77, -2, 88, -21, -70, 6, -67, -17, -92, -77, -62, 29, -14, 17, 24, 67,
+    -72, 12, -6, -40, -75, 44, 70, -37, -18, -31, 48, -76, 66, 23, -99, -84,
+    -81, 9, -25, -56, 42, 31, 24, 42, 8, 59, -22, -83, 53, 73, 77, -62, 55,
+    -58, 23, 1, -33, 90, 69, 45, 26, -99, -47, -48, -11, -33, 52, 16, -89,
+    23, -66, -37, -29, 44, 98, -22, -73, -75, 50, -82, -22, 14, 60, -100, 40,
+    48, 24, 16, -91, -84, -11, -87, 54, 35, 12, -42, -67, 74, -3, -43, -90,
+    30, 93, -14, -32, 37, 39, 39, -100, 44, -96, 48, 98, -19, 79, 83, 28,
+    -78, 24, -48, -37, -20, 30, -38, 74, 44, 7, 8, -77, -63, 25, -49, -15,
+    83, 32, 63, 68, 83, -17, 33, 28, 34, -82, 62, 0, 60, -3, 39, -81, -10,
+    64, -37, 56, -86, -39, -31, -35, 40, -32, 69, -68, -19, -14, 50, -62,
+    -60, 74, -72, 17, 73, 22, -26, 70, -97, -76, -65, 73, -94, 54, 29, 42,
+    -93, 76, -85, -46, -67, 72, 18, -30, -28,
+  72, -33, 59, -86, 89, -100, 38, -84, -62, -48, 86, -73, 15, 17, 22, -32,
+    35, 53, -93, -87, -58, -37, 23, -9, 12, -84, -30, 75, -77, -39, -99, -1,
+    -97, -42, 98, 92, 85, 18, -23, -4, 36, 76, -80, -16, -28, -85, 81, 70,
+    -99, 89, 4, -23, 14, -48, -30, 81, -82, 92, 69, -53, -99, -3, -3, 27,
+    -87, 29, 79, -26, -79, -12, 93, 98, 13, 28, -36, 62, 47, 1, -28, 11, -99,
+    53, -2, -24, 38, -14, 1, -46, -84, -31, -47, -69, -68, -19, 28, -88, -46,
+    68, -24, -13, 84, 54, 46, 82, -59, 49, -15, -36, -11, 95, 49, -86, -53,
+    17, 88, -92, 26, 0, -45, -57, 60, -87, -12, 9, 17, -74, 11, -3, -97, -13,
+    8, -63, -2, 67, -39, 7, -28, 48, 58, 21, -70, 14, -41, 12, 86, 92, -41,
+    -26, -56, -7, 98, 9, 1, 6, 42, 34, -39, -72, -93, 12, -34, 64, 44, 83,
+    -51, 63, 48, -48, 4, -18, 85, -70, 5, 93, -2, 8, -25, -97, -38, -8, -85,
+    39, 74, -67, 49, -22, 6, 70, -56, -75, 22, 48, 80, -19, 61, -77, 4, -65,
+    64, -64, 2, -51, 30, -69, -25, 29, 55, 74, -34, -19, -62, 20, 80, 11,
+    -30, 16, -50, 10, 64, 99, 27, -90, 39, 64, 18, -85, -27, 89, -27, 41,
+    -37, 71, 3, 9, 98, -79, 1, 59, -39, 51, -64, 43, -93, 66, 39, 19, -43,
+    15, 75, 23, 81, 24, 18, -30, -49, 54, 3, 58, -87, 30, 19, 89, -31, -37,
+    -32, 14, -74, 37, 25, -59, -27, -76, 15, 3, -51, -24, -75, 17, -72, 14,
+    -46, -61, 68, -21, -57, -53, 29, -87, -2, 3, -22, 91, -4, -25, -31, -86,
+    -15, -91, 56, 59, -13, 11, -23, -87, -3, -36, 13, 62, -88, -31, -93, 70,
+    -85, 67, 52, 49, -69, 51, -68, 82, 34, 28, 99, 38, -9, 53, 35, 30, -67,
+    1, -33, 52, 72,
+  66, 49, -43, 8, -85, -2, 10, 98, -32, 44, -96, 11, 79, 70, -97, -3, -37,
+    -10, -98, 14, 39, 55, 26, 22, -60, 78, 62, -7, -68, 65, -75, -81, -10,
+    50, 98, -7, 96, 75, -85, -48, -55, 78, -98, -6, 94, -83, 8, 82, 74, -10,
+    74, -8, -90, 54, -61, 79, 83, -66, -38, 99, 73, -44, 76, -13, 20, 26,
+    -59, -51, 31, 90, 82, 34, -46, 58, 51, 48, -80, 37, 97, 54, 94, -91, -20,
+    75, -68, 92, 16, -29, 13, 12, -2, -66, -44, -38, 98, 9, -63, 64, -30, 25,
+    96, -69, 60, -38, -12, 53, 31, -27, 29, 49, 69, -53, -19, 19, -69, 16,
+    -28, -35, 95, -30, 31, 94, 28, -41, 24, 92, -32, -7, 36, 66, -85, 49,
+    -36, -87, -41, -83, 6, -19, 58, -58, 82, 23, 96, -87, 23, -64, -6, -84,
+    -92, 62, 45, -64, 14, 27, -48, 43, -90, -12, -11, -20, -51, 84, -43, -71,
+    -37, -99, -11, 93, -58, 42, 40, -51, 54, -39, -35, -65, -35, -96, 67,
+    -18, -72, -17, 42, -42, 82, 81, -16, -50, 58, 63, 49, 4, 24, -16, 0, 53,
+    -92, -54, -54, 36, -90, -68, -7, 34, 48, -69, -83, 10, 43, 36, 73, -79,
+    -85, -76, 20, -29, 54, 41, -84, 62, 75, 11, -21, -41, 72, -47, 47, -16,
+    -58, 61, -8, 99, -46, -44, 28, -10, 57, -25, 2, 67, 80, 19, -61, 5, -54,
+    23, 91, -65, 40, 8, 70, 90, -48, 80, 5, -6, 30, 33, -57, 98, 8, -9, -26,
+    57, -91, -11, 52, -57, -99, -64, 38, 78, 58, -16, 57, 38, -40, -44, 60,
+    -41, -25, 41, -51, 24, -59, -58, 5, -31, -100, -61, 33, 27, -18, -36,
+    -26, 84, -31, 21, -6, 47, -47, -90, -69, -47, 79, 56, -49, -64, 7, 37,
+    92, -48, -12, 44, -6, -17, -25, -39, -77, -19, -77, 59, -44, 97, -6, 65,
+    -12, 9, -59, 16, -34, 33, -39,
+  65, -81, -17, -99, 20, 6, -86, 67, -17, 3, 95, 57, -57, 88, -66, 99, 34,
+    -40, -45, 67, 9, -67, -59, -3, -47, 31, -73, -83, 30, -10, 9, 65, -77,
+    40, -44, 2, 72, -96, 88, 64, -17, 69, 80, 62, -30, 1, 50, -85, 8, -24,
+    15, -85, -26, 48, 74, 45, 45, 60, 3, -62, 21, -45, 93, -53, -53, 77, -62,
+    17, 63, -57, 40, 20, -6, -12, 95, 85, 58, 90, 76, 88, 60, -100, 24, 49,
+    84, -87, -57, -76, -42, -30, -45, -64, -55, 27, 0, -71, 46, 83, 15, -18,
+    98, 64, -20, 67, -89, 35, 5, -14, 33, 52, -10, 59, -55, 46, -29, -91, -9,
+    -78, 86, -55, 12, -35, 46, 65, 57, -39, -90, 52, 20, 51, -40, -59, 72,
+    72, -98, -40, 25, 96, -32, 87, 25, 31, -7, -44, 24, -74, -32, 24, 58,
+    -20, -88, 0, -34, -82, -73, 33, 0, 95, -48, -12, -55, -49, 68, -98, -72,
+    -42, -21, -87, -31, 61, -80, -80, 16, -66, -66, 36, -76, -94, -81, -6,
+    -95, -18, 13, 40, -2, 97, -36, 64, 96, -83, 67, 74, -70, -33, -48, -73,
+    -78, 30, 16, 28, -67, 86, -62, -57, 9, 5, -64, 55, 32, 84, -53, 15, -45,
+    19, -76, -10, -80, 32, 75, -79, 26, -30, -79, -58, -63, 67, 22, -59, -24,
+    -27, 11, -61, 47, -49, 92, -83, 48, 30, 13, 97, -40, -5, -73, -49, 52,
+    64, 85, -5, 19, 51, -4, 63, -11, 88, 88, 80, 34, 88, 3, -60, 95, 41, 17,
+    6, -27, -100, 24, -72, -1, 58, 51, -83, -41, -14, 20, -49, -29, 63, -91,
+    3, 68, 70, -30, 97, -97, 44, 51, -53, -71, -75, -63, 2, 92, 46, -91, -16,
+    37, 51, 84, -24, -27, -70, -86, 75, -1, -32, -97, 64, 79, -74, 84, -69,
+    60, 14, -24, 35, -82, 4, 66, -43, 3, -1, -71, -92, -60, 25, -62, -36, 81,
+    -3, -85, 9, 9,
+  -15, 54, -24, 98, -27, 76, -67, -58, 19, 36, -83, -17, 60, 96, 7, -78, 30,
+    -16, -12, -6, 47, 52, 67, 25, -65, 47, -91, 54, 18, -20, 60, -18, -19, 6,
+    -53, 19, 15, 85, 14, -34, -78, -67, -89, -37, 53, -94, 75, 52, 48, -86,
+    42, 97, -32, 21, 12, 28, 4, 90, 7, -35, -56, -89, -80, -72, 50, -54, 91,
+    -17, 11, -21, 12, 62, 4, -57, 97, -96, 5, 16, -21, -3, 24, 55, -31, -10,
+    -61, -68, 95, 31, 61, 4, 26, -52, 49, 26, -57, -44, -57, 25, -47, 11, 51,
+    -93, 51, 97, -81, 37, -43, 3, -91, 8, 44, 93, -78, -66, -59, 93, -79,
+    -19, 80, -4, -36, -86, -7, -41, -18, 9, -6, -8, 90, -41, 88, -64, 42, 37,
+    13, 0, 32, 23, -3, -87, -74, -42, -25, 91, 12, 90, 59, 55, -77, -18,
+    -100, 63, 96, 45, 39, -8, -92, -90, -39, 95, -47, -34, -18, -26, -83,
+    -70, 35, -71, -30, 51, 66, -6, -55, -8, 52, 10, 69, 99, -45, 96, -27, 49,
+    55, -17, 99, 52, 94, -92, 81, 30, 90, 36, 70, -59, -88, 18, 84, -15, -87,
+    -46, -78, 71, 31, 93, -5, -9, -73, 85, 5, -48, 78, -29, -52, 77, 74, 83,
+    79, -97, -60, 58, -34, 71, -53, 85, 72, 93, -30, -24, 41, -66, 34, -76,
+    -95, -20, -8, 90, -82, 19, -3, -11, -28, -34, 93, 40, -56, -76, 98, 94,
+    -45, -45, 17, 30, -7, -35, -33, 17, -100, 57, -84, 55, -26, -31, -42, 42,
+    24, 25, -24, -17, 16, 89, -64, 94, 56, -38, -2, -54, -67, 80, 24, -46,
+    -99, -96, 10, -48, 89, -70, 84, 63, 46, 7, 7, 49, 33, -3, -65, 95, -76,
+    52, -10, -18, 48, 35, 10, 6, -86, 92, 72, -88, -77, -6, -75, 33, 10, -56,
+    -45, -82, -45, 28, 48, 12, 82, -26, 25, 81, 27, 10, -3, -37, -42, -37,
+    -25, 93, 98,
+  -63, 0, 88, -36, 32, 23, -56, -92, -66, 0, -45, -4, 43, 86, -87, 74, 2, 2,
+    -68, 62, 64, -19, 22, -38, -4, -70, -96, 72, 55, 43, -79, -17, -69, -48,
+    -66, -46, 15, -3, 9, 95, -91, -40, 85, 32, 14, -83, -2, -29, -52, -13,
+    37, 53, -52, -97, 60, 79, -39, -43, 1, -93, 71, -25, -79, 82, -55, 66,
+    -70, 66, -91, -100, -59, -81, -57, -99, -58, -85, -81, 83, -90, -75, -58,
+    -77, -58, -58, 0, -56, 68, 22, -64, 27, 6, 54, 96, 28, 36, 63, -69, 45,
+    -56, -53, -46, -3, -49, 65, 37, -64, 81, -18, -78, 37, -43, -73, 2, 51,
+    53, -74, 37, -82, 4, -64, -76, 80, 55, -91, -90, -10, 40, 59, -96, -94,
+    -60, -53, -76, 5, -51, -70, -56, -76, -16, 93, -49, -63, -61, 83, 20, 70,
+    3, 30, 0, 48, -44, 6, 19, -94, 84, -26, 41, 41, 6, 20, -19, 21, 85, -76,
+    38, -75, -3, -82, 67, -67, -2, 43, -40, -9, -87, 62, -100, -4, 32, -52,
+    -42, -3, -80, 39, -38, -63, 21, 60, 4, -19, -34, -78, -82, 93, -86, 90,
+    -32, -12, 14, -56, 62, 32, 36, 78, 31, -50, 40, 96, -69, -37, -71, 59,
+    -17, 39, -7, 26, -3, -50, 96, -76, 92, 43, 38, 75, 20, 82, -63, -29, -57,
+    41, -43, -61, 85, -6, -79, 67, -60, 57, 7, 23, -11, 29, -79, -30, -41,
+    -87, 77, -91, -80, -41, -49, -34, 99, -79, 57, 16, 57, -32, 56, -84, 69,
+    -91, 21, -18, -24, 50, 59, 4, 83, 39, 64, -27, -80, 89, -28, 83, 60, -50,
+    46, 29, 85, -39, -98, 66, 53, 0, -63, 77, -34, 88, 20, 56, -44, -35, -41,
+    52, 68, 50, -1, 68, -66, -52, -2, 99, -78, 78, 33, 43, 80, 50, 56, 48,
+    -70, -98, -67, -89, 53, -14, -42, -91, -54, -22, 8, -65, 91, 89, -35,
+    -75, -37, -31, 20, -59, 75,
+  42, -52, 99, -17, -56, -27, 74, 0, 98, 85, 18, 63, -6, -96, 73, -80, -37,
+    12, 82, 74, -39, 15, 75, 61, -92, 67, 35, 66, -67, 81, -67, 95, 3, -17,
+    95, 47, -82, -98, -83, 55, -86, -94, -76, -86, -71, -16, -1, -24, -57,
+    -34, 19, 29, -13, 21, 88, -74, 34, 94, -67, -50, 45, 66, -11, -2, 70,
+    -51, -19, 60, 74, 20, 33, 62, 44, -26, 42, -65, 34, -81, -46, -82, 2,
+    -86, -2, 62, 90, -27, 39, 23, -100, -67, -63, -35, 26, 4, -80, 63, -87,
+    48, -95, 31, 18, -70, -46, 40, 73, -98, 1, -96, -10, 35, 78, -54, 36, 87,
+    -55, 97, -48, -46, -36, 57, 77, -34, -18, 76, -45, 76, 13, 50, 20, -8,
+    12, 67, 27, 73, -5, -100, -49, -1, 26, 89, 58, 46, -48, -35, -83, -73,
+    51, 37, -22, -62, -82, 92, 11, 74, 14, -51, -63, 91, -67, 53, 7, 29, -95,
+    -14, 36, 79, 10, -94, -64, 80, 83, -14, 6, -55, -81, 51, 74, -63, 31, 24,
+    19, -6, 33, 2, 62, 61, 15, 45, 76, -76, -67, 71, -7, -54, -44, 8, 51,
+    -53, 80, 38, 91, -6, -43, 20, -65, 50, -47, -12, -35, -32, -76, 33, 13,
+    -13, 37, -65, -86, -15, 12, -94, 90, -73, -74, -97, 71, 80, -78, 96, -23,
+    -31, -52, -75, 99, 71, -11, -99, -77, 80, -76, -87, -69, 56, -96, 89,
+    -38, 94, -48, -24, -18, -82, -34, -45, -64, -50, 93, -98, 22, -69, -2,
+    -84, 82, 20, 41, 15, -75, -100, -86, -6, 99, 54, -5, -18, -2, 12, -8,
+    -10, -32, -66, 56, 32, -69, -21, -53, -55, -19, 81, -75, 81, -42, -54,
+    -16, -100, -61, -16, 30, -35, 25, -16, -5, -75, -51, 32, 99, 62, 42, 63,
+    93, -73, -71, -59, -25, 59, -31, 35, -58, -85, -24, 11, -58, -82, -58,
+    -50, -69, -69, 8, 93, -64, -6, 1, 50, 99, -1, -24,
+  -71, 76, 96, 37, 20, 8, -67, -47, -89, 62, 52, -52, 78, 86, -62, 60, 46,
+    44, -68, -44, -34, 28, 30, -30, -2, -1, 14, -64, -68, -63, -88, -86, -95,
+    40, -70, -55, 5, -56, -50, -61, 88, 57, 45, -73, -3, -45, 19, 5, -73, -6,
+    -78, -82, -37, 2, 61, -44, -67, 26, -27, 94, 3, -34, -10, 71, -46, 19,
+    68, -35, 46, -22, 61, 70, 68, 99, -99, 60, -44, 92, 48, 98, -68, -10, 97,
+    1, 12, -94, -82, 49, -98, -84, -1, 14, -7, 23, -65, -67, 63, -40, -48,
+    35, -68, -7, -87, -14, 61, -53, -62, -27, 35, -16, 87, 79, -11, 74, 74,
+    66, -89, -62, -71, -96, -66, 24, -7, -84, -94, -75, 70, -38, 10, -20, 89,
+    32, -3, 59, -73, 15, -2, 36, -32, -4, -10, -38, -48, -70, -41, 67, -73,
+    -20, -37, 70, 12, -49, 93, 88, -96, 96, 23, -96, -23, -84, 6, -64, 38,
+    58, 20, 89, -85, -88, -41, 1, -90, -87, -54, 24, -82, 23, -21, -85, 20,
+    -13, -81, -72, 28, 94, 16, -34, 66, 90, 44, -42, -95, 37, 74, 62, -23,
+    -10, -47, -20, -80, -45, 10, 61, 28, -70, -5, 43, -68, -74, 21, 86, 26,
+    -90, -64, -33, -31, -81, -77, -38, -98, 16, -100, 70, -99, 63, -20, 21,
+    70, -42, 28, -24, 59, -83, -88, 53, 12, 43, -6, -8, -22, 58, 3, -83, 27,
+    73, 13, -75, 44, -60, -66, -54, -27, 35, -55, 8, 61, 16, -7, -53, -98,
+    -65, 72, 23, -80, 21, -58, 13, 48, -57, -80, 87, -21, 0, 31, 5, -11, 31,
+    -86, 14, -32, -87, -29, 45, -33, -28, 7, -38, -79, -27, -83, -67, -44,
+    96, 11, -12, -100, -97, 8, -83, 35, -12, -94, -23, -77, 65, -25, -91, -5,
+    -1, -8, 48, 37, 49, 44, 8, 71, 68, -62, 91, 30, 15, 19, -42, -36, 41, 81,
+    87, 60, -1, -38, 0, -71, -66, 41,
+  -31, -100, 12, 35, 71, 19, -1, 73, -73, -72, 66, -25, -86, -76, -58, -81,
+    18, -25, 82, 29, -13, -47, 11, 30, -29, -84, -58, 2, -68, 56, -14, 84,
+    36, -61, -1, -69, -99, -88, -53, -67, 23, -84, 87, -1, -84, 42, 54, 65,
+    66, 11, 8, -43, -97, 61, 42, -59, -27, -9, 48, 75, -40, 26, -61, 26, 73,
+    34, -21, -18, -54, -34, 79, -49, -94, -57, -91, -67, -71, -45, -21, 17,
+    -56, -54, -8, 67, 30, 25, -45, 10, -67, -48, 56, 28, -53, -8, -41, -62,
+    84, -17, -87, 73, 74, 82, 70, -2, 57, -84, 79, -51, 9, -54, 0, -9, 37,
+    76, -26, 14, -43, 96, 67, -15, -17, 34, 89, -89, 75, -91, 84, 62, -64,
+    -35, 40, 67, -38, 75, 34, -91, -42, -2, -25, 26, -16, 97, 53, -7, 38,
+    -16, -52, -18, -84, -75, -4, -20, -6, 19, -29, 63, -53, -81, 11, -97, 43,
+    83, 77, -100, -80, 93, 98, 99, 55, 17, -11, 54, -18, -95, -80, 98, 20,
+    92, 79, 34, 51, -19, 54, -24, 78, 95, -48, -40, 24, 31, -59, 47, -29,
+    -11, 70, -6, -98, -86, 99, -5, -94, -15, -82, -28, -71, -67, 72, -52,
+    -83, -46, -76, -91, 94, -1, -44, -44, 99, 89, -59, 18, 6, 51, -51, 71,
+    -99, -55, -65, 67, -48, -67, 46, -4, 92, 61, -99, 83, -13, 90, -72, 62,
+    -77, -32, -74, -83, 15, 3, 86, -7, -73, -79, -76, -28, -15, 64, 13, -65,
+    94, 65, -20, -41, -83, -79, 80, 56, -58, 46, -77, -32, -76, -38, 82, -5,
+    -95, -21, 68, -41, 10, -55, -80, -82, -45, 62, -21, -32, 40, 85, 9, -38,
+    2, 19, 19, 79, -44, -73, -12, 45, -49, 89, 48, 36, -78, 70, 22, -55, -3,
+    -44, -65, 93, -80, -74, 55, -96, 7, -69, -45, 56, -69, 34, 75, -52, 37,
+    91, -5, -78, 12, -82, 51, 3, -34, 56, -60, -6, 9,
+  66, 43, 5, -62, -63, -18, -20, 74, -99, 88, -18, -35, -42, -60, 94, 49,
+    -11, 55, -62, 94, -86, 30, 45, -63, -81, 17, 51, -72, -13, 27, -25, -51,
+    69, 8, -62, 95, -50, -82, -92, 54, -61, -80, -19, 32, -88, -66, 8, 44,
+    65, 10, 54, 53, -90, -94, 74, 35, 3, -96, -30, 11, -25, -69, -30, 43, 34,
+    18, 71, -78, -60, 70, 52, 45, -36, 86, -11, 63, 80, -52, 18, -17, 47, 69,
+    63, -99, 17, 16, 49, -87, -91, -74, 98, -51, -29, 30, 34, 33, 63, 31, 30,
+    54, 87, -57, 44, 77, 75, -16, 26, -74, -23, -69, -59, -87, -54, 14, 34,
+    -6, -71, 63, -63, 16, 67, -27, 18, 29, -30, 3, -48, -48, -39, 85, 78, 26,
+    98, 37, -5, 59, -18, 17, -28, -36, -62, -40, 14, 17, -35, -33, 46, -60,
+    9, 75, 32, 39, 30, -68, 2, 28, -60, -94, 89, 45, -86, -98, -63, -22, -35,
+    74, 27, 40, 44, 42, 19, -48, -68, -4, 42, 18, -28, -55, -38, -75, 54, 2,
+    -69, 69, 2, 60, 43, -76, 41, -9, -28, 50, -52, 51, -26, 37, 27, -42, 7,
+    70, -96, -36, -15, -12, -31, -90, 37, -94, -42, -69, -45, 86, -55, 56,
+    -80, -13, -20, -84, 84, -30, -51, -80, -29, -18, -34, -38, -74, 90, 43,
+    -8, 62, 60, 22, 33, 57, 47, -38, 42, -60, -62, -42, -50, 39, 36, -70, 93,
+    78, -3, 74, 30, 59, -1, -69, -87, 44, -14, -49, -64, -27, -23, -85, -43,
+    86, -39, 11, -35, 40, 49, -32, 54, 63, 12, -60, -21, 45, -63, -37, 70, 1,
+    61, -45, 69, 8, -36, -50, 88, -4, 88, 90, -59, -79, 90, -96, 90, 21, -4,
+    99, 59, -99, 61, 9, -52, 17, -17, -58, 48, 71, 80, 33, 45, 14, -35, 81,
+    -92, -59, 5, -93, -56, 6, 51, 1, 6, 96, -7, -43, -47, -85, -99, 59, 79,
+    83, -97, -53,
+  69, -75, 39, 78, -10, -65, -37, 58, 58, 14, 86, 69, -84, -48, -33, 99, 60,
+    11, -35, -33, -18, 94, 68, -91, 75, 85, -15, 9, -20, -15, 40, -20, -41,
+    47, -99, 68, -35, -15, -74, -31, -44, 9, -20, 45, -91, 53, -29, 23, -34,
+    70, 33, 15, 37, -90, -85, 33, 58, 9, 43, -78, -31, 35, -68, 82, 84, 18,
+    46, -91, -31, 94, 79, -8, 94, -52, -30, -11, 47, -5, -61, 99, 48, 22, 48,
+    -34, 99, -30, 56, 45, 89, -39, 75, 85, 7, -3, 16, 55, 29, 30, -40, 24,
+    -100, -65, 6, 55, 64, -62, 37, 45, -79, -63, 73, 73, -77, 28, -4, -42,
+    71, -59, -44, 25, -67, 99, 61, 8, -50, -71, 13, 20, -32, 47, -14, 1, -20,
+    72, 59, 84, -35, 66, -40, 83, -86, 16, 66, 12, 70, -50, -95, -3, 41, -48,
+    -15, -48, -96, -9, 3, 74, -89, -23, 98, -81, 66, 51, 44, -96, -3, 55, 46,
+    -38, -42, -37, 74, -87, 25, -40, 41, -42, 79, -58, -17, -50, -74, 92,
+    -64, 34, 90, -65, 86, 85, 4, 71, -86, -37, -16, -46, -28, 30, 76, -93,
+    -18, 34, 50, 50, 8, -48, 82, -99, -91, -43, -61, 74, -54, -71, 20, -60,
+    -61, 27, -8, 85, 25, 40, -77, 95, -91, 35, 33, 77, -49, -78, -71, -5, 11,
+    28, 43, 28, 61, 67, -72, -67, -12, -30, -16, 62, -98, -39, 87, -53, 84,
+    13, 25, -25, -37, -96, 94, -51, 50, -73, 87, -27, -43, -72, -88, 35, 94,
+    72, -39, -87, -35, -97, 5, 58, -89, 11, 18, 34, 35, 30, -44, 15, 88, 64,
+    -64, 86, -90, -98, -10, -39, -13, -2, -82, 59, -37, -71, -22, -63, 13,
+    -75, 96, 60, -37, 72, -34, -96, -3, -18, 44, -20, -11, -61, 55, -4, -44,
+    -65, 20, -49, -82, 77, -31, -70, 90, -70, -90, -92, -88, 2, 21, 10, -47,
+    -60, -36, 80, -51, -92, -95,
+  -59, -81, 10, -18, 75, -8, -44, -56, -45, -14, -26, 40, -62, -16, -12, 60,
+    66, 23, 68, 93, -47, 13, 19, 58, -17, 35, -46, 38, -52, 95, -56, 49, -60,
+    -23, -70, 3, -53, 19, -45, 96, 3, -24, 91, -72, -3, 12, -63, -57, 1, -59,
+    49, 25, 99, 35, 23, -91, 90, 60, 85, -3, 68, 80, -29, 75, 78, 55, -36,
+    -24, 84, -13, -87, -36, 70, -97, -27, 32, -57, -87, 37, -48, 45, -85,
+    -15, -59, -38, -13, -5, 73, 60, -21, 35, -51, -24, -19, 74, 28, -37, -90,
+    27, 13, 59, 0, -74, 36, 85, -42, -62, -94, 76, -7, -38, -52, 15, -27, 35,
+    69, -13, -25, 82, 32, -54, -21, 78, -12, 78, -98, -39, 37, -83, 18, -21,
+    -27, 74, 31, -52, 53, 99, 88, 39, -13, -71, -74, 62, 2, 98, 44, 22, -12,
+    39, -58, 36, -15, 46, 10, -97, -80, 42, 88, -14, 22, 21, -42, -100, -83,
+    10, 97, 95, 75, 43, -89, -47, -81, 54, -51, -85, 78, 87, -39, -61, -40,
+    -22, -55, 10, 11, 13, 59, 77, 65, -29, -75, -58, -50, 25, -26, -46, 34,
+    96, 89, -71, 97, 26, -6, 4, 27, -91, 22, 97, 0, 89, 3, -14, -25, 88, -66,
+    -87, -78, -70, -75, 45, -6, -88, -16, -67, 43, 28, -71, 27, 40, -92, -65,
+    2, -40, -67, 31, 53, 42, -49, 89, 61, 1, 90, 79, 84, 17, 78, -19, -13,
+    25, -49, -58, 85, 32, 29, -49, -70, -11, -67, -23, 93, 51, 0, -15, 80,
+    74, 67, 69, 44, 25, -95, 28, 62, 64, -52, 86, -39, -95, -26, -88, 20,
+    -45, -88, -40, -60, -87, -88, 96, 59, -6, -55, 9, 99, 69, -28, -81, 32,
+    36, -11, -86, -87, -84, -45, -85, -77, -48, -89, 66, 62, 83, 16, -17, -7,
+    2, -68, -93, 69, 69, -92, -86, 76, -41, 0, 88, -94, -68, -47, -34, -45,
+    32, 74, -65, 36, -20, -13,
+  35, -20, -35, -44, -62, 44, 65, -42, -48, 89, 36, -9, -14, 2, 52, -75, -84,
+    88, 18, -52, 63, 46, 41, -59, -40, 58, 65, -59, 60, -88, -30, 8, 6, 76,
+    46, 45, -66, 10, 21, -50, -28, 66, -67, 74, -58, 37, -46, -26, -63, 38,
+    -36, 59, 34, 56, -28, -91, -65, -50, 46, -54, 53, -62, 45, -24, 12, 3,
+    -58, -25, 3, -86, -78, -9, -9, -16, 64, -28, 96, 55, -68, -78, -88, -95,
+    48, 40, -69, -63, -12, -6, -38, 64, 97, -51, 11, 7, -55, 83, -40, 69, 54,
+    28, 58, -29, -82, 29, -41, 11, -67, 88, -37, -91, 49, 27, 80, -20, -76,
+    64, -9, -20, -45, -64, 97, -18, -49, -48, 7, 83, 68, -50, -86, -82, 4,
+    -33, -49, -27, -14, 79, -43, -69, 10, -35, 76, 36, -37, -19, -37, -73,
+    -52, 15, 64, 97, 69, 25, -80, 93, -69, -87, 62, 50, 2, 20, -29, 2, 71,
+    -16, -50, 44, -6, 87, -87, -25, -63, 63, 81, -30, -11, -91, -71, 14, 83,
+    -8, -3, 11, 53, 84, -93, 43, -86, 64, 89, 9, -19, 4, 9, -22, -52, 0, -28,
+    -38, 92, -42, -2, -20, 85, 37, 30, 46, -67, 65, -2, -67, -7, 30, -61, 65,
+    -65, -81, 70, 17, 47, 64, 90, -58, -77, 2, 57, 56, 65, -35, -55, 54, -31,
+    14, -41, -48, -28, 10, 43, -80, 44, 28, 19, -68, 79, -42, -21, -62, 37,
+    -28, 93, -11, 87, 92, -71, 60, 35, -71, -84, -21, 71, -99, -84, -92, -77,
+    -41, 85, 47, -73, 61, 39, -62, -69, 89, 23, 22, -90, 43, -83, 91, 67, 7,
+    -87, 61, -3, 5, 77, 60, 38, -55, -22, -17, 36, 90, -19, 51, -80, 72, 63,
+    -92, -3, 71, 20, 97, 21, 34, 97, -60, -74, 36, 63, 48, 39, 83, -57, -4,
+    -25, 62, 91, 48, 60, 95, -48, -25, 63, -37, 66, 35, 93, 40, 62, -94, -39,
+    23, -65,
+  -51, -23, 75, -3, -35, 65, -75, 69, -34, -40, -59, 88, 45, -76, 57, 23, 0,
+    87, 53, -33, 79, -62, -49, -35, 68, -4, -30, -23, -61, -89, -47, 13, 36,
+    -60, 5, 66, -89, 27, 89, -89, -3, -24, -18, -80, 46, -68, -66, -28, -54,
+    -32, 3, -16, 99, -11, -43, 98, -43, 81, 13, 68, 76, -5, -53, 32, -85, 19,
+    -16, 15, -66, -33, -26, 90, -91, -25, -9, 67, -100, 80, 13, -45, -75, 92,
+    87, 88, 97, -22, 41, -57, -37, -94, 80, 58, 58, 68, -55, -78, 1, 51, 86,
+    -47, -32, -96, -49, -66, -91, 25, -83, -2, -88, 28, -5, 62, 14, -42, -3,
+    32, -22, 82, 98, -72, 85, 39, -88, 63, -42, -59, -96, 1, 70, -72, 54,
+    -54, 59, 50, -82, -57, -73, 25, -66, -90, -75, -90, 54, 96, -4, 73, -81,
+    -70, 28, 84, -18, -31, -13, -64, 10, 19, -39, 13, -87, 54, 7, -4, 80,
+    -35, -54, 45, 26, -22, -86, 99, -29, 10, -44, 71, -88, 45, 72, 97, -20,
+    -22, 83, 5, 3, 41, 84, -45, -20, 4, 7, 46, -21, -44, 99, -42, 51, -72,
+    71, -58, -41, -9, 8, -84, -62, 68, -31, -54, -86, -49, 42, -47, -95, -81,
+    -66, 24, -68, -98, -81, 47, -53, -16, 71, -98, 96, 59, -22, 14, 91, -18,
+    -50, 73, -58, -32, 45, -36, -59, -81, -36, 41, -84, -98, 19, -46, -24,
+    -43, 42, 63, -56, -64, 79, 15, -20, -57, 44, 78, 34, -28, -32, -47, -86,
+    -89, -51, -14, -72, 34, -71, -17, 90, -71, 46, -88, 49, 15, -76, 93, 33,
+    88, 68, -55, 4, -19, 29, -9, 79, 52, 88, -55, -77, -13, 57, 90, -40, 35,
+    -70, -93, 23, 69, -1, 3, -21, 65, 44, -89, 5, 25, -61, -95, -97, 65, -80,
+    58, -60, 43, 52, 70, 77, -18, 43, -23, -11, 15, 82, 70, 43, 28, 48, 20,
+    -8, -35, 35, -46, -95, -67, -73,
+  93, 11, -86, 76, -48, -66, -68, 18, -67, 27, -51, -68, -83, -38, -99, 84,
+    -65, -27, 41, -56, -12, 57, 87, -64, -39, -57, -34, -22, 6, -94, 98, -14,
+    -67, -9, 20, 67, -77, -86, 14, 40, -61, 34, 48, -51, -63, 51, -41, -64,
+    -11, -10, -32, 28, 33, -58, -75, 57, 49, 13, 70, -3, 37, -94, 81, -52,
+    32, -32, 28, 70, 87, 75, -65, -67, -14, -80, -67, -80, 92, -20, -66, 27,
+    18, 67, 99, 62, -50, -76, -78, -48, 89, -68, 58, 1, 1, 74, 90, 99, -70,
+    -43, 49, -99, -86, -37, 81, 95, 98, 59, -80, 34, -38, -75, 99, 42, -10,
+    40, 84, -63, 48, -37, 86, 87, 69, -27, 32, -61, 5, -3, 18, -33, 97, 31,
+    74, 97, 78, -29, -92, -75, -50, -28, 92, -12, -43, 38, 1, 50, 86, 94,
+    -32, 27, 3, 65, -5, 33, 17, 29, -42, -45, 76, -74, -32, 54, 18, 90, -20,
+    51, -71, 6, -26, 36, -76, 98, -100, 11, 48, -23, -78, -64, 38, 37, 53,
+    77, -57, -83, 13, -27, -14, 2, 74, -94, 35, -27, 13, 46, -37, -13, 79,
+    24, 38, 18, 64, 2, -69, -23, 87, -70, -72, 74, 20, -20, -71, -21, 18,
+    -30, -8, 9, 22, 4, 51, -45, 48, -16, 61, 68, -25, 15, -35, 74, -16, -3,
+    13, 28, 30, -57, 97, 2, -71, 18, 2, -45, 41, 26, 52, 30, -16, -71, 29,
+    54, -45, -58, -10, 25, 91, -44, -50, -1, 80, -46, 11, 16, -35, -17, 0,
+    25, -81, 21, -39, 16, -86, 4, -69, -81, -32, 96, -10, 88, 21, -8, -35,
+    -25, -20, -58, 25, -9, -62, 37, -27, 63, -85, -3, 11, -31, 46, -29, 71,
+    88, 86, 97, 47, -32, 30, 22, -48, 97, -92, 26, 87, -16, -88, -92, 1, -2,
+    -17, -25, 56, -86, -18, -37, 24, -38, -36, -46, -5, 73, 82, -35, -96, 90,
+    -11, 46, -69, 43, 26, -49, 86,
+  98, -67, 61, -9, -61, 15, 27, -25, -80, -73, -21, 43, -40, 31, -69, -62,
+    -63, 3, 19, 0, 64, 29, -80, -87, -37, 94, 61, 41, -14, -63, 99, -5, 40,
+    79, -54, -84, 35, -16, -35, -86, -2, -13, -51, -3, -66, 20, 47, 13, -28,
+    -60, 73, 89, 39, 68, 55, 85, 21, 16, -37, 43, 19, 96, 30, -5, 9, 90, -90,
+    -24, 74, -33, -58, -95, -34, -80, 79, -67, -97, 96, -87, 68, -79, -33,
+    -60, -48, -28, -51, 59, 70, -68, 93, 94, 87, 84, -74, 6, 93, -28, -69,
+    -14, 63, -92, 97, -57, 59, -39, -76, -38, 80, -48, -20, -57, -84, 14, 95,
+    2, -19, 80, 50, 2, -50, 6, -36, 92, 84, 99, 39, 33, 7, 36, 38, -82, 87,
+    -84, 19, -4, -32, 58, -41, 25, -56, -14, -88, -81, -59, -98, 26, 18, 28,
+    -24, 96, -54, -43, 44, -35, -64, -56, 60, 70, -49, 10, 56, 70, -95, 37,
+    -20, 22, 28, 4, 4, 89, 2, 28, 88, 66, 12, -36, 60, -66, -90, -45, 93,
+    -62, -25, 7, -36, -42, 6, -13, -12, 61, 13, -93, 60, 32, 25, 37, -43,
+    -26, -31, -35, 78, 94, -21, -95, 64, -91, -54, 98, -97, 94, 85, 12, -35,
+    64, 68, 10, -4, -50, 95, -82, -5, -90, 60, 39, -35, -14, 84, -96, -90,
+    -66, 90, 19, 75, -22, -60, -70, 28, -93, 57, -34, -36, -70, 26, -27, -30,
+    -30, 18, -61, -17, 16, -65, 40, -98, -26, -93, 21, -60, -76, -36, 5, 96,
+    30, -90, 41, 85, -9, -13, 87, 96, 5, 75, 18, 38, 21, 82, -58, -96, -34,
+    -60, -22, -20, -13, -28, 79, -85, 56, 67, -4, -69, -43, 29, -24, 54, -70,
+    -6, -74, -82, -57, 66, -79, 88, 74, -44, 0, -97, -19, -90, -30, -66, -44,
+    68, 60, -79, 49, -23, -38, 21, 90, -36, 37, -87, -76, 28, 74, 20, 9, 89,
+    -100, 63, 97, -95, 23, 76,
+  34, -47, 27, -58, -91, 82, 37, 53, 21, -99, 23, -11, -75, 70, 26, -93, -82,
+    -62, 83, 78, -60, 65, -17, 12, 57, -1, -75, 34, -15, 90, -24, -78, 68,
+    -29, -4, 39, -61, 44, -35, 17, 27, -12, -10, 85, -46, -23, -10, -80, -40,
+    -22, 96, 54, -71, -73, 17, 32, -27, 20, 2, -28, 29, 59, 41, 86, 4, -37,
+    -29, -87, 15, 14, -15, 46, 62, 85, 39, 65, 25, 87, -42, -30, -64, 11, 33,
+    50, 47, -1, -25, -42, -37, 29, -53, -95, 81, 22, -90, 55, -12, 36, 70,
+    -1, -36, -96, -100, -3, -72, 17, -74, -56, -69, -60, 73, -79, 36, 6, 43,
+    -44, 45, -37, 61, -38, 63, 83, -51, 19, -37, 77, 42, -21, -19, -96, -96,
+    -32, -3, -76, -78, 73, 71, -53, -11, -34, -54, -10, -79, -28, -65, -57,
+    -41, -20, 78, 66, -23, -49, -13, -74, -8, -68, -65, 59, -14, 94, 35, -20,
+    52, 60, -69, -16, 50, 40, 47, -44, 45, -90, 39, 0, 48, 97, -68, -80, -50,
+    17, -36, 47, -35, 19, 64, 48, -19, -49, -89, 46, 54, -75, -25, 57, -17,
+    35, -44, -8, 90, -54, -29, 65, -95, -29, -42, 20, -49, -51, -29, 56, 52,
+    89, 36, 89, 17, -71, 66, 10, -27, -59, 64, 23, 76, 40, -27, -73, 49, 93,
+    13, -27, -45, 88, -34, 62, -85, 89, -17, -60, 78, 39, -16, 57, 47, 11,
+    -55, -81, 8, 51, -82, 61, 10, -48, -85, -38, -28, -75, -33, 39, -69, -51,
+    -57, -56, 66, -33, 58, 87, 6, 45, 28, 72, 98, 56, 10, 56, -29, -81, 66,
+    25, 15, 56, 27, -76, -66, -31, -29, 69, -73, 18, -99, 64, 55, 19, -55,
+    44, 4, 18, 32, 57, -5, 64, 85, 82, -98, -89, 47, -10, -67, -62, -45, -19,
+    -3, -89, -26, 9, 54, 85, 86, -86, -89, 25, -38, -33, -2, -93, 25, -34,
+    85, 99, -15, -9, 80, 69, -13,
+  -41, 88, 15, -42, -7, -7, -37, -25, 68, -55, 29, -35, 51, -56, 96, 27, -4,
+    54, 12, 40, 13, -64, -58, 49, -71, -9, -35, -92, -62, -62, -63, 78, -38,
+    -75, 16, -38, 93, -44, 0, -31, 78, 80, -2, -29, -96, 27, -30, 40, -6,
+    -64, 31, -76, -98, 76, 75, 76, 23, 42, -60, -63, -21, 63, -98, -96, 43,
+    45, 91, -78, 83, 1, -97, 54, -30, -26, -35, 12, 25, 0, 18, 91, 39, 6,
+    -100, -82, -50, -27, -92, -74, -92, -91, -37, -90, 43, 52, 5, -54, -72,
+    73, 29, -91, -68, -51, 75, -72, 33, 68, -72, -47, -69, 39, 32, 55, 49,
+    -76, -3, -100, 88, 7, -35, 72, -82, 5, -97, -19, 3, -90, -10, 72, -17,
+    87, 24, 9, -75, 20, 4, 44, -4, 3, 47, -72, 14, -45, -100, -74, 51, 17,
+    28, -41, -11, -41, -36, 37, -97, -56, 45, -64, -35, 40, -45, 76, -52,
+    -19, 48, -38, -31, -54, 15, 8, 5, 91, 80, -38, 8, 17, -17, 74, 7, -46,
+    -30, -35, -10, -34, 85, 1, -58, -62, 73, -11, 26, -3, -49, -49, -55, -8,
+    31, 86, 86, 32, -72, 36, -52, -44, 12, -50, 87, -13, 20, 57, 98, 63, 9,
+    -36, -12, -87, -2, -41, -53, -56, -28, 6, -88, -16, 98, 74, 77, -23, 36,
+    71, 47, 57, -64, 32, 89, 3, -63, 34, 81, 84, 35, -15, -30, -30, -84, -24,
+    -97, -82, -66, -93, -64, 72, 96, -46, -17, 53, 92, 99, 92, 35, -31, -65,
+    26, 33, 75, -12, -26, -91, -69, 18, -4, 27, -54, 81, -61, -57, 58, 15,
+    -19, -7, -5, -87, -63, 43, 34, -64, 15, -1, 2, -74, -39, 2, 91, -40, -55,
+    -44, 65, 50, 2, -27, -65, -18, -92, 38, -27, -15, -16, -83, 97, 65, 38,
+    -80, 45, -35, -81, 28, 10, -92, 69, 95, -50, 92, -29, -51, -40, 94, -38,
+    -4, -65, 16, 61, -91, 83, 8, 16,
+  -60, -100, -91, 81, -59, 98, -91, -53, -72, -14, -22, 83, 48, 83, -52, 12,
+    99, -60, 96, 46, -7, 9, 72, -25, 94, 2, -48, -86, 48, 86, 80, -31, -22,
+    -26, 75, -53, 45, -49, 92, -70, 1, -21, 92, 87, 95, -33, 17, -68, -39,
+    84, 83, -45, -17, -19, -2, -38, 24, 55, 8, 71, 86, -46, -36, 91, 46, -9,
+    89, -32, -31, -54, -14, -56, 28, -50, 9, -2, -13, 44, -52, 66, 40, -72,
+    69, -74, 89, 83, -84, -41, 91, -91, 79, -17, 8, -22, 19, 12, 74, -39, 23,
+    18, -83, -99, -56, 61, 52, -21, 33, 81, 27, 60, 10, -67, -51, 70, 61,
+    -76, 77, 9, 50, -81, 18, -44, -28, -9, 44, 93, 73, -92, -42, -20, 11, 55,
+    71, -6, -52, 0, -71, -96, -97, -80, -32, -24, 5, 83, -63, -2, -88, 80,
+    76, 77, -49, -86, -86, 48, 34, -42, -58, -54, 11, 91, 20, 43, -54, 27,
+    -12, -89, -85, -100, -78, -37, -24, -34, 45, 7, 96, 33, 42, 21, -86, -99,
+    26, 19, -17, 79, 60, 6, -53, -53, 8, 96, -35, -11, -32, 93, -71, -11, 87,
+    8, 91, 19, 6, -50, -70, -92, -52, 40, 47, 32, 58, 57, 66, 54, -16, 86,
+    68, -8, 85, 98, 42, -8, -17, 44, -5, 5, 31, 13, -72, 86, 86, 78, -18, 59,
+    9, -84, -83, -75, -23, 96, 14, -8, -6, 63, 87, -93, 24, -90, -65, -93,
+    19, -94, -1, -76, 63, -41, -94, 34, -49, -69, 22, 53, -68, 8, -70, -71,
+    -15, -56, -1, -35, 56, -57, -21, -96, -44, -12, 9, 24, 26, -17, -21, 6,
+    -56, -3, -72, 18, 35, 4, -4, 53, 2, -33, -49, 0, 76, 42, -46, 10, 77, 89,
+    18, 23, 76, -64, 91, 50, -78, -35, 22, -27, -84, -92, 36, -61, 98, 40,
+    -3, -35, 29, 49, 63, -1, -63, 92, 77, 98, 96, -37, 0, -38, -6, -55, -45,
+    60, 71,
+  -78, -77, -42, -60, 77, -97, -70, 51, 67, 5, -79, 9, 3, 46, 6, 71, -28, 34,
+    -45, -66, 57, 27, -21, 7, 58, -76, -20, 40, -75, -14, 20, -51, 49, 55,
+    -31, 79, -7, -17, 71, -81, 98, -3, 96, 80, -29, -15, -87, -71, 91, 31,
+    -33, 19, 67, -18, -18, -27, 34, -94, 68, -33, 29, -68, -58, 7, -31, 1,
+    63, -2, 58, -100, 91, -82, -48, -75, 96, 67, -47, -87, 79, 45, -34, 53,
+    74, 34, 40, -95, 99, 46, -88, 87, 75, 54, 55, 95, -89, -21, 52, -12, 34,
+    -18, -64, -40, -26, 18, -20, 34, -25, -53, 76, -46, -80, -28, 3, 98, 98,
+    -12, -71, 5, 36, 5, -35, -81, 23, -76, -75, -42, -45, 69, 34, -75, 93, 2,
+    -89, -15, 91, 43, 9, -18, 39, 64, 22, 64, 62, -9, -38, -24, -5, -16, -82,
+    3, -49, 40, -7, 97, -74, 85, 98, 5, -10, -23, -97, -27, -78, 75, 62, 57,
+    -81, -35, -22, -58, 31, 68, -47, -88, 78, 69, -4, -28, -40, 91, 3, 86,
+    -30, -7, -83, -54, -84, 85, 74, 59, 68, -22, 70, -77, 83, -1, 21, -14,
+    -57, 84, -67, 87, -16, 58, -13, 7, -100, -74, -95, 28, -67, 15, 22, 83,
+    82, 44, 44, -68, 49, -82, -71, 57, 1, 13, -87, 74, 70, 82, 11, -71, 7,
+    -52, -23, -80, -75, -24, -77, -94, 98, 40, -18, 19, 4, 30, 69, -56, 82,
+    71, 85, 81, 24, -23, 21, -44, 84, -74, 13, -19, 9, -44, -14, 78, -10,
+    -27, 15, 36, 96, 17, -69, 3, -74, 27, -38, 34, -42, -44, -93, 93, 81, 48,
+    96, -30, 54, 14, 99, -40, 21, -77, -79, -81, -94, 13, 51, -67, 67, -78,
+    20, 55, 96, -21, 65, 70, 22, -92, -74, 0, -70, 47, -55, -51, 89, -96, 34,
+    49, 73, -56, -96, -4, -24, 30, -9, -98, 64, -80, -63, -67, -62, -40, -30,
+    -92, -11, 51, -13,
+  8, -54, 78, 91, 90, -15, -52, -23, 92, -75, -53, -94, 73, 55, 3, 28, -35,
+    97, -71, -60, -68, -2, 6, 52, 39, -90, 12, -50, -67, -62, 43, -14, -24,
+    61, -64, 96, -47, 4, 89, -81, 8, 86, 37, -99, -65, 73, -18, -81, -89,
+    -62, -32, -88, 1, -97, 63, -100, -20, 8, -8, 65, 38, -96, 19, -60, -89,
+    26, -8, -38, -25, -65, -33, 61, 83, 58, 66, -82, 18, 88, -61, 84, 90, 81,
+    -39, -79, 95, 87, 67, 13, 13, 32, 20, 66, -94, 64, 36, 9, -11, 43, -93,
+    58, 78, -81, -21, 63, -71, 67, -49, -23, 88, -41, -52, -84, -34, 97, 51,
+    69, 11, 25, 68, -19, 24, 45, 23, 3, -66, -65, 30, 94, 21, 21, -74, -87,
+    82, 16, -34, -3, -63, 66, 23, 87, -40, 85, 75, 39, -7, -51, 93, 72, 3,
+    -46, -57, 40, -14, 27, -59, -27, 14, -41, -40, -66, -62, -53, 72, -25,
+    -19, -98, 69, 96, -85, 50, -93, 38, 77, -50, 81, -85, 26, -48, 31, -83,
+    90, 75, -42, 39, 49, 17, 29, 66, -87, 95, 22, -15, 86, 12, -71, 82, -79,
+    86, -28, -90, -11, 60, -22, -93, -19, 50, 94, -6, 89, 78, -79, 96, -17,
+    -21, -27, 30, 88, 56, -100, 8, 17, -50, 23, -1, -86, -5, 69, -3, -46, 89,
+    -23, -29, -98, 49, -36, -100, -88, 65, -77, -96, -13, -67, -70, -51, 31,
+    87, -99, -84, -66, 29, -48, -76, -97, -83, -26, 40, -63, -61, -23, -53,
+    90, 80, 78, -36, -55, 70, -63, 38, -14, 62, -58, -61, 1, 81, -40, -9,
+    -31, 33, 95, 8, 82, -3, 36, -21, 80, -25, 73, 80, 21, -80, 28, 46, 41,
+    -13, -30, 21, -18, 45, -5, -73, -72, 24, -42, 11, -86, 92, 98, -65, 70,
+    75, -85, 96, 3, 3, -11, -49, -99, -23, 78, -79, -13, 19, 7, -8, 23, -60,
+    -90, 75, -5, -52, 24, 16, 41,
+  76, 75, -99, 37, -21, -72, -38, -29, 19, 90, 8, -81, -44, -4, -97, -8, 79,
+    67, 73, -55, -79, -5, 85, 63, 95, -30, -19, -47, -57, 27, -84, 69, -26,
+    -40, -3, 88, -37, -78, 84, -38, 96, -5, 94, 3, -2, 59, 54, 87, -89, 93,
+    44, 86, 39, 58, -39, -79, -67, -39, -98, 36, -93, -10, -84, -91, -88,
+    -67, -7, -90, -79, 77, -15, 19, 57, 82, -20, 79, -94, 23, 76, -24, 30,
+    -59, 33, 70, -44, 51, 70, 72, -37, 54, -73, 13, -31, -3, -32, 94, -24,
+    11, -13, -4, 2, 63, -77, 63, 7, 58, 91, -35, 91, 29, -26, 93, -17, -49,
+    -23, 0, 97, 51, 93, -35, -29, -59, 77, -65, 56, 48, -45, -97, 65, -34, 4,
+    -40, 7, -84, -73, -92, 27, -87, 49, 30, -28, 66, 15, -55, 87, -49, -79,
+    50, -61, -10, -45, -98, 23, 14, -44, 5, 62, -70, 55, -10, -12, -11, -18,
+    -22, -76, 31, -34, -57, 55, 65, -95, 48, 74, -86, -15, -33, 49, -72, 44,
+    17, 55, 34, 23, 45, 53, 45, -56, 74, 38, 94, -21, -37, -34, -51, 87, -93,
+    8, -27, -91, 26, 23, -66, 7, 4, -56, -66, 35, 2, -85, 84, -56, -67, -69,
+    -34, -72, -85, 74, -15, 13, -31, -45, -6, -83, -72, -30, -100, -59, 58,
+    -38, 76, 91, 21, -51, -86, 20, -66, -47, -87, -29, 6, -76, -7, -7, -47,
+    6, -42, -100, 63, -86, -78, -42, 71, 17, -90, 67, -57, -14, -76, -49, 86,
+    -88, 16, 0, -41, -50, 47, -51, -37, -95, 19, 18, 63, 46, -73, -20, -69,
+    -19, -50, 79, 42, 80, 75, 45, -36, -54, 93, -94, 97, -100, -85, -94, -62,
+    -33, 17, 21, 82, 70, 14, -56, 88, -68, -32, -79, -10, -86, 90, 44, 16,
+    -79, -9, -66, -85, 74, -61, -5, -81, -4, 81, 57, -28, -47, 80, -99, -81,
+    -55, 68, 41, 32, -55, -6, 43, -45, 56,
+  -86, 23, 37, -16, -99, 66, -45, 36, 93, 64, 95, -71, -84, -43, -21, 6, -85,
+    -11, -29, -41, 17, -92, -94, -37, -80, -10, 79, -24, 93, -45, -88, 94,
+    37, 28, 52, 68, 31, 18, 18, 18, 67, -27, 81, 87, 80, -32, 42, -39, 9,
+    -14, 81, -6, -56, -91, -4, -11, -19, 84, 65, 65, 97, 91, 17, -53, -94,
+    -11, 69, 19, -90, -17, 77, 77, -86, 87, -59, 62, -51, 90, -87, 45, 12,
+    -72, -73, 41, -26, -80, 47, 80, 34, 3, -33, -54, -28, 5, 29, 36, -56, 7,
+    -72, -18, 98, -48, -11, 49, -16, -85, 46, 65, 0, -66, 88, 39, 38, 98, 5,
+    16, 85, 0, -97, 36, -45, -96, 28, -60, 9, 68, 42, 65, 13, 58, 77, -15,
+    21, 28, 7, 68, 55, 17, -82, -86, -38, 49, 56, 47, -31, 9, -17, -46, 7,
+    -11, 15, 86, -9, 60, -1, -73, 87, 76, 6, -70, -77, -85, -53, -48, -91,
+    -72, 21, 76, -9, -92, 15, -98, -48, 54, -53, 59, -1, -98, -88, -30, 24,
+    9, -25, -9, -66, 14, 53, -93, 94, 37, 74, -5, 65, -92, -91, 52, -72, -53,
+    81, 86, -54, 69, -56, -43, 66, 44, 8, -15, -49, -67, -51, 81, 55, -80,
+    14, 2, 17, -82, -5, 9, 52, -2, 63, -48, 13, 81, 61, -14, -66, -60, 10,
+    69, 50, 6, 58, 8, 8, -25, -46, 68, -34, 73, -58, 30, -30, 35, -100, 13,
+    2, -61, -74, 5, -94, 18, 23, 41, -9, 12, -41, -52, -11, -24, 82, -82, 6,
+    -56, 33, 43, 59, 25, -21, -63, 20, 75, -70, 90, 35, 75, 18, -3, -40, -20,
+    59, -26, -15, -51, 28, 68, -5, -94, 47, -55, -37, -98, -15, -16, -11,
+    -68, 61, 31, 18, 27, -62, -66, -29, -51, -64, -60, 38, -5, -94, 13, 49,
+    24, -21, 71, -84, -34, -63, -29, -50, 53, -9, 86, 83, -34, -53, -68, 7,
+    3, 39, -7, 7,
+  -46, -41, -53, -10, 19, 10, -82, -72, -92, 95, -27, 34, -28, -11, -45, 93,
+    -72, 97, 61, -49, -88, 31, -37, -95, 56, -9, -21, -33, -8, -38, 8, 14,
+    -85, 97, -94, -43, 86, -96, -97, 23, -42, -99, -21, 30, -66, -84, -25,
+    52, -94, -95, -67, -90, 53, -58, 10, -94, -44, -1, 60, 64, 31, -15, -70,
+    -93, 5, -4, -28, 0, -54, -44, -34, -80, 37, 55, 83, -10, -87, 94, 62,
+    -32, 32, -31, -58, -32, -13, 77, 0, 28, 5, -16, -1, 79, 43, 16, 99, -99,
+    45, 48, 78, 20, -93, 71, -60, -31, -42, -43, 36, 41, -10, -16, 3, 85,
+    -27, -38, 27, -26, 5, -37, 10, -58, 82, -10, -72, 36, 95, -84, -63, -80,
+    -6, -67, -78, 70, -46, -32, -48, 55, -96, 74, 74, 3, 43, -27, 94, -74,
+    13, -38, 92, 88, 59, -98, 11, -76, 25, -22, 54, -57, 42, -38, -58, -97,
+    -61, 47, -40, 26, -95, 32, 91, -1, 20, -75, -12, -41, -6, -35, 22, 42,
+    -48, -16, 47, -63, 75, 56, 98, 27, -79, -1, 67, -90, 12, 82, 40, 55, -12,
+    55, 51, -93, 89, -94, 17, 15, -63, 57, -83, -47, -57, -65, 37, 49, -15,
+    7, -12, -79, 63, -63, -95, 11, 57, 69, -76, -13, -89, -5, -14, -53, -78,
+    -93, -25, -80, 4, 79, 74, 75, 49, 24, 10, 4, 59, -35, 57, -92, -3, -76,
+    4, -43, 63, -62, 28, -45, -6, -42, 46, 81, -99, 32, -59, 85, 12, 8, -91,
+    -37, 69, 89, -72, -78, 73, -95, 11, -44, -23, 81, -78, -97, -32, 37, 60,
+    -62, -54, -43, -93, 77, 1, 15, -15, -15, -87, -4, -92, 60, 40, 10, 8,
+    -27, -8, -3, -57, 31, -23, 0, -50, -92, -23, 58, 31, 5, -58, 98, 69, -68,
+    22, -54, 85, -17, 2, 20, -22, 18, -46, 84, 76, 35, 8, -30, -24, 74, 82,
+    -38, -36, -79, 30, 6, 94, -33, 22,
+  -86, 28, -62, -53, -31, 5, -84, 86, -49, -25, 82, 6, -69, -21, -36, 46,
+    -50, 81, 5, -23, 16, 85, 85, 79, -99, 87, 29, 2, 61, 98, 58, -90, -21,
+    -82, 30, -26, -24, 78, 52, -56, -69, 76, -14, -75, 56, -96, -74, -81,
+    -16, -66, 73, -20, 89, -40, -10, 85, 46, -85, 81, 6, 19, 65, -12, -91,
+    10, -42, 54, -73, -64, -28, -90, 48, 82, -12, 92, 66, -41, 64, -71, -49,
+    43, -61, 37, 74, -13, -57, -100, 75, 65, 3, -9, -47, -56, -59, -22, 46,
+    -54, -65, -17, 66, 85, 38, -31, 94, -37, -21, 2, 5, -99, 35, 22, -95,
+    -79, -15, -73, -59, 61, -36, 69, -59, -10, -43, 15, -47, 3, -6, 9, 80,
+    17, 85, 27, -56, 16, 8, -87, -65, -36, 78, 84, 75, -10, -18, 5, -27, -14,
+    6, 19, -8, -62, -59, 10, -38, 15, 43, -67, -74, -42, 4, 73, 0, 33, 30,
+    -25, -44, -89, -47, 14, -100, 96, 74, -93, 69, -33, -85, 95, -28, -48,
+    -57, 28, 31, 81, 94, -17, -50, 80, -63, -12, -30, -31, -64, -67, 66, -3,
+    30, 75, -27, 24, -94, -28, -82, 54, 9, 35, -83, 39, -91, -76, -6, -77,
+    -48, -85, -67, 67, 89, 58, 51, -19, 67, 19, -27, -35, -31, -56, -91, 93,
+    -32, 0, -68, 58, 37, -100, 34, 70, -20, 45, -85, 8, -55, -8, 32, 13, 79,
+    32, -31, -75, 65, -6, -8, 12, 61, -75, -72, -2, -92, 3, 60, -94, -13, 93,
+    -4, -34, -58, -25, -44, -86, -94, 12, 0, -35, 14, 77, 79, -36, 19, -84,
+    -71, -18, 78, 0, 9, 62, 67, -9, 4, -33, -3, 23, -93, 30, -60, -82, 12,
+    34, -1, 61, 34, -6, -100, -89, 6, 36, -77, 88, -57, -43, 16, -19, 86, 70,
+    -49, -89, -76, -45, -46, -40, -51, 54, -10, -80, 20, -40, 26, 17, -34,
+    -93, -13, 6, 50, 75, -39, -93, 20, 36,
+  8, -51, -75, 29, 67, -55, -23, 30, -48, 31, -73, 93, 74, -62, 87, -94, 24,
+    58, -100, 61, 65, 89, -7, -44, 18, 19, 62, 80, -84, 39, 25, -76, 41, -98,
+    -69, 95, 26, -73, -94, -72, 72, 7, 34, 4, 84, -76, -23, -17, -93, 71,
+    -31, 37, -75, 12, 60, -51, 17, 50, 58, 63, -48, 61, -84, 50, -86, 11,
+    -26, 68, -2, -40, -93, -58, 75, -1, 27, 8, -65, -55, -51, 12, -92, -26,
+    94, -56, 48, -56, 80, -79, 6, 39, 72, 54, 46, 9, -96, -57, -33, 5, -92,
+    -1, 68, 16, -39, -16, 26, 22, -82, 27, -94, -24, -7, -44, 1, -72, -21,
+    38, 22, 27, -40, 11, 85, 12, -58, 28, 86, -80, 55, -68, 64, -64, 68, -69,
+    98, 69, -41, -66, -81, -85, 43, 5, -93, 3, 57, -69, 18, -60, -93, -95,
+    -73, 51, 17, 3, -69, 42, -14, 76, -85, 55, -78, -57, -68, 9, 46, 19, 42,
+    -95, -56, -51, -14, 19, -60, 2, -48, 99, -97, -74, 18, -89, -60, 2, -63,
+    -18, 91, 97, 94, 16, 9, -7, 11, 35, 91, 26, -17, -87, 43, -5, -25, -85,
+    46, -76, -4, -13, -59, -45, -11, 58, -88, -88, -27, 66, -71, 70, 32, 64,
+    -10, 11, 32, -46, 74, -54, 68, -50, 83, 56, 28, -91, 38, 37, 72, 47, 64,
+    25, -37, 66, -94, -44, 62, -79, -69, 0, 26, 1, 9, 38, 32, 62, -65, 72,
+    -3, 53, -60, -33, -98, 24, -70, 24, 97, -83, -94, -33, -36, -65, 95, -11,
+    -19, -98, -32, 46, 97, 18, 2, 37, 54, -48, 40, 52, 79, 35, 49, 46, -77,
+    45, 10, 26, -64, -56, -1, 36, 23, -76, -41, 15, -85, 95, -48, -19, -19,
+    -81, -82, 23, 13, 23, -3, -71, -44, -61, -75, -68, -18, 20, 70, -90, -95,
+    -19, 44, -52, 32, 8, 21, 70, 36, 99, 12, -12, -28, 81, -20, 24, -47, 72,
+    75, -12, 38,
+  -24, -26, 0, -30, -92, 39, 79, -54, 86, 84, 75, -11, -44, 64, 40, -87, -75,
+    10, -28, 96, 5, 14, -78, 17, -78, 59, -43, 99, 47, -82, -86, -60, -65,
+    -63, -50, -58, 15, -27, 92, 86, -92, 47, -60, -70, -25, -91, -15, 21,
+    -95, 58, 76, 42, 68, 80, 91, -52, -92, 21, 37, 41, 6, 87, 7, -74, 61, 4,
+    -36, -5, -47, 6, 32, 66, -21, 93, 59, -72, 41, -1, -6, -18, -35, -50,
+    -87, -93, -67, -30, 77, 56, -80, -78, -51, -4, -28, -66, -71, -37, 80,
+    -18, 6, 21, 86, -84, -21, 63, -7, 10, 13, -65, 59, -96, 84, 12, -87, -41,
+    68, 9, -30, -95, 60, 75, -70, -19, -89, -26, 22, 39, 63, 59, 69, -21, 56,
+    87, 94, -11, -33, 62, 90, -83, 91, 13, 57, -28, -12, -47, 64, 29, 4, -25,
+    -38, 93, -8, 25, 61, 85, -16, 98, -23, -11, -33, 18, -22, -59, 29, -97,
+    -17, 48, 97, 91, -8, 8, 38, -98, 26, 32, 88, -58, 73, -4, 59, 88, -57,
+    -10, 39, -65, -66, -82, 70, 1, -53, 1, -42, -4, -59, 37, -89, 38, 80,
+    -90, 57, 64, -48, -83, -91, 87, 6, 54, 96, -60, -50, -69, 53, 73, 86,
+    -29, -73, 77, 36, 59, -22, -13, 71, -67, 61, 38, 58, 6, -67, -26, 65,
+    -83, -39, -3, 80, 86, -57, -33, 82, -93, 49, 76, -89, -40, -23, -32, -40,
+    43, 6, -12, -55, 86, 34, -24, 31, 47, -92, 73, 68, 96, 41, -97, -17, 94,
+    89, -94, 18, -58, 17, 29, 56, -19, -61, -80, 66, -63, -47, -37, 80, 69,
+    -63, -9, -72, -30, 30, -65, 70, -47, 37, 33, -99, 68, -60, 41, -26, -8,
+    -67, 11, 71, 80, 89, -95, 25, 36, 54, -84, 30, 12, -70, -82, -60, 98, 15,
+    -57, 42, 95, -34, -52, 92, -7, -97, -84, 5, 46, -14, -75, -72, 66, -32,
+    43, 89, 23, -29, 95, 51,
+  23, 13, 78, 57, 46, 47, -14, 31, -49, -4, 1, 33, 97, 19, -12, 72, 99, 0,
+    61, 88, 95, -79, 46, 40, 6, -27, 56, -19, -74, -45, -8, 89, -76, -39,
+    -71, -50, -56, 67, -30, -3, -3, -82, 73, 49, 97, -56, 58, -39, -5, 87,
+    -35, -73, 79, -82, -96, 35, 26, 25, 99, -3, -82, 31, -98, 30, -86, 36,
+    -51, 59, -80, 24, 18, 64, 78, -52, 45, 17, 56, -57, -77, -5, -100, 27,
+    21, -35, -58, 24, -19, 10, -99, 30, 27, -48, 90, -33, -84, 48, -8, -64,
+    51, -55, -7, -70, 0, -96, 1, 30, -76, 65, 28, 9, -2, 17, 15, -3, -84, 15,
+    -68, 39, -27, 66, 50, -84, 31, -58, -3, 10, 29, 28, 39, 26, -34, -94,
+    -99, -93, 11, 52, -100, 28, -1, 5, -53, 73, -21, -49, -12, 17, -33, -99,
+    -52, -76, -90, 78, 5, -53, 75, 63, -59, -6, -84, -33, -81, 16, 93, -61,
+    -10, 82, 27, 7, 68, -69, 72, -71, 16, 61, 27, -54, 96, 91, 5, 99, -78,
+    -28, 72, -61, 47, 7, -75, 88, -11, -43, 72, -78, -82, -62, 40, -92, -37,
+    90, -39, -91, 72, -86, 26, -78, -71, 40, -1, 96, 31, -73, 58, -38, -25,
+    48, 46, 36, -48, -93, 63, 10, -25, -28, -67, 84, 79, 52, -72, 54, -81,
+    -97, -59, 87, -61, 8, -93, 55, 52, -70, -91, 83, 6, 69, 14, -87, 35, -92,
+    -50, -57, 1, -71, 87, 0, 78, -92, 1, -1, -3, 91, 46, 30, 36, -8, 37, 93,
+    82, 53, 20, -68, 41, 28, -44, 7, 61, 41, -58, -74, 96, 84, 83, 53, -95,
+    -38, 91, -88, 46, 34, -57, -11, 89, -60, 44, -61, 29, 20, 78, -79, 52,
+    32, 95, 14, 57, 81, -38, -86, -55, 24, 75, -88, 23, -69, -80, 10, -23, 7,
+    -38, 8, 89, -4, -79, 4, 57, 29, 1, 76, -27, -31, 2, 55, 59, -99, 90, -86, 21,
+  71, -31, -16, -23, 42, -98, 70, -75, 7, 7, -50, -21, -78, 40, -1, -56, 70,
+    43, -33, 67, -10, -22, -17, -62, 72, 82, -24, 41, 45, -41, 82, 51, -19,
+    -25, -68, -73, 78, -2, 71, -34, 31, -27, -7, -27, 55, -46, 64, -91, -9,
+    1, 36, 25, 8, 13, 13, -73, -7, 29, 21, -82, 73, -69, 48, -79, -79, -54,
+    -17, -22, -32, 38, 70, 87, 80, 91, -34, -43, -17, -56, -58, -27, 39, 16,
+    -58, -97, 53, 10, 6, 86, -41, 40, 79, -95, 82, 27, -37, 9, -47, 66, 72,
+    7, -14, -34, 31, 66, -55, 68, -10, 53, -78, 16, -11, 48, -32, -49, -46,
+    97, 35, 56, -52, 5, 51, 74, -34, -66, 31, -18, 79, 52, -8, -26, 29, -90,
+    -63, -53, 54, 51, 63, -100, -74, -23, -82, -1, -3, -71, -17, -86, 73, 34,
+    -7, 79, -61, -95, -17, -61, 70, -87, -15, -38, 4, 64, -19, 0, 89, 55, 10,
+    -23, 64, 69, -58, -5, -14, 84, -82, 2, 35, 41, 13, 19, 3, -20, -4, 50,
+    65, -32, -79, 88, -60, -27, -21, -49, -95, 31, 4, -53, 80, 21, 48, -69,
+    29, 86, -94, 36, 78, -61, -56, 51, 69, 82, 49, 75, -38, -26, -44, -35,
+    65, 5, -48, 20, 24, 9, 63, -99, -62, -7, 92, 51, 70, -65, 64, 93, -14,
+    -29, -9, -87, -12, -34, -77, 70, 54, 51, 26, -20, -60, -46, 30, -2, -98,
+    -88, -45, -85, 70, -50, -47, -9, 48, 9, 98, 64, -26, 96, 75, 57, 57, -6,
+    -89, -65, -38, -5, 17, -46, 68, 35, 99, -71, -69, 70, 92, -78, 58, -5,
+    89, -27, -11, 30, 28, 35, 77, -87, 97, 21, 52, -75, 58, 33, 54, -81, -44,
+    38, 9, 24, 20, -16, -72, -47, -87, -50, -87, -3, 42, 7, 11, 62, -67, 2,
+    83, -92, 57, -25, -31, 6, 22, -98, -47, -74, 11, 94, 72, -70, 11, 50,
+    -30, -46, 76,
+  -42, 4, 21, 94, -13, 30, 21, 7, -76, -70, -35, 73, -55, -65, 90, -84, 65,
+    54, -99, -78, -91, -56, 63, -78, -97, -56, 90, 43, -39, -51, -98, -56,
+    32, -84, 99, 95, -100, -9, -5, -24, 10, 97, -14, 63, 91, -73, -100, 59,
+    53, 6, 51, 71, 26, 52, 47, -96, 32, -30, -98, 92, -67, 45, -38, 29, -67,
+    79, -59, -61, 66, -27, 12, -32, -71, 18, -9, -61, -34, -1, 18, -23, -22,
+    7, -57, 12, -69, -14, -45, 56, -80, -77, -14, 37, -68, 40, -67, -45, -23,
+    23, 99, -31, -78, 47, -46, 21, 88, 41, -14, -57, 54, 47, -10, 49, 44,
+    -65, -40, 7, -61, -64, 35, 65, 88, 78, -98, 11, -85, -57, 60, -24, 92,
+    -8, -96, -84, -92, -8, -56, -66, -9, 36, -34, 96, 91, -33, 53, 23, -40,
+    -42, -19, -97, -77, 62, 89, 1, 93, -16, 40, 92, -34, 22, -33, 26, -2, 4,
+    -23, -5, 68, -33, 28, -96, -11, -66, 70, -35, -91, 19, -32, 93, -78, 80,
+    -5, 51, -75, 82, -89, -70, -25, -5, -14, 51, -50, 10, 19, -3, 18, 4, -43,
+    69, -56, 61, -48, -89, 71, 48, -47, -5, -84, 27, 4, -95, 3, -82, 32, -75,
+    38, -36, 89, -12, -39, -36, -8, 1, 41, 53, -63, 7, -65, 86, -1, 16, 16,
+    13, 4, -76, 8, 60, -14, 56, -88, 81, -63, 21, 67, 83, -10, -19, -18, 4,
+    20, -17, 80, -53, 44, -54, -2, -42, -28, -8, -42, 85, 89, 93, -3, 33,
+    -82, 79, 32, 22, 11, 75, 14, 29, 1, 45, 81, -54, 23, 72, -91, -73, 70,
+    -79, -22, -45, 48, -61, -45, -31, -86, -41, -100, 55, -54, 3, -4, 86, 7,
+    14, -28, -18, 69, -34, 90, -89, -33, -1, 10, 86, 99, 55, 98, 95, -56, 61,
+    -80, 20, 55, 13, -79, 31, 85, 67, -47, -36, 85, -89, 30, 35, -53, 57, 24,
+    6, 14, 67, -16,
+  -60, -55, -83, -48, 20, -65, 68, -16, 82, -4, -72, -62, -75, -85, 11, -69,
+    12, 76, 45, 51, -23, -52, 48, -83, -1, 9, -16, -34, 68, -50, 3, 87, -12,
+    -71, -73, -88, 4, -90, 77, -89, 82, 96, 28, -41, -33, 47, -32, 27, 39,
+    -28, 21, -97, -51, -11, -33, 79, -49, -94, -87, -19, -66, -62, 78, 73,
+    79, -45, 88, -48, 90, -14, 46, -1, -98, -15, -22, -4, 91, 26, -56, 78,
+    -96, 78, 71, -83, -17, 68, -35, -97, -98, 24, -28, -88, -51, 82, 35, 47,
+    38, -66, 53, -82, -34, -5, -53, 99, -28, 28, -63, -65, 7, -22, -60, -60,
+    -28, -98, 45, -46, -27, 38, -53, -2, 19, -96, -31, -27, -61, -58, -70,
+    -42, 91, 14, 40, -96, -54, 18, 63, -89, 91, -18, -27, -8, -80, -77, 46,
+    -13, -69, -93, -87, 93, -9, -94, -28, 33, 21, -53, 26, 57, -7, 90, -11,
+    25, 54, 17, 69, 81, 56, -82, 90, -84, -4, -91, -84, -83, -96, 84, -45,
+    94, -86, 26, 8, -88, -98, 83, -6, 28, 93, 99, -64, 19, -18, -97, 48, 9,
+    86, -71, -2, 77, 38, -92, -91, -63, 23, 1, -13, -70, 2, 25, 84, 39, 13,
+    47, -74, 49, 5, -23, 50, 1, -66, 29, -48, -23, -86, 87, -60, -19, -32,
+    -10, -81, 68, -94, -68, 40, -100, -62, 34, 45, 6, -73, 28, -86, -22, -30,
+    -48, -8, -24, 60, 98, -69, 1, -29, 99, 13, -59, -93, -24, -41, -80, -47,
+    50, 78, -36, 92, 88, -85, -58, 40, -23, -48, -66, -82, -86, 25, 58, -47,
+    58, 16, 1, 98, 27, 42, 65, -77, -73, -49, 92, 94, 31, -4, 49, -83, -31,
+    16, 3, 45, 15, -58, -52, 3, 79, 49, 89, 58, 46, 56, 66, 87, -85, -35,
+    -21, 30, -97, -37, -96, 99, -6, 73, 80, 74, -24, -27, 13, -27, -99, -90,
+    92, 22, -47, -39, 0, -50, -29, 0, -59, 69,
+  3, 86, -9, -67, 36, 69, 63, -31, 83, -100, -28, -3, -3, -29, 16, -92, -85,
+    61, -45, 64, 87, -49, -93, 4, -20, 4, -16, 96, 92, -9, -34, 11, -69, 75,
+    -20, 8, 55, 27, 15, 22, 53, -19, 25, -82, 92, 88, 18, 86, -58, 74, 99,
+    -39, 22, -1, 12, 37, 66, -61, 16, 58, -95, 91, 53, -39, -97, 20, -4, -26,
+    31, 53, -30, -87, 79, 19, 95, -75, 85, -61, -89, 85, 79, 10, 21, -87,
+    -91, 48, -28, 43, -32, -68, 58, -48, 61, 24, -51, 79, 70, 74, -91, 82,
+    -8, 21, -56, -14, 5, -22, -94, 89, 92, -11, 63, -1, 48, 27, 63, -58, -27,
+    1, -66, -77, -60, 58, -52, 49, -79, 98, -22, -29, -91, 68, 72, 30, 63,
+    -44, 34, 48, -70, -50, -35, 73, 16, 6, 16, -61, 66, -41, 44, -78, 92,
+    -95, 53, 96, -18, -22, 15, -62, 44, 89, 57, 5, 6, -60, -50, -16, -21, 94,
+    -40, -100, -94, -80, -74, -21, -100, -100, 97, -76, 18, 57, 50, 24, -52,
+    89, 68, -43, 93, 40, -73, 1, -3, -35, 50, -32, 85, -4, -45, 50, -37, 42,
+    80, 80, 78, -56, -89, 77, -58, 15, 85, 63, 98, -84, 80, 68, -61, 17, -17,
+    -7, -39, -8, -20, 12, 31, 41, 4, -88, -16, 73, 67, -25, 38, -5, -38, -69,
+    52, -64, 29, -85, 27, 93, -67, 38, 69, -5, -52, -81, 21, 37, 98, -53,
+    -27, 92, 7, 52, 9, 56, 42, 71, 76, 52, 82, 57, 2, -24, -55, -3, -85, 40,
+    64, 67, -28, -70, -63, 9, -49, 96, -62, 61, -83, -71, -31, -46, 82, 47,
+    -16, 5, -67, 12, -85, 0, 57, 0, 72, -52, -9, -94, 49, -83, -55, -53, -65,
+    38, 16, 77, -21, 27, 65, -89, -79, -76, -60, -20, 27, 9, 63, 97, -28, 3,
+    95, 0, -38, -71, 80, 32, -45, 79, 20, 72, 77, -86, -32, -15, -57, 24, 79,
+  -100, -18, 9, -54, 8, 40, 33, -85, -54, -8, 19, 92, -40, -36, 29, -3, 12,
+    54, -65, 62, 1, 6, -37, -63, 54, 10, -67, 48, -15, -80, -34, 90, 10, -21,
+    98, 32, 34, 94, 15, 87, -36, -1, 36, -46, 78, -25, -2, -9, 79, -18, -36,
+    7, 88, 49, -42, -52, 49, 45, 63, 9, -10, 99, -86, 97, 61, -10, 34, -87,
+    -50, -9, -66, 51, -21, -63, 53, -57, 79, 6, 54, -91, -3, -26, -95, -47,
+    -71, 14, 29, -56, 28, -21, 35, 40, -27, 48, -13, 69, -95, -51, -33, -42,
+    1, -38, 4, 14, 29, -27, 81, -11, -18, -21, 91, -59, 94, -97, -64, -5,
+    -60, -87, -65, -29, 30, -68, -91, 19, -19, 35, 25, 45, 14, 59, 76, 56,
+    -78, 86, -91, 27, -38, -72, 93, 56, 47, 40, -34, 45, 6, -84, -21, -71,
+    -9, 97, 24, -67, 67, -85, 66, -88, 32, -66, 8, 42, -50, -79, 40, -42,
+    -67, -58, -29, 32, -8, 90, 30, -28, 68, -97, 17, -50, 2, -26, 61, 92,
+    -25, -19, -62, 11, -3, -20, 13, -16, 46, 17, -84, 14, 15, -25, -97, -61,
+    4, 38, 73, -53, -40, 44, -41, 62, -54, 91, -38, -83, 26, -77, 68, 58,
+    -69, 43, -59, -89, -78, 11, 81, 59, -3, -49, 3, -9, 92, -91, -63, -42,
+    83, 38, 70, 62, 45, 20, 46, -27, 93, -76, -14, 70, 2, 72, 42, 15, 6, -92,
+    7, -28, -15, -52, -91, 13, 81, 13, -24, 66, -82, -13, 26, -54, 38, -57,
+    -8, 75, 10, 37, -36, -83, 93, -92, 91, 15, 36, -90, 92, -82, 9, -88, 55,
+    23, -92, -9, -2, 11, 61, 49, -96, -55, 11, 89, -49, 79, 3, 15, 13, 15,
+    96, 10, -33, -15, 91, 76, 99, -45, -31, 25, 5, -85, -31, -18, 87, -87,
+    -27, -63, -4, -17, 25, 22, -37, -85, -5, 37, -54, -3, 5, 0, -45, -85,
+    -51, 57, -85, 57, -45,
+  -96, 11, 49, 15, -52, 71, 58, 19, -77, 50, 46, 59, 42, 12, 68, 44, 69, 4,
+    31, -57, 33, -14, -73, 99, 14, 36, 35, 93, -45, 38, 12, 25, 90, 63, 2,
+    44, 82, -87, 98, -71, 85, 7, -39, 90, 53, -44, -95, 89, 78, -95, -51, 60,
+    68, -28, 23, -62, -77, -28, -16, -26, 63, -54, 30, -20, -2, -84, -87, 66,
+    27, 94, 80, 88, 21, -59, 82, -51, -19, 2, -87, -51, -92, -42, 55, -21,
+    93, -49, -22, 43, 20, -94, 47, 31, -91, -58, 57, -77, 18, 91, 79, 19, 84,
+    -14, 86, 45, -71, -14, -45, -55, 39, 18, 19, 24, 45, -7, -23, -97, -19,
+    98, -3, -65, -18, 89, -51, -81, 9, -71, -7, 19, 2, 56, -53, 90, -50, -52,
+    31, 23, 19, 8, 6, 98, -38, 93, -17, -36, -15, -46, 29, 87, 36, -11, -46,
+    -30, -18, 43, -33, 46, 40, 65, 47, 97, 17, -77, 14, 44, -95, -3, -20,
+    -15, 11, 42, 25, -13, -12, 91, 42, 59, 1, -92, -4, 31, 53, -33, 85, 8,
+    -92, -2, -52, -41, 98, 69, 62, 95, -61, 30, -71, 4, -76, -37, 89, -54,
+    -78, 85, 96, -66, -72, -2, 3, -42, -16, 46, -2, 52, 33, -6, 58, -59, -89,
+    -54, 39, -93, 42, 37, -91, 49, -19, -23, 65, -11, -6, 78, 2, -10, -68,
+    53, -91, 13, 10, 93, -45, -63, 51, 73, -81, -11, 28, 57, -7, -52, 49,
+    -39, 58, -16, 89, 31, -45, -69, -92, -25, 63, 61, 26, 15, 41, -80, -51,
+    69, 34, -47, 62, 15, -23, -37, -89, 49, -24, -92, 83, 55, 61, 20, -40, 7,
+    -78, -86, -53, 3, -50, -87, 21, -28, -79, -54, 68, 6, 37, -30, 81, -43,
+    75, 99, 69, 34, -84, 87, 72, -79, -40, 69, -52, -77, 51, -74, -55, 42,
+    -33, 27, -68, -53, -94, 57, 98, -78, -61, -56, 54, -5, -47, 93, 39, 78,
+    47, -27, 40,
+  34, 60, -72, -69, 41, -34, -35, 77, 84, 39, 16, 42, 88, -6, -94, -65, 74,
+    88, -59, 64, 72, 56, 30, 1, 33, 99, -44, 37, -62, 53, 2, 93, -58, 82, 9,
+    -21, -32, 76, -82, -67, 69, -75, -64, 91, -74, -41, -99, 0, -65, -25,
+    -16, 65, 89, 99, -65, -28, 8, -16, 80, -92, 98, 69, 71, 78, -62, 98, 32,
+    -41, 99, -20, -7, 50, 44, -19, -63, -48, 24, -10, 81, -71, -99, 19, -42,
+    -94, 90, 69, -57, 7, 17, 91, -7, 88, 21, 20, 84, 53, -3, -34, 51, -4, 68,
+    -37, 43, 81, 40, -4, 6, -83, -12, -57, 25, -17, 20, 90, 14, -78, 78, -87,
+    12, -88, -16, 37, 30, 54, -1, -29, -31, 53, -17, 47, -81, 82, -59, -17,
+    -85, -76, 30, -72, 36, -92, -94, -35, -3, -70, -39, -49, -50, 31, 4, -87,
+    -53, 73, 98, -4, -91, 99, -13, 12, 22, -53, 35, 84, 57, 32, -62, -51, 72,
+    -30, 91, -59, 4, -46, -97, 7, 19, -98, -78, -82, 81, -38, -76, 51, 86,
+    -63, -96, 96, -55, -32, -74, 47, 68, 91, 43, -96, -12, -59, -64, -67, 86,
+    78, -35, 93, -4, 18, 78, 80, 81, 30, 48, -3, -33, -92, 52, -41, -38, 40,
+    4, -2, -27, -42, -95, -83, 30, -55, 50, 9, -74, 77, -45, 95, -62, 68, -6,
+    46, -93, 64, -20, -96, 39, 61, -50, 38, -37, 48, 42, -83, 30, 48, 65, 73,
+    -36, 48, -67, 41, 69, -59, -75, 77, -95, -41, 66, 57, -7, 28, 97, 62,
+    -27, 48, -11, -87, -52, -60, 98, 8, 91, -49, 93, -77, 89, -55, 62, 9,
+    -16, 47, -93, -10, 27, 49, -28, 99, -97, -93, 16, 43, 54, -80, -51, 41,
+    9, 41, -56, 71, 8, -28, 49, 0, 18, -93, -46, 53, -90, -22, -18, -61, 57,
+    9, -8, 80, 75, 37, 36, 24, -93, 57, -15, 63, -54, 4, -85, -80, 5, 12, -19,
+  -5, 3, -16, 99, -11, 24, 30, 87, -84, -31, -39, 26, 4, -74, 16, 20, -65,
+    -43, -27, 94, 45, 26, 54, -16, 58, -43, 92, -69, -19, 99, -35, -95, 98,
+    6, 20, 74, 88, 2, 8, 55, 13, 17, 34, -95, -59, 75, 52, 92, 90, 6, 88, 94,
+    35, -49, -85, -17, -9, -27, -47, 44, -41, -17, -83, 19, -14, -87, -21,
+    -5, -37, -18, 90, 88, 70, -68, 33, 28, -84, 76, 4, 98, -49, 29, -11, -3,
+    -76, 72, -4, 37, -40, 43, -23, 7, -7, 68, -7, 24, 1, 98, 22, -80, 7, -92,
+    38, 22, 77, -42, -40, -53, 94, 50, -52, -82, -49, -89, -77, -67, -92, 28,
+    11, -93, 54, -90, 80, 32, -63, -66, -47, -2, -83, -44, -39, 71, 75, 76,
+    3, -47, 24, 6, -61, 42, -21, 75, 47, -87, -27, -33, 99, 94, -44, 76, -44,
+    13, 29, 69, 2, 74, 44, -63, -97, -64, -69, 48, -69, 74, -44, 74, -65,
+    -85, 26, -75, 27, -52, -6, 33, 82, 81, 42, -96, 36, -49, -93, 73, -33,
+    69, 17, -77, 48, 10, -32, -55, 85, 50, 7, -4, 89, -90, 40, -40, -78, 15,
+    -100, -54, -6, -33, -95, 8, 97, 53, 66, 60, 33, 13, -90, 20, 1, -22, 18,
+    64, -17, -33, 38, -38, 5, 30, 51, 76, 91, -71, -59, -19, -25, 34, -35,
+    -99, -83, -60, 85, -59, -87, 19, -57, 78, -52, -1, -57, -63, -89, -99,
+    -7, 78, -47, 54, 54, 30, 87, -45, -12, 6, 55, 78, 94, 69, -52, -43, -66,
+    -9, 72, -17, -54, 70, -11, 41, -52, -53, -3, -58, 95, 86, -93, -33, 30,
+    -97, 28, 70, -35, -2, -24, -39, -79, 18, -77, 15, 93, -36, -87, 90, 85,
+    85, -53, -80, 84, 99, 43, -31, -6, -88, 59, 86, 68, 45, -20, -51, 3, -28,
+    30, -26, 50, -31, 91, 25, 20, 86, 35, 74, 88, 8, -37, 58, -34, -93, -82,
+    -95, -68,
+  36, -59, 52, 43, 25, 52, 0, -21, -6, -6, -34, 56, -53, 39, -56, 54, -85,
+    -84, -54, 10, -75, 54, 74, -39, 73, -72, -20, -59, -80, 19, 16, -69, 1,
+    -83, 91, -98, -57, -81, 40, 41, -89, -27, 16, -22, 24, -17, 62, 27, -40,
+    82, -11, 69, 35, -8, -97, 14, 30, 16, -79, -71, 99, 42, 36, 22, 6, 52,
+    -6, 81, -15, -96, 21, 46, -17, 95, -19, -48, -95, 3, -57, 4, 65, 16, -2,
+    46, -99, -49, -40, 45, 63, -83, 53, 85, 18, -47, 37, 39, -11, 77, -79,
+    -40, 21, 35, 56, 11, 34, -11, 71, -54, -69, -84, 75, 92, -58, -4, 93,
+    -51, -100, -12, -5, -21, 24, 47, -70, 15, -72, -81, -20, -79, -66, 56,
+    -54, 92, 39, 66, -2, 47, -75, 56, 96, 29, 14, 73, -49, 57, -63, 32, 69,
+    65, -48, -3, 50, 88, 33, -61, -24, -81, -70, 45, 60, 77, 40, -73, -2, 96,
+    4, 92, 14, -51, 35, 41, 86, 24, 78, -59, 51, -4, -55, -59, 62, 43, 44,
+    52, 3, -17, -4, -88, 41, -87, -28, 85, -10, 10, -49, -66, 45, 80, 47,
+    -99, -40, 17, 42, 66, -93, 57, 25, 92, -61, -34, -32, -60, -76, 33, 43,
+    -61, 14, 99, 77, 14, -86, -98, 41, 72, -19, 30, 18, -48, 10, 27, 98, 8,
+    -3, 3, 59, -36, -94, 51, -2, 58, -6, 43, 55, -6, 65, 21, -54, 11, 82, 30,
+    -22, -75, -88, 55, -25, -60, 59, 99, 22, -25, 25, 73, -80, -21, 5, 96,
+    -1, 98, -86, 50, -10, -8, -9, -25, -39, 68, -41, 25, -16, -93, 13, -92,
+    -99, 5, -18, -86, -89, -25, 30, 4, 72, -62, -42, -20, 82, -79, -43, -5,
+    -100, 49, 54, 10, -27, -92, -83, -60, -4, 17, -14, -73, -3, -81, -85, 82,
+    -42, -76, -96, -100, 6, 74, 59, 33, 24, -36, 19, 88, 87, 84, 42, -13,
+    -57, 87, 3, 46, -93,
+  -66, -94, -56, -53, 31, 2, 63, -32, 94, 76, 90, 32, -72, -91, -7, -39, -8,
+    76, 24, 33, 33, 1, -4, 33, 61, -2, 85, -56, 49, 78, -58, -32, -37, 39,
+    -32, 58, -93, -82, 72, 45, 11, 35, -86, -28, -29, 54, -83, -95, 33, -100,
+    -71, -40, -72, -36, 65, 78, -46, -4, -15, -89, 27, 14, 33, 20, -26, 43,
+    31, 32, 8, -27, 75, 68, -1, 79, 28, 90, 2, 88, 52, 15, 12, 67, -80, -29,
+    25, 9, -33, -70, -99, -4, 20, 54, 14, 5, -58, -6, 51, 40, -1, -43, -11,
+    71, 22, -31, 12, -83, 66, -34, -26, -35, -75, 15, 24, 19, -3, 3, -3, 58,
+    42, -10, -57, 82, 60, -46, 81, -44, -36, -21, 57, -20, 82, -38, 15, 87,
+    83, 53, -7, -16, 75, -60, 47, 91, 94, -57, 87, -36, -96, -89, 10, 60,
+    -36, 86, 85, 1, -35, 63, -27, 93, 81, 91, -30, 92, 75, 64, -29, 57, -74,
+    16, -25, 86, -82, 56, 26, -97, -9, -87, -33, 0, -2, 0, -95, 94, -17,
+    -100, 56, -18, -47, -96, 91, -69, -60, 66, 42, -76, 95, 80, -3, 24, -61,
+    -9, -19, -42, 29, 52, -1, -10, -55, 4, -9, 29, -50, -21, 26, -85, -48,
+    71, 51, -30, -62, 65, -41, 89, 20, -27, -92, -73, 90, -67, 20, -46, 42,
+    31, -95, -43, -12, 21, -35, -34, 20, -5, -35, 33, -7, -42, 56, 19, -38,
+    19, 68, -54, -46, 30, -52, 68, 7, -17, -46, 11, 40, -93, 4, -18, -73,
+    -48, 71, -2, 86, 1, 38, -49, -86, 22, 67, -91, 45, 79, 49, -95, -33, 0,
+    -1, -80, -71, -89, 12, -3, -24, -54, 92, -58, 55, -95, 85, 85, 86, -94,
+    -92, 4, 73, -95, -85, 72, 56, 70, -77, 93, 93, -58, 66, 47, -45, 77, -83,
+    -50, -73, -59, -68, -84, 4, -62, -81, 71, -85, 52, 3, 54, -56, 34, 25,
+    75, -57, 79, -82,
+  4, -70, 44, 71, -22, -56, -9, 87, 39, -66, -25, -29, -41, 79, -18, 29, 41,
+    80, -78, 9, -90, 37, -66, 55, 40, -45, 65, 84, 52, -90, -95, -91, 79,
+    -51, 23, 63, 57, 96, -90, -56, 12, 22, -65, 4, -89, -30, -72, -80, 77,
+    54, 7, 67, 30, -31, 69, 59, -33, 29, -14, -8, -93, -67, -95, -59, -51,
+    35, 76, -15, -60, -24, 2, 47, -40, -1, 71, -34, 99, 48, -79, 37, 19, -64,
+    -58, -8, -39, -21, -78, 85, 56, 1, -91, -29, -77, 3, -11, -97, -58, -29,
+    78, 36, 72, -3, -35, -33, 32, 79, -36, 45, 63, 16, 45, -91, 67, 87, -48,
+    -68, 22, 27, -18, 67, -27, 67, -24, 13, 56, 29, 84, 14, -67, 3, 36, 6,
+    -44, 93, 47, 6, 58, -94, -35, -38, 35, -43, 67, 1, -18, 55, -26, 62, -43,
+    -11, -13, 91, -26, 2, 77, -3, -54, -44, -47, 28, -23, 13, -62, 8, 75,
+    -54, 17, 74, 24, 65, 9, -81, 85, -6, -99, 64, -88, -7, -5, 78, 43, -63,
+    -76, 36, 91, 62, 24, 98, 1, 30, -64, 65, 64, 19, -88, 63, -61, 12, -94,
+    46, -49, 89, 18, 98, -94, -56, 46, 8, -47, 44, -97, -96, 69, 88, -65, -3,
+    -90, -63, -22, 83, 14, -96, 11, 68, -33, 62, 44, -61, 82, -99, -47, 5,
+    -95, 82, 68, 9, -59, -71, -30, 70, -16, 71, 76, -100, 52, 62, -34, -8,
+    31, 1, -75, -100, -60, 89, 70, -30, -29, 14, 2, -38, -43, 73, -6, 73, 13,
+    -72, 35, -92, 56, 32, -33, -85, -14, -65, -11, -7, 30, 32, 80, -19, 14,
+    -75, 40, 17, -38, 7, -78, 26, 61, 89, 74, 43, 80, 71, -50, -10, 75, -94,
+    49, -12, -26, 64, -33, 11, 8, -38, -28, 41, -88, -35, 51, -57, 61, 61,
+    47, -87, -2, -36, 12, 65, -30, -17, 23, -49, -35, 5, -92, 2, 23, 72, 47,
+    82, 4,
+  -8, -90, -16, 71, -74, -12, 98, -89, 69, 58, -98, 52, -13, -17, -53, 63,
+    98, 82, -90, -17, 71, -85, -92, 91, 46, 40, -22, 3, -63, 66, -33, 18, 29,
+    11, -71, 92, -69, -93, 72, 97, -72, -71, 99, 25, -38, -88, -75, 46, 63,
+    87, -67, -94, -92, 94, 29, 76, 2, 60, -11, 60, -1, 31, -79, -86, -26, 66,
+    96, 11, 41, 38, 11, 97, 29, 85, -24, 95, -52, 29, 96, 3, -89, 88, -86,
+    -79, 58, 88, 86, 63, 37, -33, 46, -87, -97, 49, 10, -62, 48, -76, 64,
+    -80, 78, 63, -38, -22, -3, 28, -75, -2, -72, 71, -90, -22, 23, 64, -100,
+    -53, -8, -34, 41, 21, 22, 17, -62, -84, 75, 56, 36, 23, -22, 73, 94, 62,
+    -3, -10, -89, 93, 71, -44, 47, 84, 35, 48, -40, -88, -37, -48, 3, 61,
+    -55, 86, -28, -63, 58, -97, 27, 61, -81, 94, 18, -6, 94, -49, -45, -82,
+    -75, 48, -77, -8, -7, 87, -43, 62, -23, 47, 72, 16, -96, -58, 71, 13, 79,
+    39, 37, 82, 72, -50, 24, 83, -42, 53, 81, -95, 95, -33, 72, 58, 42, 98,
+    -22, 1, 45, 65, 67, 26, 64, -10, 92, 77, -49, 11, 98, 57, 53, 88, 92,
+    -13, 12, 55, 8, -55, -8, 31, 44, -77, 38, 1, 91, -39, -37, 7, 19, 16, 25,
+    -52, 77, -2, -81, -83, 94, 79, 20, 46, -3, 61, 6, -47, 89, -69, -71, 48,
+    -64, -35, 40, -93, -99, -85, 36, -84, -96, 79, 15, 65, 9, -77, 52, 30,
+    99, 29, -20, -38, -48, -9, 73, -95, 14, -24, 56, 53, 29, -15, -5, 1, 82,
+    53, -21, -65, 5, -39, -50, 66, 31, -68, -45, 43, -66, -37, 83, 92, -41,
+    83, -2, 54, -47, -5, -36, 65, -15, 96, -82, -27, -62, -82, 74, 92, 88,
+    89, 39, 17, 38, -92, 99, -80, 18, -37, 48, -73, 9, -76, 85, 20, -64, -74, 5,
+  -61, -2, 25, -96, 61, 34, -83, 4, 95, -7, -78, -60, -21, -58, -1, -4, -100,
+    -85, -81, 14, -42, 58, -80, -61, 21, -15, 66, 71, 2, 8, -52, 99, 16, 6,
+    -1, -90, -50, 28, 83, -1, -38, 67, -58, -100, 73, -95, -25, -72, 16, -44,
+    73, 72, -19, -80, 47, 45, 1, -78, -10, 72, -85, 60, -15, -55, 41, -100,
+    70, 81, 97, -71, -41, -97, 84, -64, -89, -39, 90, -59, -29, 17, 55, -87,
+    69, -65, 95, -99, 15, -23, -56, -14, 17, -26, -18, 16, -22, -11, -40, 84,
+    -73, -50, -44, 81, -66, 63, 88, 14, -36, -51, -14, 42, 53, 74, -98, 29,
+    -29, 77, -7, 35, 11, 1, -3, -2, 37, 48, 37, -99, -6, 28, 27, -94, 59,
+    -40, -50, 61, -45, -43, 46, -56, -63, 58, 10, -87, -19, -25, -51, 55,
+    -28, 50, 26, 38, 23, -83, 20, -60, 65, -47, 85, -24, 89, -93, -49, -27,
+    61, 80, -9, 29, -36, 89, -68, -90, 46, 95, -66, 70, -93, 44, -99, -94,
+    19, -59, 13, -50, -16, 22, -43, -31, 81, -43, 7, 25, 24, 11, -81, -91,
+    -89, -96, 72, -76, 9, -69, -98, -51, -30, -16, 61, 72, 5, 50, -84, -30,
+    97, -73, 35, 27, -54, -14, 65, 20, -39, -47, 5, -35, -21, -60, -80, 35,
+    99, -54, 70, -40, 60, -13, -78, -75, -19, 80, 73, -4, 22, 7, -98, -81, 9,
+    44, -91, -67, -11, 86, 1, 6, -7, 23, 91, -82, -68, 98, 1, 21, 6, 40, -79,
+    -11, -45, -94, 21, -72, 71, 0, -70, 9, -77, -8, -93, -42, -74, -95, -25,
+    -51, -79, -79, -94, -60, 13, 83, -86, -4, -93, -4, 64, -1, 23, -63, -49,
+    46, 94, -77, 50, -18, 36, 90, 63, -48, -8, -86, -96, -13, -84, 48, 93,
+    66, -1, 1, 45, 5, 73, -57, -12, -43, -43, 24, 11, -34, -65, -1, -46, -92,
+    -6, 81, -90, 55, 30, 42, -32,
+  29, -91, 82, 85, 50, -68, 35, 57, -2, 55, -39, -32, 18, 89, 69, -78, 7, 20,
+    -77, -5, 42, 28, -17, -90, -53, 16, 43, -7, 53, 81, 10, -66, -36, 25,
+    -79, 9, -13, 85, 60, -83, 59, -37, -56, -54, -79, -3, 15, -8, 86, -36, 3,
+    2, 14, -88, -41, -31, -12, -69, -32, 73, -19, -61, 36, -77, -71, 25, 10,
+    17, 65, 21, 48, 6, 41, -78, -12, 35, -36, 13, -26, -29, 7, -97, 85, -70,
+    -90, 22, -79, -3, -7, -80, -21, -24, -77, -26, 97, 62, -83, 5, -100, 98,
+    -63, -41, 5, 96, -73, 96, -96, 87, -14, 86, -58, -14, -95, 54, -63, -3,
+    -88, -78, 35, 7, 13, 70, -74, 82, 82, 6, 11, 55, 23, -13, 81, -39, -8,
+    -42, -9, -87, -67, -39, 44, 29, -66, 57, 12, 47, 10, 9, -35, 92, -15,
+    -24, -53, -99, 5, 87, 86, -40, 91, -70, -26, 10, -83, 12, -87, 29, 36,
+    36, -89, 55, -77, -2, -17, 95, 63, -60, -21, 93, -43, -8, -73, -51, 66,
+    -80, -5, -30, -2, -47, -80, 35, 98, -40, -96, -54, 88, -70, -79, 1, -11,
+    -63, -77, 49, 52, 19, -16, -89, -10, 43, 64, -58, 60, -94, -72, -92, -61,
+    -10, -18, 60, -98, -52, -59, 87, 19, 31, -53, -58, 0, 87, 97, -93, 72,
+    -32, 46, 75, -15, -60, -19, -67, 41, -75, 86, 12, 5, 61, 49, -88, 62, 59,
+    -7, 48, 81, 32, -41, -80, 95, 77, -73, -63, -55, 83, -75, 18, 66, 19, 98,
+    61, 38, -44, -22, -35, 10, -35, -50, 20, -90, -15, -62, -22, 47, 73, -88,
+    -75, 42, 9, 48, -95, 24, 53, -83, 23, -92, -97, 49, -91, 56, 96, -69,
+    -69, 97, 74, -89, 42, 5, 69, -83, 98, 57, 0, -33, 33, 51, 89, -48, -91,
+    49, -80, -3, -87, -94, 74, 35, 51, -6, -23, 95, 79, 12, 88, 80, 10, 93,
+    -74, 25, 59, -17,
+  -4, -12, 60, -51, 97, -40, 45, -56, 55, -55, 50, 80, -93, 38, 91, -25, -29,
+    -45, -51, -85, -34, 92, -36, 66, 16, -59, 73, 48, 73, -78, 74, 23, -39,
+    -13, -30, 68, -59, 25, -42, 98, -6, 19, -72, -17, -72, 18, -56, -46, 44,
+    33, 46, 22, 83, 52, 52, -57, 85, 76, 46, 79, 37, 39, 60, -37, 37, -32,
+    -48, -21, 49, -36, 78, 62, -80, 35, 75, 49, -68, 96, -52, -16, 41, -26,
+    -39, 96, 58, 10, 66, -84, -22, 74, -82, -31, -26, 64, 34, -8, -85, -51,
+    -10, 20, 14, 9, -24, 45, 14, 39, -7, 59, 0, 9, 25, -39, 25, -32, 21, -60,
+    -83, 89, 27, 15, 47, -73, 80, 89, 55, 84, 81, -22, 93, -5, -74, 3, -72,
+    52, 59, 18, 66, 88, 36, 62, 79, -70, -86, -48, -44, 88, 20, 44, 50, 68,
+    75, -51, -60, -35, -19, 7, 47, -28, -69, 43, -96, -48, -97, -95, -96,
+    -15, -83, 34, -95, 34, -90, -67, -59, -17, 82, -74, 81, -88, -45, -66,
+    99, 73, -66, -56, 70, -65, -80, -93, 31, 80, 57, 78, -68, 55, 27, -82,
+    -64, -15, -57, 84, 88, 53, 74, 50, -48, 70, -24, -57, 24, 70, 25, 17,
+    -23, -92, 64, 20, 88, 60, 28, -53, -26, -62, -94, -95, -95, 72, 29, 73,
+    -32, 99, -44, 56, 2, 98, -100, -33, 15, 4, -28, -94, 20, -92, -83, -38,
+    62, 76, 76, -23, -43, 22, -31, 58, -57, 6, 40, -13, -44, 7, 55, -28, 63,
+    -1, 32, -68, 80, 50, -22, -96, 84, 59, 52, -2, 65, 82, 48, -30, 91, -48,
+    12, -67, -40, -6, 62, 57, -79, -98, 56, -49, 0, 43, 89, -33, -53, -13,
+    61, -46, 60, -13, -66, 82, -49, 46, 36, 93, 86, -26, -22, 86, 57, -17,
+    -82, -73, 27, -10, -70, 82, 7, -23, 35, -1, -25, 1, 73, -10, 85, 57, -24,
+    13, 32, 63, 38, -28, 14,
+  -84, -75, -19, -31, -34, 42, -53, -67, 36, -37, 49, -65, -13, 54, 74, 21,
+    -25, 36, -25, -34, -96, -97, 44, 56, -53, 71, -56, 47, 96, 1, 15, -26,
+    -88, -20, -49, -83, 57, 44, -25, 14, 62, -90, -8, -73, -8, -53, 9, -73,
+    -20, -16, -91, -86, -2, 53, -35, -5, -99, -20, 19, 33, -55, 25, 6, -71,
+    71, -49, -43, 67, -25, 34, 23, -6, 89, -3, 18, 79, -94, -97, -4, 70, 73,
+    -45, 52, 34, 58, 43, 17, 74, 0, 23, 33, -91, 55, 55, 53, -10, -52, -97,
+    18, -49, 67, -44, -36, 10, 95, -64, -56, 91, -25, 20, 58, -11, -36, -66,
+    -1, -80, -59, 11, 84, -72, 85, 29, -79, 63, -97, -63, -88, -23, 39, -64,
+    -48, 76, -85, 37, -53, 50, 96, 56, 42, 11, 81, -79, 1, 29, 59, 23, 43,
+    -65, 27, -94, -24, 57, -93, -84, -42, -30, -11, -46, 56, -11, -1, -98,
+    90, -2, 98, -91, 4, -23, 62, 39, 29, -38, -5, -56, -63, 17, 96, 77, 18,
+    40, -44, -6, 81, 7, 91, -29, -14, -81, -9, 4, -14, 76, 73, -44, -90, -56,
+    -69, 89, -16, -34, -73, -38, 8, 69, 37, -63, -7, -82, 51, -25, 86, 50,
+    11, 0, -41, 59, -21, -89, -32, -6, -51, -33, 88, -13, 63, 74, -80, -32,
+    13, 90, -82, 26, 28, -64, 67, -89, 26, -83, 78, 27, -65, 30, 39, -91,
+    -13, -54, 3, -44, -79, 90, 3, 94, 78, -72, -93, 82, -47, 43, -98, 29,
+    -29, 34, -64, 99, 46, -52, 24, 50, 78, -15, 74, -31, -46, 12, -2, -63,
+    13, 94, 71, 99, 65, -43, 66, -96, -15, -98, -96, -39, -97, -78, -15, -3,
+    59, 8, -67, 70, -54, -11, -21, 35, 53, -30, 96, 17, -5, -40, 90, 82, 31,
+    -77, -84, -12, -86, 77, 99, -66, 70, 58, 50, -74, 77, -52, 88, -34, 12,
+    -96, 12, 64, 44, 84, -50, -65, -99,
+  34, -54, -2, 47, 78, -76, -34, -67, -2, -48, -11, 11, -55, -86, -67, 78,
+    -4, 91, -57, -75, 80, 10, -61, -30, 3, 72, -33, 11, 30, 72, 7, 87, -93,
+    35, -95, -30, -87, 45, 59, 96, -7, 93, -56, 79, 71, 25, -34, 81, -21, 95,
+    41, 44, 69, -46, -61, 24, -26, -30, -68, 23, 9, -4, -24, 48, -51, -89,
+    -4, -49, 84, -24, -43, 32, 72, 89, -46, 23, -42, -13, -17, 14, 77, -7,
+    -9, 83, 21, 17, -87, -100, 86, -37, 11, 54, 71, 37, -37, -71, -7, -22,
+    -55, 17, -34, 6, 69, -15, -42, -30, -11, -69, 44, 63, 52, -66, 87, 93,
+    94, 23, 89, -69, -66, 61, 28, -59, -100, -73, -92, -36, 96, -22, -3, 41,
+    10, -43, 46, 67, -9, 26, 76, -93, -91, 60, 57, 4, -36, 51, 10, 73, -15,
+    96, 51, -95, 17, -17, -4, 87, -72, -21, -73, -8, 32, 42, -13, 65, -41,
+    92, -57, 86, 27, 70, 83, 65, 72, 84, 98, 72, -26, 95, -75, -32, -23, -63,
+    -12, -83, -18, 27, -39, 64, -48, 1, -46, -83, -74, -23, -96, 97, -21,
+    -88, -6, 81, 19, 36, -17, -46, -6, -89, 71, 1, -89, 65, 68, 87, 68, 96,
+    -11, 92, -50, 35, 2, 47, -79, -58, -5, 99, -36, 96, -58, 86, 55, -80, 85,
+    7, 58, -38, -41, 68, -80, -86, 31, -42, -63, 46, 18, -87, 26, 36, 41, 91,
+    -39, -63, 71, -39, -99, 28, -38, -53, -21, 79, 5, 61, -19, -45, 23, -18,
+    -79, 92, 56, 52, 97, 62, 44, -68, -42, -12, 87, -42, 58, -25, -23, -83,
+    86, 94, -41, -81, -51, 69, -5, -100, -4, -78, -6, -85, 98, -9, 96, 38,
+    -29, -58, -4, -92, 74, -24, -51, -30, -15, -74, -35, 7, 15, -70, -12,
+    -63, -24, -11, -64, -64, 3, -34, -41, 17, -2, -34, 53, 16, 85, -26, -23,
+    94, -23, -47, -71, 59, -27, -3, 98,
+  55, -58, -8, 84, 24, 46, -73, 92, 3, 10, 65, 25, -32, 93, -63, 35, 7, 89,
+    49, 1, -35, 87, -41, -7, 93, 17, 30, 89, -97, 40, -44, 11, 0, 32, 86, 80,
+    -39, -75, 85, 3, -77, -19, 97, 90, 11, 67, -25, -35, -94, 30, 88, 24, 18,
+    -67, -73, -6, 29, -36, -10, 28, -76, 10, 2, -92, -31, -54, -91, 51, -66,
+    34, 16, -18, 64, 8, -78, 41, 65, 38, 48, 32, -46, -42, -31, -33, -1, -15,
+    66, 49, -48, 21, -63, 31, -67, -42, -64, -15, -69, 64, 23, -93, 98, 75,
+    58, 17, -78, 80, 83, 14, 0, 77, -2, 65, -28, 98, -13, 72, 0, 80, -53, 90,
+    -94, -72, 62, -49, -51, -93, 82, 29, -84, 31, -48, 63, -59, -86, -93,
+    -57, 14, -80, -27, 49, 98, 12, -63, -7, -95, 74, 23, -53, 44, -71, -1,
+    -80, -35, -35, -2, -78, -53, 70, 0, -72, -38, 64, -86, 70, -27, 58, -86,
+    -15, 52, 35, 87, 99, 71, -84, 89, -82, 38, 77, -62, 57, 31, 52, 55, 37,
+    -2, 81, 63, -2, 4, -17, -31, -46, 13, 13, 55, -69, -97, -3, 41, 88, 54,
+    -3, 64, -88, -52, -80, -11, -73, 43, 64, -95, -19, -60, -68, 20, -83, 53,
+    66, 90, 1, -53, -34, 96, 38, 64, -35, 0, 11, -78, -80, 34, -82, 51, -15,
+    -75, -39, -18, 89, -83, -79, -71, -55, 30, -98, 55, -65, 55, -39, 61,
+    -61, 23, -73, -37, -61, 69, -98, 11, -50, 18, 88, 79, 26, -34, 36, -24,
+    15, -19, -47, 50, 50, -44, -91, 39, -50, 84, -22, -34, 10, 78, -86, 43,
+    30, -81, -76, -94, 45, -99, -88, -84, 54, 39, -49, 51, -90, 71, 34, -99,
+    -35, -9, -23, 14, -51, -92, 33, -9, 72, 86, -29, 65, 86, 82, 15, -15, 35,
+    25, 86, -84, 75, -28, 47, -14, -33, -9, 77, -99, 95, 85, 51, 5, -93, 5,
+    -50, 70,
+  52, -43, 99, -68, 42, 43, -6, 29, 53, -85, -99, -18, 91, 80, -54, 27, -76,
+    2, -30, -70, -79, 68, -68, 54, 21, -46, 13, 23, 7, 9, 61, -20, -33, -94,
+    -22, -15, 42, -50, -36, 20, -17, -56, 38, 88, 68, -66, -86, 61, -44, 78,
+    46, -99, -10, 57, -90, -66, -40, 7, 85, -57, 93, 48, 60, -31, -52, 33,
+    -20, 15, 83, 28, 7, 3, -8, -22, 10, 76, 20, -73, 73, -82, -5, -94, 98,
+    -57, -38, 20, -98, -13, -32, 23, 49, -2, -82, 70, 95, -41, 99, -9, -50,
+    24, 5, -48, -45, 82, -68, -35, 10, 12, -83, 87, 96, -32, 60, 53, 42, 59,
+    -38, 62, -1, -83, -32, -28, -100, -79, 6, 4, -34, 83, 61, -33, 90, 26,
+    18, 17, 32, -76, 22, 14, -72, 97, 99, -62, -59, -81, -8, -58, 92, 59, 2,
+    -86, -56, -70, -4, -69, -60, 95, -23, 4, 10, -51, -12, -23, 97, -79, -44,
+    -36, -84, 60, -34, -58, -62, 1, 54, 26, 60, -58, -20, -69, -60, 18, -20,
+    9, 85, -82, -27, -39, -56, 67, 26, 13, 16, -75, -26, -92, 15, -74, 31,
+    -93, 90, -24, 35, 66, 8, -35, 21, 78, -5, 28, 31, -39, -82, 77, 78, -59,
+    -50, 64, 59, 16, 63, 53, -19, 95, 13, -84, -73, -75, 13, 13, -66, -78,
+    -49, -72, 51, 98, -12, -99, -43, 83, 52, -74, -87, -14, 71, 45, 28, -39,
+    48, -55, -50, -76, 87, -23, -39, 86, -54, 16, -48, 15, 93, 2, -81, 20,
+    47, -67, 76, 85, -54, 65, 19, -74, 6, 26, -40, 73, -80, -90, 84, -22,
+    -30, 52, 58, -31, -10, 78, 89, -14, 99, -47, -96, -18, -87, -56, 19, -27,
+    36, -74, -16, 98, -89, 78, -53, 43, 54, 41, -46, 46, 84, -61, -54, 35,
+    73, 72, -21, -36, -43, -57, 24, -66, -44, 87, 44, -30, -70, -81, -77,
+    -70, -30, -89, 58, 71, -53, -36, -8,
+  -1, 6, -75, 17, -39, 90, -2, 64, -19, -20, -15, -55, 49, 26, -71, -12, -65,
+    93, -61, -89, 18, 60, 63, 91, 3, -68, -87, 44, -34, -55, -21, -83, -91,
+    21, -25, 91, 64, -31, 84, -74, 80, -22, -70, -55, 59, 15, -57, 3, -14,
+    32, 78, 95, 79, 53, 62, -35, 91, 10, 69, -76, 89, -44, -31, -12, 29, 43,
+    -47, -32, -11, 78, -57, -8, 95, -98, 91, -2, 8, -41, -86, -1, 41, 74, 22,
+    -81, 70, -96, 57, -45, -67, -44, -68, 32, -85, -5, 57, 63, -60, 74, -93,
+    -1, -8, -97, -99, -29, -2, 55, 61, 97, 91, -82, 77, 67, -36, 67, -72, 30,
+    -47, -18, 24, -69, -70, -71, -82, -83, -59, -19, 57, -23, 62, 81, -11,
+    -33, 36, -54, -14, 58, 95, -96, -78, 25, -42, 33, -19, 5, -85, 1, 57,
+    -69, -82, 80, 69, 89, -87, -37, -37, -1, -83, 13, -20, -17, -9, -66, 11,
+    -3, -31, -53, 69, 43, 44, -99, -72, 77, -10, -20, -12, -91, -9, 63, -88,
+    -16, 34, 70, 81, 21, -84, -52, -47, -94, 21, 59, -91, -37, 96, 24, 48,
+    47, -65, -58, -44, 43, -42, -10, 32, -74, -78, -97, -100, -87, 96, 9,
+    -19, -56, -74, 85, 78, -81, 4, -17, 86, -11, 57, 40, 8, -18, 75, 13, 93,
+    85, 61, 32, 31, 21, -25, 65, -87, -43, 94, 44, 8, -61, -88, 98, -5, -63,
+    37, 80, 79, -22, 77, 88, 19, -96, 44, -22, 6, 16, 64, -40, -81, 46, -64,
+    -95, -5, -48, -42, -20, 6, -79, -67, 99, 50, 62, 22, 18, -61, -8, -65,
+    56, 19, 63, -9, 88, 46, -44, -71, 37, -45, -4, 63, -58, -61, -55, 55, 92,
+    90, -83, -21, -47, 53, 17, 91, 17, 21, -43, -3, -30, -38, -30, -43, 98,
+    -78, 44, 64, 12, 52, -12, 28, 88, -92, 48, -56, -44, 75, 69, 44, 35, -98,
+    18, -63, 91, -49, -87, -91,
+  14, 12, -61, 12, -2, -51, -31, 86, 86, -94, -67, 90, -3, -24, 47, 87, 68,
+    31, -89, -39, 3, 86, -76, -28, -35, -90, 19, -38, 26, -69, 65, -44, 85,
+    27, -37, -38, -78, 48, -94, -20, 0, -54, -22, 92, 26, 60, 43, -7, 68, 35,
+    39, -45, 68, 2, 75, 63, 77, -32, 2, 20, -80, -44, -96, -46, -14, -29,
+    -54, -84, 44, -21, -54, 63, 8, 79, 47, -81, 36, -54, 56, 78, 10, -86, 8,
+    23, 80, 57, -25, -82, 6, -64, -98, -35, 21, 77, -17, -39, -64, -87, 81,
+    -28, -24, 83, -18, 94, 13, -22, -70, 84, -53, -88, 32, -62, -63, -24, 14,
+    -100, -57, -5, -33, -15, 88, -24, -68, -23, -16, -38, -7, -32, -48, 56,
+    18, -26, 27, 1, -98, -94, 66, -39, -19, 96, -19, -66, 70, 48, -86, 28,
+    -54, 48, -38, -95, 54, 35, 52, -44, 63, 49, 65, 5, -2, 83, -84, 9, -41,
+    -91, -9, -75, -79, 47, -49, -68, -54, 47, -69, -8, 42, -25, 58, 2, -63,
+    -62, 14, 68, 21, -45, -10, 66, -76, 27, -77, 21, 87, -23, -47, 40, 83,
+    -50, -27, -4, -89, 9, -65, 83, 13, 4, 56, -60, -38, -30, -6, 56, 96, 90,
+    -59, -51, 88, 41, 41, -61, -96, 95, 59, -99, -43, -96, 55, -99, 80, 69,
+    97, 64, 28, 96, 94, -68, 25, 98, 74, 12, 49, -98, 43, -29, 22, 72, 70,
+    -2, -94, -76, -99, 82, -7, 21, -32, -64, 53, 26, -29, -4, 85, 13, 81,
+    -19, 59, -19, -35, 25, -77, -33, -69, 49, 11, -7, 91, -52, 96, 30, 84,
+    -44, 26, -9, 95, -31, 18, 20, -86, 92, -14, -55, 82, 88, -32, 25, -49,
+    93, -59, -71, 47, 51, -89, -63, 60, 28, -50, -76, -32, -20, 39, 89, 24,
+    -41, 53, -27, 56, 23, -44, -97, -4, -99, -40, 83, -38, -13, -45, 37, 79,
+    -14, -48, -81, -50, 0, 98, 26, -94,
+  14, 67, 44, -40, 41, -98, -50, -68, -7, 66, -43, 50, -41, -21, -68, -37,
+    28, 67, -37, -71, -54, -15, -26, -5, 8, 20, -25, 90, -78, 82, 57, 57, 21,
+    71, 36, 85, 22, 20, -75, -64, -29, 92, -44, 20, 6, -37, -32, -99, -13,
+    -96, 81, -39, 51, -20, 38, -75, 1, 38, -89, 55, 87, 0, 73, -35, -38, -25,
+    -9, 48, -64, -25, -20, -96, -8, 29, -91, 24, -86, 96, 98, 21, 70, 37,
+    -28, 39, 33, 27, 59, 52, 13, 84, -33, -70, 3, 27, -4, -37, -54, 85, -7,
+    48, 74, -92, -50, 86, -44, 64, -44, -43, -33, -10, 31, -13, -76, -65,
+    -98, -74, 89, 27, -96, -32, 53, 68, 36, 91, -94, 25, -56, -100, 60, -36,
+    74, -16, -68, 39, -12, 27, 83, -53, -92, -21, 30, -75, 41, -46, 33, -22,
+    -3, 37, 34, 39, 48, 25, 72, -67, -85, -23, 96, 85, -54, 30, 95, 16, -9,
+    -89, -52, 73, 15, 42, -72, 32, 55, -3, -71, -29, 54, 69, 90, 24, -7, 75,
+    -94, -27, 61, 15, 18, -86, 12, 20, -25, 69, 90, 68, -90, 62, 79, 42, 74,
+    56, 15, 32, -28, 14, 69, -17, -8, -55, 14, 67, 26, -90, 92, 68, -9, -50,
+    -88, 68, -13, -50, -47, -51, 29, -69, 66, -95, 85, -58, 44, -21, -38,
+    -37, 93, -57, -31, -48, -68, 14, 62, 91, 29, -5, -87, -70, -92, -45, -26,
+    -11, -48, -31, 58, 79, 30, 13, -82, -33, 44, 74, 90, -96, 13, 80, -32,
+    -18, 40, 5, 88, 55, 8, 3, -12, -57, -77, 88, -29, -92, 86, 5, 93, -54,
+    29, 49, -28, 42, -58, -2, 97, 73, 50, 58, -90, 31, -8, 42, -71, 99, -98,
+    92, -83, -24, -21, 75, 93, -31, 50, -100, -38, 4, -18, 35, 77, 46, -53,
+    16, 47, -28, 82, -36, 50, -63, 39, -6, 81, -81, -33, -54, 2, -50, 88, 95,
+    77, -36, -99, 38, -26,
+  -44, -78, -83, -79, 42, -34, -10, -83, 29, 27, 82, 15, -81, 92, 4, 82, -58,
+    -61, -6, -77, -56, 44, 26, 11, 19, -3, -35, 5, -5, 62, -35, 23, 80, -41,
+    30, 85, -8, 5, -79, -68, 85, 22, -83, -19, 54, 10, 12, 76, -39, -86, 83,
+    61, -83, 44, -100, 81, -60, -87, -23, 84, -71, -8, 50, -8, 36, -17, -62,
+    -39, 95, 93, 91, 76, 15, -26, -5, 16, 80, -22, 66, 68, 49, -64, 18, 4,
+    -15, 44, 3, 75, 68, -10, 91, 2, 3, 44, 97, 62, 91, -79, -85, 23, 43, -12,
+    -93, -22, -20, 92, 67, -77, -20, -100, -47, 83, -71, 0, 34, 4, 37, -45,
+    -53, -83, 82, -96, -59, 57, 49, 49, 86, 91, -36, 92, -24, 95, -85, 63,
+    92, -36, 84, -60, -42, 5, -61, -61, 88, 84, 83, 27, 26, 46, 9, 96, -71,
+    -65, 61, -92, -23, 83, 22, 45, -35, -47, -58, 69, 0, -100, -86, -18, -94,
+    -97, 94, 66, -43, 57, -1, -78, 95, 35, 51, 88, 92, -42, 47, -99, -95,
+    -41, -25, -69, 83, 15, 60, -23, -96, 25, -24, 8, 81, 91, 54, 4, -49, -26,
+    -76, 34, 10, -22, 16, 96, -97, 87, 62, 11, 67, 23, 62, -65, -42, 47, 20,
+    -32, 0, -40, 39, -84, 36, -97, 42, 91, -16, -86, -97, 83, -75, -40, 34,
+    69, 6, -32, 23, -100, 25, -78, -52, 7, -85, -36, -87, -39, 13, 51, 87,
+    24, 20, -88, 0, 83, 52, -68, 78, 92, -87, -54, -45, 6, 40, 2, 25, 5, -55,
+    -64, 75, 37, 73, -6, 65, 31, -60, -20, 74, 85, -49, -80, -40, -96, 85,
+    88, -61, 13, -92, 62, -52, -34, -40, 85, 76, -36, -28, 58, -73, -70, -39,
+    -84, 82, 98, -21, 72, 56, -98, -54, -100, -22, -40, 22, 83, 95, 98, -46,
+    55, -1, -12, -12, -35, 28, 61, -4, -25, -100, -27, -24, 48, 28, -95, 81,
+    41, 40,
+  -57, 49, 13, 15, 74, 72, 35, 72, 11, -59, -22, -49, 84, -13, 18, -64, -98,
+    -53, 20, 93, -49, 58, -8, 3, 57, 85, 52, 77, 85, -20, 7, 13, -47, 1, -94,
+    -29, 8, 87, -25, 70, 48, 44, -10, -53, -24, 77, -63, 27, 57, -77, 29, 99,
+    -32, -80, 88, -94, 6, -13, -2, 19, 78, -78, 8, -87, 9, -25, 15, 36, 8,
+    -82, 13, -62, -70, -98, 13, 48, 13, 7, -13, -95, -8, -63, -4, 28, -95,
+    -31, -16, -25, 19, 86, 50, 67, 23, -56, -47, -54, -11, -28, 17, 13, -9,
+    61, -36, 75, 81, 65, -6, 98, -16, 43, -28, 12, -2, -56, 93, -52, 91, 6,
+    86, 9, 33, 45, -15, 53, 30, 60, -38, -90, 58, -87, 40, -28, 48, 24, -8,
+    52, 67, -72, 99, -86, -26, 2, -99, 12, 6, -69, 0, 84, -97, -10, -51, 38,
+    58, 84, -65, 28, -92, -32, 70, 19, 27, 57, 80, -19, -69, 7, 72, -1, 38,
+    27, 39, 58, 78, -25, -28, -85, 41, -86, 33, 60, 32, 75, -43, 85, 70, -52,
+    -91, -94, -24, -72, -68, -59, -58, 98, -75, 53, -92, -93, -72, -53, -28,
+    30, 41, 68, -61, -20, 20, -54, -43, -76, -1, -87, 72, 44, 20, 1, 14, -26,
+    -84, -8, -59, 23, -16, 40, 85, -87, -34, 26, 50, -87, 69, 71, 82, -100,
+    36, -75, -1, 16, -95, -77, -68, -46, -18, -41, -10, 54, -77, 37, 92, -8,
+    99, 70, 18, -92, -69, 14, -60, -67, 98, 99, -18, -50, -83, -8, -80, -59,
+    -53, 30, 26, 94, -41, -86, -26, 18, 50, 63, -27, -67, -68, 68, -38, 48,
+    59, 31, -72, 35, -25, 29, -35, -22, 44, 59, -37, 82, 63, 4, 1, 8, -14, 4,
+    -70, -65, -66, -41, 54, 60, -93, -50, -81, -28, 22, 9, -99, 76, -47, 48,
+    70, 8, -63, 98, -85, 69, 10, 92, -4, 46, 39, 23, 64, -83, -24, -23, 47,
+  -15, -14, 87, 92, -28, -9, -76, 99, -50, -38, 41, 66, -93, -63, -38, -67,
+    -9, -29, 72, -48, 52, 72, 19, 58, 67, 85, -3, 79, -14, 30, 5, -90, 22,
+    48, -84, 32, 38, 14, 36, 21, 68, 32, 78, -87, -63, 3, 50, -84, 78, 58, 7,
+    -74, -14, 77, -37, 61, 14, 50, 61, -32, 68, -62, -84, 55, 95, -45, 72,
+    -52, 47, -51, 7, 13, 29, -55, -4, 84, 76, -8, 80, -13, 1, -56, -19, -42,
+    -82, 1, -63, -39, -92, 9, 65, 65, 64, 84, -86, -97, 78, 42, 9, -51, 26,
+    -31, 56, 37, -31, 13, 11, -43, 61, -35, 57, -72, -84, 6, 86, 75, -59,
+    -56, 0, 73, 57, 67, 16, 73, -41, 80, -33, 79, -20, 69, 57, 42, -12, 68,
+    82, -92, 74, 95, -76, 64, -21, -47, 73, 13, -14, 66, 49, 1, -13, 85, -90,
+    7, -98, 78, -77, -68, -62, 6, 51, -96, 17, 54, -85, 27, 27, -30, 34, -36,
+    78, 96, -83, 62, -22, -23, 34, -82, -92, 82, 41, 82, 77, 6, -77, 82, -81,
+    27, -32, -13, -98, -36, 26, 10, 2, 52, 48, -94, 28, -51, 54, -43, 29, 2,
+    -33, 39, -37, -59, -64, 54, -73, 56, 84, 82, 82, 88, -75, 4, -58, 66, 46,
+    -36, 24, 93, 69, -5, -86, -4, -44, 87, 70, -10, 35, 60, 47, -1, -8, -23,
+    88, 1, -44, -30, 36, -100, -38, 14, 39, 99, 73, -21, -75, -90, -43, 19,
+    -88, -85, 36, -99, -47, -29, 14, -36, 81, -53, 54, -92, -6, -37, -95,
+    -43, 99, -63, 9, -32, 78, 80, 25, -2, -41, 20, 40, 89, -4, 87, 44, 2, 36,
+    22, 44, 94, -54, 89, -5, 77, -50, -21, -73, -40, 73, -8, 85, -6, -28, 42,
+    -32, -33, -62, -100, -48, 78, 74, -44, 35, 46, -2, -70, -74, 22, 7, 48,
+    4, 26, -94, 24, 71, 49, -56, -93, -62, -70, -26, -72, -29, 47, -28,
+  -83, -91, -45, 28, -84, -46, 69, 98, -3, 58, 29, 17, -99, 19, 83, 20, -13,
+    -99, -9, 88, -70, -61, -54, -33, -57, 34, -64, -14, 62, -39, 28, -92,
+    -86, 33, 97, 97, -24, 3, 4, 37, 26, -63, -48, 66, -88, 90, -90, 27, 2,
+    77, -45, -67, 74, -46, -50, -98, 63, -93, -5, -97, 37, 39, 55, -21, 57,
+    83, 38, 17, -82, -27, -61, 77, -2, 72, -23, 85, -30, -7, -81, -72, 57,
+    -97, -9, 80, 92, -95, -14, -13, 40, 19, 6, 8, 98, -11, 3, 96, 88, -1, 16,
+    26, -57, 94, -47, 69, 5, 20, -9, 31, -50, 99, -30, 57, -97, -20, 54, 71,
+    4, 1, 81, -10, 71, 54, 38, 26, -12, 62, 42, -94, -80, 60, 47, 38, 98, 69,
+    -46, 72, 28, -61, -31, -52, -11, 22, 2, -75, 61, 68, 90, 77, -24, 53,
+    -12, -42, 26, -2, -97, -3, -12, -19, -99, -56, -28, -70, 21, 45, -100,
+    95, 7, 78, 25, -74, 1, -15, -73, 33, 57, 98, 95, -85, 96, -86, -72, -90,
+    -69, -85, -80, 68, 86, 48, -39, -57, -77, 14, 1, -49, 12, 47, -47, 52,
+    -22, 16, 9, 86, 31, -59, 56, -64, 65, -39, -45, 88, 27, 54, -79, -53,
+    -92, -26, 76, 66, 78, -89, -93, -33, 49, 97, 84, 67, -23, 88, 45, 1, 20,
+    37, -97, 71, -3, -99, -48, -15, -96, -23, -20, 80, -60, -49, 60, -77,
+    -36, -66, -17, 28, 94, -66, -66, -66, 82, 91, -13, 88, -54, 70, -11, -11,
+    85, 15, 40, 87, 3, 86, -44, -36, 8, -10, 13, -76, 98, -48, -89, 91, 68,
+    -83, 67, 9, -53, -70, 93, -40, 32, -74, 25, -17, -68, 42, 83, -21, 93,
+    39, -80, 33, 18, 54, 96, -15, 66, -6, 95, 87, -94, 24, 58, 13, 70, 29,
+    40, 50, 93, -2, -1, -69, 95, 86, -35, 65, -72, 72, 4, -92, -97, 9, 16,
+    15, 48, 55, -48,
+  -32, -15, -20, -63, -90, -26, 68, -15, 52, -62, -73, 61, -13, 31, 93, -87,
+    -86, 2, 99, 72, -1, -32, -17, 46, 98, 50, -57, -99, 73, 23, 97, 60, 12,
+    -54, 43, 64, -15, -52, -26, -93, -70, 21, 68, -96, 17, 74, -26, -25, -44,
+    89, -1, -92, 74, -71, -69, -25, -73, -83, 18, -52, -37, -63, -80, -30,
+    95, 11, 41, 63, 72, 71, 14, -65, -5, -6, -100, 2, 98, -74, 87, 65, 97,
+    93, 28, -72, -28, -4, -91, 7, 1, 44, 20, 74, -71, -87, -7, 49, -67, 42,
+    38, -33, 20, 4, 27, 6, 53, 82, -9, -8, 90, 74, 64, 40, -44, 20, -61, -75,
+    -88, 71, -11, -75, -46, 65, -36, 71, -51, -8, 66, 96, -62, 67, -72, -51,
+    -82, 29, -39, 95, 53, 7, -84, -31, -3, 4, -94, 99, -64, 26, -98, 22, 97,
+    60, -97, 85, -75, 41, -99, -67, -3, -26, 32, -8, 88, -32, 13, -35, -90,
+    -79, -21, -62, 5, 8, -34, -6, 51, 9, 27, -60, 99, 44, 6, -39, -87, 84,
+    20, 12, 77, -6, -12, -85, 91, 44, -24, -62, 6, 22, 41, 49, 2, 4, 61, -29,
+    80, -88, -81, 48, -45, 87, 41, 35, -71, 20, -16, 96, 87, 23, -91, -11,
+    -8, -49, 13, 55, 52, 5, -53, -21, 24, -24, -6, -63, -80, -45, 10, -32,
+    -55, 15, -94, 34, 7, 27, 21, -82, 58, 89, 78, 10, 56, -47, -93, -20, -31,
+    -69, -15, -3, -39, -13, -62, -52, 13, 99, 81, -41, 61, 18, -59, -98, -12,
+    78, -13, -61, 0, 39, 75, -50, -87, 26, 51, -51, -63, -36, 35, 1, 88, -78,
+    -20, 12, 51, 97, -34, -97, 98, -82, -84, -42, 43, 51, 92, -91, 86, -86,
+    47, 21, 73, 59, -74, 36, 25, 45, 89, 88, 60, 8, -36, -2, 35, 67, 48, -4,
+    -75, 53, 76, 50, 42, 72, -38, -34, 27, 60, 28, 22, 23, -42, 80, -67, -67,
+  -56, -80, -97, -7, -61, -98, 48, -42, 79, 43, -99, 37, 87, -55, -58, -14,
+    56, 4, -56, -38, 92, -80, -45, -95, 8, 57, 59, 28, 14, -37, -17, 7, 6,
+    -74, 99, -65, 64, 29, -100, -84, -35, -78, 57, 69, 46, 11, 97, 89, -87,
+    -51, 56, -79, 71, 56, -80, 77, -77, 82, -50, -26, 46, 31, -62, 82, 2, 1,
+    70, 26, 43, 40, 48, 93, 89, 90, -76, 14, -19, -63, 95, -17, -94, -5, -72,
+    -78, -96, -36, -86, -57, -75, -28, -52, -28, -80, 82, 33, -90, -23, -35,
+    8, 47, 65, 89, 89, 32, -20, 32, -97, -82, -51, -73, 27, -58, 20, 60, 23,
+    -65, -21, -92, 56, 95, -51, 88, 76, -59, -77, -63, -27, -7, 94, -22, 27,
+    -7, 9, 41, -54, 3, -39, 90, -72, 27, -17, -90, 69, -43, -66, 58, -5, 63,
+    38, 59, 47, -8, 77, -26, -82, 71, 12, 41, -34, -21, 43, -79, 84, 82, -24,
+    -54, 62, 27, -47, 76, -35, -81, -78, -65, 50, -5, 58, -16, -30, 92, -47,
+    75, -40, -42, -97, -90, -8, 13, -10, -79, 80, -15, -29, 2, 77, 49, -62,
+    1, -2, -32, -19, -98, 82, 39, -47, 7, -35, -56, -38, 61, -98, -18, -29,
+    28, 46, 98, 92, 54, -3, -9, -56, 39, 61, 92, 47, -2, 24, -55, 94, 46,
+    -31, 81, -51, -78, 48, 80, 36, 98, 99, -52, 74, -3, -16, -98, -16, -94,
+    72, -58, 67, 18, 93, 26, 91, -2, 36, 70, 66, -67, 86, -12, -51, 47, -63,
+    27, -37, -20, 72, 88, -60, -48, -16, 36, -85, -89, 13, -99, 50, -47, -90,
+    -96, -11, 24, 20, 75, 51, 33, 72, -18, -53, 64, 61, -28, -30, -32, -52,
+    90, -51, -56, 69, -69, 37, -10, 42, 61, 74, -45, 95, 50, 41, 82, 52, -67,
+    -49, 85, -97, 22, 30, -99, -61, 80, 90, 9, -8, 19, 96, -31, -90, 58, -52,
+    -68, 34, -42, -93,
+  36, 4, 1, -99, 17, -66, 74, 36, -81, -86, 2, 29, 99, 77, 75, 46, -77, -79,
+    79, -91, 61, -54, 5, -6, -96, 74, 74, 93, -62, 19, 21, 93, -14, -89, 23,
+    -42, 54, 22, 28, -18, 32, -75, -85, -66, -19, 26, -60, -59, 19, -44, -78,
+    35, -5, -24, 53, -19, 80, 24, -64, 70, 39, 76, -98, 16, 22, 34, 22, -35,
+    -8, 86, -81, 45, -98, -5, -99, -70, 71, -55, -20, 86, 4, 81, -7, -22,
+    -80, -72, -62, 78, 57, -56, -26, 10, -3, 61, -16, 38, 85, -32, -96, 16,
+    48, 30, 11, -50, 58, 42, 12, 44, 36, -48, 63, 38, 77, -62, -31, 69, 2,
+    13, -97, 9, 25, 48, 19, 80, -22, 90, 25, -79, 85, 76, -66, -52, -1, -40,
+    -82, -58, 85, 28, -80, 71, -83, -7, 25, 27, -46, -43, 76, -97, -60, -49,
+    32, 16, -95, 26, 3, -96, 23, 85, -12, -51, -71, 28, -8, -15, -79, -40,
+    -6, 31, -55, -56, -1, 76, -43, 7, 94, -73, 35, 6, -74, -48, -15, -82,
+    -52, 28, 7, -4, 60, -38, 94, -94, -89, 21, -88, 91, 83, -40, -48, -74,
+    -76, 43, 53, 58, 59, 41, 96, -38, -41, -22, 67, -74, -62, 45, 93, -23,
+    -93, 50, 57, 99, -99, 99, 7, -96, 21, 89, -20, -30, -53, 17, -48, 87, -8,
+    -45, 40, 67, 17, -83, -84, -66, -28, 83, -74, -6, 23, 0, 70, 45, -61,
+    -96, 78, 44, -86, -28, -84, -33, -26, 90, -97, 9, -60, -89, 10, -4, -12,
+    -92, -32, -17, -55, 59, 79, -56, -77, 15, -50, 62, 57, 68, -31, -12, -6,
+    -88, 18, -21, -77, 22, -50, 16, -27, -76, 6, 14, -31, -63, -15, 33, 82,
+    -32, 67, -20, -55, 19, -26, 4, -44, 43, 24, -93, 89, 41, -80, -75, 78,
+    62, -7, 37, 54, 53, 66, -48, 26, 45, 19, 97, -67, -77, -19, 92, 16, 31,
+    88, 70, -83, -67, -3,
+  -60, 5, 44, 85, 17, 53, 54, 1, -2, -92, 86, -95, -37, -65, -5, 75, 98, -39,
+    87, -10, 4, -44, -96, -67, 23, 24, -80, -60, -84, -47, 7, -42, -76, 73,
+    -84, -25, -82, -44, -38, -72, 25, 4, 63, 92, 51, -99, -68, -30, -50, -59,
+    99, -64, 44, 66, -65, -33, -25, 56, 23, -59, -37, 21, 41, 63, -17, 87,
+    71, 30, 19, -93, -73, 90, -47, -30, -52, 95, 19, -12, 9, -56, 66, 68, -8,
+    78, 61, 85, -38, 7, 12, 23, -9, 75, -87, 1, 11, 80, -19, 20, 53, -23, -4,
+    73, -7, -54, -73, -93, -70, -57, -75, 10, 45, 11, -47, -43, -43, -79,
+    -39, 79, 91, 10, 21, -70, 12, -43, 63, 89, -81, -76, -92, 90, -16, 13,
+    88, -90, -82, 71, -66, 0, 26, 91, 46, 34, 67, -61, 16, -40, -72, 78, 80,
+    60, -13, -22, 10, 8, -90, 35, -31, -47, -25, -15, 32, -19, -61, 50, 36,
+    -20, 89, 79, 29, -26, -41, -59, -87, -36, 17, -100, -70, -64, 21, -91,
+    -82, -56, 32, 91, -76, -61, -44, 76, -19, -68, -94, 32, -44, -14, 75,
+    -77, -50, -66, -12, 32, 33, 77, -90, 59, 49, -37, 10, -45, -30, 6, 80,
+    65, -32, 69, 98, 60, -100, 3, -30, -63, 44, -51, -93, 0, 44, -6, -74, 10,
+    -63, 30, 51, -99, -19, -12, -90, -31, 32, 44, -17, -82, 47, -17, 81, 25,
+    49, 74, 14, 93, 71, -91, -30, -16, -62, 29, 1, 24, -37, -69, -76, -79,
+    -81, 17, -100, -37, -95, -10, -31, 53, 37, -76, -17, -77, -28, 67, 30,
+    43, -52, -34, -47, 37, -82, 12, 55, 87, -27, 95, 87, 9, 33, 50, -21, 71,
+    -8, 1, -97, 41, 34, 40, -45, -3, 14, -9, 67, -36, 19, -32, 25, -69, -67,
+    -63, 43, 79, -23, 24, 32, -39, 20, -88, -6, 99, 9, -34, -97, 36, -43,
+    -74, 51, -1, -94, -95, -31, -94, 62,
+  53, 2, -42, -28, 50, 29, 47, 24, 33, -35, 9, 18, -43, -14, 20, 39, -90, 22,
+    9, -69, -52, -5, 25, 96, -9, -83, -10, 51, -85, -11, 38, -43, 24, 64, -6,
+    -57, 69, 63, 63, 11, 35, -40, 85, -65, 32, -22, 6, 80, 51, -80, 99, -7,
+    -13, 48, 75, -75, 80, 44, 39, 34, 54, 63, 70, 59, 79, -5, -50, 2, -23,
+    -89, -8, 67, -36, 98, 54, 16, -61, -69, -42, -80, 70, -31, 80, -71, 21,
+    -7, 51, 0, 2, -36, -13, 27, 61, -54, -7, 35, -98, 85, 59, 98, 56, -9, 89,
+    -88, -81, -71, -78, 45, 13, 95, 95, 40, 14, -97, 50, -60, 99, 56, 91, 53,
+    22, 37, 59, 19, -70, 94, 69, 12, -53, 40, 21, 57, -92, 75, 93, -52, -41,
+    2, -10, -97, 1, 96, 31, 61, 23, -3, -83, 46, -29, -46, 22, 21, -42, 93,
+    94, 65, 82, -39, -79, -60, -54, 25, -6, -92, -56, -32, -80, -92, 17, 1,
+    -49, -7, -1, 4, 17, 67, 38, -4, 69, 50, -99, -99, -79, 34, -23, 23, -29,
+    75, 45, 26, -53, -71, 54, 64, 48, 43, -86, -88, -50, -15, 23, -64, -89,
+    85, -31, 5, 97, 2, -37, -46, -99, 44, -10, 38, -10, -85, 36, -100, 66,
+    -83, 31, 4, 88, -8, -75, -24, -79, 94, 78, 32, -93, 25, -55, 44, -7, 35,
+    6, 28, -56, -22, -10, 52, -81, -30, -70, 77, 24, 97, -36, -18, 90, 59, 7,
+    21, 47, 30, -91, -13, 95, -4, 95, 96, -43, -46, -76, 87, -31, 67, 30, 41,
+    -23, 42, -63, 7, 18, 45, 27, -76, 84, -59, 43, 92, 60, 90, 0, -49, -3,
+    73, 44, 2, 36, -83, -74, -8, -14, -99, 57, -66, 70, -49, 16, -61, -65,
+    37, -21, 88, -89, 2, -86, -96, 98, 10, 32, -71, 23, 10, -44, 34, 5, -78,
+    35, -9, 83, -78, -98, -77, 9, 91, -85, 75, -91, -8, 69,
+  60, 69, -84, -76, 77, 41, -3, -8, -61, 66, 1, -100, -39, 76, 38, -22, -33,
+    -87, -79, -26, 1, 96, -71, -29, 65, 59, 98, -74, 27, 8, 66, -19, -69, 75,
+    -32, 37, -57, -29, -40, -56, -4, 0, 66, -40, -2, 18, -52, 23, -97, 79,
+    -95, 58, -59, 44, -61, -6, -8, -43, 7, -14, -30, 53, -38, -22, -77, -87,
+    93, -7, 35, -60, -48, -9, -29, 4, 22, -82, 30, 55, 77, 90, 72, -91, 77,
+    93, -74, -10, 86, 51, -15, 74, 34, -8, -86, -9, 7, -3, 10, -9, -99, -35,
+    54, -45, 33, 63, 59, 75, 68, 17, -44, -67, 91, -54, 99, 48, 17, -66, -58,
+    -81, -45, -43, 63, -51, 10, -76, -67, -39, -36, -82, 33, -6, -84, 58, 40,
+    -34, 6, 40, -29, -95, 41, 53, -15, -54, 50, 71, 96, 20, -20, -27, 64,
+    -32, 26, -96, 39, -10, 52, 10, -50, -31, -77, 7, -45, -92, -81, 25, 87,
+    -25, -34, 70, -30, 38, -7, 42, 34, -31, -39, -27, -29, -48, 60, 0, 75,
+    97, 75, -57, 40, 64, 46, -74, 25, -94, 83, -54, -24, -89, -50, -69, 3,
+    10, 58, -30, -39, -65, -94, -96, -54, -34, 19, 65, 15, 46, -19, 7, -92,
+    -8, 99, 37, -22, -37, -71, 71, -11, 0, 12, 50, -14, -3, 13, 30, -43, 64,
+    -33, 5, -45, -72, -10, -95, 24, 25, 20, -46, 78, -58, 54, -91, -52, 36,
+    6, -30, 47, 44, 10, -18, 67, 26, 19, -80, -88, -84, -53, 57, 63, 38, -3,
+    83, -7, -87, -41, -60, -54, 84, 26, 34, 97, -11, -53, 37, 12, -30, 43,
+    20, 37, -76, 56, -41, 4, -49, -94, 12, -91, 19, -72, -85, -82, -19, 11,
+    60, 31, 82, 86, -29, 62, -38, -5, -53, 94, 44, -9, -70, -27, 22, -54,
+    -65, -46, -6, -21, -70, -61, -2, -17, -91, 21, 95, 74, 92, -51, -58, -90,
+    20, -62, 37, 8, 73, -93,
+  -49, -29, -68, 64, -49, 95, 77, 37, -89, 61, -62, 21, -28, -8, -79, -62,
+    -26, 8, 92, 6, -88, 66, 86, 36, -34, 84, 57, 92, 9, -71, -3, 30, -99,
+    -70, -30, -47, 60, -64, -62, -95, -23, -17, 20, 16, -74, 28, -91, -69,
+    -19, 72, -65, -73, 71, 78, -22, -73, 48, 95, -17, 7, -54, 5, -28, 6, -75,
+    -31, -53, -7, 36, -98, -52, 10, 19, 25, 37, -71, -54, 86, 90, -78, -27,
+    -43, 86, -10, 94, -4, -12, 20, -89, -81, 10, -45, 61, 53, -62, 96, 97,
+    -84, 8, 64, -63, 60, 52, 63, 20, 19, 28, -56, 24, 17, 71, -64, 73, -99,
+    38, -53, -71, -95, 55, -57, 61, -32, 85, -91, -70, -69, -61, -79, 90, 30,
+    -87, -42, -98, -24, -31, 84, 36, 84, 99, -48, 65, 70, 76, -58, 3, 59, 82,
+    -28, -88, -94, -1, -28, 47, 88, -77, 14, -97, 52, 80, 24, -9, -59, 88,
+    68, 25, -51, -63, -49, 14, -68, 85, -13, -84, 5, 95, -17, -81, -74, 1,
+    -55, 32, 98, 32, -77, -84, 91, -65, -64, -83, -74, 19, -9, -45, -94, -28,
+    -38, -88, -68, -55, -15, -16, 18, 52, -53, 69, -69, -81, -71, -97, -20,
+    -6, -2, -88, -11, 94, -11, 46, 91, 59, -5, -4, 94, 18, 81, 34, -30, -28,
+    -2, 12, 67, 40, -75, 39, 72, 13, -10, 28, -38, -76, 75, 91, 41, 92, -23,
+    -93, 39, -3, -93, -56, 90, -55, 53, -100, 20, 57, 24, 37, 57, 18, -1,
+    -46, -11, 8, -3, 77, 68, -27, 1, -74, -28, 71, -16, 85, -20, 4, -100, 16,
+    56, 63, -97, 48, -94, -11, 82, -60, -39, -45, -71, -58, -31, 19, -78,
+    -11, -51, -95, 20, 2, 6, -99, -58, -38, 12, -53, 84, 12, -36, -69, -27,
+    -3, -21, 81, -85, 70, 4, 24, -55, 5, 87, -21, -33, 3, -44, -25, 12, -1,
+    -100, 62, 17, -92, 46, -74, 44, -50,
+  -94, 46, 15, 45, 81, -44, 3, -46, 89, -59, -21, -12, 93, 70, 90, -13, -5,
+    52, 40, -93, 81, 47, -58, -26, 52, 15, -35, 93, -53, -21, 45, -8, -60,
+    69, -74, 75, -30, 1, 49, 19, -29, 98, -13, -40, 13, 57, -62, 97, -14,
+    -33, -78, -12, -31, -20, -51, -41, 79, 67, -38, -60, -28, 12, -86, -36,
+    -100, -99, 51, 44, 85, 78, 80, -5, -42, -52, -85, -2, -43, -27, -34, -98,
+    25, -58, -90, 10, 32, 25, -72, -65, 38, 66, 99, 32, 44, 79, 63, -67, -9,
+    -81, -87, 83, 74, 92, 26, 91, -21, 81, 79, -65, 5, 25, -64, 81, 28, -17,
+    93, -47, -95, 89, -9, 70, -92, -50, -98, -9, -99, -97, -65, 14, 97, 23,
+    24, 82, -67, -19, 26, 80, 44, 62, -75, 44, -89, 50, 51, 77, 4, -4, -99,
+    -49, -9, -90, 43, -38, 52, 68, 63, -84, -67, 0, -66, 75, -64, 25, 39, 52,
+    -75, -100, -94, 60, 13, 35, 84, -6, -68, 84, -18, -84, 32, -75, -61, -8,
+    87, -14, -67, 74, 74, -93, -63, -77, -97, 85, -76, -76, 25, 84, -24, -23,
+    -53, 67, 49, 95, -95, 46, -40, 93, -12, 68, 2, 61, 85, -27, 46, 3, 77,
+    -23, -93, 81, -99, -73, -35, -99, 39, -15, 46, 6, 93, -5, 16, 3, -92, 52,
+    93, 70, -44, 71, 23, -23, 70, 48, -32, 35, 85, 55, -52, -39, 1, 9, -69,
+    -81, 8, -72, 59, -47, 72, 44, -99, 84, 33, 99, 74, 96, 64, 4, 44, 33, 84,
+    93, -59, -92, 32, 56, -46, -23, -66, -75, -7, 38, -96, -60, 47, -29, -62,
+    56, 66, -78, -81, -15, -12, 96, 31, 73, 82, 30, 39, 46, 75, 49, -47, -58,
+    -35, -19, -43, -69, 53, 18, -12, 26, 31, 9, -44, 37, -2, -53, 13, 66,
+    -17, -18, 14, 36, 73, 94, 36, 36, -11, -62, 25, -92, 20, 17, -7, 63, 49,
+    72, 23,
+  13, -36, 22, -76, 41, -83, 1, -65, 64, 62, -62, -84, 7, 56, 76, 0, 39, 51,
+    93, -31, -23, -66, 55, 99, -30, 38, -99, 12, -5, 31, -25, 22, 6, 43, 18,
+    -32, -2, -72, -61, 37, -10, 36, 12, 46, -31, 77, 6, -99, -31, -91, -97,
+    94, -78, 87, 86, 54, 1, 50, 52, -93, -18, 5, 2, -50, 6, -57, -72, 63, 78,
+    19, -68, 32, 13, 96, -63, -76, -68, 42, -2, -36, -25, 37, -23, -24, -52,
+    -63, 9, -3, 32, -15, -30, 82, -10, -36, -62, 19, 57, -46, 40, 79, 7, 43,
+    64, -34, -20, -61, 66, -27, -63, -67, -32, 70, -77, -75, -33, 25, -76,
+    -48, -73, 60, 65, 36, 62, 49, -44, -62, -50, 70, 70, -6, -9, 3, 98, 32,
+    -50, 96, -40, 83, -17, -85, -90, -3, -28, -74, 29, -83, 65, -5, 83, 61,
+    17, -21, 84, -91, -27, 43, -72, 14, -62, -22, 38, 80, -60, -11, -68, 56,
+    -20, -45, -32, 22, -99, -1, 20, -9, 49, 99, -9, -100, 67, -89, 45, -43,
+    -52, 89, -21, 79, 27, 55, 57, -37, 29, 35, 69, -77, 32, 9, -30, -21, -23,
+    79, -38, -45, 20, 65, -68, 11, 49, -11, -26, -5, -18, -97, 88, 34, -63,
+    4, 79, 70, 59, 50, 86, 39, 68, -95, 63, 11, 47, 37, -28, -53, 31, -71,
+    -62, 88, 28, 90, 38, 17, 80, 33, 38, -64, -36, 34, 12, 54, -52, -7, -54,
+    79, -17, -53, 87, 70, -85, 56, 57, -83, 45, -46, 45, -51, -40, 34, 51,
+    -92, 96, -11, -51, 38, 72, -64, -76, -24, 24, -3, 16, -80, 45, -3, -60,
+    5, 34, -69, 56, -29, -22, -57, 55, -18, -21, -48, 31, -96, -45, -6, 34,
+    -19, 97, 83, -15, 76, -6, -74, -14, -66, 93, 11, 57, -67, -30, 24, 57,
+    -17, -32, -98, 62, -25, -34, -94, 57, -91, -72, -57, -80, 59, -43, 97,
+    27, -64, -36, 1, 2,
+  17, -75, 21, 65, -37, -99, -21, 17, -11, 61, 88, -35, -79, 14, -27, -18,
+    -91, 91, 26, 48, 5, -58, 45, 78, 52, -27, -90, -69, -56, -68, -35, -90,
+    59, -59, -75, -43, -81, -38, -33, -20, -49, -17, -3, 24, 57, -85, -59,
+    93, -87, -56, 89, 49, -79, 63, -56, -83, -96, 50, 25, 73, 27, -46, 70,
+    55, -83, -98, 86, -48, 69, -67, -62, 26, -97, 73, -22, 63, 76, -75, 2,
+    -72, 32, 51, -57, -39, 20, 44, -92, 84, 34, 55, -100, -68, -6, 68, 31,
+    -7, -86, 28, -84, 47, -79, 54, -43, 69, 58, -58, 87, -10, -12, 14, -29,
+    37, 24, 68, -93, -35, 75, -67, -4, 74, -89, 29, 56, -51, -1, -37, -90,
+    -91, -75, 14, 24, -30, -73, 65, -1, 53, 9, -16, 68, 40, -88, 91, -80, 71,
+    -59, -27, 64, 7, -2, -33, 79, 51, -79, 13, 85, 8, 18, 2, 79, 50, -8, 4,
+    -91, -62, 43, 4, 40, -83, 2, 78, -38, -53, -35, 5, 55, -5, 78, -60, -34,
+    -4, 22, -70, 43, -66, 89, -73, -45, 74, 17, -2, -42, 19, -55, 33, 59,
+    -33, -31, -8, -92, -100, -60, 90, 0, -48, -100, 87, -28, 95, -32, -57,
+    -76, 76, -95, -22, 16, -86, 23, 26, 45, 4, -3, 57, -48, -17, 19, -34,
+    -95, -83, 40, -40, 13, 74, -62, -88, -84, 67, -80, 40, 0, -9, 55, -62,
+    69, -39, 74, -41, -27, -58, 69, 47, 28, 79, -18, 40, 68, -57, 69, 56,
+    -54, 51, -85, -45, -76, 34, 65, -56, 35, -89, -66, 95, -86, 55, -92, -94,
+    -12, -20, -99, 51, -76, 57, 59, -87, 74, 7, -77, -24, -81, -77, -41, -19,
+    47, 18, -89, 11, 73, 59, 77, -82, 99, -97, 21, -96, 43, 97, -83, 93, 22,
+    -25, 21, -27, -26, 11, -58, -8, 49, -73, -89, -81, 13, -39, 30, 15, 73,
+    68, 98, -83, 45, -82, -81, 64, -26, -63, 89,
+  -15, -98, -90, -73, -78, 57, -99, 21, 21, 39, -42, -2, 60, 74, 4, -13, 90,
+    -79, -89, 86, -5, -94, -75, 48, 74, 11, -32, 62, -37, 91, -66, -41, 48,
+    67, 95, -89, -43, 9, 77, -63, -26, 42, -83, 7, 75, 19, -33, 63, 56, 67,
+    -15, -88, 66, 47, 55, -63, -48, 75, -28, 84, 50, 85, -28, -15, 10, 39,
+    -100, 98, -92, -11, 6, 44, 16, 81, -67, -1, 43, -73, 3, 73, 49, 33, -53,
+    3, 83, 20, 1, -39, -73, -86, -48, 40, 67, -33, 48, -91, 1, 44, -76, -92,
+    -41, 80, -10, -21, -57, 51, -78, -72, 16, 80, 80, -71, -21, -85, 77, 7,
+    -28, 32, 17, -56, -88, 26, 37, 61, 53, -60, -59, -39, -90, 85, -38, -84,
+    24, -17, -87, 31, 15, -74, -51, -52, -62, 71, -88, -14, 71, -23, 25, -61,
+    -92, -25, -17, -81, -34, 63, 87, -10, 56, -35, -51, 9, 59, 42, 46, -2,
+    -98, 0, 57, 8, 63, -29, 81, 0, 54, 77, -35, -30, -56, -9, 36, 88, -36,
+    84, -58, 63, 36, 76, -26, 33, 21, -87, 95, -19, -38, -37, -4, -82, 46,
+    -67, 58, 12, -33, 49, 62, -95, -55, -90, 69, 20, -73, 80, 15, 14, -8, 46,
+    -53, -93, 89, -3, -91, -83, -10, -52, 22, 17, 59, 90, 38, -67, -85, 0, 8,
+    -1, 13, -67, 81, 13, -61, 73, 64, -42, -19, -84, 12, 18, 47, 33, -19, 3,
+    -36, 87, -32, 93, -96, 91, 63, 51, -91, 4, -98, -77, -2, -48, 21, 24,
+    -88, 20, 91, -77, -42, 58, 89, 79, 79, 58, -12, 55, 36, 7, 13, 85, 90,
+    56, -84, -71, 38, 5, -14, -29, -87, 13, -12, -49, -18, -93, 87, -23, 88,
+    13, 24, 31, -83, -86, -31, -7, 75, 64, 72, 82, -36, -83, 54, 50, -73,
+    -43, -11, 26, -60, 36, -76, 12, -62, -44, 60, -25, 27, -64, 73, -74, -67,
+    92, 32, 82, 32,
+  53, 69, -42, -17, 56, 36, 87, -14, 1, -36, 83, 75, 71, 81, -92, -59, 61,
+    -45, -23, -68, -26, 29, 45, 70, -35, 29, 52, 86, 63, -55, -51, -8, 88,
+    -30, -6, -24, -12, 95, -6, -77, 85, 82, 46, -69, -24, -90, 65, -73, -47,
+    -99, 58, 67, 15, -21, 93, 22, 28, -20, -29, -48, -42, -98, -82, 74, 3,
+    -42, 6, 12, -44, -61, -68, 49, 2, -17, -78, -33, -26, -67, 74, 90, -68,
+    82, -89, 40, 15, -94, 58, -96, 12, 7, -76, 24, -26, -43, -51, -62, -78,
+    63, 2, 26, -21, -100, -21, -61, 60, 5, -20, -16, -78, -95, 59, -36, 71,
+    -41, 95, 33, -10, 87, 69, 69, -88, -11, 97, -39, -69, -35, -78, -18, 8,
+    49, 71, -10, -55, 77, -94, -77, -80, 39, 28, 28, -76, -64, 51, -81, 92,
+    -73, 73, 51, -78, -33, 12, -56, 14, 53, -50, -67, 91, 86, 63, 9, 0, -22,
+    25, -100, 81, -81, 57, 92, 5, 22, 44, 84, -84, -32, 91, 76, -65, -45,
+    -80, 79, 36, 95, -87, -34, 63, -62, 57, -76, -85, -73, 87, -99, -1, 13,
+    -54, -87, -24, -55, -34, -95, 13, -67, -85, -69, -84, 30, -29, 41, -85,
+    -41, -69, 62, -42, 40, -82, -55, -41, -90, 22, -57, 46, 61, 54, 73, 31,
+    57, -43, 45, 48, 34, -42, -47, -91, -82, 46, 68, -18, -19, 78, 16, -63,
+    -27, 71, -76, -55, -54, 31, 87, -99, -68, 48, 4, 42, 28, 14, 87, 73, -38,
+    30, 5, 67, 52, 71, -53, 40, -95, -52, 19, 68, 39, -56, 59, 19, 98, 47,
+    12, 90, -28, 23, 55, 34, 40, 86, -68, 3, 63, 73, 77, -16, 67, -36, -37,
+    13, 26, 4, -93, 1, 14, -61, -78, -71, 94, -86, 46, -91, -93, 14, -9, -42,
+    83, -98, -90, 0, -90, 27, 51, -81, -21, 98, -99, -18, -40, 58, 64, 80,
+    90, -85, 92, -66, 8, 54, 9, 15,
+  10, -59, 86, -3, -21, 13, 92, 31, -59, -26, 69, 82, 93, -16, -32, 2, -4,
+    -59, 86, -1, 10, -32, -51, 88, 17, -20, -62, -26, 74, 36, 99, 18, -90,
+    25, 90, 2, 86, 16, -77, -34, -88, -3, 10, -96, 37, 7, 97, -17, 98, 38,
+    31, -85, 37, -63, 54, -95, -63, -83, 90, -16, 71, -39, -29, 35, 45, 36,
+    -13, -73, -2, -94, -5, 76, -16, -39, 70, 41, -80, 41, 24, -68, -58, 10,
+    98, 1, -72, 10, 82, 30, -54, -82, -87, 79, 71, 6, -74, 72, -28, -16, -10,
+    -33, -86, 90, -1, 32, 22, 83, -98, 27, -69, 47, -91, 62, 46, 87, -55,
+    -77, -19, 20, 78, 73, -71, 75, 19, -93, -96, 98, 63, -41, 34, -97, 20,
+    -39, 5, -69, -73, -56, 94, -93, -78, 58, 66, 20, -16, -71, -78, 88, -81,
+    1, 69, 97, 53, -4, 24, -82, 11, -63, -58, 0, 49, 24, 50, -91, 8, 6, -79,
+    32, 72, -3, 62, 92, 35, -48, -87, -83, 90, 95, -36, -80, -7, 12, -85,
+    -27, 32, -70, -82, 4, 28, 65, 66, 66, 99, 5, -11, -20, -66, 56, 72, -28,
+    -72, -48, -72, -9, 44, 18, -28, 24, -84, -38, -14, -32, 90, 45, -7, -5,
+    -72, -46, 93, -55, -43, -15, 14, -99, -88, -29, -18, 63, 38, 82, -95, 50,
+    80, -41, 28, -40, 44, 72, 17, 48, -87, 61, 32, 75, -34, -65, -75, 38, 92,
+    38, -42, 88, 48, -59, -60, -39, 71, 13, 75, 25, 31, -50, 7, -51, 60, -93,
+    -60, 19, -33, 38, 43, -98, -70, 72, 56, -13, -71, -54, 68, 24, -46, 85,
+    47, 58, -30, 19, -92, 17, -72, -53, 44, 33, -36, -60, -15, -10, 44, 5,
+    19, 54, -12, -15, 35, 67, -9, 63, 60, 37, 46, -2, 63, 96, 83, -57, -58,
+    -68, -85, 76, 87, -93, -51, 18, 97, 82, -50, -13, 4, 96, 99, -87, 50, 29,
+    94, -31, -44,
+  -16, -34, 55, 0, 99, 79, 18, -98, 97, 8, 6, -74, -21, 17, 6, 28, -27, 54,
+    36, 85, -43, 18, 73, 94, 52, -14, 54, -21, 15, -92, -90, 13, -74, -9, 6,
+    -21, -37, -75, 5, -5, -81, -85, -73, -10, -72, 90, -29, 68, 87, -13, -45,
+    -14, -64, 4, -37, 42, -87, 97, 11, 49, 86, 40, -37, 7, 10, 11, -16, -85,
+    -54, 57, -13, -25, -17, 97, -56, -88, 98, -13, 42, -38, 27, -29, -87,
+    -34, 58, -49, 25, -32, 96, 56, -20, 6, -6, 85, -83, -36, -51, -80, -39,
+    53, -51, 11, -91, 40, 21, -22, 8, -69, 26, 26, -17, -30, -40, 76, -15,
+    -43, -55, 22, -67, -86, -77, 3, 74, -66, -64, -24, 54, -30, 12, 23, 20,
+    -16, -15, -77, 4, 2, 54, -57, 24, -94, -100, -7, -60, -41, 7, 69, -55, 8,
+    -32, 2, -46, 99, -51, 40, 85, -16, 92, -18, -46, -42, 72, 95, -64, -53,
+    23, -44, 71, 86, 30, -86, 75, -2, -67, -97, -65, 76, 8, -92, -59, -100,
+    -42, 34, -36, -39, 99, -33, -71, 16, -8, -15, -88, 12, -31, -26, 91, -59,
+    69, 65, 34, -94, 14, 0, 12, 75, -7, 1, -35, 21, 8, -59, -29, -77, -1, 56,
+    -63, -80, 31, 72, -83, 63, -42, 76, 4, 10, 33, 30, 20, -49, -8, -52,
+    -100, -43, 75, -21, 98, 62, -65, 60, 5, 54, 8, 89, 78, 60, -51, -4, -24,
+    16, 2, -9, 87, 45, -54, -95, -10, -9, -8, -96, 70, 93, -62, -67, -16,
+    -72, -69, 56, -43, -63, 1, 46, -94, -33, -4, -46, -33, -50, 15, 67, -79,
+    81, 94, -67, 38, 71, 0, 31, 66, 53, -90, 31, -81, -65, 81, -64, 7, -25,
+    55, 87, 79, -87, 19, -22, 22, 36, 21, -38, -61, -58, -70, 96, -93, 26,
+    62, 16, 4, 53, 39, -17, 35, 32, -42, 38, 9, -65, 6, -28, 54, -64, -23,
+    -94, 8, 19, 76,
+  17, -97, 2, -97, 2, 71, 86, -25, 71, 97, -67, -77, -27, -63, 59, -81, 25,
+    -59, -43, -38, 65, 98, 10, -63, -58, 66, 63, -88, 94, 59, 24, -29, -58,
+    -23, 74, 20, -44, 22, -92, -57, -10, -55, 36, 29, -9, 3, -41, 68, 82, 79,
+    -71, 80, -65, 5, -32, 73, -90, 50, 26, -61, 90, 22, -39, 45, -64, 64,
+    -80, -15, 85, -96, -42, 66, 50, -80, 38, 79, -40, 70, 44, -12, -78, -16,
+    45, 6, -55, 55, -56, -97, -89, -43, 42, 13, -32, -83, -61, -82, 71, 48,
+    5, -78, -35, -96, 13, -39, -41, -6, -68, 38, -90, 90, -86, 14, -55, -97,
+    -87, -4, 19, 68, -65, 72, 64, 21, -51, 25, -93, -35, -51, -41, -35, -74,
+    11, -5, 51, -52, -96, 26, -80, 21, -97, 0, 3, 13, -53, -53, 25, -63, -41,
+    -38, 79, -3, 47, 10, -26, 15, -83, 72, 90, -25, 11, -9, -82, -17, 71,
+    -74, -49, -67, -7, 41, 6, -21, 40, -12, 95, 79, -62, 41, 58, -19, -55,
+    -87, 28, 9, -24, -93, 18, -85, -92, 50, 55, 33, -74, -51, -25, 21, 95,
+    86, -66, 79, -32, -53, 95, -24, 64, 99, 50, 45, -68, -63, 12, -66, 29,
+    -11, 37, -70, -3, -62, -23, 48, 77, -17, -98, 72, -76, 47, 45, -16, 30,
+    12, 80, 66, -54, 89, -56, -24, 9, -52, 10, -17, 66, 53, -71, -65, 53,
+    -85, -31, 10, -1, 40, 65, -58, 8, 42, -66, 36, 93, 37, -47, 74, -16, 96,
+    77, -36, -80, -79, 18, -33, 89, -88, 35, 93, -53, 43, 39, 30, 4, 32, -86,
+    -5, -65, 8, -77, -6, 32, 30, -18, 44, -65, -47, 21, 3, 76, 8, -75, -45,
+    5, -54, -44, 56, 85, 11, -40, 58, -61, -78, -57, -99, -28, -88, -21, -35,
+    79, 86, 29, -14, 71, 21, 46, 58, -51, -76, 85, -44, 53, 52, 31, -25, 81,
+    -70, -71, 86, 71, 25, -3,
+  88, 65, 32, -33, -83, 93, 94, -46, -23, 62, 77, -77, 42, 0, -76, -20, 59,
+    -7, 59, -10, 88, -94, -69, -8, -34, 52, 36, -67, -62, -65, -83, 52, 53,
+    56, 83, 30, -8, -83, 88, 28, -98, 41, 17, 29, 7, -52, -80, -85, -13, 28,
+    -29, 81, 62, 10, -24, -44, 60, -82, 1, -91, -79, 35, -59, 66, 69, -48,
+    42, 22, 71, -21, 7, 9, 23, -58, 80, 29, -17, -54, 2, -25, -15, -31, -55,
+    -50, 77, 94, 15, 92, 15, -69, -60, -2, -79, -47, -47, 45, -31, 7, -39,
+    41, -3, -30, -75, -59, 18, -31, 44, 90, -79, -43, -30, -51, -80, -14,
+    -40, 45, -75, 99, 5, -98, 52, 88, -43, 26, -37, 47, -18, 72, -15, 68, 24,
+    96, -57, -60, -9, 61, -35, 97, 74, -38, -25, 81, -57, 46, -26, -6, 72, 2,
+    -57, 16, -74, 71, 47, -48, 85, -63, -21, -28, 82, 0, -76, -76, -7, 25,
+    -24, -83, 37, -87, -37, -53, 65, -50, -88, 59, -96, -42, 7, 18, 18, 18,
+    -99, -53, 16, 29, -89, 75, 72, -20, 25, -78, -5, 58, -48, 63, -21, -84,
+    68, 20, -11, -74, 93, 88, -78, 61, -78, -74, -43, 68, -100, -2, 93, 67,
+    4, -60, -52, -12, 83, -25, 22, 87, -17, 98, -58, -54, 94, -90, -61, -96,
+    -14, -66, -20, -32, 21, 78, 53, -100, 22, 1, -86, -64, -95, -44, -38, 75,
+    -87, -89, -72, 70, -95, 64, 11, -82, -10, -42, 85, 32, -49, -29, -2, -61,
+    -38, 20, 4, -7, 56, -68, 95, 22, -9, 39, 43, 16, -63, 45, -18, -30, 8,
+    13, 12, 65, -5, -87, -95, 46, 33, 54, 39, -62, -95, 31, 67, -17, -16,
+    -49, -59, 27, 44, 23, 85, -11, -32, 95, -21, 66, -84, -75, 91, 61, -93,
+    -80, 36, 28, -32, -35, -69, -93, 8, 18, 37, 77, 34, 82, -42, 75, 56, -46,
+    -37, -90, -33, 35, -25, -46, -66,
+  72, -93, 33, 65, -13, 6, -44, -88, 21, -33, 5, 21, 14, 20, -47, 75, -37,
+    94, -94, -27, -37, 74, 9, 94, 56, 91, -39, 0, 81, 3, -82, -96, -93, -32,
+    -100, 97, 50, 93, -9, 13, -37, -88, 39, -31, -100, -38, 98, -57, -82, 88,
+    -11, 96, 21, -90, -89, -8, -24, -43, 3, 71, 1, -32, -40, -78, -52, 42,
+    -84, 18, 41, 13, 59, -86, 17, 2, 64, -50, -89, 41, 71, 23, 84, 38, 90,
+    -43, -100, 9, 26, -24, -36, 55, 98, -90, -35, 12, 33, 20, 63, -16, 89,
+    -9, 68, 90, -28, -68, -47, 78, -44, 83, -12, -12, 51, -29, 33, -53, 8, 4,
+    -91, -58, 9, -35, 80, -2, 20, -16, -51, 73, 75, 90, -58, 93, 37, -75, 92,
+    44, -56, 47, 88, -3, -83, 45, 30, 41, 20, -14, 97, -3, -32, -97, -85,
+    -88, 50, 2, 4, 64, -55, 86, 1, -53, -89, 55, -29, 5, -76, 6, -25, -10,
+    -70, -77, 30, -19, 1, -20, 75, 16, 11, 41, -21, 72, -99, 33, -64, 45,
+    -95, 82, -81, 55, -65, -60, -86, -30, 65, 5, 95, -67, -60, -52, -79, 39,
+    -4, -91, 54, 75, -87, 8, -12, 15, 10, 56, -86, -97, -23, -68, -8, -77,
+    65, -93, 30, -50, -64, -16, 69, 12, -32, -50, 95, -34, 25, 55, -85, -98,
+    69, 88, -72, 65, -38, -38, 19, 67, -10, -80, 52, 41, -22, -67, -59, -98,
+    -86, 62, -54, -81, 82, 73, -28, -11, -55, -2, -37, -3, 46, -66, 2, 16,
+    -64, -72, -76, 4, 44, -98, 5, -26, -42, -86, -99, 62, 32, -93, -38, -46,
+    -67, 38, 43, 49, -55, 40, -86, 40, -46, 49, -29, 34, -85, 62, -34, 60,
+    53, -33, 70, -50, 24, -48, 36, -71, 78, -39, 64, 28, 93, 84, -66, -31,
+    25, 85, -50, 38, -82, 14, 68, -94, -47, -61, 85, 86, -6, 87, 68, 73, 92,
+    92, 62, 86, 25, 56, 55,
+  -33, -45, -63, 80, 95, 79, -37, 7, 80, 68, -95, -3, 90, 94, -50, 53, -63,
+    -66, 53, -61, 6, 38, -94, 55, -57, -72, -72, -66, 30, 5, -42, -47, 18,
+    86, 3, 62, -93, -8, -74, 19, 2, 28, 76, 96, 26, 82, -74, -50, -39, 71,
+    19, -63, -63, 71, 74, 12, -50, 79, -70, -95, -35, 10, -6, 92, -7, 38, 51,
+    -36, 5, -40, -42, -73, -84, 18, 84, -49, 24, 65, -92, 77, 72, 14, 22, 78,
+    -85, 26, -59, -93, 35, 65, 5, 52, 89, -34, -48, 35, -37, -1, -48, -18,
+    81, -8, -31, -10, 26, 87, -2, -91, 47, -40, 30, 48, -82, -22, 50, 90, 25,
+    81, 23, -80, 29, -25, 44, -92, -25, 3, -50, -61, 87, 20, -84, -94, -55,
+    -34, -85, 14, 90, 72, 98, 14, 88, -42, 91, 59, -81, -39, -52, 34, -9, 97,
+    2, 21, 75, 63, -26, -4, -70, 82, -41, 40, 38, -13, 52, -1, 17, -35, 42,
+    5, 42, -1, 57, 14, -36, 68, 68, -99, 27, 11, -62, 84, 86, 60, -55, -62,
+    12, 79, 90, -79, -32, 30, -97, 79, 78, 50, 89, 74, -7, 25, 29, -97, 27,
+    43, -23, 33, 89, -84, -93, 91, -51, -96, -25, 8, -71, 26, 54, 53, 94,
+    -51, 13, -1, 70, -21, -11, 77, -66, -63, 12, -87, -3, 76, 56, 80, -23,
+    -83, -99, 33, -74, -12, 34, -14, -59, 77, -43, 46, -45, 87, -68, -16,
+    -71, 60, -99, 12, -11, 36, 8, 51, 47, 18, -94, 35, -94, -5, -67, -33, 11,
+    35, 40, -67, -52, 28, -34, 80, 86, 28, -88, -72, 34, -31, -13, -20, 38,
+    30, -80, 37, -37, 28, -44, -73, 31, 2, -28, -66, 59, -83, 57, 55, -59,
+    25, 91, -26, 40, -58, 18, -75, 22, -1, -2, -22, -72, 14, 62, -25, -80,
+    -22, -54, 51, 50, 63, -37, -8, -67, 81, 93, -18, 83, 59, -26, -74, 44,
+    59, 40, -40, 39,
+  -97, -8, -25, -21, 12, -63, 93, -21, 72, -78, -25, -49, -70, -76, 84, -4,
+    -4, 2, 9, 90, -68, 22, 54, 33, 89, 73, 46, 8, 55, -65, -44, 86, -99, -44,
+    25, 23, -29, -8, -5, 82, -50, -3, 42, -69, -83, -89, 92, 13, -80, 52, 97,
+    -10, -16, 50, -73, 36, -66, -36, 74, 38, -65, 84, 82, 8, -65, 36, 76,
+    -80, 3, 80, -41, 84, 3, -53, 81, 26, 51, 96, -75, 45, 19, -94, -28, -99,
+    46, -99, -13, 96, 98, 52, -4, -33, 80, -35, -44, 40, 26, -64, -88, -39,
+    45, 49, -91, 43, -27, -39, 2, -7, -62, 51, -27, -33, 62, -69, -55, -49,
+    83, -71, 74, -9, 27, -17, 52, -17, 7, -19, -84, -32, -43, 66, 49, -56,
+    12, 42, 43, 75, -3, 75, 87, 13, 44, 18, -59, 75, 68, 55, -7, -30, -46,
+    -13, 24, -48, 55, 89, -69, 8, 85, 56, 63, -58, 47, 12, -91, 62, -42, -99,
+    -29, 14, 78, 46, 13, 11, -69, -9, -22, 38, -81, 4, 31, -16, 34, 58, 72,
+    -60, 46, -92, -40, -46, -24, 45, 65, 32, 7, -32, -64, 53, -82, 92, -22,
+    -52, 12, 53, 47, -69, 16, 67, 5, -89, 80, -36, 34, -64, -3, -58, -11, 65,
+    70, -33, -36, 25, -90, 68, 47, -64, 31, -1, -99, 27, 86, -22, -99, 43,
+    50, -67, 73, -40, 61, 27, -96, -18, 61, 23, 6, 68, 57, 96, 55, -15, -25,
+    -43, 24, 40, -92, 50, -18, 36, -9, -14, 88, 3, -97, -52, -9, -49, 39, 86,
+    63, 88, -100, 46, 70, 90, -56, 5, 5, 92, -55, 62, 68, -19, 61, -16, 6,
+    33, -28, -35, 12, 99, -98, 0, -45, 61, 63, 84, 56, -26, 42, 37, -68, -12,
+    -62, -14, -58, -90, 88, 5, -71, 60, -53, -86, -29, 41, -51, 77, 66, -31,
+    22, -31, -14, 97, -73, 63, -30, -28, -23, -56, 43, 30, -34, 61, -32, -16,
+    -57,
+  88, -97, -8, 96, 95, -7, -55, 98, 1, -17, 73, -85, -97, -21, 66, 2, 68, 61,
+    30, 15, 90, -78, 98, 36, 19, 98, 76, -18, -13, 75, 81, 5, 86, -51, -2,
+    -80, 48, -90, 54, -71, 57, 43, -95, -13, -82, -87, -93, -44, 55, 66, 65,
+    -57, 36, 49, 97, 73, 39, -31, 59, 97, 31, 60, -100, 43, 70, 69, 80, -40,
+    62, 95, 62, 61, 42, -7, -9, -67, -11, -36, 8, -48, -13, -93, 35, 16, 74,
+    1, -90, -68, -14, -20, -17, 66, -57, -62, -70, 91, -77, -97, -5, 34, -84,
+    94, -77, 77, -37, 13, -54, -3, -20, -77, -61, 98, -29, 46, 43, -30, -60,
+    -48, 1, -73, 10, 5, -38, -88, -86, -96, 79, 67, -26, 19, -100, -97, 32,
+    -39, -24, 7, 78, -53, -38, -10, 86, -71, -2, 47, 0, -7, 76, 36, -62, -67,
+    36, 24, -21, -8, -39, -53, -6, -88, -52, -8, -61, 26, -35, -11, -61, 39,
+    39, -49, 29, 46, 92, 92, -29, 9, -20, -18, 85, 29, 9, -11, -83, 31, 34,
+    -60, -10, 53, -36, -52, 70, -21, 39, -95, -16, 47, 84, -10, 35, 22, -63,
+    76, 48, -98, 26, -26, -77, 52, -15, 60, 48, 47, 83, -53, -32, -83, -19,
+    39, -6, -11, -91, -48, 42, 75, -18, -58, -56, 93, -64, 62, -19, -44, 55,
+    74, 20, 8, 32, -21, -94, 32, 99, -77, 59, 99, 6, -69, -35, -89, 71, 93,
+    -74, -87, 1, -52, -9, 62, 15, 57, 42, -60, -62, -23, 87, -86, -40, 77, 3,
+    3, 28, 70, -86, -82, 2, 81, -1, -89, -18, -1, -93, -11, 55, -78, 84, 37,
+    -83, 10, 27, -53, -40, -58, -25, 13, 91, 21, 21, 19, 23, 50, 81, 18, 51,
+    96, 6, 14, -10, 30, 25, 67, 32, -48, -91, -9, 50, -44, -10, 60, -18, -5,
+    -72, -68, 62, 83, 19, 46, 70, 90, 49, 59, 12, -68, -19, -3, -27, -32, 29,
+  -40, 25, 56, -90, 69, -98, 64, 12, -71, -5, -80, 52, -44, -23, -90, 75,
+    -14, -40, 93, 53, 41, -15, -84, -14, 24, -65, -42, 22, -12, 42, -42, 72,
+    30, 81, -98, 36, 57, 94, -80, -13, -35, 8, 84, 57, -64, 54, -91, -46, 78,
+    24, -6, 37, 55, 92, 97, 78, -7, -13, 88, 43, -1, 6, 32, 61, -40, -34, 91,
+    -30, 82, 41, 15, -81, -99, -86, -20, -27, 47, 25, 86, 87, 0, -88, 88,
+    -72, -9, -15, -57, 25, 65, 66, -30, 69, -81, -73, -92, 22, 35, 62, 11,
+    36, -35, -69, 6, 54, 20, 99, 65, 20, 12, -6, 95, -54, 59, 2, -45, -29,
+    -4, 87, 73, -87, 4, 68, 46, -93, -74, -8, 54, 41, 24, 78, 41, -55, -55,
+    38, 30, -97, -73, 85, -65, -9, -27, 63, -85, -58, -62, -60, 91, 84, 31,
+    72, 46, 65, -45, 48, -86, 53, 47, -37, 88, -5, 97, -62, 31, -38, 62, 64,
+    -1, -77, 99, 19, -71, 25, 45, -69, -51, -92, -55, 65, 5, 93, -44, 98,
+    -40, -72, 54, 97, 80, -20, 50, 14, 35, 83, 67, -12, -77, -29, 59, 2, -32,
+    4, 10, 10, 92, -54, -43, 66, 33, 36, -8, 60, -49, 13, 21, 1, -89, -39,
+    31, 49, 82, -31, 39, 42, -4, -61, 94, -52, -24, -97, 91, 87, -16, -89,
+    -98, -54, -9, 88, -94, 10, -18, -28, -6, 43, 91, -54, 40, -16, 30, 98,
+    52, -65, 43, -6, 26, 40, 88, -41, 66, -57, 48, 9, 91, -37, 42, -12, 93,
+    21, -73, 4, 74, -57, 43, -85, -25, -31, 78, 69, -50, 10, -68, -6, -40,
+    -26, 19, -50, 82, -87, -27, 55, 1, -81, -69, -84, 10, 3, -67, 44, 85, 47,
+    -63, 55, 34, -9, 35, -5, 18, -1, -93, -5, 73, 0, 15, 95, -37, -27, -41,
+    -57, 54, -84, -55, 56, -25, -66, 14, 3, 15, 97, -87, 58, -65, -72, 23,
+    -21, 97,
+  -29, -76, 35, -21, -78, -68, -4, -97, -26, -70, 54, 34, 5, -32, 43, 40,
+    -59, -42, 66, 22, -36, 59, 94, -33, -6, -41, -73, -34, 10, -59, 95, 85,
+    54, -100, 84, -90, 44, -66, -42, -28, -18, 10, 96, 56, -34, -36, -13,
+    -81, -11, 48, 47, 37, 73, 83, -68, 27, -8, -19, 97, 92, 96, -65, 64, 1,
+    -81, 20, 33, -6, -19, 38, -81, 91, 82, 98, -42, -30, 43, 42, -87, -58,
+    -75, 89, 61, -24, -84, 83, 23, 20, 5, 12, 84, -93, 24, -25, -47, 67, 38,
+    -6, 87, 40, 12, -56, -50, -27, 2, -87, -57, -3, -42, 59, -70, -72, -96,
+    -75, 53, 81, -36, 44, 82, -24, -51, -14, 81, 58, -31, 27, 55, 40, 42, 39,
+    23, -15, 62, 2, -3, -59, -76, -95, 21, 18, 84, -31, 3, -4, -1, -80, 94,
+    79, 17, -94, -39, 59, -72, -40, 48, -94, -58, 98, -86, -11, 33, 88, -15,
+    99, 75, -93, -88, 43, 70, -30, -42, 52, -79, 71, -98, 36, -37, -83, -98,
+    69, 57, 12, 74, -73, -21, 48, 66, -75, 99, 61, 59, 98, 39, -25, -71, 26,
+    -8, 35, -65, 0, -69, -44, 21, -95, 32, -19, 42, -100, -22, -77, 24, -39,
+    57, -38, -33, 3, -46, 74, 44, 50, -45, -53, 49, 48, 91, 54, 95, 43, -57,
+    98, -48, 84, -70, 40, -78, -6, 77, -59, -52, 69, -54, 84, -20, -37, -1,
+    -100, 25, 27, 49, 43, -9, 23, -86, -14, 39, -32, 98, 54, -75, 95, -43,
+    94, -38, -47, -83, 83, -7, 45, 27, 43, -24, 12, 21, 69, 75, 94, 15, -49,
+    -93, 32, 4, 35, 19, 86, -1, 59, 43, -43, 13, -1, -93, 12, -52, -48, -39,
+    81, -100, -55, 38, -49, -86, -89, 80, -39, 11, -75, -31, -72, -61, -71,
+    -32, -12, 86, 91, -50, -87, 54, 18, -56, -28, -31, 3, 18, 67, -30, -51,
+    -14, 0, -84, 33, 21, -99, 98,
+  12, -96, 74, -40, 91, 13, -88, -78, 31, 99, 9, 39, -68, -6, -7, 72, -32,
+    -22, 74, 68, 14, 48, 30, -61, -18, 34, -16, 29, -19, -12, -36, -93, -95,
+    76, 60, -73, -21, -63, 76, 39, -37, -52, 62, -34, 15, -43, 72, -1, -83,
+    -94, -66, -52, 7, 21, 24, -44, 70, -62, 57, -60, -38, -52, 35, 65, -33,
+    -87, -18, -50, -22, -5, -30, 3, -33, -14, -53, -98, 15, 1, -98, -100,
+    -100, -70, -39, -36, 66, -85, 24, -43, -5, -42, -1, 74, -90, -86, -71,
+    -55, 16, -64, 21, 66, 34, -43, -98, -66, -92, -46, 24, -79, 88, 51, 73,
+    -59, 47, -58, -97, -64, 92, -52, -93, -22, 18, 97, 19, 71, -85, -69, 35,
+    -58, -57, -64, -21, -59, -98, 57, 41, 94, 8, 59, -85, 0, 67, -18, 61,
+    -17, -44, 59, -75, -58, 10, -67, -37, 98, 22, 0, 57, -79, -57, -93, 96,
+    33, 69, 12, 5, -20, -70, 17, -52, -63, -60, 77, 19, -42, 76, -2, -49, 18,
+    85, 25, -69, 62, 62, 97, -80, 27, -34, -64, -96, 32, 41, -9, -76, -74,
+    46, 51, -69, -52, -73, -56, 70, -67, 50, -86, -8, 57, -12, 27, 47, 15, 0,
+    93, 62, -72, -80, -95, -62, -55, -92, -47, 58, -92, -76, 87, 73, 76, 23,
+    21, 2, -20, 46, 97, 64, -59, 25, 37, 19, -37, -86, 15, -51, 19, 85, -8,
+    -23, 43, -13, -97, -62, 64, 70, -97, -17, -82, 32, 59, -19, -56, 91, -22,
+    -24, 3, -96, 36, 82, -100, 34, 7, 85, 78, -60, 97, -92, -99, -74, -86,
+    49, 80, 6, 65, -40, -1, -3, -38, -60, -25, 31, 28, -71, 85, -80, -32, 97,
+    -59, 47, 64, 62, 80, -19, 66, 22, -73, 72, -35, 51, 38, -88, 75, 97, -19,
+    49, 51, 5, -11, 18, 99, 76, -42, 13, -84, -57, 39, 4, 71, 70, -22, 0, 84,
+    -76, -100, -85, -10, 37, -75, -32,
+  -37, 70, 8, -88, -17, 48, 36, 82, 70, 95, 95, -27, -51, -28, 52, -37, 83,
+    54, -55, -48, -42, 6, -75, 13, 2, 29, -55, 95, 27, -66, 38, 3, -97, 40,
+    90, 80, 31, -52, -52, -12, -41, -79, 14, 21, 11, -11, -21, 48, -7, -17,
+    79, -10, -17, -12, -43, 31, -75, -10, 55, -61, 8, 95, 7, -78, -20, -77,
+    -5, 66, 73, -2, 10, 33, -66, 95, 69, -77, -17, -18, -4, -7, 53, -58, 64,
+    -98, 9, 57, -38, 70, 75, -95, -72, 88, -76, -15, -17, -40, -95, -51, -30,
+    -84, -48, 49, -78, 67, 4, -82, -36, 98, -36, 18, 53, -49, 26, 15, -4,
+    -82, -55, -43, -99, -9, -16, -47, -17, 38, -14, 90, 1, 87, -65, 50, -44,
+    -46, -15, -14, 76, 7, 42, 7, 23, 72, 10, -83, -55, 18, 30, -63, 78, 5,
+    -55, -94, -40, 73, -64, 9, -100, 2, -51, -35, -87, 9, 68, -14, 96, -52,
+    76, -45, -33, -70, 47, -53, 61, -55, 46, 51, -65, 74, -9, -85, -16, 12,
+    19, 68, -26, -90, -10, 3, -97, -49, -67, 91, 96, 31, -8, -53, 39, 69,
+    -34, -9, -56, 52, -81, 38, 75, -55, -69, 2, 72, -55, 39, 94, 70, -89,
+    -80, -54, 33, -20, -80, 10, -21, 43, 44, -58, 28, 54, 48, 85, 36, 81,
+    -17, 94, -58, 36, -74, -76, -69, -50, -100, -54, -51, 39, 7, -77, -23,
+    -54, 79, 85, -85, -96, -21, 47, 40, -32, 32, -7, -69, -51, -46, 39, 87,
+    -79, -49, -19, 30, -11, 31, 2, -64, -17, 44, 44, -45, 59, 91, 31, 51,
+    -63, -48, 38, 70, 89, 90, 66, 19, 26, -43, 80, -46, -69, 71, 78, -38,
+    -45, 94, 95, 43, 48, -74, -6, 23, 62, -50, -90, -19, 74, -81, 87, -81,
+    69, -74, -19, -100, 85, -24, 32, -20, 22, -56, -87, 40, 55, -36, -33,
+    -20, -30, 4, -18, 4, -71, -88, 42, 80, -46, -48,
+  7, -17, -100, -54, 20, -86, 25, -83, -83, 44, -50, -49, -18, -45, 15, 81,
+    21, -23, 44, -16, -39, 21, 39, -74, 53, 34, 57, -94, 19, -66, -60, 81,
+    -82, 7, 84, -91, -82, 29, -77, -11, 9, 48, -24, 13, -10, 56, 63, 44, 13,
+    48, 55, 92, 23, 67, 88, -77, 73, 5, 99, 50, -90, 79, -12, -23, 18, -72,
+    -52, 36, -90, -52, -23, -23, 62, 55, 15, -64, -52, -92, -34, -17, 29, 45,
+    58, 17, 26, 57, 30, -70, -68, -81, 90, -70, 8, 15, 43, -30, 99, -37, -86,
+    -65, -4, -24, -29, -31, 53, 39, 86, 92, -39, -42, -84, -58, -6, -64, -88,
+    16, 77, 51, -18, 17, -68, 12, -26, 51, 53, -98, -49, 34, -53, -82, -57,
+    29, 77, -8, 35, -92, 35, 99, 96, 6, -91, 88, 64, 24, -52, -82, 15, -77,
+    -82, 70, 7, 18, -15, -31, 75, -92, 91, 22, -32, -5, 58, -21, -34, 36,
+    -76, -61, -34, 71, -89, -5, 78, -1, -5, -17, 8, -13, 56, 92, -81, 12, 52,
+    -47, 95, -13, 91, 15, 8, -52, -20, 8, -37, 11, -63, -62, 9, -65, -95, 34,
+    -80, -2, -53, 82, -21, -15, 35, -36, -22, 45, -79, 37, -55, 0, -58, 3,
+    68, -36, 58, 94, 16, -24, 67, -99, 39, 69, 65, -34, 98, 44, -87, 32, 24,
+    -9, 81, -66, -42, 63, -11, -99, 68, 59, -96, 43, 58, 48, -32, 79, -73,
+    -17, 40, -16, 50, 27, 78, 93, -14, 28, -82, 75, 62, 47, -44, 27, 72, -74,
+    -78, -65, -29, 64, -51, 61, -91, -69, 3, -62, 82, -67, -65, 17, -91, -76,
+    57, 68, 97, -38, 69, 9, 73, 19, 88, 65, 16, -75, -21, 42, 77, -47, 71,
+    14, -45, -71, -14, 3, 50, -84, -29, 66, 26, 19, -70, -3, -1, 62, 36, 7,
+    91, -71, -29, 75, 80, -4, 96, -79, 84, 53, -85, -84, -19, -20, 63, 22,
+    80, 38, -73,
+  84, -42, 26, -32, 20, 80, 41, 67, 10, -66, 98, 15, 92, -57, 69, -28, -87,
+    -37, 65, -53, -15, -73, -88, 97, -34, -52, -60, -72, -62, 61, -37, -15,
+    -61, 46, -39, -47, -31, 11, -38, -81, -5, 82, -34, -27, 25, 38, -59, -50,
+    32, 53, 81, -50, 1, 80, 82, 11, 80, 19, 41, -22, 78, -41, -49, -35, 7,
+    -92, -1, -55, -18, 34, 45, -71, 44, 35, 72, 0, 72, 76, -22, -29, 41, 96,
+    -25, -24, -10, -69, 40, 65, 93, 80, 40, -53, 7, -32, 34, -1, 85, -91, 7,
+    40, 22, 31, -93, 44, 82, -78, 18, 23, -84, -60, -23, -32, 67, -98, -79,
+    -54, -70, 49, -70, 29, -33, -42, -25, -37, -41, 30, 88, -62, 53, 0, -17,
+    22, -36, -65, 30, 45, -20, 41, 38, -34, 45, 87, -3, 28, 89, 51, 57, 27,
+    -67, 49, 60, -98, 5, 61, 8, 73, -46, 15, 18, 32, -92, 23, -67, -78, -89,
+    -68, 45, -20, -86, -81, 76, 30, -97, 12, -100, -78, 87, 5, -75, 52, -49,
+    81, 61, 31, 48, 90, 58, -59, -1, 85, 68, -17, -83, 40, -94, -28, 98, 93,
+    -16, -28, -77, -29, -39, -22, -21, -45, 55, -9, 68, -9, -83, 78, -57, 34,
+    27, -55, -31, 6, -77, -100, 13, 81, 56, 54, -31, 9, -13, -88, 73, -100,
+    28, 12, 60, -62, 27, -53, 19, -86, -30, -78, 72, 49, 29, -96, -12, -20,
+    -82, -52, -39, -50, -7, -90, -26, -52, 90, -12, 22, -41, -98, 4, 41, -5,
+    -57, -10, -27, 79, 24, -7, 7, -12, -20, 89, 27, -93, 73, -10, -41, 42,
+    -6, -75, -73, -35, -42, -26, 7, 11, 33, -54, 69, -73, -30, 4, -14, -37,
+    72, 35, 76, -68, -18, 10, 44, 2, 25, -48, -91, 92, -20, 61, -11, 55, -20,
+    4, 54, -44, -39, -14, -40, -63, -83, 48, 68, -64, 57, -36, 10, 3, -26,
+    90, 24, 40, 7, 4, 58,
+  -100, -26, 7, -64, 84, -83, 1, -76, 90, 48, -21, -85, -61, -25, 62, 74, 48,
+    24, -18, 96, 2, -20, -63, 33, 42, -26, -39, 62, -62, -64, 63, 39, 63,
+    -47, 72, -58, -1, -90, -56, -7, -99, -40, -82, 24, -58, 5, 93, 64, -5,
+    94, 90, 90, -19, -46, 89, -90, 92, 33, 6, -12, -23, 50, 30, -77, -33, 43,
+    38, 23, -11, -30, -94, -9, -10, -93, 88, 21, 84, -87, -93, 26, 33, -99,
+    -34, 55, 15, -60, -36, 62, -51, -12, -93, -37, 53, -31, 35, 44, -82, 57,
+    4, -93, 40, -53, -47, 85, -16, 26, 53, -9, -94, 42, -16, -53, 93, -50,
+    -89, -21, -45, 83, 91, -12, -27, -75, 52, -15, 82, 33, 6, -43, -50, 44,
+    35, 24, -22, 59, 58, -72, -58, 16, -14, 39, -6, -83, -20, -65, -89, 49,
+    49, 68, -92, -30, 33, -54, -11, -9, 59, 7, 89, -18, -79, 26, -71, 4, 87,
+    -46, -64, -77, -55, -96, -50, 47, 2, 17, -7, 46, 47, -76, -94, -74, 65,
+    45, -98, 91, 0, 13, 33, 76, -100, -34, -78, 95, 78, 20, 74, -35, 27, 71,
+    16, 95, 92, 3, 17, 11, 58, 99, 13, 22, -35, 5, 37, 90, 75, -16, 13, -31,
+    -60, 64, 53, -72, 47, 11, -30, 85, 36, 51, -62, 8, 55, -74, -61, 17, 0,
+    34, -42, -66, 53, -99, 25, -55, -10, -64, 39, 3, 61, -28, 18, 69, 72, 21,
+    -59, -5, 52, -52, -97, -15, -41, 63, -45, -20, 43, -2, 49, -28, -33, -87,
+    30, 5, -41, -74, -71, -21, -63, 19, -74, 95, -66, 86, -2, -53, 55, 47,
+    91, 89, 81, 90, -96, -37, 40, -29, -37, -36, 97, 66, -8, -17, 79, 63,
+    -51, 30, 31, 35, 91, 81, -87, -30, 17, -54, 58, -35, 32, 70, 51, -27,
+    -67, 58, -52, 31, 33, 97, 84, 1, -80, -37, -7, 20, -4, -1, -25, -42,
+    -100, 31, 36, 40, -94,
+  9, -79, 71, -45, 84, 32, 15, -83, -16, 29, 80, 15, 57, -20, 26, 35, -61,
+    -57, 91, 44, -44, -11, 65, -69, 70, -68, 21, -79, 92, 99, 58, -93, 99,
+    41, -87, 69, -85, 77, -42, 95, 35, 56, 24, 61, -11, -74, -28, 8, 21, -50,
+    -18, 91, -84, -52, 90, 49, 23, 64, 82, 28, -33, 65, -22, 73, 17, 57, -92,
+    -86, -95, -96, -65, -74, 93, 64, 0, 73, -85, 98, -24, -53, -17, -99, -14,
+    -83, 60, -47, 29, -32, 43, 73, -62, 3, -85, 30, 49, -54, 39, 28, -33, 16,
+    -57, -8, 46, 67, 25, 26, 95, -52, 64, -65, -16, 43, 1, -33, -39, -47,
+    -95, 6, -96, 25, 87, 97, -3, -90, -31, -34, 14, 96, -96, -17, 49, 8, -80,
+    -5, -87, -86, 33, -60, -38, 11, -75, 24, -24, 78, -41, 9, 54, -5, -99,
+    24, -80, 71, -33, -88, -54, -40, 33, -99, 54, -4, -89, -53, -28, 25, -17,
+    21, 94, 75, -100, -93, 41, -26, -91, 6, 20, -67, -82, -29, -67, 70, -64,
+    -36, -56, 25, -58, -32, 84, -45, -89, 92, -53, 87, -68, -1, 61, 55, -19,
+    51, -5, -77, 17, -91, -3, 1, -82, -98, -34, -30, 95, -8, -46, -40, -99,
+    80, 71, -23, 96, -6, -12, 51, 25, 86, -57, 85, -56, 60, 16, -36, 35, -68,
+    -98, 44, 12, 79, -49, -78, -98, -59, -83, -7, -79, 13, 16, 99, 43, -2,
+    39, -94, -83, 19, -87, 62, -10, 54, 89, 0, -31, 80, 90, -94, -46, 14,
+    -15, -56, -64, 0, -17, -26, 94, 85, -66, -44, 73, -3, 5, 76, -89, -67,
+    35, 56, -9, 98, 40, -44, 44, 89, -71, 75, 18, -46, 96, -11, -35, 90, 45,
+    -32, 89, -71, 80, 33, -76, -67, -3, -65, -45, 33, 5, -25, -37, -37, 95,
+    -100, -88, 72, -8, -59, -97, -8, 17, -5, 25, 15, -9, 47, -10, 55, -75,
+    -43, 48, 48, -31, 40, 45,
+  6, 86, -79, -52, 43, 57, 29, 68, -53, 9, 20, -39, 71, 36, 42, -30, 80, -52,
+    -60, 4, 43, 36, 45, -79, -58, 69, -11, 78, 31, 96, 56, -60, 18, 22, 73,
+    97, -66, 28, 48, 68, -19, 70, -56, 82, 54, 91, 2, 24, -69, -49, 23, 23,
+    -29, -80, -8, -27, 5, -54, -6, -88, -57, -73, 87, -29, 62, -56, 32, -34,
+    -7, -47, -49, -15, 52, 69, 40, -73, 42, -92, -10, -15, -22, -32, 5, 93,
+    13, 40, -23, 40, -82, -49, -53, -72, -75, 5, -56, 84, -67, -8, -93, -10,
+    -78, 4, -81, -73, -2, -39, 29, -69, -60, 26, -66, -65, -32, -80, -62, 30,
+    -5, -93, 7, -41, 75, 58, 94, 84, -39, 42, -96, 84, 45, -31, 24, -11, 5,
+    55, 75, -54, 25, 63, 85, 51, -34, 58, -44, 48, -67, -59, 81, -44, 22,
+    -71, -28, -58, 83, 17, 14, 90, 49, 6, 38, -43, 75, -20, -67, 66, -43,
+    -23, 45, 96, -45, -84, -54, -68, 19, 45, 28, 36, 61, -99, 68, 24, -8,
+    -34, -77, 56, -34, -88, 73, -79, 26, -43, -88, 43, -20, -55, 51, -24, 36,
+    3, -36, 18, -41, -52, -81, 52, 22, 38, 66, -64, -44, -33, -46, 64, 3,
+    -32, 83, -83, 89, 15, 13, -74, 50, -96, 81, 40, -6, 15, -84, -86, 60,
+    -55, -41, -71, -91, 4, 18, 78, 87, -73, -90, 77, 57, 17, -1, -88, -37,
+    -94, -44, -85, 55, -56, -53, 94, 79, -84, 56, -29, 35, 2, 50, -6, -63,
+    -90, -5, 71, -1, -82, 46, -26, -39, -59, 75, -34, -23, -62, 83, 77, -35,
+    41, -35, -92, 96, 60, 44, -14, -37, -67, -71, -17, -50, 64, -66, 78, 5,
+    41, -29, -85, 89, -56, -90, -22, -28, -6, -18, 78, 78, 17, -64, -35, 94,
+    7, -54, 53, 31, 28, -52, 73, -100, -88, 99, 1, -11, -95, 9, 92, 52, 33,
+    10, -84, -42, 33, -94, 20, 83,
+  -42, -97, -86, -70, 85, -59, -45, -79, 15, 94, 28, -3, -63, -68, -94, -54,
+    -58, 74, 6, -43, 56, 63, 49, 24, -63, -87, 97, -8, 26, 23, -73, -38,
+    -100, -14, 58, 26, -10, -38, -66, 95, 11, 67, -11, -30, -55, -17, 32, 38,
+    -41, 83, -70, 87, -94, -38, 19, -60, -13, -94, 3, -6, 74, 0, -88, -85,
+    71, 57, -28, -99, 12, -47, -72, -11, 54, -32, 59, 2, 4, -22, -87, 99,
+    -65, -36, 93, -49, -97, -79, 15, -89, -49, -50, -48, 45, 75, 1, -36, -92,
+    66, 12, 53, 28, -75, -27, 53, 64, -70, -57, -35, -68, -18, -32, -6, -23,
+    -68, 79, -44, 45, 11, -91, -3, -85, 45, 53, -61, -41, 73, 17, 52, 80, 44,
+    -44, 54, 90, -33, 40, -41, -26, 91, 70, 63, 83, 71, -91, -60, 16, -98,
+    -3, 22, 53, 60, 76, 4, 39, -7, 67, 51, -83, -57, -75, 41, -76, 64, -67,
+    -1, 81, -37, 94, -4, 41, -30, -19, 44, -55, 62, -75, -40, 61, -33, -6,
+    -5, -67, 34, -64, 25, -39, -93, 3, -5, -49, 58, 54, -94, 18, -76, -36,
+    -34, 37, -25, -77, 82, -70, -19, 87, 66, -24, 28, 96, -19, 97, 39, 96,
+    -47, -45, -38, 16, 5, -83, -88, -65, -5, -12, 90, 86, -60, -61, 86, 87,
+    -62, 18, -95, -31, -75, 27, -79, -60, -31, 50, 49, 30, -58, -12, -66,
+    -79, 16, 19, 14, -12, 93, 74, -20, -57, -44, -46, 33, -12, 0, -68, -16,
+    -63, 59, 12, 47, 44, 43, 44, 45, 38, 18, -35, -55, -2, -15, -65, -91,
+    -71, 29, -93, -82, -28, 46, -20, 8, 1, -37, -18, -25, -26, -83, 47, 18,
+    -97, -93, 7, 49, -78, -6, -87, -90, 61, -26, 57, -77, 10, -65, -43, 81,
+    -96, -13, 65, -29, -85, 15, -97, 36, 79, 22, -2, -92, 0, -84, 49, -32,
+    -35, -67, 58, -34, -21, 13, 80, 84, 14, 44, -4, -72,
+  -60, -89, 49, -46, 72, 13, -59, 14, 42, -7, -16, -36, -81, -51, -50, -18,
+    13, 91, 62, 33, -12, -36, 98, -20, -46, -51, 7, 10, 58, 25, 2, 39, 77,
+    -43, 50, -80, -9, 17, -36, 78, 23, 84, -46, -24, 40, -17, -13, 84, 48,
+    51, -97, -18, 20, -59, 10, -50, 63, 53, -80, -7, 34, -33, -39, -26, -41,
+    -96, 58, 93, 52, -76, 78, 47, -61, 67, -86, 45, -85, 52, -6, 63, 95, 85,
+    -46, -11, -68, 73, 91, -84, -70, 67, 43, -73, -98, -89, -67, 54, 22, -43,
+    52, -37, -81, 20, 13, -58, 30, -84, -98, 88, 21, -92, -49, -64, 93, -91,
+    20, -66, 32, 11, 4, -24, 89, -61, 13, 74, -51, -31, -34, -66, 28, -31,
+    -79, -52, -51, 32, 14, -47, 6, 93, 40, -29, 81, -85, -3, -1, -31, 42,
+    -28, -7, -37, -18, 4, -50, -5, -46, -38, -36, 46, -45, -6, -10, -94, 5,
+    -7, -27, -64, -23, 93, 19, 98, 55, 99, -96, 41, -41, -14, 93, 91, -23,
+    52, 94, -62, 30, -96, 88, 58, 15, 17, 35, 85, -21, 51, 96, -16, 26, 22,
+    -52, -10, -11, -72, 43, -64, 72, -65, 45, 16, -75, 53, 52, 5, 23, 88, 31,
+    60, 74, -27, 44, 99, -79, 6, 90, -19, -77, 23, 81, 28, 73, 26, 45, 85,
+    -86, 95, 24, 68, 57, 26, -88, 73, 32, 0, -19, 85, -27, 54, 82, 31, 36,
+    89, 32, 53, 81, 43, 78, 5, 6, -34, 1, 92, 62, 58, 53, 24, -8, 8, -24, 24,
+    23, 72, 14, -35, 7, -68, -1, 36, 65, -40, -30, -16, 48, 30, 30, -97, 77,
+    -60, -29, 41, -42, -8, -36, -98, -73, 35, -84, -42, -46, 13, 65, 8, 93,
+    -4, -28, -80, 0, -36, -70, -30, 50, -96, -3, -78, -92, 98, 70, -20, -84,
+    17, 77, 23, -33, 78, -41, -26, -18, 78, 6, 51, 81, 49, -62, -48, -13,
+    -68, 13, 36,
+  1, -23, 34, 9, -54, 21, 49, 76, -99, 5, -4, 25, -44, 19, -79, 35, 26, -13,
+    -58, -81, -63, 22, 99, 91, 44, -64, -63, -86, 24, 17, 81, -81, -23, -10,
+    84, -33, 26, -47, -96, 81, 30, -72, 93, -81, 47, 11, -99, 92, 38, 49,
+    -64, 60, -3, -59, -56, -8, 71, -60, 80, 0, 48, -37, 62, -92, 35, 99, 77,
+    41, 86, 61, 26, 89, 0, -35, -63, 21, -11, -78, -54, 60, 57, -56, 35, 73,
+    59, 3, 20, -1, -93, -69, 31, -93, 99, -23, -52, -77, -85, -5, 75, -23,
+    44, -31, 69, 43, 49, 3, -77, -94, 81, 63, -81, 34, -11, 44, -29, -82, 59,
+    86, 83, -97, 87, 44, 65, 87, 99, 26, -31, -7, 53, 85, 23, 67, 69, -67,
+    23, 20, -42, 81, -73, -26, 11, 83, 80, 83, 18, -90, -13, -10, 16, -25,
+    -95, 30, 71, 43, 49, 2, 36, -17, 80, 9, 50, -34, 5, -63, -47, 73, 86, 39,
+    27, -8, 35, -11, 49, -48, -56, -31, 35, -45, 19, -90, 93, 64, 74, 55, 45,
+    -93, 38, 79, 51, 63, -38, 79, -5, -77, -8, -94, -20, -83, 35, -68, -79,
+    19, -78, 47, -66, 31, -40, 15, -64, -68, -100, -75, 6, -28, 58, 33, 3, 7,
+    -67, -63, 23, 98, 12, -74, -36, -63, 88, 72, -71, -64, -34, -16, -94, 82,
+    20, -64, -69, 59, 4, -89, 67, -94, 64, 89, 65, 88, 59, 74, -68, -45, -47,
+    19, -86, -11, 43, 92, -80, 62, -38, 56, -22, 67, 49, 29, 66, -20, 80, 41,
+    -96, -25, 79, 69, 58, 49, 8, -92, -77, 58, 50, 47, -56, -43, 80, 24, -98,
+    86, -73, -40, -92, -87, -80, 31, 7, 19, -28, -91, 63, 40, 61, -50, -73,
+    -5, -49, 25, 4, 64, 29, 62, -1, -86, 96, 2, 76, -9, -50, -37, 30, 32,
+    -45, -25, 73, 94, 24, -79, -46, -65, 34, 22, 96, 99, 39, -67, -17,
+  -39, -61, 9, -29, -26, -95, 68, 29, -39, -77, 89, -37, 87, -64, 60, 11, 96,
+    -42, 30, 80, 65, 0, -56, 48, 77, 78, -100, -6, -75, 1, -14, -6, -11, -51,
+    80, -52, -33, -54, 23, -18, 51, -20, 73, -96, -48, -83, -73, -51, 63, 85,
+    -6, -4, 80, 3, 52, 50, 15, -17, 54, -94, 54, 37, 84, -76, 40, -17, 76,
+    -81, 45, 4, 19, -47, 87, 53, 43, -47, 39, -68, -7, 48, -95, 7, 50, 9, 4,
+    -94, 62, 44, -91, 16, -69, 18, -23, 6, 47, 74, 90, -36, -32, 35, -14,
+    -81, -98, -90, -34, 26, -42, -48, 4, 2, 80, 85, 21, -44, 27, 1, 48, -66,
+    24, 18, 30, -79, -80, 2, -30, -56, -14, 60, -58, 77, 92, 65, 50, -21,
+    -35, 36, 20, 15, 95, -40, 83, -97, -37, -81, 15, -46, -23, 73, -35, 23,
+    -55, 4, -36, -71, 19, 71, -52, 61, 15, -10, 45, 42, 64, 3, -63, 83, 61,
+    55, -42, -99, -28, -42, -17, 74, -29, -60, -1, -77, 31, -50, 82, -86, 4,
+    -92, -34, -87, -35, -70, -76, 75, 65, -48, 30, -22, -45, 67, -63, -29,
+    -10, 21, 4, -58, -85, 15, 32, -65, -80, 32, -33, 56, 46, -77, 41, 40,
+    -89, -80, 12, -55, 22, -10, -28, 22, 32, 13, -72, 76, 5, 41, 89, 30, -86,
+    74, 79, 15, 31, 24, 17, 68, -15, 12, 66, 44, 51, -6, -19, 25, 70, 34,
+    -13, -4, 49, -90, -17, -56, 58, -73, -8, -93, 63, 45, -95, -45, -91, 49,
+    -70, -44, -72, -82, -40, -68, -90, 98, 69, -22, 9, -38, -61, 11, 7, -73,
+    18, -62, -42, -98, 41, -31, -50, 52, 28, 56, 16, 26, -62, -14, 32, -83,
+    13, 58, -19, 79, -1, 12, -100, -23, -30, 50, -95, -56, 25, -11, 5, 11,
+    -46, -93, -39, 64, 28, 7, 70, -24, 21, 1, 55, 91, -37, -55, -69, 46, 87,
+    81, -77, 85, -59,
+  -40, -87, -4, -95, -57, 30, 4, -14, -45, 59, 54, 9, 89, -71, 53, 69, -66,
+    -60, -90, -42, 16, 40, 64, -74, -2, -16, 80, 11, -97, -88, 83, 84, -57,
+    90, -57, 35, 87, 81, 1, -71, -19, 86, 83, 52, 56, -77, 30, 86, -77, -31,
+    -92, 68, 79, 7, 12, -81, 65, 11, 59, 29, -25, 35, 70, 98, -38, 33, -68,
+    11, 72, 94, 15, 65, 18, 25, -51, -85, 80, -46, 27, 22, 47, 10, -3, 78,
+    96, 66, 46, -48, -30, -40, -95, -94, -28, 25, -4, 46, 58, -29, -14, 19,
+    -52, 93, 61, -76, -59, -83, -71, 42, 31, -77, -64, -57, 48, 13, -19, 90,
+    83, -15, 4, -96, -27, -33, -55, -99, 40, -31, 65, 49, -75, -88, 70, 38,
+    80, 35, -73, 8, 96, -59, 1, -42, -58, 66, 69, 35, -47, -99, -41, -92, 46,
+    90, -63, 8, -54, 14, -13, 81, -29, 54, -80, 47, 34, -46, 64, -64, 39, 36,
+    -49, -33, 60, -64, -50, 97, 97, -35, 36, 2, 39, -13, 45, -3, 22, 9, 19,
+    -100, 58, 22, -25, 89, 86, -20, 51, 19, -13, -63, 68, -36, 83, 52, -35,
+    64, -28, 27, -74, 11, -33, -9, 85, -27, -24, -42, 94, -29, 34, 42, -2,
+    -5, 57, 30, 1, 73, -32, 0, 77, 39, 25, -32, 70, 31, 62, -54, 56, -13, 59,
+    94, 85, 91, 85, 90, 60, -79, -83, -14, -22, -50, 12, -8, -79, -54, -59,
+    68, -1, -75, 59, 23, 45, 29, -33, -51, -83, -37, 37, -9, -86, 74, 74,
+    -58, 28, -86, 58, -45, 3, -53, -28, 54, 55, 23, -23, -62, 99, -66, -90,
+    35, 88, 85, 47, -22, 79, 33, -34, -35, 2, 91, -51, -44, -50, 96, 28, 79,
+    -19, -97, 28, -46, 40, 87, 17, -32, -22, 37, 64, 68, -99, -78, -82, -86,
+    18, -93, -14, -92, -17, 84, -23, 12, 76, 82, -94, 30, 80, -84, 11, -81,
+    28, -79, 83,
+  -39, -91, 50, 26, 9, -86, 25, -20, -21, -20, 78, -9, -69, -14, 7, -76, 29,
+    74, -50, 89, 89, 49, 1, -85, 50, -61, -46, 57, 53, -79, -83, 76, -11, 61,
+    -14, -23, -33, 69, 60, -91, -20, 4, -18, 36, 29, 2, 99, 90, -72, -75,
+    -32, 64, 55, 16, 84, -100, -84, -43, -91, 75, 14, -49, 58, 62, 83, -73,
+    -53, 74, 5, 67, -100, -49, 78, 37, 61, -85, 72, -81, -97, -98, -16, -75,
+    53, 12, -70, -6, -65, 94, 12, -29, 26, 52, -41, -93, 63, 30, -95, -43,
+    -10, -5, 10, -27, 56, 52, -5, -79, -11, 34, -53, 29, -10, -63, 4, 81,
+    -11, 83, -30, 0, 42, -25, 64, 25, 54, 60, 71, -68, -39, 74, -100, 46, 12,
+    26, 57, 2, -43, -75, 0, 30, -53, 25, 33, 80, 48, 31, -18, 81, 65, -48,
+    65, -84, -3, 70, 61, 89, -20, 37, -18, -88, 53, -94, 50, 91, 63, -86,
+    -29, 29, 78, -24, -16, -28, 47, -74, -42, 47, 61, 8, -90, 56, 11, 54,
+    -70, 51, 89, 9, 10, -92, -42, -5, 29, -51, -96, 7, 40, 67, 76, 53, 36,
+    21, -56, -78, 99, 84, 93, -3, -62, -87, 17, -8, 9, 12, -60, -62, 17, -88,
+    -18, -96, 51, -72, 73, -19, -1, 53, -16, -28, -39, 52, 80, 52, 26, -17,
+    6, 24, -81, -26, 62, 75, 75, 24, -97, 86, -46, -9, 74, -35, 45, 97, 92,
+    99, -28, 90, -45, 41, -47, 38, -58, -37, 66, -89, -94, 69, 44, -67, 33,
+    82, -68, 52, -71, 43, -24, 41, 19, 12, 52, -99, 53, 85, -5, 78, 53, -10,
+    87, 92, 8, 5, -7, -53, -10, 89, -88, -92, -26, -16, 60, -97, -73, 77, 40,
+    85, 15, -49, -68, 74, -83, 30, 14, -23, -70, -47, -62, 58, 9, -81, -96,
+    35, 4, 54, 51, -4, -84, -43, -51, 32, -8, -54, -28, 65, -8, -7, -26, -33,
+    -44, -19, 95,
+  -99, 73, 30, 23, 42, -36, -67, -23, 73, 54, 77, 23, 70, 29, -63, -57, 57,
+    1, 37, 11, -39, -48, -65, -69, 79, -52, 31, 71, -16, -2, 53, 82, 27, -11,
+    36, 76, -83, 27, -47, 40, 34, -45, 36, -1, 7, 8, -52, -85, 74, 92, 51,
+    81, 92, -20, -11, 97, 43, -77, 34, -28, -71, 68, -93, 48, 92, 26, 51, 71,
+    -75, 9, -20, 71, -7, 4, -86, 14, -54, 77, 36, 68, -81, -3, -68, 84, -29,
+    -9, -38, 74, -76, -90, 87, 0, -24, 22, 67, -87, -31, -92, -43, 51, -1,
+    -36, -3, 51, 94, 77, 16, -80, 14, 42, 57, 80, -87, -99, -46, 66, 22, 15,
+    -92, 42, -58, 34, -35, -55, -30, 12, -49, -74, 76, -86, 62, -73, -67, 57,
+    -98, -8, 38, 84, 51, -80, 2, 12, -87, -33, 76, 19, 64, -60, -13, -11, 1,
+    -3, -28, -91, -5, 76, 45, -90, 5, 63, -19, 94, -4, -13, -69, -73, -37,
+    -84, -47, -58, -93, -87, -43, 25, -17, -81, 64, -69, -15, 35, 80, 46, 55,
+    -3, -66, -91, 38, 76, -16, 17, 31, -32, -87, -22, -53, -12, -82, 93, 92,
+    56, 68, 29, -39, -90, 30, 52, -96, 59, 66, -37, 87, -37, -8, -49, 12, 38,
+    -36, 40, -27, 48, 87, -85, -8, -68, -16, 48, 84, 90, 2, 0, 69, -24, 95,
+    46, 11, 1, 74, -21, 3, 63, 71, 42, -70, 95, 78, 72, -1, 37, -20, -79,
+    -99, -21, 2, 54, 28, 32, -81, 54, 39, 14, 40, -90, 27, 13, 77, 18, -63,
+    16, 40, -85, 80, -22, 52, 37, -78, 4, 39, -46, 62, -4, -39, -92, 26, 29,
+    74, 52, -60, 22, -6, 27, 9, -36, 29, 44, -45, -100, 20, -12, 27, 2, -77,
+    64, -97, -78, -82, -33, 81, -53, 30, 39, -49, -76, -65, 76, -45, 72, -97,
+    -75, 12, -9, -23, -25, -95, 82, 74, 12, -16, -50, -73, -63, 20, -41, -54,
+  56, 42, -31, -38, 28, -97, -97, -65, -72, 24, -60, 68, -94, 51, -11, 87,
+    79, -52, 25, 38, -84, 66, 38, 53, -13, -41, -92, 50, -97, -6, -7, -50,
+    -4, -27, -92, 52, 69, -45, 23, 94, -52, 52, -22, 7, -12, -15, -16, 54,
+    -12, 31, -89, -76, -89, -70, -7, -56, -97, -56, -97, 13, -99, 10, 2, -18,
+    31, 87, -100, 41, -83, 38, 12, 96, 40, 20, -44, -76, 70, 15, -45, -73,
+    64, -60, -29, 30, 2, 89, 90, -90, 59, -40, -82, 88, 59, -27, -22, 88, 74,
+    80, -90, -91, 95, 56, -28, -73, -28, -37, 40, -88, 96, -33, -100, -20,
+    83, 82, 91, 87, -37, -41, 63, 68, 69, -85, 27, -75, -21, -89, 60, -67,
+    42, 2, 43, 38, 46, 96, 49, 5, 41, -66, 92, -26, -21, 2, -41, 64, -21, 80,
+    21, -50, 18, -44, 38, 11, -93, -55, 10, -63, 90, 76, -74, -49, -39, 40,
+    -16, -89, -42, 90, 66, -43, 93, 59, 87, 68, 26, 35, -58, 48, -78, 45, 83,
+    33, -35, -94, 51, 93, 72, 17, 20, -98, 13, -61, -74, 3, -27, -70, 73, 73,
+    -58, -71, -14, -94, 47, 86, -68, 81, -89, 12, 8, -39, 46, 85, 23, 71, 88,
+    -75, -45, 86, 16, 33, -5, -13, -74, -43, 58, -10, -38, 5, 64, -33, 25,
+    54, -62, -3, 27, 87, -54, -94, 46, -48, 82, 33, -89, -12, 10, -38, -13,
+    37, -48, 85, -35, 30, -69, 96, -61, 22, 12, 59, -96, -69, -35, 24, 11,
+    -61, 80, 11, -54, 74, 66, 39, 44, 68, 64, -71, -40, -21, -31, 55, 73, 77,
+    -68, 19, 80, -76, -21, 20, 21, -49, 17, 12, 88, -68, 68, -67, -83, 52, 1,
+    -88, -46, 39, -87, 24, -3, -93, 57, 52, 52, -65, -26, 14, 35, 95, 83,
+    -84, 2, 18, 62, -50, 71, 0, 59, -63, -97, -74, 44, 34, 5, -9, 70, 58,
+    -84, -6, 26, -5, -19,
+  -78, -6, 64, 22, -51, 78, 31, -37, 67, -67, 52, 5, 43, 19, -59, 2, -14, 87,
+    -80, -70, 7, -53, 84, -67, 45, -15, -67, 19, -19, 86, 32, 77, 68, -35,
+    -6, 60, 31, 92, -3, -86, 65, 76, 22, -70, 96, -48, 24, 34, 25, 76, 65, 0,
+    -95, 30, 95, 32, 32, 96, -28, 52, -97, 88, 10, -71, 6, 55, -8, 3, 32,
+    -50, -41, 11, 42, -70, -42, 51, 95, 29, 4, -89, 25, -15, -94, 8, 74, 91,
+    -93, 4, -34, 5, 27, -11, -20, 6, -14, -6, -8, -23, 41, -43, -85, 6, -97,
+    50, -17, -42, 5, 44, -64, -53, 58, -5, -32, -90, -81, -96, 83, 74, 86,
+    25, 55, 67, -85, -84, 74, 56, 89, -51, -78, 29, -48, -22, 24, 61, 33, 1,
+    -36, -88, 40, -89, -76, 32, 93, 96, 49, -45, -51, -22, 12, 56, 9, 74,
+    -97, 4, 95, 27, -81, 74, 37, -66, -7, 42, -45, -80, 67, -44, -55, -92,
+    -97, 39, 83, 13, 92, 24, 87, 86, -36, 17, 79, 51, 6, -13, 74, -36, -31,
+    -65, 25, 64, 16, 70, -17, 14, -34, -29, 54, 22, -70, -16, 70, 31, -46,
+    -7, -100, 16, 63, -70, 53, 79, -50, -73, 24, 12, -38, 2, -66, -59, 59,
+    82, 88, 36, -32, -41, 93, -94, 17, -88, 12, 78, 66, 12, 11, -95, -28,
+    -87, -81, 34, -53, 39, -96, -60, -61, -20, 30, -27, 36, 45, 80, -63, 12,
+    -80, -75, -83, 60, -54, -57, -2, 14, -100, 70, 23, -6, 27, 80, -57, 9,
+    -90, 8, 48, -82, 91, -2, 99, -2, -48, 88, 99, 3, 92, -49, 33, -68, -86,
+    -10, 4, -45, -70, -7, 47, 34, -26, -74, -40, -15, 92, 53, -26, -34, 73,
+    -91, 74, 93, -81, -9, -35, 51, 82, -94, 77, 65, 36, 65, -58, -46, 51, 61,
+    -80, 35, -8, 1, -63, -89, -25, 21, -4, -49, 75, -95, 31, 9, -58, 0, 57,
+    -48,
+  11, -16, -62, -66, 98, -69, -31, -82, 38, -46, 98, 85, 12, -82, 8, 74, 78,
+    -11, -39, 54, 79, -40, -97, -72, -17, -52, 99, 77, 45, 98, -48, -97, -44,
+    32, 68, -76, -68, -51, -94, -74, 40, 32, -94, 93, 98, -9, -26, 94, -46,
+    31, -20, -93, 62, -8, 50, -98, 29, -48, -34, -24, 60, 15, 29, -35, 69,
+    26, 88, -86, -93, 39, -56, 59, 26, -47, -15, -73, -33, -8, -8, 63, 98,
+    -65, 57, -39, -35, 47, -14, 22, -6, 78, -90, -39, 37, -22, 43, -1, 89,
+    98, 65, -62, 60, -40, -79, -49, 1, 6, -52, 2, -88, -46, 34, 55, 93, 50,
+    5, -26, 97, 41, 41, -87, -5, 92, -80, -98, 81, -57, -90, -18, 37, 45,
+    -64, -11, 4, -10, -55, -12, -18, -24, 0, 96, -29, 10, 32, 82, -86, 28,
+    -40, -78, 88, 65, 16, -59, -41, -60, -73, 71, 77, 9, -85, -28, 98, -85,
+    -63, -26, -45, -13, 34, 5, 92, 89, -86, -22, 13, -2, -5, 57, 85, -100,
+    97, 87, 50, 45, -100, -22, -22, 27, -18, -3, 97, -60, 77, 23, 18, 23,
+    -84, -59, 82, -85, -39, 21, 87, 34, -32, 83, -14, -61, -44, -15, 96, 99,
+    -21, 61, 51, 20, 3, 24, -20, -77, 69, -4, -36, -17, 12, -81, 65, 49, -66,
+    -30, 94, 57, -6, 8, 18, -66, -44, 89, 2, -25, 2, -62, -56, 99, -73, 56,
+    -87, 88, 40, -54, 74, -84, 28, 12, 41, 63, 83, 7, -84, 6, 81, 75, 79,
+    -97, 31, -81, 46, 8, 64, -13, -70, 10, 21, -70, 1, -49, -97, 61, 57, -83,
+    96, 94, -35, -7, -38, 40, 77, -70, -65, 8, 49, -69, -70, 20, 74, -73,
+    -38, 66, -13, -7, 44, 50, -20, 29, 7, -33, -59, 95, 74, 45, -67, -81,
+    -29, 16, 28, -47, 40, 42, 65, -47, -87, 23, 64, -15, -26, -74, -79, 28,
+    -97, 53, 20, 58, 10, 94, -30,
+  -63, 8, 92, -45, 81, -26, -11, -51, 17, -79, -4, 90, 56, 9, -35, 28, -83,
+    22, -13, 77, 63, -2, -92, -3, 86, -87, 16, -90, -82, -78, -7, 21, 92,
+    -18, 3, 19, -69, 72, -65, 3, -41, -96, -58, -35, -67, 68, -97, -73, 7,
+    -88, -75, -73, 18, -66, 32, -50, 15, -49, 8, -48, 89, -36, -22, -60, -6,
+    95, -48, -6, -52, 65, -41, -17, -45, -4, -98, -75, 16, -89, -72, 16, 42,
+    -97, -21, -33, 38, 37, -10, 26, 82, -21, 17, 74, -43, -62, 7, -74, -61,
+    -65, -15, -60, 97, 46, -19, 32, 65, 46, 85, -67, 93, 26, 63, 13, 74, 58,
+    76, -100, -46, -36, -87, 57, -34, -39, -35, 87, 34, 21, -32, 24, 75, -43,
+    -67, 86, 43, -56, -70, -66, 14, -33, -8, -97, 55, -78, -82, -85, 42, -69,
+    -22, -11, -80, 95, 23, -86, -96, -65, -67, 89, 50, 27, 93, -40, 94, 85,
+    -22, -14, 18, -81, -42, 20, 36, 18, -7, 63, 7, -61, -80, 47, 66, -21,
+    -44, 60, 54, -7, 0, -78, -65, -99, 86, -37, -26, 25, -27, 58, 23, 10,
+    -59, 4, 49, -61, 95, 9, -31, 8, 71, -9, -1, 12, 29, 80, 27, 62, -98, -88,
+    -83, -18, -93, -80, -72, 67, 75, 15, 42, 64, -64, 71, 4, -60, 5, -12, 96,
+    64, -21, -78, 65, -85, -55, -78, -60, -81, 16, -10, -43, -34, -49, -57,
+    -2, 87, 60, 93, -30, -55, -52, 82, -44, -43, -56, -5, -68, -100, -6, -69,
+    90, -49, -75, -77, -31, -12, -58, 3, 78, 28, -50, -5, 18, -65, -67, 85,
+    -47, 23, 63, -26, 16, -35, 32, -15, -40, -72, -2, -7, 13, -78, -83, -45,
+    -12, 32, -17, -73, 90, 50, 79, 40, 72, -74, -58, 52, -4, 61, 86, -37,
+    -31, 20, 89, -94, -85, 46, -18, -81, 68, -18, -65, 81, -64, -49, -12, 61,
+    95, 39, -5, -36, -9, 92, 13, -16, -45,
+  -24, 13, -12, 6, -74, -24, -97, -11, -96, 23, 75, 33, 29, 36, -35, 2, -95,
+    27, 59, 2, -22, 14, 3, 2, 4, -53, 33, -64, 79, -74, 64, 88, -91, 11, -87,
+    -47, 24, -50, 44, -81, 41, 25, -36, -11, 3, 80, 41, 79, -44, -10, 56,
+    -72, -5, -66, -65, 83, -61, -29, -45, 94, -75, 84, -38, -59, 28, 39, -4,
+    -5, 7, 92, -96, 84, 91, -26, 41, -6, -62, 44, -35, -58, 89, -8, -59, 53,
+    12, 41, -27, 36, -55, -92, 58, -18, -69, -69, 60, -4, 23, -16, 89, -69,
+    -81, -56, -38, 73, -55, 28, -52, 70, -37, -77, 94, 24, 82, -73, 26, 59,
+    -97, -31, -38, 25, -23, 56, 43, 18, 62, -38, 13, -43, -5, 7, 89, -76,
+    -11, 43, 54, 90, -60, -57, 77, 30, -39, -78, 55, -10, -49, -78, 96, 11,
+    -84, 44, 95, -64, -76, 9, -79, -59, -62, 74, 15, 57, -14, 14, -60, -63,
+    -47, -43, 16, -32, 78, -41, -25, -57, 22, -46, 51, 12, 33, 64, -28, 56,
+    -81, -41, 75, -18, 1, 70, -43, 66, 89, -71, 79, 51, -93, -93, -62, -46,
+    -23, -99, -51, 30, 75, -36, 54, 9, 39, -18, 68, 98, 46, 82, -74, -62, 97,
+    -79, -82, 35, 27, -76, -55, 84, -34, 79, -40, -71, 90, 52, -12, -98, -48,
+    16, 79, 52, 90, 34, -9, 21, -77, 17, -49, 96, 78, -65, 46, -60, 43, 61,
+    18, 71, 39, -16, 99, 75, -88, 82, -5, 12, 64, -97, -14, -3, 34, 9, -65,
+    66, 29, -69, -83, 4, -93, 27, -66, 31, 53, -35, 90, -73, 14, 26, 24, 93,
+    -97, -94, 2, 72, 9, -12, 35, 23, 1, 89, 49, -58, 47, 17, -9, -47, 51, 50,
+    -82, 72, -5, -12, 15, -99, 56, 75, -64, 48, 59, -75, 14, 48, 3, 88, 55,
+    30, -50, -99, -14, 25, -64, -54, 86, 47, 11, 9, -35, 80, -73, -8, 91, 31, 48,
+  -94, -74, -70, 49, -75, 37, 25, -38, -27, -84, -64, -41, -31, 55, -97, -22,
+    -19, -99, 55, -10, -7, -54, 89, 69, -76, 88, -81, 66, -35, -47, 25, -23,
+    -9, -57, -17, 58, -85, 88, -98, -18, 72, 28, 92, -65, -14, -85, 62, -52,
+    7, 76, 3, 77, -15, -66, 92, -70, -48, -71, -5, -39, -81, -21, 23, -67,
+    -22, -71, 36, -46, 44, -62, -84, 61, -87, 86, -36, 93, -45, -37, -61, -3,
+    -64, -79, 20, -4, 96, -4, 14, 60, -18, -27, 45, -76, 11, -62, -15, -10,
+    90, 32, -66, -87, -73, 14, 74, 24, 52, 47, -35, -39, 94, -33, 37, -60,
+    -30, -77, -99, 4, 68, -13, -16, -100, -26, 34, 82, 14, 87, -15, 58, 67,
+    -7, -94, 68, 73, -79, 13, -72, -15, -19, 49, 85, -46, -90, -54, -43, -9,
+    86, -49, 97, 64, -91, -89, -31, -63, -60, -43, -74, 44, -35, -73, 57,
+    -14, -64, 79, 71, -57, -99, -54, 47, 11, 84, 90, -61, 33, 93, -100, 84,
+    34, 69, -91, 53, 94, 98, 96, 3, -21, 56, -65, -26, -90, 29, -90, 24, -10,
+    -15, 76, -38, -32, 9, -27, -85, -33, -33, 47, 10, -28, 63, -46, -87, -17,
+    -46, -65, 9, 22, -53, 16, 95, 76, 10, 99, 54, -25, 90, -53, 99, -57, 70,
+    -54, 41, 49, -95, -83, 0, 13, -35, -26, 24, 29, 48, 93, -78, -45, 9, 6,
+    -39, -31, 51, 80, -6, -57, 25, 65, 43, 5, 12, 40, 22, 54, -99, -53, -8,
+    -73, -40, -35, -6, 48, -43, 90, 34, 0, 35, -86, 33, 42, 79, 44, 61, -89,
+    -40, -84, 73, 33, -20, -13, 11, 65, 15, 82, -95, -84, -82, 76, -38, -45,
+    -14, 15, 78, 66, 29, 38, -67, -14, -92, -97, 41, 52, -62, -75, 37, -48,
+    61, -48, 97, -96, 24, 9, 62, -13, -62, -31, 8, -18, 55, -82, -14, -22,
+    -11, 20, -59, -52, 96, 69, 90, -16, -26,
+  -36, 7, 51, 96, -97, -18, 22, -73, -81, 65, 25, -57, -20, 40, 42, -22, 12,
+    -88, -32, -58, 6, -3, -82, -61, -85, -66, -80, -80, -42, -100, 29, 23,
+    76, 35, -90, 87, 98, 55, -54, -88, -61, -8, -68, -4, -100, 11, 69, 37,
+    -79, 67, -33, 11, -31, 24, -31, -81, 65, -23, 33, 21, 20, 2, -3, -3, -11,
+    7, 46, 77, -26, -94, 43, -61, 40, 79, 86, 74, 34, 92, -13, -58, -53, 20,
+    -72, 33, -22, -50, -70, 71, 94, -99, -88, -100, -10, -5, 87, 86, 13, 43,
+    -72, -79, -12, 16, -42, -49, 33, 93, -7, -87, -60, 27, 54, 86, 13, 46,
+    -78, 59, -98, -54, -16, 64, 85, -10, -25, -30, 68, -26, -82, -89, 54,
+    -10, 64, 0, -16, 5, 25, 44, 91, 62, 50, 60, -91, -60, -22, 27, 82, 95,
+    90, -91, -21, 41, -74, 46, 44, 28, 96, -70, -4, -25, -66, -74, 94, 24,
+    80, -69, -15, 79, -76, 39, 69, 64, 29, -85, 48, 51, -59, 7, 32, -66, 19,
+    98, 54, -45, 75, -11, -7, 5, -6, -66, -39, -50, -29, -44, -58, -27, -65,
+    54, -100, 53, -7, 97, -95, 47, -95, -43, -57, -32, -42, -57, 67, -11, 90,
+    71, 96, 37, -100, -51, -21, 78, -9, 46, -13, 86, -9, -80, -54, -94, -86,
+    98, 52, -12, -86, -31, 63, 73, 68, 89, -73, 72, 2, -44, 10, -54, 84, -5,
+    -30, -59, 42, -60, 95, 30, -28, -19, 3, -33, -60, 63, -13, -37, 88, 20,
+    66, 18, 63, 95, -8, 29, -38, -92, 69, -17, 10, 78, 47, -21, -53, 58, 99,
+    5, -55, 77, -66, -47, -50, -13, 35, -80, -74, -15, 45, 11, 18, 64, -96,
+    -26, 45, -41, 49, 40, -5, 63, 75, -8, 96, -85, -67, -92, 66, 6, 77, -9,
+    17, -40, 84, 84, 6, -58, -60, 77, 30, -15, 68, 0, -44, -32, 53, 33, 97,
+    82, -34, 82, 29, -9, -98,
+  -2, -34, -74, -81, -20, 71, 14, -41, -20, -76, -59, 1, -63, 41, -23, -18,
+    -71, -10, 70, -19, -45, -60, 42, -64, -24, -50, -74, -42, -33, 81, -86,
+    -100, 92, -63, 70, -11, -86, 25, 45, 6, -97, -63, 82, 14, 68, -56, -44,
+    98, 11, 25, -60, -91, 0, 95, 74, -47, 7, 61, 81, 4, 68, -9, 57, -5, 43,
+    -12, -3, -88, -41, 90, 5, -94, 4, -63, -37, 16, 41, 52, 46, -78, 20, 41,
+    -44, -76, 28, 18, -17, 31, 77, -72, -38, 13, 88, 55, 74, 30, -18, -71,
+    70, 70, -68, -14, 78, 97, -38, -27, 46, 43, 21, -82, 35, -75, 42, -79,
+    -11, -36, 46, -4, 70, 64, 28, 63, -15, 96, 87, 63, -98, -98, -79, -13,
+    -23, -15, 91, 18, 87, -52, -62, 54, -54, -61, 87, -20, 50, 8, 33, -49,
+    -4, 88, -23, 74, 34, 25, -74, 18, 40, 22, -81, -69, 40, -95, 58, -47,
+    -71, 47, 12, -78, -73, 39, -82, -22, -71, 88, 84, -72, 55, 86, -20, -50,
+    -60, -65, -47, -2, -31, 85, 70, -86, -89, 16, 12, -67, 77, -78, 29, -34,
+    -10, 66, -62, 38, -99, 87, -80, -41, 92, -1, 77, 78, -87, 80, 56, -64,
+    -56, -14, 82, -68, 31, -88, 31, -91, -40, -47, -54, -24, 33, -8, -97, 36,
+    -92, 89, 90, 48, 91, 43, -100, 49, -66, -3, -27, 27, 69, -51, 29, -44,
+    -76, -21, 21, 87, -66, 3, -15, -9, -32, 84, 8, 22, 94, -78, -95, 12, 16,
+    -99, -13, 15, 57, -40, 86, 62, -100, -46, -24, 79, 63, -71, 68, -48, -85,
+    84, -45, -91, 74, 80, -98, 83, -44, 6, -56, 23, 58, -85, 21, 46, 20, 90,
+    35, 24, -62, -99, -75, 27, 93, -91, 74, 15, -44, -74, 50, -9, 78, 28,
+    -81, 50, -80, -43, -61, -57, -27, -92, 42, 80, -66, 59, 41, 99, 63, 91,
+    66, -40, -49, 6, 77, 23, 57, 48, -70,
+  0, -17, 5, -44, 76, 42, -73, 23, 93, 61, -10, 32, -88, 72, -96, -28, 0,
+    -37, 26, -72, 32, 57, 15, -99, 5, -13, -16, 61, 84, -33, 8, -21, 4, -90,
+    -19, 4, -65, -88, -40, 81, 21, 28, 14, -84, -19, -41, 22, -58, 70, 10,
+    -15, -100, -55, -91, -43, -41, -54, -58, -14, -84, -11, 20, -9, -24, 77,
+    76, 10, -42, -72, -96, 48, 74, 29, -56, -36, -55, -70, 4, -34, -32, -95,
+    -59, -33, 0, -62, 21, 88, -88, 64, -4, -31, -85, 40, 89, -52, -6, 13, 20,
+    -84, 0, -16, 73, 74, -90, -40, 75, -20, -89, 96, -94, 40, -69, -6, -33,
+    16, 10, -76, -75, 87, 2, -56, 23, 61, -23, -70, 4, -48, 8, 72, 59, -39,
+    -56, -72, 50, -8, 15, -72, 93, 63, 24, 56, 51, -31, -53, 10, -85, -63,
+    18, 87, 78, 59, -54, -11, 26, 27, 29, -41, -39, -26, 4, 46, -30, -5, 70,
+    51, 30, -40, 89, 52, 69, -33, -50, 53, -32, -12, -38, -83, -70, 72, 43,
+    18, 90, 65, -16, -67, -37, 71, -30, -24, -3, -72, 2, 0, -22, -44, 22,
+    -56, 34, -63, -76, 92, 36, -99, 54, -10, 36, 74, -1, -94, -87, 56, 94,
+    -50, 65, 67, 20, -31, 67, -37, 11, 54, -41, 59, -12, 75, 46, -50, -43,
+    -79, -98, -87, 22, -32, -37, 48, -31, 71, 7, -45, -61, -48, 48, -33, -71,
+    -66, 99, -47, 81, -36, -4, 23, -89, -89, -9, -67, 28, 19, -43, 44, 13, 6,
+    -85, 40, 15, -86, 92, 51, 66, 61, 37, 53, -55, 80, 40, -32, 84, -39, -46,
+    -85, 26, -92, 87, 40, 76, 23, 68, -54, 11, -83, -46, 30, 36, -68, -85,
+    -22, -33, 82, -92, 47, -66, -98, -78, 17, 37, -46, -51, 6, 56, -55, 59,
+    95, -23, 54, -21, -57, 77, 54, -35, -16, 11, 88, -5, 63, -24, 44, -64,
+    17, -44, -39, 42, -51, 62, 68,
+  61, 92, 91, 16, -6, 64, 17, 46, 83, -86, 82, -33, 65, -33, 35, -25, -55,
+    -85, -95, -91, -70, -39, -71, 12, 97, 40, -45, 41, 42, -67, 68, 46, 61,
+    -83, 92, -65, -69, -3, -19, 82, -40, -43, -32, 32, 76, -41, 91, 86, 12,
+    23, -28, -23, 50, 46, -20, 11, -1, 38, -74, -46, -55, 50, 35, -71, -79,
+    80, -46, -32, 85, -93, -88, 17, -30, 92, 91, -62, 65, 86, 61, -41, 14,
+    84, 8, 64, -51, -63, -97, -26, -17, 42, -3, 85, -1, 57, -31, 54, 6, 74,
+    -67, 63, -70, -12, 60, 9, 43, -67, 55, -82, -25, 33, -99, -24, -41, -20,
+    26, 68, -7, 54, 75, -62, -54, -1, 76, -43, -41, -94, 22, -61, -95, 2,
+    -72, 19, 61, 55, -85, -3, 34, -62, -73, -31, 43, -19, 87, 4, 53, 71, -76,
+    -37, 92, -43, -55, -79, -94, -17, -33, 11, 67, -75, -75, -76, 35, 26,
+    -36, -32, -62, 86, 50, -62, -90, 32, -80, 18, 10, -99, -20, 26, 43, 31,
+    1, -19, -1, 10, -73, 78, -34, -80, 83, 55, -53, 99, -57, 45, 17, 3, -16,
+    -60, 49, 33, 99, 17, -95, -10, -68, 49, 67, -47, 22, 56, -74, 31, -86,
+    -94, 84, 15, -93, 89, -90, -93, -89, -21, -58, 65, 57, 25, 38, -58, 37,
+    -82, -70, 41, 51, -64, -68, 7, -81, 3, -66, 83, -27, 20, 22, -68, -38,
+    -14, 79, 34, -82, -30, 82, -76, -82, 78, -89, 36, -52, 27, 23, -64, -46,
+    41, 16, 2, 86, 39, 56, -67, 77, 63, -89, -92, -21, 12, -51, -78, 59, -16,
+    -81, 96, 0, 92, 85, -78, 36, -24, -35, 62, -62, 19, -89, -70, 26, 2, 68,
+    -89, 17, -49, -31, 86, 87, -73, 59, 25, 94, -28, 58, -83, 53, 80, 99,
+    -14, 16, -19, -9, 99, 75, -99, -98, -38, 92, -89, -40, -28, -48, -66, 23,
+    -83, -97, -61, -59, 75, 57, 10, -55,
+  -95, -6, 82, 62, -12, -86, -47, 64, -20, -66, 44, -82, -8, 80, 51, -94, 90,
+    -84, -16, 88, 67, 13, -52, 93, -53, 98, 18, 0, 63, -19, 18, 50, 38, 75,
+    50, 16, -51, 45, 14, -74, -32, -89, -20, 94, -28, -46, -74, 67, -82, -27,
+    10, 69, 93, -66, 58, 82, -34, -68, 60, -86, 47, 64, 38, 38, -32, 18, 44,
+    50, -65, 59, 72, 90, -24, -67, -94, 24, 39, -61, -100, 96, -11, -43, -63,
+    74, -81, -19, -67, -54, -74, -76, -33, 16, 75, -2, 81, 68, -48, -73, -72,
+    -26, -28, -63, 6, 20, 78, 70, -3, -66, 33, 56, -22, 87, -37, 94, -41, 10,
+    -51, -33, -70, -83, -44, -82, 91, -21, -36, 24, 96, 40, -83, -18, -59,
+    75, -13, 92, -65, -65, -1, -27, -33, 18, -61, -46, -16, -75, -90, 6, 74,
+    -38, 66, -7, -24, 90, -12, 11, 90, -18, -37, 94, 3, 67, -11, 40, -15, 53,
+    -62, -85, 90, 47, 19, 29, -42, -33, -93, -65, 16, 65, -68, -8, 98, -66,
+    28, -95, 93, 15, -12, -34, -96, -15, -68, -97, 48, 97, -93, -85, -60,
+    -23, 19, 21, -95, 42, 91, 15, -98, 51, 32, -19, 71, 78, -77, 27, -30,
+    -53, 92, -67, -29, -53, -49, -10, 25, 12, 0, -80, -98, -28, 86, 38, 9,
+    81, 36, -3, -19, -4, -72, -10, 96, 32, 8, 2, 42, -68, 9, 69, 44, -46, -5,
+    71, 18, 68, -76, 98, 40, -18, -76, -19, 1, -75, -84, -99, 58, 10, -80,
+    79, -49, 97, 53, 36, -70, -52, -34, -90, 35, 93, 40, 54, 86, -47, -29,
+    -95, -39, -11, -49, -47, 97, 47, 46, 30, -48, 45, 85, -73, 39, 57, -71,
+    97, 86, -28, 88, 12, -59, -93, -52, -26, 44, 79, 74, 55, 34, 63, 79, 48,
+    26, -8, -34, 26, -26, 46, -29, 91, -82, -13, 17, -27, 27, 17, -64, -87,
+    -87, -9, 92, 42, 87, -58, 7,
+  89, -71, 63, -24, 23, -7, -60, 45, -87, 58, 45, -44, -26, -29, -80, -92,
+    -91, 56, -95, 8, 9, -76, -18, -61, -88, -75, 20, -30, -46, 84, 95, 95,
+    57, -17, 23, 70, -20, 16, 11, 79, -60, 24, -75, -87, -89, -91, 10, -91,
+    -28, -35, 56, 65, -69, 46, -4, -2, 78, 84, 12, -28, 87, -93, 58, -60, 28,
+    -30, -69, -10, 75, 71, 41, -30, -83, -78, 96, 55, 36, -50, 51, 45, 38,
+    16, 40, -47, 8, 94, 33, -53, 5, -60, -42, -11, -98, 48, 36, -70, 40, -44,
+    -37, 10, 2, 12, -2, 80, -69, -67, -65, -100, 6, 16, -36, -99, 70, 21,
+    -13, 1, 37, 92, 60, 51, 46, 17, 17, -46, -47, -94, 71, 27, -72, -91, -13,
+    -13, 73, 82, 55, -13, 75, -52, -88, 70, -35, 20, -44, 71, 74, -62, -21,
+    70, -66, 18, 3, -50, -69, 21, 82, -85, -30, -7, 99, -88, -33, 73, 70,
+    -100, 67, 57, 39, 95, -40, 65, 0, 56, -97, -54, 61, 23, -43, -15, 59, 72,
+    -30, 14, -16, -20, -94, -38, 77, 73, -10, 94, 94, 58, -40, -69, -44, 98,
+    -79, -92, 34, -47, -66, -48, -61, -94, -63, -27, 36, 18, -19, -41, 24,
+    -62, 81, 42, -43, 25, 44, -20, 72, -86, -23, 1, 0, 66, -98, -96, 84, -82,
+    -2, -42, -78, 29, -17, -18, -58, 60, 40, -42, 97, 26, 10, 24, -11, -69,
+    -6, 67, 34, -97, -82, 3, -56, -13, 12, -63, -85, -86, 86, -60, -22, -52,
+    89, 88, 99, 96, -82, 87, -40, 98, 91, 58, -50, 84, 73, -17, 91, -90, 40,
+    -52, -30, -27, 46, -90, 89, -47, -1, -19, 54, -45, -57, -98, 62, -12, 71,
+    -48, 84, -64, 40, 25, -34, 32, -83, 78, 19, -34, 61, 8, 65, 11, -73, 64,
+    34, -9, -37, 45, 62, -68, -9, -8, 23, 50, 84, 35, -25, -77, 6, 63, 7, 47,
+    39, 92, 30, -48, -82,
+  7, -36, 98, -5, -90, 46, 3, -76, 53, 96, 26, -8, -30, 77, 29, 77, 48, 31,
+    67, -68, 17, 15, -47, -57, -2, 10, -32, -30, 66, 97, 31, 6, 9, -89, -100,
+    -3, -29, 93, 27, -81, -74, 85, -70, 95, 46, 41, -99, -34, 87, -93, 75,
+    -32, -44, 3, -43, -15, 55, 36, 4, 49, 69, 93, -37, -100, -37, -29, 38,
+    89, -71, 78, -87, -90, -47, 94, -87, -91, -99, -42, -91, -10, -25, -8,
+    -94, -7, 72, 90, -67, -3, 38, -84, -93, 40, -22, -14, 57, 62, 55, 82, 40,
+    48, 47, -87, -4, -35, 36, -71, 71, 73, 11, -58, 48, -16, -85, 37, 74, 26,
+    -58, -88, 1, -30, 99, 17, 40, -59, 36, -72, -36, 10, 28, 34, -62, -73,
+    20, -47, -19, 54, -97, 79, 68, -66, -69, -10, -11, -89, 12, -54, -100,
+    -65, -62, 89, -18, -99, -72, -50, 87, 75, -45, 95, 50, -14, -70, -21,
+    -92, -76, 79, -99, -7, -4, 23, -82, -85, 93, -53, -14, 14, -57, 56, 31,
+    57, 75, -48, 90, 84, 12, 72, -67, -64, 39, 49, 57, -93, -16, 85, 30, -87,
+    -12, 11, 51, 94, -47, -50, -95, 84, 0, -30, 11, -73, 64, 35, 24, -77,
+    -64, 52, 11, 26, -11, 54, 24, -98, 94, 21, -58, -48, -99, 12, 25, -93,
+    -70, -39, -84, -97, 66, -5, -84, -68, -79, 11, -97, -6, 21, 84, -81, -22,
+    80, -39, -83, -72, 15, 55, -17, -7, -49, 89, -57, 84, -18, 26, -5, 52,
+    -95, 95, -87, 73, -68, 92, 45, 12, 59, -14, 52, 94, 9, 52, -68, -61, -28,
+    -72, 17, 28, 61, 46, 70, 61, -8, -73, -77, -89, 8, -27, -14, -60, 97,
+    -70, 94, 5, -3, -25, -43, -65, -28, -76, 45, 99, 74, -93, -20, -96, 89,
+    30, 81, 47, -39, -25, 17, -81, 83, 77, 21, -22, -7, 34, 3, -87, -74, 7,
+    51, 40, 48, -62, 47, 69, 32, 92,
+  -35, -64, -76, 76, 23, 76, 24, 80, -78, -57, 49, -62, 6, 45, 82, -34, -76,
+    -36, -30, -19, -62, -88, -65, 84, 14, -8, 70, -4, -66, -59, 22, 88, -1,
+    73, 93, 82, 86, -12, 50, -71, -88, 53, -36, -89, 13, -98, 93, 40, -43,
+    -71, -92, -18, 94, -85, -94, -31, 66, 26, -36, 9, -9, -22, 2, 83, 77,
+    -17, -69, -45, -30, -76, -58, -40, 79, 58, 58, -60, 71, 18, -70, -51, 44,
+    -91, 38, -88, 0, -16, 5, 36, -83, -79, -3, -3, -25, 71, -65, 42, -83, 99,
+    -40, 43, -31, 81, 78, -35, 59, -69, -6, -70, -40, -7, 12, -68, 7, 3, 97,
+    38, -90, -51, -52, -27, 78, -17, 48, 89, 99, 39, -78, 43, -25, -58, 29,
+    37, -23, -96, -65, -41, 79, -24, 60, 45, -34, -52, -46, 20, 65, 22, 46,
+    38, -61, -53, 67, 52, 0, -56, -88, -25, -42, 59, -15, -32, -78, -98, -60,
+    -96, 77, 53, 21, -23, -11, 61, 13, -74, -30, -14, 50, 35, -14, 42, 91,
+    59, 66, -39, 7, -36, 79, -19, 5, -1, -91, 79, 47, 73, -53, 43, -13, 74,
+    2, -57, 3, 53, -25, 16, -12, -15, 78, 96, 28, 45, 64, -12, 74, 60, -31,
+    53, -2, -46, -78, 77, -77, 1, 94, -59, 57, -68, -85, 71, -59, 85, 44, 1,
+    90, 50, -38, 16, 68, 72, -2, -9, -83, -78, -82, -45, -1, -29, 73, 60,
+    -56, -16, 98, 9, -59, 58, -37, -80, 11, -99, -100, -62, -32, -40, 53,
+    -15, 30, -3, -97, -35, 13, -3, 44, -3, -82, 21, 88, 29, -73, -28, 11,
+    -49, -65, 20, -15, 49, -11, -92, -64, -73, 76, 62, -38, -37, 4, 41, 0,
+    59, 6, 1, -80, -68, 56, 1, 3, -99, -68, -68, -66, 85, 75, 66, -30, -19,
+    38, 17, 17, 68, 26, 26, -99, 39, 75, 43, -56, 0, -93, 33, 1, -7, 31, -87,
+    -69, 79, 67, 43, -60,
+  -5, 72, 63, -100, 84, -91, -70, -37, -89, -81, -28, -2, -56, -49, -46, -97,
+    -44, -5, -37, 35, 25, 41, -16, 63, -100, -36, -83, 26, 24, -18, -42, -41,
+    -18, -57, -12, 17, 99, -40, 66, -67, 63, 87, 67, 12, -34, -38, 91, -55,
+    78, -5, -32, 45, 2, 97, 86, -53, -93, 87, 83, 38, -13, 12, 80, 38, 55,
+    90, 3, 51, 57, -75, 17, -36, 39, -15, -36, -90, 57, -12, 92, 94, -33, 82,
+    75, -79, -31, -39, 12, -30, -64, -81, 53, 36, -8, 47, 18, 88, 64, 73, -7,
+    -61, -6, -64, 68, -97, 94, 64, -16, -88, 57, -11, -19, 45, 63, -52, -63,
+    -30, 70, 98, -100, 99, -43, 42, -65, 57, 38, -80, 5, 14, 1, -80, -74, 22,
+    -69, -31, 11, -21, -49, -48, -65, -63, 35, 10, -89, 10, 84, 4, -29, 77,
+    -66, 87, -80, -21, -40, 18, -54, -97, 97, -65, 88, -14, -76, -81, 60,
+    -18, -17, 53, 30, 81, -74, -28, -9, -43, -29, -87, -92, -47, -60, 47, 80,
+    55, 81, -74, -35, 74, -39, 55, -6, -90, -76, 14, 8, 68, -42, 93, 90, 35,
+    -35, -6, -54, -70, -73, 11, 30, -72, -89, 85, 55, 96, -73, -93, -9, -45,
+    6, 2, -45, 85, 62, 19, -53, 5, -77, 87, 10, 35, -57, 71, 38, -93, -59,
+    -71, -88, -18, 60, -84, 5, 20, 7, 62, -78, 35, -38, 93, 53, 69, -35, 88,
+    -3, 77, 34, 71, 46, -70, -75, -67, 25, -67, 69, 31, 34, 18, -43, -55,
+    -40, 5, 48, 64, -35, 25, -72, 57, -57, -20, 76, -80, -17, -50, 52, -27,
+    -61, -18, -7, 17, 75, -77, -56, 11, 66, 48, 31, 71, 90, 3, -3, 89, 6,
+    -58, -87, -75, -77, 26, -16, -49, 77, -7, -53, 47, 26, -80, -22, 34, -48,
+    15, 3, 8, 15, 39, -63, 4, 41, -74, -94, -56, 78, -76, -37, -25, -58, -96,
+    -90, 92, 36, 26, -63,
+  60, -95, 48, -76, -45, 4, 81, 97, -40, -92, 83, 59, -99, -50, 61, -14, 11,
+    92, 56, 85, 43, 75, 16, -59, -93, 58, 59, 95, 73, 68, -44, -59, 2, 90,
+    70, -100, 33, -4, 37, 57, -94, -5, -35, 58, -3, 91, -74, 7, -27, 77, -28,
+    43, 49, -56, -94, -13, 25, 16, -88, 40, -21, 28, 43, 66, 59, -4, -77, 82,
+    -90, -100, 57, -8, 81, -14, 92, -63, -75, 13, 8, -59, -26, -10, -6, -59,
+    -70, -62, 94, 10, 57, -35, -31, 59, -32, -29, -59, 87, 61, 4, 14, -53,
+    -97, -63, 4, -53, -33, -44, -21, 80, -51, -31, -85, 71, -40, 12, 84, 78,
+    -35, -81, 74, -96, -88, 59, 95, -8, 73, 97, 45, 27, 55, -23, -80, 10,
+    -30, 30, 65, 82, 35, 47, -100, 28, 65, 84, 62, 99, -35, 5, 15, -44, -55,
+    -56, -52, 32, 36, -31, 38, 76, -1, 98, -5, 71, -29, 73, -77, -44, -23,
+    80, -26, -47, -3, 26, -76, 44, -50, 88, 31, -66, -7, -14, -91, 10, -92,
+    31, -70, 43, -57, 98, 70, 91, 9, 28, 92, -48, -5, -64, 11, 85, -64, 61,
+    22, 53, -63, 42, 69, 56, -12, -66, 23, -22, 0, 49, -41, 89, 81, 94, -33,
+    65, -12, 98, -93, -68, -97, -94, -78, 50, -99, -57, 98, 88, -70, -64, 73,
+    62, 38, -89, 3, 97, -64, -92, -30, 55, -25, 53, 5, -7, 24, 56, -85, -24,
+    66, 71, -93, 6, 48, 23, -45, -49, -88, 33, -21, 52, -89, 49, -22, 49,
+    -24, 65, 47, -45, 68, -36, -75, 22, 96, -91, 24, -75, 8, 17, -51, -34,
+    -83, 3, 61, 54, 98, -42, -74, 85, 47, 9, -45, 51, -29, -90, -21, -39,
+    -53, -40, -94, -39, -84, 98, -5, -48, -15, -30, 7, -64, -63, 21, -87,
+    -46, 1, -72, -39, 29, -24, -97, 24, -60, 68, -22, 33, -8, -99, -7, 42,
+    -73, 88, 8, -25, -35, 22,
+  -22, 11, -55, 75, 55, -65, -90, 49, -43, -100, 7, -27, 6, 1, 39, -80, -58,
+    -96, -100, 46, 28, -96, 45, -10, 99, 84, 10, -91, 22, 28, -69, 7, -64,
+    15, 58, 71, -57, 69, 82, -7, 44, -14, -96, -100, 47, -68, -46, 96, 16,
+    38, -71, -42, -47, -5, 25, -99, 87, 14, 36, 60, -47, 0, -20, -70, -83,
+    16, 99, -97, -30, 71, 61, 63, 37, -40, -10, -24, -90, -84, 64, -92, -6,
+    75, 89, 96, -89, -78, 33, -56, -78, 80, -64, 26, -59, 54, -58, -9, -29,
+    -46, 29, 33, 73, -13, 24, -80, 54, 18, 51, -34, -75, -100, 62, -1, -98,
+    17, -28, -18, 50, -86, -43, 97, 77, 13, 59, -66, -51, -45, 63, 75, 61,
+    -64, -82, -74, 26, -49, -87, -80, -13, 93, 27, -53, 83, 8, -96, 81, 49,
+    10, 22, -88, -16, 46, -27, -7, 85, -3, -6, 79, -82, -86, 93, 64, 18, -68,
+    73, -22, -52, 54, -63, 72, -75, 26, -32, -72, -46, -64, 57, -31, -23,
+    -87, 73, 88, 99, -26, 68, 70, 12, -76, -27, -57, 65, -49, 25, 10, -45,
+    -42, 9, -35, 49, -14, -54, 47, -81, -10, 10, -45, 36, -73, -32, -22, 64,
+    60, 53, -39, -90, -89, -11, -51, -69, -83, 53, 4, -1, 89, 51, 43, 75,
+    -12, 34, -15, -39, 74, 20, -74, -80, 11, -68, -4, 21, 56, 93, -33, -85,
+    5, 35, 72, -10, -40, -35, 0, 2, 68, -8, 64, 10, -47, 16, -9, -77, -4,
+    -90, -81, -92, 23, 40, 44, -72, -52, 54, -51, 27, -83, 73, 72, -73, -58,
+    -68, -9, 54, -24, 67, -21, -27, 34, -100, 71, -81, 49, -56, -21, 26, 29,
+    -22, -37, 51, -71, 26, -32, -29, 50, -10, 48, 26, 21, 54, 11, -72, -11,
+    61, -34, -11, -70, 60, -2, 40, -36, 69, -66, 33, -74, -40, 27, -85, 88,
+    14, 29, -29, 18, 33, 26, -55, -79, -64, 32, 22,
+  71, 57, -76, -50, -29, -68, 79, -9, -3, -26, 0, -21, -16, -98, -15, -28,
+    -100, -55, -66, -41, -88, -27, -31, -20, 23, -58, -4, -6, 61, -25, 85,
+    -16, -31, 66, -7, 78, -80, -88, 98, 13, -6, 30, -78, 2, 45, -64, -48,
+    -84, -94, -63, 94, 76, 13, 45, 98, 61, 7, -85, 93, 21, 84, 98, 88, -74,
+    77, -5, 9, -70, -70, 8, -71, -94, 45, 9, -41, 83, 22, -39, -72, -28, -11,
+    -79, 77, 65, 39, -41, -21, 89, 0, -46, 82, 55, -14, 26, -63, 92, 54, -68,
+    -98, 90, 29, 47, 1, -23, 25, 10, -62, 67, -52, 46, 20, -22, -7, 27, 79,
+    42, -94, 89, 37, 93, 98, 21, -35, 37, 48, -1, 85, 80, -10, 21, -83, -73,
+    -18, -56, -63, -22, 18, -91, 35, 96, -54, 35, -23, 85, 46, 57, -55, 30,
+    73, 31, 62, 80, -1, -56, -64, -32, -54, -1, -41, -94, -40, 19, 62, 35,
+    91, -21, -1, 31, 79, -39, 9, -66, 64, -41, 40, 22, -37, -4, -56, 46, 46,
+    -29, 64, 38, 1, -3, -2, 45, 87, -8, -10, 46, 51, 64, 77, 98, -73, -13,
+    47, 9, 24, -78, 18, 18, -73, 85, 60, 22, 91, -67, 96, 8, -97, 31, 23,
+    -42, 28, -52, -46, -81, -25, 68, 54, 7, -10, 13, -70, -37, 21, 12, -31,
+    99, 26, 79, 34, 29, -82, -2, 34, -70, -68, -78, -5, -54, 46, 55, 41, -19,
+    69, -47, 80, -94, -46, -56, -33, -82, 26, -7, 74, -7, 93, 29, -61, -87,
+    -90, 7, -2, -64, -97, -76, 85, 11, 52, -1, -29, 56, 80, 4, -76, 82, 68,
+    33, -85, 71, -67, -53, -78, -12, -52, 98, -83, -25, -51, -88, 47, 39, 64,
+    -89, 86, 77, 85, -67, 49, -85, -39, -15, -18, 32, 4, -96, -59, -34, 97,
+    84, 65, 81, 94, -29, -49, -16, -35, 72, -56, 39, 85, 93, -26, -46, -36,
+    73, -82, -95, -6
+};
+#endif
diff --git a/nc_test/tst_diskless5.cdl b/nc_test/tst_diskless5.cdl
new file mode 100644
index 0000000..809f406
--- /dev/null
+++ b/nc_test/tst_diskless5.cdl
@@ -0,0 +1,4206 @@
+netcdf foo {
+dimensions:
+	hrapx = 333 ;
+	hrapy = 200 ;
+	dates = 11 ;
+	latlong = 4 ;
+variables:
+	int amountofprecip(hrapy, hrapx) ;
+		amountofprecip:units = "1/100 mm" ;
+	float hrap_xor ;
+	float hrap_yor ;
+	float true_lat ;
+	float true_lon ;
+data:
+
+ amountofprecip =
+  -47, 2, -36, -48, 78, -23, -99, -48, -4, 90, -47, 80, -20, 35, -63, -45, 
+    52, -40, 58, -52, 75, 56, -80, -26, 72, 18, -28, -12, -79, -23, 34, 24, 
+    5, -11, 73, -8, 40, -69, 46, -20, -6, 23, -36, 96, 34, 42, 27, 91, 72, 
+    -26, 38, 47, -22, 41, -77, 31, -61, 36, -10, 68, 71, 24, 25, 44, -25, 49, 
+    -7, -20, 97, 0, -13, -21, 58, 56, -50, 75, 35, 53, 5, 96, -5, -60, 36, 
+    75, -72, 19, -58, -72, -75, 16, 22, 73, 34, 92, 56, -50, -6, 25, 79, -63, 
+    -61, -40, -37, -99, 53, 49, -57, 5, -17, -100, 68, 0, -87, -88, 38, 77, 
+    -83, -81, 48, -73, 82, 92, -77, 63, -8, 99, -83, 27, 64, 17, 73, 79, -66, 
+    45, 71, -53, 40, 86, -84, -8, 20, -94, -100, 60, -87, 92, -73, -32, -74, 
+    66, 47, -32, -82, -14, -21, 84, -100, -41, -7, -19, -50, 57, -76, -95, 
+    85, -16, 35, 72, -11, -45, 40, 53, -64, 61, 17, 66, 44, 82, 45, -37, 9, 
+    66, 89, -13, -1, -32, -78, 62, 10, 80, 93, -65, -57, -92, 78, 32, 4, -51, 
+    66, -5, 36, 82, 33, -100, -34, 28, 74, 32, 84, -6, -67, -39, -61, 52, 53, 
+    60, -80, -89, 60, -22, 58, 72, 20, -28, 19, 2, -89, -40, -86, 60, -5, 68, 
+    26, 14, 86, -33, 64, -67, -26, -50, -7, -65, 8, -40, -19, 10, -93, -33, 
+    -60, -30, -85, 22, 25, 43, -59, 82, -45, 43, -49, -65, -31, 50, 21, -87, 
+    -41, -72, 8, 28, 75, 56, 28, -72, -32, -84, 76, -42, -78, -16, -94, -16, 
+    57, 73, -22, 54, 32, -100, -87, 39, -41, -1, 87, -51, -95, -88, -28, 25, 
+    30, -6, -83, -60, -16, -27, 7, -46, 29, 83, 2, 57, -78, -26, -96, 64, 40, 
+    -60, 11, -78, -41, -82, -44, -82, 48, 85, 52, 36, 81, -33, -20, -62, -67, 
+    9, -53, -96, 52,
+  -98, 7, -49, -59, 89, 86, -68, -77, -44, 69, -79, 85, 55, 35, 21, 44, -33, 
+    83, 28, -96, 79, 31, 34, -76, 9, 61, -60, 12, 94, -5, 13, -85, -88, -28, 
+    -81, 61, -13, 5, 58, -44, 22, -14, -20, -47, -44, 98, -16, 8, -18, -22, 
+    -63, -15, -85, -67, -61, 66, 2, 4, -12, -26, -1, 29, 25, 21, -52, -55, 
+    91, 42, -11, -36, 26, -60, 10, 19, -93, 71, 7, 49, 69, -58, -77, 72, 46, 
+    -61, -90, -43, 78, -52, 95, 89, 90, -97, -96, 31, -79, 42, 53, -54, 4, 
+    -32, -56, 9, 68, 19, 40, -17, -26, 88, -21, 66, -20, -23, -22, -84, -69, 
+    12, -80, -60, -88, -82, 30, 34, 72, 46, -3, 96, 48, 91, -67, 95, 53, 92, 
+    -40, -22, 35, -27, 99, -78, -14, 21, 39, 52, -6, -22, -93, 87, -79, -74, 
+    0, -50, -5, -63, 50, -31, 78, -66, 61, 31, 80, 99, -72, 10, 56, 99, 84, 
+    -26, -76, 22, 53, -87, -88, -98, -39, -57, -43, -97, -93, -22, 52, -88, 
+    0, -39, -95, -12, -1, 20, 90, -78, -42, -70, 15, 89, -84, 39, -59, 82, 
+    -16, -35, -95, -23, -49, -90, 86, -10, 39, -7, -83, 18, 7, -31, -9, -47, 
+    -13, -48, -80, 33, 69, -1, 89, 81, -36, -28, -74, -97, -87, -61, 55, 77, 
+    28, -86, 4, 77, 35, 44, 98, 64, 60, 74, 15, -67, 58, 95, 58, -53, -15, 
+    76, -89, 62, 4, -80, 16, -7, 17, -96, -78, 32, -91, -29, -49, -59, -98, 
+    89, -1, -32, 24, 67, 59, -47, -49, 36, -57, -55, -80, -26, 7, -9, 41, 
+    -12, -79, 60, -60, 46, -67, 2, -94, 84, 36, 44, -28, 31, -46, 13, 30, 0, 
+    -2, -27, -59, 18, -21, -42, 18, -46, -33, 37, -77, 17, -86, 37, -41, 53, 
+    -17, -98, -1, -88, 4, 46, 42, -80, -61, -34, -60, 35, -94, 29, 16, -82, 
+    -47, 40, 21, 80, -82, -44, 65,
+  -46, 4, 35, 21, -10, -49, -77, 56, -96, 11, -43, -11, 87, 13, -43, 8, 14, 
+    11, -21, 82, 66, -12, -89, -2, 86, 2, -29, 51, 98, -7, -42, -30, -45, 
+    -48, 74, -13, -30, 78, -14, -46, 7, 49, 72, -16, -65, 53, -72, -7, 25, 
+    82, 83, 59, 95, -53, 75, 59, -81, -21, 13, 67, 76, 18, -70, 87, 32, 40, 
+    -77, -46, 29, -93, -71, 59, 53, -13, -52, 83, -76, -24, -34, -86, 93, 
+    -54, 69, 71, 53, -77, -17, -20, 95, 38, -83, -71, -44, -71, 31, -32, -11, 
+    -57, -93, 0, 54, -8, 92, 79, 84, 84, 6, 18, -86, -80, 74, -91, 98, 81, 
+    77, -91, -50, -78, 6, 39, -17, 50, -43, 14, -72, -33, -50, -60, 74, -63, 
+    -19, -75, -91, -24, 99, 50, 1, -82, 1, 42, -26, 20, 74, -78, 3, -7, -67, 
+    14, -13, 65, -67, -33, -61, -81, -4, 0, 28, 81, 12, -76, -13, 53, -80, 
+    16, 54, 37, -18, -99, 22, -49, 58, -20, 37, -30, 58, -38, 23, 98, -27, 
+    53, 48, -2, 62, -91, -5, -77, -23, -60, -61, -55, 67, 8, 9, 47, -2, -66, 
+    -27, -91, -16, 35, -62, -18, -71, -24, 5, 20, -6, -65, 84, -70, 72, -47, 
+    64, 70, 30, -24, 60, 5, -59, 35, -100, -87, -24, -45, 36, 45, -84, -73, 
+    41, 33, 50, 23, 75, 87, 99, -26, -37, -26, -73, -58, -64, 87, 32, -96, 
+    86, -23, -82, 38, -52, -15, -47, 15, 99, 83, -64, 43, 98, -57, -77, -8, 
+    -76, 8, 79, -72, 99, 94, -8, 84, 8, 31, -55, -23, 52, -14, 62, 74, -97, 
+    48, -67, 67, -76, -1, -38, -10, 87, 58, 42, 26, -13, 13, -59, 15, 69, 
+    -66, -10, 79, 16, 86, -13, 41, -65, 46, 57, 30, 48, -100, -4, -5, -24, 
+    89, -71, -31, -36, -60, -7, 49, 2, 18, 89, -6, 52, -76, 24, -64, -49, 
+    -93, -92, 81, -4, -64, -14, -79, 10,
+  1, -3, -38, 45, 20, 49, -67, -7, 19, 82, -65, 96, -1, 58, 34, -8, 90, -79, 
+    22, 65, 29, -84, 21, -33, 79, -30, -74, 60, 41, -49, 61, -8, -76, 51, 
+    -76, -54, -24, -97, -30, 21, 87, 20, 29, -94, 79, -16, -70, -27, 95, 60, 
+    -47, -83, -7, 74, -65, -39, 38, -43, 94, -79, 35, -58, 36, -39, 73, -89, 
+    85, -45, -88, 27, 77, -60, 29, 8, 74, 74, -17, 97, -84, 72, 96, 63, 41, 
+    -64, 42, 8, 76, -40, 80, -96, 73, 68, 87, -3, -25, 32, 83, -44, -29, -42, 
+    25, -44, 48, -15, 74, -62, -89, -47, -61, 49, 35, 76, 49, -80, 75, -64, 
+    43, 13, 63, 32, 88, -37, -69, 90, -31, 24, -7, 39, -100, 39, -95, -65, 
+    -21, 8, -54, 80, -88, 72, -11, -24, 27, 69, 89, 91, -94, 15, -95, 96, 37, 
+    69, 26, -20, -3, 93, -67, 84, 40, 48, -78, 10, -95, 31, -8, -33, -71, 23, 
+    -52, -59, 60, -91, -21, 73, -14, -92, 22, -100, -45, 95, 49, -19, 12, 
+    -41, 36, 46, -64, -51, -100, 81, 8, -79, -8, 55, 33, -49, -42, 64, -31, 
+    -68, 64, 43, -60, 27, -66, -29, -3, -100, 91, -100, 33, -92, -48, -81, 
+    -15, -35, -8, 34, -87, -32, 33, -77, 47, -80, 3, 84, 60, -6, -18, 50, 
+    -79, -89, 16, 94, 44, -4, 80, 6, 57, 71, -69, -26, -7, -53, -59, 91, 93, 
+    92, 54, 91, 2, 18, -48, 13, 7, -92, -62, 59, -49, -1, -51, 82, 36, -15, 
+    -1, 98, 8, 74, 98, -84, -51, -86, 40, -74, 53, -42, 0, 63, -67, 13, 32, 
+    -64, -74, 41, 8, -90, 64, 18, -78, -78, 72, -36, 63, 0, -3, -83, -40, 0, 
+    -7, -93, -61, 1, 2, 94, 77, 96, 35, 28, 18, -3, 58, -49, -81, 90, 89, 
+    -23, 6, -33, -80, 86, -51, -11, 51, 12, -9, -54, 86, -33, 43, 41, -52, 
+    76, -25, -14, -18,
+  43, -95, 27, -41, -28, 46, 10, -88, 4, 52, -72, -7, -67, 94, 0, -5, 85, 82, 
+    8, 66, 80, -54, 8, 18, -77, 62, 93, 86, -35, 86, 6, 69, -30, 31, 70, 8, 
+    23, -77, -14, -51, 71, -6, 56, 86, -53, 56, 74, -48, 94, -31, 17, -25, 
+    46, -12, 27, 8, 95, -21, 72, -57, 32, -13, -23, -49, -71, 61, 96, -11, 
+    12, -78, -24, -24, 59, -66, 28, 63, -40, -76, -95, 99, 44, 23, -20, 3, 1, 
+    -74, 76, -25, -52, 26, -31, 82, -85, 14, 66, -42, -87, -16, 6, -68, 34, 
+    -22, -3, -75, 90, 49, -40, -83, 91, -48, 13, 95, -34, 8, 75, -35, 74, 
+    -71, 6, 59, 19, 22, -97, 24, -23, -39, 6, -11, 83, -9, -33, 48, -32, -56, 
+    -41, 87, -64, -51, -72, -54, -46, -83, 19, -44, -96, -39, -74, 1, -38, 
+    40, -46, 70, -27, -83, 59, 43, -93, -5, 6, -23, -72, -89, 65, -33, 75, 
+    -1, 45, 22, 39, -86, -97, 41, 0, 20, 14, 75, -30, -36, 7, -28, 97, 19, 
+    -90, -70, -52, 99, 55, -87, -69, -61, -70, -20, 31, -5, -80, 40, -10, 2, 
+    -82, -78, 94, -73, -71, -75, 92, 83, 21, 36, 54, -72, 9, 1, -99, -49, 19, 
+    -79, 62, -42, -25, -19, 78, 20, 82, 89, -3, -9, 85, -99, -68, 91, 27, 31, 
+    -97, -45, -75, 80, -89, -37, -97, -37, 25, 6, 49, 51, -74, 87, 91, -3, 
+    -90, 63, 2, -39, -72, 27, 55, 84, 70, 4, 39, -88, -16, 61, 77, -30, 22, 
+    -75, 40, 63, 71, 62, -37, -99, 2, -66, 58, -20, -12, 85, 37, 73, -16, 31, 
+    7, -71, 65, -93, 41, -66, -48, -5, 27, -19, -26, 82, 55, 54, 60, 75, 44, 
+    -14, -89, 31, 46, -84, 92, -90, 80, 55, 56, -92, 89, 38, -11, 47, 87, 
+    -98, -69, 1, -57, -87, -76, 41, -22, 69, -100, -40, 46, -31, 14, 16, 24, 
+    43, 77,
+  13, -11, -88, -34, -19, 8, -55, 56, 35, -10, 71, 35, 93, 89, 62, 93, -92, 
+    -13, -43, 7, -78, 29, -48, 28, -69, -74, -74, 98, 4, -34, -90, 26, 9, 
+    -82, -69, -92, 19, -70, -55, 42, 51, 99, 15, 19, -21, 89, 56, 58, 17, 
+    -51, 9, 1, -91, -30, -21, 13, 95, -38, 38, 40, 54, -32, 90, -19, 50, -71, 
+    -33, -37, 28, 68, 20, -10, 66, 3, -29, 42, -5, 80, -7, 42, 86, 77, 67, 
+    43, -83, 9, -54, 12, -80, -87, -44, -1, 99, -38, 18, -7, 20, 10, -94, 
+    -47, 63, -86, -24, -37, 73, 95, -28, 73, -9, -86, 97, -43, 93, 65, -91, 
+    -16, 45, -27, -78, 43, 6, 4, 59, 6, 15, -75, 96, -27, -75, -88, -99, -74, 
+    -43, 57, 7, -47, -19, 83, -78, 2, -69, 21, -5, 57, 94, -35, 81, 56, 76, 
+    -99, -25, -26, 42, 43, -49, -28, -47, -33, 14, 25, 45, 15, 52, -78, 49, 
+    -11, 68, 53, -42, -66, -64, 27, -57, 8, -83, -80, 64, 28, 34, 33, 55, 23, 
+    -65, 58, -52, 30, 8, -85, 17, 8, 17, -32, 63, 70, 77, 29, 88, 98, 37, 
+    -44, 18, 39, 20, -98, -27, 35, 75, 59, 92, 98, 97, 20, -8, -62, -85, -39, 
+    -24, 97, -74, 63, 17, -74, -27, 74, -18, -56, -41, -96, -63, -16, 75, 
+    -42, 59, -5, 39, 59, 23, -36, 50, -46, 58, -25, -12, 3, -35, 30, -46, 45, 
+    10, 82, -93, -20, -85, -98, 80, -58, 0, 56, 81, 39, 16, -58, -5, -71, 37, 
+    -68, -42, -85, -87, 4, -10, 77, -17, 14, -38, -72, -22, 73, -63, 44, -19, 
+    27, -77, -98, -19, -86, 48, 71, 5, -66, -21, 59, -66, -8, -88, 46, -13, 
+    -1, -39, 9, 67, 92, 32, -81, -53, -35, 50, -35, -53, -68, -72, 63, -5, 
+    -68, 23, -16, -3, 36, 34, -45, -68, 43, 33, -61, 47, -1, 96, 86, -6, 69, 
+    28, 60, -65,
+  -78, 3, 9, 97, 63, -76, -56, -100, -28, 40, 5, 14, -49, 13, -62, -71, 68, 
+    50, 61, 67, -97, 32, 2, 50, 1, 41, 12, -53, 17, -50, -94, -13, -36, -1, 
+    -41, -82, -70, -28, -72, 99, 82, -32, 48, -20, -17, 77, 31, -1, 90, -79, 
+    -48, -83, 65, 80, 83, 77, -28, 22, 3, -18, 69, 31, -14, 10, -49, -13, 
+    -16, 98, -58, -59, -53, -7, 52, 45, 87, -62, 28, -62, -3, 1, 8, 46, -84, 
+    56, 88, -38, -77, -73, -57, -64, 33, 83, 21, -33, 11, -52, 52, -39, -74, 
+    -42, -38, -65, 72, 19, -18, 26, -55, -6, 0, 94, 98, 56, -4, 98, 7, -45, 
+    26, -91, 91, 53, 51, 63, -25, -37, 43, -41, 46, -47, 31, 13, -47, 1, 97, 
+    -34, 45, 49, 81, 67, 72, 52, -57, 74, 99, 5, -78, -22, -79, -79, 30, -98, 
+    -11, -74, 68, 44, -76, 13, 5, -37, 4, -47, 73, -87, -44, 10, 21, -92, 
+    -26, 55, 44, -52, -2, -31, -28, -40, 42, -92, 62, 4, 36, 1, 63, -68, 3, 
+    -6, -10, 62, -9, -99, -91, -81, -92, -56, 71, -65, 72, 86, -37, 59, -36, 
+    13, 48, -31, -44, 11, -67, 70, -50, 50, -56, 52, 12, -67, -3, 9, -41, -8, 
+    24, 50, 10, 75, 36, 2, -25, -59, 33, -53, 90, -95, 92, 78, -28, 37, 20, 
+    -58, 46, 65, -100, -59, 73, -20, -4, -7, 2, -67, 72, 25, 52, -55, 40, 
+    -51, 75, -80, -22, 49, -79, 14, 78, -19, -27, 91, 17, -25, 41, 34, -11, 
+    -94, -94, 37, -98, -61, -59, -30, 8, 61, -15, 29, -65, -54, 9, -14, -38, 
+    62, 49, -27, -35, 96, 93, 17, 70, -59, 63, -19, -21, 75, -50, -5, -44, 
+    18, -48, 30, -3, 67, 7, -31, -84, 97, 73, -41, 40, -62, -41, -94, 95, 
+    -53, 80, -75, 2, 77, -21, -52, 41, 13, -40, 97, -76, -39, -18, 93, -97, 
+    43, 94, -98, -92,
+  -56, 36, 82, -94, 53, 2, 66, -63, -72, 7, -39, 72, 69, -44, 12, -9, -66, 
+    -20, -81, -94, -44, 8, -61, -59, 89, 58, 57, -43, -57, 71, -66, 45, -81, 
+    47, -97, 24, 52, -14, 60, -12, 33, -71, 91, 45, -35, 2, 84, 62, -93, 26, 
+    -99, 3, 6, 9, -50, 76, -37, -19, 83, -78, -56, -64, -93, 34, 46, -17, 
+    -12, 73, -22, 41, -55, 25, 75, -24, -53, 88, 39, 58, -92, -83, -30, 81, 
+    -20, 64, 97, -54, -30, 15, -72, -49, 15, 5, 19, 3, 45, 7, -62, 76, 59, 
+    75, -97, 56, 38, 14, -28, -83, 82, 27, -96, 80, -33, -12, -5, 57, -47, 
+    56, 40, -72, 15, 73, -46, -42, -42, -23, 57, 44, 91, -68, -9, -50, 56, 
+    94, 29, 2, 4, -46, 76, -22, 93, -38, 98, 29, -85, 88, -32, -92, -83, 72, 
+    6, -44, -59, 11, -60, 89, -6, 35, 40, -9, 71, -30, 82, -30, -74, 89, 59, 
+    53, 90, 54, 25, -51, -76, 55, -92, -8, -52, 86, -43, -67, 50, -12, 12, 
+    36, -83, -12, 52, -49, 32, 92, 19, -50, 7, 70, -64, 0, 89, 71, 9, 35, 
+    -92, -87, -90, -33, 54, -26, -44, 38, 6, -2, 92, -15, -9, 4, 91, 35, -86, 
+    11, 48, 95, 31, 44, -5, -97, 19, 92, 25, 46, 29, -42, -51, -1, 89, -12, 
+    15, 18, -11, 77, 12, -97, -21, -49, -50, -53, 17, -13, 93, 29, -67, -71, 
+    18, 85, -28, -74, -18, 86, 12, -100, -99, 29, 17, 46, 58, 77, 9, -89, 37, 
+    1, -60, 79, 72, -18, -74, -76, -71, 89, -94, 91, -100, 8, 29, -32, 61, 
+    -66, -19, -35, -62, -7, -36, 90, 96, 55, 6, 76, -78, 70, -80, 25, -93, 
+    50, -9, 74, 39, 17, -92, 67, -57, -21, 40, 79, 18, -58, 92, 20, 3, -23, 
+    -64, -89, 35, 46, 53, -75, -2, -34, -27, -86, 27, 85, 67, 45, 14, -94, 
+    54, -32, 58,
+  79, 74, 33, 3, 35, -11, -20, 61, -41, 35, -3, 81, -62, -9, 24, -44, 50, 68, 
+    -33, 42, 30, 47, 82, -8, -7, 12, -95, 69, 85, -17, -65, 77, 51, -25, -49, 
+    -88, -30, -7, 52, -63, 43, 34, 64, 37, 62, 50, 25, 84, 91, 53, 41, 80, 
+    15, 78, 86, -45, 4, 14, 69, 98, -6, 61, 22, -73, -23, 93, 86, -1, 99, -7, 
+    -20, 87, -26, 77, 27, 51, 29, -93, -91, 13, 66, 63, 12, 4, 25, 24, 69, 
+    -36, -10, 96, 85, -73, 59, 45, -22, 46, -100, 53, 39, -95, -7, 29, -38, 
+    92, -35, 46, 98, -93, 11, 41, -22, -55, 42, -59, -15, -51, 85, -12, 91, 
+    -5, 94, 78, 79, 59, 45, -41, -51, 37, 9, 10, -89, -61, 6, 94, 63, -31, 
+    65, 73, 74, -2, 93, 98, -55, 21, 8, 92, 30, 22, 2, -37, 0, -67, 78, 75, 
+    -2, -87, 10, -86, 2, -19, 43, -62, 5, -68, -54, -57, -12, -95, 94, -72, 
+    -27, 61, 3, 46, -7, 39, 58, 50, 58, -15, 14, -39, 99, 12, 70, -47, 98, 
+    -17, 75, -36, 77, 84, -63, -21, -85, 87, -59, 76, -32, 51, -48, 37, 79, 
+    93, 36, 1, -44, -87, 60, 34, -26, 70, -53, 72, -92, -93, 1, -77, -93, 
+    -48, -32, 53, 20, -63, -62, -39, 76, -100, -12, 94, -64, 99, 98, -91, 
+    -85, 49, -76, 58, 53, -5, -36, -41, 4, -61, 24, 85, -63, 72, 41, -84, 10, 
+    19, 15, 63, 94, 16, -80, -22, 84, -99, -61, 51, -37, 21, 27, -67, -18, 
+    94, 64, -2, 76, -87, -88, 21, 53, 58, -10, 16, -74, 82, -42, -42, -76, 
+    -14, 85, -82, -1, 34, -10, 64, -41, 87, -6, 84, 77, 85, -47, 27, 36, 89, 
+    13, -83, -37, 12, 10, 47, 43, -75, -41, 73, -14, -2, -10, 86, 93, 1, -17, 
+    66, -60, 99, 73, 24, 65, 2, -77, -82, -57, 3, 24, -35, -79, 9, 3,
+  2, 47, 22, -45, 77, -45, -81, -69, 63, -7, 11, 4, 41, 14, -57, -17, 47, 98, 
+    13, 91, 63, -8, 41, -47, -28, -45, -88, 44, -63, -19, 30, -16, -41, 94, 
+    -55, -91, -93, -27, -85, -49, 65, -38, 38, -17, 18, 78, -81, -16, 32, 9, 
+    -76, -57, 80, -11, 72, -71, 87, -95, 85, -8, 85, -9, 49, 1, 1, -10, -27, 
+    14, -47, 44, 50, -10, -66, 7, 63, 12, -99, 27, 15, -20, 72, 65, 71, 71, 
+    17, 95, 47, -98, -8, -13, 0, 15, -29, -90, 17, -60, 56, 19, 37, -66, -34, 
+    -58, 81, -75, -47, 13, 95, 95, 22, -25, -44, 54, -72, 66, 46, 94, -6, 
+    -75, -61, 36, -81, -50, 59, -40, -32, 27, 90, 18, -48, -73, 81, -46, -91, 
+    57, 89, -46, -18, 59, -58, -99, 33, -41, 23, 68, -22, 17, 93, -57, 3, 
+    -74, 27, 46, 71, -54, -30, -88, -82, -73, -87, -29, 92, 14, -30, -63, 
+    -54, -15, -1, -55, 34, 40, 77, 18, -86, -97, 56, -43, -72, -42, -63, -54, 
+    -9, 54, 63, 34, -75, -84, -3, 60, -88, 28, -29, 56, 0, -38, 71, -81, -68, 
+    38, 74, -44, 94, 26, -53, 33, 90, 72, 20, 10, 48, 97, -48, 55, 11, -27, 
+    -92, -73, 24, 42, -12, 37, -89, -71, 60, 92, 68, 36, 86, 70, 63, -88, 0, 
+    -9, 21, -28, 56, 65, 33, -58, 45, -54, -83, 22, -3, 41, -28, -89, 36, 
+    -80, -75, 3, -21, -98, -51, -73, -82, -26, -86, -26, -55, -16, -64, -84, 
+    -55, -73, 31, -29, -36, 15, 39, -27, -79, 9, 8, 21, -77, 6, 42, -1, -70, 
+    -95, 73, -100, 46, -34, 36, -66, -5, -39, -45, -52, -56, -96, 91, -34, 
+    69, 24, -89, 0, -11, 91, -41, -86, -8, -44, -10, -24, -10, 43, -30, -29, 
+    -76, -19, 61, 76, 29, 83, -28, -15, 66, 8, -26, -74, -57, -21, 32, 61, 
+    -49, -57, -90, 50, 54, -33, -68,
+  -13, -4, 35, 3, -17, 74, -74, -56, -77, 21, -5, 72, -43, -29, -54, 22, -47, 
+    5, 92, -12, 13, 68, 15, -57, -34, 20, 70, -36, 63, 94, 12, 14, 12, 27, 
+    -33, -85, -72, 11, 99, -84, -85, -23, 82, 63, -80, 72, -4, 19, 60, -44, 
+    92, 75, -55, -84, -70, -29, -94, 21, 40, 71, -81, 88, 66, 58, -40, 81, 
+    -15, 32, 82, -56, -17, 44, 62, 18, -29, 72, -70, -79, 77, 22, 95, 59, 80, 
+    -73, -58, -35, 60, 89, -82, -47, -18, 45, -61, -97, -14, -24, 13, 43, 66, 
+    -44, -18, -48, -7, 26, -56, 66, 34, -62, 23, 44, 69, -85, -5, -57, 93, 
+    -54, -26, -92, -17, 54, -79, 52, -48, 74, -38, 89, 23, 58, 93, 4, -31, 
+    69, 5, 82, -42, 9, 57, 60, -27, -22, -66, -26, 8, -44, -88, 68, -60, 26, 
+    88, 37, -90, -80, -38, 2, 41, -11, -40, -16, 1, -13, -27, -19, 36, 78, 
+    -47, 80, -94, -68, 23, 2, 97, -62, 49, -49, -14, -92, 63, -64, -55, -71, 
+    40, -84, 79, -1, -76, 47, -96, -36, 15, 47, 30, -17, 22, -85, 96, 69, 
+    -40, 67, -9, -46, 15, 38, -86, 56, -55, -76, 94, -62, -9, -25, 46, 80, 
+    -1, -97, -68, 0, -21, -24, 58, -28, -74, -90, -8, -16, 9, 36, -90, 91, 
+    64, -70, -31, -28, -11, -62, 35, 99, 15, 25, -48, 92, 97, 13, -58, 38, 8, 
+    -59, 38, 35, -43, 73, 39, -80, 41, 19, 12, 97, 44, -75, 58, 40, -91, -80, 
+    -85, 14, 97, 11, 13, -6, 25, 39, -10, 14, 47, -34, -49, 12, 49, 26, 10, 
+    11, -78, -7, -92, 47, 93, -27, 57, -41, -22, -78, -30, 4, -30, 3, -70, 
+    14, 75, -76, -31, -22, -88, 65, -61, -31, -95, -96, 59, -14, -28, 2, 81, 
+    96, -6, -13, 19, -90, 39, -51, -33, -91, 95, -34, 79, 31, -96, -60, 71, 
+    25, 3, 27, 45, 30, 58,
+  -88, -41, -8, -60, 48, 88, 51, -57, -82, -37, 74, -51, 72, 6, -82, -34, 
+    -39, -93, 26, -94, -98, -67, 45, -36, -68, -57, 10, -100, -40, 38, -88, 
+    -1, -89, 59, -98, 35, -2, -60, -91, 32, -57, -30, 17, -18, 87, 6, -19, 
+    -54, 14, 33, -55, 54, 70, 35, -53, 41, -64, 24, -46, -32, -69, 70, 0, 90, 
+    19, 45, 28, -68, -47, -49, 83, 38, -79, 0, 99, -17, -83, 71, -11, -17, 
+    -93, 14, -33, -41, -39, 80, -78, -70, -22, 49, -68, -74, -28, 66, -75, 
+    96, 6, 21, -9, 21, 33, -69, 40, -47, 54, 13, 74, -84, -57, -48, -23, -13, 
+    23, -90, 80, -29, -78, 97, 96, -57, -58, 89, 52, -13, 0, -57, -48, -45, 
+    -88, 1, 74, -86, -91, -95, -85, -34, 75, -52, -20, -57, 64, 49, -29, 88, 
+    -45, 25, -26, 82, 77, -33, 58, 10, 30, -41, 62, 80, -8, 95, 7, -21, -25, 
+    -48, 78, -2, -72, -98, -53, 51, 25, -11, 63, -24, -87, 75, 17, 30, 59, 
+    30, -53, -34, 91, 54, -78, -43, 93, -40, -44, 5, 99, 67, 8, -36, 39, 87, 
+    -28, 22, -66, -99, -32, 85, -94, -80, -8, 17, -7, -81, -69, 34, 94, 86, 
+    -7, 62, -71, 53, 96, -35, 28, 21, -34, 51, -39, -5, 68, 17, -95, 34, 43, 
+    43, -41, -20, 33, -2, 59, -83, -55, 62, -80, -48, -83, -53, 11, -36, 69, 
+    1, 30, -93, -54, -73, 15, 20, 81, -30, 55, -94, -96, 12, -93, 68, -100, 
+    -18, -73, 71, -82, -33, 88, 49, 87, -2, -7, 19, -23, -97, 46, 37, -15, 
+    -49, 9, 19, 16, 74, 65, -7, 24, -16, 88, -20, 86, -37, -88, -63, 36, -37, 
+    -22, -20, 21, 84, 8, -1, -23, -77, 91, -90, 2, 35, -52, -66, 13, -40, 38, 
+    -29, -46, 80, 22, 49, -33, 16, 85, -15, -82, 31, -88, 86, 11, -30, -90, 
+    -51, -19, -10, -18, -24, -52, -68, -92,
+  -8, 56, 89, -65, 6, -49, -39, 93, -46, 15, 77, -27, 47, 53, 45, -39, 37, 
+    -92, -47, -2, -81, 84, 44, 37, 49, -94, 39, -18, -44, -23, 39, -3, -100, 
+    69, 48, -2, 44, 25, -59, -44, -93, 25, 91, 25, 13, -54, 9, 63, 8, 86, 76, 
+    19, -45, 25, 78, 46, -50, -67, 66, -28, -99, -33, 1, 99, -43, 94, 35, 
+    -53, 78, 66, -13, 9, 4, 63, -27, 35, -43, -31, 39, -60, -97, 66, -3, 53, 
+    18, -17, -40, -42, -57, 84, 89, 7, -71, -53, -17, -73, 70, 90, 32, 62, 5, 
+    -11, -93, 87, -5, 3, 66, -2, -1, -41, -43, 68, 50, -3, 34, -56, 35, -51, 
+    24, 88, -53, 19, 37, 48, 93, 26, -4, -1, 99, 37, -57, -39, -22, 4, -34, 
+    95, 56, 26, 66, 48, -66, 88, 65, 19, -65, 53, -33, 60, -99, -41, -10, 92, 
+    -51, -18, 19, -79, -28, 85, 27, -47, -74, -84, -30, 68, 73, -62, -15, 84, 
+    72, 49, 37, -54, -14, -91, 32, 97, 55, -6, -41, 68, -75, -65, -63, -15, 
+    -22, 65, 28, -99, -62, -98, 42, -99, 74, -98, -99, -66, -20, 68, 95, -63, 
+    -24, 44, -40, 89, 56, -73, 10, 58, 0, -73, -6, -38, 99, -38, -19, 43, 99, 
+    53, 41, -79, 71, 17, 46, 4, -16, -80, 20, -50, -33, -23, 11, 88, -13, 2, 
+    -81, 55, 53, 43, -37, -99, -53, 82, 26, 98, 65, 7, -92, -3, 5, -30, 59, 
+    -23, 44, -56, 58, 69, -14, -13, -9, -94, -83, -13, -64, 71, -29, 72, 95, 
+    39, 58, 64, -81, -93, -33, -69, 95, 88, 26, 49, -90, -13, -72, -42, -22, 
+    83, -65, -27, -51, 41, 5, 94, -19, -86, 18, 28, 42, 93, -92, -24, 42, 30, 
+    99, -19, -64, 84, 23, -22, 37, 90, -89, -43, -27, 13, -8, -87, 72, 4, 
+    -18, 25, -38, 84, -15, 92, -24, 96, -31, 59, -26, -88, 27, 82, 10, 10, 37,
+  29, 97, 59, 6, 9, 40, -85, -48, -10, -80, -66, -21, 24, -49, 25, -49, -39, 
+    9, -56, -39, 56, -70, -46, 65, -63, 80, 77, 6, 28, 40, -57, 4, 32, 6, 94, 
+    -18, -85, 94, -9, 75, 21, 24, -8, -23, 74, -92, 34, 92, -19, 84, -94, 49, 
+    33, 29, -9, -9, 94, -8, -2, -68, -40, -14, -14, -20, 57, 41, 4, 33, -66, 
+    57, 74, -82, 95, -42, 7, -69, -87, -13, -69, 68, -95, -35, 66, 43, -62, 
+    22, -86, -80, -84, -86, -92, 36, 57, -59, 20, -45, 7, -95, -12, -2, 7, 6, 
+    -73, -72, 6, -95, -78, 80, 96, -74, -44, 56, -28, 20, 54, -13, -22, -16, 
+    -63, 69, 11, 76, -39, -78, 61, 60, -42, 49, -39, -95, 60, 85, 76, -89, 
+    56, 46, -21, 71, -13, 0, 45, 82, 88, 57, -26, -14, -67, -55, -77, -97, 
+    -50, 12, -78, 27, 60, -50, 78, 72, 93, -70, -61, -2, 81, 62, -87, 75, 
+    -72, 25, -5, -21, -100, 55, -13, -11, 87, -20, 43, -33, 38, 31, 1, 21, 
+    -98, 47, 61, 15, 77, -18, 49, -30, 97, 48, -11, 37, -74, 45, -77, 29, 25, 
+    60, 52, -61, 55, -11, -40, 39, 32, -28, -36, 51, 56, 42, 13, -82, -82, 
+    -100, -71, 5, -37, 45, 9, -47, 23, -29, -42, 62, 93, -100, -77, 43, -97, 
+    -86, 25, -80, 73, -74, -99, 3, -74, 96, -43, -69, 58, -51, 41, 78, 3, 
+    -86, 47, -21, -8, -3, -64, -99, 54, 22, -59, -22, 4, 40, -5, -70, 35, 
+    -39, -63, -54, 29, 44, 99, 65, 59, -43, -6, -71, -45, 42, 21, -30, -49, 
+    -11, 77, 74, -19, -43, 53, 8, -35, 87, -59, 40, 67, 21, -23, -1, 18, -52, 
+    -75, -87, -11, 11, -74, 21, 78, -97, -90, -73, 36, 65, 95, -76, 48, 65, 
+    48, 41, 95, -36, 83, 15, 45, -81, 58, -32, 0, 92, 68, -26, -91, 96, -89, 
+    12, -76, 29, -6,
+  68, -49, -49, -42, -56, 98, -85, -7, 24, -27, -15, -45, -38, -34, -79, -71, 
+    96, -61, -48, -90, 11, -8, 15, -45, -34, -18, -17, 30, 75, -73, 88, -94, 
+    68, 58, 16, 37, -35, 65, 5, -61, -2, 44, -61, -61, -18, 37, -69, -58, 
+    -100, -55, -46, -40, -96, -54, -65, -65, -93, 55, 28, -81, 14, 43, 18, 
+    72, 74, -24, 53, -21, -55, 45, -97, -43, -95, -79, -19, -50, 62, -67, 43, 
+    -92, -18, -97, 22, 56, -17, -20, 18, -77, -79, 92, 0, 74, 16, -2, 61, -3, 
+    94, 47, 66, -59, 26, -96, -20, -60, 80, 41, 70, -59, -67, -27, 14, -92, 
+    -39, -85, 90, -95, 80, 27, 42, 77, 27, -79, 11, 4, -100, 17, 74, -57, 37, 
+    70, -29, -83, 6, -16, 44, 2, 10, -80, -79, -52, -29, 28, 75, -68, -96, 
+    -4, 86, -34, 18, -76, -21, -58, -59, -1, 54, 38, 11, 34, -11, -82, 66, 
+    -59, -59, -69, 76, 19, -21, -38, -96, -14, -46, 43, -44, -27, -69, -6, 
+    -56, 77, 45, 90, -46, 4, -36, 76, 40, -88, -40, -65, 39, 98, 12, 59, 50, 
+    -83, 14, -18, 89, -33, 74, 81, 96, 37, -90, 50, -24, -54, 34, 88, -97, 
+    -18, -96, -42, -7, 10, 12, -9, -44, 33, -52, 85, -59, -34, 20, 74, 53, 
+    44, 63, -99, -3, -24, 36, -62, -9, -26, 91, -54, 42, -37, 98, 42, -48, 
+    -17, -73, 45, 25, 47, 79, 81, 24, 26, 36, -66, 51, -89, 17, -62, -54, 61, 
+    23, -85, -25, 65, -18, 27, -17, 4, -27, -99, 36, 82, -26, -87, -73, 32, 
+    88, 25, 46, -48, -2, 11, -41, 61, 9, -91, -29, -91, -91, -99, 23, -70, 
+    17, -64, -60, -98, -52, -2, -2, 33, 73, -64, 30, 77, -70, 44, 44, -51, 
+    93, 64, 23, 93, -98, -52, -67, -2, -91, 94, 41, -76, -6, -16, 27, -14, 
+    -1, -79, 4, -61, -10, 95, -77, 65, 44, -48, 48,
+  -47, 40, 8, -59, -7, 76, 59, 80, -60, -41, -67, 79, 40, -59, 58, -84, 95, 
+    56, 21, 72, 31, 65, 48, 74, 96, -52, 43, 74, 29, -87, 76, 46, -39, 81, 
+    90, -46, 67, 64, 63, -98, 71, -83, 6, 47, -15, 63, 30, 17, -5, 7, -83, 
+    44, 73, 57, -91, 68, 92, -16, 65, -83, 35, -99, 50, 44, 11, -8, 58, 2, 
+    77, -90, 56, -12, -6, 87, 4, 29, -83, 30, 3, 89, -25, 96, -25, 5, -98, 
+    -25, 64, 67, -3, -18, 3, -8, -83, -15, -91, 86, 50, -95, -50, 71, -90, 
+    -32, -80, 60, -21, 42, -73, -13, -81, -9, 92, 85, 19, -31, -79, 25, -18, 
+    -60, 93, 79, -95, 70, -71, 78, 77, 8, 37, -92, 74, 81, -39, 31, -94, -9, 
+    -33, 2, 96, 40, -3, -1, -16, 35, 89, 37, -76, -78, 59, 15, -84, -95, -54, 
+    72, -5, -57, 76, -94, 87, -25, 45, -70, -73, 78, 62, 72, -46, -78, -1, 
+    -93, -65, -13, 40, 69, 90, -6, 22, -52, -58, -87, -24, -66, -42, -29, -7, 
+    -100, -29, 19, -11, -49, -33, 98, 80, -87, -89, -24, -29, -96, 93, 14, 
+    -8, -35, 38, 53, 44, 15, 56, -81, 65, -87, 52, 25, 79, -34, 18, -92, -50, 
+    63, -53, -2, 45, 16, -52, -28, 86, 62, 72, -52, -40, -79, -27, -63, -76, 
+    -63, -10, -72, -52, 72, -16, -35, -49, 8, -44, -22, 64, -78, -50, 5, 69, 
+    29, 61, 93, -52, 44, -95, -77, 72, -1, 68, 13, -97, -97, 21, -91, 28, 
+    -18, -95, -54, 86, 40, -41, 34, -58, 57, 83, 97, -38, -53, 89, -90, 57, 
+    -96, 64, -78, 49, 71, 58, 54, -52, 53, 7, 98, 38, -51, -72, 37, 35, 58, 
+    -83, 71, -4, -83, 19, 96, -33, 53, -52, 73, -9, -31, 56, 35, -74, -69, 
+    -76, -78, -45, 88, 36, -18, 39, -65, 2, -18, -31, 80, -3, -40, 12, 65, 
+    12, 51, -49, -94, -63,
+  17, 94, 9, 92, 31, 90, 62, 98, -52, 5, -70, -44, 40, 6, -2, 26, 27, 0, -73, 
+    -82, -36, -76, 25, -45, -44, -10, 59, -39, -94, -11, -30, 99, -83, 26, 
+    -59, -21, -74, 23, 45, -33, -73, -62, -8, -30, 9, 92, -75, 11, 93, -16, 
+    -16, 5, 14, -36, 91, -28, 19, -57, -4, -24, -19, -34, -11, -85, 63, 48, 
+    10, -74, 49, -37, -29, -52, -79, 11, -86, 14, 32, -58, -32, -76, 15, 20, 
+    92, -2, -32, -23, -95, -99, 46, -38, -66, -4, 8, -94, -45, 45, -37, 25, 
+    -2, 58, 23, -76, 89, -100, -67, 77, -76, 0, 22, 69, 36, -20, -93, -95, 
+    53, -44, -15, -100, 58, -93, -72, 23, 32, -61, 18, 30, -22, 62, -3, -15, 
+    -30, -27, -60, -63, -15, 38, 10, -61, -6, -98, -27, 90, -6, -1, -100, 64, 
+    -9, -72, 75, 27, -65, -61, 90, -91, 15, -100, -9, 30, 88, 17, -71, 74, 
+    -44, -10, 86, -67, 5, 5, 41, 27, 52, 51, -93, -28, 6, -40, 3, 21, -57, 
+    17, 0, 46, -27, 6, -87, 41, 85, 59, 22, 60, -77, -41, -55, 27, 19, 48, 
+    -26, 9, -53, -70, 52, 52, 97, -26, 38, 10, 18, -62, 28, 36, 74, 35, 8, 
+    -94, -37, 16, 79, -35, 76, -9, 62, -62, -31, -90, 28, -36, 91, 40, 94, 
+    91, -49, -34, -6, -9, -3, 61, 2, -91, -28, -70, 46, 13, -50, -96, 52, 
+    -30, -56, -53, 75, -20, -31, -12, 77, -91, 11, -7, 36, -65, -55, 30, -47, 
+    -68, -7, 55, 76, 9, 61, -94, -16, -89, 42, 29, -100, 58, 82, -60, -90, 
+    -46, 53, 40, 18, 63, 99, -28, -14, -90, -79, 95, -44, 58, 3, 61, 46, -9, 
+    13, -87, -14, -49, -9, 0, -94, 53, 34, 39, 19, -20, 59, -87, -43, -87, 
+    28, 62, -79, 99, 92, -55, 50, -87, 74, 29, -90, 63, -66, 16, -90, 60, 7, 
+    -28, 30, 81, -57, -32, 74,
+  65, 98, -63, -38, 53, -60, -25, -14, 14, 80, 16, -34, 81, 73, 77, 50, -79, 
+    -90, 54, 85, -16, -67, 91, 54, -37, -40, -61, -74, -28, -78, -14, 48, -3, 
+    3, 63, -75, 85, -52, 77, -21, -77, 49, -73, -57, -65, 48, -83, -10, -86, 
+    67, -83, -55, 84, 22, -32, -64, -81, -4, 60, 89, -21, 49, -89, -6, -31, 
+    -64, 70, 33, -43, -38, -44, 65, 95, 20, -60, 78, 25, 88, -15, -74, 59, 
+    -72, -83, 91, 51, 71, -96, 8, 53, -25, 81, 54, 5, 64, 79, -67, 95, -10, 
+    -69, 97, 71, 94, -87, -24, 16, 99, -13, -67, -21, 93, -28, 21, -25, 0, 
+    78, -67, 14, 79, 28, 3, 13, -33, -99, 85, 91, -87, -15, -22, -15, -1, 
+    -95, -66, -70, -59, 93, 47, -5, 52, -58, -47, 94, -47, 37, 58, 88, -57, 
+    -54, -51, 33, -11, 74, 3, 73, 2, 71, 40, -36, 91, 43, 39, -69, 37, -74, 
+    -57, 95, 10, -25, 55, 40, -52, -7, -73, -76, 61, 44, -3, 73, -65, -86, 
+    34, 96, -18, -67, -51, 56, 80, 0, -72, -67, -49, 19, -61, 61, -44, -81, 
+    -88, -29, -73, -25, -8, -4, -77, -83, 47, -71, -12, 11, -50, -99, 77, 
+    -96, -64, 55, 37, -96, 54, 94, -15, 90, 2, 74, -99, -63, -57, 2, -33, 
+    -60, -25, 49, -39, 75, -20, 65, -66, 51, -33, -26, 1, -8, -95, -34, 40, 
+    -67, -2, 69, 40, 50, 58, 54, -7, 92, -55, 6, 51, 83, -46, 87, -81, 42, 
+    30, -39, 62, -22, -57, -27, -19, -75, 81, -12, 46, 58, -49, 23, -55, 77, 
+    67, -42, -40, 79, 74, 62, 77, -47, 82, 35, 28, 30, 77, 20, 85, -32, -47, 
+    -63, -76, -94, 10, 93, 54, -11, -70, 7, 55, -31, 38, 11, -36, 68, -83, 
+    -33, -61, -33, -95, -39, 42, 60, -27, -11, -4, 43, 30, 93, -45, -60, 12, 
+    27, 93, -30, 92, 47, 17, -29, -13, 0,
+  -83, -12, -18, 85, 87, 58, 46, -1, 38, -16, 58, 93, -30, 96, 22, -44, 83, 
+    62, 65, 28, -31, -79, 51, 62, -73, -53, 31, 27, -44, 7, -18, -9, 3, -95, 
+    11, 59, -15, 53, 51, 64, 52, -85, -58, -95, 85, -28, 17, 81, 77, -78, 22, 
+    78, -98, 57, -82, 25, -50, 50, 94, 15, -62, -76, 26, -55, -100, -15, 7, 
+    54, -60, -17, 8, 16, 99, 48, -31, -40, -49, 94, 85, 44, 0, 3, -23, 18, 
+    -22, -41, -81, -36, 49, 60, -3, -41, 36, 4, 83, -21, 67, 15, -29, -44, 
+    -72, -64, -19, -47, 45, -78, 26, -41, 43, 57, 2, -13, 84, -9, -36, -71, 
+    -91, -95, 30, 14, 42, 46, 47, 46, -40, 67, -24, -46, 54, 54, -8, -97, 
+    -31, -52, 89, -6, 9, -13, -20, 93, 23, -67, 72, -65, 50, -74, -51, -68, 
+    68, -84, 48, -21, -94, -68, -17, -95, 83, -21, 25, -77, -73, 6, -4, -59, 
+    -79, -41, -71, -96, -42, 38, -54, -35, -32, -31, -21, 68, -58, 48, 2, 92, 
+    -10, -32, -10, 19, -22, 4, 20, 30, 94, -31, 29, -91, -81, -78, 90, -68, 
+    74, -17, -32, 68, -29, 79, -58, -38, -80, -31, 73, -91, 11, 65, 48, -19, 
+    -93, 36, 48, -60, -63, 60, 61, 50, -49, -43, -78, -48, 78, 7, 55, -32, 
+    79, -87, 42, -54, -88, -52, 51, 32, 31, 56, 92, 61, -25, 6, 69, -74, 96, 
+    3, -12, -37, 17, 74, 73, 80, -32, 82, 38, -44, -61, 31, 0, -8, -13, -14, 
+    -39, 86, -7, -69, -29, 82, 50, 34, 19, 17, 73, 10, 61, 82, -58, -12, -4, 
+    -53, -76, -9, -33, -11, 84, 72, -29, -13, -45, -70, -15, 47, -52, 84, 
+    -39, 18, 51, 70, -80, 3, 36, -71, -2, 64, 94, -77, 83, 39, -75, -69, -95, 
+    15, -87, -53, 98, 11, 70, -34, -37, -64, -69, 97, -93, -54, -41, 99, -18, 
+    -22, 58, -56, -21, -57, -19,
+  84, 79, -12, -29, 77, -7, -48, -76, -72, 3, 43, 69, 60, 2, 90, -8, -94, 67, 
+    -14, -32, -26, -6, 37, -70, -46, -62, -60, 83, -69, -96, -51, 55, -39, 
+    79, -82, -50, -14, -74, -10, 34, 95, -19, 15, -35, -34, 47, -95, 10, -61, 
+    -7, -92, -94, -45, -100, -52, -52, 41, 48, 49, -84, 10, -78, -95, -37, 
+    -100, -48, 12, -15, 47, 1, -75, -33, 69, -27, 60, -59, 39, -68, -22, 73, 
+    89, 99, 6, -68, -61, 61, 22, -70, 48, 61, 13, -24, -75, 72, -11, -42, -2, 
+    -39, 3, 90, 93, -24, -24, -78, 74, -1, 69, -10, -97, 67, -9, -25, -86, 
+    67, 64, -91, -89, 92, -53, -70, -90, -29, -6, 23, 48, 59, -17, 72, -49, 
+    -35, 44, 34, 43, -79, 22, -77, 63, -53, -32, 3, -59, -1, 86, 65, 86, 14, 
+    -72, 10, 44, 24, -69, -86, 24, 37, 31, 22, 52, 97, 34, -43, 80, -86, -33, 
+    -89, 29, -10, -63, 61, 16, -43, 53, 89, -47, 15, -81, -20, 83, -81, -81, 
+    -83, -50, 88, 88, 43, -13, 60, 80, -97, -2, -11, 71, -75, 42, 29, -30, 
+    27, -35, 23, -16, 31, 22, 63, -29, 25, 77, 59, -93, -38, 23, -84, 7, 72, 
+    -57, -89, -4, 4, 8, -92, 42, 93, 88, 98, -9, 60, 14, -25, -81, -81, 40, 
+    83, -4, -32, -61, 70, -34, -54, 10, -75, -6, 60, 74, -79, -71, 2, 65, 
+    -55, 47, -48, -32, 97, 27, 82, 52, -47, -26, -85, -62, 65, 4, 13, 1, 58, 
+    -42, -70, 73, -51, 84, 1, -9, -3, 77, -61, 54, 2, 81, -60, 7, -21, 27, 
+    53, -11, -14, -96, 54, 12, -78, -72, -76, 17, 7, -18, 41, -20, 92, 59, 
+    -24, -39, -11, 34, -32, 26, 94, -16, 96, 18, 76, 74, 73, 6, -21, 71, -56, 
+    -40, 41, -79, 78, -5, 15, 10, -100, 1, 36, -94, -29, 55, -79, 35, 55, 
+    -61, -5, -60, 5, 64,
+  -24, -17, -78, 90, 48, 49, 95, -60, 98, 99, 43, 42, 34, 90, 35, -17, -8, 
+    82, 48, 80, -27, -66, -9, 60, -60, 59, 38, -53, -83, 1, 69, -18, -20, 73, 
+    74, 70, -23, 96, 47, 77, 86, -100, 26, -54, -48, -56, 32, -90, -90, -9, 
+    69, 55, 26, 5, -85, 6, -92, 9, 30, -92, -53, 37, 41, -17, 67, -68, -95, 
+    60, 96, 33, -6, -43, 72, -10, -7, 68, 41, -12, -57, 63, 0, 62, -74, 66, 
+    59, -12, -46, -25, -69, -32, 82, -52, -37, -12, 61, 24, 72, 13, -25, -68, 
+    77, 55, 68, 24, -83, 71, 55, 90, 1, -26, 88, -2, 87, 75, 24, 44, -8, 72, 
+    -100, 57, 59, -20, 57, 83, 34, -88, -2, -48, -15, -28, 54, 31, -59, 71, 
+    91, 66, 31, 38, 92, 22, 83, 23, 87, -92, 39, -96, -94, 78, 24, -10, -79, 
+    -66, 42, -83, -93, 4, 87, -8, 47, 24, 47, 78, 36, 8, -97, -32, -30, -78, 
+    -22, 3, 73, -72, 67, 14, -21, 65, -41, -49, 97, 69, 44, 68, -65, -85, 62, 
+    -88, -94, 20, -82, 19, -59, -57, 13, 11, -88, 28, 7, -50, -87, -96, -39, 
+    38, 36, 38, 39, -44, 37, 80, -81, 59, 82, 82, -48, 78, -16, -32, 23, -96, 
+    -2, 77, -46, -53, -100, -63, -59, 7, 23, -97, -95, -29, -25, -53, -29, 0, 
+    60, -29, 84, 45, -82, 59, 73, -95, 31, 17, -23, -40, -92, 76, 18, 86, 24, 
+    19, -65, 40, -45, -62, -58, -27, -54, -45, 89, -5, -39, -73, 58, -29, 
+    -31, 17, 32, 23, 5, -95, -65, -6, 35, 48, 85, 3, -48, -92, 3, 76, 86, 
+    -27, 68, -92, -77, -26, 31, 23, 68, -73, -58, -47, 35, -89, -75, -19, 32, 
+    -69, 18, 25, 20, 52, -89, -82, -11, 65, -2, -8, 26, 75, 98, 48, 71, -30, 
+    1, -20, 68, -87, 56, 86, -28, -87, -51, 10, -26, -90, 69, 42, -70, 89, 31,
+  1, 45, 97, -29, -78, -76, -72, 36, -53, -44, 16, -100, -93, -63, -5, -41, 
+    -53, -54, -17, -90, 51, 72, 26, 10, 33, -30, 38, 61, -16, -92, -37, -67, 
+    8, 75, 67, 2, 16, 25, -26, -88, 14, -15, -78, 97, -98, 61, -63, -25, 77, 
+    76, -71, -57, 65, 31, 15, 79, 44, -89, 25, -15, -57, 29, 68, -67, 93, 
+    -47, 61, 76, 52, 15, -95, -29, 19, 32, -57, 74, 7, -96, 5, -37, -23, -49, 
+    79, -81, 92, -82, 52, -29, 26, -38, -26, 78, 66, -87, -40, 85, 11, 83, 
+    89, -46, 27, 24, 18, -26, -48, -45, 43, 63, -44, -35, 48, -67, -49, -96, 
+    63, -26, 8, -84, -47, -84, -26, 22, -45, -8, -89, -92, -5, 73, 64, -9, 
+    -60, -100, 76, 55, -40, -12, -9, 13, -24, 96, 49, 91, 98, 36, 15, -10, 
+    38, 79, 79, -20, 98, 2, -39, 14, -3, 93, -97, -42, -15, -22, 97, 98, 8, 
+    29, -25, 49, 12, -5, 82, -55, -14, -29, -42, 90, -48, 11, 93, 24, 42, 30, 
+    -52, -47, -21, 25, 68, 69, 37, -68, 91, 1, -85, -80, 20, -7, -85, 52, 
+    -71, 2, 88, -9, 37, -94, 52, -5, -68, 41, -57, 38, 0, -16, -33, -32, -71, 
+    52, -98, -80, -51, 43, 32, 81, -54, -13, 89, 38, 99, 38, 33, -37, 10, 
+    -30, -85, -6, 96, -19, 66, -54, 1, -32, -3, 13, -68, 54, -39, -94, -7, 
+    -88, 93, -3, -96, 11, 1, 30, -96, 83, 81, -83, 78, 31, -33, 19, -70, -56, 
+    89, 77, 31, 24, -40, 21, -61, 51, 50, 24, 27, 35, -47, 31, 91, 14, 59, 
+    -92, -47, -4, -4, 63, 55, -64, 42, -56, -46, 38, 8, -12, 37, -50, -89, 
+    -37, 38, 33, -32, 90, 84, 63, 3, -47, -19, 89, 51, -41, -80, 10, -34, 
+    -46, -91, 1, -10, 37, -3, -57, 78, 86, 55, -37, 17, 92, 52, -1, -50, -57, 
+    -71, 95, 65, 38, 27,
+  -29, 51, -86, 83, 24, -63, 18, -20, 8, -46, 27, -82, 58, -17, -67, -88, 
+    -41, 89, 91, 57, 64, 62, -57, 31, -51, -87, 27, -98, -67, 44, 57, 84, 37, 
+    -58, 3, 34, 40, 53, 64, -71, -35, -66, 42, -81, -44, -20, 49, 76, 28, 
+    -13, 32, -93, -15, -79, 49, 53, -75, 72, 29, -62, -41, 70, 19, -43, -9, 
+    -11, 3, 97, 31, 62, 37, -9, 60, 15, 73, -85, -48, -58, -97, 91, -97, -61, 
+    -92, -68, -39, 51, -30, 88, 45, 3, 17, -9, 9, -48, 80, 51, 88, -34, -43, 
+    -42, 65, -89, 30, 39, 84, 70, 89, -25, -32, 57, 33, -58, -88, -27, 59, 
+    -84, -99, 15, 13, -5, 90, 80, 78, 76, 23, -15, -4, -25, -5, 11, 8, 55, 
+    68, -85, -91, 68, 88, -19, -22, 61, -95, -42, -52, 34, 20, 35, -20, 24, 
+    26, -95, -71, 89, -54, -96, -59, -43, -12, -3, -10, -10, -37, -29, 91, 6, 
+    76, -58, -31, 85, -36, -21, 2, -79, 62, 30, -55, 2, -29, -14, 65, 53, 84, 
+    -67, 55, 57, 72, -30, 41, 81, -31, -52, -14, 80, -68, 63, 43, 86, -85, 
+    16, 63, -29, -91, -55, 32, -26, -32, -76, -73, -28, -57, 0, -85, -22, 43, 
+    94, 62, -55, -95, 36, 96, 94, -62, -92, -44, -16, -9, -7, -62, -11, -53, 
+    30, -7, -82, 88, -37, -21, 0, -60, 14, 88, -64, -47, -70, -64, 76, 31, 
+    36, -42, -58, 9, 24, -9, 12, -71, -37, 34, -25, 79, 10, 48, -95, 41, -14, 
+    -77, -60, -74, 59, 20, 69, -1, 41, 97, -43, 21, -73, 49, 9, -55, -71, 
+    -50, 97, -2, -22, -73, -92, -83, 86, -50, 73, 0, -6, -57, 30, 61, 38, -1, 
+    -88, -95, -88, 55, 54, -44, 3, -55, -5, -73, 60, -90, 64, 28, -23, -90, 
+    -80, 93, -16, 60, 82, -84, -86, -60, 44, 90, 96, 57, -100, 76, -83, 34, 
+    37, -54, -45, -52, 25, 7,
+  51, -86, -88, 48, -91, -61, -60, 52, 76, 0, 72, 52, 0, -8, -36, 43, 48, 
+    -58, -41, 40, 41, 54, 15, 39, -64, 84, -60, 9, 22, -26, 89, 20, 64, -88, 
+    63, -17, 38, -58, 85, 82, 98, -9, -32, 18, -67, 40, -77, 66, 3, 34, -89, 
+    -84, -30, 51, -95, -34, -42, 64, 48, 62, -89, -2, 29, 11, 94, -96, 93, 
+    67, -81, -47, -90, -21, -90, 71, -78, -24, -21, -10, -11, -67, 80, 59, 
+    -44, -26, -66, 7, -71, -19, 59, 62, 81, 41, -15, 44, 42, 95, 69, -11, 98, 
+    -78, 19, 39, 44, -55, 5, -82, -3, -28, 30, 5, 32, 18, 24, -50, 39, 12, 
+    72, 20, 48, 85, 91, 74, 25, -71, 55, -12, -16, 39, 40, -82, 72, -34, -73, 
+    39, 88, -15, 83, 54, -79, -48, -51, 50, 57, 32, -90, 43, 18, 42, -20, 
+    -38, -7, 96, 12, -67, 1, -46, 13, -14, -69, -46, 97, 24, 90, -47, -30, 
+    -57, -1, 47, 74, -40, 38, 43, -77, -77, -96, 71, -62, -93, -18, -48, -34, 
+    -78, -93, -14, 39, -70, -26, -76, 91, -56, -60, 89, -91, -23, -47, 28, 
+    89, 69, 97, -83, -47, 62, 45, 43, 47, 68, 5, 0, 6, 76, 57, -35, 80, 31, 
+    36, -93, -94, 66, 5, -17, -22, -7, 72, 43, 13, -4, -18, 96, -66, -60, 
+    -36, -34, 59, 20, -81, 74, 3, -5, 29, -15, -21, 78, 89, -45, 18, -64, 5, 
+    -35, 88, -28, -32, -88, -90, 35, -86, -82, -4, -79, 55, -57, 70, -71, 79, 
+    -48, -64, 35, 90, 49, -94, -83, -51, -56, -3, 94, -89, -13, 18, 40, -47, 
+    -28, -3, -12, -24, -70, -83, -75, -11, -28, 70, -3, -49, 1, 87, -77, 42, 
+    -30, 83, 46, -11, 6, -44, -77, 51, 40, 82, 51, 46, 53, 96, 74, -10, -48, 
+    -15, -33, -80, -79, 21, 26, -31, 23, -46, 17, 28, -58, 8, 35, -2, 99, 
+    -21, -38, -74, 86, -89,
+  -70, -10, 18, -2, -78, 91, -65, 96, -34, 55, -51, -58, 15, 61, -20, 87, 
+    -69, -74, -17, -35, 67, 60, -82, 94, 2, 50, 62, -70, -56, 61, 64, -41, 
+    64, 24, 85, -15, -76, -27, -70, 20, -29, -38, -1, 30, 61, -4, 67, -25, 
+    -39, -12, 58, -79, -79, -58, -7, -69, -78, -64, 78, -11, -20, 55, 42, 28, 
+    32, 49, 75, -94, 58, 55, 98, -99, 9, 38, -89, 21, -7, -72, 68, -29, -6, 
+    -61, -95, -41, 43, -60, 5, -79, -90, 14, -95, -56, 66, -90, 29, -96, -18, 
+    49, 56, -50, 57, -49, -58, 21, -68, 92, 32, -34, 18, -29, 83, -83, 63, 
+    -61, 71, -57, 31, -81, 42, -52, -34, -72, 59, 34, -9, 25, 92, 60, 87, 
+    -25, -44, 82, -63, 62, -97, -49, 40, -13, -5, -75, -29, 82, -42, -37, 76, 
+    83, 73, -12, -92, 24, 70, -53, 11, 12, -6, -29, 40, 80, -56, 35, 11, 92, 
+    -25, -20, -23, -23, -1, 25, -4, 22, -84, -44, 84, 51, -47, -51, 27, 78, 
+    -5, 49, -65, 91, 6, -62, -7, 86, -63, -45, -99, 65, -44, -54, 69, 19, 
+    -100, -42, 19, 41, -17, 66, -57, -95, 52, 59, 51, -100, -5, -92, -32, 
+    -96, 11, -17, -92, -59, -50, -69, -74, 71, -26, 90, 97, 58, 73, 8, -20, 
+    -87, -25, 64, -84, -34, -46, 54, 97, 98, 11, -92, -18, 73, 44, -100, 16, 
+    -79, 76, 9, 52, -60, 21, -62, 45, -49, -89, 71, 96, 84, 36, 30, -19, -11, 
+    -88, 87, -24, 10, 79, 50, -39, -66, 63, -80, 16, 14, -28, -20, -54, -40, 
+    31, 9, 26, 36, -73, -42, 79, -5, 76, -8, -89, 32, -60, 4, 28, 26, -85, 
+    -94, 72, -69, 26, -68, 30, -95, -72, -38, 49, -22, 65, -4, -30, 32, 28, 
+    51, 46, 45, -48, -23, -22, 16, -98, -35, 94, 20, -7, -95, -19, 7, -22, 
+    30, -75, -51, -52, 16, -60, -25, -37, 15, -97,
+  77, 9, 14, -31, 69, 63, 32, -39, -87, 88, -25, -41, 91, 44, 85, 90, 69, 
+    -23, 57, 33, -71, -50, 42, -8, 3, -75, -53, 39, 73, 90, 45, 35, -46, 55, 
+    26, -43, -42, -20, -10, 8, 36, 53, 69, -48, -58, -21, -24, -99, 12, -53, 
+    -33, 92, 92, -98, -86, -67, 48, -18, 33, -96, 24, -94, -73, 43, -21, -40, 
+    -37, -77, 14, 28, 14, -91, 64, 71, 57, 79, -15, 39, -16, -62, -89, 75, 
+    49, 25, 54, -39, -63, -64, -38, 23, 33, -46, 25, 4, -76, 21, 8, 67, 19, 
+    30, 45, -100, 12, -68, 9, 35, -36, -3, 12, -62, 91, -55, -46, -10, -8, 
+    22, 83, -20, -98, -74, 25, -60, -54, 85, -91, -89, -11, -52, -65, -5, 
+    -14, -20, 2, 92, 11, -17, -48, 22, -82, 89, 28, 15, -24, 77, -16, -61, 
+    84, -14, 33, -26, 55, 15, 85, 57, -44, 86, 31, -55, -58, 97, 6, -88, 5, 
+    31, -58, 67, 31, -96, 99, 65, 78, -72, -3, 9, -1, 31, -70, -78, 36, -82, 
+    -50, -42, 41, -14, -51, -39, -23, -65, 70, -17, 31, -12, 32, 72, -48, -3, 
+    -73, 19, -23, 72, 35, -78, -74, -97, -5, 90, -70, -21, -47, 65, 79, -20, 
+    82, -93, -11, -29, 81, -3, 40, 64, 10, 24, -5, -42, -15, 82, 46, -21, 41, 
+    -65, -89, -66, 81, -75, 57, -99, 51, -46, 4, 26, -47, -71, -44, -14, 51, 
+    3, -42, -62, 82, 3, -77, 48, 40, 36, 66, -34, -85, 23, -59, 99, 29, -87, 
+    -70, 95, -42, -60, -53, 80, 36, 74, -45, 46, 93, 67, -13, 77, -4, 77, 
+    -92, -48, -1, 45, -87, 24, 83, 34, -76, -61, 68, -84, 74, 7, -53, -20, 
+    -77, 55, 15, 31, -8, -38, 85, 21, -63, -20, 88, -85, 38, -28, 0, 95, -40, 
+    -6, -18, 65, -80, 55, -28, -22, -7, 75, 93, -77, -58, 69, -51, -26, -25, 
+    39, 11, 93, -51, 29, -56,
+  -24, 64, -93, -14, -41, 64, -59, -90, 17, -81, 5, 81, 76, 24, -92, -75, 33, 
+    -12, -58, -65, -17, -46, 79, 87, 56, -28, 18, 24, 60, -21, 49, -13, 7, 
+    -21, -98, -56, -71, 59, -10, -24, -30, -29, -22, 42, -36, 29, 50, 14, 76, 
+    96, -92, 85, 16, -64, -81, 23, -1, 88, -14, -84, 47, -22, 89, -51, -81, 
+    -51, -36, 8, 27, 69, -94, 81, -94, -49, 82, -49, 41, 89, -13, -17, 38, 
+    -54, 83, -21, -54, 66, -32, 39, -30, 24, -60, -88, 2, 84, -100, -9, -10, 
+    -29, -92, -46, -25, -44, -16, 44, -1, 56, 10, -54, 30, -43, 30, 22, 46, 
+    -46, -89, -66, -15, -37, -7, -5, -26, 50, -72, 21, -35, 24, -45, 85, -16, 
+    72, -58, -18, -59, 0, -35, 7, 43, 38, 56, -94, -91, 77, 56, 72, 53, -83, 
+    -58, 54, -12, 42, -65, 70, 10, 73, -21, 47, -83, 7, -50, 23, 23, 76, -79, 
+    33, -60, -40, -34, -63, 33, -50, -84, 53, 58, 8, -95, -80, 25, 39, -65, 
+    -9, 17, 9, 47, -60, -16, 71, -62, -90, -37, 19, 51, 16, -81, -88, 5, -23, 
+    -94, 51, -2, -11, -30, 15, -12, 20, 31, -56, 30, 18, 91, -77, -49, -47, 
+    14, 95, 8, 43, -29, 61, -90, 16, 82, 29, -11, 80, 89, 36, -64, -10, 71, 
+    -11, -99, 61, -85, 70, -39, -63, 77, 54, 8, 75, -46, 27, 90, 77, 92, -89, 
+    -32, -32, 19, 48, 22, 89, 81, -31, -18, 34, 21, -50, -68, 50, -98, -46, 
+    53, -90, -59, 4, 47, -41, -15, 44, 63, -66, -63, 52, -66, -48, -91, 75, 
+    2, -86, 96, 45, 68, -25, -37, -17, 19, 74, 18, -28, 34, -65, -76, 63, 
+    -58, 12, 95, -87, -61, -84, -92, 5, 34, -15, -43, -78, -20, -51, -12, 93, 
+    -71, -53, 78, -82, 88, -10, 62, -22, 99, 29, -63, -35, -82, 17, 72, 59, 
+    -16, -1, -27, 19, 61, 86, -58,
+  10, 52, -70, 71, 84, 71, -29, -99, -2, -80, -44, 76, -70, 49, -65, 19, 46, 
+    4, -55, 64, -36, 38, -94, 55, 44, 91, 98, -28, -26, 89, -58, -16, 56, 
+    -10, 55, 21, -17, 34, -34, -66, 3, 54, 1, 17, 20, -30, -92, 72, -91, -36, 
+    -46, -57, -8, -5, 36, -63, -73, -91, 50, -41, 49, -73, 47, 4, 16, -96, 4, 
+    -67, 78, -59, -42, -8, -46, -8, -10, -7, 56, 98, 12, -72, -40, 85, -48, 
+    24, 26, -28, 99, -92, 20, 33, 91, -41, 19, 81, 26, 45, -35, -79, -12, 
+    -24, -56, 71, 56, 87, -3, 85, 54, -83, 50, -34, 65, 65, 31, -57, 4, 78, 
+    32, -15, -54, -26, -36, 21, -98, 45, 68, 99, 41, -50, -19, 75, 51, 68, 
+    20, 31, 2, 1, 90, -29, -48, 34, 89, 61, -40, 81, -24, 86, 3, 68, 48, -86, 
+    53, -81, 79, 46, 36, 30, -23, 10, -76, 42, -22, 35, 86, 25, -67, 75, 47, 
+    -37, 45, 75, 30, 29, 93, 14, -8, 13, -44, -23, 39, 84, -58, 68, 69, 67, 
+    33, 67, 22, -24, 64, -3, 57, -71, -21, 31, -8, 96, -37, -73, -64, -36, 
+    51, -4, 88, 88, -56, 47, -58, -44, -75, -10, -37, 79, -97, 5, 9, 16, -41, 
+    17, 83, 80, -70, 94, -41, -1, 0, -32, 42, -45, -37, 81, 72, -22, -77, 
+    -14, 81, 69, -19, 13, -29, -38, -52, 50, 77, -29, -60, 89, -8, 65, 50, 
+    62, -93, -17, -23, -91, 85, 51, -63, -95, 52, 87, -70, -55, -50, -55, 6, 
+    -23, -52, -9, -80, 92, 13, -83, 59, 60, 98, -26, 48, 1, -73, 56, -66, 22, 
+    27, -92, -35, -85, 53, 63, -22, 67, 41, 55, -77, 28, 19, -30, 38, -96, 
+    44, -71, -61, -3, -90, 14, 41, 84, 99, -47, 41, 30, -61, -42, -20, -60, 
+    30, 6, -58, 45, -1, 80, 72, 15, -43, -55, 95, -75, 99, -92, 75, -58, 41, 
+    15, 39,
+  -52, 24, 59, -73, 48, 3, 96, 84, -83, 41, 81, 14, 3, 31, -72, -51, 64, -26, 
+    -12, -10, 65, 76, 99, -25, 6, 57, 9, 23, -69, -66, 14, 56, 2, -18, -65, 
+    -7, 42, 58, 47, 94, -54, 61, 46, 92, -53, -25, 23, 32, -47, 71, 90, -61, 
+    -54, 35, 94, 3, -81, 85, -60, -18, 8, -44, 66, -50, 5, 0, 42, -50, -62, 
+    9, 98, 52, -68, -66, -33, -36, 49, 90, 53, -68, 83, 98, -50, 88, -93, 38, 
+    -41, -3, -70, -93, -11, 80, -65, -72, -21, -23, 56, -78, -72, 26, 30, 94, 
+    86, 32, 4, 39, 5, -62, 1, -28, 73, 73, -2, 40, 82, 35, -85, -34, -49, 
+    -84, -68, 69, 96, 80, 69, 71, 70, 20, -15, 69, 1, -78, 50, 50, 24, -100, 
+    81, -38, 55, 75, 78, 67, 22, -9, -48, 18, 23, 50, -76, -47, 21, 46, 70, 
+    -35, 21, -47, 78, 70, -3, 84, 86, 43, 10, 60, -44, 17, -12, -33, 77, 36, 
+    41, 84, 42, 9, 0, 25, -99, 92, -88, 28, 32, 96, 25, -44, -96, -10, 17, 
+    72, 94, 33, -87, -39, -19, 44, -49, -8, -65, 25, -75, -82, -56, 65, 27, 
+    97, -92, -70, 19, -57, 29, 19, -87, -46, 69, 66, -41, 46, -72, -17, -26, 
+    21, -25, -45, -98, 59, 70, -40, 92, -48, -36, 99, -14, 56, 36, -15, -40, 
+    -89, -71, -41, 6, 33, 71, -100, -20, -86, 86, 0, -58, 8, 78, 75, -86, 
+    -88, 63, -90, 76, 0, -20, -98, 35, -34, -35, 95, -50, 90, -22, -47, -11, 
+    -44, 48, -69, 84, -20, -3, -99, 6, 74, -66, 44, -70, 97, -85, 45, 70, 17, 
+    -83, -8, 13, -81, -95, -76, -20, -77, 12, 97, -50, -54, 53, 91, 92, 21, 
+    -5, 50, -91, 79, 95, -41, 26, -42, 64, -70, -56, 59, 39, 4, 49, -77, 73, 
+    -41, -75, 73, -48, -4, 92, -8, 29, 92, 31, -48, 16, -79, -22, 54, 33,
+  67, 50, 91, -53, 52, -79, -73, 51, -83, 58, -2, 24, -5, 65, 51, 46, 58, 79, 
+    65, -82, 46, 95, 64, -26, -21, 5, 87, -31, 3, -19, 9, 75, -12, 81, -14, 
+    18, -94, -12, 72, -14, 5, 47, 85, -97, 31, 46, -79, 52, 88, -17, -14, 47, 
+    62, -44, -18, 94, 98, 42, 96, -46, -28, -31, 49, 54, -43, -52, 64, 48, 
+    -26, -88, -43, -48, 92, 91, 76, -32, -67, 6, -73, -88, -38, 18, 40, -27, 
+    97, 1, -4, -37, -83, 84, -27, -95, 61, -80, -97, -58, 20, -48, -16, -44, 
+    -97, -34, 45, 35, 54, -87, 90, -27, 2, -89, -91, 40, -74, 19, 13, 25, 
+    -49, -45, 15, -19, -54, 1, 32, 15, 66, -11, -52, -15, -95, 92, 81, -12, 
+    9, -45, -78, 31, -64, -9, 2, 45, -83, 46, -85, 57, 39, 21, 31, 94, -75, 
+    -24, 3, 13, -16, 48, 16, -68, 28, -67, -7, 8, -42, -14, 40, -38, 70, 68, 
+    51, -17, 83, 90, 32, 70, -84, 76, 35, -20, -93, 94, 15, 52, 4, -4, 40, 
+    -14, 46, 49, 96, -21, -14, -20, -53, -48, -54, 27, -18, 22, 29, 64, 63, 
+    45, 19, 57, 6, -43, 91, 40, -63, -4, 52, -39, 96, -7, 43, -49, -12, -69, 
+    -5, -52, -17, -74, 57, 4, 47, -92, -28, 90, 49, 29, -72, 78, 22, -65, 
+    -14, 81, 63, 93, -94, 88, -87, 58, 42, -6, 87, -16, -61, -31, -62, 24, 
+    -9, 54, -10, -72, -77, -37, 59, 34, 65, -27, -50, 44, 53, 63, -31, -24, 
+    -53, 27, -89, 36, 63, 86, -94, 74, 60, 73, 66, 9, -11, -16, -40, -10, 66, 
+    12, 73, 88, -73, 86, 73, 35, -32, -56, 0, -36, -89, -60, 50, 36, 38, -56, 
+    -20, 48, 23, -65, -18, 55, -15, 42, -100, -85, 90, 12, 80, -16, -14, -68, 
+    -31, -98, 3, -20, 90, -65, 77, -41, -57, 85, 98, 91, 83, 93, 1, 89, -16, 
+    13, 33,
+  -73, 72, 59, -25, 18, -43, -2, -19, 50, -100, -76, 18, -44, -23, -6, 17, 
+    -91, 30, -76, 11, -39, -25, -76, 73, 91, -85, -10, 8, 0, -79, -13, 32, 
+    94, -53, 24, -4, 21, 67, -95, 31, 15, 90, 96, -50, -53, -47, 71, 8, -33, 
+    -21, -3, -8, 63, 19, -18, 10, -88, 94, 67, -83, -88, 98, -29, -80, -95, 
+    -22, -74, 31, 6, -23, 29, -5, -58, 24, 72, 81, 34, 66, 33, -62, -23, -85, 
+    78, 52, -72, 2, 93, -51, 12, 17, -89, -67, 81, 45, 65, -91, 19, -97, -60, 
+    -72, -97, -12, -64, 99, -5, -66, -56, -50, -99, -16, -7, -77, 15, 65, 
+    -27, -15, -36, 63, -34, 36, -27, 10, 32, -94, 33, -34, -80, 47, -97, -79, 
+    23, 31, 6, 60, 32, -24, 14, 29, -23, 86, 21, -90, 39, -31, -85, -10, 67, 
+    -37, 7, 52, 21, -55, 94, -72, 31, -57, -1, 32, -22, 45, 93, -72, -24, 
+    -59, 15, 44, -46, 38, -91, -8, 25, -87, -10, 19, -24, -41, 66, -99, -58, 
+    38, -83, -93, -39, -96, -1, -36, 42, 99, -50, -29, -54, 77, -91, -80, 74, 
+    -8, -26, 8, 88, 79, -34, -30, 37, 68, 19, -28, 88, -15, 48, -61, -30, 73, 
+    89, -10, -9, -46, 1, -34, -93, -53, -45, 99, -48, 68, 29, 40, 44, -50, 
+    -78, -84, 52, -36, 26, 21, -96, -2, -18, -46, 84, 62, 24, 73, -48, 93, 
+    58, 79, 94, 3, 78, -90, -94, 50, -67, -33, 85, -95, -49, -67, 7, -52, 87, 
+    46, -87, -33, 78, 53, -99, -69, -82, 41, 97, 38, -79, 81, 62, 0, 33, -64, 
+    -66, -98, 74, -37, 57, -63, 98, 73, 16, 12, -34, 93, -95, -83, 13, 58, 
+    -86, -81, 25, 5, 24, 21, 93, 86, 25, 51, 4, 79, -42, -28, -35, 76, 73, 
+    -79, 49, 15, -54, -47, -19, 71, -95, 84, -3, 83, 57, 66, 76, -72, -44, 9, 
+    19, -40, -8, 10, 29,
+  15, 39, -32, -30, 11, -7, -35, 97, 93, 97, 58, -78, 28, 79, -43, 42, 53, 
+    -92, -34, 68, -54, -26, 48, 25, -3, 51, 12, 71, 46, -4, -67, -46, 83, 
+    -13, 28, 5, 32, 1, 39, -66, 50, -61, 18, 50, -96, -82, -4, -56, -14, -97, 
+    -80, 14, -27, -75, -62, -81, -31, 32, 22, 89, -7, -85, 60, 90, 29, 99, 
+    -52, -11, 80, 84, -6, -96, -53, -87, 26, 72, 6, -100, 70, -29, 39, 70, 
+    -2, 23, 23, -33, -48, 23, 66, -53, 30, 56, 98, 23, -24, 76, -57, 33, -45, 
+    -74, -52, 33, 27, 19, -13, -90, 4, 83, 43, 35, 12, 62, 24, -17, -60, 82, 
+    49, -95, -99, 71, 0, 43, 52, 50, 27, -82, 4, 20, 19, -7, -15, 11, -81, 
+    15, 79, 10, 25, 36, -33, -47, 29, -75, -36, -23, -9, 11, 57, 7, 52, -21, 
+    -89, -57, -61, -46, -96, 16, -43, 84, 18, 64, 84, -89, -25, -64, 1, 26, 
+    -78, 19, -52, -1, -63, -35, 16, 59, 15, -62, -64, 10, -72, -51, 90, 5, 
+    -34, -61, -47, -47, 92, -73, -12, 19, 97, -49, 47, -68, -72, -34, -41, 
+    14, 42, 14, -29, -32, -90, 21, 85, 44, 60, -16, 89, 0, 61, 41, 25, -37, 
+    0, -52, 63, -60, -65, 53, -29, 68, 80, 70, 80, 65, -14, -12, -83, -9, 74, 
+    -19, -20, -40, -100, 18, 44, -28, -41, 27, 23, 72, 34, -77, 16, -58, -93, 
+    70, -6, 40, 3, -35, -43, 23, 24, -27, 30, 21, 71, -94, 49, 88, 48, 72, 
+    31, -30, 63, -79, -3, 12, -42, -90, -62, 12, 37, 92, -4, 25, -54, -50, 
+    -86, -14, -53, 27, 20, 7, 39, 60, 56, 12, 91, 8, -64, -37, -36, -68, -55, 
+    76, -28, -32, -29, 1, -90, 30, -59, -49, 88, -12, 67, -53, 2, -1, -47, 
+    -87, 47, 80, 17, 71, 61, 55, 90, 46, -19, 51, 48, -74, 33, -19, -25, 54, 
+    41, 49, 32,
+  -95, -60, 80, 54, -36, -21, 37, 89, -10, 84, 57, -11, 98, -81, -43, -25, 
+    -11, -94, -57, 71, -9, 44, 64, 4, -83, 16, 6, -83, 97, 51, -9, 96, -53, 
+    18, 4, 70, -2, -11, -8, -87, 22, 38, -9, -9, -20, 30, -13, 93, -56, 16, 
+    93, -25, -55, -23, -38, 3, 30, 39, 43, 38, 13, -39, -92, 64, 81, -52, 
+    -30, -8, -1, -3, 27, 19, 22, -41, -1, -41, 13, -84, -80, 64, -71, 73, 15, 
+    -73, -14, 14, -40, -60, 56, -9, 46, -40, -20, -78, 29, -2, -1, 86, -80, 
+    21, -68, -84, -15, 88, -85, -86, 83, -43, 54, -8, -1, 74, 12, 17, 27, 41, 
+    -17, 66, 20, 8, 64, 27, 14, -40, 6, 62, -71, -3, 1, -5, -91, -43, -81, 
+    46, 83, 10, 37, -12, 36, 6, -3, -1, 59, 89, -17, 35, -22, -19, -53, -92, 
+    40, -58, -11, 28, 74, 50, 89, 39, 30, 42, -38, -52, -32, -44, -36, -89, 
+    23, -11, -71, 38, 90, 65, 63, -3, -86, 78, -31, -82, -41, -74, 29, 5, 22, 
+    1, -93, -86, 15, -77, -68, 48, -14, -63, 95, 11, -5, 50, 64, 62, -1, 36, 
+    -2, 60, 32, 56, -25, -27, 36, -79, 33, -25, -90, -40, 32, 98, -21, -81, 
+    -37, 67, -30, 84, 44, 23, 71, 56, 45, -53, 80, -89, -51, -83, -14, -51, 
+    -44, 26, 78, -71, -25, -18, 66, -37, 48, 2, -59, 78, -63, -89, -19, -49, 
+    -45, 39, 31, 99, 12, -59, 34, 12, -31, 67, 51, -45, -3, 25, -7, -78, 47, 
+    72, -100, 74, 28, 31, -23, -9, -12, -27, 71, 25, -82, 48, 51, -54, 85, 
+    81, 75, 45, 68, 14, -34, 7, -13, -4, -44, 18, -26, 20, 6, -4, -47, -91, 
+    -15, -94, -70, -5, 77, 97, 19, -49, -40, 70, 46, 31, 31, 33, 31, 60, 93, 
+    -79, 66, 91, -7, 82, 75, -13, -76, 8, 15, 28, 88, -6, 35, -36, -52, -75, -8,
+  69, -25, -82, 50, -85, 99, 61, 30, -45, -18, 63, 24, 71, -71, -28, -61, 44, 
+    -92, -100, 47, -33, 15, 9, -99, -20, -36, -36, -87, -67, -17, 83, -100, 
+    -13, 9, -88, -84, -89, -78, 52, 52, -43, 64, 10, -2, 40, 82, 63, 24, 79, 
+    40, -20, -61, -74, 68, 91, -77, -7, -71, 42, -49, -36, -97, -85, 92, 69, 
+    71, -26, 67, -58, 65, -1, 50, -90, -48, -30, -89, -94, 69, -14, 75, 40, 
+    39, 14, -67, -39, -89, -54, 17, 26, -52, -12, 68, 19, -81, -94, -41, 2, 
+    -94, -26, 54, -20, -63, -47, 30, -64, 28, 19, 11, 81, -75, 26, 47, 43, 8, 
+    45, -52, -1, -95, 21, 96, -91, -60, -20, 27, 90, -17, -71, -16, -18, 5, 
+    77, -81, 99, -70, -13, 51, 16, -90, -99, 2, -68, -53, 27, -80, -97, -4, 
+    8, -58, 90, -56, 49, 21, -61, -66, 29, -100, 18, 27, -94, -44, -94, 62, 
+    47, 15, -20, 18, 48, -21, 81, 27, 59, 86, 13, 43, -30, 89, -52, -98, 20, 
+    -35, -53, -5, -87, 50, -16, -13, -8, -78, 33, 85, -75, 1, 1, 64, -80, 
+    -10, -15, -44, -66, -45, -37, 40, -43, -72, -46, 29, 56, 54, 76, -36, -7, 
+    -50, 84, -31, -76, 79, 34, -52, 93, -97, 64, -88, -74, -99, 19, 74, 38, 
+    41, -3, 22, -56, -94, 73, -77, -39, 72, 23, -57, -86, -3, 43, -6, 8, 42, 
+    -68, -45, 32, -90, -45, 2, -88, 67, 72, 7, -46, 69, 5, -46, 66, -8, 56, 
+    83, 15, 36, 69, -88, 45, 30, 17, 2, -94, -54, 62, 63, -64, 3, -99, -9, 
+    -24, -90, 71, 59, -95, -43, -83, 54, 48, -14, -80, 11, 35, 85, -100, 50, 
+    -15, -67, 87, 54, -83, -35, -40, 28, -7, 2, -23, 31, -35, 51, -41, 39, 
+    80, -32, -61, 96, -20, -52, -94, -14, -40, -76, -59, 75, -15, -80, -28, 
+    20, 54, -85, -2, -67, -13, -82, -32,
+  -33, 90, -14, 75, -78, 45, 44, 37, 31, 67, -28, -29, -45, -95, -100, -2, 
+    -55, 97, -70, -5, -63, -97, 10, -35, 30, 19, 98, -47, 76, 92, -87, -63, 
+    -22, 58, -97, 49, -93, 16, 14, 6, 1, 71, 42, -30, 70, -37, 27, 8, 26, 
+    -76, 41, 85, -27, 20, -30, -96, -74, 23, -25, 78, -12, 21, 37, 36, 35, 
+    61, 76, 99, 69, 61, 41, 77, 18, -17, 54, -70, 73, -33, -45, 31, -100, 
+    -90, 30, -13, -69, -41, -85, -7, -43, -9, 72, -75, 50, 53, -41, -89, -95, 
+    7, -81, 56, 30, 63, -21, -4, 6, 12, -65, 52, 25, -41, -97, 41, 44, -14, 
+    77, -64, 22, 77, 57, 47, 47, -34, -19, -65, -12, 82, 31, -48, -52, -27, 
+    86, 37, -44, 53, 61, 64, 7, 62, -33, -9, 0, 37, 38, -78, 96, 9, -60, 3, 
+    -71, -58, -2, -55, -49, 79, -100, -1, -23, 13, 49, 48, -15, 26, 28, 6, 
+    -30, -57, 21, -64, -86, 7, -29, -2, -75, -38, 53, -34, -50, -83, 63, 42, 
+    81, -97, -98, 43, 10, 36, -90, -22, 46, 9, -15, -64, -10, 3, -64, -86, 
+    -80, -77, -86, 76, -88, 41, -22, -28, 63, 44, 89, 40, -57, 60, -45, 43, 
+    76, 62, -11, 31, 0, -54, 38, -81, -69, 55, -66, 91, -47, -67, -60, -11, 
+    27, -88, 43, 40, -88, 66, -30, -58, 96, 56, 18, 10, 8, 6, -34, -21, -66, 
+    -11, 14, -82, -83, -39, 32, 27, 5, 95, 70, 73, -19, 42, -25, -21, -21, 
+    39, 98, -76, 54, -69, -78, -47, 2, 94, 93, 23, -60, 49, -34, -7, -5, 80, 
+    -75, -15, 37, -15, 39, -93, -15, -6, 83, 79, 19, -86, 72, 55, -9, 81, 53, 
+    -32, 75, 63, 21, -63, -27, -90, -11, 65, 87, -65, -95, 89, 70, 24, -77, 
+    -14, -64, -73, 52, -59, 40, -99, 82, 59, 18, 74, 39, 50, 74, -98, 72, 
+    -24, -23, -11, 78, 72, 73,
+  -62, 17, 43, -54, -11, -34, 57, -45, -74, -81, 81, -67, 49, 94, -19, -42, 
+    -64, -33, 58, 37, 10, -75, 77, 38, 88, -53, -48, 26, 86, -94, 13, 67, 
+    -71, 46, -33, 85, 9, -59, 81, -73, -98, -23, 45, 78, 17, 49, 57, -54, -7, 
+    28, 83, -10, 15, 77, 63, -25, -73, -74, 7, -60, -30, 59, 11, -55, 31, 51, 
+    -51, 77, 73, -60, -10, 74, 60, 88, 73, -39, -74, -30, -15, -90, 72, 40, 
+    -41, -20, 82, -88, -85, -47, -31, 26, 77, 6, -41, 36, -2, -26, 77, 71, 
+    -90, -67, -98, -89, 48, -57, -90, 73, -100, 42, 35, 94, -40, -86, -34, 
+    38, -88, 61, 63, 74, -72, -100, 80, 31, -73, 55, -2, 9, 48, 52, 16, 80, 
+    49, 26, -27, -31, 38, -90, -47, -19, -7, 4, -14, 51, -45, 98, -61, -15, 
+    -11, 72, 69, -74, 11, 53, -35, -23, -20, 63, 1, -56, 35, 36, 89, 5, -30, 
+    89, -81, 82, -78, 88, 94, 75, -71, -94, 61, -42, -98, -26, 0, -6, 7, -22, 
+    69, 33, 72, -47, 96, 71, -8, 43, 82, 19, 92, 31, 85, -49, -4, -8, 97, 
+    -51, -100, 74, -48, -50, 42, 22, -58, 72, -33, -10, 3, 73, 2, -74, -77, 
+    90, -25, -97, -60, 63, 47, 1, -17, -89, -41, 84, -47, -79, 80, 67, 37, 
+    -1, -4, -26, 21, 90, -33, 38, -73, -3, -66, -23, 90, 26, 39, -34, 93, -2, 
+    -21, -86, -74, -13, -59, 8, 81, 88, 83, 44, 57, 85, -69, 61, 63, 80, -36, 
+    -52, -64, -67, 60, -96, -33, -1, 70, 97, -93, 79, -64, 10, 43, -6, 83, 
+    51, -80, 33, 68, -73, -30, 72, -76, -5, 96, 17, -68, 81, -69, -12, -52, 
+    93, 6, -54, 62, -90, -58, 13, 73, -8, 64, 93, -68, -71, 45, -89, 17, 82, 
+    87, 40, 63, -44, -92, -74, -58, -72, -33, 90, 45, 52, -19, 67, -80, 61, 
+    78, 92, -12, 31, -28,
+  48, -83, -12, -7, 88, -22, 53, -67, 88, 52, -31, -86, -60, -100, -6, 55, 
+    -76, 74, -55, 89, 80, -53, -34, -96, 48, 73, 26, -88, -84, 81, -72, -54, 
+    29, 47, 60, -24, 62, -84, 26, 1, 71, -84, 36, -68, -43, -53, 89, -6, -81, 
+    -45, -17, -5, 66, 20, 66, 31, -56, 29, -60, 24, 99, 43, -78, 34, 28, -97, 
+    13, -63, -42, 28, -40, 0, -47, 92, -28, 64, 96, 80, -15, -30, -77, -59, 
+    30, 64, -36, 87, -31, 81, 37, 92, 18, 56, -21, -60, 99, 78, -34, 65, -30, 
+    -62, 46, -44, 62, -8, 96, 21, 31, 7, -43, 38, -13, 2, 88, 36, 12, -71, 
+    93, -98, -21, -19, -85, 9, -91, 93, 73, 42, -91, -60, 88, 95, -43, 68, 
+    42, -35, 70, 29, 57, 87, 12, 62, -72, 71, -88, 43, 63, -54, -27, 36, -76, 
+    -9, -94, 83, -23, -85, -15, -71, -40, -14, 46, 70, 27, 23, -55, 52, 29, 
+    38, -97, -62, -28, 75, -67, -18, -27, -39, 19, -95, 53, -26, -41, -59, 
+    63, -38, 77, -78, -54, -66, -18, 11, -21, 90, -97, -73, -35, -27, -11, 
+    92, -22, 27, 3, 40, -73, -99, 76, 33, -41, -44, 83, -13, 11, 68, -45, 
+    -84, 61, 67, 31, -24, -62, 48, -57, 37, -98, 63, -10, 49, 61, 32, -37, 
+    -88, 39, 93, -77, 57, 30, -52, -10, -68, -34, -87, 94, -47, 58, 86, -14, 
+    -27, 87, 1, -47, -99, -98, 76, -33, -56, 22, -80, -73, 75, 63, -21, -12, 
+    20, -79, -1, -46, -5, 73, 34, -30, 79, 34, -78, 76, 62, -37, -77, 61, 
+    -44, -3, -85, -69, 62, -98, -36, 34, -29, -12, 86, -47, -84, -86, 90, 36, 
+    -24, 97, 72, 49, 10, 5, 89, -48, 26, 7, -40, 8, 14, -85, -93, 50, -47, 
+    28, 13, -4, 9, -5, 72, 62, 25, -24, -73, -79, 68, -13, -13, -12, -55, 87, 
+    47, -61, 34, -52, -20, -26, -36, 35,
+  86, -99, -54, 77, 5, 35, -56, -33, -38, -41, -63, 23, 87, 12, 83, -12, -1, 
+    40, 40, -57, 80, 13, 59, -100, -24, -79, -17, -35, 63, -27, -42, -7, -77, 
+    -60, 64, -95, -42, 64, -2, 38, 68, 18, 99, 55, 70, 23, 94, -61, -87, 31, 
+    1, 26, 68, -42, -79, -9, -82, -43, -46, 67, 11, 6, -87, -49, 56, -54, 88, 
+    93, -7, -13, 77, 56, 35, 49, -46, 51, -37, -13, 96, -6, -28, -8, -57, 99, 
+    -3, 14, 20, -8, -72, -33, 26, 45, 7, -75, 38, 66, -59, 39, -61, 46, -91, 
+    93, -12, -10, 43, -57, -43, 80, 9, 5, -28, -65, 55, 24, -59, -32, -76, 
+    -42, -88, -5, -11, 8, 55, 20, -53, 22, 34, 61, 60, -55, -90, -43, -80, 
+    93, 87, -59, 62, 38, -36, 89, 22, -71, -21, -86, 40, 18, 71, 79, -65, 69, 
+    16, -47, -4, -44, 3, -57, -25, -22, -82, -28, -61, -19, -92, -27, 83, 24, 
+    -71, 39, 4, 77, -72, 73, -69, -47, -51, 78, 97, 19, -39, 62, 33, -18, 
+    -48, 31, -93, 29, 45, 21, 94, -88, 61, 35, 6, 78, 71, 26, 45, 87, -76, 3, 
+    -49, 61, 53, 68, -11, -52, -49, -58, 21, -73, -73, -31, 16, 28, 71, -57, 
+    -92, -78, 47, -96, -48, -88, 65, 30, 31, -82, -15, -93, -64, 65, 41, -22, 
+    -52, 87, -58, -67, -53, -71, -80, 87, 73, 46, 1, 29, 4, 36, -44, 2, 97, 
+    -50, -70, -95, -62, -69, 38, -50, 28, -40, -98, 58, 35, -90, 95, -91, -4, 
+    23, -74, -52, 17, 66, 91, 98, 39, -84, 64, 3, 23, -74, -93, 23, 7, -37, 
+    25, 36, 93, -25, 21, -35, 3, 28, 6, -40, -54, 0, -69, -74, -100, -49, 91, 
+    26, -16, 2, 20, -90, -65, 38, -49, 78, -30, -11, -14, 74, -61, -2, 68, 
+    -99, -16, -18, -80, -74, -11, 67, -95, -43, 59, 2, 45, -11, -31, 4, -24, 
+    39, 96,
+  87, -79, -98, -18, 57, -46, 46, -13, -17, -28, 13, 15, 66, -31, -77, 80, 
+    -38, 82, -84, -63, 79, 24, -49, -96, -39, 14, -22, 55, 40, 58, -18, -3, 
+    -32, -54, -46, -91, -88, -7, -16, 17, -72, 20, -31, 87, 4, 36, 83, -28, 
+    -43, 49, -38, 37, 13, -31, -29, -96, -96, 62, -85, 24, 0, 71, -51, -59, 
+    63, -23, 66, 7, -66, 2, -5, 3, 30, -57, 89, 99, 76, -24, 82, -46, 22, 
+    -52, -39, 2, -44, -67, -60, 18, -33, -41, -14, 66, -37, -60, -67, 3, 70, 
+    -14, -1, 53, 35, -2, 17, 16, -97, -3, -47, -64, -56, 81, 74, -13, 44, 24, 
+    -11, -34, -57, 59, -12, 97, 85, 10, 1, -19, -47, 56, 62, -29, -59, -97, 
+    14, -95, -63, -19, -67, -79, 56, -59, 29, -73, 83, -49, -83, 31, 64, 63, 
+    -88, 83, 41, -77, 3, -33, -31, 99, 92, 99, -30, 81, -98, -39, -90, -56, 
+    23, 75, 14, -79, -93, -36, 25, 2, 23, -49, -95, 46, -61, -90, 67, -66, 6, 
+    90, -92, 69, -51, 64, -14, -75, 95, 92, 63, 54, -1, 22, 80, 1, 94, -1, 
+    50, -67, 6, 35, 33, -25, 43, 2, -90, -51, -62, 65, 92, -48, -70, 26, 74, 
+    -90, -38, 3, -11, 22, 47, 50, -50, -45, 36, 74, 96, 63, -88, 17, -99, 
+    -84, 1, -96, 41, -12, -63, 16, 92, -80, 91, -88, 65, -73, -55, 48, 54, 
+    38, -79, -86, 91, -82, -50, 77, -9, 18, -77, 65, -27, 5, -73, 83, -45, 
+    82, -18, -63, 80, -52, -29, 95, 66, 29, -60, 1, 77, 83, 11, -8, 98, 64, 
+    -11, -8, 9, -90, -35, 86, 72, 17, 25, -19, -32, -36, -41, 82, 9, 56, 68, 
+    5, -61, -34, -21, 6, 92, -38, 30, -72, 30, 71, -70, 24, 13, 40, -8, -24, 
+    48, -25, 53, 96, -73, 11, 87, -66, 92, 83, -31, 19, 18, -78, -72, -35, 
+    27, -83, 38, 92, -66,
+  75, -70, -92, 64, -32, -59, -79, -63, -100, 18, -12, -34, 78, 62, 76, 16, 
+    -27, 99, 8, -54, -57, 55, -34, 21, 43, -54, 12, -44, -62, -82, 39, 85, 
+    -1, -88, 45, -38, 42, -47, 82, 55, -51, 42, -81, -11, -8, -94, -37, 92, 
+    19, 94, -63, 93, -16, -9, -74, -30, -89, -8, 8, -72, 40, -43, 53, -99, 
+    10, 25, -14, 46, -43, 56, -77, 27, -86, 37, 36, 34, 10, 96, 82, 76, 89, 
+    -61, -82, -66, 91, -77, 33, 26, -40, -52, 46, -69, 53, 73, -49, -98, 23, 
+    82, -33, -57, 38, -35, 25, 8, 61, -45, 40, 61, 50, -79, -18, -24, -64, 
+    -76, 44, -73, 94, -20, 21, 77, -14, -83, 4, -24, 38, -23, -33, 21, -79, 
+    43, -19, -90, -49, 58, 87, -68, -74, -73, 96, 29, -76, -2, 50, -11, 85, 
+    70, -17, -79, 60, 95, -47, 75, -23, 92, -81, 8, 96, -62, 6, 55, 91, 87, 
+    -2, 62, 72, 39, -89, -49, 33, -60, -27, -45, 56, 73, -85, 22, 98, 95, 25, 
+    -18, 81, -98, 86, -82, 32, -83, -47, -37, -33, -42, -50, 84, -79, 9, -9, 
+    79, -66, -50, 81, -85, -83, -49, -28, -33, 40, 78, 70, -98, -74, 7, 94, 
+    -34, 15, 42, 89, 5, 32, 34, 65, -27, 79, 90, 32, 92, 3, -18, 28, -70, 
+    -29, -71, -21, -75, 31, -10, -13, 66, -66, 7, 6, -62, 99, -45, 47, 66, 
+    -57, -100, -13, -67, 43, -84, 60, -52, -89, -31, 92, 16, -64, 96, -86, 
+    13, 79, 58, 59, -20, -17, -15, 20, 88, -77, 30, -58, -11, -95, 41, 28, 
+    -42, -96, 81, -23, -56, -96, 3, 91, 91, -11, 17, 16, 1, -29, -67, 44, 15, 
+    70, 30, -4, 89, 99, 34, 46, -42, -24, 17, 28, 29, 23, -71, -26, -53, -27, 
+    -40, 24, -3, -72, 34, -12, -5, 58, -71, 75, 62, -67, 4, 92, -60, -62, 78, 
+    35, 6, -51, 11, 83, -48, -76,
+  -59, -71, -2, 4, -75, 21, -26, -33, 64, 4, 59, -76, -37, 2, 62, -51, -17, 
+    30, -64, 98, -12, 7, 93, -38, -64, 71, 34, 95, 41, -21, -4, 43, 71, 38, 
+    -9, -48, 92, -25, 5, 71, -38, 14, -83, 18, 66, 3, 1, 61, 50, 74, -46, 
+    -50, -5, -25, 47, -94, 76, -99, 57, -17, -76, -7, -28, -59, 72, -9, -54, 
+    -73, 95, -53, 5, -89, 88, -12, -74, 41, 30, 22, -98, -62, 59, 17, -32, 
+    -73, -95, -17, -94, 81, -37, -14, 3, -29, 43, -88, -78, 96, -48, 75, -16, 
+    -83, 64, 8, 16, 26, -94, -98, -36, -20, -93, -40, 84, 16, 12, -92, -29, 
+    31, -35, -57, 94, -35, -11, 52, 28, -56, -36, 32, 38, -27, 28, 99, -5, 
+    -51, 38, -39, -75, -72, 28, 0, -37, -20, -65, -45, 56, 66, 85, -10, 43, 
+    78, -70, -60, 86, -15, 35, -32, -18, -88, -38, -84, 19, 56, -19, 54, 54, 
+    32, -49, -38, -51, 58, -21, 97, -41, -86, -42, -30, 40, -17, -96, 31, 
+    -17, -65, 61, -77, -1, 81, -33, -15, 86, 68, 24, 90, -61, -99, 38, 97, 
+    -6, 98, 91, 44, -31, 76, -14, 91, 96, 37, -85, 48, 9, -43, -62, -40, -34, 
+    -43, 61, 41, -13, 13, 5, 10, -26, -59, -48, 12, -54, -88, 2, 0, -27, -89, 
+    -23, -83, 7, -41, 75, 29, -57, -8, -47, -29, -55, -20, 26, -82, -23, 21, 
+    -44, 30, -88, 95, 82, 26, -85, 29, 40, -97, -38, -59, 88, -49, 53, 21, 
+    -5, -47, -95, -27, -98, 27, 43, 9, 15, 41, 12, 64, 73, 95, -75, 8, -28, 
+    -38, -98, 58, -54, -70, 94, 52, -6, -71, 58, 70, -49, 62, 36, 78, 73, 26, 
+    43, -64, 52, 37, -14, 16, -4, -75, 37, 8, -51, 70, 29, 7, -17, 10, -93, 
+    72, -60, 56, -58, 42, 91, -22, 5, -28, 5, -36, -51, -92, 67, -56, -68, 7, 
+    -36, -91, -15, -12, 54,
+  -96, -80, 5, -18, 11, -77, -72, -31, -5, 26, -91, -92, 11, -57, -77, 65, 
+    32, 29, 69, 68, 29, 96, -41, -73, -26, 95, -34, 91, 72, 5, 89, 13, 86, 
+    91, -52, 74, 72, -96, -97, -29, -27, 45, -55, -11, -86, -83, -25, 32, 
+    -38, 13, -92, -1, -98, -11, -29, 85, 99, 69, -88, 42, 81, -88, -56, 3, 
+    -65, -68, 38, -60, -68, 1, -37, 82, -96, 78, 33, 60, -50, -16, 5, -40, 
+    -90, -36, -39, -23, 5, -8, -19, -79, -74, -1, -68, 57, 32, -12, 74, -59, 
+    -20, -73, 91, 82, -65, 0, 48, 56, 92, -37, -65, 21, 25, 90, -17, 5, -38, 
+    63, -49, 4, 11, -20, 59, -51, -94, 65, 65, 94, -17, 19, -16, -6, -88, 50, 
+    -27, 51, -31, 87, -99, 33, 4, 50, -80, 30, 4, 34, 8, -49, 82, 19, -68, 
+    66, -73, -69, 6, 99, -82, 43, -92, 30, -5, 87, 15, -69, 18, 95, -59, 71, 
+    -20, 60, -90, -35, -61, 53, -58, 46, 76, 28, -33, 73, 9, -90, -3, -39, 
+    70, -48, 76, 80, -9, 1, -5, -68, -18, 86, 38, -43, -84, 35, -94, 91, 34, 
+    -85, -31, -19, 35, -75, 97, -2, 32, -43, 37, -75, -93, -56, 92, -70, 28, 
+    -63, 4, -11, 76, 42, -8, 46, 62, -24, -70, -43, -78, -97, 32, 87, 35, 3, 
+    -82, -8, -44, 73, 30, 97, -10, -51, 2, 60, -10, -33, 87, -32, -98, -20, 
+    -79, -66, -54, -97, 53, 78, -27, -47, -52, -97, -90, -74, -73, 43, 66, 
+    80, 87, -53, 45, 17, 11, -57, 2, 11, 8, 50, -79, -73, 45, -75, -14, 89, 
+    60, 75, 77, -55, -69, 32, 69, -8, -40, -44, -4, 91, -60, -57, -7, 72, 98, 
+    47, 25, -76, -71, -60, -12, 10, -57, -85, 96, 96, 90, -24, -75, -8, 1, 
+    26, -98, 38, -33, 54, -71, -92, -35, 83, -89, -37, -8, -15, -24, 98, -3, 
+    -43, -74, -20, -96, 49, 97,
+  86, -65, -60, -75, -98, -75, -48, 43, -81, 49, -52, 25, -72, -11, 67, -80, 
+    -22, -32, -5, 2, -91, -11, 86, 41, -14, 73, -7, 55, 9, -1, 35, -80, -25, 
+    -75, 0, -75, -87, -85, 13, 16, -75, -76, -10, 66, -47, 93, -91, 54, -38, 
+    -62, -26, 23, -20, -18, -67, 76, -5, 34, 77, 88, 19, 86, -72, 15, -66, 
+    -98, -48, -72, -71, -69, -7, 65, 46, 79, 0, -100, -37, -86, 1, -58, 91, 
+    77, 73, 38, -32, 58, 96, -3, -10, 15, 38, -73, 24, -32, 42, 22, 63, -27, 
+    -2, -16, -98, -24, 85, -58, 85, -54, -43, -98, -54, -33, 46, 84, 71, 39, 
+    -81, -33, 76, -87, -58, 56, -30, -89, 11, 82, 75, -52, -27, 63, 90, 37, 
+    -92, 42, -40, 89, -13, 24, 64, 7, 33, -7, -54, -56, 35, -4, 59, 68, 85, 
+    3, 57, -83, 49, -53, 95, 18, -53, 35, 64, -56, 28, -48, -16, 46, -40, 51, 
+    16, 50, -16, -67, 59, 3, 91, -81, -86, 57, -34, -7, 37, -69, -1, -77, 28, 
+    53, 63, -93, 16, 70, 16, -87, 10, -39, 46, 73, 26, -97, -35, -71, -87, 
+    -17, 7, -4, 31, 72, -43, -44, -65, -85, -14, 61, 19, -70, -90, 77, 89, 
+    -14, -25, 8, -62, 13, 91, -68, -83, 13, -29, -97, -47, 6, 66, -7, -97, 
+    -50, -25, -21, 38, 1, 76, 48, 79, 84, -7, -89, 18, 0, -20, -95, -89, -7, 
+    78, -83, -73, 32, 62, -44, 85, 93, 52, 10, 91, 50, 90, -5, 51, 78, 63, 
+    72, -51, -49, -80, -18, -86, 32, -45, 34, -53, -72, 2, -95, 86, 18, -72, 
+    -54, 75, -27, -7, 21, 69, 54, 34, 20, -6, 65, 69, -96, -23, 8, -67, 26, 
+    -13, -16, 95, -93, -8, 56, 41, -35, 40, 64, 12, 33, -24, -69, -28, 7, 
+    -82, 0, 82, -65, -90, -77, 27, -69, 7, 79, -4, 60, 20, -42, -61, 16, 59, 
+    -85, 69, 34, 24,
+  -8, 7, -86, -37, 92, -37, 57, -38, 92, -57, 61, -100, -37, 99, 18, -19, 1, 
+    31, 14, 56, -1, -51, 5, -44, 23, -50, 17, 45, 37, -9, 11, -15, 78, -61, 
+    -72, 63, 21, -41, -86, 79, 20, -61, -58, -13, -41, 59, -60, -70, -85, 
+    -16, 1, 63, -46, -12, 4, 12, -2, 30, -18, 35, 23, 18, 87, -95, -34, -82, 
+    -4, -88, 47, -24, -7, -48, -58, 13, -95, -6, -57, -57, 22, 24, 33, -67, 
+    71, -48, -98, -14, -18, 10, 52, -9, -54, -14, 52, 78, -76, 38, 73, 80, 
+    43, -22, 77, 66, 7, -13, -19, 1, 31, -64, 4, -11, -19, -17, 28, 76, -81, 
+    -5, 18, 85, -16, -22, 12, -76, -92, -7, -16, -42, 62, -58, 90, 19, 51, 
+    36, -91, 74, -83, 90, 35, 8, 9, 80, -45, -23, -52, -39, 76, -12, -70, 
+    -52, -21, 32, -79, 19, -85, 43, 36, -29, 31, -82, -87, 92, 80, 88, -80, 
+    28, 42, -81, 62, 10, 77, -1, -7, -37, -26, -18, 34, -88, -20, -76, -100, 
+    -14, -26, -26, 25, -54, 63, 28, 40, -38, 65, 70, 8, 18, -29, -5, -40, 
+    -91, -27, 94, -36, 79, 79, 22, 58, 34, 25, -30, -92, 74, -44, 79, -1, 
+    -52, -58, 41, 97, 68, -20, -39, -12, 54, -86, 64, -7, -46, 53, -71, -95, 
+    -60, -100, -34, -62, 51, 85, 90, 65, 36, 63, 98, 40, 96, -10, 45, -22, 
+    66, -55, -87, 3, -30, 77, 67, 80, -39, -97, 11, 7, -46, 9, 54, -44, -61, 
+    -83, 65, -96, -84, -74, 6, -71, -43, -3, -98, 18, -68, 96, 70, 27, 98, 
+    56, -72, -11, -38, 52, -40, -94, -46, 40, -2, 16, 40, 45, -88, -76, 25, 
+    -50, 31, -44, -67, 94, -47, -25, -21, 6, 86, 72, 9, -50, 36, 48, 85, 8, 
+    43, -44, 73, -7, 62, -92, 86, 26, -87, 12, 4, 48, -88, 40, 36, -15, 86, 
+    -24, 65, 2, -88, 79, -63, -83,
+  25, -52, -47, -14, 83, -96, 1, 47, -32, 80, 68, -18, -71, 27, 84, 69, -39, 
+    -35, 94, -68, -93, -5, 28, 0, 60, -25, 11, 30, 57, 25, -84, 57, 59, 19, 
+    -6, -6, -82, -98, 98, -35, 68, -83, -99, 2, -38, 15, 67, 86, 87, -42, 
+    -38, -84, 8, 9, 30, -73, -17, 93, -32, -65, 51, -8, -8, 66, 74, -32, 92, 
+    -6, 9, -19, 24, 37, 6, 50, -46, -80, 19, -79, -63, 11, -41, -30, -96, -5, 
+    -81, -16, -53, -83, 78, 2, 53, -87, -41, 45, 55, -16, 9, 53, -99, -3, 
+    -63, 42, -95, -19, -25, 29, 57, -88, 6, 45, -91, 51, 46, -23, -71, -97, 
+    46, -35, -51, -71, -19, 12, -61, 92, -70, 58, 64, -85, 28, -34, 96, -26, 
+    -31, -54, -54, 81, -75, 93, 93, -10, -83, 85, -10, 58, 27, -28, 24, -81, 
+    -10, 47, -85, 68, -46, -15, 12, 70, -82, -78, -17, 59, 4, 43, -100, 29, 
+    -57, 50, 31, 25, 10, 9, 92, -51, 66, 12, 45, 54, 82, 28, 51, -20, 85, 46, 
+    -4, -62, 73, 68, 17, 50, -96, 87, -39, 70, 75, -42, 51, -85, 55, 5, -81, 
+    16, 39, -68, 92, -96, 71, 11, 44, -95, -98, 17, -90, -70, 26, -90, -40, 
+    -2, 0, 89, 27, -62, -79, -19, -49, 59, -69, 90, -98, -82, -82, -24, 54, 
+    -82, -90, -69, -89, -72, 15, 22, 86, -70, 33, -67, 53, -70, -27, 97, -97, 
+    81, -38, 96, -71, -75, -59, 74, 32, 26, -40, 34, 29, -69, -28, -23, 56, 
+    28, 32, 4, 56, -99, 45, -58, -72, -17, -2, 41, 25, 0, 79, 73, 67, -35, 
+    -82, 24, 41, -72, 23, 85, -52, 53, 50, 41, 99, -81, 66, -86, -47, 65, 83, 
+    0, 49, -66, 62, -23, 34, 17, 54, 71, -15, 4, -18, 36, 55, 84, -19, -26, 
+    75, -38, 1, -87, 5, 51, -1, -71, 91, -43, 25, -67, -48, -72, 87, 41, -51, 
+    14, 60,
+  74, -54, -15, 16, 61, -8, -54, 92, 55, 7, 40, 84, 5, -44, 18, -49, 12, -65, 
+    -36, -82, 99, 92, -52, 7, 96, -62, -61, -60, -52, -45, -13, 47, 17, -84, 
+    92, 18, -84, -67, -70, -10, -23, -82, 47, 39, 38, 88, -10, 18, -12, -96, 
+    -63, 9, 74, 58, -43, 42, 71, -56, 11, -100, 61, -65, 43, -36, 28, 81, -5, 
+    -86, 33, -46, -78, 98, 46, 24, 3, 75, 75, 17, -8, -92, 23, 96, 20, 51, 
+    64, 39, -5, -88, 53, 92, 50, -25, -82, 50, -56, -16, -9, 66, 45, 39, -71, 
+    -34, 32, 2, -83, 5, 90, 91, -55, -74, 67, 55, 4, 81, -5, -41, -90, -91, 
+    38, -58, 8, 56, 72, -51, -12, 96, -17, -50, 1, 97, -17, 67, -1, 43, -65, 
+    35, 43, 48, -98, -100, -18, 10, 62, 48, 80, -93, -52, -52, 42, 45, 55, 
+    -18, 25, -50, -69, -24, -90, 55, -91, 87, 67, -46, 55, -28, -39, 23, 96, 
+    39, 79, 77, 95, -26, 96, -75, -40, 85, -2, 45, 99, -41, 81, 9, 8, 83, 96, 
+    -24, 1, 79, -34, -66, -64, -4, 11, 22, 5, 60, -78, 31, 78, -31, -84, -9, 
+    56, -71, 49, 55, -57, 92, 43, 61, -27, 72, -5, 54, -24, 34, 19, 44, 86, 
+    19, 44, 56, -28, 2, 47, -61, -30, 19, -90, 78, 58, 52, -25, 13, -97, 18, 
+    55, 56, 26, -78, 6, 81, 40, -55, 54, -20, 13, 90, 46, -67, 12, 80, 71, 
+    32, 12, -49, 66, 89, 83, -51, -52, -40, -39, 24, 89, -35, 7, 83, 95, -47, 
+    -75, 54, 1, -29, 69, 89, -25, 57, 94, 85, -54, -25, 82, 75, 50, 23, -61, 
+    -84, -79, 10, 13, -49, -68, -38, -49, -22, -100, -63, 99, -90, -97, 99, 
+    44, 39, -63, -99, -58, -89, 77, -57, -70, -17, 47, 24, -90, -8, -94, 23, 
+    46, 70, -70, -37, 77, 54, 74, -31, -2, 26, 13, -8, -23, 58, 11,
+  -69, 49, -64, -31, 18, -78, 6, 54, 23, 33, -83, -77, 36, 10, 46, 51, 69, 
+    -2, -77, 79, -85, 6, -33, 4, 41, 86, 31, 9, -20, 70, 37, -3, -52, -53, 
+    97, -69, -12, -46, 63, 18, -64, 4, 97, -99, -81, 26, 99, 23, -49, 84, 
+    -70, -68, 7, 72, -68, -100, 99, 67, 4, 95, -65, -78, 61, 48, -51, -21, 
+    -33, 93, -59, 91, -16, -75, -29, 98, -3, -34, -13, 61, 64, -75, 88, 33, 
+    46, -31, 6, 15, 37, 97, 69, -42, 13, -11, -65, -5, 80, 41, 54, -44, 92, 
+    45, 5, 71, -77, 83, 54, 43, -22, 75, 50, -19, -52, 69, 47, -73, 39, -18, 
+    69, 63, -26, 58, -20, -47, 1, 54, -35, 77, -91, -23, -67, 78, -4, 37, 
+    -57, -32, -44, 4, 45, 1, -21, -94, -29, -94, -5, 6, 32, 48, -80, -55, -9, 
+    41, -10, -67, -87, 10, 43, 62, 6, -32, -42, -75, -73, -31, -5, -64, -94, 
+    76, -77, 45, 5, 32, -94, 75, -76, -56, 44, -37, 52, 89, -70, 23, 77, -8, 
+    -68, 78, 71, -100, -6, -17, -6, 39, 83, -29, 84, -99, -13, -59, 34, 34, 
+    20, -42, 71, -64, 84, -94, 22, 85, 44, -54, 41, 38, -9, -49, -74, 28, 
+    -83, 37, -68, -28, -38, -60, 42, 39, -58, -12, -80, -44, -47, 8, -94, 16, 
+    -53, -81, -63, 81, 25, 9, -90, 68, 69, -53, -75, 90, -16, -98, -98, -21, 
+    94, 24, -60, 67, -92, 98, -50, -41, -45, -70, 74, 85, -37, 32, 26, 84, 
+    96, 27, -55, -85, -18, 13, -17, 66, -46, 21, 81, -19, 81, 38, 67, -20, 
+    10, 43, -98, -71, -61, 97, 84, -36, 46, -77, 20, 59, -72, 67, 81, 54, 85, 
+    -40, -84, 50, -53, 12, -52, -83, 40, -17, 48, -88, 52, -76, 50, 89, 60, 
+    -83, 58, -22, 13, -94, 88, -12, -88, 86, -79, 54, 46, 77, -37, 85, 91, 
+    26, 70, 8, -2, -20, 83,
+  0, -24, 8, 44, 99, -5, -40, 4, -51, -93, 97, 24, 31, -23, -13, 12, -82, 91, 
+    25, -6, -32, -40, -4, -72, 62, -8, -45, 76, -92, -42, 86, 92, -67, -55, 
+    -61, 76, -33, 86, -5, -36, 85, -99, -34, -84, -50, 38, -99, -31, 94, -75, 
+    85, -79, 64, 7, -53, -94, 5, 17, 57, -6, -49, -58, 69, 47, -90, 51, -97, 
+    45, -15, 0, -33, -6, -41, 57, 87, 56, 72, 18, 34, -92, -83, -52, 48, 6, 
+    -70, 32, -71, 82, 56, -1, 60, 20, 79, 60, 78, 65, -4, 70, -47, 4, -19, 
+    44, -6, 28, -41, 13, 24, -5, -89, -49, -73, 71, 64, -96, -82, -31, -75, 
+    15, 68, 65, -7, -99, -21, 30, -15, -97, 94, -27, 30, 43, 99, -24, -26, 
+    -32, -60, 53, 73, -34, 70, -30, -70, -14, 53, -66, 45, -27, 84, 34, 60, 
+    -26, -58, 34, -18, -53, -79, 54, -99, 29, 71, -73, -43, 84, 33, -16, 96, 
+    54, -52, 35, -17, -16, -90, -66, -72, 11, 71, 16, -92, 17, -28, 61, -81, 
+    -54, 82, 73, 40, -78, -87, 66, -38, 33, -66, 60, 0, 42, -9, -60, 13, 97, 
+    13, -2, 68, -6, 58, -15, 23, 6, -52, -79, 72, 44, 26, -27, 78, 29, -47, 
+    -26, -78, -6, 44, -48, -53, -3, -3, 33, 17, 81, 45, 87, -39, 61, 44, 11, 
+    22, 5, 11, 68, 11, -55, -30, -84, -90, -32, -75, -49, 38, 99, -94, 5, 78, 
+    -38, 25, -68, -46, 82, 19, 71, -70, 40, 13, 21, 19, -37, 19, 12, 87, -9, 
+    56, -85, 2, -4, -95, 13, 21, 34, 62, -25, -1, 20, 57, 62, -53, -43, 55, 
+    71, 75, 29, -37, 29, -79, -40, -68, -95, -23, 53, -13, 50, 47, -34, 26, 
+    23, -17, 46, -99, 10, 6, -99, 77, -26, -26, 21, -67, 22, -78, 93, 14, 
+    -30, 78, 40, -28, 78, -34, -40, 27, 65, 26, 65, -55, 71, 71, 99, -73, 
+    -13, 5,
+  -41, -74, 59, -27, 2, -34, -5, -42, 96, -80, -11, -20, 43, -93, -10, -33, 
+    -27, 14, -73, 86, 72, 78, 13, 83, 31, 43, 3, 0, 30, 53, 92, 16, -68, -68, 
+    -67, -54, -81, -18, -97, -24, -65, 41, 75, -40, 93, 69, -94, -9, 6, 23, 
+    -78, -3, 14, 9, -10, -2, -66, 35, -58, -28, 88, 43, 5, -52, 21, 20, -8, 
+    -32, -29, -52, 11, 75, -24, 91, 55, -54, -71, 70, 77, -31, -46, -56, -40, 
+    89, -91, -9, 73, 57, 63, 53, 96, -55, -46, -37, 47, -68, -26, 92, 81, 
+    -49, 85, 38, 93, 11, 3, 75, -77, -57, -45, -19, 91, -61, -46, 23, -47, 
+    -86, 89, -69, 10, 31, 49, 27, 24, 77, -48, 22, 82, 26, -95, -37, -44, 36, 
+    14, 43, 36, 58, 35, -25, -15, 19, 54, 96, -51, 76, -71, 24, 37, 23, 89, 
+    -80, -64, 67, -21, 93, 92, -9, 45, -32, 51, -52, -30, -67, -92, -59, -50, 
+    67, -29, 15, -31, -39, -25, 16, -88, 12, 77, 37, 78, -92, -100, 16, 83, 
+    4, -33, 88, -97, 6, 61, 12, 64, 0, -63, 35, -97, -50, 93, 65, 20, -56, 
+    87, 84, 59, 82, 26, 46, -51, -67, 26, -54, 71, -68, -78, 50, -82, 16, 9, 
+    -35, -56, -12, -78, 69, -2, -8, -29, 39, 15, -48, 63, 81, 23, 43, -37, 
+    -99, -70, -28, 40, 80, -4, 49, -98, -10, 32, -16, -87, 46, 72, 94, -95, 
+    77, -55, 48, -4, 31, 79, -77, 2, 56, 4, 6, -17, 26, -42, 49, -57, 59, 
+    -28, 4, 89, -48, -2, 81, -10, -74, -13, -75, 72, -4, -32, 67, -3, 8, 35, 
+    53, 48, -59, 10, 40, 0, 76, 13, 4, 48, 32, 9, 21, 79, 39, -57, -48, 32, 
+    -59, 20, -87, 73, 6, 16, 90, -82, 90, 85, -91, 24, -36, -75, 31, 57, -24, 
+    -25, -66, 23, -10, 22, 58, 13, 62, 0, -1, 84, 21, -57, -13, 26, -57, 12,
+  26, 15, 96, -17, 78, 27, -37, -96, 0, 95, -67, 48, 71, 65, -43, 39, -99, 
+    28, -2, 83, 13, -19, -63, 17, 83, 47, 76, 21, 17, -73, -2, -19, 38, -2, 
+    -89, -46, -80, -54, 67, -3, 69, 44, -96, 56, -15, -84, -49, -13, 22, 63, 
+    58, -37, -97, -86, -89, 87, -33, 95, -51, -67, -79, -75, 5, 90, -70, 54, 
+    -97, 80, 35, 11, 48, -49, -99, -63, -93, 41, -56, -63, -19, -7, -26, -8, 
+    -65, 99, -15, -30, 40, -41, -92, -58, 22, 23, 23, -90, 48, 69, 71, 1, 11, 
+    -68, -75, -33, -16, 59, -89, -55, 43, 19, -42, -100, 0, -43, -26, -17, 
+    -37, 52, -90, 12, -95, 54, 17, -80, -52, -2, -19, 72, -5, 80, 93, -89, 
+    89, -90, -39, -51, 0, 40, -87, 77, -12, 59, -19, 56, 81, 64, 87, -5, -3, 
+    62, 98, -31, -37, 54, -3, -29, -72, -9, 12, 80, 91, 46, -26, -75, 13, 98, 
+    2, -16, 44, -54, -7, 89, -48, -31, 51, 1, -90, -69, 8, -70, -34, -8, 59, 
+    -60, -15, -64, 74, 12, -80, 67, -14, 82, -85, -38, -69, 0, -23, -42, -51, 
+    50, -52, -17, -30, -58, -60, 41, 40, 29, -65, -35, -71, 82, -27, 5, 14, 
+    8, 19, -25, 84, 40, -1, 60, 10, 12, 46, -98, -55, 42, -71, -88, -52, -29, 
+    23, 59, -26, 62, 13, 56, -75, -53, -49, 73, 88, 9, 52, 10, -43, -21, -71, 
+    94, -58, 79, -81, 3, -85, -2, -6, 66, 82, -32, -68, -79, 2, 29, -36, 
+    -100, -17, -33, -98, -22, -44, -1, 54, -22, -75, -30, -99, 75, -57, -61, 
+    48, -8, -59, -71, 51, 48, 36, 37, 62, -37, -51, -9, -26, -29, 54, -19, 
+    -13, 66, -46, 48, 80, 40, -79, 98, 14, 71, 82, 46, -60, -8, 87, -69, 90, 
+    -59, -17, -4, 0, 26, 96, -14, -25, 27, -15, 88, -59, 46, -90, -95, -4, 
+    -38, -99, -34, -90, 22, -26,
+  -62, 88, 95, 70, -30, -68, -78, 27, -43, -85, -43, -97, -64, -49, -96, -36, 
+    -52, -93, 89, 70, -48, -62, 8, 21, 71, 67, -48, -56, 79, 82, -83, 29, 65, 
+    30, 64, -7, -16, -59, 79, -31, -95, 41, 66, -36, 11, 85, -91, -97, -82, 
+    55, 56, -21, -49, 37, 89, 99, 26, -76, 0, 58, -67, -100, -18, 28, -9, 41, 
+    -57, 51, 60, -87, 55, -98, 14, 43, 72, -83, -56, -67, 64, -24, 64, -80, 
+    61, -80, -22, 13, -38, -11, 51, 3, 66, 94, 26, -31, -4, -59, -23, 61, 
+    -62, -36, 19, -78, -61, 76, -33, -7, 67, 36, -43, -59, -35, -56, 34, -19, 
+    -35, -29, 38, -42, 82, -61, -7, -28, 91, 84, 87, 80, -54, 11, 63, 85, 
+    -31, -85, 22, -88, -66, -10, -27, -25, -48, -1, -78, -79, 62, -1, -73, 
+    14, -43, -32, 53, -89, 78, -64, -64, -33, 10, 20, 51, 22, -58, -91, 85, 
+    -37, -31, 86, -51, -95, 80, 91, 25, -88, 32, 46, 7, 99, -32, -76, -57, 
+    -57, 7, 79, -35, -36, 60, -26, 82, -18, 3, 54, 91, -51, 69, -31, -97, 41, 
+    89, -53, -88, 72, 48, 99, 35, 14, 22, 26, -32, -46, 17, 94, 13, 44, 16, 
+    89, 63, -29, -40, -34, -2, 25, -33, 46, 46, 14, -94, -35, 60, -17, 80, 
+    -56, -77, -62, 1, 52, 22, -74, -18, 18, -97, -59, 80, -29, -53, -92, 24, 
+    81, 47, 19, 29, -12, -74, 63, 27, 12, -45, 80, -4, -67, -42, 19, 7, 23, 
+    13, 15, 30, 94, 8, 81, 96, 78, 6, -67, 74, 47, 79, 50, 82, 84, -34, 80, 
+    -5, 47, -22, 9, -86, 34, -52, -54, -72, -2, 2, 2, 81, 79, 27, 78, 83, 60, 
+    -38, -90, -18, -89, 29, -70, 86, 26, -48, 32, 31, -64, 55, -9, -52, 92, 
+    67, -34, 26, 99, 24, 29, -51, 82, 36, 6, -50, 69, -70, 81, 40, -62, -91, 
+    71, -35, -66, 39,
+  -91, 19, 75, 12, -63, -30, 71, -20, -35, -57, 55, 56, -98, -6, 59, -91, 
+    -35, 8, -46, 39, 98, 99, 30, 78, -56, -82, -48, 83, 94, 89, 12, 67, 58, 
+    78, 76, -87, 13, -58, 76, 86, 53, 30, 79, 60, 62, 92, 73, 89, -44, 95, 
+    -49, 84, -2, 94, 14, 86, -94, -47, -71, -39, 8, 87, 16, -67, 64, -73, 
+    -49, -72, -35, 21, -16, 23, -41, -31, 95, -34, -86, -87, -84, -86, 48, 
+    -41, -48, 17, -74, 69, 6, 57, -28, 77, -97, -52, -55, 58, -19, -50, -35, 
+    17, -64, 53, 51, 17, 34, 3, 13, 35, 49, 37, -53, 90, -2, -59, -77, -19, 
+    -78, -63, 81, -26, 1, 39, 73, -73, -22, -53, -45, -71, -1, -92, 3, -89, 
+    -56, -51, 31, 81, 68, 33, 79, 72, 58, 23, -71, 65, 42, 44, 58, -61, 98, 
+    8, 49, 57, 78, 70, -23, 41, -36, -48, 97, -55, -6, -25, -23, 7, 71, 84, 
+    -18, -90, 21, -67, 31, 20, 73, -77, 81, -76, -39, -15, 10, -31, -26, -97, 
+    -92, 49, -72, -96, 15, 89, -16, -12, 95, 7, -73, 80, 31, 8, -43, -79, 
+    -71, -53, 75, 80, -24, 87, 21, 32, -42, 88, 81, -61, 62, -69, -31, -62, 
+    91, 9, 67, 21, 57, -40, 62, 86, -20, -8, 30, -86, -100, -44, 64, 75, 5, 
+    -84, -37, 79, -63, -94, 91, -71, -97, 17, 82, 29, -20, -43, 50, 90, -100, 
+    96, -30, -92, 46, -79, 29, 26, 98, -81, -23, 79, 36, 11, -53, -100, -18, 
+    54, 56, 34, 0, 58, 19, -30, 46, 35, -84, 18, 44, -23, 32, -76, -69, 55, 
+    -66, 26, 46, -27, 99, -37, -27, 91, -27, 70, -10, 36, 85, 37, -95, 89, 
+    -53, -81, 97, -59, 68, 56, 67, 92, -77, -47, -5, 82, -77, 38, 34, -95, 
+    -54, -61, 49, 99, -63, -33, -21, 85, 73, -17, 54, 14, -50, 41, -31, -4, 
+    45, -17, -71, 26, 3, -13, 95,
+  -23, 70, -40, -6, 38, -75, 97, 36, 41, -29, 1, 89, 13, 77, -31, 68, 68, 
+    -32, 24, -9, 17, -25, -8, 34, 12, -41, -72, 49, 40, -87, 10, 27, 1, 40, 
+    76, 5, -39, 42, -11, -92, 59, 25, -93, 42, -36, -36, 76, 28, -65, -99, 1, 
+    -54, -32, 68, -26, -82, -44, -99, 80, 44, 88, 86, -7, -70, 43, -32, 62, 
+    61, 74, -8, -49, 36, -23, 83, 44, 63, 71, 52, -37, -28, -28, -100, 82, 
+    -10, 2, 6, 33, 49, 3, 63, -2, -40, -48, 16, 92, -57, 5, -69, 75, -72, 94, 
+    -42, 20, -25, 79, -66, 63, 78, 78, 79, -60, -80, 37, 98, -55, 65, -52, 
+    88, -74, 25, 78, -6, -96, -40, -25, -72, 84, -42, -62, 73, -51, 5, -14, 
+    5, -13, -91, -51, -63, 63, 28, -74, -44, -74, 84, 93, -9, 67, -60, -4, 
+    -5, 41, -62, -89, -22, 79, -97, 23, 18, -90, -66, 16, -79, -95, -59, -59, 
+    -1, -96, 84, 50, -19, -18, 40, -91, -64, 45, 54, 62, 99, -41, 64, 78, 29, 
+    -46, 7, 31, 19, -97, -68, 78, -13, -40, 22, 95, -2, -11, -78, -48, 21, 
+    59, -50, -73, 14, -89, -18, 81, 49, 33, -38, -51, -50, -69, 73, 16, 43, 
+    -10, 6, 82, -20, -72, -14, 38, 6, -45, 62, -6, 0, -73, 1, 4, 40, 95, 4, 
+    -73, 58, 67, -69, 31, 30, -3, -47, 11, 36, -6, 44, 61, -41, 23, -44, 8, 
+    14, -87, -11, -74, 7, -76, -14, 18, 11, -7, -2, -96, -45, 82, -70, 26, 
+    18, -3, -31, 28, 15, -29, -85, -87, -2, -12, -47, -66, 79, 81, 67, -8, 
+    86, 19, -70, 54, -63, -46, -75, 40, -66, -9, -79, 55, -7, -60, -90, 77, 
+    2, 86, -28, 19, -13, 0, 7, 81, 5, -93, -92, -79, 67, -43, 2, -58, -24, 
+    97, 2, -54, 32, -66, -30, 89, -84, 0, 35, 61, 48, 85, 44, 31, -58, -59, 
+    98, 94,
+  38, 49, 49, 86, -40, 55, 44, 59, 12, -18, -79, 54, -78, -92, 56, -7, 51, 
+    -97, 40, 66, 77, -58, 34, -28, -13, -4, -79, -80, -11, 95, -74, 41, -96, 
+    -75, 60, 28, 54, -10, -75, -90, -18, 43, 86, -17, -81, -82, 23, -60, -43, 
+    -87, -65, -82, 34, -63, 20, -94, 24, 63, -61, 96, -46, -30, -97, 40, 66, 
+    17, 77, 21, -44, 45, 60, -28, 15, -71, -25, 31, 55, 21, 10, 58, -27, 84, 
+    -70, -61, -100, -62, 9, 97, 77, -83, -94, -67, 68, -52, 14, -44, -10, 
+    -81, 56, -86, -76, 30, 64, 31, -39, 77, -49, 96, -44, -1, -14, -63, -8, 
+    23, 29, -77, 31, -8, 7, -71, -4, 46, -88, 84, -13, -21, 26, -78, -51, 
+    -21, -6, 41, -59, -10, 15, 25, 64, 95, -2, -29, -59, 48, 0, -40, 23, -18, 
+    -70, -24, 35, -12, 0, 55, -43, 36, -2, -51, -60, 91, -84, -76, -97, 95, 
+    84, 98, -16, -56, 58, 50, -36, -18, -39, -4, -30, 17, 97, -62, -20, 92, 
+    -18, 17, 15, -61, 57, -98, 78, 95, -60, 36, 23, 2, -78, -7, 96, -96, 69, 
+    -75, -20, -58, 20, -100, -2, -72, -40, -26, 83, -41, 1, 76, -94, 18, 69, 
+    -85, -5, -56, 30, -33, -77, 11, 1, -48, -82, 83, 27, -38, -61, 93, -36, 
+    36, 84, -81, 37, -55, 94, -41, -55, -38, 56, -19, 99, -13, -98, -18, -81, 
+    -78, 82, -17, -79, -74, 89, -22, -35, -92, 25, 78, -63, 38, 92, 21, -65, 
+    -59, -32, 0, 79, -67, -31, -6, -74, 37, -10, -66, 75, 54, 18, 69, -4, 
+    -71, 28, 36, 15, 63, -95, 99, 67, 57, -52, 67, -11, -61, -39, 50, -34, 
+    -43, -82, 19, 74, -38, 69, -43, -37, 67, 32, -65, 55, -19, 82, -92, 35, 
+    -64, 59, -30, -94, 72, 34, -76, -81, -82, 91, 63, -65, 83, 99, 79, -40, 
+    -88, 67, -74, -9, 14, 81, 19, 32, -98, -33,
+  26, -66, -78, -43, -29, 42, 83, 45, -48, -92, 29, -28, 14, 3, -59, -78, 
+    -83, -48, -47, 35, 45, 52, -85, 37, 2, -91, 33, -19, 11, -21, -45, -48, 
+    -38, -12, 60, 15, -74, 9, -28, -49, -31, 67, 19, 75, 16, 77, 43, -86, 71, 
+    -15, -45, 16, -48, -32, -28, 32, 40, -52, 46, 60, -12, 72, -46, 87, -54, 
+    26, 47, -36, 33, 79, -55, 50, -54, -21, -23, 61, -32, -34, -45, -25, 56, 
+    28, -56, -2, -15, -92, 89, 69, -25, 15, -74, 59, -85, 84, 26, -29, -40, 
+    75, -85, -61, 81, 43, 95, 44, 68, -63, 30, -94, 63, 36, 29, -77, -12, 9, 
+    -90, 18, -99, -15, 41, -68, 83, -56, 21, -96, 81, -31, 78, -27, 8, 38, 
+    -78, -76, -8, -45, -46, 54, -79, 22, 89, 45, -89, 94, 19, -21, 30, -46, 
+    -67, 2, -93, 82, 20, 27, -65, -13, 54, -36, -13, 87, 46, -50, 72, -63, 
+    73, -77, -46, -94, -36, 30, -30, -27, 86, 16, 21, 4, 25, -55, 89, 52, 69, 
+    -20, -55, -10, -62, 10, 90, 19, -98, -16, -28, 68, 72, 48, -61, 40, 90, 
+    -38, -38, -82, -39, -40, 34, -19, 27, 76, -78, -28, 37, 77, -99, -20, 
+    -53, -7, -61, 59, 79, -36, -1, 32, -21, 21, -18, 3, -12, 10, 63, -74, 
+    -18, -40, 68, 73, 87, 82, 41, -27, -22, 60, -66, 81, -82, 53, -90, 99, 
+    -97, -16, -19, 24, -12, -99, 59, -29, 42, -14, 59, 67, -54, 69, -35, 6, 
+    -99, -79, 42, -6, 71, 85, 84, -25, -26, -98, 12, -98, -84, 39, 0, 54, 
+    -67, 4, -50, -59, -56, -3, 34, -64, -24, 63, 91, 57, 60, 44, -88, 23, 4, 
+    -60, 54, -52, -83, 88, -59, -79, 8, 48, 80, -41, -86, -38, 18, 54, 85, 
+    -31, 57, -45, -15, 61, -41, -61, -65, -2, -38, -53, -13, -75, -26, -98, 
+    81, 79, -83, -14, -82, -24, -20, 52, 39, 66, 26,
+  52, 52, -91, 6, -52, -31, 31, -65, -98, 7, -29, 36, 29, -34, -52, 29, -89, 
+    43, 24, -97, -66, -73, 12, 96, 34, 2, 66, -52, -78, -88, -19, -24, 64, 
+    -35, -22, 31, 23, -18, 31, -38, 35, -8, 90, -75, 75, -61, -61, -23, 53, 
+    13, -49, 24, 30, 88, -82, -67, 78, 19, -82, 34, 46, 34, -72, -35, -18, 
+    -20, 16, 56, 24, -85, 1, -79, 13, 42, -52, -95, -42, -35, 23, 10, -34, 
+    87, -5, 12, -78, 12, -83, 41, 81, -27, 48, 84, -13, 87, -56, 22, 90, -13, 
+    -9, 35, -3, -45, -100, 8, 44, 48, -78, 85, 50, -44, 70, 74, 84, -12, -55, 
+    31, 59, 17, 41, 5, 54, -1, 20, -20, 81, 42, 65, -2, -11, -30, -23, -97, 
+    60, -11, -83, -53, -74, 55, 91, 38, -73, 48, 21, 73, 62, 55, 60, 53, -54, 
+    -53, -44, -21, -30, 63, 31, 57, 92, 51, -38, -77, 65, 9, -78, -25, 40, 
+    -67, -5, -22, 2, -28, 73, -29, 33, 46, 24, -36, -58, 88, 24, -84, 73, 
+    -90, 81, -96, 90, -2, 94, 47, 84, 0, -46, 6, -27, 58, 41, -73, 44, 63, 
+    -35, 4, -87, 71, -53, 56, -53, -69, -10, -61, 57, 15, -59, 13, -15, -21, 
+    45, -78, -11, 2, -70, 18, -20, 20, 19, -91, 88, -55, -35, -26, 78, 14, 
+    42, -36, -94, -87, 1, -13, -49, 75, 45, -29, 70, 34, -12, 77, -19, -78, 
+    -95, 98, -29, 73, -16, -21, -53, -73, -43, -92, 88, -75, 64, -87, 74, 
+    -94, -5, 99, -76, 91, -92, 35, 87, -34, 12, -67, 95, -21, 77, -6, 87, 
+    -65, -77, 76, 89, -80, -69, 67, 52, -89, 30, 37, -23, -100, -35, 32, 97, 
+    -17, -95, 78, 25, 71, 24, 97, 28, -42, -8, -87, -30, -25, 89, 34, 3, -84, 
+    -84, -85, -51, 62, 72, 28, 4, 83, -26, 96, 19, -95, 50, 81, -27, 31, 59, 
+    -7, -98, 75, -52, 50, 89,
+  38, 56, 32, -99, -68, 75, 3, 32, -76, 12, 47, 75, -14, 7, -22, 84, 85, 33, 
+    19, 10, -96, -52, -2, -66, 9, -10, -66, -77, 7, -58, -72, -66, -21, -63, 
+    46, 65, 28, 34, 80, 19, 24, -88, 50, 20, -3, -38, 73, -24, -27, -2, 72, 
+    -3, 15, 79, 79, -21, -52, 33, -56, -87, 97, -59, 67, -56, -86, 7, 35, 93, 
+    -19, -81, -29, -76, -75, -94, 97, -8, 24, 79, -35, 4, 63, 43, -84, -2, 
+    -72, -31, 8, 30, -38, -36, -6, -47, 50, 8, 95, 29, -17, -23, 94, -29, 
+    -31, -96, 89, -46, -87, -28, -98, -9, -83, 1, -50, -47, -52, 40, -81, 
+    -61, -27, -10, 31, -73, -57, -100, -80, 85, 35, -37, -33, -67, -13, -25, 
+    82, -57, -18, -23, 19, -71, 16, 96, -83, 79, -2, -89, 5, 89, -73, 5, -37, 
+    57, 42, -56, -35, -87, -81, -57, 94, 85, -14, 2, -41, -60, 13, -10, -61, 
+    2, -17, 6, -94, 91, -88, 10, 24, 86, -97, 24, -60, 81, 48, -42, 87, 75, 
+    -88, 84, 77, 72, -60, -56, -5, 90, -39, -26, -4, 45, -78, -50, 8, -35, 
+    -30, 88, 19, -14, 70, 14, -20, 54, 24, 85, -73, 62, 94, -90, 58, 43, 19, 
+    -75, -46, 95, -57, -61, 30, -29, -36, 21, -51, 23, 22, -72, -85, -4, 39, 
+    -13, -40, -46, 31, -36, -35, -76, 4, -22, -27, -26, 11, -18, 70, -75, 95, 
+    -30, -48, -40, -83, 83, 34, -44, 55, 28, -52, -17, 43, 8, -25, 15, 50, 
+    -96, -99, 74, -81, -50, -85, 93, -73, 62, -47, 32, -50, 76, 67, 47, 42, 
+    19, -88, 4, 10, -18, -89, 23, 94, 66, -31, -33, -24, -50, -73, 27, -97, 
+    34, 13, -48, 17, -74, -22, 66, -72, -92, -3, -12, -21, 35, 9, -100, 97, 
+    -78, 12, 40, -46, -2, 47, 43, 64, 93, -66, 57, 14, -31, 80, 1, -22, -100, 
+    -23, -86, -11, 7, 80, 62, 99,
+  -49, -47, 40, 74, 17, -71, -26, 32, -6, 25, 26, -88, 5, 3, -61, -81, 24, 
+    96, 77, 69, 46, -21, -35, -76, 80, 27, -8, 39, 93, 27, 79, -37, 97, -70, 
+    -50, -25, 90, 3, -28, -14, 89, 82, -59, -27, 57, -55, 58, 81, -70, 98, 
+    -87, 53, 55, 26, -42, 28, 95, 68, 50, 78, 73, -69, 27, 89, 78, 34, 14, 
+    -20, 66, 33, -69, 67, -71, 86, 46, 83, 53, -32, -68, -69, -89, 63, 82, 
+    -83, 90, -11, -76, -51, 9, 11, -59, -73, 80, -39, -45, 39, 98, 62, 75, 
+    41, -42, 27, -58, -25, -63, -14, 99, 99, -38, -63, 88, 0, 36, 24, 5, 40, 
+    -87, -63, 52, 3, 27, -10, -49, 94, 72, 10, 75, 51, -54, -31, 86, 90, -89, 
+    83, -69, 8, 47, -22, -98, -62, -53, 91, 73, -31, -73, -59, -46, -7, 25, 
+    56, -8, 24, -71, -91, -60, -13, -5, 62, 76, 35, -34, 59, 88, 42, -94, 
+    -92, -38, 19, 96, -22, -80, -27, 61, 29, 13, 70, -63, -1, 10, -52, 48, 
+    -45, 4, -93, 98, 71, -48, -40, -89, -68, 11, -19, -89, -25, 83, -59, 93, 
+    85, 91, 22, -24, 90, -91, -96, -85, 30, 19, 56, -41, -31, -86, -26, 77, 
+    54, -51, 4, 31, -10, -72, -73, -13, 96, 50, 20, -25, 14, 75, 94, -50, 
+    -52, 26, -93, -64, -11, -73, -96, 89, -30, -14, -4, -12, -67, 95, 76, 94, 
+    -98, -90, 21, 77, 7, -50, -32, 54, 86, 30, -12, -80, -89, -79, 75, 60, 
+    28, 39, -1, 86, -56, 56, 41, 6, 19, -33, -18, 77, 21, -7, -33, -27, 15, 
+    -2, -61, 40, 75, 49, 69, -26, -82, -36, 30, 69, 66, -90, 72, -96, -72, 
+    55, -60, 57, 19, -1, -24, -26, -95, 40, 0, 72, 65, 61, -25, 12, 71, -11, 
+    1, 28, -99, 40, 9, -12, 73, -78, 75, 41, -29, -51, -60, 12, 67, 49, -82, 
+    -32, -59, -84, -91, 49,
+  -55, 95, -57, 8, -76, 40, -52, 24, 37, -75, -99, -48, 34, 45, 48, 39, -33, 
+    40, 6, -83, -14, 40, 43, -95, -68, 49, -98, -38, -78, -65, 25, -79, 63, 
+    19, 7, -25, -90, -8, -84, 22, 32, -62, -38, 38, -67, 93, 70, -71, -72, 
+    -80, -89, 56, 54, -17, -96, -7, -28, -83, 63, -62, -6, 8, 43, -90, 18, 
+    -4, 52, 3, -56, -44, 72, -100, 55, 2, 4, 2, -58, -15, 58, -51, -45, 9, 
+    -47, 10, -43, -38, -69, 7, -20, 22, -92, -79, -50, 36, -65, -61, 26, 60, 
+    -80, -86, -3, -98, -92, 83, 84, -85, -76, -78, -14, -23, -67, 31, 6, 36, 
+    -21, 4, 88, -54, 89, 16, -49, 40, -76, 54, -85, -43, 27, -15, -24, -78, 
+    -65, 2, -37, -36, -73, -8, 65, 85, -9, -70, -99, 11, -93, 90, -82, 0, -6, 
+    -16, -21, -67, 25, -25, 83, -35, -2, 93, 82, -80, -68, 2, -11, -66, -12, 
+    -8, 34, -37, 24, -78, 40, -88, 38, 47, 79, -67, -14, -43, -67, 48, 8, 
+    -99, -19, 26, 27, 45, 34, -63, 4, -14, 18, -13, -52, -40, 93, 67, -59, 
+    -67, 85, -1, -20, -38, 36, -67, -44, -35, -65, -73, 16, -93, -70, -45, 
+    62, 62, -39, 40, 25, 3, 67, 17, -98, -67, -34, -13, -89, -2, 71, 97, -91, 
+    -66, 0, -17, 42, 14, 44, -3, -64, -56, -85, -100, -2, -59, -29, 95, 9, 
+    -67, -72, 88, -61, 85, 4, 43, 92, -90, -92, -39, 82, 29, 53, 98, 69, -33, 
+    -100, -58, -45, -40, 43, 56, 71, -90, -15, 51, 91, -61, 50, -20, 24, 84, 
+    41, 16, -79, -57, 38, -75, 99, 61, -2, 73, 86, 7, -91, 52, 2, -50, 20, 
+    98, -12, 45, 3, -41, 61, -77, 24, -16, -98, 59, -22, 42, -84, 8, 30, 3, 
+    -90, 1, 56, -51, 72, -98, 6, 64, -44, 84, 44, -69, -61, 18, 5, 96, -25, 
+    80, 32, 97, 45, 2, 5,
+  -49, 89, -29, -40, 61, 81, 81, 35, -38, 9, -45, 12, -88, 48, 93, -22, -5, 
+    60, -78, -50, -2, -18, 65, 45, 62, 37, -84, 1, 87, -43, -8, 22, -79, -31, 
+    84, 87, -77, -9, -27, -12, 83, -36, -35, 10, -18, 75, 31, 94, -1, -96, 
+    -28, 58, -97, -23, -73, 77, -20, 10, -60, 63, 64, -58, 36, -62, -44, 11, 
+    76, 5, 55, -68, -99, -56, -96, -7, -85, 62, 33, 34, -5, 98, -73, -27, 18, 
+    61, -99, 53, 20, 28, 99, 90, 33, -62, 48, 51, 84, 0, 18, 51, -46, -65, 
+    29, -65, -80, 6, -64, 35, 28, -34, 52, -33, 49, 82, 77, -25, 58, -42, 
+    -57, -37, -33, -48, -70, -13, 56, -33, -24, -67, -31, 64, -53, -86, 56, 
+    49, -89, -4, 83, -48, 56, 76, -12, 48, 39, 14, -64, 94, 88, 55, -35, 54, 
+    53, -48, 22, -4, 12, 69, -36, 32, 31, -26, -98, -81, -24, -79, 68, 0, 99, 
+    0, -42, -6, -74, 97, 18, -92, -5, -11, -64, 63, 56, -26, -75, -11, -38, 
+    14, 70, 55, 85, 56, 8, -59, 50, 65, 96, 14, 66, 17, -77, 98, 92, -15, 
+    -97, 9, 92, 8, 92, -41, 42, -84, 92, 65, 42, 69, -55, -13, 33, 66, -83, 
+    96, 61, -87, -79, 1, -80, -95, 47, 15, 99, 49, -41, 29, 50, -50, 97, 86, 
+    -49, 78, 46, 55, 57, -94, -32, -96, -97, -90, -53, -4, -1, 11, 93, 48, 
+    33, 42, 9, 81, -1, 70, 86, -53, -68, -96, 81, -81, -66, -29, -57, -98, 7, 
+    64, 12, 48, 29, 97, -3, 75, -41, -31, -81, 85, 75, 29, 88, 68, -35, 94, 
+    27, -65, -37, 55, 58, 24, -51, -61, 82, 72, -91, 74, -15, -45, 94, 49, 
+    -24, -42, -25, -42, 86, 56, 77, 72, 92, -6, -89, 58, -52, 80, -33, 25, 
+    -78, 75, 51, 75, -56, -75, -83, 15, 87, -54, 84, 23, -20, -81, -41, -22, 
+    20, 82, 11,
+  -51, 35, 43, 66, 39, -72, 10, 57, -99, 37, -73, 83, -6, -65, 58, -39, -99, 
+    -45, -42, 87, -83, -93, 77, -26, -21, -39, 27, -64, -31, 46, 50, 70, -46, 
+    -43, -96, -36, -51, 85, -5, 93, 69, -75, -20, 9, 39, 1, 80, 19, 51, -3, 
+    75, 2, 76, -47, 67, 51, 36, -61, 20, 15, -74, 38, 0, 20, 60, 38, 95, -18, 
+    26, -19, 68, -25, -99, 42, 64, -94, 48, -53, -93, 84, -49, -75, 42, 89, 
+    -41, 5, 6, -8, 89, -74, 71, 43, -41, -15, 3, -75, -82, 3, -69, -37, -67, 
+    -20, 71, -89, -100, 11, -95, -36, 70, 87, 90, -40, 99, 71, -14, 93, -80, 
+    -19, 7, -17, -17, -45, -25, 43, 72, 96, 64, 81, 52, -43, 81, 26, 10, 29, 
+    -28, -31, -5, -98, 84, 31, 7, -45, -50, -96, 40, 74, 42, 26, -66, -90, 
+    -35, -67, -16, -91, -30, 30, -72, 94, -86, -14, 32, -65, -82, -13, -88, 
+    22, 76, 37, -27, -78, 86, 33, -51, 74, 68, 94, -82, 29, -78, -2, 83, -78, 
+    -46, 59, 91, -15, 57, -39, -21, -3, 27, -9, 39, -90, -82, -86, -28, 98, 
+    -58, -99, -51, -56, 57, -55, -50, -10, -90, 98, -94, 32, -100, -26, 26, 
+    -2, 77, -86, -33, 84, -12, 42, -82, 20, -31, -99, 48, 85, -87, -3, -64, 
+    -83, -22, 24, 90, 21, 77, 8, 30, -19, 23, 34, 18, -17, -32, 83, -67, -74, 
+    43, 78, 81, -46, -7, 12, -35, 55, -54, 56, -84, 72, -9, 77, 97, 36, -9, 
+    -97, -35, 80, -82, -48, 90, -92, -88, 70, -23, -84, -71, 55, -7, 59, -53, 
+    56, 38, 29, 61, -27, -24, -61, -15, 52, -97, -87, 90, -19, 32, 83, -5, 
+    99, -62, 21, -25, 71, -2, 48, -37, 17, -48, -53, -73, 11, 45, 12, -89, 
+    20, 26, 45, -36, 46, -67, -100, -3, 24, -77, -2, -84, -19, -13, -91, -36, 
+    -9, -74, -31, 54, -74, 10,
+  66, -21, -38, 52, 34, -38, 79, -15, -2, 70, -45, -38, 11, 23, -11, 40, -22, 
+    -65, 83, -67, 50, -42, 21, -85, 71, 75, 12, 53, 83, -72, -39, 44, -61, 
+    29, 44, 66, -54, 6, -96, -31, -40, -43, 58, -94, 34, 8, -87, 23, 28, -29, 
+    64, 46, 75, 87, -58, 98, 54, -30, -39, 1, 32, 66, -38, -70, -45, 20, 68, 
+    -3, 37, -64, -63, 80, -22, 85, 91, 20, 5, -79, -80, 83, 55, -73, -95, 31, 
+    -28, -23, -46, 59, 24, 64, -94, 1, -72, 1, -67, 36, -34, 47, 34, -95, -4, 
+    -60, 22, -10, -92, 66, -11, -22, 16, -17, 25, -72, 39, 91, -96, -37, 45, 
+    54, -73, 50, -32, 40, -26, 43, -40, 31, -71, 86, -66, -56, -80, 36, 92, 
+    92, -56, 57, -25, 85, 94, -58, 27, -70, 81, 61, 82, -52, -64, 93, -17, 
+    66, 18, 88, -62, -19, 53, -58, -11, -25, -98, -84, -75, 87, 93, 55, 33, 
+    -7, -79, -12, -30, -84, -46, 94, -10, -52, -77, -94, -45, -25, -55, -84, 
+    -25, 15, 44, 53, 32, -18, -55, 30, -71, 28, -7, -72, 14, -83, 39, 48, 
+    -74, 8, -85, 99, 39, 38, -62, 49, 95, 82, -71, -24, -50, -46, 14, 66, 69, 
+    83, -100, -92, 17, 85, -53, 97, 46, 55, -62, 18, 53, 38, 39, 18, 70, 13, 
+    -52, -65, -64, -16, 44, -100, 92, 96, 72, 43, 1, 8, -30, -51, 72, -18, 
+    29, -37, -8, -21, 58, -18, -69, -45, -6, -6, -11, -12, 81, 5, 35, 74, 
+    -80, -77, -37, -29, 85, -22, -31, -19, -21, -93, 9, 75, 35, -11, -55, 68, 
+    -8, -99, 51, -25, 49, 45, -71, 50, 24, -36, -85, 54, -6, 2, -21, 14, -74, 
+    90, -46, 85, -13, -17, -72, 33, -11, 60, 60, -48, 28, 66, -60, -28, -74, 
+    66, 4, 72, 67, -71, -13, -20, -60, 79, 85, -54, 11, -26, -55, 74, 12, 76, 
+    -26, -49, 80, 95, 68,
+  -16, -58, 83, 56, 22, 85, -36, 93, 28, 58, -15, -19, -6, -78, -44, 62, -3, 
+    73, 86, -38, -65, -28, 93, 88, 87, 98, -70, 22, 59, -12, -96, -60, -88, 
+    24, -18, -10, 61, -66, -81, 1, -91, -4, 86, 97, 28, 63, -73, -99, 63, 
+    -19, -2, -52, -66, -23, -38, 0, -46, -80, -26, 15, -84, -53, -51, 99, 45, 
+    94, 88, -27, 42, -32, -89, 86, 47, -29, -99, 90, 94, -99, -15, 71, -91, 
+    81, -22, -40, 16, -20, -40, 32, -43, -40, -32, 99, -49, -64, 94, 63, -32, 
+    29, 26, 93, 58, -33, 28, 20, -39, -45, -64, 38, -23, -45, 63, 57, 5, 34, 
+    36, 65, 84, 92, 58, 89, 93, -23, -65, -2, 29, 10, -51, -22, -40, 59, 53, 
+    -69, 97, -37, 35, -53, 59, 92, 69, 86, 82, -72, -12, 17, 29, 67, 95, -76, 
+    -96, 82, 66, 40, 63, 14, -95, -68, 69, 72, 14, -70, -56, 51, -38, -4, 63, 
+    -24, -35, -77, -1, 67, -26, 32, 59, 25, 87, 85, -6, 35, 24, 44, 90, 76, 
+    72, 69, 66, -12, -93, -29, -56, 14, -52, 64, 14, 75, 0, -50, -49, 78, 
+    -100, 99, 94, 89, -47, -59, 56, 2, -42, 8, -3, 72, 70, 41, -3, 5, -34, 
+    43, 13, -33, -4, -43, -23, 25, 53, -48, -6, -23, 81, 12, -57, -18, -66, 
+    -1, 49, -19, 90, 40, 76, -46, -11, 20, -99, -47, 65, -40, 53, -67, -52, 
+    -11, 35, -3, 48, 74, 81, -11, -63, 77, -80, -83, -85, -20, -3, -9, 74, 6, 
+    -75, -21, 94, -39, 18, -7, -84, -77, -29, 97, -3, 2, 42, 23, 66, 63, 82, 
+    -35, -5, 67, -24, -78, -1, -72, 79, -94, -53, 64, -70, -57, -22, 79, -35, 
+    67, -92, 10, 33, 86, -13, 41, -70, 32, -88, -9, 25, 40, -12, 67, -64, 
+    -32, -59, 60, -76, -3, 96, -26, -39, 39, -90, 72, -100, -20, -5, 79, 93, 
+    -1, -30, 12, -98,
+  -99, -14, -53, 26, -47, -34, 24, 98, -52, -89, -45, 53, 23, 89, -53, 65, 
+    -69, -48, -26, 93, 65, 79, 65, -97, 25, -26, -64, -16, -32, 29, -8, 89, 
+    -32, 39, 28, 60, -87, -88, 72, -60, -50, -46, -39, -4, 39, 72, 33, -35, 
+    50, -58, -38, 23, 70, 35, 30, -38, -49, 85, 58, -56, -38, -29, -11, -32, 
+    -88, -30, -73, 27, 23, 54, 92, 76, 41, -86, -12, -39, 87, 74, -4, -72, 
+    85, -29, -15, -30, 24, 83, -18, -54, -35, 43, -89, -26, 39, -60, 59, 40, 
+    22, 77, -27, -11, 70, 26, -2, -40, 89, 94, -20, 25, 66, 29, 66, 6, 73, 
+    55, 78, 4, 22, -42, -15, -29, 72, 4, -60, 62, 4, -4, 47, -95, -82, -14, 
+    1, 52, -82, -4, 14, -22, 48, -28, 87, -83, -34, -65, 36, -8, -11, 24, 15, 
+    60, 59, 69, 67, -7, 33, -28, 62, 25, 97, -92, -65, 59, -59, -79, 69, -51, 
+    31, -5, -58, 89, -18, 14, -83, 19, -46, -7, 28, 82, 0, 46, -86, -77, 56, 
+    12, 54, 21, -90, -47, -16, -66, 95, 44, 32, 4, 73, 19, 43, 93, -61, 94, 
+    35, -55, -98, -93, -8, 59, -87, -69, 47, 32, 28, 19, 28, 67, 41, 58, -83, 
+    -67, -64, -55, 56, -85, -42, -86, 35, 14, -57, 93, -11, 21, -1, -87, 44, 
+    -6, 71, 16, -46, -17, -62, 16, -21, 66, -14, 45, -73, -68, 84, -50, 82, 
+    20, 5, -57, 61, -32, 46, 38, 83, -51, 77, -19, -20, 19, -87, 77, -91, 85, 
+    -58, -95, -40, 76, -96, 9, 40, -70, 43, -33, -84, -49, -42, -41, -79, 89, 
+    6, 0, 29, -43, -50, 46, -40, -55, -58, -54, -80, 29, -23, -54, -87, -22, 
+    -78, -33, -55, -74, 27, 77, -5, -38, 55, 26, -33, -98, -57, -94, -56, 54, 
+    91, -33, -98, -45, 74, -73, 43, 61, -73, -69, -47, -91, -60, 78, 74, 61, 
+    67, 13, -64, 96, -8,
+  -51, -67, -13, 31, -49, -28, 4, 14, 88, -30, 29, 16, 91, 50, 66, 83, 40, 
+    -65, 35, 90, 73, -69, -47, 47, 33, 93, 97, 53, 43, 60, 48, -83, 25, -46, 
+    1, -75, -62, -78, 63, -35, -1, 49, -99, -7, 28, 18, -18, 96, -29, -58, 
+    -80, -67, -56, 47, 10, 75, -97, 66, 14, 81, -22, -88, -65, -38, 22, -42, 
+    48, -37, -77, -58, -90, 82, 73, 99, -65, -90, 26, -55, 71, -85, -12, 32, 
+    39, 91, 83, -39, -73, -18, -39, 93, 60, -34, -43, 20, -86, -50, 40, 34, 
+    77, -59, -72, -95, -67, -25, -3, 49, 41, 41, -49, -77, 24, 17, 13, 23, 
+    -62, 9, -8, -54, -66, -31, -32, -50, -8, 46, -71, 77, 96, -92, 0, 32, 
+    -47, -86, 11, 22, -78, 59, -51, 21, 6, -83, -33, -61, 79, 83, -40, -8, 
+    62, 56, 35, -46, -15, 90, 43, 34, -85, -33, -27, 26, 3, 94, 85, -48, 73, 
+    29, -100, 93, -50, -3, -51, 73, 4, 48, -51, -64, 34, -31, 46, 77, -13, 
+    61, -18, -14, 38, 67, 5, 40, -14, -10, 12, -62, -44, -45, 41, 51, 80, 30, 
+    -28, -33, 49, -46, -99, 84, -89, -65, -24, 75, 2, 71, 32, 97, 0, -54, 
+    -40, 13, -49, -93, -13, 52, -100, 0, 9, 98, 19, -63, -63, 36, -55, -55, 
+    -76, 30, 13, 62, -51, 65, 17, 75, -53, 65, -83, -6, -14, -75, 86, -64, 
+    13, 76, -68, 19, 14, -95, 50, 33, 76, -92, 10, 39, 0, 44, -22, 28, -36, 
+    -48, 93, 62, -55, 66, -68, 26, -58, 46, 98, 96, 5, 48, -98, 13, 77, -22, 
+    -65, 8, -6, -93, -53, 59, 5, 38, 17, 98, -40, -36, -66, -100, -65, -74, 
+    96, 89, 48, 55, 93, -83, -77, -95, -91, 96, 98, 48, 37, -15, 80, 86, 14, 
+    92, -78, 61, 4, -64, 97, 89, -86, -32, 26, -53, 19, 97, 61, -13, -2, 64, 
+    -82, 98, 82, 57, 66,
+  -59, -93, -97, -84, 45, -36, -46, 98, 74, -19, 43, 9, 2, 3, 37, 99, 88, 
+    -81, 3, -82, -70, 45, -38, -26, -87, 2, 56, -92, 29, 35, -3, -80, 17, 68, 
+    -68, -13, 71, 10, -53, -84, 16, -68, -76, 65, 93, -13, 34, 94, 46, 9, 
+    -90, -85, 54, -43, -57, -26, 52, -84, -17, 29, 78, 35, -6, -29, -48, -70, 
+    -4, 68, 42, 22, -54, 30, -86, 46, 60, -46, -8, -25, 60, -83, 9, 37, -26, 
+    75, 97, 94, -7, -95, -93, 69, 56, -2, -77, 24, 0, -18, 45, -1, -50, -15, 
+    -93, -54, -83, 21, -17, -42, -21, -41, -39, -54, 74, -17, 78, -63, -77, 
+    -64, -82, 19, 62, 14, 39, -67, -43, -7, -26, -13, -6, -24, 15, -90, -14, 
+    66, 9, 11, 8, 41, -54, 3, -68, -81, -81, 57, 99, -40, 34, 88, -66, 20, 
+    30, 32, 22, -64, 41, 27, 14, -35, 53, 1, -78, -49, -52, -2, 86, 14, 86, 
+    -24, 33, 69, 52, 35, -35, -5, 0, 17, -3, -72, 47, 97, 35, 6, 32, -91, 
+    -89, 63, -25, 45, 27, 8, 84, -45, 89, 25, -56, -40, -53, 31, 30, 2, -40, 
+    51, 59, 69, 70, -59, 30, 31, -30, -74, -58, 16, 94, -79, -90, -74, 89, 
+    -22, -38, 11, 97, 21, 14, -17, -67, 60, 96, 44, -41, -19, -51, -69, -66, 
+    9, 39, 20, -23, 53, 2, 46, 17, -42, -14, 85, 44, 69, -73, -1, 80, 97, 99, 
+    53, -17, -46, -60, 70, -19, 69, 98, -53, -28, -83, -52, -26, -17, -30, 
+    -96, -24, 26, 92, -20, 58, 17, 42, 60, 27, -26, -50, -21, 9, 97, -7, -82, 
+    -61, -11, 8, -43, -10, -91, 16, 21, -53, -81, 32, 15, -49, -30, -47, -25, 
+    -68, -70, -10, -86, -16, -40, -33, -81, -47, 17, 33, 46, -38, 34, -42, 
+    10, -92, -47, -71, -7, -15, -60, 61, -83, 8, 51, 37, -24, 26, -44, -5, 
+    29, 77, 61, -71, -64,
+  78, 3, -55, -40, -68, -10, -55, 59, -62, 58, -8, 38, -56, -89, 99, -18, 
+    -82, -71, 98, 38, 23, 20, 47, 28, -23, -61, -21, -78, 4, -92, 74, -13, 
+    72, 53, 85, -52, -28, -29, 70, 39, -23, -83, -76, 28, 23, -100, -95, 98, 
+    -59, 4, -77, 54, 89, 16, -70, 13, 15, -71, 32, 67, 36, 44, -85, -51, -47, 
+    -57, 37, 66, 33, -83, 12, 3, 59, 84, 98, -79, 3, -91, 10, -50, -32, 14, 
+    63, 21, 65, -100, 73, -26, -14, 58, -47, -81, -54, -74, -72, -92, -83, 
+    -22, -97, -33, -95, 38, 49, -66, -23, -96, -67, -46, 38, 90, 83, -61, 
+    -63, 48, 74, -93, -29, 58, -70, 0, -12, 36, 59, 72, -78, -21, 27, -22, 1, 
+    -20, -97, 12, -30, -51, 40, 20, -79, -42, 6, 80, 94, -8, -30, -47, -65, 
+    -27, 69, 43, 3, 71, 73, 22, 42, 80, 47, -42, 54, 38, -14, -47, 37, -3, 
+    -59, -37, 38, 72, -44, 33, -62, -33, 62, -11, -16, -47, 41, 6, 49, -96, 
+    -29, -44, -29, 92, 79, -6, -33, 83, -79, 75, 10, -68, -85, -86, 68, 79, 
+    63, -33, 27, -79, 50, -50, -62, 40, -5, 65, 29, -87, -20, -5, -62, -4, 
+    -78, -97, 5, -20, 63, -77, 37, 61, -11, -19, -67, 1, 45, 40, 88, 94, -74, 
+    39, 84, 0, 58, -79, 50, 20, -88, -32, 61, 1, -42, 99, -82, 81, -44, 44, 
+    72, 4, 99, 53, 42, -20, -88, 26, 23, 22, -72, 72, -55, -74, -14, 6, -39, 
+    -5, 49, 68, 43, 6, 87, -23, 58, 38, -41, -56, -11, 97, 87, -94, -37, -58, 
+    -19, -67, -38, -85, 2, -37, -3, 48, 21, 77, -69, -98, -87, -84, 42, 16, 
+    -94, -2, -80, -36, -87, -4, 69, 98, -4, 23, -75, 24, -72, 68, 67, 49, 54, 
+    -72, -25, -99, -95, -66, -96, 70, -17, 26, -83, -31, -9, -34, -9, -15, 
+    -83, -18, 76, 58, 78, -6, -71,
+  58, -10, 10, 55, 30, 1, 38, 44, -23, -94, -49, -83, 18, -78, 88, 53, 56, 
+    -25, -52, -11, -69, 83, -81, -1, -35, 35, -97, -96, 19, -30, 24, -74, 83, 
+    79, 82, 23, 26, 40, 55, 2, -82, 80, 50, 18, -26, -35, -47, 14, -63, -64, 
+    -74, 66, 97, 74, 70, 16, -14, -23, -85, -96, -66, 59, 58, 23, -94, -6, 
+    75, 56, 42, -13, 97, 67, 15, -90, -59, -34, 33, 94, -29, 3, -70, 42, 58, 
+    -37, -34, -62, -60, -16, -31, 19, 58, 56, -8, -47, 29, 43, -26, 26, -65, 
+    56, -48, -76, 75, -79, -50, 75, 71, -9, -16, -9, -40, -44, -100, 19, -71, 
+    -73, 25, -68, 40, -100, -86, 76, 45, 65, -4, -11, 91, 16, 12, 21, 52, 
+    -49, -38, 70, -2, -65, 34, 2, 19, -21, 46, 9, -67, 63, 44, 99, -58, 18, 
+    79, 87, -2, -43, -33, -62, -9, -79, -32, 17, -56, 82, -8, -88, 65, -94, 
+    -87, -58, -76, 95, -96, -24, -20, -57, 30, 80, 17, -6, -11, 71, -50, 75, 
+    -34, -28, 43, -5, 27, -15, -97, -32, 53, -68, 97, 44, 51, 47, 6, -19, -1, 
+    -43, 65, -89, -91, 21, -63, -59, 31, -9, 26, -79, -74, 43, 30, -38, 32, 
+    86, -55, -48, -48, 42, 17, 70, 18, -40, 11, 74, -20, -35, -37, -64, 38, 
+    -53, 28, -76, -39, 83, 50, 25, 59, -2, 44, -40, -81, -90, -17, 40, -45, 
+    87, 12, -60, -31, -81, -76, 96, 79, -69, 58, 73, 12, 17, -34, 67, -70, 
+    85, 25, -87, -86, 59, 13, -68, -5, -53, -60, 31, -5, -51, -7, -61, -76, 
+    91, -12, -42, -42, -16, 23, 50, -17, 66, -55, 72, 56, 84, 80, -19, 73, 
+    -79, -97, 57, 44, -96, -65, 83, -31, 40, 74, 98, -44, -42, -89, 64, -50, 
+    49, -28, -26, -17, -23, 57, -58, 89, 51, -57, 62, 97, 31, -12, -15, -18, 
+    -73, -91, -70, 75, -65, -11, 72, 29,
+  36, -94, -100, 67, -24, -92, -40, 15, -79, -45, -72, 99, 98, 93, -39, 40, 
+    34, -55, 40, -38, 54, -46, -70, -86, -32, -72, 60, 25, 66, -97, 24, -41, 
+    8, 94, -9, -48, -34, 55, -46, 22, -92, -37, 80, 20, -43, 18, -78, -37, 
+    78, -43, -13, 74, -72, 71, 72, -6, -21, -30, 75, 64, -73, -42, 40, -50, 
+    -11, -90, 91, 92, -19, -16, 51, -20, -61, 87, 61, 24, -93, 28, -9, -32, 
+    -13, -10, 51, 14, 68, 88, 33, 42, -79, 4, -25, 35, -78, 25, -64, -45, 
+    -96, 14, 1, -73, 91, -19, -9, 42, 0, 56, -53, -78, -35, -96, 82, -92, 
+    -17, 62, -86, -80, -41, -98, -24, -49, 43, -15, -67, 92, -10, -50, 74, 
+    -16, 27, 12, -25, -3, 42, 0, -78, -82, -74, 12, -38, -74, -2, 23, -41, 
+    -20, 6, 85, -49, -89, 71, -3, -49, -95, 23, -53, 61, 29, 4, 33, -41, 51, 
+    -8, -22, -72, -77, -54, 81, -87, -81, 98, 40, -21, -55, 86, 23, -99, 80, 
+    59, -5, -58, -18, -77, -14, 5, -74, -94, 57, -67, -6, -86, -32, -39, -68, 
+    -8, 3, -68, 71, -49, 59, -100, 2, 68, -53, 55, -69, 88, 25, -14, -59, 6, 
+    -15, 18, -99, -10, -17, 44, -39, -63, 25, -65, 31, -75, -26, 73, 52, 60, 
+    72, 85, 25, -40, -84, 79, -7, -33, -50, 9, 60, 83, 80, -83, 90, 10, 42, 
+    -67, -40, -59, -54, -96, -76, 74, 16, -99, 34, -63, -51, 11, -51, -2, 19, 
+    32, 15, -47, 25, 86, 98, 20, 72, -6, -17, 67, 4, 35, -77, -16, -54, -98, 
+    -63, -16, 92, -52, -51, 90, -28, -62, -23, 50, -54, 16, -6, 40, 29, -10, 
+    86, -24, 14, 94, 99, -84, -43, -35, 13, -49, -98, 50, 27, -28, -13, 36, 
+    2, -7, 79, 59, -49, -17, 10, 98, -5, -87, 15, -24, 8, 25, 92, -50, 42, 
+    -88, -70, -21, 14, -76, 61, -61, -10, 22,
+  16, -82, -59, -14, -3, 83, -70, -35, -54, 97, -86, 34, 47, 11, -50, -52, 
+    -71, 80, 57, 58, 29, 7, -95, 79, -63, 35, 42, 24, -59, -51, 54, -61, 21, 
+    -33, 20, -77, 25, -7, -30, 70, -81, 92, 70, 29, -12, -89, 53, 50, -46, 
+    57, 37, 71, 64, -9, -74, 69, -24, -11, 46, -90, -14, -21, 45, 40, 61, 
+    -32, 2, 96, -91, -79, 26, -23, -56, 70, 69, -91, -61, -18, -92, 69, 90, 
+    -55, 28, -57, 59, -54, -37, 46, 36, 91, -30, 78, 76, 0, -81, 81, -7, 87, 
+    -91, -1, -13, 81, -60, -50, -34, 76, 90, 55, 72, -21, 28, -14, 60, 20, 
+    97, -98, -3, 9, 9, -46, -46, -91, -100, -39, -82, 15, 46, -73, -66, 72, 
+    64, 73, 14, -30, 20, -1, 90, 18, -72, -51, 9, 21, -81, -91, 6, -28, 9, 6, 
+    21, -75, 42, 65, 79, -24, 4, 12, -12, 65, -100, -83, 55, 97, 88, 31, 97, 
+    -85, 57, 61, -57, -75, -26, 2, -62, 31, 3, 92, 54, 37, -60, -54, -13, 46, 
+    -91, 53, 21, 95, -34, 52, -38, -28, 97, 8, -51, -95, 79, 26, 26, 36, 1, 
+    -69, 83, -36, -12, -22, -94, -95, 97, 8, -52, -4, -18, 78, 50, -55, 16, 
+    42, -96, 87, 88, -98, -70, 64, 57, 90, -26, -80, 20, -49, -34, 56, 77, 
+    17, -7, 95, 29, -43, -99, 40, 56, -77, -4, 98, -90, 27, -27, -13, 76, 
+    -97, 22, 39, 45, -3, 77, -10, 12, -20, 10, -85, 48, 22, -1, -55, -21, 
+    -39, 15, -28, -49, 73, 72, 66, -99, 3, -63, 2, -32, -94, 1, 25, -62, -90, 
+    39, -85, 85, -37, -93, 74, 21, -86, -7, 26, -17, 44, 49, 8, 59, 19, -21, 
+    50, 31, 91, 55, -55, 13, 66, -88, 95, 52, -12, 13, -17, -68, -3, 98, 21, 
+    -70, -7, 28, -85, 37, -100, 46, 93, 93, -30, 80, 19, 54, 36, -2, -80, 3, 
+    65, 1,
+  -7, -61, 52, 80, -85, -56, -77, -91, -22, -37, -87, -58, -57, -43, 42, 7, 
+    -74, 18, -5, 10, -59, -18, 52, -22, -53, -99, -90, 27, -84, -6, 93, 25, 
+    26, -46, 6, -54, -85, 50, 9, 46, -25, -95, -48, 40, -6, 49, 58, -22, 78, 
+    -25, 11, -41, -26, 68, -59, 29, 51, 1, -59, 9, 67, -58, -29, 8, 13, 76, 
+    78, -81, 82, 93, 86, -10, 62, -88, 19, 76, 77, -8, 0, -63, 76, -70, -12, 
+    38, -100, 81, -88, -72, 20, -95, 66, 92, -78, -37, 23, 68, -85, 4, -4, 
+    71, -95, -84, 49, 55, 71, 41, 50, -51, -51, -32, 57, 40, 10, -83, -73, 
+    -59, -11, 23, -58, 21, -8, -13, -68, 85, 66, -64, 74, -59, -72, -39, 74, 
+    -43, 88, -3, -49, -11, -42, -12, -43, -63, -78, 70, -34, 17, -9, -10, -5, 
+    98, 31, -91, -49, 66, -39, 5, 9, 22, -58, 33, 67, 67, -5, 0, 8, 60, -96, 
+    -76, -40, 85, 96, 84, 89, 82, -56, -85, 38, -17, -58, -98, -95, -62, -86, 
+    72, 4, -97, -25, -9, 48, -93, 35, 46, -25, 77, -29, -6, -24, -5, -93, 
+    -88, -100, -63, -36, -36, -10, -99, 70, 86, -91, -70, 20, 6, -20, 51, 
+    -51, 22, -92, -59, 67, 22, -77, 28, -55, 0, 60, -17, 35, -44, -9, 46, 89, 
+    23, 46, 76, 73, -42, 87, -43, 80, 4, 99, -80, -76, 63, -10, 31, 62, 9, 
+    -73, -79, 61, -98, -58, -29, 64, -49, -51, -60, -86, 33, -28, 35, -78, 
+    41, 87, -42, -85, 34, -45, -97, 47, -43, 10, -20, 0, 16, 15, 41, -65, 8, 
+    -74, -7, -53, 76, 34, 83, -45, -23, 87, -33, 40, -71, -31, 56, 57, -49, 
+    49, -6, 7, -77, -50, -93, -10, -80, 38, -40, -80, -40, -79, -59, 6, 71, 
+    24, -33, -50, 84, -13, 56, 56, 16, 31, -33, 96, -48, 53, 83, -49, -72, 
+    -57, -36, -82, 22, -78, -10, 58,
+  -36, -7, 66, -38, -31, -53, -3, 57, 55, -95, 75, -63, -42, 52, -5, -57, 
+    -100, -85, 35, 48, 61, 29, -29, -80, -35, -30, -71, 46, 8, 40, -24, 68, 
+    90, 5, -68, -85, 34, -96, -39, -98, 54, -71, 79, 74, 88, -73, -50, -85, 
+    32, -48, 48, 6, 68, -87, -29, -80, 97, 95, 76, 83, -92, -23, 74, 64, -13, 
+    64, 30, -41, 98, 38, -2, -18, -14, 57, -32, -34, 62, -55, 64, 33, 82, 39, 
+    -94, -12, -58, 27, 10, -66, -87, 41, -68, 9, -90, -14, 37, -71, -74, -78, 
+    31, 92, -16, 82, 94, 55, 48, 92, -12, -26, -97, 35, -75, 0, 32, -52, -48, 
+    -61, 95, -19, 67, -61, 50, 61, -66, 89, -54, -6, -55, -2, 1, -46, -91, 
+    -7, 77, -14, 31, 89, -9, -52, 18, 99, 24, 65, -8, -12, -15, 98, 80, -5, 
+    -48, 58, 76, -7, -32, -2, -14, -97, -71, 3, -78, -81, -71, -38, -91, -89, 
+    -19, -14, -20, 28, -82, 66, 24, -44, -17, 35, 93, 57, -14, 42, -78, -2, 
+    80, 48, -62, 81, -72, -8, -46, -99, -9, -3, -29, 76, -87, 22, -35, -81, 
+    -33, 33, 45, 99, -23, -47, 20, -44, 36, -27, -1, 74, -69, 50, 55, -5, 
+    -91, 86, -29, 26, -42, -60, 51, -16, -5, 47, -10, -47, -56, -8, 29, 1, 
+    -71, 50, -70, 57, -64, -97, 21, -9, -75, -76, 22, 72, 25, 41, -25, -19, 
+    22, -13, -75, -80, -38, -13, 88, -23, -24, 45, -11, 25, -75, 40, 7, 60, 
+    18, -53, -6, 18, -99, -21, 67, 22, 20, 55, -37, 76, -98, 17, -13, 51, 86, 
+    83, 58, -27, 41, 6, -1, -86, -9, 34, -95, -4, 72, -79, 81, 90, -39, -92, 
+    -10, 63, 37, -22, -47, -80, -60, -2, -81, -75, -1, -21, -6, -28, -14, 
+    -99, 34, 13, 86, -81, -75, -61, -7, -38, -87, -51, -18, 42, 77, -80, 97, 
+    -69, 99, 24, -59, 2, -7, 46, -67,
+  62, -29, 3, -27, 58, 58, 46, -67, -33, -10, -40, -16, 46, -27, 2, 71, -81, 
+    -53, -34, 5, -84, -68, 51, 4, 8, 81, -11, -32, -47, 96, 50, -80, -89, 
+    -60, -48, -88, -42, 17, -67, 15, 14, 92, -42, -2, -35, -78, 11, 92, 90, 
+    61, -95, -25, 51, 28, 33, 50, 73, 12, -51, 45, -51, 48, -5, -57, -4, 61, 
+    51, -71, -24, -36, -76, -65, -1, -55, -35, 91, -11, 41, -33, -16, 25, 
+    -48, -73, 23, 96, 61, -65, 80, -52, 43, 63, 14, -92, -94, -43, 15, 50, 
+    -28, 46, 77, -57, 31, 81, -5, 82, -46, 92, -25, 67, -37, -11, 31, 4, 79, 
+    -55, -99, -69, 93, -87, 79, 81, 8, -80, -63, -36, 25, -42, 62, -96, -88, 
+    -25, 21, 4, -78, 52, 53, 82, 4, 51, -53, -23, -95, 27, -79, -99, -96, 2, 
+    89, 93, 24, -5, -19, 80, -51, 29, 20, -76, -31, 6, 30, 12, -85, -91, 58, 
+    -89, -99, -6, 4, 0, -56, 16, -70, 37, 93, -80, 79, 57, 16, -5, -7, 20, 
+    14, -56, -10, -89, -74, 86, -75, -61, -76, -17, 33, 13, -66, -3, -3, 38, 
+    -4, 67, -55, -69, 60, -64, 54, -35, 61, 44, 25, 81, -67, 87, 64, -67, 79, 
+    -7, 19, 64, 82, 74, 28, -89, 52, 38, 47, -13, 80, -61, 14, 47, -70, -98, 
+    42, -19, -49, -84, 56, -74, -99, -11, 98, -53, -55, -52, -35, -79, 6, 39, 
+    -50, -35, 70, -30, -46, -28, 46, 18, 59, 8, -16, -20, -77, 82, -80, 60, 
+    43, 25, -75, 39, -19, 71, -72, 65, -21, -20, -77, -24, -66, -25, -22, 24, 
+    71, 1, -97, -20, -91, 34, -92, -33, -30, 32, 93, 65, 67, -36, 82, 35, 
+    -51, -77, -39, 42, 85, -2, 50, -1, -93, 32, -98, -99, 17, -34, 69, -45, 
+    -47, -4, -22, 80, 70, -13, 93, 45, 83, 49, 45, -29, -22, -80, 91, -51, 
+    60, 52, -80, 57, 24, -73,
+  97, -15, 32, 76, -25, 67, -27, -83, -14, -40, 95, 15, -92, -48, 41, -19, 
+    87, -55, -2, 99, 92, -54, 53, 36, -73, 28, 25, 6, 85, -69, 58, -88, 84, 
+    38, 50, -96, 60, 66, -93, -66, -66, 99, -52, 56, 62, -63, -79, -96, -72, 
+    3, 58, 65, 76, -9, -8, 71, -82, 84, -37, 39, -31, -36, -83, 45, -62, -86, 
+    69, -39, -93, -1, -39, -29, 98, 3, 79, 15, 11, -18, 94, 49, -79, 47, -92, 
+    78, -67, -8, 99, 8, -17, -9, -32, 49, 49, 67, -3, 45, -61, 71, 51, 37, 
+    96, 56, 86, -53, -89, 49, 37, 61, -47, 52, -63, 46, 59, -81, 86, -10, 
+    -18, -35, 52, -31, 81, -82, 80, -45, 92, -4, 2, -79, -61, 21, 75, -91, 1, 
+    -4, -23, -42, 57, -33, -18, 30, -62, -20, 80, 26, -61, 57, -90, 22, -12, 
+    -78, 22, -19, 22, -77, 39, -1, -73, -90, -33, 0, 43, -81, 40, -9, 93, 3, 
+    61, -76, -75, -11, -15, 81, -61, -35, -84, -25, -90, -100, 39, -49, 13, 
+    37, 37, -5, 65, -62, -11, 55, 28, -95, 84, 57, -98, -77, -61, 43, 57, 80, 
+    -34, -72, -92, -41, -84, -77, 41, 8, -58, -68, 83, -77, -28, -74, 92, 
+    -39, -94, -17, -54, 25, -1, -41, 69, -30, 24, 60, -97, -28, -82, -83, 98, 
+    -83, -86, -99, -30, -18, -86, -35, -21, -49, -21, -98, -80, -94, 12, 59, 
+    -71, 55, -54, -97, 0, -35, 7, -66, 18, -36, -86, 3, 43, -87, -71, 39, 92, 
+    80, -5, 32, -85, -53, -81, -72, -96, 79, -42, 45, 95, -39, -82, -67, -66, 
+    -64, -23, 11, 92, 94, 87, 33, -42, -61, 79, -54, 15, -69, -47, -53, -40, 
+    78, -97, -48, -12, -49, -75, 1, 99, 28, -26, 20, -64, 44, -84, 7, 13, 29, 
+    40, 26, 5, -77, 0, 30, -47, 52, 33, -67, 57, -93, 64, -2, -91, 99, -62, 
+    45, -94, 81, -9, -11, -35,
+  98, -9, -78, -20, 25, -20, 94, -5, 85, -65, 10, 46, 97, 12, -12, -90, 67, 
+    49, 39, -44, 73, 20, -58, -34, 30, -75, 2, -98, 24, -56, -38, -28, -38, 
+    -26, 75, -56, 37, 36, 7, 32, 36, 18, 92, -84, -67, 27, -99, -38, 61, -16, 
+    -77, 65, -80, -75, -23, 15, -13, -73, -70, 70, 2, -98, 24, 23, 34, 7, 29, 
+    27, 13, 92, 61, 73, -79, -7, -23, -79, -15, -18, 71, -24, 96, 86, -25, 
+    94, -51, 95, -84, -54, -12, 52, -10, 44, 32, -86, -8, -29, -100, -72, 
+    -100, -71, -20, -56, -9, 76, -98, 63, -7, -56, 55, -6, 51, -88, -100, 87, 
+    -89, 64, -96, 85, -18, 86, 0, -97, -1, 85, 48, -17, 60, -9, -62, 47, -22, 
+    42, -10, 27, -62, 98, -78, 32, 26, -14, -8, 53, 84, -19, -85, -46, 31, 
+    29, 84, 69, -7, -98, 61, 54, -16, 15, 22, 29, 71, 65, 96, -44, -90, 51, 
+    -14, 78, 61, -94, -22, -88, -81, -15, 80, 6, 9, -29, 60, 94, -13, 79, 7, 
+    -54, -24, -71, 33, 45, -73, 75, -91, -87, 7, 23, 54, 31, -62, 57, -9, 87, 
+    -7, -51, 98, 4, 32, 79, -25, 39, 63, -100, -93, -54, -90, 17, 19, 33, 
+    -53, -46, 50, 57, -53, -20, -43, -30, -15, -10, -64, 20, -35, 37, 7, 71, 
+    86, -85, 34, 70, 19, 85, 57, 34, -34, -69, 30, -88, 51, 30, 52, 88, -94, 
+    14, -25, -42, 86, 21, -74, 56, 98, -68, 14, -80, -88, 45, 79, 83, -30, 
+    -87, 27, 10, 96, -25, -19, -18, -67, 62, -98, -60, -73, 26, 41, 8, 50, 
+    -81, -49, -89, 26, 33, 70, 16, 21, -27, -36, -76, -99, 41, -72, 41, 13, 
+    -3, -53, 37, -71, 68, -37, -99, -79, 69, 54, -13, -36, -80, -23, 69, 49, 
+    -46, 44, 19, 94, 85, -94, 8, -95, 7, 87, 54, 96, 36, -4, 17, -7, -87, 88, 
+    4, -34, 33, 48,
+  -41, 96, -88, -48, -23, 36, 12, 91, 15, -16, 22, -18, 17, -23, 30, -73, 
+    -42, -94, -20, -33, -33, 89, -45, -26, 29, 7, -64, 43, -36, -59, -38, 
+    -47, 11, 35, -34, 48, 30, 54, 52, 8, 36, -89, -43, -35, 24, -28, 74, 49, 
+    -70, -71, 8, 82, -26, -95, 68, 9, -60, 63, 20, 98, -55, -76, -9, 85, -72, 
+    72, -96, 11, -14, 54, 61, -7, 31, -5, 54, 88, -86, 15, -62, 95, 12, 56, 
+    -48, 25, -71, -14, -51, -4, -40, 2, 88, 90, 90, -47, -21, -1, -71, -9, 
+    34, 91, -22, 65, -19, -92, 37, 50, 42, -22, -52, 49, 61, -8, 22, 17, -56, 
+    31, 20, 29, 6, 69, -13, 80, -26, 78, 75, 20, 69, -19, 66, 41, -8, -21, 
+    34, -30, 46, 56, -96, -1, -71, -80, -67, 51, -25, -45, 81, 47, 31, -62, 
+    88, 27, -86, 56, 83, -97, -14, 65, 94, -82, 23, 20, -26, -83, -89, 68, 
+    66, 35, 7, -24, -71, 13, 37, 18, 6, -59, 61, -90, 30, -94, -88, 40, 91, 
+    -77, 89, -88, -69, -40, -8, -91, -69, 86, 41, 27, -25, 44, 25, 56, -97, 
+    -81, 0, -62, -58, 70, 10, -7, -49, 2, -69, 17, -91, -95, 54, -72, -80, 
+    21, 9, -20, -13, 3, -39, 28, 24, 91, -26, 20, -100, 73, -57, 50, 88, -10, 
+    -13, 99, 41, 81, 73, -37, 92, -2, -11, -75, 2, 99, 42, -6, 66, 29, 49, 
+    -25, 45, 65, 79, 17, -13, -16, -4, 24, 50, -33, -36, 24, 68, -14, -38, 6, 
+    -56, 53, 42, -99, -38, 25, -95, -71, 81, 96, -12, -69, 10, -85, -86, -19, 
+    -76, 75, -69, -86, -90, -98, 53, -79, 97, 19, -53, -44, -70, 35, -76, -2, 
+    76, 0, -71, 33, 66, 86, 77, 93, 41, 58, -9, -24, -28, -4, -87, 10, -42, 
+    15, 36, 43, -37, -10, -1, 38, -43, -87, 33, -23, 99, -56, 59, 26, 24, 67, 
+    49, 79, 81,
+  92, -97, 27, 62, 52, -89, 51, 25, -60, 75, -3, 71, 30, -89, 55, -34, 29, 
+    68, -50, 80, 30, -46, -81, -46, 70, 32, 14, 47, -23, -51, -97, -77, -11, 
+    15, -15, -48, -87, -13, 83, 71, -76, -58, 15, 16, -81, 35, -6, 39, 60, 
+    -90, -5, -63, 67, -72, 92, -26, -49, -12, -97, -80, 58, -18, -62, -13, 
+    -41, -55, -48, 96, -80, -10, 11, 52, 81, 19, 32, 51, -83, 62, -21, -89, 
+    14, -73, 46, 46, 25, 41, -40, -44, -62, 87, 67, 51, -58, -18, 55, -33, 
+    -48, 89, 82, -52, -81, -36, 99, 55, 62, -45, -73, -47, 98, -79, 32, -2, 
+    62, -65, -95, 55, 25, -58, -18, 38, 89, 33, 39, 88, -10, 86, 4, -2, 55, 
+    90, -87, -22, -17, -15, 24, 99, -63, -88, -36, 96, 89, -83, -34, -75, 82, 
+    -80, -7, 75, -82, 73, -9, 12, 49, 32, 14, 13, 76, -10, -1, 68, -77, 96, 
+    -63, 25, -82, -35, 17, 5, -86, 18, 62, 83, 34, -85, -51, -75, -82, -24, 
+    -27, -64, -74, 18, -88, -100, 81, 48, -30, -5, 33, 40, 48, 95, 0, 13, 4, 
+    -16, -40, -31, 56, 57, 55, -91, -25, 80, 76, -34, -64, -67, -77, -60, 71, 
+    0, 59, -37, -9, -15, 35, 92, -45, 2, 74, 70, -42, -58, -87, 88, 57, 48, 
+    14, 29, -94, -92, 43, 25, 29, -97, 40, 63, -75, -81, 51, 0, 17, 15, 24, 
+    -95, -14, 68, 9, 64, -28, 27, -19, -23, -43, 99, -77, -92, 77, 65, 35, 
+    -55, 33, 31, 26, -92, -36, -97, -62, -49, 16, -94, -41, -42, -21, -62, 
+    94, 27, 43, 52, 2, 45, 90, -97, 85, -80, 18, 59, 92, 47, 26, -51, -93, 
+    55, 16, -29, 18, -56, -7, -95, -79, -72, 47, -11, 81, -96, -49, -42, -23, 
+    -9, -75, -13, 35, 30, 40, -95, 58, 11, 43, -17, 83, -92, -42, 83, 71, 
+    -45, -85, -41, 49, -10, 64, 13, -2,
+  -57, -38, 70, -39, 23, 92, 57, 61, -70, -98, 82, 98, 12, 58, -31, 8, -26, 
+    7, 51, 71, 29, -8, -10, 63, 74, 31, -95, 25, 9, -64, -40, -62, 62, -55, 
+    22, -21, -40, 53, -54, -34, -36, -91, 58, -69, -96, 25, 91, 6, -58, -80, 
+    -66, 39, 25, -38, -76, 79, -16, 26, -34, -1, -96, 49, 54, -57, -13, -40, 
+    -70, 37, -20, -64, -95, 68, 9, -18, -25, 58, -44, -27, -43, -19, 76, -71, 
+    62, -77, 69, 60, 93, -61, -28, 82, 90, 16, -43, -67, 24, -16, 11, -89, 
+    11, 84, -38, 91, 20, 76, -15, -1, 56, -19, 21, 18, 60, 40, 92, -89, 55, 
+    -62, -88, 45, 37, -41, 56, 13, 65, 33, -47, -56, -51, -35, 66, -88, 92, 
+    35, -18, 17, 75, 61, 98, 66, -83, -53, 98, -45, -69, 66, 44, 87, 80, -50, 
+    96, -3, 69, 94, 92, -13, -30, -82, -70, -88, -23, -66, 81, 70, -91, -43, 
+    -51, -6, -66, -26, -81, -64, 79, 63, 38, -19, 48, 25, 72, -50, -52, 44, 
+    -64, 53, -79, -2, 68, 94, 67, -5, 52, 20, 58, -69, 79, -34, 44, -79, -36, 
+    -24, -55, -96, 78, 56, -78, -62, 56, -67, 90, 13, -20, 15, -63, 38, -74, 
+    -15, 64, 8, -20, -19, 5, -89, -10, -31, -65, 40, 2, 87, -52, 26, -19, 
+    -31, 81, -99, 51, 41, -23, -87, 59, -89, -30, 33, -92, 98, -49, 92, 47, 
+    90, 44, 95, -20, -37, 27, -34, -70, 0, -83, 75, 13, 90, 60, -15, -100, 
+    40, 47, 60, 73, 69, 84, 8, -43, 49, 49, 64, -18, -11, -43, 50, -88, -16, 
+    -71, -23, 69, -22, -55, 70, -42, 6, -77, -80, 47, 84, -88, -51, -42, 97, 
+    11, 55, 9, 35, -59, -31, 47, 7, -69, -88, 10, -94, 64, -66, -28, -49, 55, 
+    27, 57, 33, -39, -21, 17, 22, 73, 18, 42, 87, 52, -74, -14, -81, 65, 21, 
+    -15, -100, 62, 44, -69,
+  22, -59, 8, -46, 24, 10, -71, -64, -63, -1, 94, -82, 14, 10, -17, 25, -60, 
+    45, 58, 31, 67, -54, -81, -73, -44, 43, 59, 9, 85, -89, -7, -88, 23, 65, 
+    -75, -97, -40, -76, 38, 89, 8, 46, -46, -35, -78, -94, 31, -18, 86, 20, 
+    -99, 31, 10, -15, -78, -63, 92, -15, -71, 35, -79, -30, 94, 12, 99, -89, 
+    -79, 40, 90, -89, -75, 31, 92, -16, 49, -70, -30, 9, 75, -7, 17, -46, 
+    -59, -96, 3, -55, 48, 16, 85, 72, 68, -21, -84, -14, 31, 43, -30, 39, 
+    -82, -36, 95, -17, -46, 29, 89, -99, 18, -52, 40, 61, -9, -36, -27, 0, 
+    15, 93, 75, 20, -35, 49, -25, -37, 11, 74, 11, 18, -46, 46, 17, 98, 91, 
+    70, -32, -41, -96, -56, 13, 5, -16, 24, 50, -76, -60, 75, 85, -78, -62, 
+    98, 39, 13, 7, 72, -54, 27, 30, -92, -98, 82, 57, 25, 86, -14, 12, -56, 
+    -10, -30, -53, -38, 25, -49, 35, 46, 97, 19, 45, -30, -80, -72, -82, -40, 
+    31, -48, 39, -31, -100, -47, -94, 74, -8, -49, -39, -7, -78, -44, -71, 
+    -10, 35, -92, 33, -84, -81, -62, -65, -79, -39, 67, 62, -4, 96, 94, -64, 
+    -54, -100, -49, 15, 1, -13, -96, -38, -83, -15, 76, 61, 54, 10, 98, -31, 
+    31, -64, -74, -72, 75, -100, 20, -41, -33, 62, 67, 0, -30, -22, 35, 65, 
+    -95, 81, 56, -68, -96, -77, 43, 88, -4, 46, 26, -23, -7, -21, -16, -22, 
+    -46, 91, 33, -88, 31, -37, 92, -14, 3, 80, 34, -86, -12, -92, 73, -18, 
+    -4, -89, 18, 97, 3, 21, 3, -63, -11, 0, 63, -73, 70, -18, 78, 33, 26, 63, 
+    -23, -37, 82, -52, -53, 60, -59, -17, -22, -14, 44, -86, 10, -96, -98, 
+    64, 66, 16, -58, -96, -93, 89, 29, 71, -52, -36, -74, 25, -15, -16, -93, 
+    -24, -97, -94, -100, 58, -38, 46, -60, -47,
+  32, -18, 80, -98, 32, 43, 56, -32, 33, 10, -25, -28, -46, 34, 87, 76, -31, 
+    -51, -94, 65, 84, -94, -19, -64, 41, 27, 68, -83, 20, 10, 30, 12, -55, 
+    98, 52, -74, 56, -90, 23, -52, -14, 37, 65, 49, -89, -56, 2, -50, 51, 
+    -55, -41, 84, 9, -88, 2, -43, 48, 80, -47, 9, 42, -83, -89, 40, -92, 54, 
+    -16, 57, -10, -67, 42, -48, 12, -90, -46, 9, 62, 42, -41, -83, 92, 60, 
+    -46, -81, 78, -32, -86, 28, -55, -84, 81, -27, -91, -38, -31, 90, -33, 
+    59, -45, -28, 37, -57, 75, 30, 85, -15, 25, 74, 74, -68, 55, 42, -51, 74, 
+    95, -42, -25, 90, 9, 99, 40, -62, -50, -10, 97, -52, -70, -48, -55, -79, 
+    19, 39, -53, -64, 35, 8, 36, 34, 40, 59, -85, 68, -7, 74, 97, 17, -73, 
+    50, -37, -7, -75, -67, 81, 70, 29, 28, 95, 69, 16, 18, 5, 55, -37, -46, 
+    -21, 61, 25, 62, 77, 49, 72, 62, -2, -15, -50, -77, -17, 24, -60, 50, 
+    -13, 23, 83, 4, 74, -56, 96, -1, -72, -66, -73, 85, -58, -83, -24, -80, 
+    -17, -66, 32, -82, 15, -46, 40, 62, 48, -57, 80, -46, -2, 47, -42, -98, 
+    14, -17, -42, 22, -83, -6, -35, 95, -68, 19, 43, -21, -100, -29, 17, -12, 
+    48, 97, 7, 3, 29, 70, 7, -62, -33, -79, 80, 79, -41, -87, 48, 12, 7, -22, 
+    8, -29, -11, 87, -56, 75, -98, 79, -17, -10, -10, -71, 79, 50, -57, -13, 
+    68, 78, 61, -28, -31, -62, 7, 65, -96, -78, -64, 27, 21, 27, 19, 15, -73, 
+    80, 2, 22, -38, -90, -74, -57, -7, 40, -94, -65, -82, -6, -46, -8, 74, 
+    94, -27, -84, -23, -10, 91, -85, 82, -33, 51, 54, -61, 19, 31, -61, 47, 
+    -20, 44, 33, -89, -40, -53, 86, -2, -86, -53, 78, 22, -97, -85, -8, 94, 
+    -38, -41, 32, 34, -20, 78,
+  -85, -22, 61, 79, -25, -15, -83, -46, -1, -53, 22, -62, -66, -66, 98, 26, 
+    83, 56, -92, -91, -39, -19, 21, 87, 58, -43, -97, -33, -49, -92, 72, 11, 
+    61, -5, 77, 62, 24, -1, -57, 57, -45, 85, -77, 45, -52, 56, 44, -82, -81, 
+    -73, 6, 94, -35, 56, -49, -64, 45, 69, 53, 40, 36, -31, 26, -84, 68, 10, 
+    27, 15, 56, -14, 54, -94, 57, -74, 98, -71, 62, 5, 50, 66, -48, -2, 50, 
+    79, 31, -2, -18, -80, 18, 19, 51, -61, -25, -39, -5, -29, -7, -92, -11, 
+    -76, -62, -70, 15, -93, 7, 7, 62, -58, 67, -10, -26, -52, -66, 64, 83, 
+    35, -16, 37, -16, -95, 4, -26, 14, -16, -81, 40, 81, 47, -76, -70, 34, 
+    79, -12, 50, -71, 65, 35, 27, -86, 91, -79, -8, 88, 41, 54, 5, 30, -42, 
+    89, 50, 65, -57, -49, 20, -26, 8, -61, -69, -27, -38, 16, -98, 79, 66, 
+    12, 94, -94, 67, 10, 53, -44, -37, -80, -90, -94, 16, 72, 38, -68, 92, 
+    95, -78, -52, 15, -85, 27, -58, -98, -51, -36, 18, -33, -76, 98, -94, 
+    -30, -63, 9, 9, -6, 83, -69, -66, -45, 10, 86, -39, -38, 70, -61, 62, 
+    -82, -23, 86, -16, 75, 50, -1, 52, -87, 62, -95, -56, 36, -42, -43, 77, 
+    44, -65, 95, 28, -63, 98, -88, -46, 89, 59, 90, -61, 13, 14, 27, 87, 46, 
+    -5, 15, -25, 84, 0, 1, -29, -64, 42, -74, 81, 13, -65, -55, 53, -90, 40, 
+    50, -48, 68, -63, 65, 25, 5, 84, -32, -68, 29, -65, 95, 69, 30, -23, -50, 
+    23, -2, 28, -6, -56, 10, -26, -79, 25, 3, -40, 42, -66, -25, -28, -41, 
+    47, -30, 53, 99, 61, -57, -23, -6, 32, 24, 76, 17, -5, -99, 45, 64, 56, 
+    84, 23, -47, -54, 3, -41, -53, 78, 34, -38, -19, -14, 64, -1, -20, 23, 
+    -37, 43, 41, 11, -99, 94,
+  -12, 37, -100, 28, -69, 28, -80, -93, 65, -52, 77, 46, -82, 56, -76, -15, 
+    -60, -14, 92, -41, 48, -47, -52, 31, 35, -24, 21, -33, 57, -27, 66, 54, 
+    38, 37, 12, -96, 37, 90, -19, 73, -18, 61, -98, -45, 12, 63, -94, 83, 
+    -73, 59, -32, -53, -15, -76, -91, 21, -81, -45, 33, 32, -74, -83, 59, 90, 
+    54, 15, 39, 93, 40, 10, -33, -13, 63, 94, -24, -29, 75, 58, -64, 58, 68, 
+    -40, 22, 89, 50, 75, -2, 66, -96, -96, -78, 9, 65, 4, 84, -4, -10, -32, 
+    -6, -38, -20, 91, 26, 32, 80, 74, -90, 48, 59, -74, 63, -99, 64, -73, 
+    -17, -88, 33, 56, -91, 71, -96, -97, -20, -31, 0, -78, 86, 36, -90, -42, 
+    -2, -9, -89, 25, -89, -68, -10, 60, 84, -48, 12, 56, -14, -21, -69, 48, 
+    4, -42, -12, -66, 69, -53, 76, 18, 67, -4, -7, -55, -77, 6, 98, 4, 9, 18, 
+    -27, -21, -97, 56, 64, -73, -79, -72, 49, 9, -15, 88, 44, -44, 29, -37, 
+    64, 61, 36, 46, -87, 10, 18, 72, -25, -68, 61, 66, -86, 41, -20, -26, 
+    -13, -24, 25, -54, 49, -98, -97, -87, -49, 97, 96, -58, 36, -76, 16, -44, 
+    -98, 29, -61, 5, 6, 19, -76, -25, -30, 19, -5, 43, 98, -8, 46, 98, -53, 
+    -52, 96, -65, 15, 37, -84, 12, 1, -95, 55, -82, -100, -86, 27, 79, 30, 
+    -20, -32, -37, -70, 26, 74, -79, 70, -63, 62, -65, 52, 18, -41, -73, -8, 
+    -96, -7, -52, -96, -46, 98, 38, -28, -26, -81, 54, -15, -69, 34, -32, 23, 
+    -3, -100, -48, 32, 97, -86, 4, -3, 68, 43, -51, -44, -70, 5, 40, 59, 62, 
+    -80, 21, 49, -34, -91, -75, 55, -7, 62, 43, 13, 43, 23, -31, 45, 43, 14, 
+    54, 70, -35, -85, 71, -42, 73, 21, 85, -66, 33, 81, 90, -24, -71, 28, -1, 
+    -7, 2, -43, 37, -29,
+  31, 81, 97, 7, -97, 23, -41, -50, -77, 22, 86, 15, 93, 96, -87, -33, -6, 0, 
+    18, 9, 51, -77, -48, 19, -53, 8, -32, 2, -77, -69, 8, -9, 1, 97, 21, 88, 
+    30, 47, 24, -28, -70, 63, -93, 43, -88, 55, 69, 95, -18, -17, 88, 75, -1, 
+    81, -4, -13, -55, 24, 27, 13, -79, -69, -92, -66, -18, 87, 80, -33, 97, 
+    -68, 45, 75, -74, -32, -62, -3, -18, 72, 55, -91, -81, 28, 82, -24, 60, 
+    34, -57, 70, -4, 70, 8, -25, -1, 75, 96, 96, 36, 74, 79, 40, 35, -68, 
+    -81, -49, 81, 57, -83, 19, -100, 77, 2, 47, 84, -29, -91, -90, 47, -10, 
+    71, -8, -65, -84, -38, 24, 2, 52, -92, 37, 16, 37, 13, -41, -26, -77, 58, 
+    -32, 75, 89, -12, -17, 41, 92, 1, 36, -25, 53, -7, 69, -57, 19, -89, -77, 
+    -9, -2, -83, 71, -49, -47, -60, -77, 30, 75, 57, -51, -24, 11, -54, -32, 
+    16, -39, -40, -28, 35, 6, -10, -38, -19, -55, -43, -50, 56, 43, 78, 38, 
+    10, -15, -38, 26, 51, -32, -86, 83, -18, 87, 83, 62, -15, 60, -70, -98, 
+    -44, -81, -53, -30, -8, -55, 81, -43, 32, 15, -86, 26, 54, 53, -66, -31, 
+    26, -91, -23, 9, 2, 38, 69, 28, -40, 83, 68, -91, -35, -7, -22, -38, 44, 
+    -82, -13, 41, 61, 47, 58, -26, -81, -78, -41, -98, -13, 35, 12, -94, -14, 
+    -45, 33, -31, -67, -21, -94, 73, 12, -59, -47, -5, -94, -75, 64, 56, -8, 
+    28, 21, 93, 57, 92, 37, 77, 50, 95, 58, -25, -61, -39, -45, 88, -42, -37, 
+    78, 31, 51, -64, -59, 95, -70, -91, -12, 46, -31, -12, 12, -43, -14, 46, 
+    12, 2, 63, 7, 38, 21, -12, -11, -65, -96, 26, 37, -13, -66, -14, 69, -3, 
+    -68, 75, 77, -77, 99, 49, -21, -26, -46, 92, -77, 45, -95, 29, -6, 51, 
+    -17, -52,
+  11, 94, -31, -64, -39, -33, 45, -48, -22, -6, -94, -27, 96, 48, -7, 55, 11, 
+    -37, -82, -66, -24, -17, 74, -53, 53, -7, -30, 15, 16, -16, -25, 96, 4, 
+    -3, 57, -9, -6, -3, 32, 88, -62, -7, 29, 57, 9, -90, -42, 68, 87, -73, 
+    56, 14, -73, -73, -45, 45, 61, 89, -70, 55, 80, 1, -7, -78, -28, 7, 83, 
+    -63, 34, 12, -10, 51, -79, -75, -31, -92, 81, 18, 28, -86, 61, -19, 62, 
+    -74, 43, 95, 99, 60, 68, 85, 48, -93, 48, -79, 13, -27, 57, 24, -77, -83, 
+    22, -84, 35, -11, -59, 63, 7, -27, -31, 69, 19, -4, 86, 52, -62, 3, 29, 
+    -75, -42, -85, -95, -48, -9, 86, 40, -59, -52, 19, -67, -18, -77, 0, 99, 
+    62, 16, 54, 38, -64, -93, -72, 1, 87, 99, 5, -99, 24, 77, 29, -64, -53, 
+    83, 72, -29, -78, -4, 60, -42, 99, -25, 50, -27, -43, 83, -97, -94, 27, 
+    52, -69, 43, 67, -73, -78, -98, 30, 35, 85, 27, 89, -29, -95, -47, -32, 
+    -26, -59, -15, -60, -58, 90, 93, -39, 83, -64, 12, 28, 99, -62, 97, -45, 
+    -80, 89, 55, 59, 99, -74, -64, -4, -4, -1, -39, 80, 23, 18, -25, 66, -10, 
+    -59, 56, -5, 48, 28, -11, 47, 76, 51, 71, 84, -51, -52, 44, 16, 96, -80, 
+    87, 66, -84, -64, -41, -43, -87, -16, 12, 53, 91, 89, -98, 92, 70, 19, 
+    -7, 38, -93, -68, 39, 42, -44, 92, 87, 91, -3, 85, -95, -88, -55, -19, 0, 
+    26, 8, 86, 73, 31, 97, -31, 91, 80, -85, -63, -71, -78, -26, 69, -20, 
+    -92, 39, -8, 50, 60, -38, -46, 83, -62, -76, 31, 16, 38, 69, -27, -16, 
+    68, 58, -80, -77, -46, 91, -13, 10, 94, 87, -89, 4, -8, 84, -60, -97, 
+    -48, -5, -59, -65, 79, -39, 66, 95, -13, 92, -1, -60, -36, 20, 33, 21, 
+    -89, -54, -90, 25,
+  78, -72, 46, -58, -70, 39, -89, 16, 1, -50, -77, -66, 27, -73, 30, 85, 87, 
+    52, -27, -2, 85, -21, -23, -3, 91, 4, -42, 63, -3, -14, 48, -10, -43, 81, 
+    77, 95, 43, 32, -37, 75, -31, 40, -44, 31, 81, 70, -28, 53, 98, 66, -10, 
+    24, -15, 6, -64, -51, -3, -31, 67, -13, -51, 95, 23, 7, 83, -54, 37, -61, 
+    -48, -52, -11, 24, 65, 83, 86, 2, 82, -50, 62, 11, -43, -55, 33, 34, -6, 
+    0, 88, 17, 68, 89, 39, -95, -74, -66, 13, 8, -23, 92, 53, 72, 10, -49, 
+    59, -80, -48, -11, 36, 44, -41, -81, 11, 42, -30, -76, -86, -14, 75, -9, 
+    46, -90, 13, 28, 23, 40, 42, -17, 42, -61, 5, -59, -68, -31, -69, -99, 
+    -78, 42, 67, 13, 51, -15, 26, 41, 21, 12, 61, -39, 60, 52, 90, -66, 28, 
+    -97, 38, -73, 74, -5, -33, 18, 93, -79, -42, 44, -8, -59, -55, 59, -67, 
+    -41, -91, -86, -71, -98, -86, -32, -62, 72, -47, 84, 11, -98, 46, -57, 
+    32, -21, -2, 84, -2, -95, -87, -81, -37, -37, 52, -95, 24, -41, 29, -97, 
+    78, 57, 2, 87, -87, 35, -45, 44, 68, -20, -30, -66, 70, -59, -22, -84, 
+    -32, 30, 7, 89, -93, -8, 87, 83, -3, 54, -63, 29, -84, -31, -46, -63, 
+    -19, -48, 26, 58, -16, 58, 91, -99, -58, 91, -12, -80, 58, 14, -87, 93, 
+    -56, -28, -2, -58, 51, -44, -16, -79, -40, 9, 43, 38, -41, -60, -48, 12, 
+    -92, 0, 90, -49, -87, -52, -77, 10, -24, 41, -91, -46, -77, -47, -21, 59, 
+    -49, 59, -14, -8, 27, 79, -2, -96, 57, -86, 11, -84, -45, -56, 27, -16, 
+    -21, -42, 47, 25, 44, 87, 22, 53, -95, 78, 78, -72, 16, 55, 84, -22, 92, 
+    58, 18, 71, 76, -40, 10, -77, 28, -31, -48, -37, 71, 92, 76, -97, 97, 
+    -100, 76, -54, -89, -13, 77,
+  64, 76, -57, -18, -5, -57, 94, 55, -38, 30, 96, 21, 91, -73, 16, -2, -33, 
+    -63, -22, -84, -28, 15, -16, 44, -40, -8, 47, 40, -16, -75, 29, 55, 31, 
+    -66, 96, 61, 8, 29, -34, -59, -15, 69, 87, -13, 35, 72, 84, -20, -69, 
+    -31, 43, 87, -52, 6, -75, -22, 26, -47, -45, 78, -53, -4, 67, 89, -81, 
+    -40, 38, -49, 13, -6, 70, 11, -23, -78, -4, -60, 74, 30, 17, -41, -95, 
+    -80, 10, -72, 53, 76, -66, -64, -86, 97, -92, -73, 3, -69, -23, 68, -72, 
+    -46, -54, 96, 86, 60, -30, 87, 16, -20, -82, 89, -30, -51, 55, -58, 46, 
+    -1, 57, -100, -11, -91, -29, -57, -23, -55, -66, 97, 51, -50, -95, -66, 
+    -9, -23, -93, 13, 77, -12, -57, 23, -100, -25, -60, -98, -49, 53, -14, 
+    47, 95, 44, 59, -49, -28, -16, 43, 46, -70, -34, -99, -86, -18, -51, 4, 
+    46, 64, 7, -100, -66, -17, -78, 76, -98, -76, -31, 4, -54, -79, 97, 56, 
+    -28, 87, -98, -88, 16, 15, 30, 8, -51, -91, 4, -7, -43, 63, -83, 44, -97, 
+    21, 72, -72, -99, -20, 67, -15, -71, -98, -24, -35, -1, 58, 20, -48, -46, 
+    -49, 8, 68, 76, -100, 95, -7, 84, -34, -7, -82, 43, 18, 82, -67, -91, 76, 
+    -64, 61, 89, -62, 16, -71, 24, 54, 46, -44, 96, -83, -34, 5, 65, -65, 74, 
+    -17, -31, 24, 5, -95, -65, -74, -48, 32, -90, 45, 81, -18, -47, -91, 74, 
+    68, -78, 92, -12, -87, -82, -94, -70, 58, -98, -22, -35, 71, 48, -43, 
+    -55, 91, -72, -80, 41, -35, 65, 22, -29, -51, -98, -45, -21, -7, -67, -2, 
+    5, 27, 5, -86, 14, -59, -17, 61, -16, -71, 82, -96, 52, -43, -3, -87, 86, 
+    31, 3, -40, 53, -66, -88, 68, 18, 37, 38, -36, 66, 57, 94, 21, -83, 52, 
+    -35, 1, 75, 73, 49, 74, 82, 52, 90, -59,
+  22, -23, 89, -11, -35, 59, -17, 71, -88, -27, 74, 38, 99, -74, 63, -39, 93, 
+    87, -32, -81, 48, -68, 88, -86, -25, 41, 47, 73, -50, 98, -31, 60, 53, 
+    84, -72, -46, -42, 74, -45, 60, -15, 63, -40, -42, 53, 54, -12, -22, 38, 
+    -26, 90, 27, -55, -9, 43, -45, 51, 25, -32, -2, 41, -56, -16, -32, 36, 
+    -32, -99, 29, -12, -57, 64, 34, -35, -66, 80, 49, 43, 62, -25, -50, 21, 
+    42, 71, -39, -84, 80, -13, -74, -97, -6, -14, -11, -84, 92, 37, -79, 7, 
+    -21, 47, -61, -92, -68, -46, 60, -16, 3, 25, 24, -55, -62, -18, 72, -17, 
+    -69, -3, -60, -82, -9, -24, -15, -44, -88, 19, -55, -23, -98, 18, -81, 
+    -35, 68, -97, 71, -34, 23, -48, -48, 27, -23, 70, -72, 89, -17, 94, -79, 
+    -27, -22, 51, 1, 54, -66, -87, 3, 20, 73, 97, 17, 19, 64, -47, -13, -55, 
+    -96, 46, -67, 49, -7, -77, -14, -83, 37, 70, 41, 32, -77, 41, -34, 38, 
+    34, -9, -22, -93, -67, 49, -40, -94, 44, -37, -33, 18, -89, -91, 50, 54, 
+    -30, -85, -59, -44, 13, 21, 44, 43, 30, 9, -74, -18, 40, 11, -41, -71, 
+    52, 56, 0, -71, -93, -50, -54, -49, 53, 58, -67, -83, 49, -21, 98, 14, 
+    -34, -13, -58, -39, -71, 22, -77, 88, 91, -91, 97, -13, 36, 34, -9, -36, 
+    81, 18, 24, 19, 36, 1, -24, -44, -70, 68, -87, -53, 8, -41, -1, 6, -67, 
+    89, -40, -27, 23, -68, -65, -39, -26, 5, 56, 59, 61, 12, 75, -73, -44, 
+    94, -76, 13, 63, -91, 94, 34, -16, -88, -3, -63, -23, -94, 28, 33, -27, 
+    -57, 8, 61, -16, 45, -53, -100, -76, 38, -58, 98, -23, 0, -10, -61, -36, 
+    63, -29, -51, 31, 78, -77, 6, 94, 30, 50, 90, 14, -38, 42, 66, 96, -47, 
+    11, 31, 1, 84, -17, -90, 18, 76, 87, 42,
+  72, -82, 40, 88, 46, 53, 83, 97, -92, 39, -47, -34, 43, -86, -10, 89, -1, 
+    98, -12, -19, -31, -36, 91, 3, -6, -58, -18, -96, 5, -34, 7, -87, -27, 
+    -5, 70, 0, 71, -63, -68, -4, -51, 56, 78, 62, 79, 31, 96, 89, 99, -94, 
+    88, 21, 59, 1, -95, 57, 48, 21, 56, -43, -42, -92, 30, -68, -53, -4, -87, 
+    -15, -38, -99, -22, -49, 0, -50, -40, 2, 92, -16, -81, 83, 46, -66, -35, 
+    -11, -69, 96, -75, 24, 44, 37, -79, 54, 30, -24, 12, -30, -65, 70, -50, 
+    54, -1, -60, 73, -64, 3, 68, -50, -5, -81, 52, -18, -91, -91, 68, 47, 
+    -93, 16, -22, -81, 16, 12, 81, -85, 40, -1, 99, 58, -90, 81, 63, 45, 6, 
+    -2, -99, -30, 55, -76, 35, -30, -97, 98, 13, 44, 32, 53, -3, -85, -20, 
+    -95, 92, -19, 26, 81, -25, 54, -86, 62, 14, 91, -44, -4, -69, -76, 71, 
+    92, 25, 55, -35, 70, -100, -13, -47, -7, -16, 46, -28, -64, -37, -61, 21, 
+    -21, 54, -86, 14, 13, 0, -85, 65, 53, 55, 35, 54, -72, -91, 37, 10, 94, 
+    19, -50, -19, -7, 64, -96, -88, -56, 44, -87, 1, 28, 37, 58, 99, 33, 9, 
+    70, -87, -81, 89, 46, -47, 22, 44, 13, 80, -44, -44, -70, 83, 97, 20, 81, 
+    -79, -59, 62, -38, -69, 13, -21, 4, 64, -95, -6, 63, -94, 27, 68, 49, 
+    -11, -92, -76, -43, 59, -37, -62, -7, 48, -20, -51, 42, 4, 14, 95, -12, 
+    3, 27, 87, -76, 82, 60, -63, 92, -29, 88, 60, 60, 70, 30, 94, -12, 88, 
+    -16, -30, -82, -48, 75, 74, -48, -76, -80, -33, -1, -12, -15, -45, -59, 
+    66, -38, -100, 73, -39, 89, -45, 41, 71, 39, -17, -26, 90, 42, 12, 82, 
+    -97, -68, -6, -59, -30, 65, -19, 68, 28, -33, 91, 45, 21, -32, -96, 80, 
+    -25, 22, -94, 57, 64, 64,
+  30, 52, -7, -47, 20, 16, 28, -17, -83, 32, -15, 7, -52, -86, -99, 11, 52, 
+    -52, -16, 72, -4, 7, -25, -80, -100, 87, -56, 84, 97, 92, -33, -4, 26, 
+    -35, -63, 19, 46, 79, 67, 36, 60, 26, -19, -50, 81, -96, -65, -56, -42, 
+    -84, -48, 90, -83, -58, 69, -32, 59, 96, 40, 95, -84, -78, -100, 61, -54, 
+    69, -67, -13, 60, 26, -49, -97, -27, 64, 33, 50, -16, 30, -24, -50, 94, 
+    -75, 90, -25, 55, 84, 86, 59, -69, -95, -63, 95, -81, -61, 5, 7, -93, 
+    -40, 74, -10, 36, -32, 82, -6, -67, 78, 6, -59, 36, -65, 49, 60, -61, 23, 
+    -64, -78, 47, -67, -45, -8, -80, 68, 27, -15, 90, -21, 15, -78, 56, -12, 
+    3, -41, 67, -38, -93, -30, 10, 39, -68, 51, -94, -19, -36, -72, 22, -93, 
+    -31, -62, 41, -12, -94, -32, -37, 15, 49, 51, 35, 20, -39, 8, -51, -34, 
+    91, 52, -21, -5, 96, -70, -39, 22, -19, -30, 64, 91, 77, 88, -88, -49, 
+    84, 72, 89, -91, -68, 25, -48, -19, 45, 53, 15, -90, 69, 21, 11, -3, -26, 
+    -71, 77, 44, 5, -72, 24, 23, 90, 65, 93, -62, -40, -85, -5, 30, 49, 36, 
+    61, 47, -99, -100, 40, -57, -83, -93, -98, 40, -57, 58, 79, 38, -4, 55, 
+    89, -22, 66, 63, 78, -92, -60, 2, -57, 23, -96, -35, -93, -43, -90, -80, 
+    -28, 75, -35, -20, 21, 95, 43, 84, -62, -58, 98, 29, -97, -26, 78, 41, 
+    -18, -100, -71, 42, -50, -55, -87, -40, 83, -58, -54, 6, -83, 57, -39, 
+    -72, -78, 12, -24, 15, -95, 55, -55, 18, 31, -57, 74, 96, -36, -81, -98, 
+    78, 48, -18, 72, -72, -97, -12, 34, -56, -98, 24, 98, -95, -19, -89, -38, 
+    81, -11, 44, -22, 34, 80, 36, -88, 50, 86, 95, 0, -44, 14, 83, 73, 29, 
+    -56, 58, 88, 9, 23, 39, -18, -91, -10,
+  -28, -24, 22, -57, 37, 75, 36, -4, -17, -18, 99, -11, -99, 91, 25, -99, 93, 
+    28, -18, 61, -62, -9, -49, 87, -62, 60, -85, 2, -91, 69, -22, -40, 17, 
+    -6, -54, -33, -38, 58, 81, -16, 23, -74, 2, 63, 35, 23, -54, 41, 49, -33, 
+    -6, 94, 44, 92, -57, -83, -34, 85, -73, 41, -24, 90, 5, 18, 61, -44, 52, 
+    87, 32, -72, -67, 31, 72, 1, -66, 5, 52, -48, 14, -91, -43, -14, 16, 58, 
+    -47, -97, -62, 63, -83, -54, 41, -54, 59, 60, -51, 23, 43, 83, -96, -40, 
+    28, -28, -31, 41, 50, 20, -20, -60, -51, -2, -75, -16, -6, -12, 6, -77, 
+    -28, -12, -98, 49, 86, -77, 88, -98, -96, 5, 30, -89, -79, -49, -19, 1, 
+    -43, -22, -6, -96, -74, -4, -61, -44, -18, 91, 38, -34, -44, -2, 6, -38, 
+    -7, 82, -62, 96, 23, -80, 49, -34, -18, -16, -90, 53, 20, 41, 47, -47, 
+    -93, 30, 1, -37, 34, 65, 41, 20, -6, -83, -2, 25, 45, 97, 61, 42, 52, 75, 
+    70, -70, -36, 69, -16, -10, -5, -1, -36, 62, -45, 87, -42, -44, -95, -60, 
+    -89, 60, 97, -93, -100, -43, 19, 47, 43, 19, 70, 52, -10, -9, 58, 19, 
+    -10, -1, -33, 95, 29, 41, -93, 41, 50, -48, -12, -5, -47, 77, -75, -18, 
+    -44, 58, -68, -77, 72, 66, -60, -52, -62, -6, 10, 51, 73, 55, 94, -90, 
+    40, -54, 58, 2, 22, 84, 58, 44, -57, -58, 65, -62, -21, 47, -95, 28, 64, 
+    -25, -18, -63, 84, -31, 96, -39, -5, 1, 0, 12, -37, 71, 96, -17, -59, 
+    -19, 53, 43, 34, 58, -10, -78, 53, 27, 49, 44, 42, 98, 59, -75, -11, 62, 
+    -22, -51, -39, 39, 9, -95, -49, 17, -25, 73, 28, -67, -43, -95, -24, -16, 
+    5, -53, -5, -96, -99, -54, -69, 60, 55, 56, -43, -28, 95, -47, -10, -68, 
+    -50, -85, -51, -88, -18,
+  -78, 92, 68, 75, 68, -72, 47, 38, -31, -35, 7, -34, -55, -95, -84, -99, 
+    -99, 72, 45, 66, 87, -98, -53, -33, 11, 60, -94, 3, 50, 57, -42, -1, -42, 
+    -54, 19, -49, 28, -24, -27, -91, -32, -58, -84, 10, 80, 81, 5, 56, 0, 27, 
+    34, -32, 23, -90, 29, -40, 75, -79, 71, -16, 20, 35, 5, -43, -34, -36, 
+    -45, 97, 90, 58, -13, 46, -24, -40, -27, -62, -73, -25, -61, -27, 89, 58, 
+    -23, 38, 59, -36, -65, -47, -76, -39, -66, 25, 82, 82, 79, 29, -13, -27, 
+    57, -7, -30, -21, 26, 85, -22, -84, -29, -87, 44, 72, -23, 16, -86, -89, 
+    97, -57, -69, -46, 46, -25, 71, 30, -6, 72, 68, -47, -53, -83, -89, -22, 
+    27, 97, 66, 11, -79, 18, 60, 16, 69, -64, 15, 86, -61, -21, 17, 2, -97, 
+    33, -79, -94, 68, -26, 40, 98, 92, -2, -85, 91, -44, -64, 13, 80, -18, 
+    -21, -87, -33, -45, -42, 12, -61, 6, -69, 37, -43, -56, -74, -59, -2, 
+    -26, -45, -77, 61, 74, 62, 27, -6, -43, -91, -59, 49, -6, 11, 29, -85, 
+    -23, 13, 84, -68, -88, -92, -38, -75, 60, -23, 7, -24, 30, 6, 62, 85, 
+    -77, 44, -81, 35, -1, 33, -2, -78, 21, -74, 88, -90, 70, -100, 75, -69, 
+    -6, 95, -19, -57, -85, 48, -30, -90, -17, -11, 26, 79, -31, -91, 49, -24, 
+    24, 82, -98, 64, 28, 36, -24, -94, -51, -38, 58, 24, -29, 18, -21, -25, 
+    27, 4, -87, 9, -59, 31, -31, -86, -74, -14, -53, 74, 74, -97, 56, -37, 
+    -33, 92, 23, 4, 92, -59, 27, -52, 88, 19, 52, 58, 88, -84, 66, -74, -64, 
+    82, 45, -10, -44, -18, -79, 92, 11, -71, -18, 51, -82, -94, -66, 14, -30, 
+    -5, -59, -44, 3, 32, 87, -44, -98, 40, 82, 26, 55, 98, 23, 1, 97, -57, 
+    -63, -24, 28, 49, 7, -96, 26, 22, 64,
+  -95, 35, -39, 82, -50, 14, 15, 3, 99, 83, 3, 57, 60, 98, -96, -60, -63, 87, 
+    24, -80, -9, -90, 83, -53, -56, -6, -57, 77, -96, 68, -80, 94, -79, -17, 
+    -37, -5, -20, -4, -38, -44, 15, -39, 87, 47, 1, -40, -17, -63, -21, 98, 
+    -15, 49, 97, 29, 85, -62, -1, -38, -39, 1, 44, -6, -63, 2, 72, -1, 14, 
+    91, -72, 31, -55, -28, -24, -82, -35, -58, -3, 99, 41, 57, -1, -60, 6, 
+    81, -2, 19, -90, 95, 89, 40, -38, 61, -38, -1, -27, -96, 49, -34, -72, 
+    46, -82, -73, -80, -9, 71, 84, 93, -33, 46, -84, -46, -67, 25, 86, 6, 99, 
+    -1, 8, -86, 99, 24, 41, -67, 69, 8, -56, 37, -23, -46, 15, 56, -100, 27, 
+    -76, -56, 77, -4, -82, -15, -59, 62, -39, 19, -34, -77, 28, -3, -99, 56, 
+    -53, -32, 84, -25, 75, -82, -55, 3, -64, 70, 87, -76, 46, 92, 29, 75, 64, 
+    -96, 80, 56, -88, -95, -6, -85, 99, -31, 20, -10, 61, -5, 83, 16, -7, 
+    -17, -28, -35, -33, 52, -41, -65, -1, -36, 55, -97, -44, 94, -46, -31, 
+    41, -85, 47, -3, -48, 37, 45, 47, 7, 67, 35, -14, -30, -36, 13, 94, 77, 
+    -31, -58, -37, 37, 13, 66, -17, -48, 36, -70, 80, -19, -32, 68, 54, 44, 
+    -63, -45, 0, 59, -5, -78, 1, -84, 71, 97, 78, 9, -86, -43, 32, -48, -15, 
+    83, 77, -54, 20, -70, -93, 83, 56, 75, 13, -86, -45, -87, 20, 2, 29, -50, 
+    28, -92, 20, -50, -46, 92, 41, 56, -19, 23, 91, 5, 11, 34, 89, -66, 6, 
+    23, 82, 63, -67, -40, -16, -18, -37, 18, 27, -45, 31, -30, 45, 21, 97, 
+    75, 11, 63, 5, -80, -62, 96, 4, -69, -69, -66, 44, -55, -5, -17, 70, 11, 
+    70, -19, 81, 6, -9, -75, -77, 37, 57, -31, 33, 25, -69, -20, -88, -40, 
+    37, 16, 27,
+  52, 43, -67, 68, 85, -40, -32, 13, 39, -32, -54, 63, -30, -11, -65, 40, 
+    -93, -22, 24, -56, 57, -31, -19, -13, 78, -24, -49, 63, 93, -52, -46, 
+    -19, 62, -60, -79, -54, -46, 45, -59, -73, 82, -46, 9, -58, 25, 51, -74, 
+    62, 6, 86, -7, 40, 26, -88, -70, 3, 61, -3, 97, 27, -26, -21, -8, -69, 
+    -30, -45, -42, -46, 8, -88, -34, 4, -43, 9, -38, -23, 34, 50, 10, -46, 
+    23, 45, -44, -86, 8, -16, -74, -16, 81, -13, 16, -93, 82, -52, 28, -61, 
+    16, 88, -24, 26, 29, 37, -73, -65, 84, -19, -67, 6, 62, -46, 91, -48, 55, 
+    -27, 4, -2, 82, -19, 4, 37, 98, 62, -30, -61, -79, 75, -34, 29, 34, -74, 
+    61, -15, 82, -70, 1, -26, -27, 17, -39, -75, 98, 29, -14, 90, 59, -4, 28, 
+    77, -2, 88, -21, -70, 6, -67, -17, -92, -77, -62, 29, -14, 17, 24, 67, 
+    -72, 12, -6, -40, -75, 44, 70, -37, -18, -31, 48, -76, 66, 23, -99, -84, 
+    -81, 9, -25, -56, 42, 31, 24, 42, 8, 59, -22, -83, 53, 73, 77, -62, 55, 
+    -58, 23, 1, -33, 90, 69, 45, 26, -99, -47, -48, -11, -33, 52, 16, -89, 
+    23, -66, -37, -29, 44, 98, -22, -73, -75, 50, -82, -22, 14, 60, -100, 40, 
+    48, 24, 16, -91, -84, -11, -87, 54, 35, 12, -42, -67, 74, -3, -43, -90, 
+    30, 93, -14, -32, 37, 39, 39, -100, 44, -96, 48, 98, -19, 79, 83, 28, 
+    -78, 24, -48, -37, -20, 30, -38, 74, 44, 7, 8, -77, -63, 25, -49, -15, 
+    83, 32, 63, 68, 83, -17, 33, 28, 34, -82, 62, 0, 60, -3, 39, -81, -10, 
+    64, -37, 56, -86, -39, -31, -35, 40, -32, 69, -68, -19, -14, 50, -62, 
+    -60, 74, -72, 17, 73, 22, -26, 70, -97, -76, -65, 73, -94, 54, 29, 42, 
+    -93, 76, -85, -46, -67, 72, 18, -30, -28,
+  72, -33, 59, -86, 89, -100, 38, -84, -62, -48, 86, -73, 15, 17, 22, -32, 
+    35, 53, -93, -87, -58, -37, 23, -9, 12, -84, -30, 75, -77, -39, -99, -1, 
+    -97, -42, 98, 92, 85, 18, -23, -4, 36, 76, -80, -16, -28, -85, 81, 70, 
+    -99, 89, 4, -23, 14, -48, -30, 81, -82, 92, 69, -53, -99, -3, -3, 27, 
+    -87, 29, 79, -26, -79, -12, 93, 98, 13, 28, -36, 62, 47, 1, -28, 11, -99, 
+    53, -2, -24, 38, -14, 1, -46, -84, -31, -47, -69, -68, -19, 28, -88, -46, 
+    68, -24, -13, 84, 54, 46, 82, -59, 49, -15, -36, -11, 95, 49, -86, -53, 
+    17, 88, -92, 26, 0, -45, -57, 60, -87, -12, 9, 17, -74, 11, -3, -97, -13, 
+    8, -63, -2, 67, -39, 7, -28, 48, 58, 21, -70, 14, -41, 12, 86, 92, -41, 
+    -26, -56, -7, 98, 9, 1, 6, 42, 34, -39, -72, -93, 12, -34, 64, 44, 83, 
+    -51, 63, 48, -48, 4, -18, 85, -70, 5, 93, -2, 8, -25, -97, -38, -8, -85, 
+    39, 74, -67, 49, -22, 6, 70, -56, -75, 22, 48, 80, -19, 61, -77, 4, -65, 
+    64, -64, 2, -51, 30, -69, -25, 29, 55, 74, -34, -19, -62, 20, 80, 11, 
+    -30, 16, -50, 10, 64, 99, 27, -90, 39, 64, 18, -85, -27, 89, -27, 41, 
+    -37, 71, 3, 9, 98, -79, 1, 59, -39, 51, -64, 43, -93, 66, 39, 19, -43, 
+    15, 75, 23, 81, 24, 18, -30, -49, 54, 3, 58, -87, 30, 19, 89, -31, -37, 
+    -32, 14, -74, 37, 25, -59, -27, -76, 15, 3, -51, -24, -75, 17, -72, 14, 
+    -46, -61, 68, -21, -57, -53, 29, -87, -2, 3, -22, 91, -4, -25, -31, -86, 
+    -15, -91, 56, 59, -13, 11, -23, -87, -3, -36, 13, 62, -88, -31, -93, 70, 
+    -85, 67, 52, 49, -69, 51, -68, 82, 34, 28, 99, 38, -9, 53, 35, 30, -67, 
+    1, -33, 52, 72,
+  66, 49, -43, 8, -85, -2, 10, 98, -32, 44, -96, 11, 79, 70, -97, -3, -37, 
+    -10, -98, 14, 39, 55, 26, 22, -60, 78, 62, -7, -68, 65, -75, -81, -10, 
+    50, 98, -7, 96, 75, -85, -48, -55, 78, -98, -6, 94, -83, 8, 82, 74, -10, 
+    74, -8, -90, 54, -61, 79, 83, -66, -38, 99, 73, -44, 76, -13, 20, 26, 
+    -59, -51, 31, 90, 82, 34, -46, 58, 51, 48, -80, 37, 97, 54, 94, -91, -20, 
+    75, -68, 92, 16, -29, 13, 12, -2, -66, -44, -38, 98, 9, -63, 64, -30, 25, 
+    96, -69, 60, -38, -12, 53, 31, -27, 29, 49, 69, -53, -19, 19, -69, 16, 
+    -28, -35, 95, -30, 31, 94, 28, -41, 24, 92, -32, -7, 36, 66, -85, 49, 
+    -36, -87, -41, -83, 6, -19, 58, -58, 82, 23, 96, -87, 23, -64, -6, -84, 
+    -92, 62, 45, -64, 14, 27, -48, 43, -90, -12, -11, -20, -51, 84, -43, -71, 
+    -37, -99, -11, 93, -58, 42, 40, -51, 54, -39, -35, -65, -35, -96, 67, 
+    -18, -72, -17, 42, -42, 82, 81, -16, -50, 58, 63, 49, 4, 24, -16, 0, 53, 
+    -92, -54, -54, 36, -90, -68, -7, 34, 48, -69, -83, 10, 43, 36, 73, -79, 
+    -85, -76, 20, -29, 54, 41, -84, 62, 75, 11, -21, -41, 72, -47, 47, -16, 
+    -58, 61, -8, 99, -46, -44, 28, -10, 57, -25, 2, 67, 80, 19, -61, 5, -54, 
+    23, 91, -65, 40, 8, 70, 90, -48, 80, 5, -6, 30, 33, -57, 98, 8, -9, -26, 
+    57, -91, -11, 52, -57, -99, -64, 38, 78, 58, -16, 57, 38, -40, -44, 60, 
+    -41, -25, 41, -51, 24, -59, -58, 5, -31, -100, -61, 33, 27, -18, -36, 
+    -26, 84, -31, 21, -6, 47, -47, -90, -69, -47, 79, 56, -49, -64, 7, 37, 
+    92, -48, -12, 44, -6, -17, -25, -39, -77, -19, -77, 59, -44, 97, -6, 65, 
+    -12, 9, -59, 16, -34, 33, -39,
+  65, -81, -17, -99, 20, 6, -86, 67, -17, 3, 95, 57, -57, 88, -66, 99, 34, 
+    -40, -45, 67, 9, -67, -59, -3, -47, 31, -73, -83, 30, -10, 9, 65, -77, 
+    40, -44, 2, 72, -96, 88, 64, -17, 69, 80, 62, -30, 1, 50, -85, 8, -24, 
+    15, -85, -26, 48, 74, 45, 45, 60, 3, -62, 21, -45, 93, -53, -53, 77, -62, 
+    17, 63, -57, 40, 20, -6, -12, 95, 85, 58, 90, 76, 88, 60, -100, 24, 49, 
+    84, -87, -57, -76, -42, -30, -45, -64, -55, 27, 0, -71, 46, 83, 15, -18, 
+    98, 64, -20, 67, -89, 35, 5, -14, 33, 52, -10, 59, -55, 46, -29, -91, -9, 
+    -78, 86, -55, 12, -35, 46, 65, 57, -39, -90, 52, 20, 51, -40, -59, 72, 
+    72, -98, -40, 25, 96, -32, 87, 25, 31, -7, -44, 24, -74, -32, 24, 58, 
+    -20, -88, 0, -34, -82, -73, 33, 0, 95, -48, -12, -55, -49, 68, -98, -72, 
+    -42, -21, -87, -31, 61, -80, -80, 16, -66, -66, 36, -76, -94, -81, -6, 
+    -95, -18, 13, 40, -2, 97, -36, 64, 96, -83, 67, 74, -70, -33, -48, -73, 
+    -78, 30, 16, 28, -67, 86, -62, -57, 9, 5, -64, 55, 32, 84, -53, 15, -45, 
+    19, -76, -10, -80, 32, 75, -79, 26, -30, -79, -58, -63, 67, 22, -59, -24, 
+    -27, 11, -61, 47, -49, 92, -83, 48, 30, 13, 97, -40, -5, -73, -49, 52, 
+    64, 85, -5, 19, 51, -4, 63, -11, 88, 88, 80, 34, 88, 3, -60, 95, 41, 17, 
+    6, -27, -100, 24, -72, -1, 58, 51, -83, -41, -14, 20, -49, -29, 63, -91, 
+    3, 68, 70, -30, 97, -97, 44, 51, -53, -71, -75, -63, 2, 92, 46, -91, -16, 
+    37, 51, 84, -24, -27, -70, -86, 75, -1, -32, -97, 64, 79, -74, 84, -69, 
+    60, 14, -24, 35, -82, 4, 66, -43, 3, -1, -71, -92, -60, 25, -62, -36, 81, 
+    -3, -85, 9, 9,
+  -15, 54, -24, 98, -27, 76, -67, -58, 19, 36, -83, -17, 60, 96, 7, -78, 30, 
+    -16, -12, -6, 47, 52, 67, 25, -65, 47, -91, 54, 18, -20, 60, -18, -19, 6, 
+    -53, 19, 15, 85, 14, -34, -78, -67, -89, -37, 53, -94, 75, 52, 48, -86, 
+    42, 97, -32, 21, 12, 28, 4, 90, 7, -35, -56, -89, -80, -72, 50, -54, 91, 
+    -17, 11, -21, 12, 62, 4, -57, 97, -96, 5, 16, -21, -3, 24, 55, -31, -10, 
+    -61, -68, 95, 31, 61, 4, 26, -52, 49, 26, -57, -44, -57, 25, -47, 11, 51, 
+    -93, 51, 97, -81, 37, -43, 3, -91, 8, 44, 93, -78, -66, -59, 93, -79, 
+    -19, 80, -4, -36, -86, -7, -41, -18, 9, -6, -8, 90, -41, 88, -64, 42, 37, 
+    13, 0, 32, 23, -3, -87, -74, -42, -25, 91, 12, 90, 59, 55, -77, -18, 
+    -100, 63, 96, 45, 39, -8, -92, -90, -39, 95, -47, -34, -18, -26, -83, 
+    -70, 35, -71, -30, 51, 66, -6, -55, -8, 52, 10, 69, 99, -45, 96, -27, 49, 
+    55, -17, 99, 52, 94, -92, 81, 30, 90, 36, 70, -59, -88, 18, 84, -15, -87, 
+    -46, -78, 71, 31, 93, -5, -9, -73, 85, 5, -48, 78, -29, -52, 77, 74, 83, 
+    79, -97, -60, 58, -34, 71, -53, 85, 72, 93, -30, -24, 41, -66, 34, -76, 
+    -95, -20, -8, 90, -82, 19, -3, -11, -28, -34, 93, 40, -56, -76, 98, 94, 
+    -45, -45, 17, 30, -7, -35, -33, 17, -100, 57, -84, 55, -26, -31, -42, 42, 
+    24, 25, -24, -17, 16, 89, -64, 94, 56, -38, -2, -54, -67, 80, 24, -46, 
+    -99, -96, 10, -48, 89, -70, 84, 63, 46, 7, 7, 49, 33, -3, -65, 95, -76, 
+    52, -10, -18, 48, 35, 10, 6, -86, 92, 72, -88, -77, -6, -75, 33, 10, -56, 
+    -45, -82, -45, 28, 48, 12, 82, -26, 25, 81, 27, 10, -3, -37, -42, -37, 
+    -25, 93, 98,
+  -63, 0, 88, -36, 32, 23, -56, -92, -66, 0, -45, -4, 43, 86, -87, 74, 2, 2, 
+    -68, 62, 64, -19, 22, -38, -4, -70, -96, 72, 55, 43, -79, -17, -69, -48, 
+    -66, -46, 15, -3, 9, 95, -91, -40, 85, 32, 14, -83, -2, -29, -52, -13, 
+    37, 53, -52, -97, 60, 79, -39, -43, 1, -93, 71, -25, -79, 82, -55, 66, 
+    -70, 66, -91, -100, -59, -81, -57, -99, -58, -85, -81, 83, -90, -75, -58, 
+    -77, -58, -58, 0, -56, 68, 22, -64, 27, 6, 54, 96, 28, 36, 63, -69, 45, 
+    -56, -53, -46, -3, -49, 65, 37, -64, 81, -18, -78, 37, -43, -73, 2, 51, 
+    53, -74, 37, -82, 4, -64, -76, 80, 55, -91, -90, -10, 40, 59, -96, -94, 
+    -60, -53, -76, 5, -51, -70, -56, -76, -16, 93, -49, -63, -61, 83, 20, 70, 
+    3, 30, 0, 48, -44, 6, 19, -94, 84, -26, 41, 41, 6, 20, -19, 21, 85, -76, 
+    38, -75, -3, -82, 67, -67, -2, 43, -40, -9, -87, 62, -100, -4, 32, -52, 
+    -42, -3, -80, 39, -38, -63, 21, 60, 4, -19, -34, -78, -82, 93, -86, 90, 
+    -32, -12, 14, -56, 62, 32, 36, 78, 31, -50, 40, 96, -69, -37, -71, 59, 
+    -17, 39, -7, 26, -3, -50, 96, -76, 92, 43, 38, 75, 20, 82, -63, -29, -57, 
+    41, -43, -61, 85, -6, -79, 67, -60, 57, 7, 23, -11, 29, -79, -30, -41, 
+    -87, 77, -91, -80, -41, -49, -34, 99, -79, 57, 16, 57, -32, 56, -84, 69, 
+    -91, 21, -18, -24, 50, 59, 4, 83, 39, 64, -27, -80, 89, -28, 83, 60, -50, 
+    46, 29, 85, -39, -98, 66, 53, 0, -63, 77, -34, 88, 20, 56, -44, -35, -41, 
+    52, 68, 50, -1, 68, -66, -52, -2, 99, -78, 78, 33, 43, 80, 50, 56, 48, 
+    -70, -98, -67, -89, 53, -14, -42, -91, -54, -22, 8, -65, 91, 89, -35, 
+    -75, -37, -31, 20, -59, 75,
+  42, -52, 99, -17, -56, -27, 74, 0, 98, 85, 18, 63, -6, -96, 73, -80, -37, 
+    12, 82, 74, -39, 15, 75, 61, -92, 67, 35, 66, -67, 81, -67, 95, 3, -17, 
+    95, 47, -82, -98, -83, 55, -86, -94, -76, -86, -71, -16, -1, -24, -57, 
+    -34, 19, 29, -13, 21, 88, -74, 34, 94, -67, -50, 45, 66, -11, -2, 70, 
+    -51, -19, 60, 74, 20, 33, 62, 44, -26, 42, -65, 34, -81, -46, -82, 2, 
+    -86, -2, 62, 90, -27, 39, 23, -100, -67, -63, -35, 26, 4, -80, 63, -87, 
+    48, -95, 31, 18, -70, -46, 40, 73, -98, 1, -96, -10, 35, 78, -54, 36, 87, 
+    -55, 97, -48, -46, -36, 57, 77, -34, -18, 76, -45, 76, 13, 50, 20, -8, 
+    12, 67, 27, 73, -5, -100, -49, -1, 26, 89, 58, 46, -48, -35, -83, -73, 
+    51, 37, -22, -62, -82, 92, 11, 74, 14, -51, -63, 91, -67, 53, 7, 29, -95, 
+    -14, 36, 79, 10, -94, -64, 80, 83, -14, 6, -55, -81, 51, 74, -63, 31, 24, 
+    19, -6, 33, 2, 62, 61, 15, 45, 76, -76, -67, 71, -7, -54, -44, 8, 51, 
+    -53, 80, 38, 91, -6, -43, 20, -65, 50, -47, -12, -35, -32, -76, 33, 13, 
+    -13, 37, -65, -86, -15, 12, -94, 90, -73, -74, -97, 71, 80, -78, 96, -23, 
+    -31, -52, -75, 99, 71, -11, -99, -77, 80, -76, -87, -69, 56, -96, 89, 
+    -38, 94, -48, -24, -18, -82, -34, -45, -64, -50, 93, -98, 22, -69, -2, 
+    -84, 82, 20, 41, 15, -75, -100, -86, -6, 99, 54, -5, -18, -2, 12, -8, 
+    -10, -32, -66, 56, 32, -69, -21, -53, -55, -19, 81, -75, 81, -42, -54, 
+    -16, -100, -61, -16, 30, -35, 25, -16, -5, -75, -51, 32, 99, 62, 42, 63, 
+    93, -73, -71, -59, -25, 59, -31, 35, -58, -85, -24, 11, -58, -82, -58, 
+    -50, -69, -69, 8, 93, -64, -6, 1, 50, 99, -1, -24,
+  -71, 76, 96, 37, 20, 8, -67, -47, -89, 62, 52, -52, 78, 86, -62, 60, 46, 
+    44, -68, -44, -34, 28, 30, -30, -2, -1, 14, -64, -68, -63, -88, -86, -95, 
+    40, -70, -55, 5, -56, -50, -61, 88, 57, 45, -73, -3, -45, 19, 5, -73, -6, 
+    -78, -82, -37, 2, 61, -44, -67, 26, -27, 94, 3, -34, -10, 71, -46, 19, 
+    68, -35, 46, -22, 61, 70, 68, 99, -99, 60, -44, 92, 48, 98, -68, -10, 97, 
+    1, 12, -94, -82, 49, -98, -84, -1, 14, -7, 23, -65, -67, 63, -40, -48, 
+    35, -68, -7, -87, -14, 61, -53, -62, -27, 35, -16, 87, 79, -11, 74, 74, 
+    66, -89, -62, -71, -96, -66, 24, -7, -84, -94, -75, 70, -38, 10, -20, 89, 
+    32, -3, 59, -73, 15, -2, 36, -32, -4, -10, -38, -48, -70, -41, 67, -73, 
+    -20, -37, 70, 12, -49, 93, 88, -96, 96, 23, -96, -23, -84, 6, -64, 38, 
+    58, 20, 89, -85, -88, -41, 1, -90, -87, -54, 24, -82, 23, -21, -85, 20, 
+    -13, -81, -72, 28, 94, 16, -34, 66, 90, 44, -42, -95, 37, 74, 62, -23, 
+    -10, -47, -20, -80, -45, 10, 61, 28, -70, -5, 43, -68, -74, 21, 86, 26, 
+    -90, -64, -33, -31, -81, -77, -38, -98, 16, -100, 70, -99, 63, -20, 21, 
+    70, -42, 28, -24, 59, -83, -88, 53, 12, 43, -6, -8, -22, 58, 3, -83, 27, 
+    73, 13, -75, 44, -60, -66, -54, -27, 35, -55, 8, 61, 16, -7, -53, -98, 
+    -65, 72, 23, -80, 21, -58, 13, 48, -57, -80, 87, -21, 0, 31, 5, -11, 31, 
+    -86, 14, -32, -87, -29, 45, -33, -28, 7, -38, -79, -27, -83, -67, -44, 
+    96, 11, -12, -100, -97, 8, -83, 35, -12, -94, -23, -77, 65, -25, -91, -5, 
+    -1, -8, 48, 37, 49, 44, 8, 71, 68, -62, 91, 30, 15, 19, -42, -36, 41, 81, 
+    87, 60, -1, -38, 0, -71, -66, 41,
+  -31, -100, 12, 35, 71, 19, -1, 73, -73, -72, 66, -25, -86, -76, -58, -81, 
+    18, -25, 82, 29, -13, -47, 11, 30, -29, -84, -58, 2, -68, 56, -14, 84, 
+    36, -61, -1, -69, -99, -88, -53, -67, 23, -84, 87, -1, -84, 42, 54, 65, 
+    66, 11, 8, -43, -97, 61, 42, -59, -27, -9, 48, 75, -40, 26, -61, 26, 73, 
+    34, -21, -18, -54, -34, 79, -49, -94, -57, -91, -67, -71, -45, -21, 17, 
+    -56, -54, -8, 67, 30, 25, -45, 10, -67, -48, 56, 28, -53, -8, -41, -62, 
+    84, -17, -87, 73, 74, 82, 70, -2, 57, -84, 79, -51, 9, -54, 0, -9, 37, 
+    76, -26, 14, -43, 96, 67, -15, -17, 34, 89, -89, 75, -91, 84, 62, -64, 
+    -35, 40, 67, -38, 75, 34, -91, -42, -2, -25, 26, -16, 97, 53, -7, 38, 
+    -16, -52, -18, -84, -75, -4, -20, -6, 19, -29, 63, -53, -81, 11, -97, 43, 
+    83, 77, -100, -80, 93, 98, 99, 55, 17, -11, 54, -18, -95, -80, 98, 20, 
+    92, 79, 34, 51, -19, 54, -24, 78, 95, -48, -40, 24, 31, -59, 47, -29, 
+    -11, 70, -6, -98, -86, 99, -5, -94, -15, -82, -28, -71, -67, 72, -52, 
+    -83, -46, -76, -91, 94, -1, -44, -44, 99, 89, -59, 18, 6, 51, -51, 71, 
+    -99, -55, -65, 67, -48, -67, 46, -4, 92, 61, -99, 83, -13, 90, -72, 62, 
+    -77, -32, -74, -83, 15, 3, 86, -7, -73, -79, -76, -28, -15, 64, 13, -65, 
+    94, 65, -20, -41, -83, -79, 80, 56, -58, 46, -77, -32, -76, -38, 82, -5, 
+    -95, -21, 68, -41, 10, -55, -80, -82, -45, 62, -21, -32, 40, 85, 9, -38, 
+    2, 19, 19, 79, -44, -73, -12, 45, -49, 89, 48, 36, -78, 70, 22, -55, -3, 
+    -44, -65, 93, -80, -74, 55, -96, 7, -69, -45, 56, -69, 34, 75, -52, 37, 
+    91, -5, -78, 12, -82, 51, 3, -34, 56, -60, -6, 9,
+  66, 43, 5, -62, -63, -18, -20, 74, -99, 88, -18, -35, -42, -60, 94, 49, 
+    -11, 55, -62, 94, -86, 30, 45, -63, -81, 17, 51, -72, -13, 27, -25, -51, 
+    69, 8, -62, 95, -50, -82, -92, 54, -61, -80, -19, 32, -88, -66, 8, 44, 
+    65, 10, 54, 53, -90, -94, 74, 35, 3, -96, -30, 11, -25, -69, -30, 43, 34, 
+    18, 71, -78, -60, 70, 52, 45, -36, 86, -11, 63, 80, -52, 18, -17, 47, 69, 
+    63, -99, 17, 16, 49, -87, -91, -74, 98, -51, -29, 30, 34, 33, 63, 31, 30, 
+    54, 87, -57, 44, 77, 75, -16, 26, -74, -23, -69, -59, -87, -54, 14, 34, 
+    -6, -71, 63, -63, 16, 67, -27, 18, 29, -30, 3, -48, -48, -39, 85, 78, 26, 
+    98, 37, -5, 59, -18, 17, -28, -36, -62, -40, 14, 17, -35, -33, 46, -60, 
+    9, 75, 32, 39, 30, -68, 2, 28, -60, -94, 89, 45, -86, -98, -63, -22, -35, 
+    74, 27, 40, 44, 42, 19, -48, -68, -4, 42, 18, -28, -55, -38, -75, 54, 2, 
+    -69, 69, 2, 60, 43, -76, 41, -9, -28, 50, -52, 51, -26, 37, 27, -42, 7, 
+    70, -96, -36, -15, -12, -31, -90, 37, -94, -42, -69, -45, 86, -55, 56, 
+    -80, -13, -20, -84, 84, -30, -51, -80, -29, -18, -34, -38, -74, 90, 43, 
+    -8, 62, 60, 22, 33, 57, 47, -38, 42, -60, -62, -42, -50, 39, 36, -70, 93, 
+    78, -3, 74, 30, 59, -1, -69, -87, 44, -14, -49, -64, -27, -23, -85, -43, 
+    86, -39, 11, -35, 40, 49, -32, 54, 63, 12, -60, -21, 45, -63, -37, 70, 1, 
+    61, -45, 69, 8, -36, -50, 88, -4, 88, 90, -59, -79, 90, -96, 90, 21, -4, 
+    99, 59, -99, 61, 9, -52, 17, -17, -58, 48, 71, 80, 33, 45, 14, -35, 81, 
+    -92, -59, 5, -93, -56, 6, 51, 1, 6, 96, -7, -43, -47, -85, -99, 59, 79, 
+    83, -97, -53,
+  69, -75, 39, 78, -10, -65, -37, 58, 58, 14, 86, 69, -84, -48, -33, 99, 60, 
+    11, -35, -33, -18, 94, 68, -91, 75, 85, -15, 9, -20, -15, 40, -20, -41, 
+    47, -99, 68, -35, -15, -74, -31, -44, 9, -20, 45, -91, 53, -29, 23, -34, 
+    70, 33, 15, 37, -90, -85, 33, 58, 9, 43, -78, -31, 35, -68, 82, 84, 18, 
+    46, -91, -31, 94, 79, -8, 94, -52, -30, -11, 47, -5, -61, 99, 48, 22, 48, 
+    -34, 99, -30, 56, 45, 89, -39, 75, 85, 7, -3, 16, 55, 29, 30, -40, 24, 
+    -100, -65, 6, 55, 64, -62, 37, 45, -79, -63, 73, 73, -77, 28, -4, -42, 
+    71, -59, -44, 25, -67, 99, 61, 8, -50, -71, 13, 20, -32, 47, -14, 1, -20, 
+    72, 59, 84, -35, 66, -40, 83, -86, 16, 66, 12, 70, -50, -95, -3, 41, -48, 
+    -15, -48, -96, -9, 3, 74, -89, -23, 98, -81, 66, 51, 44, -96, -3, 55, 46, 
+    -38, -42, -37, 74, -87, 25, -40, 41, -42, 79, -58, -17, -50, -74, 92, 
+    -64, 34, 90, -65, 86, 85, 4, 71, -86, -37, -16, -46, -28, 30, 76, -93, 
+    -18, 34, 50, 50, 8, -48, 82, -99, -91, -43, -61, 74, -54, -71, 20, -60, 
+    -61, 27, -8, 85, 25, 40, -77, 95, -91, 35, 33, 77, -49, -78, -71, -5, 11, 
+    28, 43, 28, 61, 67, -72, -67, -12, -30, -16, 62, -98, -39, 87, -53, 84, 
+    13, 25, -25, -37, -96, 94, -51, 50, -73, 87, -27, -43, -72, -88, 35, 94, 
+    72, -39, -87, -35, -97, 5, 58, -89, 11, 18, 34, 35, 30, -44, 15, 88, 64, 
+    -64, 86, -90, -98, -10, -39, -13, -2, -82, 59, -37, -71, -22, -63, 13, 
+    -75, 96, 60, -37, 72, -34, -96, -3, -18, 44, -20, -11, -61, 55, -4, -44, 
+    -65, 20, -49, -82, 77, -31, -70, 90, -70, -90, -92, -88, 2, 21, 10, -47, 
+    -60, -36, 80, -51, -92, -95,
+  -59, -81, 10, -18, 75, -8, -44, -56, -45, -14, -26, 40, -62, -16, -12, 60, 
+    66, 23, 68, 93, -47, 13, 19, 58, -17, 35, -46, 38, -52, 95, -56, 49, -60, 
+    -23, -70, 3, -53, 19, -45, 96, 3, -24, 91, -72, -3, 12, -63, -57, 1, -59, 
+    49, 25, 99, 35, 23, -91, 90, 60, 85, -3, 68, 80, -29, 75, 78, 55, -36, 
+    -24, 84, -13, -87, -36, 70, -97, -27, 32, -57, -87, 37, -48, 45, -85, 
+    -15, -59, -38, -13, -5, 73, 60, -21, 35, -51, -24, -19, 74, 28, -37, -90, 
+    27, 13, 59, 0, -74, 36, 85, -42, -62, -94, 76, -7, -38, -52, 15, -27, 35, 
+    69, -13, -25, 82, 32, -54, -21, 78, -12, 78, -98, -39, 37, -83, 18, -21, 
+    -27, 74, 31, -52, 53, 99, 88, 39, -13, -71, -74, 62, 2, 98, 44, 22, -12, 
+    39, -58, 36, -15, 46, 10, -97, -80, 42, 88, -14, 22, 21, -42, -100, -83, 
+    10, 97, 95, 75, 43, -89, -47, -81, 54, -51, -85, 78, 87, -39, -61, -40, 
+    -22, -55, 10, 11, 13, 59, 77, 65, -29, -75, -58, -50, 25, -26, -46, 34, 
+    96, 89, -71, 97, 26, -6, 4, 27, -91, 22, 97, 0, 89, 3, -14, -25, 88, -66, 
+    -87, -78, -70, -75, 45, -6, -88, -16, -67, 43, 28, -71, 27, 40, -92, -65, 
+    2, -40, -67, 31, 53, 42, -49, 89, 61, 1, 90, 79, 84, 17, 78, -19, -13, 
+    25, -49, -58, 85, 32, 29, -49, -70, -11, -67, -23, 93, 51, 0, -15, 80, 
+    74, 67, 69, 44, 25, -95, 28, 62, 64, -52, 86, -39, -95, -26, -88, 20, 
+    -45, -88, -40, -60, -87, -88, 96, 59, -6, -55, 9, 99, 69, -28, -81, 32, 
+    36, -11, -86, -87, -84, -45, -85, -77, -48, -89, 66, 62, 83, 16, -17, -7, 
+    2, -68, -93, 69, 69, -92, -86, 76, -41, 0, 88, -94, -68, -47, -34, -45, 
+    32, 74, -65, 36, -20, -13,
+  35, -20, -35, -44, -62, 44, 65, -42, -48, 89, 36, -9, -14, 2, 52, -75, -84, 
+    88, 18, -52, 63, 46, 41, -59, -40, 58, 65, -59, 60, -88, -30, 8, 6, 76, 
+    46, 45, -66, 10, 21, -50, -28, 66, -67, 74, -58, 37, -46, -26, -63, 38, 
+    -36, 59, 34, 56, -28, -91, -65, -50, 46, -54, 53, -62, 45, -24, 12, 3, 
+    -58, -25, 3, -86, -78, -9, -9, -16, 64, -28, 96, 55, -68, -78, -88, -95, 
+    48, 40, -69, -63, -12, -6, -38, 64, 97, -51, 11, 7, -55, 83, -40, 69, 54, 
+    28, 58, -29, -82, 29, -41, 11, -67, 88, -37, -91, 49, 27, 80, -20, -76, 
+    64, -9, -20, -45, -64, 97, -18, -49, -48, 7, 83, 68, -50, -86, -82, 4, 
+    -33, -49, -27, -14, 79, -43, -69, 10, -35, 76, 36, -37, -19, -37, -73, 
+    -52, 15, 64, 97, 69, 25, -80, 93, -69, -87, 62, 50, 2, 20, -29, 2, 71, 
+    -16, -50, 44, -6, 87, -87, -25, -63, 63, 81, -30, -11, -91, -71, 14, 83, 
+    -8, -3, 11, 53, 84, -93, 43, -86, 64, 89, 9, -19, 4, 9, -22, -52, 0, -28, 
+    -38, 92, -42, -2, -20, 85, 37, 30, 46, -67, 65, -2, -67, -7, 30, -61, 65, 
+    -65, -81, 70, 17, 47, 64, 90, -58, -77, 2, 57, 56, 65, -35, -55, 54, -31, 
+    14, -41, -48, -28, 10, 43, -80, 44, 28, 19, -68, 79, -42, -21, -62, 37, 
+    -28, 93, -11, 87, 92, -71, 60, 35, -71, -84, -21, 71, -99, -84, -92, -77, 
+    -41, 85, 47, -73, 61, 39, -62, -69, 89, 23, 22, -90, 43, -83, 91, 67, 7, 
+    -87, 61, -3, 5, 77, 60, 38, -55, -22, -17, 36, 90, -19, 51, -80, 72, 63, 
+    -92, -3, 71, 20, 97, 21, 34, 97, -60, -74, 36, 63, 48, 39, 83, -57, -4, 
+    -25, 62, 91, 48, 60, 95, -48, -25, 63, -37, 66, 35, 93, 40, 62, -94, -39, 
+    23, -65,
+  -51, -23, 75, -3, -35, 65, -75, 69, -34, -40, -59, 88, 45, -76, 57, 23, 0, 
+    87, 53, -33, 79, -62, -49, -35, 68, -4, -30, -23, -61, -89, -47, 13, 36, 
+    -60, 5, 66, -89, 27, 89, -89, -3, -24, -18, -80, 46, -68, -66, -28, -54, 
+    -32, 3, -16, 99, -11, -43, 98, -43, 81, 13, 68, 76, -5, -53, 32, -85, 19, 
+    -16, 15, -66, -33, -26, 90, -91, -25, -9, 67, -100, 80, 13, -45, -75, 92, 
+    87, 88, 97, -22, 41, -57, -37, -94, 80, 58, 58, 68, -55, -78, 1, 51, 86, 
+    -47, -32, -96, -49, -66, -91, 25, -83, -2, -88, 28, -5, 62, 14, -42, -3, 
+    32, -22, 82, 98, -72, 85, 39, -88, 63, -42, -59, -96, 1, 70, -72, 54, 
+    -54, 59, 50, -82, -57, -73, 25, -66, -90, -75, -90, 54, 96, -4, 73, -81, 
+    -70, 28, 84, -18, -31, -13, -64, 10, 19, -39, 13, -87, 54, 7, -4, 80, 
+    -35, -54, 45, 26, -22, -86, 99, -29, 10, -44, 71, -88, 45, 72, 97, -20, 
+    -22, 83, 5, 3, 41, 84, -45, -20, 4, 7, 46, -21, -44, 99, -42, 51, -72, 
+    71, -58, -41, -9, 8, -84, -62, 68, -31, -54, -86, -49, 42, -47, -95, -81, 
+    -66, 24, -68, -98, -81, 47, -53, -16, 71, -98, 96, 59, -22, 14, 91, -18, 
+    -50, 73, -58, -32, 45, -36, -59, -81, -36, 41, -84, -98, 19, -46, -24, 
+    -43, 42, 63, -56, -64, 79, 15, -20, -57, 44, 78, 34, -28, -32, -47, -86, 
+    -89, -51, -14, -72, 34, -71, -17, 90, -71, 46, -88, 49, 15, -76, 93, 33, 
+    88, 68, -55, 4, -19, 29, -9, 79, 52, 88, -55, -77, -13, 57, 90, -40, 35, 
+    -70, -93, 23, 69, -1, 3, -21, 65, 44, -89, 5, 25, -61, -95, -97, 65, -80, 
+    58, -60, 43, 52, 70, 77, -18, 43, -23, -11, 15, 82, 70, 43, 28, 48, 20, 
+    -8, -35, 35, -46, -95, -67, -73,
+  93, 11, -86, 76, -48, -66, -68, 18, -67, 27, -51, -68, -83, -38, -99, 84, 
+    -65, -27, 41, -56, -12, 57, 87, -64, -39, -57, -34, -22, 6, -94, 98, -14, 
+    -67, -9, 20, 67, -77, -86, 14, 40, -61, 34, 48, -51, -63, 51, -41, -64, 
+    -11, -10, -32, 28, 33, -58, -75, 57, 49, 13, 70, -3, 37, -94, 81, -52, 
+    32, -32, 28, 70, 87, 75, -65, -67, -14, -80, -67, -80, 92, -20, -66, 27, 
+    18, 67, 99, 62, -50, -76, -78, -48, 89, -68, 58, 1, 1, 74, 90, 99, -70, 
+    -43, 49, -99, -86, -37, 81, 95, 98, 59, -80, 34, -38, -75, 99, 42, -10, 
+    40, 84, -63, 48, -37, 86, 87, 69, -27, 32, -61, 5, -3, 18, -33, 97, 31, 
+    74, 97, 78, -29, -92, -75, -50, -28, 92, -12, -43, 38, 1, 50, 86, 94, 
+    -32, 27, 3, 65, -5, 33, 17, 29, -42, -45, 76, -74, -32, 54, 18, 90, -20, 
+    51, -71, 6, -26, 36, -76, 98, -100, 11, 48, -23, -78, -64, 38, 37, 53, 
+    77, -57, -83, 13, -27, -14, 2, 74, -94, 35, -27, 13, 46, -37, -13, 79, 
+    24, 38, 18, 64, 2, -69, -23, 87, -70, -72, 74, 20, -20, -71, -21, 18, 
+    -30, -8, 9, 22, 4, 51, -45, 48, -16, 61, 68, -25, 15, -35, 74, -16, -3, 
+    13, 28, 30, -57, 97, 2, -71, 18, 2, -45, 41, 26, 52, 30, -16, -71, 29, 
+    54, -45, -58, -10, 25, 91, -44, -50, -1, 80, -46, 11, 16, -35, -17, 0, 
+    25, -81, 21, -39, 16, -86, 4, -69, -81, -32, 96, -10, 88, 21, -8, -35, 
+    -25, -20, -58, 25, -9, -62, 37, -27, 63, -85, -3, 11, -31, 46, -29, 71, 
+    88, 86, 97, 47, -32, 30, 22, -48, 97, -92, 26, 87, -16, -88, -92, 1, -2, 
+    -17, -25, 56, -86, -18, -37, 24, -38, -36, -46, -5, 73, 82, -35, -96, 90, 
+    -11, 46, -69, 43, 26, -49, 86,
+  98, -67, 61, -9, -61, 15, 27, -25, -80, -73, -21, 43, -40, 31, -69, -62, 
+    -63, 3, 19, 0, 64, 29, -80, -87, -37, 94, 61, 41, -14, -63, 99, -5, 40, 
+    79, -54, -84, 35, -16, -35, -86, -2, -13, -51, -3, -66, 20, 47, 13, -28, 
+    -60, 73, 89, 39, 68, 55, 85, 21, 16, -37, 43, 19, 96, 30, -5, 9, 90, -90, 
+    -24, 74, -33, -58, -95, -34, -80, 79, -67, -97, 96, -87, 68, -79, -33, 
+    -60, -48, -28, -51, 59, 70, -68, 93, 94, 87, 84, -74, 6, 93, -28, -69, 
+    -14, 63, -92, 97, -57, 59, -39, -76, -38, 80, -48, -20, -57, -84, 14, 95, 
+    2, -19, 80, 50, 2, -50, 6, -36, 92, 84, 99, 39, 33, 7, 36, 38, -82, 87, 
+    -84, 19, -4, -32, 58, -41, 25, -56, -14, -88, -81, -59, -98, 26, 18, 28, 
+    -24, 96, -54, -43, 44, -35, -64, -56, 60, 70, -49, 10, 56, 70, -95, 37, 
+    -20, 22, 28, 4, 4, 89, 2, 28, 88, 66, 12, -36, 60, -66, -90, -45, 93, 
+    -62, -25, 7, -36, -42, 6, -13, -12, 61, 13, -93, 60, 32, 25, 37, -43, 
+    -26, -31, -35, 78, 94, -21, -95, 64, -91, -54, 98, -97, 94, 85, 12, -35, 
+    64, 68, 10, -4, -50, 95, -82, -5, -90, 60, 39, -35, -14, 84, -96, -90, 
+    -66, 90, 19, 75, -22, -60, -70, 28, -93, 57, -34, -36, -70, 26, -27, -30, 
+    -30, 18, -61, -17, 16, -65, 40, -98, -26, -93, 21, -60, -76, -36, 5, 96, 
+    30, -90, 41, 85, -9, -13, 87, 96, 5, 75, 18, 38, 21, 82, -58, -96, -34, 
+    -60, -22, -20, -13, -28, 79, -85, 56, 67, -4, -69, -43, 29, -24, 54, -70, 
+    -6, -74, -82, -57, 66, -79, 88, 74, -44, 0, -97, -19, -90, -30, -66, -44, 
+    68, 60, -79, 49, -23, -38, 21, 90, -36, 37, -87, -76, 28, 74, 20, 9, 89, 
+    -100, 63, 97, -95, 23, 76,
+  34, -47, 27, -58, -91, 82, 37, 53, 21, -99, 23, -11, -75, 70, 26, -93, -82, 
+    -62, 83, 78, -60, 65, -17, 12, 57, -1, -75, 34, -15, 90, -24, -78, 68, 
+    -29, -4, 39, -61, 44, -35, 17, 27, -12, -10, 85, -46, -23, -10, -80, -40, 
+    -22, 96, 54, -71, -73, 17, 32, -27, 20, 2, -28, 29, 59, 41, 86, 4, -37, 
+    -29, -87, 15, 14, -15, 46, 62, 85, 39, 65, 25, 87, -42, -30, -64, 11, 33, 
+    50, 47, -1, -25, -42, -37, 29, -53, -95, 81, 22, -90, 55, -12, 36, 70, 
+    -1, -36, -96, -100, -3, -72, 17, -74, -56, -69, -60, 73, -79, 36, 6, 43, 
+    -44, 45, -37, 61, -38, 63, 83, -51, 19, -37, 77, 42, -21, -19, -96, -96, 
+    -32, -3, -76, -78, 73, 71, -53, -11, -34, -54, -10, -79, -28, -65, -57, 
+    -41, -20, 78, 66, -23, -49, -13, -74, -8, -68, -65, 59, -14, 94, 35, -20, 
+    52, 60, -69, -16, 50, 40, 47, -44, 45, -90, 39, 0, 48, 97, -68, -80, -50, 
+    17, -36, 47, -35, 19, 64, 48, -19, -49, -89, 46, 54, -75, -25, 57, -17, 
+    35, -44, -8, 90, -54, -29, 65, -95, -29, -42, 20, -49, -51, -29, 56, 52, 
+    89, 36, 89, 17, -71, 66, 10, -27, -59, 64, 23, 76, 40, -27, -73, 49, 93, 
+    13, -27, -45, 88, -34, 62, -85, 89, -17, -60, 78, 39, -16, 57, 47, 11, 
+    -55, -81, 8, 51, -82, 61, 10, -48, -85, -38, -28, -75, -33, 39, -69, -51, 
+    -57, -56, 66, -33, 58, 87, 6, 45, 28, 72, 98, 56, 10, 56, -29, -81, 66, 
+    25, 15, 56, 27, -76, -66, -31, -29, 69, -73, 18, -99, 64, 55, 19, -55, 
+    44, 4, 18, 32, 57, -5, 64, 85, 82, -98, -89, 47, -10, -67, -62, -45, -19, 
+    -3, -89, -26, 9, 54, 85, 86, -86, -89, 25, -38, -33, -2, -93, 25, -34, 
+    85, 99, -15, -9, 80, 69, -13,
+  -41, 88, 15, -42, -7, -7, -37, -25, 68, -55, 29, -35, 51, -56, 96, 27, -4, 
+    54, 12, 40, 13, -64, -58, 49, -71, -9, -35, -92, -62, -62, -63, 78, -38, 
+    -75, 16, -38, 93, -44, 0, -31, 78, 80, -2, -29, -96, 27, -30, 40, -6, 
+    -64, 31, -76, -98, 76, 75, 76, 23, 42, -60, -63, -21, 63, -98, -96, 43, 
+    45, 91, -78, 83, 1, -97, 54, -30, -26, -35, 12, 25, 0, 18, 91, 39, 6, 
+    -100, -82, -50, -27, -92, -74, -92, -91, -37, -90, 43, 52, 5, -54, -72, 
+    73, 29, -91, -68, -51, 75, -72, 33, 68, -72, -47, -69, 39, 32, 55, 49, 
+    -76, -3, -100, 88, 7, -35, 72, -82, 5, -97, -19, 3, -90, -10, 72, -17, 
+    87, 24, 9, -75, 20, 4, 44, -4, 3, 47, -72, 14, -45, -100, -74, 51, 17, 
+    28, -41, -11, -41, -36, 37, -97, -56, 45, -64, -35, 40, -45, 76, -52, 
+    -19, 48, -38, -31, -54, 15, 8, 5, 91, 80, -38, 8, 17, -17, 74, 7, -46, 
+    -30, -35, -10, -34, 85, 1, -58, -62, 73, -11, 26, -3, -49, -49, -55, -8, 
+    31, 86, 86, 32, -72, 36, -52, -44, 12, -50, 87, -13, 20, 57, 98, 63, 9, 
+    -36, -12, -87, -2, -41, -53, -56, -28, 6, -88, -16, 98, 74, 77, -23, 36, 
+    71, 47, 57, -64, 32, 89, 3, -63, 34, 81, 84, 35, -15, -30, -30, -84, -24, 
+    -97, -82, -66, -93, -64, 72, 96, -46, -17, 53, 92, 99, 92, 35, -31, -65, 
+    26, 33, 75, -12, -26, -91, -69, 18, -4, 27, -54, 81, -61, -57, 58, 15, 
+    -19, -7, -5, -87, -63, 43, 34, -64, 15, -1, 2, -74, -39, 2, 91, -40, -55, 
+    -44, 65, 50, 2, -27, -65, -18, -92, 38, -27, -15, -16, -83, 97, 65, 38, 
+    -80, 45, -35, -81, 28, 10, -92, 69, 95, -50, 92, -29, -51, -40, 94, -38, 
+    -4, -65, 16, 61, -91, 83, 8, 16,
+  -60, -100, -91, 81, -59, 98, -91, -53, -72, -14, -22, 83, 48, 83, -52, 12, 
+    99, -60, 96, 46, -7, 9, 72, -25, 94, 2, -48, -86, 48, 86, 80, -31, -22, 
+    -26, 75, -53, 45, -49, 92, -70, 1, -21, 92, 87, 95, -33, 17, -68, -39, 
+    84, 83, -45, -17, -19, -2, -38, 24, 55, 8, 71, 86, -46, -36, 91, 46, -9, 
+    89, -32, -31, -54, -14, -56, 28, -50, 9, -2, -13, 44, -52, 66, 40, -72, 
+    69, -74, 89, 83, -84, -41, 91, -91, 79, -17, 8, -22, 19, 12, 74, -39, 23, 
+    18, -83, -99, -56, 61, 52, -21, 33, 81, 27, 60, 10, -67, -51, 70, 61, 
+    -76, 77, 9, 50, -81, 18, -44, -28, -9, 44, 93, 73, -92, -42, -20, 11, 55, 
+    71, -6, -52, 0, -71, -96, -97, -80, -32, -24, 5, 83, -63, -2, -88, 80, 
+    76, 77, -49, -86, -86, 48, 34, -42, -58, -54, 11, 91, 20, 43, -54, 27, 
+    -12, -89, -85, -100, -78, -37, -24, -34, 45, 7, 96, 33, 42, 21, -86, -99, 
+    26, 19, -17, 79, 60, 6, -53, -53, 8, 96, -35, -11, -32, 93, -71, -11, 87, 
+    8, 91, 19, 6, -50, -70, -92, -52, 40, 47, 32, 58, 57, 66, 54, -16, 86, 
+    68, -8, 85, 98, 42, -8, -17, 44, -5, 5, 31, 13, -72, 86, 86, 78, -18, 59, 
+    9, -84, -83, -75, -23, 96, 14, -8, -6, 63, 87, -93, 24, -90, -65, -93, 
+    19, -94, -1, -76, 63, -41, -94, 34, -49, -69, 22, 53, -68, 8, -70, -71, 
+    -15, -56, -1, -35, 56, -57, -21, -96, -44, -12, 9, 24, 26, -17, -21, 6, 
+    -56, -3, -72, 18, 35, 4, -4, 53, 2, -33, -49, 0, 76, 42, -46, 10, 77, 89, 
+    18, 23, 76, -64, 91, 50, -78, -35, 22, -27, -84, -92, 36, -61, 98, 40, 
+    -3, -35, 29, 49, 63, -1, -63, 92, 77, 98, 96, -37, 0, -38, -6, -55, -45, 
+    60, 71,
+  -78, -77, -42, -60, 77, -97, -70, 51, 67, 5, -79, 9, 3, 46, 6, 71, -28, 34, 
+    -45, -66, 57, 27, -21, 7, 58, -76, -20, 40, -75, -14, 20, -51, 49, 55, 
+    -31, 79, -7, -17, 71, -81, 98, -3, 96, 80, -29, -15, -87, -71, 91, 31, 
+    -33, 19, 67, -18, -18, -27, 34, -94, 68, -33, 29, -68, -58, 7, -31, 1, 
+    63, -2, 58, -100, 91, -82, -48, -75, 96, 67, -47, -87, 79, 45, -34, 53, 
+    74, 34, 40, -95, 99, 46, -88, 87, 75, 54, 55, 95, -89, -21, 52, -12, 34, 
+    -18, -64, -40, -26, 18, -20, 34, -25, -53, 76, -46, -80, -28, 3, 98, 98, 
+    -12, -71, 5, 36, 5, -35, -81, 23, -76, -75, -42, -45, 69, 34, -75, 93, 2, 
+    -89, -15, 91, 43, 9, -18, 39, 64, 22, 64, 62, -9, -38, -24, -5, -16, -82, 
+    3, -49, 40, -7, 97, -74, 85, 98, 5, -10, -23, -97, -27, -78, 75, 62, 57, 
+    -81, -35, -22, -58, 31, 68, -47, -88, 78, 69, -4, -28, -40, 91, 3, 86, 
+    -30, -7, -83, -54, -84, 85, 74, 59, 68, -22, 70, -77, 83, -1, 21, -14, 
+    -57, 84, -67, 87, -16, 58, -13, 7, -100, -74, -95, 28, -67, 15, 22, 83, 
+    82, 44, 44, -68, 49, -82, -71, 57, 1, 13, -87, 74, 70, 82, 11, -71, 7, 
+    -52, -23, -80, -75, -24, -77, -94, 98, 40, -18, 19, 4, 30, 69, -56, 82, 
+    71, 85, 81, 24, -23, 21, -44, 84, -74, 13, -19, 9, -44, -14, 78, -10, 
+    -27, 15, 36, 96, 17, -69, 3, -74, 27, -38, 34, -42, -44, -93, 93, 81, 48, 
+    96, -30, 54, 14, 99, -40, 21, -77, -79, -81, -94, 13, 51, -67, 67, -78, 
+    20, 55, 96, -21, 65, 70, 22, -92, -74, 0, -70, 47, -55, -51, 89, -96, 34, 
+    49, 73, -56, -96, -4, -24, 30, -9, -98, 64, -80, -63, -67, -62, -40, -30, 
+    -92, -11, 51, -13,
+  8, -54, 78, 91, 90, -15, -52, -23, 92, -75, -53, -94, 73, 55, 3, 28, -35, 
+    97, -71, -60, -68, -2, 6, 52, 39, -90, 12, -50, -67, -62, 43, -14, -24, 
+    61, -64, 96, -47, 4, 89, -81, 8, 86, 37, -99, -65, 73, -18, -81, -89, 
+    -62, -32, -88, 1, -97, 63, -100, -20, 8, -8, 65, 38, -96, 19, -60, -89, 
+    26, -8, -38, -25, -65, -33, 61, 83, 58, 66, -82, 18, 88, -61, 84, 90, 81, 
+    -39, -79, 95, 87, 67, 13, 13, 32, 20, 66, -94, 64, 36, 9, -11, 43, -93, 
+    58, 78, -81, -21, 63, -71, 67, -49, -23, 88, -41, -52, -84, -34, 97, 51, 
+    69, 11, 25, 68, -19, 24, 45, 23, 3, -66, -65, 30, 94, 21, 21, -74, -87, 
+    82, 16, -34, -3, -63, 66, 23, 87, -40, 85, 75, 39, -7, -51, 93, 72, 3, 
+    -46, -57, 40, -14, 27, -59, -27, 14, -41, -40, -66, -62, -53, 72, -25, 
+    -19, -98, 69, 96, -85, 50, -93, 38, 77, -50, 81, -85, 26, -48, 31, -83, 
+    90, 75, -42, 39, 49, 17, 29, 66, -87, 95, 22, -15, 86, 12, -71, 82, -79, 
+    86, -28, -90, -11, 60, -22, -93, -19, 50, 94, -6, 89, 78, -79, 96, -17, 
+    -21, -27, 30, 88, 56, -100, 8, 17, -50, 23, -1, -86, -5, 69, -3, -46, 89, 
+    -23, -29, -98, 49, -36, -100, -88, 65, -77, -96, -13, -67, -70, -51, 31, 
+    87, -99, -84, -66, 29, -48, -76, -97, -83, -26, 40, -63, -61, -23, -53, 
+    90, 80, 78, -36, -55, 70, -63, 38, -14, 62, -58, -61, 1, 81, -40, -9, 
+    -31, 33, 95, 8, 82, -3, 36, -21, 80, -25, 73, 80, 21, -80, 28, 46, 41, 
+    -13, -30, 21, -18, 45, -5, -73, -72, 24, -42, 11, -86, 92, 98, -65, 70, 
+    75, -85, 96, 3, 3, -11, -49, -99, -23, 78, -79, -13, 19, 7, -8, 23, -60, 
+    -90, 75, -5, -52, 24, 16, 41,
+  76, 75, -99, 37, -21, -72, -38, -29, 19, 90, 8, -81, -44, -4, -97, -8, 79, 
+    67, 73, -55, -79, -5, 85, 63, 95, -30, -19, -47, -57, 27, -84, 69, -26, 
+    -40, -3, 88, -37, -78, 84, -38, 96, -5, 94, 3, -2, 59, 54, 87, -89, 93, 
+    44, 86, 39, 58, -39, -79, -67, -39, -98, 36, -93, -10, -84, -91, -88, 
+    -67, -7, -90, -79, 77, -15, 19, 57, 82, -20, 79, -94, 23, 76, -24, 30, 
+    -59, 33, 70, -44, 51, 70, 72, -37, 54, -73, 13, -31, -3, -32, 94, -24, 
+    11, -13, -4, 2, 63, -77, 63, 7, 58, 91, -35, 91, 29, -26, 93, -17, -49, 
+    -23, 0, 97, 51, 93, -35, -29, -59, 77, -65, 56, 48, -45, -97, 65, -34, 4, 
+    -40, 7, -84, -73, -92, 27, -87, 49, 30, -28, 66, 15, -55, 87, -49, -79, 
+    50, -61, -10, -45, -98, 23, 14, -44, 5, 62, -70, 55, -10, -12, -11, -18, 
+    -22, -76, 31, -34, -57, 55, 65, -95, 48, 74, -86, -15, -33, 49, -72, 44, 
+    17, 55, 34, 23, 45, 53, 45, -56, 74, 38, 94, -21, -37, -34, -51, 87, -93, 
+    8, -27, -91, 26, 23, -66, 7, 4, -56, -66, 35, 2, -85, 84, -56, -67, -69, 
+    -34, -72, -85, 74, -15, 13, -31, -45, -6, -83, -72, -30, -100, -59, 58, 
+    -38, 76, 91, 21, -51, -86, 20, -66, -47, -87, -29, 6, -76, -7, -7, -47, 
+    6, -42, -100, 63, -86, -78, -42, 71, 17, -90, 67, -57, -14, -76, -49, 86, 
+    -88, 16, 0, -41, -50, 47, -51, -37, -95, 19, 18, 63, 46, -73, -20, -69, 
+    -19, -50, 79, 42, 80, 75, 45, -36, -54, 93, -94, 97, -100, -85, -94, -62, 
+    -33, 17, 21, 82, 70, 14, -56, 88, -68, -32, -79, -10, -86, 90, 44, 16, 
+    -79, -9, -66, -85, 74, -61, -5, -81, -4, 81, 57, -28, -47, 80, -99, -81, 
+    -55, 68, 41, 32, -55, -6, 43, -45, 56,
+  -86, 23, 37, -16, -99, 66, -45, 36, 93, 64, 95, -71, -84, -43, -21, 6, -85, 
+    -11, -29, -41, 17, -92, -94, -37, -80, -10, 79, -24, 93, -45, -88, 94, 
+    37, 28, 52, 68, 31, 18, 18, 18, 67, -27, 81, 87, 80, -32, 42, -39, 9, 
+    -14, 81, -6, -56, -91, -4, -11, -19, 84, 65, 65, 97, 91, 17, -53, -94, 
+    -11, 69, 19, -90, -17, 77, 77, -86, 87, -59, 62, -51, 90, -87, 45, 12, 
+    -72, -73, 41, -26, -80, 47, 80, 34, 3, -33, -54, -28, 5, 29, 36, -56, 7, 
+    -72, -18, 98, -48, -11, 49, -16, -85, 46, 65, 0, -66, 88, 39, 38, 98, 5, 
+    16, 85, 0, -97, 36, -45, -96, 28, -60, 9, 68, 42, 65, 13, 58, 77, -15, 
+    21, 28, 7, 68, 55, 17, -82, -86, -38, 49, 56, 47, -31, 9, -17, -46, 7, 
+    -11, 15, 86, -9, 60, -1, -73, 87, 76, 6, -70, -77, -85, -53, -48, -91, 
+    -72, 21, 76, -9, -92, 15, -98, -48, 54, -53, 59, -1, -98, -88, -30, 24, 
+    9, -25, -9, -66, 14, 53, -93, 94, 37, 74, -5, 65, -92, -91, 52, -72, -53, 
+    81, 86, -54, 69, -56, -43, 66, 44, 8, -15, -49, -67, -51, 81, 55, -80, 
+    14, 2, 17, -82, -5, 9, 52, -2, 63, -48, 13, 81, 61, -14, -66, -60, 10, 
+    69, 50, 6, 58, 8, 8, -25, -46, 68, -34, 73, -58, 30, -30, 35, -100, 13, 
+    2, -61, -74, 5, -94, 18, 23, 41, -9, 12, -41, -52, -11, -24, 82, -82, 6, 
+    -56, 33, 43, 59, 25, -21, -63, 20, 75, -70, 90, 35, 75, 18, -3, -40, -20, 
+    59, -26, -15, -51, 28, 68, -5, -94, 47, -55, -37, -98, -15, -16, -11, 
+    -68, 61, 31, 18, 27, -62, -66, -29, -51, -64, -60, 38, -5, -94, 13, 49, 
+    24, -21, 71, -84, -34, -63, -29, -50, 53, -9, 86, 83, -34, -53, -68, 7, 
+    3, 39, -7, 7,
+  -46, -41, -53, -10, 19, 10, -82, -72, -92, 95, -27, 34, -28, -11, -45, 93, 
+    -72, 97, 61, -49, -88, 31, -37, -95, 56, -9, -21, -33, -8, -38, 8, 14, 
+    -85, 97, -94, -43, 86, -96, -97, 23, -42, -99, -21, 30, -66, -84, -25, 
+    52, -94, -95, -67, -90, 53, -58, 10, -94, -44, -1, 60, 64, 31, -15, -70, 
+    -93, 5, -4, -28, 0, -54, -44, -34, -80, 37, 55, 83, -10, -87, 94, 62, 
+    -32, 32, -31, -58, -32, -13, 77, 0, 28, 5, -16, -1, 79, 43, 16, 99, -99, 
+    45, 48, 78, 20, -93, 71, -60, -31, -42, -43, 36, 41, -10, -16, 3, 85, 
+    -27, -38, 27, -26, 5, -37, 10, -58, 82, -10, -72, 36, 95, -84, -63, -80, 
+    -6, -67, -78, 70, -46, -32, -48, 55, -96, 74, 74, 3, 43, -27, 94, -74, 
+    13, -38, 92, 88, 59, -98, 11, -76, 25, -22, 54, -57, 42, -38, -58, -97, 
+    -61, 47, -40, 26, -95, 32, 91, -1, 20, -75, -12, -41, -6, -35, 22, 42, 
+    -48, -16, 47, -63, 75, 56, 98, 27, -79, -1, 67, -90, 12, 82, 40, 55, -12, 
+    55, 51, -93, 89, -94, 17, 15, -63, 57, -83, -47, -57, -65, 37, 49, -15, 
+    7, -12, -79, 63, -63, -95, 11, 57, 69, -76, -13, -89, -5, -14, -53, -78, 
+    -93, -25, -80, 4, 79, 74, 75, 49, 24, 10, 4, 59, -35, 57, -92, -3, -76, 
+    4, -43, 63, -62, 28, -45, -6, -42, 46, 81, -99, 32, -59, 85, 12, 8, -91, 
+    -37, 69, 89, -72, -78, 73, -95, 11, -44, -23, 81, -78, -97, -32, 37, 60, 
+    -62, -54, -43, -93, 77, 1, 15, -15, -15, -87, -4, -92, 60, 40, 10, 8, 
+    -27, -8, -3, -57, 31, -23, 0, -50, -92, -23, 58, 31, 5, -58, 98, 69, -68, 
+    22, -54, 85, -17, 2, 20, -22, 18, -46, 84, 76, 35, 8, -30, -24, 74, 82, 
+    -38, -36, -79, 30, 6, 94, -33, 22,
+  -86, 28, -62, -53, -31, 5, -84, 86, -49, -25, 82, 6, -69, -21, -36, 46, 
+    -50, 81, 5, -23, 16, 85, 85, 79, -99, 87, 29, 2, 61, 98, 58, -90, -21, 
+    -82, 30, -26, -24, 78, 52, -56, -69, 76, -14, -75, 56, -96, -74, -81, 
+    -16, -66, 73, -20, 89, -40, -10, 85, 46, -85, 81, 6, 19, 65, -12, -91, 
+    10, -42, 54, -73, -64, -28, -90, 48, 82, -12, 92, 66, -41, 64, -71, -49, 
+    43, -61, 37, 74, -13, -57, -100, 75, 65, 3, -9, -47, -56, -59, -22, 46, 
+    -54, -65, -17, 66, 85, 38, -31, 94, -37, -21, 2, 5, -99, 35, 22, -95, 
+    -79, -15, -73, -59, 61, -36, 69, -59, -10, -43, 15, -47, 3, -6, 9, 80, 
+    17, 85, 27, -56, 16, 8, -87, -65, -36, 78, 84, 75, -10, -18, 5, -27, -14, 
+    6, 19, -8, -62, -59, 10, -38, 15, 43, -67, -74, -42, 4, 73, 0, 33, 30, 
+    -25, -44, -89, -47, 14, -100, 96, 74, -93, 69, -33, -85, 95, -28, -48, 
+    -57, 28, 31, 81, 94, -17, -50, 80, -63, -12, -30, -31, -64, -67, 66, -3, 
+    30, 75, -27, 24, -94, -28, -82, 54, 9, 35, -83, 39, -91, -76, -6, -77, 
+    -48, -85, -67, 67, 89, 58, 51, -19, 67, 19, -27, -35, -31, -56, -91, 93, 
+    -32, 0, -68, 58, 37, -100, 34, 70, -20, 45, -85, 8, -55, -8, 32, 13, 79, 
+    32, -31, -75, 65, -6, -8, 12, 61, -75, -72, -2, -92, 3, 60, -94, -13, 93, 
+    -4, -34, -58, -25, -44, -86, -94, 12, 0, -35, 14, 77, 79, -36, 19, -84, 
+    -71, -18, 78, 0, 9, 62, 67, -9, 4, -33, -3, 23, -93, 30, -60, -82, 12, 
+    34, -1, 61, 34, -6, -100, -89, 6, 36, -77, 88, -57, -43, 16, -19, 86, 70, 
+    -49, -89, -76, -45, -46, -40, -51, 54, -10, -80, 20, -40, 26, 17, -34, 
+    -93, -13, 6, 50, 75, -39, -93, 20, 36,
+  8, -51, -75, 29, 67, -55, -23, 30, -48, 31, -73, 93, 74, -62, 87, -94, 24, 
+    58, -100, 61, 65, 89, -7, -44, 18, 19, 62, 80, -84, 39, 25, -76, 41, -98, 
+    -69, 95, 26, -73, -94, -72, 72, 7, 34, 4, 84, -76, -23, -17, -93, 71, 
+    -31, 37, -75, 12, 60, -51, 17, 50, 58, 63, -48, 61, -84, 50, -86, 11, 
+    -26, 68, -2, -40, -93, -58, 75, -1, 27, 8, -65, -55, -51, 12, -92, -26, 
+    94, -56, 48, -56, 80, -79, 6, 39, 72, 54, 46, 9, -96, -57, -33, 5, -92, 
+    -1, 68, 16, -39, -16, 26, 22, -82, 27, -94, -24, -7, -44, 1, -72, -21, 
+    38, 22, 27, -40, 11, 85, 12, -58, 28, 86, -80, 55, -68, 64, -64, 68, -69, 
+    98, 69, -41, -66, -81, -85, 43, 5, -93, 3, 57, -69, 18, -60, -93, -95, 
+    -73, 51, 17, 3, -69, 42, -14, 76, -85, 55, -78, -57, -68, 9, 46, 19, 42, 
+    -95, -56, -51, -14, 19, -60, 2, -48, 99, -97, -74, 18, -89, -60, 2, -63, 
+    -18, 91, 97, 94, 16, 9, -7, 11, 35, 91, 26, -17, -87, 43, -5, -25, -85, 
+    46, -76, -4, -13, -59, -45, -11, 58, -88, -88, -27, 66, -71, 70, 32, 64, 
+    -10, 11, 32, -46, 74, -54, 68, -50, 83, 56, 28, -91, 38, 37, 72, 47, 64, 
+    25, -37, 66, -94, -44, 62, -79, -69, 0, 26, 1, 9, 38, 32, 62, -65, 72, 
+    -3, 53, -60, -33, -98, 24, -70, 24, 97, -83, -94, -33, -36, -65, 95, -11, 
+    -19, -98, -32, 46, 97, 18, 2, 37, 54, -48, 40, 52, 79, 35, 49, 46, -77, 
+    45, 10, 26, -64, -56, -1, 36, 23, -76, -41, 15, -85, 95, -48, -19, -19, 
+    -81, -82, 23, 13, 23, -3, -71, -44, -61, -75, -68, -18, 20, 70, -90, -95, 
+    -19, 44, -52, 32, 8, 21, 70, 36, 99, 12, -12, -28, 81, -20, 24, -47, 72, 
+    75, -12, 38,
+  -24, -26, 0, -30, -92, 39, 79, -54, 86, 84, 75, -11, -44, 64, 40, -87, -75, 
+    10, -28, 96, 5, 14, -78, 17, -78, 59, -43, 99, 47, -82, -86, -60, -65, 
+    -63, -50, -58, 15, -27, 92, 86, -92, 47, -60, -70, -25, -91, -15, 21, 
+    -95, 58, 76, 42, 68, 80, 91, -52, -92, 21, 37, 41, 6, 87, 7, -74, 61, 4, 
+    -36, -5, -47, 6, 32, 66, -21, 93, 59, -72, 41, -1, -6, -18, -35, -50, 
+    -87, -93, -67, -30, 77, 56, -80, -78, -51, -4, -28, -66, -71, -37, 80, 
+    -18, 6, 21, 86, -84, -21, 63, -7, 10, 13, -65, 59, -96, 84, 12, -87, -41, 
+    68, 9, -30, -95, 60, 75, -70, -19, -89, -26, 22, 39, 63, 59, 69, -21, 56, 
+    87, 94, -11, -33, 62, 90, -83, 91, 13, 57, -28, -12, -47, 64, 29, 4, -25, 
+    -38, 93, -8, 25, 61, 85, -16, 98, -23, -11, -33, 18, -22, -59, 29, -97, 
+    -17, 48, 97, 91, -8, 8, 38, -98, 26, 32, 88, -58, 73, -4, 59, 88, -57, 
+    -10, 39, -65, -66, -82, 70, 1, -53, 1, -42, -4, -59, 37, -89, 38, 80, 
+    -90, 57, 64, -48, -83, -91, 87, 6, 54, 96, -60, -50, -69, 53, 73, 86, 
+    -29, -73, 77, 36, 59, -22, -13, 71, -67, 61, 38, 58, 6, -67, -26, 65, 
+    -83, -39, -3, 80, 86, -57, -33, 82, -93, 49, 76, -89, -40, -23, -32, -40, 
+    43, 6, -12, -55, 86, 34, -24, 31, 47, -92, 73, 68, 96, 41, -97, -17, 94, 
+    89, -94, 18, -58, 17, 29, 56, -19, -61, -80, 66, -63, -47, -37, 80, 69, 
+    -63, -9, -72, -30, 30, -65, 70, -47, 37, 33, -99, 68, -60, 41, -26, -8, 
+    -67, 11, 71, 80, 89, -95, 25, 36, 54, -84, 30, 12, -70, -82, -60, 98, 15, 
+    -57, 42, 95, -34, -52, 92, -7, -97, -84, 5, 46, -14, -75, -72, 66, -32, 
+    43, 89, 23, -29, 95, 51,
+  23, 13, 78, 57, 46, 47, -14, 31, -49, -4, 1, 33, 97, 19, -12, 72, 99, 0, 
+    61, 88, 95, -79, 46, 40, 6, -27, 56, -19, -74, -45, -8, 89, -76, -39, 
+    -71, -50, -56, 67, -30, -3, -3, -82, 73, 49, 97, -56, 58, -39, -5, 87, 
+    -35, -73, 79, -82, -96, 35, 26, 25, 99, -3, -82, 31, -98, 30, -86, 36, 
+    -51, 59, -80, 24, 18, 64, 78, -52, 45, 17, 56, -57, -77, -5, -100, 27, 
+    21, -35, -58, 24, -19, 10, -99, 30, 27, -48, 90, -33, -84, 48, -8, -64, 
+    51, -55, -7, -70, 0, -96, 1, 30, -76, 65, 28, 9, -2, 17, 15, -3, -84, 15, 
+    -68, 39, -27, 66, 50, -84, 31, -58, -3, 10, 29, 28, 39, 26, -34, -94, 
+    -99, -93, 11, 52, -100, 28, -1, 5, -53, 73, -21, -49, -12, 17, -33, -99, 
+    -52, -76, -90, 78, 5, -53, 75, 63, -59, -6, -84, -33, -81, 16, 93, -61, 
+    -10, 82, 27, 7, 68, -69, 72, -71, 16, 61, 27, -54, 96, 91, 5, 99, -78, 
+    -28, 72, -61, 47, 7, -75, 88, -11, -43, 72, -78, -82, -62, 40, -92, -37, 
+    90, -39, -91, 72, -86, 26, -78, -71, 40, -1, 96, 31, -73, 58, -38, -25, 
+    48, 46, 36, -48, -93, 63, 10, -25, -28, -67, 84, 79, 52, -72, 54, -81, 
+    -97, -59, 87, -61, 8, -93, 55, 52, -70, -91, 83, 6, 69, 14, -87, 35, -92, 
+    -50, -57, 1, -71, 87, 0, 78, -92, 1, -1, -3, 91, 46, 30, 36, -8, 37, 93, 
+    82, 53, 20, -68, 41, 28, -44, 7, 61, 41, -58, -74, 96, 84, 83, 53, -95, 
+    -38, 91, -88, 46, 34, -57, -11, 89, -60, 44, -61, 29, 20, 78, -79, 52, 
+    32, 95, 14, 57, 81, -38, -86, -55, 24, 75, -88, 23, -69, -80, 10, -23, 7, 
+    -38, 8, 89, -4, -79, 4, 57, 29, 1, 76, -27, -31, 2, 55, 59, -99, 90, -86, 21,
+  71, -31, -16, -23, 42, -98, 70, -75, 7, 7, -50, -21, -78, 40, -1, -56, 70, 
+    43, -33, 67, -10, -22, -17, -62, 72, 82, -24, 41, 45, -41, 82, 51, -19, 
+    -25, -68, -73, 78, -2, 71, -34, 31, -27, -7, -27, 55, -46, 64, -91, -9, 
+    1, 36, 25, 8, 13, 13, -73, -7, 29, 21, -82, 73, -69, 48, -79, -79, -54, 
+    -17, -22, -32, 38, 70, 87, 80, 91, -34, -43, -17, -56, -58, -27, 39, 16, 
+    -58, -97, 53, 10, 6, 86, -41, 40, 79, -95, 82, 27, -37, 9, -47, 66, 72, 
+    7, -14, -34, 31, 66, -55, 68, -10, 53, -78, 16, -11, 48, -32, -49, -46, 
+    97, 35, 56, -52, 5, 51, 74, -34, -66, 31, -18, 79, 52, -8, -26, 29, -90, 
+    -63, -53, 54, 51, 63, -100, -74, -23, -82, -1, -3, -71, -17, -86, 73, 34, 
+    -7, 79, -61, -95, -17, -61, 70, -87, -15, -38, 4, 64, -19, 0, 89, 55, 10, 
+    -23, 64, 69, -58, -5, -14, 84, -82, 2, 35, 41, 13, 19, 3, -20, -4, 50, 
+    65, -32, -79, 88, -60, -27, -21, -49, -95, 31, 4, -53, 80, 21, 48, -69, 
+    29, 86, -94, 36, 78, -61, -56, 51, 69, 82, 49, 75, -38, -26, -44, -35, 
+    65, 5, -48, 20, 24, 9, 63, -99, -62, -7, 92, 51, 70, -65, 64, 93, -14, 
+    -29, -9, -87, -12, -34, -77, 70, 54, 51, 26, -20, -60, -46, 30, -2, -98, 
+    -88, -45, -85, 70, -50, -47, -9, 48, 9, 98, 64, -26, 96, 75, 57, 57, -6, 
+    -89, -65, -38, -5, 17, -46, 68, 35, 99, -71, -69, 70, 92, -78, 58, -5, 
+    89, -27, -11, 30, 28, 35, 77, -87, 97, 21, 52, -75, 58, 33, 54, -81, -44, 
+    38, 9, 24, 20, -16, -72, -47, -87, -50, -87, -3, 42, 7, 11, 62, -67, 2, 
+    83, -92, 57, -25, -31, 6, 22, -98, -47, -74, 11, 94, 72, -70, 11, 50, 
+    -30, -46, 76,
+  -42, 4, 21, 94, -13, 30, 21, 7, -76, -70, -35, 73, -55, -65, 90, -84, 65, 
+    54, -99, -78, -91, -56, 63, -78, -97, -56, 90, 43, -39, -51, -98, -56, 
+    32, -84, 99, 95, -100, -9, -5, -24, 10, 97, -14, 63, 91, -73, -100, 59, 
+    53, 6, 51, 71, 26, 52, 47, -96, 32, -30, -98, 92, -67, 45, -38, 29, -67, 
+    79, -59, -61, 66, -27, 12, -32, -71, 18, -9, -61, -34, -1, 18, -23, -22, 
+    7, -57, 12, -69, -14, -45, 56, -80, -77, -14, 37, -68, 40, -67, -45, -23, 
+    23, 99, -31, -78, 47, -46, 21, 88, 41, -14, -57, 54, 47, -10, 49, 44, 
+    -65, -40, 7, -61, -64, 35, 65, 88, 78, -98, 11, -85, -57, 60, -24, 92, 
+    -8, -96, -84, -92, -8, -56, -66, -9, 36, -34, 96, 91, -33, 53, 23, -40, 
+    -42, -19, -97, -77, 62, 89, 1, 93, -16, 40, 92, -34, 22, -33, 26, -2, 4, 
+    -23, -5, 68, -33, 28, -96, -11, -66, 70, -35, -91, 19, -32, 93, -78, 80, 
+    -5, 51, -75, 82, -89, -70, -25, -5, -14, 51, -50, 10, 19, -3, 18, 4, -43, 
+    69, -56, 61, -48, -89, 71, 48, -47, -5, -84, 27, 4, -95, 3, -82, 32, -75, 
+    38, -36, 89, -12, -39, -36, -8, 1, 41, 53, -63, 7, -65, 86, -1, 16, 16, 
+    13, 4, -76, 8, 60, -14, 56, -88, 81, -63, 21, 67, 83, -10, -19, -18, 4, 
+    20, -17, 80, -53, 44, -54, -2, -42, -28, -8, -42, 85, 89, 93, -3, 33, 
+    -82, 79, 32, 22, 11, 75, 14, 29, 1, 45, 81, -54, 23, 72, -91, -73, 70, 
+    -79, -22, -45, 48, -61, -45, -31, -86, -41, -100, 55, -54, 3, -4, 86, 7, 
+    14, -28, -18, 69, -34, 90, -89, -33, -1, 10, 86, 99, 55, 98, 95, -56, 61, 
+    -80, 20, 55, 13, -79, 31, 85, 67, -47, -36, 85, -89, 30, 35, -53, 57, 24, 
+    6, 14, 67, -16,
+  -60, -55, -83, -48, 20, -65, 68, -16, 82, -4, -72, -62, -75, -85, 11, -69, 
+    12, 76, 45, 51, -23, -52, 48, -83, -1, 9, -16, -34, 68, -50, 3, 87, -12, 
+    -71, -73, -88, 4, -90, 77, -89, 82, 96, 28, -41, -33, 47, -32, 27, 39, 
+    -28, 21, -97, -51, -11, -33, 79, -49, -94, -87, -19, -66, -62, 78, 73, 
+    79, -45, 88, -48, 90, -14, 46, -1, -98, -15, -22, -4, 91, 26, -56, 78, 
+    -96, 78, 71, -83, -17, 68, -35, -97, -98, 24, -28, -88, -51, 82, 35, 47, 
+    38, -66, 53, -82, -34, -5, -53, 99, -28, 28, -63, -65, 7, -22, -60, -60, 
+    -28, -98, 45, -46, -27, 38, -53, -2, 19, -96, -31, -27, -61, -58, -70, 
+    -42, 91, 14, 40, -96, -54, 18, 63, -89, 91, -18, -27, -8, -80, -77, 46, 
+    -13, -69, -93, -87, 93, -9, -94, -28, 33, 21, -53, 26, 57, -7, 90, -11, 
+    25, 54, 17, 69, 81, 56, -82, 90, -84, -4, -91, -84, -83, -96, 84, -45, 
+    94, -86, 26, 8, -88, -98, 83, -6, 28, 93, 99, -64, 19, -18, -97, 48, 9, 
+    86, -71, -2, 77, 38, -92, -91, -63, 23, 1, -13, -70, 2, 25, 84, 39, 13, 
+    47, -74, 49, 5, -23, 50, 1, -66, 29, -48, -23, -86, 87, -60, -19, -32, 
+    -10, -81, 68, -94, -68, 40, -100, -62, 34, 45, 6, -73, 28, -86, -22, -30, 
+    -48, -8, -24, 60, 98, -69, 1, -29, 99, 13, -59, -93, -24, -41, -80, -47, 
+    50, 78, -36, 92, 88, -85, -58, 40, -23, -48, -66, -82, -86, 25, 58, -47, 
+    58, 16, 1, 98, 27, 42, 65, -77, -73, -49, 92, 94, 31, -4, 49, -83, -31, 
+    16, 3, 45, 15, -58, -52, 3, 79, 49, 89, 58, 46, 56, 66, 87, -85, -35, 
+    -21, 30, -97, -37, -96, 99, -6, 73, 80, 74, -24, -27, 13, -27, -99, -90, 
+    92, 22, -47, -39, 0, -50, -29, 0, -59, 69,
+  3, 86, -9, -67, 36, 69, 63, -31, 83, -100, -28, -3, -3, -29, 16, -92, -85, 
+    61, -45, 64, 87, -49, -93, 4, -20, 4, -16, 96, 92, -9, -34, 11, -69, 75, 
+    -20, 8, 55, 27, 15, 22, 53, -19, 25, -82, 92, 88, 18, 86, -58, 74, 99, 
+    -39, 22, -1, 12, 37, 66, -61, 16, 58, -95, 91, 53, -39, -97, 20, -4, -26, 
+    31, 53, -30, -87, 79, 19, 95, -75, 85, -61, -89, 85, 79, 10, 21, -87, 
+    -91, 48, -28, 43, -32, -68, 58, -48, 61, 24, -51, 79, 70, 74, -91, 82, 
+    -8, 21, -56, -14, 5, -22, -94, 89, 92, -11, 63, -1, 48, 27, 63, -58, -27, 
+    1, -66, -77, -60, 58, -52, 49, -79, 98, -22, -29, -91, 68, 72, 30, 63, 
+    -44, 34, 48, -70, -50, -35, 73, 16, 6, 16, -61, 66, -41, 44, -78, 92, 
+    -95, 53, 96, -18, -22, 15, -62, 44, 89, 57, 5, 6, -60, -50, -16, -21, 94, 
+    -40, -100, -94, -80, -74, -21, -100, -100, 97, -76, 18, 57, 50, 24, -52, 
+    89, 68, -43, 93, 40, -73, 1, -3, -35, 50, -32, 85, -4, -45, 50, -37, 42, 
+    80, 80, 78, -56, -89, 77, -58, 15, 85, 63, 98, -84, 80, 68, -61, 17, -17, 
+    -7, -39, -8, -20, 12, 31, 41, 4, -88, -16, 73, 67, -25, 38, -5, -38, -69, 
+    52, -64, 29, -85, 27, 93, -67, 38, 69, -5, -52, -81, 21, 37, 98, -53, 
+    -27, 92, 7, 52, 9, 56, 42, 71, 76, 52, 82, 57, 2, -24, -55, -3, -85, 40, 
+    64, 67, -28, -70, -63, 9, -49, 96, -62, 61, -83, -71, -31, -46, 82, 47, 
+    -16, 5, -67, 12, -85, 0, 57, 0, 72, -52, -9, -94, 49, -83, -55, -53, -65, 
+    38, 16, 77, -21, 27, 65, -89, -79, -76, -60, -20, 27, 9, 63, 97, -28, 3, 
+    95, 0, -38, -71, 80, 32, -45, 79, 20, 72, 77, -86, -32, -15, -57, 24, 79,
+  -100, -18, 9, -54, 8, 40, 33, -85, -54, -8, 19, 92, -40, -36, 29, -3, 12, 
+    54, -65, 62, 1, 6, -37, -63, 54, 10, -67, 48, -15, -80, -34, 90, 10, -21, 
+    98, 32, 34, 94, 15, 87, -36, -1, 36, -46, 78, -25, -2, -9, 79, -18, -36, 
+    7, 88, 49, -42, -52, 49, 45, 63, 9, -10, 99, -86, 97, 61, -10, 34, -87, 
+    -50, -9, -66, 51, -21, -63, 53, -57, 79, 6, 54, -91, -3, -26, -95, -47, 
+    -71, 14, 29, -56, 28, -21, 35, 40, -27, 48, -13, 69, -95, -51, -33, -42, 
+    1, -38, 4, 14, 29, -27, 81, -11, -18, -21, 91, -59, 94, -97, -64, -5, 
+    -60, -87, -65, -29, 30, -68, -91, 19, -19, 35, 25, 45, 14, 59, 76, 56, 
+    -78, 86, -91, 27, -38, -72, 93, 56, 47, 40, -34, 45, 6, -84, -21, -71, 
+    -9, 97, 24, -67, 67, -85, 66, -88, 32, -66, 8, 42, -50, -79, 40, -42, 
+    -67, -58, -29, 32, -8, 90, 30, -28, 68, -97, 17, -50, 2, -26, 61, 92, 
+    -25, -19, -62, 11, -3, -20, 13, -16, 46, 17, -84, 14, 15, -25, -97, -61, 
+    4, 38, 73, -53, -40, 44, -41, 62, -54, 91, -38, -83, 26, -77, 68, 58, 
+    -69, 43, -59, -89, -78, 11, 81, 59, -3, -49, 3, -9, 92, -91, -63, -42, 
+    83, 38, 70, 62, 45, 20, 46, -27, 93, -76, -14, 70, 2, 72, 42, 15, 6, -92, 
+    7, -28, -15, -52, -91, 13, 81, 13, -24, 66, -82, -13, 26, -54, 38, -57, 
+    -8, 75, 10, 37, -36, -83, 93, -92, 91, 15, 36, -90, 92, -82, 9, -88, 55, 
+    23, -92, -9, -2, 11, 61, 49, -96, -55, 11, 89, -49, 79, 3, 15, 13, 15, 
+    96, 10, -33, -15, 91, 76, 99, -45, -31, 25, 5, -85, -31, -18, 87, -87, 
+    -27, -63, -4, -17, 25, 22, -37, -85, -5, 37, -54, -3, 5, 0, -45, -85, 
+    -51, 57, -85, 57, -45,
+  -96, 11, 49, 15, -52, 71, 58, 19, -77, 50, 46, 59, 42, 12, 68, 44, 69, 4, 
+    31, -57, 33, -14, -73, 99, 14, 36, 35, 93, -45, 38, 12, 25, 90, 63, 2, 
+    44, 82, -87, 98, -71, 85, 7, -39, 90, 53, -44, -95, 89, 78, -95, -51, 60, 
+    68, -28, 23, -62, -77, -28, -16, -26, 63, -54, 30, -20, -2, -84, -87, 66, 
+    27, 94, 80, 88, 21, -59, 82, -51, -19, 2, -87, -51, -92, -42, 55, -21, 
+    93, -49, -22, 43, 20, -94, 47, 31, -91, -58, 57, -77, 18, 91, 79, 19, 84, 
+    -14, 86, 45, -71, -14, -45, -55, 39, 18, 19, 24, 45, -7, -23, -97, -19, 
+    98, -3, -65, -18, 89, -51, -81, 9, -71, -7, 19, 2, 56, -53, 90, -50, -52, 
+    31, 23, 19, 8, 6, 98, -38, 93, -17, -36, -15, -46, 29, 87, 36, -11, -46, 
+    -30, -18, 43, -33, 46, 40, 65, 47, 97, 17, -77, 14, 44, -95, -3, -20, 
+    -15, 11, 42, 25, -13, -12, 91, 42, 59, 1, -92, -4, 31, 53, -33, 85, 8, 
+    -92, -2, -52, -41, 98, 69, 62, 95, -61, 30, -71, 4, -76, -37, 89, -54, 
+    -78, 85, 96, -66, -72, -2, 3, -42, -16, 46, -2, 52, 33, -6, 58, -59, -89, 
+    -54, 39, -93, 42, 37, -91, 49, -19, -23, 65, -11, -6, 78, 2, -10, -68, 
+    53, -91, 13, 10, 93, -45, -63, 51, 73, -81, -11, 28, 57, -7, -52, 49, 
+    -39, 58, -16, 89, 31, -45, -69, -92, -25, 63, 61, 26, 15, 41, -80, -51, 
+    69, 34, -47, 62, 15, -23, -37, -89, 49, -24, -92, 83, 55, 61, 20, -40, 7, 
+    -78, -86, -53, 3, -50, -87, 21, -28, -79, -54, 68, 6, 37, -30, 81, -43, 
+    75, 99, 69, 34, -84, 87, 72, -79, -40, 69, -52, -77, 51, -74, -55, 42, 
+    -33, 27, -68, -53, -94, 57, 98, -78, -61, -56, 54, -5, -47, 93, 39, 78, 
+    47, -27, 40,
+  34, 60, -72, -69, 41, -34, -35, 77, 84, 39, 16, 42, 88, -6, -94, -65, 74, 
+    88, -59, 64, 72, 56, 30, 1, 33, 99, -44, 37, -62, 53, 2, 93, -58, 82, 9, 
+    -21, -32, 76, -82, -67, 69, -75, -64, 91, -74, -41, -99, 0, -65, -25, 
+    -16, 65, 89, 99, -65, -28, 8, -16, 80, -92, 98, 69, 71, 78, -62, 98, 32, 
+    -41, 99, -20, -7, 50, 44, -19, -63, -48, 24, -10, 81, -71, -99, 19, -42, 
+    -94, 90, 69, -57, 7, 17, 91, -7, 88, 21, 20, 84, 53, -3, -34, 51, -4, 68, 
+    -37, 43, 81, 40, -4, 6, -83, -12, -57, 25, -17, 20, 90, 14, -78, 78, -87, 
+    12, -88, -16, 37, 30, 54, -1, -29, -31, 53, -17, 47, -81, 82, -59, -17, 
+    -85, -76, 30, -72, 36, -92, -94, -35, -3, -70, -39, -49, -50, 31, 4, -87, 
+    -53, 73, 98, -4, -91, 99, -13, 12, 22, -53, 35, 84, 57, 32, -62, -51, 72, 
+    -30, 91, -59, 4, -46, -97, 7, 19, -98, -78, -82, 81, -38, -76, 51, 86, 
+    -63, -96, 96, -55, -32, -74, 47, 68, 91, 43, -96, -12, -59, -64, -67, 86, 
+    78, -35, 93, -4, 18, 78, 80, 81, 30, 48, -3, -33, -92, 52, -41, -38, 40, 
+    4, -2, -27, -42, -95, -83, 30, -55, 50, 9, -74, 77, -45, 95, -62, 68, -6, 
+    46, -93, 64, -20, -96, 39, 61, -50, 38, -37, 48, 42, -83, 30, 48, 65, 73, 
+    -36, 48, -67, 41, 69, -59, -75, 77, -95, -41, 66, 57, -7, 28, 97, 62, 
+    -27, 48, -11, -87, -52, -60, 98, 8, 91, -49, 93, -77, 89, -55, 62, 9, 
+    -16, 47, -93, -10, 27, 49, -28, 99, -97, -93, 16, 43, 54, -80, -51, 41, 
+    9, 41, -56, 71, 8, -28, 49, 0, 18, -93, -46, 53, -90, -22, -18, -61, 57, 
+    9, -8, 80, 75, 37, 36, 24, -93, 57, -15, 63, -54, 4, -85, -80, 5, 12, -19,
+  -5, 3, -16, 99, -11, 24, 30, 87, -84, -31, -39, 26, 4, -74, 16, 20, -65, 
+    -43, -27, 94, 45, 26, 54, -16, 58, -43, 92, -69, -19, 99, -35, -95, 98, 
+    6, 20, 74, 88, 2, 8, 55, 13, 17, 34, -95, -59, 75, 52, 92, 90, 6, 88, 94, 
+    35, -49, -85, -17, -9, -27, -47, 44, -41, -17, -83, 19, -14, -87, -21, 
+    -5, -37, -18, 90, 88, 70, -68, 33, 28, -84, 76, 4, 98, -49, 29, -11, -3, 
+    -76, 72, -4, 37, -40, 43, -23, 7, -7, 68, -7, 24, 1, 98, 22, -80, 7, -92, 
+    38, 22, 77, -42, -40, -53, 94, 50, -52, -82, -49, -89, -77, -67, -92, 28, 
+    11, -93, 54, -90, 80, 32, -63, -66, -47, -2, -83, -44, -39, 71, 75, 76, 
+    3, -47, 24, 6, -61, 42, -21, 75, 47, -87, -27, -33, 99, 94, -44, 76, -44, 
+    13, 29, 69, 2, 74, 44, -63, -97, -64, -69, 48, -69, 74, -44, 74, -65, 
+    -85, 26, -75, 27, -52, -6, 33, 82, 81, 42, -96, 36, -49, -93, 73, -33, 
+    69, 17, -77, 48, 10, -32, -55, 85, 50, 7, -4, 89, -90, 40, -40, -78, 15, 
+    -100, -54, -6, -33, -95, 8, 97, 53, 66, 60, 33, 13, -90, 20, 1, -22, 18, 
+    64, -17, -33, 38, -38, 5, 30, 51, 76, 91, -71, -59, -19, -25, 34, -35, 
+    -99, -83, -60, 85, -59, -87, 19, -57, 78, -52, -1, -57, -63, -89, -99, 
+    -7, 78, -47, 54, 54, 30, 87, -45, -12, 6, 55, 78, 94, 69, -52, -43, -66, 
+    -9, 72, -17, -54, 70, -11, 41, -52, -53, -3, -58, 95, 86, -93, -33, 30, 
+    -97, 28, 70, -35, -2, -24, -39, -79, 18, -77, 15, 93, -36, -87, 90, 85, 
+    85, -53, -80, 84, 99, 43, -31, -6, -88, 59, 86, 68, 45, -20, -51, 3, -28, 
+    30, -26, 50, -31, 91, 25, 20, 86, 35, 74, 88, 8, -37, 58, -34, -93, -82, 
+    -95, -68,
+  36, -59, 52, 43, 25, 52, 0, -21, -6, -6, -34, 56, -53, 39, -56, 54, -85, 
+    -84, -54, 10, -75, 54, 74, -39, 73, -72, -20, -59, -80, 19, 16, -69, 1, 
+    -83, 91, -98, -57, -81, 40, 41, -89, -27, 16, -22, 24, -17, 62, 27, -40, 
+    82, -11, 69, 35, -8, -97, 14, 30, 16, -79, -71, 99, 42, 36, 22, 6, 52, 
+    -6, 81, -15, -96, 21, 46, -17, 95, -19, -48, -95, 3, -57, 4, 65, 16, -2, 
+    46, -99, -49, -40, 45, 63, -83, 53, 85, 18, -47, 37, 39, -11, 77, -79, 
+    -40, 21, 35, 56, 11, 34, -11, 71, -54, -69, -84, 75, 92, -58, -4, 93, 
+    -51, -100, -12, -5, -21, 24, 47, -70, 15, -72, -81, -20, -79, -66, 56, 
+    -54, 92, 39, 66, -2, 47, -75, 56, 96, 29, 14, 73, -49, 57, -63, 32, 69, 
+    65, -48, -3, 50, 88, 33, -61, -24, -81, -70, 45, 60, 77, 40, -73, -2, 96, 
+    4, 92, 14, -51, 35, 41, 86, 24, 78, -59, 51, -4, -55, -59, 62, 43, 44, 
+    52, 3, -17, -4, -88, 41, -87, -28, 85, -10, 10, -49, -66, 45, 80, 47, 
+    -99, -40, 17, 42, 66, -93, 57, 25, 92, -61, -34, -32, -60, -76, 33, 43, 
+    -61, 14, 99, 77, 14, -86, -98, 41, 72, -19, 30, 18, -48, 10, 27, 98, 8, 
+    -3, 3, 59, -36, -94, 51, -2, 58, -6, 43, 55, -6, 65, 21, -54, 11, 82, 30, 
+    -22, -75, -88, 55, -25, -60, 59, 99, 22, -25, 25, 73, -80, -21, 5, 96, 
+    -1, 98, -86, 50, -10, -8, -9, -25, -39, 68, -41, 25, -16, -93, 13, -92, 
+    -99, 5, -18, -86, -89, -25, 30, 4, 72, -62, -42, -20, 82, -79, -43, -5, 
+    -100, 49, 54, 10, -27, -92, -83, -60, -4, 17, -14, -73, -3, -81, -85, 82, 
+    -42, -76, -96, -100, 6, 74, 59, 33, 24, -36, 19, 88, 87, 84, 42, -13, 
+    -57, 87, 3, 46, -93,
+  -66, -94, -56, -53, 31, 2, 63, -32, 94, 76, 90, 32, -72, -91, -7, -39, -8, 
+    76, 24, 33, 33, 1, -4, 33, 61, -2, 85, -56, 49, 78, -58, -32, -37, 39, 
+    -32, 58, -93, -82, 72, 45, 11, 35, -86, -28, -29, 54, -83, -95, 33, -100, 
+    -71, -40, -72, -36, 65, 78, -46, -4, -15, -89, 27, 14, 33, 20, -26, 43, 
+    31, 32, 8, -27, 75, 68, -1, 79, 28, 90, 2, 88, 52, 15, 12, 67, -80, -29, 
+    25, 9, -33, -70, -99, -4, 20, 54, 14, 5, -58, -6, 51, 40, -1, -43, -11, 
+    71, 22, -31, 12, -83, 66, -34, -26, -35, -75, 15, 24, 19, -3, 3, -3, 58, 
+    42, -10, -57, 82, 60, -46, 81, -44, -36, -21, 57, -20, 82, -38, 15, 87, 
+    83, 53, -7, -16, 75, -60, 47, 91, 94, -57, 87, -36, -96, -89, 10, 60, 
+    -36, 86, 85, 1, -35, 63, -27, 93, 81, 91, -30, 92, 75, 64, -29, 57, -74, 
+    16, -25, 86, -82, 56, 26, -97, -9, -87, -33, 0, -2, 0, -95, 94, -17, 
+    -100, 56, -18, -47, -96, 91, -69, -60, 66, 42, -76, 95, 80, -3, 24, -61, 
+    -9, -19, -42, 29, 52, -1, -10, -55, 4, -9, 29, -50, -21, 26, -85, -48, 
+    71, 51, -30, -62, 65, -41, 89, 20, -27, -92, -73, 90, -67, 20, -46, 42, 
+    31, -95, -43, -12, 21, -35, -34, 20, -5, -35, 33, -7, -42, 56, 19, -38, 
+    19, 68, -54, -46, 30, -52, 68, 7, -17, -46, 11, 40, -93, 4, -18, -73, 
+    -48, 71, -2, 86, 1, 38, -49, -86, 22, 67, -91, 45, 79, 49, -95, -33, 0, 
+    -1, -80, -71, -89, 12, -3, -24, -54, 92, -58, 55, -95, 85, 85, 86, -94, 
+    -92, 4, 73, -95, -85, 72, 56, 70, -77, 93, 93, -58, 66, 47, -45, 77, -83, 
+    -50, -73, -59, -68, -84, 4, -62, -81, 71, -85, 52, 3, 54, -56, 34, 25, 
+    75, -57, 79, -82,
+  4, -70, 44, 71, -22, -56, -9, 87, 39, -66, -25, -29, -41, 79, -18, 29, 41, 
+    80, -78, 9, -90, 37, -66, 55, 40, -45, 65, 84, 52, -90, -95, -91, 79, 
+    -51, 23, 63, 57, 96, -90, -56, 12, 22, -65, 4, -89, -30, -72, -80, 77, 
+    54, 7, 67, 30, -31, 69, 59, -33, 29, -14, -8, -93, -67, -95, -59, -51, 
+    35, 76, -15, -60, -24, 2, 47, -40, -1, 71, -34, 99, 48, -79, 37, 19, -64, 
+    -58, -8, -39, -21, -78, 85, 56, 1, -91, -29, -77, 3, -11, -97, -58, -29, 
+    78, 36, 72, -3, -35, -33, 32, 79, -36, 45, 63, 16, 45, -91, 67, 87, -48, 
+    -68, 22, 27, -18, 67, -27, 67, -24, 13, 56, 29, 84, 14, -67, 3, 36, 6, 
+    -44, 93, 47, 6, 58, -94, -35, -38, 35, -43, 67, 1, -18, 55, -26, 62, -43, 
+    -11, -13, 91, -26, 2, 77, -3, -54, -44, -47, 28, -23, 13, -62, 8, 75, 
+    -54, 17, 74, 24, 65, 9, -81, 85, -6, -99, 64, -88, -7, -5, 78, 43, -63, 
+    -76, 36, 91, 62, 24, 98, 1, 30, -64, 65, 64, 19, -88, 63, -61, 12, -94, 
+    46, -49, 89, 18, 98, -94, -56, 46, 8, -47, 44, -97, -96, 69, 88, -65, -3, 
+    -90, -63, -22, 83, 14, -96, 11, 68, -33, 62, 44, -61, 82, -99, -47, 5, 
+    -95, 82, 68, 9, -59, -71, -30, 70, -16, 71, 76, -100, 52, 62, -34, -8, 
+    31, 1, -75, -100, -60, 89, 70, -30, -29, 14, 2, -38, -43, 73, -6, 73, 13, 
+    -72, 35, -92, 56, 32, -33, -85, -14, -65, -11, -7, 30, 32, 80, -19, 14, 
+    -75, 40, 17, -38, 7, -78, 26, 61, 89, 74, 43, 80, 71, -50, -10, 75, -94, 
+    49, -12, -26, 64, -33, 11, 8, -38, -28, 41, -88, -35, 51, -57, 61, 61, 
+    47, -87, -2, -36, 12, 65, -30, -17, 23, -49, -35, 5, -92, 2, 23, 72, 47, 
+    82, 4,
+  -8, -90, -16, 71, -74, -12, 98, -89, 69, 58, -98, 52, -13, -17, -53, 63, 
+    98, 82, -90, -17, 71, -85, -92, 91, 46, 40, -22, 3, -63, 66, -33, 18, 29, 
+    11, -71, 92, -69, -93, 72, 97, -72, -71, 99, 25, -38, -88, -75, 46, 63, 
+    87, -67, -94, -92, 94, 29, 76, 2, 60, -11, 60, -1, 31, -79, -86, -26, 66, 
+    96, 11, 41, 38, 11, 97, 29, 85, -24, 95, -52, 29, 96, 3, -89, 88, -86, 
+    -79, 58, 88, 86, 63, 37, -33, 46, -87, -97, 49, 10, -62, 48, -76, 64, 
+    -80, 78, 63, -38, -22, -3, 28, -75, -2, -72, 71, -90, -22, 23, 64, -100, 
+    -53, -8, -34, 41, 21, 22, 17, -62, -84, 75, 56, 36, 23, -22, 73, 94, 62, 
+    -3, -10, -89, 93, 71, -44, 47, 84, 35, 48, -40, -88, -37, -48, 3, 61, 
+    -55, 86, -28, -63, 58, -97, 27, 61, -81, 94, 18, -6, 94, -49, -45, -82, 
+    -75, 48, -77, -8, -7, 87, -43, 62, -23, 47, 72, 16, -96, -58, 71, 13, 79, 
+    39, 37, 82, 72, -50, 24, 83, -42, 53, 81, -95, 95, -33, 72, 58, 42, 98, 
+    -22, 1, 45, 65, 67, 26, 64, -10, 92, 77, -49, 11, 98, 57, 53, 88, 92, 
+    -13, 12, 55, 8, -55, -8, 31, 44, -77, 38, 1, 91, -39, -37, 7, 19, 16, 25, 
+    -52, 77, -2, -81, -83, 94, 79, 20, 46, -3, 61, 6, -47, 89, -69, -71, 48, 
+    -64, -35, 40, -93, -99, -85, 36, -84, -96, 79, 15, 65, 9, -77, 52, 30, 
+    99, 29, -20, -38, -48, -9, 73, -95, 14, -24, 56, 53, 29, -15, -5, 1, 82, 
+    53, -21, -65, 5, -39, -50, 66, 31, -68, -45, 43, -66, -37, 83, 92, -41, 
+    83, -2, 54, -47, -5, -36, 65, -15, 96, -82, -27, -62, -82, 74, 92, 88, 
+    89, 39, 17, 38, -92, 99, -80, 18, -37, 48, -73, 9, -76, 85, 20, -64, -74, 5,
+  -61, -2, 25, -96, 61, 34, -83, 4, 95, -7, -78, -60, -21, -58, -1, -4, -100, 
+    -85, -81, 14, -42, 58, -80, -61, 21, -15, 66, 71, 2, 8, -52, 99, 16, 6, 
+    -1, -90, -50, 28, 83, -1, -38, 67, -58, -100, 73, -95, -25, -72, 16, -44, 
+    73, 72, -19, -80, 47, 45, 1, -78, -10, 72, -85, 60, -15, -55, 41, -100, 
+    70, 81, 97, -71, -41, -97, 84, -64, -89, -39, 90, -59, -29, 17, 55, -87, 
+    69, -65, 95, -99, 15, -23, -56, -14, 17, -26, -18, 16, -22, -11, -40, 84, 
+    -73, -50, -44, 81, -66, 63, 88, 14, -36, -51, -14, 42, 53, 74, -98, 29, 
+    -29, 77, -7, 35, 11, 1, -3, -2, 37, 48, 37, -99, -6, 28, 27, -94, 59, 
+    -40, -50, 61, -45, -43, 46, -56, -63, 58, 10, -87, -19, -25, -51, 55, 
+    -28, 50, 26, 38, 23, -83, 20, -60, 65, -47, 85, -24, 89, -93, -49, -27, 
+    61, 80, -9, 29, -36, 89, -68, -90, 46, 95, -66, 70, -93, 44, -99, -94, 
+    19, -59, 13, -50, -16, 22, -43, -31, 81, -43, 7, 25, 24, 11, -81, -91, 
+    -89, -96, 72, -76, 9, -69, -98, -51, -30, -16, 61, 72, 5, 50, -84, -30, 
+    97, -73, 35, 27, -54, -14, 65, 20, -39, -47, 5, -35, -21, -60, -80, 35, 
+    99, -54, 70, -40, 60, -13, -78, -75, -19, 80, 73, -4, 22, 7, -98, -81, 9, 
+    44, -91, -67, -11, 86, 1, 6, -7, 23, 91, -82, -68, 98, 1, 21, 6, 40, -79, 
+    -11, -45, -94, 21, -72, 71, 0, -70, 9, -77, -8, -93, -42, -74, -95, -25, 
+    -51, -79, -79, -94, -60, 13, 83, -86, -4, -93, -4, 64, -1, 23, -63, -49, 
+    46, 94, -77, 50, -18, 36, 90, 63, -48, -8, -86, -96, -13, -84, 48, 93, 
+    66, -1, 1, 45, 5, 73, -57, -12, -43, -43, 24, 11, -34, -65, -1, -46, -92, 
+    -6, 81, -90, 55, 30, 42, -32,
+  29, -91, 82, 85, 50, -68, 35, 57, -2, 55, -39, -32, 18, 89, 69, -78, 7, 20, 
+    -77, -5, 42, 28, -17, -90, -53, 16, 43, -7, 53, 81, 10, -66, -36, 25, 
+    -79, 9, -13, 85, 60, -83, 59, -37, -56, -54, -79, -3, 15, -8, 86, -36, 3, 
+    2, 14, -88, -41, -31, -12, -69, -32, 73, -19, -61, 36, -77, -71, 25, 10, 
+    17, 65, 21, 48, 6, 41, -78, -12, 35, -36, 13, -26, -29, 7, -97, 85, -70, 
+    -90, 22, -79, -3, -7, -80, -21, -24, -77, -26, 97, 62, -83, 5, -100, 98, 
+    -63, -41, 5, 96, -73, 96, -96, 87, -14, 86, -58, -14, -95, 54, -63, -3, 
+    -88, -78, 35, 7, 13, 70, -74, 82, 82, 6, 11, 55, 23, -13, 81, -39, -8, 
+    -42, -9, -87, -67, -39, 44, 29, -66, 57, 12, 47, 10, 9, -35, 92, -15, 
+    -24, -53, -99, 5, 87, 86, -40, 91, -70, -26, 10, -83, 12, -87, 29, 36, 
+    36, -89, 55, -77, -2, -17, 95, 63, -60, -21, 93, -43, -8, -73, -51, 66, 
+    -80, -5, -30, -2, -47, -80, 35, 98, -40, -96, -54, 88, -70, -79, 1, -11, 
+    -63, -77, 49, 52, 19, -16, -89, -10, 43, 64, -58, 60, -94, -72, -92, -61, 
+    -10, -18, 60, -98, -52, -59, 87, 19, 31, -53, -58, 0, 87, 97, -93, 72, 
+    -32, 46, 75, -15, -60, -19, -67, 41, -75, 86, 12, 5, 61, 49, -88, 62, 59, 
+    -7, 48, 81, 32, -41, -80, 95, 77, -73, -63, -55, 83, -75, 18, 66, 19, 98, 
+    61, 38, -44, -22, -35, 10, -35, -50, 20, -90, -15, -62, -22, 47, 73, -88, 
+    -75, 42, 9, 48, -95, 24, 53, -83, 23, -92, -97, 49, -91, 56, 96, -69, 
+    -69, 97, 74, -89, 42, 5, 69, -83, 98, 57, 0, -33, 33, 51, 89, -48, -91, 
+    49, -80, -3, -87, -94, 74, 35, 51, -6, -23, 95, 79, 12, 88, 80, 10, 93, 
+    -74, 25, 59, -17,
+  -4, -12, 60, -51, 97, -40, 45, -56, 55, -55, 50, 80, -93, 38, 91, -25, -29, 
+    -45, -51, -85, -34, 92, -36, 66, 16, -59, 73, 48, 73, -78, 74, 23, -39, 
+    -13, -30, 68, -59, 25, -42, 98, -6, 19, -72, -17, -72, 18, -56, -46, 44, 
+    33, 46, 22, 83, 52, 52, -57, 85, 76, 46, 79, 37, 39, 60, -37, 37, -32, 
+    -48, -21, 49, -36, 78, 62, -80, 35, 75, 49, -68, 96, -52, -16, 41, -26, 
+    -39, 96, 58, 10, 66, -84, -22, 74, -82, -31, -26, 64, 34, -8, -85, -51, 
+    -10, 20, 14, 9, -24, 45, 14, 39, -7, 59, 0, 9, 25, -39, 25, -32, 21, -60, 
+    -83, 89, 27, 15, 47, -73, 80, 89, 55, 84, 81, -22, 93, -5, -74, 3, -72, 
+    52, 59, 18, 66, 88, 36, 62, 79, -70, -86, -48, -44, 88, 20, 44, 50, 68, 
+    75, -51, -60, -35, -19, 7, 47, -28, -69, 43, -96, -48, -97, -95, -96, 
+    -15, -83, 34, -95, 34, -90, -67, -59, -17, 82, -74, 81, -88, -45, -66, 
+    99, 73, -66, -56, 70, -65, -80, -93, 31, 80, 57, 78, -68, 55, 27, -82, 
+    -64, -15, -57, 84, 88, 53, 74, 50, -48, 70, -24, -57, 24, 70, 25, 17, 
+    -23, -92, 64, 20, 88, 60, 28, -53, -26, -62, -94, -95, -95, 72, 29, 73, 
+    -32, 99, -44, 56, 2, 98, -100, -33, 15, 4, -28, -94, 20, -92, -83, -38, 
+    62, 76, 76, -23, -43, 22, -31, 58, -57, 6, 40, -13, -44, 7, 55, -28, 63, 
+    -1, 32, -68, 80, 50, -22, -96, 84, 59, 52, -2, 65, 82, 48, -30, 91, -48, 
+    12, -67, -40, -6, 62, 57, -79, -98, 56, -49, 0, 43, 89, -33, -53, -13, 
+    61, -46, 60, -13, -66, 82, -49, 46, 36, 93, 86, -26, -22, 86, 57, -17, 
+    -82, -73, 27, -10, -70, 82, 7, -23, 35, -1, -25, 1, 73, -10, 85, 57, -24, 
+    13, 32, 63, 38, -28, 14,
+  -84, -75, -19, -31, -34, 42, -53, -67, 36, -37, 49, -65, -13, 54, 74, 21, 
+    -25, 36, -25, -34, -96, -97, 44, 56, -53, 71, -56, 47, 96, 1, 15, -26, 
+    -88, -20, -49, -83, 57, 44, -25, 14, 62, -90, -8, -73, -8, -53, 9, -73, 
+    -20, -16, -91, -86, -2, 53, -35, -5, -99, -20, 19, 33, -55, 25, 6, -71, 
+    71, -49, -43, 67, -25, 34, 23, -6, 89, -3, 18, 79, -94, -97, -4, 70, 73, 
+    -45, 52, 34, 58, 43, 17, 74, 0, 23, 33, -91, 55, 55, 53, -10, -52, -97, 
+    18, -49, 67, -44, -36, 10, 95, -64, -56, 91, -25, 20, 58, -11, -36, -66, 
+    -1, -80, -59, 11, 84, -72, 85, 29, -79, 63, -97, -63, -88, -23, 39, -64, 
+    -48, 76, -85, 37, -53, 50, 96, 56, 42, 11, 81, -79, 1, 29, 59, 23, 43, 
+    -65, 27, -94, -24, 57, -93, -84, -42, -30, -11, -46, 56, -11, -1, -98, 
+    90, -2, 98, -91, 4, -23, 62, 39, 29, -38, -5, -56, -63, 17, 96, 77, 18, 
+    40, -44, -6, 81, 7, 91, -29, -14, -81, -9, 4, -14, 76, 73, -44, -90, -56, 
+    -69, 89, -16, -34, -73, -38, 8, 69, 37, -63, -7, -82, 51, -25, 86, 50, 
+    11, 0, -41, 59, -21, -89, -32, -6, -51, -33, 88, -13, 63, 74, -80, -32, 
+    13, 90, -82, 26, 28, -64, 67, -89, 26, -83, 78, 27, -65, 30, 39, -91, 
+    -13, -54, 3, -44, -79, 90, 3, 94, 78, -72, -93, 82, -47, 43, -98, 29, 
+    -29, 34, -64, 99, 46, -52, 24, 50, 78, -15, 74, -31, -46, 12, -2, -63, 
+    13, 94, 71, 99, 65, -43, 66, -96, -15, -98, -96, -39, -97, -78, -15, -3, 
+    59, 8, -67, 70, -54, -11, -21, 35, 53, -30, 96, 17, -5, -40, 90, 82, 31, 
+    -77, -84, -12, -86, 77, 99, -66, 70, 58, 50, -74, 77, -52, 88, -34, 12, 
+    -96, 12, 64, 44, 84, -50, -65, -99,
+  34, -54, -2, 47, 78, -76, -34, -67, -2, -48, -11, 11, -55, -86, -67, 78, 
+    -4, 91, -57, -75, 80, 10, -61, -30, 3, 72, -33, 11, 30, 72, 7, 87, -93, 
+    35, -95, -30, -87, 45, 59, 96, -7, 93, -56, 79, 71, 25, -34, 81, -21, 95, 
+    41, 44, 69, -46, -61, 24, -26, -30, -68, 23, 9, -4, -24, 48, -51, -89, 
+    -4, -49, 84, -24, -43, 32, 72, 89, -46, 23, -42, -13, -17, 14, 77, -7, 
+    -9, 83, 21, 17, -87, -100, 86, -37, 11, 54, 71, 37, -37, -71, -7, -22, 
+    -55, 17, -34, 6, 69, -15, -42, -30, -11, -69, 44, 63, 52, -66, 87, 93, 
+    94, 23, 89, -69, -66, 61, 28, -59, -100, -73, -92, -36, 96, -22, -3, 41, 
+    10, -43, 46, 67, -9, 26, 76, -93, -91, 60, 57, 4, -36, 51, 10, 73, -15, 
+    96, 51, -95, 17, -17, -4, 87, -72, -21, -73, -8, 32, 42, -13, 65, -41, 
+    92, -57, 86, 27, 70, 83, 65, 72, 84, 98, 72, -26, 95, -75, -32, -23, -63, 
+    -12, -83, -18, 27, -39, 64, -48, 1, -46, -83, -74, -23, -96, 97, -21, 
+    -88, -6, 81, 19, 36, -17, -46, -6, -89, 71, 1, -89, 65, 68, 87, 68, 96, 
+    -11, 92, -50, 35, 2, 47, -79, -58, -5, 99, -36, 96, -58, 86, 55, -80, 85, 
+    7, 58, -38, -41, 68, -80, -86, 31, -42, -63, 46, 18, -87, 26, 36, 41, 91, 
+    -39, -63, 71, -39, -99, 28, -38, -53, -21, 79, 5, 61, -19, -45, 23, -18, 
+    -79, 92, 56, 52, 97, 62, 44, -68, -42, -12, 87, -42, 58, -25, -23, -83, 
+    86, 94, -41, -81, -51, 69, -5, -100, -4, -78, -6, -85, 98, -9, 96, 38, 
+    -29, -58, -4, -92, 74, -24, -51, -30, -15, -74, -35, 7, 15, -70, -12, 
+    -63, -24, -11, -64, -64, 3, -34, -41, 17, -2, -34, 53, 16, 85, -26, -23, 
+    94, -23, -47, -71, 59, -27, -3, 98,
+  55, -58, -8, 84, 24, 46, -73, 92, 3, 10, 65, 25, -32, 93, -63, 35, 7, 89, 
+    49, 1, -35, 87, -41, -7, 93, 17, 30, 89, -97, 40, -44, 11, 0, 32, 86, 80, 
+    -39, -75, 85, 3, -77, -19, 97, 90, 11, 67, -25, -35, -94, 30, 88, 24, 18, 
+    -67, -73, -6, 29, -36, -10, 28, -76, 10, 2, -92, -31, -54, -91, 51, -66, 
+    34, 16, -18, 64, 8, -78, 41, 65, 38, 48, 32, -46, -42, -31, -33, -1, -15, 
+    66, 49, -48, 21, -63, 31, -67, -42, -64, -15, -69, 64, 23, -93, 98, 75, 
+    58, 17, -78, 80, 83, 14, 0, 77, -2, 65, -28, 98, -13, 72, 0, 80, -53, 90, 
+    -94, -72, 62, -49, -51, -93, 82, 29, -84, 31, -48, 63, -59, -86, -93, 
+    -57, 14, -80, -27, 49, 98, 12, -63, -7, -95, 74, 23, -53, 44, -71, -1, 
+    -80, -35, -35, -2, -78, -53, 70, 0, -72, -38, 64, -86, 70, -27, 58, -86, 
+    -15, 52, 35, 87, 99, 71, -84, 89, -82, 38, 77, -62, 57, 31, 52, 55, 37, 
+    -2, 81, 63, -2, 4, -17, -31, -46, 13, 13, 55, -69, -97, -3, 41, 88, 54, 
+    -3, 64, -88, -52, -80, -11, -73, 43, 64, -95, -19, -60, -68, 20, -83, 53, 
+    66, 90, 1, -53, -34, 96, 38, 64, -35, 0, 11, -78, -80, 34, -82, 51, -15, 
+    -75, -39, -18, 89, -83, -79, -71, -55, 30, -98, 55, -65, 55, -39, 61, 
+    -61, 23, -73, -37, -61, 69, -98, 11, -50, 18, 88, 79, 26, -34, 36, -24, 
+    15, -19, -47, 50, 50, -44, -91, 39, -50, 84, -22, -34, 10, 78, -86, 43, 
+    30, -81, -76, -94, 45, -99, -88, -84, 54, 39, -49, 51, -90, 71, 34, -99, 
+    -35, -9, -23, 14, -51, -92, 33, -9, 72, 86, -29, 65, 86, 82, 15, -15, 35, 
+    25, 86, -84, 75, -28, 47, -14, -33, -9, 77, -99, 95, 85, 51, 5, -93, 5, 
+    -50, 70,
+  52, -43, 99, -68, 42, 43, -6, 29, 53, -85, -99, -18, 91, 80, -54, 27, -76, 
+    2, -30, -70, -79, 68, -68, 54, 21, -46, 13, 23, 7, 9, 61, -20, -33, -94, 
+    -22, -15, 42, -50, -36, 20, -17, -56, 38, 88, 68, -66, -86, 61, -44, 78, 
+    46, -99, -10, 57, -90, -66, -40, 7, 85, -57, 93, 48, 60, -31, -52, 33, 
+    -20, 15, 83, 28, 7, 3, -8, -22, 10, 76, 20, -73, 73, -82, -5, -94, 98, 
+    -57, -38, 20, -98, -13, -32, 23, 49, -2, -82, 70, 95, -41, 99, -9, -50, 
+    24, 5, -48, -45, 82, -68, -35, 10, 12, -83, 87, 96, -32, 60, 53, 42, 59, 
+    -38, 62, -1, -83, -32, -28, -100, -79, 6, 4, -34, 83, 61, -33, 90, 26, 
+    18, 17, 32, -76, 22, 14, -72, 97, 99, -62, -59, -81, -8, -58, 92, 59, 2, 
+    -86, -56, -70, -4, -69, -60, 95, -23, 4, 10, -51, -12, -23, 97, -79, -44, 
+    -36, -84, 60, -34, -58, -62, 1, 54, 26, 60, -58, -20, -69, -60, 18, -20, 
+    9, 85, -82, -27, -39, -56, 67, 26, 13, 16, -75, -26, -92, 15, -74, 31, 
+    -93, 90, -24, 35, 66, 8, -35, 21, 78, -5, 28, 31, -39, -82, 77, 78, -59, 
+    -50, 64, 59, 16, 63, 53, -19, 95, 13, -84, -73, -75, 13, 13, -66, -78, 
+    -49, -72, 51, 98, -12, -99, -43, 83, 52, -74, -87, -14, 71, 45, 28, -39, 
+    48, -55, -50, -76, 87, -23, -39, 86, -54, 16, -48, 15, 93, 2, -81, 20, 
+    47, -67, 76, 85, -54, 65, 19, -74, 6, 26, -40, 73, -80, -90, 84, -22, 
+    -30, 52, 58, -31, -10, 78, 89, -14, 99, -47, -96, -18, -87, -56, 19, -27, 
+    36, -74, -16, 98, -89, 78, -53, 43, 54, 41, -46, 46, 84, -61, -54, 35, 
+    73, 72, -21, -36, -43, -57, 24, -66, -44, 87, 44, -30, -70, -81, -77, 
+    -70, -30, -89, 58, 71, -53, -36, -8,
+  -1, 6, -75, 17, -39, 90, -2, 64, -19, -20, -15, -55, 49, 26, -71, -12, -65, 
+    93, -61, -89, 18, 60, 63, 91, 3, -68, -87, 44, -34, -55, -21, -83, -91, 
+    21, -25, 91, 64, -31, 84, -74, 80, -22, -70, -55, 59, 15, -57, 3, -14, 
+    32, 78, 95, 79, 53, 62, -35, 91, 10, 69, -76, 89, -44, -31, -12, 29, 43, 
+    -47, -32, -11, 78, -57, -8, 95, -98, 91, -2, 8, -41, -86, -1, 41, 74, 22, 
+    -81, 70, -96, 57, -45, -67, -44, -68, 32, -85, -5, 57, 63, -60, 74, -93, 
+    -1, -8, -97, -99, -29, -2, 55, 61, 97, 91, -82, 77, 67, -36, 67, -72, 30, 
+    -47, -18, 24, -69, -70, -71, -82, -83, -59, -19, 57, -23, 62, 81, -11, 
+    -33, 36, -54, -14, 58, 95, -96, -78, 25, -42, 33, -19, 5, -85, 1, 57, 
+    -69, -82, 80, 69, 89, -87, -37, -37, -1, -83, 13, -20, -17, -9, -66, 11, 
+    -3, -31, -53, 69, 43, 44, -99, -72, 77, -10, -20, -12, -91, -9, 63, -88, 
+    -16, 34, 70, 81, 21, -84, -52, -47, -94, 21, 59, -91, -37, 96, 24, 48, 
+    47, -65, -58, -44, 43, -42, -10, 32, -74, -78, -97, -100, -87, 96, 9, 
+    -19, -56, -74, 85, 78, -81, 4, -17, 86, -11, 57, 40, 8, -18, 75, 13, 93, 
+    85, 61, 32, 31, 21, -25, 65, -87, -43, 94, 44, 8, -61, -88, 98, -5, -63, 
+    37, 80, 79, -22, 77, 88, 19, -96, 44, -22, 6, 16, 64, -40, -81, 46, -64, 
+    -95, -5, -48, -42, -20, 6, -79, -67, 99, 50, 62, 22, 18, -61, -8, -65, 
+    56, 19, 63, -9, 88, 46, -44, -71, 37, -45, -4, 63, -58, -61, -55, 55, 92, 
+    90, -83, -21, -47, 53, 17, 91, 17, 21, -43, -3, -30, -38, -30, -43, 98, 
+    -78, 44, 64, 12, 52, -12, 28, 88, -92, 48, -56, -44, 75, 69, 44, 35, -98, 
+    18, -63, 91, -49, -87, -91,
+  14, 12, -61, 12, -2, -51, -31, 86, 86, -94, -67, 90, -3, -24, 47, 87, 68, 
+    31, -89, -39, 3, 86, -76, -28, -35, -90, 19, -38, 26, -69, 65, -44, 85, 
+    27, -37, -38, -78, 48, -94, -20, 0, -54, -22, 92, 26, 60, 43, -7, 68, 35, 
+    39, -45, 68, 2, 75, 63, 77, -32, 2, 20, -80, -44, -96, -46, -14, -29, 
+    -54, -84, 44, -21, -54, 63, 8, 79, 47, -81, 36, -54, 56, 78, 10, -86, 8, 
+    23, 80, 57, -25, -82, 6, -64, -98, -35, 21, 77, -17, -39, -64, -87, 81, 
+    -28, -24, 83, -18, 94, 13, -22, -70, 84, -53, -88, 32, -62, -63, -24, 14, 
+    -100, -57, -5, -33, -15, 88, -24, -68, -23, -16, -38, -7, -32, -48, 56, 
+    18, -26, 27, 1, -98, -94, 66, -39, -19, 96, -19, -66, 70, 48, -86, 28, 
+    -54, 48, -38, -95, 54, 35, 52, -44, 63, 49, 65, 5, -2, 83, -84, 9, -41, 
+    -91, -9, -75, -79, 47, -49, -68, -54, 47, -69, -8, 42, -25, 58, 2, -63, 
+    -62, 14, 68, 21, -45, -10, 66, -76, 27, -77, 21, 87, -23, -47, 40, 83, 
+    -50, -27, -4, -89, 9, -65, 83, 13, 4, 56, -60, -38, -30, -6, 56, 96, 90, 
+    -59, -51, 88, 41, 41, -61, -96, 95, 59, -99, -43, -96, 55, -99, 80, 69, 
+    97, 64, 28, 96, 94, -68, 25, 98, 74, 12, 49, -98, 43, -29, 22, 72, 70, 
+    -2, -94, -76, -99, 82, -7, 21, -32, -64, 53, 26, -29, -4, 85, 13, 81, 
+    -19, 59, -19, -35, 25, -77, -33, -69, 49, 11, -7, 91, -52, 96, 30, 84, 
+    -44, 26, -9, 95, -31, 18, 20, -86, 92, -14, -55, 82, 88, -32, 25, -49, 
+    93, -59, -71, 47, 51, -89, -63, 60, 28, -50, -76, -32, -20, 39, 89, 24, 
+    -41, 53, -27, 56, 23, -44, -97, -4, -99, -40, 83, -38, -13, -45, 37, 79, 
+    -14, -48, -81, -50, 0, 98, 26, -94,
+  14, 67, 44, -40, 41, -98, -50, -68, -7, 66, -43, 50, -41, -21, -68, -37, 
+    28, 67, -37, -71, -54, -15, -26, -5, 8, 20, -25, 90, -78, 82, 57, 57, 21, 
+    71, 36, 85, 22, 20, -75, -64, -29, 92, -44, 20, 6, -37, -32, -99, -13, 
+    -96, 81, -39, 51, -20, 38, -75, 1, 38, -89, 55, 87, 0, 73, -35, -38, -25, 
+    -9, 48, -64, -25, -20, -96, -8, 29, -91, 24, -86, 96, 98, 21, 70, 37, 
+    -28, 39, 33, 27, 59, 52, 13, 84, -33, -70, 3, 27, -4, -37, -54, 85, -7, 
+    48, 74, -92, -50, 86, -44, 64, -44, -43, -33, -10, 31, -13, -76, -65, 
+    -98, -74, 89, 27, -96, -32, 53, 68, 36, 91, -94, 25, -56, -100, 60, -36, 
+    74, -16, -68, 39, -12, 27, 83, -53, -92, -21, 30, -75, 41, -46, 33, -22, 
+    -3, 37, 34, 39, 48, 25, 72, -67, -85, -23, 96, 85, -54, 30, 95, 16, -9, 
+    -89, -52, 73, 15, 42, -72, 32, 55, -3, -71, -29, 54, 69, 90, 24, -7, 75, 
+    -94, -27, 61, 15, 18, -86, 12, 20, -25, 69, 90, 68, -90, 62, 79, 42, 74, 
+    56, 15, 32, -28, 14, 69, -17, -8, -55, 14, 67, 26, -90, 92, 68, -9, -50, 
+    -88, 68, -13, -50, -47, -51, 29, -69, 66, -95, 85, -58, 44, -21, -38, 
+    -37, 93, -57, -31, -48, -68, 14, 62, 91, 29, -5, -87, -70, -92, -45, -26, 
+    -11, -48, -31, 58, 79, 30, 13, -82, -33, 44, 74, 90, -96, 13, 80, -32, 
+    -18, 40, 5, 88, 55, 8, 3, -12, -57, -77, 88, -29, -92, 86, 5, 93, -54, 
+    29, 49, -28, 42, -58, -2, 97, 73, 50, 58, -90, 31, -8, 42, -71, 99, -98, 
+    92, -83, -24, -21, 75, 93, -31, 50, -100, -38, 4, -18, 35, 77, 46, -53, 
+    16, 47, -28, 82, -36, 50, -63, 39, -6, 81, -81, -33, -54, 2, -50, 88, 95, 
+    77, -36, -99, 38, -26,
+  -44, -78, -83, -79, 42, -34, -10, -83, 29, 27, 82, 15, -81, 92, 4, 82, -58, 
+    -61, -6, -77, -56, 44, 26, 11, 19, -3, -35, 5, -5, 62, -35, 23, 80, -41, 
+    30, 85, -8, 5, -79, -68, 85, 22, -83, -19, 54, 10, 12, 76, -39, -86, 83, 
+    61, -83, 44, -100, 81, -60, -87, -23, 84, -71, -8, 50, -8, 36, -17, -62, 
+    -39, 95, 93, 91, 76, 15, -26, -5, 16, 80, -22, 66, 68, 49, -64, 18, 4, 
+    -15, 44, 3, 75, 68, -10, 91, 2, 3, 44, 97, 62, 91, -79, -85, 23, 43, -12, 
+    -93, -22, -20, 92, 67, -77, -20, -100, -47, 83, -71, 0, 34, 4, 37, -45, 
+    -53, -83, 82, -96, -59, 57, 49, 49, 86, 91, -36, 92, -24, 95, -85, 63, 
+    92, -36, 84, -60, -42, 5, -61, -61, 88, 84, 83, 27, 26, 46, 9, 96, -71, 
+    -65, 61, -92, -23, 83, 22, 45, -35, -47, -58, 69, 0, -100, -86, -18, -94, 
+    -97, 94, 66, -43, 57, -1, -78, 95, 35, 51, 88, 92, -42, 47, -99, -95, 
+    -41, -25, -69, 83, 15, 60, -23, -96, 25, -24, 8, 81, 91, 54, 4, -49, -26, 
+    -76, 34, 10, -22, 16, 96, -97, 87, 62, 11, 67, 23, 62, -65, -42, 47, 20, 
+    -32, 0, -40, 39, -84, 36, -97, 42, 91, -16, -86, -97, 83, -75, -40, 34, 
+    69, 6, -32, 23, -100, 25, -78, -52, 7, -85, -36, -87, -39, 13, 51, 87, 
+    24, 20, -88, 0, 83, 52, -68, 78, 92, -87, -54, -45, 6, 40, 2, 25, 5, -55, 
+    -64, 75, 37, 73, -6, 65, 31, -60, -20, 74, 85, -49, -80, -40, -96, 85, 
+    88, -61, 13, -92, 62, -52, -34, -40, 85, 76, -36, -28, 58, -73, -70, -39, 
+    -84, 82, 98, -21, 72, 56, -98, -54, -100, -22, -40, 22, 83, 95, 98, -46, 
+    55, -1, -12, -12, -35, 28, 61, -4, -25, -100, -27, -24, 48, 28, -95, 81, 
+    41, 40,
+  -57, 49, 13, 15, 74, 72, 35, 72, 11, -59, -22, -49, 84, -13, 18, -64, -98, 
+    -53, 20, 93, -49, 58, -8, 3, 57, 85, 52, 77, 85, -20, 7, 13, -47, 1, -94, 
+    -29, 8, 87, -25, 70, 48, 44, -10, -53, -24, 77, -63, 27, 57, -77, 29, 99, 
+    -32, -80, 88, -94, 6, -13, -2, 19, 78, -78, 8, -87, 9, -25, 15, 36, 8, 
+    -82, 13, -62, -70, -98, 13, 48, 13, 7, -13, -95, -8, -63, -4, 28, -95, 
+    -31, -16, -25, 19, 86, 50, 67, 23, -56, -47, -54, -11, -28, 17, 13, -9, 
+    61, -36, 75, 81, 65, -6, 98, -16, 43, -28, 12, -2, -56, 93, -52, 91, 6, 
+    86, 9, 33, 45, -15, 53, 30, 60, -38, -90, 58, -87, 40, -28, 48, 24, -8, 
+    52, 67, -72, 99, -86, -26, 2, -99, 12, 6, -69, 0, 84, -97, -10, -51, 38, 
+    58, 84, -65, 28, -92, -32, 70, 19, 27, 57, 80, -19, -69, 7, 72, -1, 38, 
+    27, 39, 58, 78, -25, -28, -85, 41, -86, 33, 60, 32, 75, -43, 85, 70, -52, 
+    -91, -94, -24, -72, -68, -59, -58, 98, -75, 53, -92, -93, -72, -53, -28, 
+    30, 41, 68, -61, -20, 20, -54, -43, -76, -1, -87, 72, 44, 20, 1, 14, -26, 
+    -84, -8, -59, 23, -16, 40, 85, -87, -34, 26, 50, -87, 69, 71, 82, -100, 
+    36, -75, -1, 16, -95, -77, -68, -46, -18, -41, -10, 54, -77, 37, 92, -8, 
+    99, 70, 18, -92, -69, 14, -60, -67, 98, 99, -18, -50, -83, -8, -80, -59, 
+    -53, 30, 26, 94, -41, -86, -26, 18, 50, 63, -27, -67, -68, 68, -38, 48, 
+    59, 31, -72, 35, -25, 29, -35, -22, 44, 59, -37, 82, 63, 4, 1, 8, -14, 4, 
+    -70, -65, -66, -41, 54, 60, -93, -50, -81, -28, 22, 9, -99, 76, -47, 48, 
+    70, 8, -63, 98, -85, 69, 10, 92, -4, 46, 39, 23, 64, -83, -24, -23, 47,
+  -15, -14, 87, 92, -28, -9, -76, 99, -50, -38, 41, 66, -93, -63, -38, -67, 
+    -9, -29, 72, -48, 52, 72, 19, 58, 67, 85, -3, 79, -14, 30, 5, -90, 22, 
+    48, -84, 32, 38, 14, 36, 21, 68, 32, 78, -87, -63, 3, 50, -84, 78, 58, 7, 
+    -74, -14, 77, -37, 61, 14, 50, 61, -32, 68, -62, -84, 55, 95, -45, 72, 
+    -52, 47, -51, 7, 13, 29, -55, -4, 84, 76, -8, 80, -13, 1, -56, -19, -42, 
+    -82, 1, -63, -39, -92, 9, 65, 65, 64, 84, -86, -97, 78, 42, 9, -51, 26, 
+    -31, 56, 37, -31, 13, 11, -43, 61, -35, 57, -72, -84, 6, 86, 75, -59, 
+    -56, 0, 73, 57, 67, 16, 73, -41, 80, -33, 79, -20, 69, 57, 42, -12, 68, 
+    82, -92, 74, 95, -76, 64, -21, -47, 73, 13, -14, 66, 49, 1, -13, 85, -90, 
+    7, -98, 78, -77, -68, -62, 6, 51, -96, 17, 54, -85, 27, 27, -30, 34, -36, 
+    78, 96, -83, 62, -22, -23, 34, -82, -92, 82, 41, 82, 77, 6, -77, 82, -81, 
+    27, -32, -13, -98, -36, 26, 10, 2, 52, 48, -94, 28, -51, 54, -43, 29, 2, 
+    -33, 39, -37, -59, -64, 54, -73, 56, 84, 82, 82, 88, -75, 4, -58, 66, 46, 
+    -36, 24, 93, 69, -5, -86, -4, -44, 87, 70, -10, 35, 60, 47, -1, -8, -23, 
+    88, 1, -44, -30, 36, -100, -38, 14, 39, 99, 73, -21, -75, -90, -43, 19, 
+    -88, -85, 36, -99, -47, -29, 14, -36, 81, -53, 54, -92, -6, -37, -95, 
+    -43, 99, -63, 9, -32, 78, 80, 25, -2, -41, 20, 40, 89, -4, 87, 44, 2, 36, 
+    22, 44, 94, -54, 89, -5, 77, -50, -21, -73, -40, 73, -8, 85, -6, -28, 42, 
+    -32, -33, -62, -100, -48, 78, 74, -44, 35, 46, -2, -70, -74, 22, 7, 48, 
+    4, 26, -94, 24, 71, 49, -56, -93, -62, -70, -26, -72, -29, 47, -28,
+  -83, -91, -45, 28, -84, -46, 69, 98, -3, 58, 29, 17, -99, 19, 83, 20, -13, 
+    -99, -9, 88, -70, -61, -54, -33, -57, 34, -64, -14, 62, -39, 28, -92, 
+    -86, 33, 97, 97, -24, 3, 4, 37, 26, -63, -48, 66, -88, 90, -90, 27, 2, 
+    77, -45, -67, 74, -46, -50, -98, 63, -93, -5, -97, 37, 39, 55, -21, 57, 
+    83, 38, 17, -82, -27, -61, 77, -2, 72, -23, 85, -30, -7, -81, -72, 57, 
+    -97, -9, 80, 92, -95, -14, -13, 40, 19, 6, 8, 98, -11, 3, 96, 88, -1, 16, 
+    26, -57, 94, -47, 69, 5, 20, -9, 31, -50, 99, -30, 57, -97, -20, 54, 71, 
+    4, 1, 81, -10, 71, 54, 38, 26, -12, 62, 42, -94, -80, 60, 47, 38, 98, 69, 
+    -46, 72, 28, -61, -31, -52, -11, 22, 2, -75, 61, 68, 90, 77, -24, 53, 
+    -12, -42, 26, -2, -97, -3, -12, -19, -99, -56, -28, -70, 21, 45, -100, 
+    95, 7, 78, 25, -74, 1, -15, -73, 33, 57, 98, 95, -85, 96, -86, -72, -90, 
+    -69, -85, -80, 68, 86, 48, -39, -57, -77, 14, 1, -49, 12, 47, -47, 52, 
+    -22, 16, 9, 86, 31, -59, 56, -64, 65, -39, -45, 88, 27, 54, -79, -53, 
+    -92, -26, 76, 66, 78, -89, -93, -33, 49, 97, 84, 67, -23, 88, 45, 1, 20, 
+    37, -97, 71, -3, -99, -48, -15, -96, -23, -20, 80, -60, -49, 60, -77, 
+    -36, -66, -17, 28, 94, -66, -66, -66, 82, 91, -13, 88, -54, 70, -11, -11, 
+    85, 15, 40, 87, 3, 86, -44, -36, 8, -10, 13, -76, 98, -48, -89, 91, 68, 
+    -83, 67, 9, -53, -70, 93, -40, 32, -74, 25, -17, -68, 42, 83, -21, 93, 
+    39, -80, 33, 18, 54, 96, -15, 66, -6, 95, 87, -94, 24, 58, 13, 70, 29, 
+    40, 50, 93, -2, -1, -69, 95, 86, -35, 65, -72, 72, 4, -92, -97, 9, 16, 
+    15, 48, 55, -48,
+  -32, -15, -20, -63, -90, -26, 68, -15, 52, -62, -73, 61, -13, 31, 93, -87, 
+    -86, 2, 99, 72, -1, -32, -17, 46, 98, 50, -57, -99, 73, 23, 97, 60, 12, 
+    -54, 43, 64, -15, -52, -26, -93, -70, 21, 68, -96, 17, 74, -26, -25, -44, 
+    89, -1, -92, 74, -71, -69, -25, -73, -83, 18, -52, -37, -63, -80, -30, 
+    95, 11, 41, 63, 72, 71, 14, -65, -5, -6, -100, 2, 98, -74, 87, 65, 97, 
+    93, 28, -72, -28, -4, -91, 7, 1, 44, 20, 74, -71, -87, -7, 49, -67, 42, 
+    38, -33, 20, 4, 27, 6, 53, 82, -9, -8, 90, 74, 64, 40, -44, 20, -61, -75, 
+    -88, 71, -11, -75, -46, 65, -36, 71, -51, -8, 66, 96, -62, 67, -72, -51, 
+    -82, 29, -39, 95, 53, 7, -84, -31, -3, 4, -94, 99, -64, 26, -98, 22, 97, 
+    60, -97, 85, -75, 41, -99, -67, -3, -26, 32, -8, 88, -32, 13, -35, -90, 
+    -79, -21, -62, 5, 8, -34, -6, 51, 9, 27, -60, 99, 44, 6, -39, -87, 84, 
+    20, 12, 77, -6, -12, -85, 91, 44, -24, -62, 6, 22, 41, 49, 2, 4, 61, -29, 
+    80, -88, -81, 48, -45, 87, 41, 35, -71, 20, -16, 96, 87, 23, -91, -11, 
+    -8, -49, 13, 55, 52, 5, -53, -21, 24, -24, -6, -63, -80, -45, 10, -32, 
+    -55, 15, -94, 34, 7, 27, 21, -82, 58, 89, 78, 10, 56, -47, -93, -20, -31, 
+    -69, -15, -3, -39, -13, -62, -52, 13, 99, 81, -41, 61, 18, -59, -98, -12, 
+    78, -13, -61, 0, 39, 75, -50, -87, 26, 51, -51, -63, -36, 35, 1, 88, -78, 
+    -20, 12, 51, 97, -34, -97, 98, -82, -84, -42, 43, 51, 92, -91, 86, -86, 
+    47, 21, 73, 59, -74, 36, 25, 45, 89, 88, 60, 8, -36, -2, 35, 67, 48, -4, 
+    -75, 53, 76, 50, 42, 72, -38, -34, 27, 60, 28, 22, 23, -42, 80, -67, -67,
+  -56, -80, -97, -7, -61, -98, 48, -42, 79, 43, -99, 37, 87, -55, -58, -14, 
+    56, 4, -56, -38, 92, -80, -45, -95, 8, 57, 59, 28, 14, -37, -17, 7, 6, 
+    -74, 99, -65, 64, 29, -100, -84, -35, -78, 57, 69, 46, 11, 97, 89, -87, 
+    -51, 56, -79, 71, 56, -80, 77, -77, 82, -50, -26, 46, 31, -62, 82, 2, 1, 
+    70, 26, 43, 40, 48, 93, 89, 90, -76, 14, -19, -63, 95, -17, -94, -5, -72, 
+    -78, -96, -36, -86, -57, -75, -28, -52, -28, -80, 82, 33, -90, -23, -35, 
+    8, 47, 65, 89, 89, 32, -20, 32, -97, -82, -51, -73, 27, -58, 20, 60, 23, 
+    -65, -21, -92, 56, 95, -51, 88, 76, -59, -77, -63, -27, -7, 94, -22, 27, 
+    -7, 9, 41, -54, 3, -39, 90, -72, 27, -17, -90, 69, -43, -66, 58, -5, 63, 
+    38, 59, 47, -8, 77, -26, -82, 71, 12, 41, -34, -21, 43, -79, 84, 82, -24, 
+    -54, 62, 27, -47, 76, -35, -81, -78, -65, 50, -5, 58, -16, -30, 92, -47, 
+    75, -40, -42, -97, -90, -8, 13, -10, -79, 80, -15, -29, 2, 77, 49, -62, 
+    1, -2, -32, -19, -98, 82, 39, -47, 7, -35, -56, -38, 61, -98, -18, -29, 
+    28, 46, 98, 92, 54, -3, -9, -56, 39, 61, 92, 47, -2, 24, -55, 94, 46, 
+    -31, 81, -51, -78, 48, 80, 36, 98, 99, -52, 74, -3, -16, -98, -16, -94, 
+    72, -58, 67, 18, 93, 26, 91, -2, 36, 70, 66, -67, 86, -12, -51, 47, -63, 
+    27, -37, -20, 72, 88, -60, -48, -16, 36, -85, -89, 13, -99, 50, -47, -90, 
+    -96, -11, 24, 20, 75, 51, 33, 72, -18, -53, 64, 61, -28, -30, -32, -52, 
+    90, -51, -56, 69, -69, 37, -10, 42, 61, 74, -45, 95, 50, 41, 82, 52, -67, 
+    -49, 85, -97, 22, 30, -99, -61, 80, 90, 9, -8, 19, 96, -31, -90, 58, -52, 
+    -68, 34, -42, -93,
+  36, 4, 1, -99, 17, -66, 74, 36, -81, -86, 2, 29, 99, 77, 75, 46, -77, -79, 
+    79, -91, 61, -54, 5, -6, -96, 74, 74, 93, -62, 19, 21, 93, -14, -89, 23, 
+    -42, 54, 22, 28, -18, 32, -75, -85, -66, -19, 26, -60, -59, 19, -44, -78, 
+    35, -5, -24, 53, -19, 80, 24, -64, 70, 39, 76, -98, 16, 22, 34, 22, -35, 
+    -8, 86, -81, 45, -98, -5, -99, -70, 71, -55, -20, 86, 4, 81, -7, -22, 
+    -80, -72, -62, 78, 57, -56, -26, 10, -3, 61, -16, 38, 85, -32, -96, 16, 
+    48, 30, 11, -50, 58, 42, 12, 44, 36, -48, 63, 38, 77, -62, -31, 69, 2, 
+    13, -97, 9, 25, 48, 19, 80, -22, 90, 25, -79, 85, 76, -66, -52, -1, -40, 
+    -82, -58, 85, 28, -80, 71, -83, -7, 25, 27, -46, -43, 76, -97, -60, -49, 
+    32, 16, -95, 26, 3, -96, 23, 85, -12, -51, -71, 28, -8, -15, -79, -40, 
+    -6, 31, -55, -56, -1, 76, -43, 7, 94, -73, 35, 6, -74, -48, -15, -82, 
+    -52, 28, 7, -4, 60, -38, 94, -94, -89, 21, -88, 91, 83, -40, -48, -74, 
+    -76, 43, 53, 58, 59, 41, 96, -38, -41, -22, 67, -74, -62, 45, 93, -23, 
+    -93, 50, 57, 99, -99, 99, 7, -96, 21, 89, -20, -30, -53, 17, -48, 87, -8, 
+    -45, 40, 67, 17, -83, -84, -66, -28, 83, -74, -6, 23, 0, 70, 45, -61, 
+    -96, 78, 44, -86, -28, -84, -33, -26, 90, -97, 9, -60, -89, 10, -4, -12, 
+    -92, -32, -17, -55, 59, 79, -56, -77, 15, -50, 62, 57, 68, -31, -12, -6, 
+    -88, 18, -21, -77, 22, -50, 16, -27, -76, 6, 14, -31, -63, -15, 33, 82, 
+    -32, 67, -20, -55, 19, -26, 4, -44, 43, 24, -93, 89, 41, -80, -75, 78, 
+    62, -7, 37, 54, 53, 66, -48, 26, 45, 19, 97, -67, -77, -19, 92, 16, 31, 
+    88, 70, -83, -67, -3,
+  -60, 5, 44, 85, 17, 53, 54, 1, -2, -92, 86, -95, -37, -65, -5, 75, 98, -39, 
+    87, -10, 4, -44, -96, -67, 23, 24, -80, -60, -84, -47, 7, -42, -76, 73, 
+    -84, -25, -82, -44, -38, -72, 25, 4, 63, 92, 51, -99, -68, -30, -50, -59, 
+    99, -64, 44, 66, -65, -33, -25, 56, 23, -59, -37, 21, 41, 63, -17, 87, 
+    71, 30, 19, -93, -73, 90, -47, -30, -52, 95, 19, -12, 9, -56, 66, 68, -8, 
+    78, 61, 85, -38, 7, 12, 23, -9, 75, -87, 1, 11, 80, -19, 20, 53, -23, -4, 
+    73, -7, -54, -73, -93, -70, -57, -75, 10, 45, 11, -47, -43, -43, -79, 
+    -39, 79, 91, 10, 21, -70, 12, -43, 63, 89, -81, -76, -92, 90, -16, 13, 
+    88, -90, -82, 71, -66, 0, 26, 91, 46, 34, 67, -61, 16, -40, -72, 78, 80, 
+    60, -13, -22, 10, 8, -90, 35, -31, -47, -25, -15, 32, -19, -61, 50, 36, 
+    -20, 89, 79, 29, -26, -41, -59, -87, -36, 17, -100, -70, -64, 21, -91, 
+    -82, -56, 32, 91, -76, -61, -44, 76, -19, -68, -94, 32, -44, -14, 75, 
+    -77, -50, -66, -12, 32, 33, 77, -90, 59, 49, -37, 10, -45, -30, 6, 80, 
+    65, -32, 69, 98, 60, -100, 3, -30, -63, 44, -51, -93, 0, 44, -6, -74, 10, 
+    -63, 30, 51, -99, -19, -12, -90, -31, 32, 44, -17, -82, 47, -17, 81, 25, 
+    49, 74, 14, 93, 71, -91, -30, -16, -62, 29, 1, 24, -37, -69, -76, -79, 
+    -81, 17, -100, -37, -95, -10, -31, 53, 37, -76, -17, -77, -28, 67, 30, 
+    43, -52, -34, -47, 37, -82, 12, 55, 87, -27, 95, 87, 9, 33, 50, -21, 71, 
+    -8, 1, -97, 41, 34, 40, -45, -3, 14, -9, 67, -36, 19, -32, 25, -69, -67, 
+    -63, 43, 79, -23, 24, 32, -39, 20, -88, -6, 99, 9, -34, -97, 36, -43, 
+    -74, 51, -1, -94, -95, -31, -94, 62,
+  53, 2, -42, -28, 50, 29, 47, 24, 33, -35, 9, 18, -43, -14, 20, 39, -90, 22, 
+    9, -69, -52, -5, 25, 96, -9, -83, -10, 51, -85, -11, 38, -43, 24, 64, -6, 
+    -57, 69, 63, 63, 11, 35, -40, 85, -65, 32, -22, 6, 80, 51, -80, 99, -7, 
+    -13, 48, 75, -75, 80, 44, 39, 34, 54, 63, 70, 59, 79, -5, -50, 2, -23, 
+    -89, -8, 67, -36, 98, 54, 16, -61, -69, -42, -80, 70, -31, 80, -71, 21, 
+    -7, 51, 0, 2, -36, -13, 27, 61, -54, -7, 35, -98, 85, 59, 98, 56, -9, 89, 
+    -88, -81, -71, -78, 45, 13, 95, 95, 40, 14, -97, 50, -60, 99, 56, 91, 53, 
+    22, 37, 59, 19, -70, 94, 69, 12, -53, 40, 21, 57, -92, 75, 93, -52, -41, 
+    2, -10, -97, 1, 96, 31, 61, 23, -3, -83, 46, -29, -46, 22, 21, -42, 93, 
+    94, 65, 82, -39, -79, -60, -54, 25, -6, -92, -56, -32, -80, -92, 17, 1, 
+    -49, -7, -1, 4, 17, 67, 38, -4, 69, 50, -99, -99, -79, 34, -23, 23, -29, 
+    75, 45, 26, -53, -71, 54, 64, 48, 43, -86, -88, -50, -15, 23, -64, -89, 
+    85, -31, 5, 97, 2, -37, -46, -99, 44, -10, 38, -10, -85, 36, -100, 66, 
+    -83, 31, 4, 88, -8, -75, -24, -79, 94, 78, 32, -93, 25, -55, 44, -7, 35, 
+    6, 28, -56, -22, -10, 52, -81, -30, -70, 77, 24, 97, -36, -18, 90, 59, 7, 
+    21, 47, 30, -91, -13, 95, -4, 95, 96, -43, -46, -76, 87, -31, 67, 30, 41, 
+    -23, 42, -63, 7, 18, 45, 27, -76, 84, -59, 43, 92, 60, 90, 0, -49, -3, 
+    73, 44, 2, 36, -83, -74, -8, -14, -99, 57, -66, 70, -49, 16, -61, -65, 
+    37, -21, 88, -89, 2, -86, -96, 98, 10, 32, -71, 23, 10, -44, 34, 5, -78, 
+    35, -9, 83, -78, -98, -77, 9, 91, -85, 75, -91, -8, 69,
+  60, 69, -84, -76, 77, 41, -3, -8, -61, 66, 1, -100, -39, 76, 38, -22, -33, 
+    -87, -79, -26, 1, 96, -71, -29, 65, 59, 98, -74, 27, 8, 66, -19, -69, 75, 
+    -32, 37, -57, -29, -40, -56, -4, 0, 66, -40, -2, 18, -52, 23, -97, 79, 
+    -95, 58, -59, 44, -61, -6, -8, -43, 7, -14, -30, 53, -38, -22, -77, -87, 
+    93, -7, 35, -60, -48, -9, -29, 4, 22, -82, 30, 55, 77, 90, 72, -91, 77, 
+    93, -74, -10, 86, 51, -15, 74, 34, -8, -86, -9, 7, -3, 10, -9, -99, -35, 
+    54, -45, 33, 63, 59, 75, 68, 17, -44, -67, 91, -54, 99, 48, 17, -66, -58, 
+    -81, -45, -43, 63, -51, 10, -76, -67, -39, -36, -82, 33, -6, -84, 58, 40, 
+    -34, 6, 40, -29, -95, 41, 53, -15, -54, 50, 71, 96, 20, -20, -27, 64, 
+    -32, 26, -96, 39, -10, 52, 10, -50, -31, -77, 7, -45, -92, -81, 25, 87, 
+    -25, -34, 70, -30, 38, -7, 42, 34, -31, -39, -27, -29, -48, 60, 0, 75, 
+    97, 75, -57, 40, 64, 46, -74, 25, -94, 83, -54, -24, -89, -50, -69, 3, 
+    10, 58, -30, -39, -65, -94, -96, -54, -34, 19, 65, 15, 46, -19, 7, -92, 
+    -8, 99, 37, -22, -37, -71, 71, -11, 0, 12, 50, -14, -3, 13, 30, -43, 64, 
+    -33, 5, -45, -72, -10, -95, 24, 25, 20, -46, 78, -58, 54, -91, -52, 36, 
+    6, -30, 47, 44, 10, -18, 67, 26, 19, -80, -88, -84, -53, 57, 63, 38, -3, 
+    83, -7, -87, -41, -60, -54, 84, 26, 34, 97, -11, -53, 37, 12, -30, 43, 
+    20, 37, -76, 56, -41, 4, -49, -94, 12, -91, 19, -72, -85, -82, -19, 11, 
+    60, 31, 82, 86, -29, 62, -38, -5, -53, 94, 44, -9, -70, -27, 22, -54, 
+    -65, -46, -6, -21, -70, -61, -2, -17, -91, 21, 95, 74, 92, -51, -58, -90, 
+    20, -62, 37, 8, 73, -93,
+  -49, -29, -68, 64, -49, 95, 77, 37, -89, 61, -62, 21, -28, -8, -79, -62, 
+    -26, 8, 92, 6, -88, 66, 86, 36, -34, 84, 57, 92, 9, -71, -3, 30, -99, 
+    -70, -30, -47, 60, -64, -62, -95, -23, -17, 20, 16, -74, 28, -91, -69, 
+    -19, 72, -65, -73, 71, 78, -22, -73, 48, 95, -17, 7, -54, 5, -28, 6, -75, 
+    -31, -53, -7, 36, -98, -52, 10, 19, 25, 37, -71, -54, 86, 90, -78, -27, 
+    -43, 86, -10, 94, -4, -12, 20, -89, -81, 10, -45, 61, 53, -62, 96, 97, 
+    -84, 8, 64, -63, 60, 52, 63, 20, 19, 28, -56, 24, 17, 71, -64, 73, -99, 
+    38, -53, -71, -95, 55, -57, 61, -32, 85, -91, -70, -69, -61, -79, 90, 30, 
+    -87, -42, -98, -24, -31, 84, 36, 84, 99, -48, 65, 70, 76, -58, 3, 59, 82, 
+    -28, -88, -94, -1, -28, 47, 88, -77, 14, -97, 52, 80, 24, -9, -59, 88, 
+    68, 25, -51, -63, -49, 14, -68, 85, -13, -84, 5, 95, -17, -81, -74, 1, 
+    -55, 32, 98, 32, -77, -84, 91, -65, -64, -83, -74, 19, -9, -45, -94, -28, 
+    -38, -88, -68, -55, -15, -16, 18, 52, -53, 69, -69, -81, -71, -97, -20, 
+    -6, -2, -88, -11, 94, -11, 46, 91, 59, -5, -4, 94, 18, 81, 34, -30, -28, 
+    -2, 12, 67, 40, -75, 39, 72, 13, -10, 28, -38, -76, 75, 91, 41, 92, -23, 
+    -93, 39, -3, -93, -56, 90, -55, 53, -100, 20, 57, 24, 37, 57, 18, -1, 
+    -46, -11, 8, -3, 77, 68, -27, 1, -74, -28, 71, -16, 85, -20, 4, -100, 16, 
+    56, 63, -97, 48, -94, -11, 82, -60, -39, -45, -71, -58, -31, 19, -78, 
+    -11, -51, -95, 20, 2, 6, -99, -58, -38, 12, -53, 84, 12, -36, -69, -27, 
+    -3, -21, 81, -85, 70, 4, 24, -55, 5, 87, -21, -33, 3, -44, -25, 12, -1, 
+    -100, 62, 17, -92, 46, -74, 44, -50,
+  -94, 46, 15, 45, 81, -44, 3, -46, 89, -59, -21, -12, 93, 70, 90, -13, -5, 
+    52, 40, -93, 81, 47, -58, -26, 52, 15, -35, 93, -53, -21, 45, -8, -60, 
+    69, -74, 75, -30, 1, 49, 19, -29, 98, -13, -40, 13, 57, -62, 97, -14, 
+    -33, -78, -12, -31, -20, -51, -41, 79, 67, -38, -60, -28, 12, -86, -36, 
+    -100, -99, 51, 44, 85, 78, 80, -5, -42, -52, -85, -2, -43, -27, -34, -98, 
+    25, -58, -90, 10, 32, 25, -72, -65, 38, 66, 99, 32, 44, 79, 63, -67, -9, 
+    -81, -87, 83, 74, 92, 26, 91, -21, 81, 79, -65, 5, 25, -64, 81, 28, -17, 
+    93, -47, -95, 89, -9, 70, -92, -50, -98, -9, -99, -97, -65, 14, 97, 23, 
+    24, 82, -67, -19, 26, 80, 44, 62, -75, 44, -89, 50, 51, 77, 4, -4, -99, 
+    -49, -9, -90, 43, -38, 52, 68, 63, -84, -67, 0, -66, 75, -64, 25, 39, 52, 
+    -75, -100, -94, 60, 13, 35, 84, -6, -68, 84, -18, -84, 32, -75, -61, -8, 
+    87, -14, -67, 74, 74, -93, -63, -77, -97, 85, -76, -76, 25, 84, -24, -23, 
+    -53, 67, 49, 95, -95, 46, -40, 93, -12, 68, 2, 61, 85, -27, 46, 3, 77, 
+    -23, -93, 81, -99, -73, -35, -99, 39, -15, 46, 6, 93, -5, 16, 3, -92, 52, 
+    93, 70, -44, 71, 23, -23, 70, 48, -32, 35, 85, 55, -52, -39, 1, 9, -69, 
+    -81, 8, -72, 59, -47, 72, 44, -99, 84, 33, 99, 74, 96, 64, 4, 44, 33, 84, 
+    93, -59, -92, 32, 56, -46, -23, -66, -75, -7, 38, -96, -60, 47, -29, -62, 
+    56, 66, -78, -81, -15, -12, 96, 31, 73, 82, 30, 39, 46, 75, 49, -47, -58, 
+    -35, -19, -43, -69, 53, 18, -12, 26, 31, 9, -44, 37, -2, -53, 13, 66, 
+    -17, -18, 14, 36, 73, 94, 36, 36, -11, -62, 25, -92, 20, 17, -7, 63, 49, 
+    72, 23,
+  13, -36, 22, -76, 41, -83, 1, -65, 64, 62, -62, -84, 7, 56, 76, 0, 39, 51, 
+    93, -31, -23, -66, 55, 99, -30, 38, -99, 12, -5, 31, -25, 22, 6, 43, 18, 
+    -32, -2, -72, -61, 37, -10, 36, 12, 46, -31, 77, 6, -99, -31, -91, -97, 
+    94, -78, 87, 86, 54, 1, 50, 52, -93, -18, 5, 2, -50, 6, -57, -72, 63, 78, 
+    19, -68, 32, 13, 96, -63, -76, -68, 42, -2, -36, -25, 37, -23, -24, -52, 
+    -63, 9, -3, 32, -15, -30, 82, -10, -36, -62, 19, 57, -46, 40, 79, 7, 43, 
+    64, -34, -20, -61, 66, -27, -63, -67, -32, 70, -77, -75, -33, 25, -76, 
+    -48, -73, 60, 65, 36, 62, 49, -44, -62, -50, 70, 70, -6, -9, 3, 98, 32, 
+    -50, 96, -40, 83, -17, -85, -90, -3, -28, -74, 29, -83, 65, -5, 83, 61, 
+    17, -21, 84, -91, -27, 43, -72, 14, -62, -22, 38, 80, -60, -11, -68, 56, 
+    -20, -45, -32, 22, -99, -1, 20, -9, 49, 99, -9, -100, 67, -89, 45, -43, 
+    -52, 89, -21, 79, 27, 55, 57, -37, 29, 35, 69, -77, 32, 9, -30, -21, -23, 
+    79, -38, -45, 20, 65, -68, 11, 49, -11, -26, -5, -18, -97, 88, 34, -63, 
+    4, 79, 70, 59, 50, 86, 39, 68, -95, 63, 11, 47, 37, -28, -53, 31, -71, 
+    -62, 88, 28, 90, 38, 17, 80, 33, 38, -64, -36, 34, 12, 54, -52, -7, -54, 
+    79, -17, -53, 87, 70, -85, 56, 57, -83, 45, -46, 45, -51, -40, 34, 51, 
+    -92, 96, -11, -51, 38, 72, -64, -76, -24, 24, -3, 16, -80, 45, -3, -60, 
+    5, 34, -69, 56, -29, -22, -57, 55, -18, -21, -48, 31, -96, -45, -6, 34, 
+    -19, 97, 83, -15, 76, -6, -74, -14, -66, 93, 11, 57, -67, -30, 24, 57, 
+    -17, -32, -98, 62, -25, -34, -94, 57, -91, -72, -57, -80, 59, -43, 97, 
+    27, -64, -36, 1, 2,
+  17, -75, 21, 65, -37, -99, -21, 17, -11, 61, 88, -35, -79, 14, -27, -18, 
+    -91, 91, 26, 48, 5, -58, 45, 78, 52, -27, -90, -69, -56, -68, -35, -90, 
+    59, -59, -75, -43, -81, -38, -33, -20, -49, -17, -3, 24, 57, -85, -59, 
+    93, -87, -56, 89, 49, -79, 63, -56, -83, -96, 50, 25, 73, 27, -46, 70, 
+    55, -83, -98, 86, -48, 69, -67, -62, 26, -97, 73, -22, 63, 76, -75, 2, 
+    -72, 32, 51, -57, -39, 20, 44, -92, 84, 34, 55, -100, -68, -6, 68, 31, 
+    -7, -86, 28, -84, 47, -79, 54, -43, 69, 58, -58, 87, -10, -12, 14, -29, 
+    37, 24, 68, -93, -35, 75, -67, -4, 74, -89, 29, 56, -51, -1, -37, -90, 
+    -91, -75, 14, 24, -30, -73, 65, -1, 53, 9, -16, 68, 40, -88, 91, -80, 71, 
+    -59, -27, 64, 7, -2, -33, 79, 51, -79, 13, 85, 8, 18, 2, 79, 50, -8, 4, 
+    -91, -62, 43, 4, 40, -83, 2, 78, -38, -53, -35, 5, 55, -5, 78, -60, -34, 
+    -4, 22, -70, 43, -66, 89, -73, -45, 74, 17, -2, -42, 19, -55, 33, 59, 
+    -33, -31, -8, -92, -100, -60, 90, 0, -48, -100, 87, -28, 95, -32, -57, 
+    -76, 76, -95, -22, 16, -86, 23, 26, 45, 4, -3, 57, -48, -17, 19, -34, 
+    -95, -83, 40, -40, 13, 74, -62, -88, -84, 67, -80, 40, 0, -9, 55, -62, 
+    69, -39, 74, -41, -27, -58, 69, 47, 28, 79, -18, 40, 68, -57, 69, 56, 
+    -54, 51, -85, -45, -76, 34, 65, -56, 35, -89, -66, 95, -86, 55, -92, -94, 
+    -12, -20, -99, 51, -76, 57, 59, -87, 74, 7, -77, -24, -81, -77, -41, -19, 
+    47, 18, -89, 11, 73, 59, 77, -82, 99, -97, 21, -96, 43, 97, -83, 93, 22, 
+    -25, 21, -27, -26, 11, -58, -8, 49, -73, -89, -81, 13, -39, 30, 15, 73, 
+    68, 98, -83, 45, -82, -81, 64, -26, -63, 89,
+  -15, -98, -90, -73, -78, 57, -99, 21, 21, 39, -42, -2, 60, 74, 4, -13, 90, 
+    -79, -89, 86, -5, -94, -75, 48, 74, 11, -32, 62, -37, 91, -66, -41, 48, 
+    67, 95, -89, -43, 9, 77, -63, -26, 42, -83, 7, 75, 19, -33, 63, 56, 67, 
+    -15, -88, 66, 47, 55, -63, -48, 75, -28, 84, 50, 85, -28, -15, 10, 39, 
+    -100, 98, -92, -11, 6, 44, 16, 81, -67, -1, 43, -73, 3, 73, 49, 33, -53, 
+    3, 83, 20, 1, -39, -73, -86, -48, 40, 67, -33, 48, -91, 1, 44, -76, -92, 
+    -41, 80, -10, -21, -57, 51, -78, -72, 16, 80, 80, -71, -21, -85, 77, 7, 
+    -28, 32, 17, -56, -88, 26, 37, 61, 53, -60, -59, -39, -90, 85, -38, -84, 
+    24, -17, -87, 31, 15, -74, -51, -52, -62, 71, -88, -14, 71, -23, 25, -61, 
+    -92, -25, -17, -81, -34, 63, 87, -10, 56, -35, -51, 9, 59, 42, 46, -2, 
+    -98, 0, 57, 8, 63, -29, 81, 0, 54, 77, -35, -30, -56, -9, 36, 88, -36, 
+    84, -58, 63, 36, 76, -26, 33, 21, -87, 95, -19, -38, -37, -4, -82, 46, 
+    -67, 58, 12, -33, 49, 62, -95, -55, -90, 69, 20, -73, 80, 15, 14, -8, 46, 
+    -53, -93, 89, -3, -91, -83, -10, -52, 22, 17, 59, 90, 38, -67, -85, 0, 8, 
+    -1, 13, -67, 81, 13, -61, 73, 64, -42, -19, -84, 12, 18, 47, 33, -19, 3, 
+    -36, 87, -32, 93, -96, 91, 63, 51, -91, 4, -98, -77, -2, -48, 21, 24, 
+    -88, 20, 91, -77, -42, 58, 89, 79, 79, 58, -12, 55, 36, 7, 13, 85, 90, 
+    56, -84, -71, 38, 5, -14, -29, -87, 13, -12, -49, -18, -93, 87, -23, 88, 
+    13, 24, 31, -83, -86, -31, -7, 75, 64, 72, 82, -36, -83, 54, 50, -73, 
+    -43, -11, 26, -60, 36, -76, 12, -62, -44, 60, -25, 27, -64, 73, -74, -67, 
+    92, 32, 82, 32,
+  53, 69, -42, -17, 56, 36, 87, -14, 1, -36, 83, 75, 71, 81, -92, -59, 61, 
+    -45, -23, -68, -26, 29, 45, 70, -35, 29, 52, 86, 63, -55, -51, -8, 88, 
+    -30, -6, -24, -12, 95, -6, -77, 85, 82, 46, -69, -24, -90, 65, -73, -47, 
+    -99, 58, 67, 15, -21, 93, 22, 28, -20, -29, -48, -42, -98, -82, 74, 3, 
+    -42, 6, 12, -44, -61, -68, 49, 2, -17, -78, -33, -26, -67, 74, 90, -68, 
+    82, -89, 40, 15, -94, 58, -96, 12, 7, -76, 24, -26, -43, -51, -62, -78, 
+    63, 2, 26, -21, -100, -21, -61, 60, 5, -20, -16, -78, -95, 59, -36, 71, 
+    -41, 95, 33, -10, 87, 69, 69, -88, -11, 97, -39, -69, -35, -78, -18, 8, 
+    49, 71, -10, -55, 77, -94, -77, -80, 39, 28, 28, -76, -64, 51, -81, 92, 
+    -73, 73, 51, -78, -33, 12, -56, 14, 53, -50, -67, 91, 86, 63, 9, 0, -22, 
+    25, -100, 81, -81, 57, 92, 5, 22, 44, 84, -84, -32, 91, 76, -65, -45, 
+    -80, 79, 36, 95, -87, -34, 63, -62, 57, -76, -85, -73, 87, -99, -1, 13, 
+    -54, -87, -24, -55, -34, -95, 13, -67, -85, -69, -84, 30, -29, 41, -85, 
+    -41, -69, 62, -42, 40, -82, -55, -41, -90, 22, -57, 46, 61, 54, 73, 31, 
+    57, -43, 45, 48, 34, -42, -47, -91, -82, 46, 68, -18, -19, 78, 16, -63, 
+    -27, 71, -76, -55, -54, 31, 87, -99, -68, 48, 4, 42, 28, 14, 87, 73, -38, 
+    30, 5, 67, 52, 71, -53, 40, -95, -52, 19, 68, 39, -56, 59, 19, 98, 47, 
+    12, 90, -28, 23, 55, 34, 40, 86, -68, 3, 63, 73, 77, -16, 67, -36, -37, 
+    13, 26, 4, -93, 1, 14, -61, -78, -71, 94, -86, 46, -91, -93, 14, -9, -42, 
+    83, -98, -90, 0, -90, 27, 51, -81, -21, 98, -99, -18, -40, 58, 64, 80, 
+    90, -85, 92, -66, 8, 54, 9, 15,
+  10, -59, 86, -3, -21, 13, 92, 31, -59, -26, 69, 82, 93, -16, -32, 2, -4, 
+    -59, 86, -1, 10, -32, -51, 88, 17, -20, -62, -26, 74, 36, 99, 18, -90, 
+    25, 90, 2, 86, 16, -77, -34, -88, -3, 10, -96, 37, 7, 97, -17, 98, 38, 
+    31, -85, 37, -63, 54, -95, -63, -83, 90, -16, 71, -39, -29, 35, 45, 36, 
+    -13, -73, -2, -94, -5, 76, -16, -39, 70, 41, -80, 41, 24, -68, -58, 10, 
+    98, 1, -72, 10, 82, 30, -54, -82, -87, 79, 71, 6, -74, 72, -28, -16, -10, 
+    -33, -86, 90, -1, 32, 22, 83, -98, 27, -69, 47, -91, 62, 46, 87, -55, 
+    -77, -19, 20, 78, 73, -71, 75, 19, -93, -96, 98, 63, -41, 34, -97, 20, 
+    -39, 5, -69, -73, -56, 94, -93, -78, 58, 66, 20, -16, -71, -78, 88, -81, 
+    1, 69, 97, 53, -4, 24, -82, 11, -63, -58, 0, 49, 24, 50, -91, 8, 6, -79, 
+    32, 72, -3, 62, 92, 35, -48, -87, -83, 90, 95, -36, -80, -7, 12, -85, 
+    -27, 32, -70, -82, 4, 28, 65, 66, 66, 99, 5, -11, -20, -66, 56, 72, -28, 
+    -72, -48, -72, -9, 44, 18, -28, 24, -84, -38, -14, -32, 90, 45, -7, -5, 
+    -72, -46, 93, -55, -43, -15, 14, -99, -88, -29, -18, 63, 38, 82, -95, 50, 
+    80, -41, 28, -40, 44, 72, 17, 48, -87, 61, 32, 75, -34, -65, -75, 38, 92, 
+    38, -42, 88, 48, -59, -60, -39, 71, 13, 75, 25, 31, -50, 7, -51, 60, -93, 
+    -60, 19, -33, 38, 43, -98, -70, 72, 56, -13, -71, -54, 68, 24, -46, 85, 
+    47, 58, -30, 19, -92, 17, -72, -53, 44, 33, -36, -60, -15, -10, 44, 5, 
+    19, 54, -12, -15, 35, 67, -9, 63, 60, 37, 46, -2, 63, 96, 83, -57, -58, 
+    -68, -85, 76, 87, -93, -51, 18, 97, 82, -50, -13, 4, 96, 99, -87, 50, 29, 
+    94, -31, -44,
+  -16, -34, 55, 0, 99, 79, 18, -98, 97, 8, 6, -74, -21, 17, 6, 28, -27, 54, 
+    36, 85, -43, 18, 73, 94, 52, -14, 54, -21, 15, -92, -90, 13, -74, -9, 6, 
+    -21, -37, -75, 5, -5, -81, -85, -73, -10, -72, 90, -29, 68, 87, -13, -45, 
+    -14, -64, 4, -37, 42, -87, 97, 11, 49, 86, 40, -37, 7, 10, 11, -16, -85, 
+    -54, 57, -13, -25, -17, 97, -56, -88, 98, -13, 42, -38, 27, -29, -87, 
+    -34, 58, -49, 25, -32, 96, 56, -20, 6, -6, 85, -83, -36, -51, -80, -39, 
+    53, -51, 11, -91, 40, 21, -22, 8, -69, 26, 26, -17, -30, -40, 76, -15, 
+    -43, -55, 22, -67, -86, -77, 3, 74, -66, -64, -24, 54, -30, 12, 23, 20, 
+    -16, -15, -77, 4, 2, 54, -57, 24, -94, -100, -7, -60, -41, 7, 69, -55, 8, 
+    -32, 2, -46, 99, -51, 40, 85, -16, 92, -18, -46, -42, 72, 95, -64, -53, 
+    23, -44, 71, 86, 30, -86, 75, -2, -67, -97, -65, 76, 8, -92, -59, -100, 
+    -42, 34, -36, -39, 99, -33, -71, 16, -8, -15, -88, 12, -31, -26, 91, -59, 
+    69, 65, 34, -94, 14, 0, 12, 75, -7, 1, -35, 21, 8, -59, -29, -77, -1, 56, 
+    -63, -80, 31, 72, -83, 63, -42, 76, 4, 10, 33, 30, 20, -49, -8, -52, 
+    -100, -43, 75, -21, 98, 62, -65, 60, 5, 54, 8, 89, 78, 60, -51, -4, -24, 
+    16, 2, -9, 87, 45, -54, -95, -10, -9, -8, -96, 70, 93, -62, -67, -16, 
+    -72, -69, 56, -43, -63, 1, 46, -94, -33, -4, -46, -33, -50, 15, 67, -79, 
+    81, 94, -67, 38, 71, 0, 31, 66, 53, -90, 31, -81, -65, 81, -64, 7, -25, 
+    55, 87, 79, -87, 19, -22, 22, 36, 21, -38, -61, -58, -70, 96, -93, 26, 
+    62, 16, 4, 53, 39, -17, 35, 32, -42, 38, 9, -65, 6, -28, 54, -64, -23, 
+    -94, 8, 19, 76,
+  17, -97, 2, -97, 2, 71, 86, -25, 71, 97, -67, -77, -27, -63, 59, -81, 25, 
+    -59, -43, -38, 65, 98, 10, -63, -58, 66, 63, -88, 94, 59, 24, -29, -58, 
+    -23, 74, 20, -44, 22, -92, -57, -10, -55, 36, 29, -9, 3, -41, 68, 82, 79, 
+    -71, 80, -65, 5, -32, 73, -90, 50, 26, -61, 90, 22, -39, 45, -64, 64, 
+    -80, -15, 85, -96, -42, 66, 50, -80, 38, 79, -40, 70, 44, -12, -78, -16, 
+    45, 6, -55, 55, -56, -97, -89, -43, 42, 13, -32, -83, -61, -82, 71, 48, 
+    5, -78, -35, -96, 13, -39, -41, -6, -68, 38, -90, 90, -86, 14, -55, -97, 
+    -87, -4, 19, 68, -65, 72, 64, 21, -51, 25, -93, -35, -51, -41, -35, -74, 
+    11, -5, 51, -52, -96, 26, -80, 21, -97, 0, 3, 13, -53, -53, 25, -63, -41, 
+    -38, 79, -3, 47, 10, -26, 15, -83, 72, 90, -25, 11, -9, -82, -17, 71, 
+    -74, -49, -67, -7, 41, 6, -21, 40, -12, 95, 79, -62, 41, 58, -19, -55, 
+    -87, 28, 9, -24, -93, 18, -85, -92, 50, 55, 33, -74, -51, -25, 21, 95, 
+    86, -66, 79, -32, -53, 95, -24, 64, 99, 50, 45, -68, -63, 12, -66, 29, 
+    -11, 37, -70, -3, -62, -23, 48, 77, -17, -98, 72, -76, 47, 45, -16, 30, 
+    12, 80, 66, -54, 89, -56, -24, 9, -52, 10, -17, 66, 53, -71, -65, 53, 
+    -85, -31, 10, -1, 40, 65, -58, 8, 42, -66, 36, 93, 37, -47, 74, -16, 96, 
+    77, -36, -80, -79, 18, -33, 89, -88, 35, 93, -53, 43, 39, 30, 4, 32, -86, 
+    -5, -65, 8, -77, -6, 32, 30, -18, 44, -65, -47, 21, 3, 76, 8, -75, -45, 
+    5, -54, -44, 56, 85, 11, -40, 58, -61, -78, -57, -99, -28, -88, -21, -35, 
+    79, 86, 29, -14, 71, 21, 46, 58, -51, -76, 85, -44, 53, 52, 31, -25, 81, 
+    -70, -71, 86, 71, 25, -3,
+  88, 65, 32, -33, -83, 93, 94, -46, -23, 62, 77, -77, 42, 0, -76, -20, 59, 
+    -7, 59, -10, 88, -94, -69, -8, -34, 52, 36, -67, -62, -65, -83, 52, 53, 
+    56, 83, 30, -8, -83, 88, 28, -98, 41, 17, 29, 7, -52, -80, -85, -13, 28, 
+    -29, 81, 62, 10, -24, -44, 60, -82, 1, -91, -79, 35, -59, 66, 69, -48, 
+    42, 22, 71, -21, 7, 9, 23, -58, 80, 29, -17, -54, 2, -25, -15, -31, -55, 
+    -50, 77, 94, 15, 92, 15, -69, -60, -2, -79, -47, -47, 45, -31, 7, -39, 
+    41, -3, -30, -75, -59, 18, -31, 44, 90, -79, -43, -30, -51, -80, -14, 
+    -40, 45, -75, 99, 5, -98, 52, 88, -43, 26, -37, 47, -18, 72, -15, 68, 24, 
+    96, -57, -60, -9, 61, -35, 97, 74, -38, -25, 81, -57, 46, -26, -6, 72, 2, 
+    -57, 16, -74, 71, 47, -48, 85, -63, -21, -28, 82, 0, -76, -76, -7, 25, 
+    -24, -83, 37, -87, -37, -53, 65, -50, -88, 59, -96, -42, 7, 18, 18, 18, 
+    -99, -53, 16, 29, -89, 75, 72, -20, 25, -78, -5, 58, -48, 63, -21, -84, 
+    68, 20, -11, -74, 93, 88, -78, 61, -78, -74, -43, 68, -100, -2, 93, 67, 
+    4, -60, -52, -12, 83, -25, 22, 87, -17, 98, -58, -54, 94, -90, -61, -96, 
+    -14, -66, -20, -32, 21, 78, 53, -100, 22, 1, -86, -64, -95, -44, -38, 75, 
+    -87, -89, -72, 70, -95, 64, 11, -82, -10, -42, 85, 32, -49, -29, -2, -61, 
+    -38, 20, 4, -7, 56, -68, 95, 22, -9, 39, 43, 16, -63, 45, -18, -30, 8, 
+    13, 12, 65, -5, -87, -95, 46, 33, 54, 39, -62, -95, 31, 67, -17, -16, 
+    -49, -59, 27, 44, 23, 85, -11, -32, 95, -21, 66, -84, -75, 91, 61, -93, 
+    -80, 36, 28, -32, -35, -69, -93, 8, 18, 37, 77, 34, 82, -42, 75, 56, -46, 
+    -37, -90, -33, 35, -25, -46, -66,
+  72, -93, 33, 65, -13, 6, -44, -88, 21, -33, 5, 21, 14, 20, -47, 75, -37, 
+    94, -94, -27, -37, 74, 9, 94, 56, 91, -39, 0, 81, 3, -82, -96, -93, -32, 
+    -100, 97, 50, 93, -9, 13, -37, -88, 39, -31, -100, -38, 98, -57, -82, 88, 
+    -11, 96, 21, -90, -89, -8, -24, -43, 3, 71, 1, -32, -40, -78, -52, 42, 
+    -84, 18, 41, 13, 59, -86, 17, 2, 64, -50, -89, 41, 71, 23, 84, 38, 90, 
+    -43, -100, 9, 26, -24, -36, 55, 98, -90, -35, 12, 33, 20, 63, -16, 89, 
+    -9, 68, 90, -28, -68, -47, 78, -44, 83, -12, -12, 51, -29, 33, -53, 8, 4, 
+    -91, -58, 9, -35, 80, -2, 20, -16, -51, 73, 75, 90, -58, 93, 37, -75, 92, 
+    44, -56, 47, 88, -3, -83, 45, 30, 41, 20, -14, 97, -3, -32, -97, -85, 
+    -88, 50, 2, 4, 64, -55, 86, 1, -53, -89, 55, -29, 5, -76, 6, -25, -10, 
+    -70, -77, 30, -19, 1, -20, 75, 16, 11, 41, -21, 72, -99, 33, -64, 45, 
+    -95, 82, -81, 55, -65, -60, -86, -30, 65, 5, 95, -67, -60, -52, -79, 39, 
+    -4, -91, 54, 75, -87, 8, -12, 15, 10, 56, -86, -97, -23, -68, -8, -77, 
+    65, -93, 30, -50, -64, -16, 69, 12, -32, -50, 95, -34, 25, 55, -85, -98, 
+    69, 88, -72, 65, -38, -38, 19, 67, -10, -80, 52, 41, -22, -67, -59, -98, 
+    -86, 62, -54, -81, 82, 73, -28, -11, -55, -2, -37, -3, 46, -66, 2, 16, 
+    -64, -72, -76, 4, 44, -98, 5, -26, -42, -86, -99, 62, 32, -93, -38, -46, 
+    -67, 38, 43, 49, -55, 40, -86, 40, -46, 49, -29, 34, -85, 62, -34, 60, 
+    53, -33, 70, -50, 24, -48, 36, -71, 78, -39, 64, 28, 93, 84, -66, -31, 
+    25, 85, -50, 38, -82, 14, 68, -94, -47, -61, 85, 86, -6, 87, 68, 73, 92, 
+    92, 62, 86, 25, 56, 55,
+  -33, -45, -63, 80, 95, 79, -37, 7, 80, 68, -95, -3, 90, 94, -50, 53, -63, 
+    -66, 53, -61, 6, 38, -94, 55, -57, -72, -72, -66, 30, 5, -42, -47, 18, 
+    86, 3, 62, -93, -8, -74, 19, 2, 28, 76, 96, 26, 82, -74, -50, -39, 71, 
+    19, -63, -63, 71, 74, 12, -50, 79, -70, -95, -35, 10, -6, 92, -7, 38, 51, 
+    -36, 5, -40, -42, -73, -84, 18, 84, -49, 24, 65, -92, 77, 72, 14, 22, 78, 
+    -85, 26, -59, -93, 35, 65, 5, 52, 89, -34, -48, 35, -37, -1, -48, -18, 
+    81, -8, -31, -10, 26, 87, -2, -91, 47, -40, 30, 48, -82, -22, 50, 90, 25, 
+    81, 23, -80, 29, -25, 44, -92, -25, 3, -50, -61, 87, 20, -84, -94, -55, 
+    -34, -85, 14, 90, 72, 98, 14, 88, -42, 91, 59, -81, -39, -52, 34, -9, 97, 
+    2, 21, 75, 63, -26, -4, -70, 82, -41, 40, 38, -13, 52, -1, 17, -35, 42, 
+    5, 42, -1, 57, 14, -36, 68, 68, -99, 27, 11, -62, 84, 86, 60, -55, -62, 
+    12, 79, 90, -79, -32, 30, -97, 79, 78, 50, 89, 74, -7, 25, 29, -97, 27, 
+    43, -23, 33, 89, -84, -93, 91, -51, -96, -25, 8, -71, 26, 54, 53, 94, 
+    -51, 13, -1, 70, -21, -11, 77, -66, -63, 12, -87, -3, 76, 56, 80, -23, 
+    -83, -99, 33, -74, -12, 34, -14, -59, 77, -43, 46, -45, 87, -68, -16, 
+    -71, 60, -99, 12, -11, 36, 8, 51, 47, 18, -94, 35, -94, -5, -67, -33, 11, 
+    35, 40, -67, -52, 28, -34, 80, 86, 28, -88, -72, 34, -31, -13, -20, 38, 
+    30, -80, 37, -37, 28, -44, -73, 31, 2, -28, -66, 59, -83, 57, 55, -59, 
+    25, 91, -26, 40, -58, 18, -75, 22, -1, -2, -22, -72, 14, 62, -25, -80, 
+    -22, -54, 51, 50, 63, -37, -8, -67, 81, 93, -18, 83, 59, -26, -74, 44, 
+    59, 40, -40, 39,
+  -97, -8, -25, -21, 12, -63, 93, -21, 72, -78, -25, -49, -70, -76, 84, -4, 
+    -4, 2, 9, 90, -68, 22, 54, 33, 89, 73, 46, 8, 55, -65, -44, 86, -99, -44, 
+    25, 23, -29, -8, -5, 82, -50, -3, 42, -69, -83, -89, 92, 13, -80, 52, 97, 
+    -10, -16, 50, -73, 36, -66, -36, 74, 38, -65, 84, 82, 8, -65, 36, 76, 
+    -80, 3, 80, -41, 84, 3, -53, 81, 26, 51, 96, -75, 45, 19, -94, -28, -99, 
+    46, -99, -13, 96, 98, 52, -4, -33, 80, -35, -44, 40, 26, -64, -88, -39, 
+    45, 49, -91, 43, -27, -39, 2, -7, -62, 51, -27, -33, 62, -69, -55, -49, 
+    83, -71, 74, -9, 27, -17, 52, -17, 7, -19, -84, -32, -43, 66, 49, -56, 
+    12, 42, 43, 75, -3, 75, 87, 13, 44, 18, -59, 75, 68, 55, -7, -30, -46, 
+    -13, 24, -48, 55, 89, -69, 8, 85, 56, 63, -58, 47, 12, -91, 62, -42, -99, 
+    -29, 14, 78, 46, 13, 11, -69, -9, -22, 38, -81, 4, 31, -16, 34, 58, 72, 
+    -60, 46, -92, -40, -46, -24, 45, 65, 32, 7, -32, -64, 53, -82, 92, -22, 
+    -52, 12, 53, 47, -69, 16, 67, 5, -89, 80, -36, 34, -64, -3, -58, -11, 65, 
+    70, -33, -36, 25, -90, 68, 47, -64, 31, -1, -99, 27, 86, -22, -99, 43, 
+    50, -67, 73, -40, 61, 27, -96, -18, 61, 23, 6, 68, 57, 96, 55, -15, -25, 
+    -43, 24, 40, -92, 50, -18, 36, -9, -14, 88, 3, -97, -52, -9, -49, 39, 86, 
+    63, 88, -100, 46, 70, 90, -56, 5, 5, 92, -55, 62, 68, -19, 61, -16, 6, 
+    33, -28, -35, 12, 99, -98, 0, -45, 61, 63, 84, 56, -26, 42, 37, -68, -12, 
+    -62, -14, -58, -90, 88, 5, -71, 60, -53, -86, -29, 41, -51, 77, 66, -31, 
+    22, -31, -14, 97, -73, 63, -30, -28, -23, -56, 43, 30, -34, 61, -32, -16, 
+    -57,
+  88, -97, -8, 96, 95, -7, -55, 98, 1, -17, 73, -85, -97, -21, 66, 2, 68, 61, 
+    30, 15, 90, -78, 98, 36, 19, 98, 76, -18, -13, 75, 81, 5, 86, -51, -2, 
+    -80, 48, -90, 54, -71, 57, 43, -95, -13, -82, -87, -93, -44, 55, 66, 65, 
+    -57, 36, 49, 97, 73, 39, -31, 59, 97, 31, 60, -100, 43, 70, 69, 80, -40, 
+    62, 95, 62, 61, 42, -7, -9, -67, -11, -36, 8, -48, -13, -93, 35, 16, 74, 
+    1, -90, -68, -14, -20, -17, 66, -57, -62, -70, 91, -77, -97, -5, 34, -84, 
+    94, -77, 77, -37, 13, -54, -3, -20, -77, -61, 98, -29, 46, 43, -30, -60, 
+    -48, 1, -73, 10, 5, -38, -88, -86, -96, 79, 67, -26, 19, -100, -97, 32, 
+    -39, -24, 7, 78, -53, -38, -10, 86, -71, -2, 47, 0, -7, 76, 36, -62, -67, 
+    36, 24, -21, -8, -39, -53, -6, -88, -52, -8, -61, 26, -35, -11, -61, 39, 
+    39, -49, 29, 46, 92, 92, -29, 9, -20, -18, 85, 29, 9, -11, -83, 31, 34, 
+    -60, -10, 53, -36, -52, 70, -21, 39, -95, -16, 47, 84, -10, 35, 22, -63, 
+    76, 48, -98, 26, -26, -77, 52, -15, 60, 48, 47, 83, -53, -32, -83, -19, 
+    39, -6, -11, -91, -48, 42, 75, -18, -58, -56, 93, -64, 62, -19, -44, 55, 
+    74, 20, 8, 32, -21, -94, 32, 99, -77, 59, 99, 6, -69, -35, -89, 71, 93, 
+    -74, -87, 1, -52, -9, 62, 15, 57, 42, -60, -62, -23, 87, -86, -40, 77, 3, 
+    3, 28, 70, -86, -82, 2, 81, -1, -89, -18, -1, -93, -11, 55, -78, 84, 37, 
+    -83, 10, 27, -53, -40, -58, -25, 13, 91, 21, 21, 19, 23, 50, 81, 18, 51, 
+    96, 6, 14, -10, 30, 25, 67, 32, -48, -91, -9, 50, -44, -10, 60, -18, -5, 
+    -72, -68, 62, 83, 19, 46, 70, 90, 49, 59, 12, -68, -19, -3, -27, -32, 29,
+  -40, 25, 56, -90, 69, -98, 64, 12, -71, -5, -80, 52, -44, -23, -90, 75, 
+    -14, -40, 93, 53, 41, -15, -84, -14, 24, -65, -42, 22, -12, 42, -42, 72, 
+    30, 81, -98, 36, 57, 94, -80, -13, -35, 8, 84, 57, -64, 54, -91, -46, 78, 
+    24, -6, 37, 55, 92, 97, 78, -7, -13, 88, 43, -1, 6, 32, 61, -40, -34, 91, 
+    -30, 82, 41, 15, -81, -99, -86, -20, -27, 47, 25, 86, 87, 0, -88, 88, 
+    -72, -9, -15, -57, 25, 65, 66, -30, 69, -81, -73, -92, 22, 35, 62, 11, 
+    36, -35, -69, 6, 54, 20, 99, 65, 20, 12, -6, 95, -54, 59, 2, -45, -29, 
+    -4, 87, 73, -87, 4, 68, 46, -93, -74, -8, 54, 41, 24, 78, 41, -55, -55, 
+    38, 30, -97, -73, 85, -65, -9, -27, 63, -85, -58, -62, -60, 91, 84, 31, 
+    72, 46, 65, -45, 48, -86, 53, 47, -37, 88, -5, 97, -62, 31, -38, 62, 64, 
+    -1, -77, 99, 19, -71, 25, 45, -69, -51, -92, -55, 65, 5, 93, -44, 98, 
+    -40, -72, 54, 97, 80, -20, 50, 14, 35, 83, 67, -12, -77, -29, 59, 2, -32, 
+    4, 10, 10, 92, -54, -43, 66, 33, 36, -8, 60, -49, 13, 21, 1, -89, -39, 
+    31, 49, 82, -31, 39, 42, -4, -61, 94, -52, -24, -97, 91, 87, -16, -89, 
+    -98, -54, -9, 88, -94, 10, -18, -28, -6, 43, 91, -54, 40, -16, 30, 98, 
+    52, -65, 43, -6, 26, 40, 88, -41, 66, -57, 48, 9, 91, -37, 42, -12, 93, 
+    21, -73, 4, 74, -57, 43, -85, -25, -31, 78, 69, -50, 10, -68, -6, -40, 
+    -26, 19, -50, 82, -87, -27, 55, 1, -81, -69, -84, 10, 3, -67, 44, 85, 47, 
+    -63, 55, 34, -9, 35, -5, 18, -1, -93, -5, 73, 0, 15, 95, -37, -27, -41, 
+    -57, 54, -84, -55, 56, -25, -66, 14, 3, 15, 97, -87, 58, -65, -72, 23, 
+    -21, 97,
+  -29, -76, 35, -21, -78, -68, -4, -97, -26, -70, 54, 34, 5, -32, 43, 40, 
+    -59, -42, 66, 22, -36, 59, 94, -33, -6, -41, -73, -34, 10, -59, 95, 85, 
+    54, -100, 84, -90, 44, -66, -42, -28, -18, 10, 96, 56, -34, -36, -13, 
+    -81, -11, 48, 47, 37, 73, 83, -68, 27, -8, -19, 97, 92, 96, -65, 64, 1, 
+    -81, 20, 33, -6, -19, 38, -81, 91, 82, 98, -42, -30, 43, 42, -87, -58, 
+    -75, 89, 61, -24, -84, 83, 23, 20, 5, 12, 84, -93, 24, -25, -47, 67, 38, 
+    -6, 87, 40, 12, -56, -50, -27, 2, -87, -57, -3, -42, 59, -70, -72, -96, 
+    -75, 53, 81, -36, 44, 82, -24, -51, -14, 81, 58, -31, 27, 55, 40, 42, 39, 
+    23, -15, 62, 2, -3, -59, -76, -95, 21, 18, 84, -31, 3, -4, -1, -80, 94, 
+    79, 17, -94, -39, 59, -72, -40, 48, -94, -58, 98, -86, -11, 33, 88, -15, 
+    99, 75, -93, -88, 43, 70, -30, -42, 52, -79, 71, -98, 36, -37, -83, -98, 
+    69, 57, 12, 74, -73, -21, 48, 66, -75, 99, 61, 59, 98, 39, -25, -71, 26, 
+    -8, 35, -65, 0, -69, -44, 21, -95, 32, -19, 42, -100, -22, -77, 24, -39, 
+    57, -38, -33, 3, -46, 74, 44, 50, -45, -53, 49, 48, 91, 54, 95, 43, -57, 
+    98, -48, 84, -70, 40, -78, -6, 77, -59, -52, 69, -54, 84, -20, -37, -1, 
+    -100, 25, 27, 49, 43, -9, 23, -86, -14, 39, -32, 98, 54, -75, 95, -43, 
+    94, -38, -47, -83, 83, -7, 45, 27, 43, -24, 12, 21, 69, 75, 94, 15, -49, 
+    -93, 32, 4, 35, 19, 86, -1, 59, 43, -43, 13, -1, -93, 12, -52, -48, -39, 
+    81, -100, -55, 38, -49, -86, -89, 80, -39, 11, -75, -31, -72, -61, -71, 
+    -32, -12, 86, 91, -50, -87, 54, 18, -56, -28, -31, 3, 18, 67, -30, -51, 
+    -14, 0, -84, 33, 21, -99, 98,
+  12, -96, 74, -40, 91, 13, -88, -78, 31, 99, 9, 39, -68, -6, -7, 72, -32, 
+    -22, 74, 68, 14, 48, 30, -61, -18, 34, -16, 29, -19, -12, -36, -93, -95, 
+    76, 60, -73, -21, -63, 76, 39, -37, -52, 62, -34, 15, -43, 72, -1, -83, 
+    -94, -66, -52, 7, 21, 24, -44, 70, -62, 57, -60, -38, -52, 35, 65, -33, 
+    -87, -18, -50, -22, -5, -30, 3, -33, -14, -53, -98, 15, 1, -98, -100, 
+    -100, -70, -39, -36, 66, -85, 24, -43, -5, -42, -1, 74, -90, -86, -71, 
+    -55, 16, -64, 21, 66, 34, -43, -98, -66, -92, -46, 24, -79, 88, 51, 73, 
+    -59, 47, -58, -97, -64, 92, -52, -93, -22, 18, 97, 19, 71, -85, -69, 35, 
+    -58, -57, -64, -21, -59, -98, 57, 41, 94, 8, 59, -85, 0, 67, -18, 61, 
+    -17, -44, 59, -75, -58, 10, -67, -37, 98, 22, 0, 57, -79, -57, -93, 96, 
+    33, 69, 12, 5, -20, -70, 17, -52, -63, -60, 77, 19, -42, 76, -2, -49, 18, 
+    85, 25, -69, 62, 62, 97, -80, 27, -34, -64, -96, 32, 41, -9, -76, -74, 
+    46, 51, -69, -52, -73, -56, 70, -67, 50, -86, -8, 57, -12, 27, 47, 15, 0, 
+    93, 62, -72, -80, -95, -62, -55, -92, -47, 58, -92, -76, 87, 73, 76, 23, 
+    21, 2, -20, 46, 97, 64, -59, 25, 37, 19, -37, -86, 15, -51, 19, 85, -8, 
+    -23, 43, -13, -97, -62, 64, 70, -97, -17, -82, 32, 59, -19, -56, 91, -22, 
+    -24, 3, -96, 36, 82, -100, 34, 7, 85, 78, -60, 97, -92, -99, -74, -86, 
+    49, 80, 6, 65, -40, -1, -3, -38, -60, -25, 31, 28, -71, 85, -80, -32, 97, 
+    -59, 47, 64, 62, 80, -19, 66, 22, -73, 72, -35, 51, 38, -88, 75, 97, -19, 
+    49, 51, 5, -11, 18, 99, 76, -42, 13, -84, -57, 39, 4, 71, 70, -22, 0, 84, 
+    -76, -100, -85, -10, 37, -75, -32,
+  -37, 70, 8, -88, -17, 48, 36, 82, 70, 95, 95, -27, -51, -28, 52, -37, 83, 
+    54, -55, -48, -42, 6, -75, 13, 2, 29, -55, 95, 27, -66, 38, 3, -97, 40, 
+    90, 80, 31, -52, -52, -12, -41, -79, 14, 21, 11, -11, -21, 48, -7, -17, 
+    79, -10, -17, -12, -43, 31, -75, -10, 55, -61, 8, 95, 7, -78, -20, -77, 
+    -5, 66, 73, -2, 10, 33, -66, 95, 69, -77, -17, -18, -4, -7, 53, -58, 64, 
+    -98, 9, 57, -38, 70, 75, -95, -72, 88, -76, -15, -17, -40, -95, -51, -30, 
+    -84, -48, 49, -78, 67, 4, -82, -36, 98, -36, 18, 53, -49, 26, 15, -4, 
+    -82, -55, -43, -99, -9, -16, -47, -17, 38, -14, 90, 1, 87, -65, 50, -44, 
+    -46, -15, -14, 76, 7, 42, 7, 23, 72, 10, -83, -55, 18, 30, -63, 78, 5, 
+    -55, -94, -40, 73, -64, 9, -100, 2, -51, -35, -87, 9, 68, -14, 96, -52, 
+    76, -45, -33, -70, 47, -53, 61, -55, 46, 51, -65, 74, -9, -85, -16, 12, 
+    19, 68, -26, -90, -10, 3, -97, -49, -67, 91, 96, 31, -8, -53, 39, 69, 
+    -34, -9, -56, 52, -81, 38, 75, -55, -69, 2, 72, -55, 39, 94, 70, -89, 
+    -80, -54, 33, -20, -80, 10, -21, 43, 44, -58, 28, 54, 48, 85, 36, 81, 
+    -17, 94, -58, 36, -74, -76, -69, -50, -100, -54, -51, 39, 7, -77, -23, 
+    -54, 79, 85, -85, -96, -21, 47, 40, -32, 32, -7, -69, -51, -46, 39, 87, 
+    -79, -49, -19, 30, -11, 31, 2, -64, -17, 44, 44, -45, 59, 91, 31, 51, 
+    -63, -48, 38, 70, 89, 90, 66, 19, 26, -43, 80, -46, -69, 71, 78, -38, 
+    -45, 94, 95, 43, 48, -74, -6, 23, 62, -50, -90, -19, 74, -81, 87, -81, 
+    69, -74, -19, -100, 85, -24, 32, -20, 22, -56, -87, 40, 55, -36, -33, 
+    -20, -30, 4, -18, 4, -71, -88, 42, 80, -46, -48,
+  7, -17, -100, -54, 20, -86, 25, -83, -83, 44, -50, -49, -18, -45, 15, 81, 
+    21, -23, 44, -16, -39, 21, 39, -74, 53, 34, 57, -94, 19, -66, -60, 81, 
+    -82, 7, 84, -91, -82, 29, -77, -11, 9, 48, -24, 13, -10, 56, 63, 44, 13, 
+    48, 55, 92, 23, 67, 88, -77, 73, 5, 99, 50, -90, 79, -12, -23, 18, -72, 
+    -52, 36, -90, -52, -23, -23, 62, 55, 15, -64, -52, -92, -34, -17, 29, 45, 
+    58, 17, 26, 57, 30, -70, -68, -81, 90, -70, 8, 15, 43, -30, 99, -37, -86, 
+    -65, -4, -24, -29, -31, 53, 39, 86, 92, -39, -42, -84, -58, -6, -64, -88, 
+    16, 77, 51, -18, 17, -68, 12, -26, 51, 53, -98, -49, 34, -53, -82, -57, 
+    29, 77, -8, 35, -92, 35, 99, 96, 6, -91, 88, 64, 24, -52, -82, 15, -77, 
+    -82, 70, 7, 18, -15, -31, 75, -92, 91, 22, -32, -5, 58, -21, -34, 36, 
+    -76, -61, -34, 71, -89, -5, 78, -1, -5, -17, 8, -13, 56, 92, -81, 12, 52, 
+    -47, 95, -13, 91, 15, 8, -52, -20, 8, -37, 11, -63, -62, 9, -65, -95, 34, 
+    -80, -2, -53, 82, -21, -15, 35, -36, -22, 45, -79, 37, -55, 0, -58, 3, 
+    68, -36, 58, 94, 16, -24, 67, -99, 39, 69, 65, -34, 98, 44, -87, 32, 24, 
+    -9, 81, -66, -42, 63, -11, -99, 68, 59, -96, 43, 58, 48, -32, 79, -73, 
+    -17, 40, -16, 50, 27, 78, 93, -14, 28, -82, 75, 62, 47, -44, 27, 72, -74, 
+    -78, -65, -29, 64, -51, 61, -91, -69, 3, -62, 82, -67, -65, 17, -91, -76, 
+    57, 68, 97, -38, 69, 9, 73, 19, 88, 65, 16, -75, -21, 42, 77, -47, 71, 
+    14, -45, -71, -14, 3, 50, -84, -29, 66, 26, 19, -70, -3, -1, 62, 36, 7, 
+    91, -71, -29, 75, 80, -4, 96, -79, 84, 53, -85, -84, -19, -20, 63, 22, 
+    80, 38, -73,
+  84, -42, 26, -32, 20, 80, 41, 67, 10, -66, 98, 15, 92, -57, 69, -28, -87, 
+    -37, 65, -53, -15, -73, -88, 97, -34, -52, -60, -72, -62, 61, -37, -15, 
+    -61, 46, -39, -47, -31, 11, -38, -81, -5, 82, -34, -27, 25, 38, -59, -50, 
+    32, 53, 81, -50, 1, 80, 82, 11, 80, 19, 41, -22, 78, -41, -49, -35, 7, 
+    -92, -1, -55, -18, 34, 45, -71, 44, 35, 72, 0, 72, 76, -22, -29, 41, 96, 
+    -25, -24, -10, -69, 40, 65, 93, 80, 40, -53, 7, -32, 34, -1, 85, -91, 7, 
+    40, 22, 31, -93, 44, 82, -78, 18, 23, -84, -60, -23, -32, 67, -98, -79, 
+    -54, -70, 49, -70, 29, -33, -42, -25, -37, -41, 30, 88, -62, 53, 0, -17, 
+    22, -36, -65, 30, 45, -20, 41, 38, -34, 45, 87, -3, 28, 89, 51, 57, 27, 
+    -67, 49, 60, -98, 5, 61, 8, 73, -46, 15, 18, 32, -92, 23, -67, -78, -89, 
+    -68, 45, -20, -86, -81, 76, 30, -97, 12, -100, -78, 87, 5, -75, 52, -49, 
+    81, 61, 31, 48, 90, 58, -59, -1, 85, 68, -17, -83, 40, -94, -28, 98, 93, 
+    -16, -28, -77, -29, -39, -22, -21, -45, 55, -9, 68, -9, -83, 78, -57, 34, 
+    27, -55, -31, 6, -77, -100, 13, 81, 56, 54, -31, 9, -13, -88, 73, -100, 
+    28, 12, 60, -62, 27, -53, 19, -86, -30, -78, 72, 49, 29, -96, -12, -20, 
+    -82, -52, -39, -50, -7, -90, -26, -52, 90, -12, 22, -41, -98, 4, 41, -5, 
+    -57, -10, -27, 79, 24, -7, 7, -12, -20, 89, 27, -93, 73, -10, -41, 42, 
+    -6, -75, -73, -35, -42, -26, 7, 11, 33, -54, 69, -73, -30, 4, -14, -37, 
+    72, 35, 76, -68, -18, 10, 44, 2, 25, -48, -91, 92, -20, 61, -11, 55, -20, 
+    4, 54, -44, -39, -14, -40, -63, -83, 48, 68, -64, 57, -36, 10, 3, -26, 
+    90, 24, 40, 7, 4, 58,
+  -100, -26, 7, -64, 84, -83, 1, -76, 90, 48, -21, -85, -61, -25, 62, 74, 48, 
+    24, -18, 96, 2, -20, -63, 33, 42, -26, -39, 62, -62, -64, 63, 39, 63, 
+    -47, 72, -58, -1, -90, -56, -7, -99, -40, -82, 24, -58, 5, 93, 64, -5, 
+    94, 90, 90, -19, -46, 89, -90, 92, 33, 6, -12, -23, 50, 30, -77, -33, 43, 
+    38, 23, -11, -30, -94, -9, -10, -93, 88, 21, 84, -87, -93, 26, 33, -99, 
+    -34, 55, 15, -60, -36, 62, -51, -12, -93, -37, 53, -31, 35, 44, -82, 57, 
+    4, -93, 40, -53, -47, 85, -16, 26, 53, -9, -94, 42, -16, -53, 93, -50, 
+    -89, -21, -45, 83, 91, -12, -27, -75, 52, -15, 82, 33, 6, -43, -50, 44, 
+    35, 24, -22, 59, 58, -72, -58, 16, -14, 39, -6, -83, -20, -65, -89, 49, 
+    49, 68, -92, -30, 33, -54, -11, -9, 59, 7, 89, -18, -79, 26, -71, 4, 87, 
+    -46, -64, -77, -55, -96, -50, 47, 2, 17, -7, 46, 47, -76, -94, -74, 65, 
+    45, -98, 91, 0, 13, 33, 76, -100, -34, -78, 95, 78, 20, 74, -35, 27, 71, 
+    16, 95, 92, 3, 17, 11, 58, 99, 13, 22, -35, 5, 37, 90, 75, -16, 13, -31, 
+    -60, 64, 53, -72, 47, 11, -30, 85, 36, 51, -62, 8, 55, -74, -61, 17, 0, 
+    34, -42, -66, 53, -99, 25, -55, -10, -64, 39, 3, 61, -28, 18, 69, 72, 21, 
+    -59, -5, 52, -52, -97, -15, -41, 63, -45, -20, 43, -2, 49, -28, -33, -87, 
+    30, 5, -41, -74, -71, -21, -63, 19, -74, 95, -66, 86, -2, -53, 55, 47, 
+    91, 89, 81, 90, -96, -37, 40, -29, -37, -36, 97, 66, -8, -17, 79, 63, 
+    -51, 30, 31, 35, 91, 81, -87, -30, 17, -54, 58, -35, 32, 70, 51, -27, 
+    -67, 58, -52, 31, 33, 97, 84, 1, -80, -37, -7, 20, -4, -1, -25, -42, 
+    -100, 31, 36, 40, -94,
+  9, -79, 71, -45, 84, 32, 15, -83, -16, 29, 80, 15, 57, -20, 26, 35, -61, 
+    -57, 91, 44, -44, -11, 65, -69, 70, -68, 21, -79, 92, 99, 58, -93, 99, 
+    41, -87, 69, -85, 77, -42, 95, 35, 56, 24, 61, -11, -74, -28, 8, 21, -50, 
+    -18, 91, -84, -52, 90, 49, 23, 64, 82, 28, -33, 65, -22, 73, 17, 57, -92, 
+    -86, -95, -96, -65, -74, 93, 64, 0, 73, -85, 98, -24, -53, -17, -99, -14, 
+    -83, 60, -47, 29, -32, 43, 73, -62, 3, -85, 30, 49, -54, 39, 28, -33, 16, 
+    -57, -8, 46, 67, 25, 26, 95, -52, 64, -65, -16, 43, 1, -33, -39, -47, 
+    -95, 6, -96, 25, 87, 97, -3, -90, -31, -34, 14, 96, -96, -17, 49, 8, -80, 
+    -5, -87, -86, 33, -60, -38, 11, -75, 24, -24, 78, -41, 9, 54, -5, -99, 
+    24, -80, 71, -33, -88, -54, -40, 33, -99, 54, -4, -89, -53, -28, 25, -17, 
+    21, 94, 75, -100, -93, 41, -26, -91, 6, 20, -67, -82, -29, -67, 70, -64, 
+    -36, -56, 25, -58, -32, 84, -45, -89, 92, -53, 87, -68, -1, 61, 55, -19, 
+    51, -5, -77, 17, -91, -3, 1, -82, -98, -34, -30, 95, -8, -46, -40, -99, 
+    80, 71, -23, 96, -6, -12, 51, 25, 86, -57, 85, -56, 60, 16, -36, 35, -68, 
+    -98, 44, 12, 79, -49, -78, -98, -59, -83, -7, -79, 13, 16, 99, 43, -2, 
+    39, -94, -83, 19, -87, 62, -10, 54, 89, 0, -31, 80, 90, -94, -46, 14, 
+    -15, -56, -64, 0, -17, -26, 94, 85, -66, -44, 73, -3, 5, 76, -89, -67, 
+    35, 56, -9, 98, 40, -44, 44, 89, -71, 75, 18, -46, 96, -11, -35, 90, 45, 
+    -32, 89, -71, 80, 33, -76, -67, -3, -65, -45, 33, 5, -25, -37, -37, 95, 
+    -100, -88, 72, -8, -59, -97, -8, 17, -5, 25, 15, -9, 47, -10, 55, -75, 
+    -43, 48, 48, -31, 40, 45,
+  6, 86, -79, -52, 43, 57, 29, 68, -53, 9, 20, -39, 71, 36, 42, -30, 80, -52, 
+    -60, 4, 43, 36, 45, -79, -58, 69, -11, 78, 31, 96, 56, -60, 18, 22, 73, 
+    97, -66, 28, 48, 68, -19, 70, -56, 82, 54, 91, 2, 24, -69, -49, 23, 23, 
+    -29, -80, -8, -27, 5, -54, -6, -88, -57, -73, 87, -29, 62, -56, 32, -34, 
+    -7, -47, -49, -15, 52, 69, 40, -73, 42, -92, -10, -15, -22, -32, 5, 93, 
+    13, 40, -23, 40, -82, -49, -53, -72, -75, 5, -56, 84, -67, -8, -93, -10, 
+    -78, 4, -81, -73, -2, -39, 29, -69, -60, 26, -66, -65, -32, -80, -62, 30, 
+    -5, -93, 7, -41, 75, 58, 94, 84, -39, 42, -96, 84, 45, -31, 24, -11, 5, 
+    55, 75, -54, 25, 63, 85, 51, -34, 58, -44, 48, -67, -59, 81, -44, 22, 
+    -71, -28, -58, 83, 17, 14, 90, 49, 6, 38, -43, 75, -20, -67, 66, -43, 
+    -23, 45, 96, -45, -84, -54, -68, 19, 45, 28, 36, 61, -99, 68, 24, -8, 
+    -34, -77, 56, -34, -88, 73, -79, 26, -43, -88, 43, -20, -55, 51, -24, 36, 
+    3, -36, 18, -41, -52, -81, 52, 22, 38, 66, -64, -44, -33, -46, 64, 3, 
+    -32, 83, -83, 89, 15, 13, -74, 50, -96, 81, 40, -6, 15, -84, -86, 60, 
+    -55, -41, -71, -91, 4, 18, 78, 87, -73, -90, 77, 57, 17, -1, -88, -37, 
+    -94, -44, -85, 55, -56, -53, 94, 79, -84, 56, -29, 35, 2, 50, -6, -63, 
+    -90, -5, 71, -1, -82, 46, -26, -39, -59, 75, -34, -23, -62, 83, 77, -35, 
+    41, -35, -92, 96, 60, 44, -14, -37, -67, -71, -17, -50, 64, -66, 78, 5, 
+    41, -29, -85, 89, -56, -90, -22, -28, -6, -18, 78, 78, 17, -64, -35, 94, 
+    7, -54, 53, 31, 28, -52, 73, -100, -88, 99, 1, -11, -95, 9, 92, 52, 33, 
+    10, -84, -42, 33, -94, 20, 83,
+  -42, -97, -86, -70, 85, -59, -45, -79, 15, 94, 28, -3, -63, -68, -94, -54, 
+    -58, 74, 6, -43, 56, 63, 49, 24, -63, -87, 97, -8, 26, 23, -73, -38, 
+    -100, -14, 58, 26, -10, -38, -66, 95, 11, 67, -11, -30, -55, -17, 32, 38, 
+    -41, 83, -70, 87, -94, -38, 19, -60, -13, -94, 3, -6, 74, 0, -88, -85, 
+    71, 57, -28, -99, 12, -47, -72, -11, 54, -32, 59, 2, 4, -22, -87, 99, 
+    -65, -36, 93, -49, -97, -79, 15, -89, -49, -50, -48, 45, 75, 1, -36, -92, 
+    66, 12, 53, 28, -75, -27, 53, 64, -70, -57, -35, -68, -18, -32, -6, -23, 
+    -68, 79, -44, 45, 11, -91, -3, -85, 45, 53, -61, -41, 73, 17, 52, 80, 44, 
+    -44, 54, 90, -33, 40, -41, -26, 91, 70, 63, 83, 71, -91, -60, 16, -98, 
+    -3, 22, 53, 60, 76, 4, 39, -7, 67, 51, -83, -57, -75, 41, -76, 64, -67, 
+    -1, 81, -37, 94, -4, 41, -30, -19, 44, -55, 62, -75, -40, 61, -33, -6, 
+    -5, -67, 34, -64, 25, -39, -93, 3, -5, -49, 58, 54, -94, 18, -76, -36, 
+    -34, 37, -25, -77, 82, -70, -19, 87, 66, -24, 28, 96, -19, 97, 39, 96, 
+    -47, -45, -38, 16, 5, -83, -88, -65, -5, -12, 90, 86, -60, -61, 86, 87, 
+    -62, 18, -95, -31, -75, 27, -79, -60, -31, 50, 49, 30, -58, -12, -66, 
+    -79, 16, 19, 14, -12, 93, 74, -20, -57, -44, -46, 33, -12, 0, -68, -16, 
+    -63, 59, 12, 47, 44, 43, 44, 45, 38, 18, -35, -55, -2, -15, -65, -91, 
+    -71, 29, -93, -82, -28, 46, -20, 8, 1, -37, -18, -25, -26, -83, 47, 18, 
+    -97, -93, 7, 49, -78, -6, -87, -90, 61, -26, 57, -77, 10, -65, -43, 81, 
+    -96, -13, 65, -29, -85, 15, -97, 36, 79, 22, -2, -92, 0, -84, 49, -32, 
+    -35, -67, 58, -34, -21, 13, 80, 84, 14, 44, -4, -72,
+  -60, -89, 49, -46, 72, 13, -59, 14, 42, -7, -16, -36, -81, -51, -50, -18, 
+    13, 91, 62, 33, -12, -36, 98, -20, -46, -51, 7, 10, 58, 25, 2, 39, 77, 
+    -43, 50, -80, -9, 17, -36, 78, 23, 84, -46, -24, 40, -17, -13, 84, 48, 
+    51, -97, -18, 20, -59, 10, -50, 63, 53, -80, -7, 34, -33, -39, -26, -41, 
+    -96, 58, 93, 52, -76, 78, 47, -61, 67, -86, 45, -85, 52, -6, 63, 95, 85, 
+    -46, -11, -68, 73, 91, -84, -70, 67, 43, -73, -98, -89, -67, 54, 22, -43, 
+    52, -37, -81, 20, 13, -58, 30, -84, -98, 88, 21, -92, -49, -64, 93, -91, 
+    20, -66, 32, 11, 4, -24, 89, -61, 13, 74, -51, -31, -34, -66, 28, -31, 
+    -79, -52, -51, 32, 14, -47, 6, 93, 40, -29, 81, -85, -3, -1, -31, 42, 
+    -28, -7, -37, -18, 4, -50, -5, -46, -38, -36, 46, -45, -6, -10, -94, 5, 
+    -7, -27, -64, -23, 93, 19, 98, 55, 99, -96, 41, -41, -14, 93, 91, -23, 
+    52, 94, -62, 30, -96, 88, 58, 15, 17, 35, 85, -21, 51, 96, -16, 26, 22, 
+    -52, -10, -11, -72, 43, -64, 72, -65, 45, 16, -75, 53, 52, 5, 23, 88, 31, 
+    60, 74, -27, 44, 99, -79, 6, 90, -19, -77, 23, 81, 28, 73, 26, 45, 85, 
+    -86, 95, 24, 68, 57, 26, -88, 73, 32, 0, -19, 85, -27, 54, 82, 31, 36, 
+    89, 32, 53, 81, 43, 78, 5, 6, -34, 1, 92, 62, 58, 53, 24, -8, 8, -24, 24, 
+    23, 72, 14, -35, 7, -68, -1, 36, 65, -40, -30, -16, 48, 30, 30, -97, 77, 
+    -60, -29, 41, -42, -8, -36, -98, -73, 35, -84, -42, -46, 13, 65, 8, 93, 
+    -4, -28, -80, 0, -36, -70, -30, 50, -96, -3, -78, -92, 98, 70, -20, -84, 
+    17, 77, 23, -33, 78, -41, -26, -18, 78, 6, 51, 81, 49, -62, -48, -13, 
+    -68, 13, 36,
+  1, -23, 34, 9, -54, 21, 49, 76, -99, 5, -4, 25, -44, 19, -79, 35, 26, -13, 
+    -58, -81, -63, 22, 99, 91, 44, -64, -63, -86, 24, 17, 81, -81, -23, -10, 
+    84, -33, 26, -47, -96, 81, 30, -72, 93, -81, 47, 11, -99, 92, 38, 49, 
+    -64, 60, -3, -59, -56, -8, 71, -60, 80, 0, 48, -37, 62, -92, 35, 99, 77, 
+    41, 86, 61, 26, 89, 0, -35, -63, 21, -11, -78, -54, 60, 57, -56, 35, 73, 
+    59, 3, 20, -1, -93, -69, 31, -93, 99, -23, -52, -77, -85, -5, 75, -23, 
+    44, -31, 69, 43, 49, 3, -77, -94, 81, 63, -81, 34, -11, 44, -29, -82, 59, 
+    86, 83, -97, 87, 44, 65, 87, 99, 26, -31, -7, 53, 85, 23, 67, 69, -67, 
+    23, 20, -42, 81, -73, -26, 11, 83, 80, 83, 18, -90, -13, -10, 16, -25, 
+    -95, 30, 71, 43, 49, 2, 36, -17, 80, 9, 50, -34, 5, -63, -47, 73, 86, 39, 
+    27, -8, 35, -11, 49, -48, -56, -31, 35, -45, 19, -90, 93, 64, 74, 55, 45, 
+    -93, 38, 79, 51, 63, -38, 79, -5, -77, -8, -94, -20, -83, 35, -68, -79, 
+    19, -78, 47, -66, 31, -40, 15, -64, -68, -100, -75, 6, -28, 58, 33, 3, 7, 
+    -67, -63, 23, 98, 12, -74, -36, -63, 88, 72, -71, -64, -34, -16, -94, 82, 
+    20, -64, -69, 59, 4, -89, 67, -94, 64, 89, 65, 88, 59, 74, -68, -45, -47, 
+    19, -86, -11, 43, 92, -80, 62, -38, 56, -22, 67, 49, 29, 66, -20, 80, 41, 
+    -96, -25, 79, 69, 58, 49, 8, -92, -77, 58, 50, 47, -56, -43, 80, 24, -98, 
+    86, -73, -40, -92, -87, -80, 31, 7, 19, -28, -91, 63, 40, 61, -50, -73, 
+    -5, -49, 25, 4, 64, 29, 62, -1, -86, 96, 2, 76, -9, -50, -37, 30, 32, 
+    -45, -25, 73, 94, 24, -79, -46, -65, 34, 22, 96, 99, 39, -67, -17,
+  -39, -61, 9, -29, -26, -95, 68, 29, -39, -77, 89, -37, 87, -64, 60, 11, 96, 
+    -42, 30, 80, 65, 0, -56, 48, 77, 78, -100, -6, -75, 1, -14, -6, -11, -51, 
+    80, -52, -33, -54, 23, -18, 51, -20, 73, -96, -48, -83, -73, -51, 63, 85, 
+    -6, -4, 80, 3, 52, 50, 15, -17, 54, -94, 54, 37, 84, -76, 40, -17, 76, 
+    -81, 45, 4, 19, -47, 87, 53, 43, -47, 39, -68, -7, 48, -95, 7, 50, 9, 4, 
+    -94, 62, 44, -91, 16, -69, 18, -23, 6, 47, 74, 90, -36, -32, 35, -14, 
+    -81, -98, -90, -34, 26, -42, -48, 4, 2, 80, 85, 21, -44, 27, 1, 48, -66, 
+    24, 18, 30, -79, -80, 2, -30, -56, -14, 60, -58, 77, 92, 65, 50, -21, 
+    -35, 36, 20, 15, 95, -40, 83, -97, -37, -81, 15, -46, -23, 73, -35, 23, 
+    -55, 4, -36, -71, 19, 71, -52, 61, 15, -10, 45, 42, 64, 3, -63, 83, 61, 
+    55, -42, -99, -28, -42, -17, 74, -29, -60, -1, -77, 31, -50, 82, -86, 4, 
+    -92, -34, -87, -35, -70, -76, 75, 65, -48, 30, -22, -45, 67, -63, -29, 
+    -10, 21, 4, -58, -85, 15, 32, -65, -80, 32, -33, 56, 46, -77, 41, 40, 
+    -89, -80, 12, -55, 22, -10, -28, 22, 32, 13, -72, 76, 5, 41, 89, 30, -86, 
+    74, 79, 15, 31, 24, 17, 68, -15, 12, 66, 44, 51, -6, -19, 25, 70, 34, 
+    -13, -4, 49, -90, -17, -56, 58, -73, -8, -93, 63, 45, -95, -45, -91, 49, 
+    -70, -44, -72, -82, -40, -68, -90, 98, 69, -22, 9, -38, -61, 11, 7, -73, 
+    18, -62, -42, -98, 41, -31, -50, 52, 28, 56, 16, 26, -62, -14, 32, -83, 
+    13, 58, -19, 79, -1, 12, -100, -23, -30, 50, -95, -56, 25, -11, 5, 11, 
+    -46, -93, -39, 64, 28, 7, 70, -24, 21, 1, 55, 91, -37, -55, -69, 46, 87, 
+    81, -77, 85, -59,
+  -40, -87, -4, -95, -57, 30, 4, -14, -45, 59, 54, 9, 89, -71, 53, 69, -66, 
+    -60, -90, -42, 16, 40, 64, -74, -2, -16, 80, 11, -97, -88, 83, 84, -57, 
+    90, -57, 35, 87, 81, 1, -71, -19, 86, 83, 52, 56, -77, 30, 86, -77, -31, 
+    -92, 68, 79, 7, 12, -81, 65, 11, 59, 29, -25, 35, 70, 98, -38, 33, -68, 
+    11, 72, 94, 15, 65, 18, 25, -51, -85, 80, -46, 27, 22, 47, 10, -3, 78, 
+    96, 66, 46, -48, -30, -40, -95, -94, -28, 25, -4, 46, 58, -29, -14, 19, 
+    -52, 93, 61, -76, -59, -83, -71, 42, 31, -77, -64, -57, 48, 13, -19, 90, 
+    83, -15, 4, -96, -27, -33, -55, -99, 40, -31, 65, 49, -75, -88, 70, 38, 
+    80, 35, -73, 8, 96, -59, 1, -42, -58, 66, 69, 35, -47, -99, -41, -92, 46, 
+    90, -63, 8, -54, 14, -13, 81, -29, 54, -80, 47, 34, -46, 64, -64, 39, 36, 
+    -49, -33, 60, -64, -50, 97, 97, -35, 36, 2, 39, -13, 45, -3, 22, 9, 19, 
+    -100, 58, 22, -25, 89, 86, -20, 51, 19, -13, -63, 68, -36, 83, 52, -35, 
+    64, -28, 27, -74, 11, -33, -9, 85, -27, -24, -42, 94, -29, 34, 42, -2, 
+    -5, 57, 30, 1, 73, -32, 0, 77, 39, 25, -32, 70, 31, 62, -54, 56, -13, 59, 
+    94, 85, 91, 85, 90, 60, -79, -83, -14, -22, -50, 12, -8, -79, -54, -59, 
+    68, -1, -75, 59, 23, 45, 29, -33, -51, -83, -37, 37, -9, -86, 74, 74, 
+    -58, 28, -86, 58, -45, 3, -53, -28, 54, 55, 23, -23, -62, 99, -66, -90, 
+    35, 88, 85, 47, -22, 79, 33, -34, -35, 2, 91, -51, -44, -50, 96, 28, 79, 
+    -19, -97, 28, -46, 40, 87, 17, -32, -22, 37, 64, 68, -99, -78, -82, -86, 
+    18, -93, -14, -92, -17, 84, -23, 12, 76, 82, -94, 30, 80, -84, 11, -81, 
+    28, -79, 83,
+  -39, -91, 50, 26, 9, -86, 25, -20, -21, -20, 78, -9, -69, -14, 7, -76, 29, 
+    74, -50, 89, 89, 49, 1, -85, 50, -61, -46, 57, 53, -79, -83, 76, -11, 61, 
+    -14, -23, -33, 69, 60, -91, -20, 4, -18, 36, 29, 2, 99, 90, -72, -75, 
+    -32, 64, 55, 16, 84, -100, -84, -43, -91, 75, 14, -49, 58, 62, 83, -73, 
+    -53, 74, 5, 67, -100, -49, 78, 37, 61, -85, 72, -81, -97, -98, -16, -75, 
+    53, 12, -70, -6, -65, 94, 12, -29, 26, 52, -41, -93, 63, 30, -95, -43, 
+    -10, -5, 10, -27, 56, 52, -5, -79, -11, 34, -53, 29, -10, -63, 4, 81, 
+    -11, 83, -30, 0, 42, -25, 64, 25, 54, 60, 71, -68, -39, 74, -100, 46, 12, 
+    26, 57, 2, -43, -75, 0, 30, -53, 25, 33, 80, 48, 31, -18, 81, 65, -48, 
+    65, -84, -3, 70, 61, 89, -20, 37, -18, -88, 53, -94, 50, 91, 63, -86, 
+    -29, 29, 78, -24, -16, -28, 47, -74, -42, 47, 61, 8, -90, 56, 11, 54, 
+    -70, 51, 89, 9, 10, -92, -42, -5, 29, -51, -96, 7, 40, 67, 76, 53, 36, 
+    21, -56, -78, 99, 84, 93, -3, -62, -87, 17, -8, 9, 12, -60, -62, 17, -88, 
+    -18, -96, 51, -72, 73, -19, -1, 53, -16, -28, -39, 52, 80, 52, 26, -17, 
+    6, 24, -81, -26, 62, 75, 75, 24, -97, 86, -46, -9, 74, -35, 45, 97, 92, 
+    99, -28, 90, -45, 41, -47, 38, -58, -37, 66, -89, -94, 69, 44, -67, 33, 
+    82, -68, 52, -71, 43, -24, 41, 19, 12, 52, -99, 53, 85, -5, 78, 53, -10, 
+    87, 92, 8, 5, -7, -53, -10, 89, -88, -92, -26, -16, 60, -97, -73, 77, 40, 
+    85, 15, -49, -68, 74, -83, 30, 14, -23, -70, -47, -62, 58, 9, -81, -96, 
+    35, 4, 54, 51, -4, -84, -43, -51, 32, -8, -54, -28, 65, -8, -7, -26, -33, 
+    -44, -19, 95,
+  -99, 73, 30, 23, 42, -36, -67, -23, 73, 54, 77, 23, 70, 29, -63, -57, 57, 
+    1, 37, 11, -39, -48, -65, -69, 79, -52, 31, 71, -16, -2, 53, 82, 27, -11, 
+    36, 76, -83, 27, -47, 40, 34, -45, 36, -1, 7, 8, -52, -85, 74, 92, 51, 
+    81, 92, -20, -11, 97, 43, -77, 34, -28, -71, 68, -93, 48, 92, 26, 51, 71, 
+    -75, 9, -20, 71, -7, 4, -86, 14, -54, 77, 36, 68, -81, -3, -68, 84, -29, 
+    -9, -38, 74, -76, -90, 87, 0, -24, 22, 67, -87, -31, -92, -43, 51, -1, 
+    -36, -3, 51, 94, 77, 16, -80, 14, 42, 57, 80, -87, -99, -46, 66, 22, 15, 
+    -92, 42, -58, 34, -35, -55, -30, 12, -49, -74, 76, -86, 62, -73, -67, 57, 
+    -98, -8, 38, 84, 51, -80, 2, 12, -87, -33, 76, 19, 64, -60, -13, -11, 1, 
+    -3, -28, -91, -5, 76, 45, -90, 5, 63, -19, 94, -4, -13, -69, -73, -37, 
+    -84, -47, -58, -93, -87, -43, 25, -17, -81, 64, -69, -15, 35, 80, 46, 55, 
+    -3, -66, -91, 38, 76, -16, 17, 31, -32, -87, -22, -53, -12, -82, 93, 92, 
+    56, 68, 29, -39, -90, 30, 52, -96, 59, 66, -37, 87, -37, -8, -49, 12, 38, 
+    -36, 40, -27, 48, 87, -85, -8, -68, -16, 48, 84, 90, 2, 0, 69, -24, 95, 
+    46, 11, 1, 74, -21, 3, 63, 71, 42, -70, 95, 78, 72, -1, 37, -20, -79, 
+    -99, -21, 2, 54, 28, 32, -81, 54, 39, 14, 40, -90, 27, 13, 77, 18, -63, 
+    16, 40, -85, 80, -22, 52, 37, -78, 4, 39, -46, 62, -4, -39, -92, 26, 29, 
+    74, 52, -60, 22, -6, 27, 9, -36, 29, 44, -45, -100, 20, -12, 27, 2, -77, 
+    64, -97, -78, -82, -33, 81, -53, 30, 39, -49, -76, -65, 76, -45, 72, -97, 
+    -75, 12, -9, -23, -25, -95, 82, 74, 12, -16, -50, -73, -63, 20, -41, -54,
+  56, 42, -31, -38, 28, -97, -97, -65, -72, 24, -60, 68, -94, 51, -11, 87, 
+    79, -52, 25, 38, -84, 66, 38, 53, -13, -41, -92, 50, -97, -6, -7, -50, 
+    -4, -27, -92, 52, 69, -45, 23, 94, -52, 52, -22, 7, -12, -15, -16, 54, 
+    -12, 31, -89, -76, -89, -70, -7, -56, -97, -56, -97, 13, -99, 10, 2, -18, 
+    31, 87, -100, 41, -83, 38, 12, 96, 40, 20, -44, -76, 70, 15, -45, -73, 
+    64, -60, -29, 30, 2, 89, 90, -90, 59, -40, -82, 88, 59, -27, -22, 88, 74, 
+    80, -90, -91, 95, 56, -28, -73, -28, -37, 40, -88, 96, -33, -100, -20, 
+    83, 82, 91, 87, -37, -41, 63, 68, 69, -85, 27, -75, -21, -89, 60, -67, 
+    42, 2, 43, 38, 46, 96, 49, 5, 41, -66, 92, -26, -21, 2, -41, 64, -21, 80, 
+    21, -50, 18, -44, 38, 11, -93, -55, 10, -63, 90, 76, -74, -49, -39, 40, 
+    -16, -89, -42, 90, 66, -43, 93, 59, 87, 68, 26, 35, -58, 48, -78, 45, 83, 
+    33, -35, -94, 51, 93, 72, 17, 20, -98, 13, -61, -74, 3, -27, -70, 73, 73, 
+    -58, -71, -14, -94, 47, 86, -68, 81, -89, 12, 8, -39, 46, 85, 23, 71, 88, 
+    -75, -45, 86, 16, 33, -5, -13, -74, -43, 58, -10, -38, 5, 64, -33, 25, 
+    54, -62, -3, 27, 87, -54, -94, 46, -48, 82, 33, -89, -12, 10, -38, -13, 
+    37, -48, 85, -35, 30, -69, 96, -61, 22, 12, 59, -96, -69, -35, 24, 11, 
+    -61, 80, 11, -54, 74, 66, 39, 44, 68, 64, -71, -40, -21, -31, 55, 73, 77, 
+    -68, 19, 80, -76, -21, 20, 21, -49, 17, 12, 88, -68, 68, -67, -83, 52, 1, 
+    -88, -46, 39, -87, 24, -3, -93, 57, 52, 52, -65, -26, 14, 35, 95, 83, 
+    -84, 2, 18, 62, -50, 71, 0, 59, -63, -97, -74, 44, 34, 5, -9, 70, 58, 
+    -84, -6, 26, -5, -19,
+  -78, -6, 64, 22, -51, 78, 31, -37, 67, -67, 52, 5, 43, 19, -59, 2, -14, 87, 
+    -80, -70, 7, -53, 84, -67, 45, -15, -67, 19, -19, 86, 32, 77, 68, -35, 
+    -6, 60, 31, 92, -3, -86, 65, 76, 22, -70, 96, -48, 24, 34, 25, 76, 65, 0, 
+    -95, 30, 95, 32, 32, 96, -28, 52, -97, 88, 10, -71, 6, 55, -8, 3, 32, 
+    -50, -41, 11, 42, -70, -42, 51, 95, 29, 4, -89, 25, -15, -94, 8, 74, 91, 
+    -93, 4, -34, 5, 27, -11, -20, 6, -14, -6, -8, -23, 41, -43, -85, 6, -97, 
+    50, -17, -42, 5, 44, -64, -53, 58, -5, -32, -90, -81, -96, 83, 74, 86, 
+    25, 55, 67, -85, -84, 74, 56, 89, -51, -78, 29, -48, -22, 24, 61, 33, 1, 
+    -36, -88, 40, -89, -76, 32, 93, 96, 49, -45, -51, -22, 12, 56, 9, 74, 
+    -97, 4, 95, 27, -81, 74, 37, -66, -7, 42, -45, -80, 67, -44, -55, -92, 
+    -97, 39, 83, 13, 92, 24, 87, 86, -36, 17, 79, 51, 6, -13, 74, -36, -31, 
+    -65, 25, 64, 16, 70, -17, 14, -34, -29, 54, 22, -70, -16, 70, 31, -46, 
+    -7, -100, 16, 63, -70, 53, 79, -50, -73, 24, 12, -38, 2, -66, -59, 59, 
+    82, 88, 36, -32, -41, 93, -94, 17, -88, 12, 78, 66, 12, 11, -95, -28, 
+    -87, -81, 34, -53, 39, -96, -60, -61, -20, 30, -27, 36, 45, 80, -63, 12, 
+    -80, -75, -83, 60, -54, -57, -2, 14, -100, 70, 23, -6, 27, 80, -57, 9, 
+    -90, 8, 48, -82, 91, -2, 99, -2, -48, 88, 99, 3, 92, -49, 33, -68, -86, 
+    -10, 4, -45, -70, -7, 47, 34, -26, -74, -40, -15, 92, 53, -26, -34, 73, 
+    -91, 74, 93, -81, -9, -35, 51, 82, -94, 77, 65, 36, 65, -58, -46, 51, 61, 
+    -80, 35, -8, 1, -63, -89, -25, 21, -4, -49, 75, -95, 31, 9, -58, 0, 57, 
+    -48,
+  11, -16, -62, -66, 98, -69, -31, -82, 38, -46, 98, 85, 12, -82, 8, 74, 78, 
+    -11, -39, 54, 79, -40, -97, -72, -17, -52, 99, 77, 45, 98, -48, -97, -44, 
+    32, 68, -76, -68, -51, -94, -74, 40, 32, -94, 93, 98, -9, -26, 94, -46, 
+    31, -20, -93, 62, -8, 50, -98, 29, -48, -34, -24, 60, 15, 29, -35, 69, 
+    26, 88, -86, -93, 39, -56, 59, 26, -47, -15, -73, -33, -8, -8, 63, 98, 
+    -65, 57, -39, -35, 47, -14, 22, -6, 78, -90, -39, 37, -22, 43, -1, 89, 
+    98, 65, -62, 60, -40, -79, -49, 1, 6, -52, 2, -88, -46, 34, 55, 93, 50, 
+    5, -26, 97, 41, 41, -87, -5, 92, -80, -98, 81, -57, -90, -18, 37, 45, 
+    -64, -11, 4, -10, -55, -12, -18, -24, 0, 96, -29, 10, 32, 82, -86, 28, 
+    -40, -78, 88, 65, 16, -59, -41, -60, -73, 71, 77, 9, -85, -28, 98, -85, 
+    -63, -26, -45, -13, 34, 5, 92, 89, -86, -22, 13, -2, -5, 57, 85, -100, 
+    97, 87, 50, 45, -100, -22, -22, 27, -18, -3, 97, -60, 77, 23, 18, 23, 
+    -84, -59, 82, -85, -39, 21, 87, 34, -32, 83, -14, -61, -44, -15, 96, 99, 
+    -21, 61, 51, 20, 3, 24, -20, -77, 69, -4, -36, -17, 12, -81, 65, 49, -66, 
+    -30, 94, 57, -6, 8, 18, -66, -44, 89, 2, -25, 2, -62, -56, 99, -73, 56, 
+    -87, 88, 40, -54, 74, -84, 28, 12, 41, 63, 83, 7, -84, 6, 81, 75, 79, 
+    -97, 31, -81, 46, 8, 64, -13, -70, 10, 21, -70, 1, -49, -97, 61, 57, -83, 
+    96, 94, -35, -7, -38, 40, 77, -70, -65, 8, 49, -69, -70, 20, 74, -73, 
+    -38, 66, -13, -7, 44, 50, -20, 29, 7, -33, -59, 95, 74, 45, -67, -81, 
+    -29, 16, 28, -47, 40, 42, 65, -47, -87, 23, 64, -15, -26, -74, -79, 28, 
+    -97, 53, 20, 58, 10, 94, -30,
+  -63, 8, 92, -45, 81, -26, -11, -51, 17, -79, -4, 90, 56, 9, -35, 28, -83, 
+    22, -13, 77, 63, -2, -92, -3, 86, -87, 16, -90, -82, -78, -7, 21, 92, 
+    -18, 3, 19, -69, 72, -65, 3, -41, -96, -58, -35, -67, 68, -97, -73, 7, 
+    -88, -75, -73, 18, -66, 32, -50, 15, -49, 8, -48, 89, -36, -22, -60, -6, 
+    95, -48, -6, -52, 65, -41, -17, -45, -4, -98, -75, 16, -89, -72, 16, 42, 
+    -97, -21, -33, 38, 37, -10, 26, 82, -21, 17, 74, -43, -62, 7, -74, -61, 
+    -65, -15, -60, 97, 46, -19, 32, 65, 46, 85, -67, 93, 26, 63, 13, 74, 58, 
+    76, -100, -46, -36, -87, 57, -34, -39, -35, 87, 34, 21, -32, 24, 75, -43, 
+    -67, 86, 43, -56, -70, -66, 14, -33, -8, -97, 55, -78, -82, -85, 42, -69, 
+    -22, -11, -80, 95, 23, -86, -96, -65, -67, 89, 50, 27, 93, -40, 94, 85, 
+    -22, -14, 18, -81, -42, 20, 36, 18, -7, 63, 7, -61, -80, 47, 66, -21, 
+    -44, 60, 54, -7, 0, -78, -65, -99, 86, -37, -26, 25, -27, 58, 23, 10, 
+    -59, 4, 49, -61, 95, 9, -31, 8, 71, -9, -1, 12, 29, 80, 27, 62, -98, -88, 
+    -83, -18, -93, -80, -72, 67, 75, 15, 42, 64, -64, 71, 4, -60, 5, -12, 96, 
+    64, -21, -78, 65, -85, -55, -78, -60, -81, 16, -10, -43, -34, -49, -57, 
+    -2, 87, 60, 93, -30, -55, -52, 82, -44, -43, -56, -5, -68, -100, -6, -69, 
+    90, -49, -75, -77, -31, -12, -58, 3, 78, 28, -50, -5, 18, -65, -67, 85, 
+    -47, 23, 63, -26, 16, -35, 32, -15, -40, -72, -2, -7, 13, -78, -83, -45, 
+    -12, 32, -17, -73, 90, 50, 79, 40, 72, -74, -58, 52, -4, 61, 86, -37, 
+    -31, 20, 89, -94, -85, 46, -18, -81, 68, -18, -65, 81, -64, -49, -12, 61, 
+    95, 39, -5, -36, -9, 92, 13, -16, -45,
+  -24, 13, -12, 6, -74, -24, -97, -11, -96, 23, 75, 33, 29, 36, -35, 2, -95, 
+    27, 59, 2, -22, 14, 3, 2, 4, -53, 33, -64, 79, -74, 64, 88, -91, 11, -87, 
+    -47, 24, -50, 44, -81, 41, 25, -36, -11, 3, 80, 41, 79, -44, -10, 56, 
+    -72, -5, -66, -65, 83, -61, -29, -45, 94, -75, 84, -38, -59, 28, 39, -4, 
+    -5, 7, 92, -96, 84, 91, -26, 41, -6, -62, 44, -35, -58, 89, -8, -59, 53, 
+    12, 41, -27, 36, -55, -92, 58, -18, -69, -69, 60, -4, 23, -16, 89, -69, 
+    -81, -56, -38, 73, -55, 28, -52, 70, -37, -77, 94, 24, 82, -73, 26, 59, 
+    -97, -31, -38, 25, -23, 56, 43, 18, 62, -38, 13, -43, -5, 7, 89, -76, 
+    -11, 43, 54, 90, -60, -57, 77, 30, -39, -78, 55, -10, -49, -78, 96, 11, 
+    -84, 44, 95, -64, -76, 9, -79, -59, -62, 74, 15, 57, -14, 14, -60, -63, 
+    -47, -43, 16, -32, 78, -41, -25, -57, 22, -46, 51, 12, 33, 64, -28, 56, 
+    -81, -41, 75, -18, 1, 70, -43, 66, 89, -71, 79, 51, -93, -93, -62, -46, 
+    -23, -99, -51, 30, 75, -36, 54, 9, 39, -18, 68, 98, 46, 82, -74, -62, 97, 
+    -79, -82, 35, 27, -76, -55, 84, -34, 79, -40, -71, 90, 52, -12, -98, -48, 
+    16, 79, 52, 90, 34, -9, 21, -77, 17, -49, 96, 78, -65, 46, -60, 43, 61, 
+    18, 71, 39, -16, 99, 75, -88, 82, -5, 12, 64, -97, -14, -3, 34, 9, -65, 
+    66, 29, -69, -83, 4, -93, 27, -66, 31, 53, -35, 90, -73, 14, 26, 24, 93, 
+    -97, -94, 2, 72, 9, -12, 35, 23, 1, 89, 49, -58, 47, 17, -9, -47, 51, 50, 
+    -82, 72, -5, -12, 15, -99, 56, 75, -64, 48, 59, -75, 14, 48, 3, 88, 55, 
+    30, -50, -99, -14, 25, -64, -54, 86, 47, 11, 9, -35, 80, -73, -8, 91, 31, 48,
+  -94, -74, -70, 49, -75, 37, 25, -38, -27, -84, -64, -41, -31, 55, -97, -22, 
+    -19, -99, 55, -10, -7, -54, 89, 69, -76, 88, -81, 66, -35, -47, 25, -23, 
+    -9, -57, -17, 58, -85, 88, -98, -18, 72, 28, 92, -65, -14, -85, 62, -52, 
+    7, 76, 3, 77, -15, -66, 92, -70, -48, -71, -5, -39, -81, -21, 23, -67, 
+    -22, -71, 36, -46, 44, -62, -84, 61, -87, 86, -36, 93, -45, -37, -61, -3, 
+    -64, -79, 20, -4, 96, -4, 14, 60, -18, -27, 45, -76, 11, -62, -15, -10, 
+    90, 32, -66, -87, -73, 14, 74, 24, 52, 47, -35, -39, 94, -33, 37, -60, 
+    -30, -77, -99, 4, 68, -13, -16, -100, -26, 34, 82, 14, 87, -15, 58, 67, 
+    -7, -94, 68, 73, -79, 13, -72, -15, -19, 49, 85, -46, -90, -54, -43, -9, 
+    86, -49, 97, 64, -91, -89, -31, -63, -60, -43, -74, 44, -35, -73, 57, 
+    -14, -64, 79, 71, -57, -99, -54, 47, 11, 84, 90, -61, 33, 93, -100, 84, 
+    34, 69, -91, 53, 94, 98, 96, 3, -21, 56, -65, -26, -90, 29, -90, 24, -10, 
+    -15, 76, -38, -32, 9, -27, -85, -33, -33, 47, 10, -28, 63, -46, -87, -17, 
+    -46, -65, 9, 22, -53, 16, 95, 76, 10, 99, 54, -25, 90, -53, 99, -57, 70, 
+    -54, 41, 49, -95, -83, 0, 13, -35, -26, 24, 29, 48, 93, -78, -45, 9, 6, 
+    -39, -31, 51, 80, -6, -57, 25, 65, 43, 5, 12, 40, 22, 54, -99, -53, -8, 
+    -73, -40, -35, -6, 48, -43, 90, 34, 0, 35, -86, 33, 42, 79, 44, 61, -89, 
+    -40, -84, 73, 33, -20, -13, 11, 65, 15, 82, -95, -84, -82, 76, -38, -45, 
+    -14, 15, 78, 66, 29, 38, -67, -14, -92, -97, 41, 52, -62, -75, 37, -48, 
+    61, -48, 97, -96, 24, 9, 62, -13, -62, -31, 8, -18, 55, -82, -14, -22, 
+    -11, 20, -59, -52, 96, 69, 90, -16, -26,
+  -36, 7, 51, 96, -97, -18, 22, -73, -81, 65, 25, -57, -20, 40, 42, -22, 12, 
+    -88, -32, -58, 6, -3, -82, -61, -85, -66, -80, -80, -42, -100, 29, 23, 
+    76, 35, -90, 87, 98, 55, -54, -88, -61, -8, -68, -4, -100, 11, 69, 37, 
+    -79, 67, -33, 11, -31, 24, -31, -81, 65, -23, 33, 21, 20, 2, -3, -3, -11, 
+    7, 46, 77, -26, -94, 43, -61, 40, 79, 86, 74, 34, 92, -13, -58, -53, 20, 
+    -72, 33, -22, -50, -70, 71, 94, -99, -88, -100, -10, -5, 87, 86, 13, 43, 
+    -72, -79, -12, 16, -42, -49, 33, 93, -7, -87, -60, 27, 54, 86, 13, 46, 
+    -78, 59, -98, -54, -16, 64, 85, -10, -25, -30, 68, -26, -82, -89, 54, 
+    -10, 64, 0, -16, 5, 25, 44, 91, 62, 50, 60, -91, -60, -22, 27, 82, 95, 
+    90, -91, -21, 41, -74, 46, 44, 28, 96, -70, -4, -25, -66, -74, 94, 24, 
+    80, -69, -15, 79, -76, 39, 69, 64, 29, -85, 48, 51, -59, 7, 32, -66, 19, 
+    98, 54, -45, 75, -11, -7, 5, -6, -66, -39, -50, -29, -44, -58, -27, -65, 
+    54, -100, 53, -7, 97, -95, 47, -95, -43, -57, -32, -42, -57, 67, -11, 90, 
+    71, 96, 37, -100, -51, -21, 78, -9, 46, -13, 86, -9, -80, -54, -94, -86, 
+    98, 52, -12, -86, -31, 63, 73, 68, 89, -73, 72, 2, -44, 10, -54, 84, -5, 
+    -30, -59, 42, -60, 95, 30, -28, -19, 3, -33, -60, 63, -13, -37, 88, 20, 
+    66, 18, 63, 95, -8, 29, -38, -92, 69, -17, 10, 78, 47, -21, -53, 58, 99, 
+    5, -55, 77, -66, -47, -50, -13, 35, -80, -74, -15, 45, 11, 18, 64, -96, 
+    -26, 45, -41, 49, 40, -5, 63, 75, -8, 96, -85, -67, -92, 66, 6, 77, -9, 
+    17, -40, 84, 84, 6, -58, -60, 77, 30, -15, 68, 0, -44, -32, 53, 33, 97, 
+    82, -34, 82, 29, -9, -98,
+  -2, -34, -74, -81, -20, 71, 14, -41, -20, -76, -59, 1, -63, 41, -23, -18, 
+    -71, -10, 70, -19, -45, -60, 42, -64, -24, -50, -74, -42, -33, 81, -86, 
+    -100, 92, -63, 70, -11, -86, 25, 45, 6, -97, -63, 82, 14, 68, -56, -44, 
+    98, 11, 25, -60, -91, 0, 95, 74, -47, 7, 61, 81, 4, 68, -9, 57, -5, 43, 
+    -12, -3, -88, -41, 90, 5, -94, 4, -63, -37, 16, 41, 52, 46, -78, 20, 41, 
+    -44, -76, 28, 18, -17, 31, 77, -72, -38, 13, 88, 55, 74, 30, -18, -71, 
+    70, 70, -68, -14, 78, 97, -38, -27, 46, 43, 21, -82, 35, -75, 42, -79, 
+    -11, -36, 46, -4, 70, 64, 28, 63, -15, 96, 87, 63, -98, -98, -79, -13, 
+    -23, -15, 91, 18, 87, -52, -62, 54, -54, -61, 87, -20, 50, 8, 33, -49, 
+    -4, 88, -23, 74, 34, 25, -74, 18, 40, 22, -81, -69, 40, -95, 58, -47, 
+    -71, 47, 12, -78, -73, 39, -82, -22, -71, 88, 84, -72, 55, 86, -20, -50, 
+    -60, -65, -47, -2, -31, 85, 70, -86, -89, 16, 12, -67, 77, -78, 29, -34, 
+    -10, 66, -62, 38, -99, 87, -80, -41, 92, -1, 77, 78, -87, 80, 56, -64, 
+    -56, -14, 82, -68, 31, -88, 31, -91, -40, -47, -54, -24, 33, -8, -97, 36, 
+    -92, 89, 90, 48, 91, 43, -100, 49, -66, -3, -27, 27, 69, -51, 29, -44, 
+    -76, -21, 21, 87, -66, 3, -15, -9, -32, 84, 8, 22, 94, -78, -95, 12, 16, 
+    -99, -13, 15, 57, -40, 86, 62, -100, -46, -24, 79, 63, -71, 68, -48, -85, 
+    84, -45, -91, 74, 80, -98, 83, -44, 6, -56, 23, 58, -85, 21, 46, 20, 90, 
+    35, 24, -62, -99, -75, 27, 93, -91, 74, 15, -44, -74, 50, -9, 78, 28, 
+    -81, 50, -80, -43, -61, -57, -27, -92, 42, 80, -66, 59, 41, 99, 63, 91, 
+    66, -40, -49, 6, 77, 23, 57, 48, -70,
+  0, -17, 5, -44, 76, 42, -73, 23, 93, 61, -10, 32, -88, 72, -96, -28, 0, 
+    -37, 26, -72, 32, 57, 15, -99, 5, -13, -16, 61, 84, -33, 8, -21, 4, -90, 
+    -19, 4, -65, -88, -40, 81, 21, 28, 14, -84, -19, -41, 22, -58, 70, 10, 
+    -15, -100, -55, -91, -43, -41, -54, -58, -14, -84, -11, 20, -9, -24, 77, 
+    76, 10, -42, -72, -96, 48, 74, 29, -56, -36, -55, -70, 4, -34, -32, -95, 
+    -59, -33, 0, -62, 21, 88, -88, 64, -4, -31, -85, 40, 89, -52, -6, 13, 20, 
+    -84, 0, -16, 73, 74, -90, -40, 75, -20, -89, 96, -94, 40, -69, -6, -33, 
+    16, 10, -76, -75, 87, 2, -56, 23, 61, -23, -70, 4, -48, 8, 72, 59, -39, 
+    -56, -72, 50, -8, 15, -72, 93, 63, 24, 56, 51, -31, -53, 10, -85, -63, 
+    18, 87, 78, 59, -54, -11, 26, 27, 29, -41, -39, -26, 4, 46, -30, -5, 70, 
+    51, 30, -40, 89, 52, 69, -33, -50, 53, -32, -12, -38, -83, -70, 72, 43, 
+    18, 90, 65, -16, -67, -37, 71, -30, -24, -3, -72, 2, 0, -22, -44, 22, 
+    -56, 34, -63, -76, 92, 36, -99, 54, -10, 36, 74, -1, -94, -87, 56, 94, 
+    -50, 65, 67, 20, -31, 67, -37, 11, 54, -41, 59, -12, 75, 46, -50, -43, 
+    -79, -98, -87, 22, -32, -37, 48, -31, 71, 7, -45, -61, -48, 48, -33, -71, 
+    -66, 99, -47, 81, -36, -4, 23, -89, -89, -9, -67, 28, 19, -43, 44, 13, 6, 
+    -85, 40, 15, -86, 92, 51, 66, 61, 37, 53, -55, 80, 40, -32, 84, -39, -46, 
+    -85, 26, -92, 87, 40, 76, 23, 68, -54, 11, -83, -46, 30, 36, -68, -85, 
+    -22, -33, 82, -92, 47, -66, -98, -78, 17, 37, -46, -51, 6, 56, -55, 59, 
+    95, -23, 54, -21, -57, 77, 54, -35, -16, 11, 88, -5, 63, -24, 44, -64, 
+    17, -44, -39, 42, -51, 62, 68,
+  61, 92, 91, 16, -6, 64, 17, 46, 83, -86, 82, -33, 65, -33, 35, -25, -55, 
+    -85, -95, -91, -70, -39, -71, 12, 97, 40, -45, 41, 42, -67, 68, 46, 61, 
+    -83, 92, -65, -69, -3, -19, 82, -40, -43, -32, 32, 76, -41, 91, 86, 12, 
+    23, -28, -23, 50, 46, -20, 11, -1, 38, -74, -46, -55, 50, 35, -71, -79, 
+    80, -46, -32, 85, -93, -88, 17, -30, 92, 91, -62, 65, 86, 61, -41, 14, 
+    84, 8, 64, -51, -63, -97, -26, -17, 42, -3, 85, -1, 57, -31, 54, 6, 74, 
+    -67, 63, -70, -12, 60, 9, 43, -67, 55, -82, -25, 33, -99, -24, -41, -20, 
+    26, 68, -7, 54, 75, -62, -54, -1, 76, -43, -41, -94, 22, -61, -95, 2, 
+    -72, 19, 61, 55, -85, -3, 34, -62, -73, -31, 43, -19, 87, 4, 53, 71, -76, 
+    -37, 92, -43, -55, -79, -94, -17, -33, 11, 67, -75, -75, -76, 35, 26, 
+    -36, -32, -62, 86, 50, -62, -90, 32, -80, 18, 10, -99, -20, 26, 43, 31, 
+    1, -19, -1, 10, -73, 78, -34, -80, 83, 55, -53, 99, -57, 45, 17, 3, -16, 
+    -60, 49, 33, 99, 17, -95, -10, -68, 49, 67, -47, 22, 56, -74, 31, -86, 
+    -94, 84, 15, -93, 89, -90, -93, -89, -21, -58, 65, 57, 25, 38, -58, 37, 
+    -82, -70, 41, 51, -64, -68, 7, -81, 3, -66, 83, -27, 20, 22, -68, -38, 
+    -14, 79, 34, -82, -30, 82, -76, -82, 78, -89, 36, -52, 27, 23, -64, -46, 
+    41, 16, 2, 86, 39, 56, -67, 77, 63, -89, -92, -21, 12, -51, -78, 59, -16, 
+    -81, 96, 0, 92, 85, -78, 36, -24, -35, 62, -62, 19, -89, -70, 26, 2, 68, 
+    -89, 17, -49, -31, 86, 87, -73, 59, 25, 94, -28, 58, -83, 53, 80, 99, 
+    -14, 16, -19, -9, 99, 75, -99, -98, -38, 92, -89, -40, -28, -48, -66, 23, 
+    -83, -97, -61, -59, 75, 57, 10, -55,
+  -95, -6, 82, 62, -12, -86, -47, 64, -20, -66, 44, -82, -8, 80, 51, -94, 90, 
+    -84, -16, 88, 67, 13, -52, 93, -53, 98, 18, 0, 63, -19, 18, 50, 38, 75, 
+    50, 16, -51, 45, 14, -74, -32, -89, -20, 94, -28, -46, -74, 67, -82, -27, 
+    10, 69, 93, -66, 58, 82, -34, -68, 60, -86, 47, 64, 38, 38, -32, 18, 44, 
+    50, -65, 59, 72, 90, -24, -67, -94, 24, 39, -61, -100, 96, -11, -43, -63, 
+    74, -81, -19, -67, -54, -74, -76, -33, 16, 75, -2, 81, 68, -48, -73, -72, 
+    -26, -28, -63, 6, 20, 78, 70, -3, -66, 33, 56, -22, 87, -37, 94, -41, 10, 
+    -51, -33, -70, -83, -44, -82, 91, -21, -36, 24, 96, 40, -83, -18, -59, 
+    75, -13, 92, -65, -65, -1, -27, -33, 18, -61, -46, -16, -75, -90, 6, 74, 
+    -38, 66, -7, -24, 90, -12, 11, 90, -18, -37, 94, 3, 67, -11, 40, -15, 53, 
+    -62, -85, 90, 47, 19, 29, -42, -33, -93, -65, 16, 65, -68, -8, 98, -66, 
+    28, -95, 93, 15, -12, -34, -96, -15, -68, -97, 48, 97, -93, -85, -60, 
+    -23, 19, 21, -95, 42, 91, 15, -98, 51, 32, -19, 71, 78, -77, 27, -30, 
+    -53, 92, -67, -29, -53, -49, -10, 25, 12, 0, -80, -98, -28, 86, 38, 9, 
+    81, 36, -3, -19, -4, -72, -10, 96, 32, 8, 2, 42, -68, 9, 69, 44, -46, -5, 
+    71, 18, 68, -76, 98, 40, -18, -76, -19, 1, -75, -84, -99, 58, 10, -80, 
+    79, -49, 97, 53, 36, -70, -52, -34, -90, 35, 93, 40, 54, 86, -47, -29, 
+    -95, -39, -11, -49, -47, 97, 47, 46, 30, -48, 45, 85, -73, 39, 57, -71, 
+    97, 86, -28, 88, 12, -59, -93, -52, -26, 44, 79, 74, 55, 34, 63, 79, 48, 
+    26, -8, -34, 26, -26, 46, -29, 91, -82, -13, 17, -27, 27, 17, -64, -87, 
+    -87, -9, 92, 42, 87, -58, 7,
+  89, -71, 63, -24, 23, -7, -60, 45, -87, 58, 45, -44, -26, -29, -80, -92, 
+    -91, 56, -95, 8, 9, -76, -18, -61, -88, -75, 20, -30, -46, 84, 95, 95, 
+    57, -17, 23, 70, -20, 16, 11, 79, -60, 24, -75, -87, -89, -91, 10, -91, 
+    -28, -35, 56, 65, -69, 46, -4, -2, 78, 84, 12, -28, 87, -93, 58, -60, 28, 
+    -30, -69, -10, 75, 71, 41, -30, -83, -78, 96, 55, 36, -50, 51, 45, 38, 
+    16, 40, -47, 8, 94, 33, -53, 5, -60, -42, -11, -98, 48, 36, -70, 40, -44, 
+    -37, 10, 2, 12, -2, 80, -69, -67, -65, -100, 6, 16, -36, -99, 70, 21, 
+    -13, 1, 37, 92, 60, 51, 46, 17, 17, -46, -47, -94, 71, 27, -72, -91, -13, 
+    -13, 73, 82, 55, -13, 75, -52, -88, 70, -35, 20, -44, 71, 74, -62, -21, 
+    70, -66, 18, 3, -50, -69, 21, 82, -85, -30, -7, 99, -88, -33, 73, 70, 
+    -100, 67, 57, 39, 95, -40, 65, 0, 56, -97, -54, 61, 23, -43, -15, 59, 72, 
+    -30, 14, -16, -20, -94, -38, 77, 73, -10, 94, 94, 58, -40, -69, -44, 98, 
+    -79, -92, 34, -47, -66, -48, -61, -94, -63, -27, 36, 18, -19, -41, 24, 
+    -62, 81, 42, -43, 25, 44, -20, 72, -86, -23, 1, 0, 66, -98, -96, 84, -82, 
+    -2, -42, -78, 29, -17, -18, -58, 60, 40, -42, 97, 26, 10, 24, -11, -69, 
+    -6, 67, 34, -97, -82, 3, -56, -13, 12, -63, -85, -86, 86, -60, -22, -52, 
+    89, 88, 99, 96, -82, 87, -40, 98, 91, 58, -50, 84, 73, -17, 91, -90, 40, 
+    -52, -30, -27, 46, -90, 89, -47, -1, -19, 54, -45, -57, -98, 62, -12, 71, 
+    -48, 84, -64, 40, 25, -34, 32, -83, 78, 19, -34, 61, 8, 65, 11, -73, 64, 
+    34, -9, -37, 45, 62, -68, -9, -8, 23, 50, 84, 35, -25, -77, 6, 63, 7, 47, 
+    39, 92, 30, -48, -82,
+  7, -36, 98, -5, -90, 46, 3, -76, 53, 96, 26, -8, -30, 77, 29, 77, 48, 31, 
+    67, -68, 17, 15, -47, -57, -2, 10, -32, -30, 66, 97, 31, 6, 9, -89, -100, 
+    -3, -29, 93, 27, -81, -74, 85, -70, 95, 46, 41, -99, -34, 87, -93, 75, 
+    -32, -44, 3, -43, -15, 55, 36, 4, 49, 69, 93, -37, -100, -37, -29, 38, 
+    89, -71, 78, -87, -90, -47, 94, -87, -91, -99, -42, -91, -10, -25, -8, 
+    -94, -7, 72, 90, -67, -3, 38, -84, -93, 40, -22, -14, 57, 62, 55, 82, 40, 
+    48, 47, -87, -4, -35, 36, -71, 71, 73, 11, -58, 48, -16, -85, 37, 74, 26, 
+    -58, -88, 1, -30, 99, 17, 40, -59, 36, -72, -36, 10, 28, 34, -62, -73, 
+    20, -47, -19, 54, -97, 79, 68, -66, -69, -10, -11, -89, 12, -54, -100, 
+    -65, -62, 89, -18, -99, -72, -50, 87, 75, -45, 95, 50, -14, -70, -21, 
+    -92, -76, 79, -99, -7, -4, 23, -82, -85, 93, -53, -14, 14, -57, 56, 31, 
+    57, 75, -48, 90, 84, 12, 72, -67, -64, 39, 49, 57, -93, -16, 85, 30, -87, 
+    -12, 11, 51, 94, -47, -50, -95, 84, 0, -30, 11, -73, 64, 35, 24, -77, 
+    -64, 52, 11, 26, -11, 54, 24, -98, 94, 21, -58, -48, -99, 12, 25, -93, 
+    -70, -39, -84, -97, 66, -5, -84, -68, -79, 11, -97, -6, 21, 84, -81, -22, 
+    80, -39, -83, -72, 15, 55, -17, -7, -49, 89, -57, 84, -18, 26, -5, 52, 
+    -95, 95, -87, 73, -68, 92, 45, 12, 59, -14, 52, 94, 9, 52, -68, -61, -28, 
+    -72, 17, 28, 61, 46, 70, 61, -8, -73, -77, -89, 8, -27, -14, -60, 97, 
+    -70, 94, 5, -3, -25, -43, -65, -28, -76, 45, 99, 74, -93, -20, -96, 89, 
+    30, 81, 47, -39, -25, 17, -81, 83, 77, 21, -22, -7, 34, 3, -87, -74, 7, 
+    51, 40, 48, -62, 47, 69, 32, 92,
+  -35, -64, -76, 76, 23, 76, 24, 80, -78, -57, 49, -62, 6, 45, 82, -34, -76, 
+    -36, -30, -19, -62, -88, -65, 84, 14, -8, 70, -4, -66, -59, 22, 88, -1, 
+    73, 93, 82, 86, -12, 50, -71, -88, 53, -36, -89, 13, -98, 93, 40, -43, 
+    -71, -92, -18, 94, -85, -94, -31, 66, 26, -36, 9, -9, -22, 2, 83, 77, 
+    -17, -69, -45, -30, -76, -58, -40, 79, 58, 58, -60, 71, 18, -70, -51, 44, 
+    -91, 38, -88, 0, -16, 5, 36, -83, -79, -3, -3, -25, 71, -65, 42, -83, 99, 
+    -40, 43, -31, 81, 78, -35, 59, -69, -6, -70, -40, -7, 12, -68, 7, 3, 97, 
+    38, -90, -51, -52, -27, 78, -17, 48, 89, 99, 39, -78, 43, -25, -58, 29, 
+    37, -23, -96, -65, -41, 79, -24, 60, 45, -34, -52, -46, 20, 65, 22, 46, 
+    38, -61, -53, 67, 52, 0, -56, -88, -25, -42, 59, -15, -32, -78, -98, -60, 
+    -96, 77, 53, 21, -23, -11, 61, 13, -74, -30, -14, 50, 35, -14, 42, 91, 
+    59, 66, -39, 7, -36, 79, -19, 5, -1, -91, 79, 47, 73, -53, 43, -13, 74, 
+    2, -57, 3, 53, -25, 16, -12, -15, 78, 96, 28, 45, 64, -12, 74, 60, -31, 
+    53, -2, -46, -78, 77, -77, 1, 94, -59, 57, -68, -85, 71, -59, 85, 44, 1, 
+    90, 50, -38, 16, 68, 72, -2, -9, -83, -78, -82, -45, -1, -29, 73, 60, 
+    -56, -16, 98, 9, -59, 58, -37, -80, 11, -99, -100, -62, -32, -40, 53, 
+    -15, 30, -3, -97, -35, 13, -3, 44, -3, -82, 21, 88, 29, -73, -28, 11, 
+    -49, -65, 20, -15, 49, -11, -92, -64, -73, 76, 62, -38, -37, 4, 41, 0, 
+    59, 6, 1, -80, -68, 56, 1, 3, -99, -68, -68, -66, 85, 75, 66, -30, -19, 
+    38, 17, 17, 68, 26, 26, -99, 39, 75, 43, -56, 0, -93, 33, 1, -7, 31, -87, 
+    -69, 79, 67, 43, -60,
+  -5, 72, 63, -100, 84, -91, -70, -37, -89, -81, -28, -2, -56, -49, -46, -97, 
+    -44, -5, -37, 35, 25, 41, -16, 63, -100, -36, -83, 26, 24, -18, -42, -41, 
+    -18, -57, -12, 17, 99, -40, 66, -67, 63, 87, 67, 12, -34, -38, 91, -55, 
+    78, -5, -32, 45, 2, 97, 86, -53, -93, 87, 83, 38, -13, 12, 80, 38, 55, 
+    90, 3, 51, 57, -75, 17, -36, 39, -15, -36, -90, 57, -12, 92, 94, -33, 82, 
+    75, -79, -31, -39, 12, -30, -64, -81, 53, 36, -8, 47, 18, 88, 64, 73, -7, 
+    -61, -6, -64, 68, -97, 94, 64, -16, -88, 57, -11, -19, 45, 63, -52, -63, 
+    -30, 70, 98, -100, 99, -43, 42, -65, 57, 38, -80, 5, 14, 1, -80, -74, 22, 
+    -69, -31, 11, -21, -49, -48, -65, -63, 35, 10, -89, 10, 84, 4, -29, 77, 
+    -66, 87, -80, -21, -40, 18, -54, -97, 97, -65, 88, -14, -76, -81, 60, 
+    -18, -17, 53, 30, 81, -74, -28, -9, -43, -29, -87, -92, -47, -60, 47, 80, 
+    55, 81, -74, -35, 74, -39, 55, -6, -90, -76, 14, 8, 68, -42, 93, 90, 35, 
+    -35, -6, -54, -70, -73, 11, 30, -72, -89, 85, 55, 96, -73, -93, -9, -45, 
+    6, 2, -45, 85, 62, 19, -53, 5, -77, 87, 10, 35, -57, 71, 38, -93, -59, 
+    -71, -88, -18, 60, -84, 5, 20, 7, 62, -78, 35, -38, 93, 53, 69, -35, 88, 
+    -3, 77, 34, 71, 46, -70, -75, -67, 25, -67, 69, 31, 34, 18, -43, -55, 
+    -40, 5, 48, 64, -35, 25, -72, 57, -57, -20, 76, -80, -17, -50, 52, -27, 
+    -61, -18, -7, 17, 75, -77, -56, 11, 66, 48, 31, 71, 90, 3, -3, 89, 6, 
+    -58, -87, -75, -77, 26, -16, -49, 77, -7, -53, 47, 26, -80, -22, 34, -48, 
+    15, 3, 8, 15, 39, -63, 4, 41, -74, -94, -56, 78, -76, -37, -25, -58, -96, 
+    -90, 92, 36, 26, -63,
+  60, -95, 48, -76, -45, 4, 81, 97, -40, -92, 83, 59, -99, -50, 61, -14, 11, 
+    92, 56, 85, 43, 75, 16, -59, -93, 58, 59, 95, 73, 68, -44, -59, 2, 90, 
+    70, -100, 33, -4, 37, 57, -94, -5, -35, 58, -3, 91, -74, 7, -27, 77, -28, 
+    43, 49, -56, -94, -13, 25, 16, -88, 40, -21, 28, 43, 66, 59, -4, -77, 82, 
+    -90, -100, 57, -8, 81, -14, 92, -63, -75, 13, 8, -59, -26, -10, -6, -59, 
+    -70, -62, 94, 10, 57, -35, -31, 59, -32, -29, -59, 87, 61, 4, 14, -53, 
+    -97, -63, 4, -53, -33, -44, -21, 80, -51, -31, -85, 71, -40, 12, 84, 78, 
+    -35, -81, 74, -96, -88, 59, 95, -8, 73, 97, 45, 27, 55, -23, -80, 10, 
+    -30, 30, 65, 82, 35, 47, -100, 28, 65, 84, 62, 99, -35, 5, 15, -44, -55, 
+    -56, -52, 32, 36, -31, 38, 76, -1, 98, -5, 71, -29, 73, -77, -44, -23, 
+    80, -26, -47, -3, 26, -76, 44, -50, 88, 31, -66, -7, -14, -91, 10, -92, 
+    31, -70, 43, -57, 98, 70, 91, 9, 28, 92, -48, -5, -64, 11, 85, -64, 61, 
+    22, 53, -63, 42, 69, 56, -12, -66, 23, -22, 0, 49, -41, 89, 81, 94, -33, 
+    65, -12, 98, -93, -68, -97, -94, -78, 50, -99, -57, 98, 88, -70, -64, 73, 
+    62, 38, -89, 3, 97, -64, -92, -30, 55, -25, 53, 5, -7, 24, 56, -85, -24, 
+    66, 71, -93, 6, 48, 23, -45, -49, -88, 33, -21, 52, -89, 49, -22, 49, 
+    -24, 65, 47, -45, 68, -36, -75, 22, 96, -91, 24, -75, 8, 17, -51, -34, 
+    -83, 3, 61, 54, 98, -42, -74, 85, 47, 9, -45, 51, -29, -90, -21, -39, 
+    -53, -40, -94, -39, -84, 98, -5, -48, -15, -30, 7, -64, -63, 21, -87, 
+    -46, 1, -72, -39, 29, -24, -97, 24, -60, 68, -22, 33, -8, -99, -7, 42, 
+    -73, 88, 8, -25, -35, 22,
+  -22, 11, -55, 75, 55, -65, -90, 49, -43, -100, 7, -27, 6, 1, 39, -80, -58, 
+    -96, -100, 46, 28, -96, 45, -10, 99, 84, 10, -91, 22, 28, -69, 7, -64, 
+    15, 58, 71, -57, 69, 82, -7, 44, -14, -96, -100, 47, -68, -46, 96, 16, 
+    38, -71, -42, -47, -5, 25, -99, 87, 14, 36, 60, -47, 0, -20, -70, -83, 
+    16, 99, -97, -30, 71, 61, 63, 37, -40, -10, -24, -90, -84, 64, -92, -6, 
+    75, 89, 96, -89, -78, 33, -56, -78, 80, -64, 26, -59, 54, -58, -9, -29, 
+    -46, 29, 33, 73, -13, 24, -80, 54, 18, 51, -34, -75, -100, 62, -1, -98, 
+    17, -28, -18, 50, -86, -43, 97, 77, 13, 59, -66, -51, -45, 63, 75, 61, 
+    -64, -82, -74, 26, -49, -87, -80, -13, 93, 27, -53, 83, 8, -96, 81, 49, 
+    10, 22, -88, -16, 46, -27, -7, 85, -3, -6, 79, -82, -86, 93, 64, 18, -68, 
+    73, -22, -52, 54, -63, 72, -75, 26, -32, -72, -46, -64, 57, -31, -23, 
+    -87, 73, 88, 99, -26, 68, 70, 12, -76, -27, -57, 65, -49, 25, 10, -45, 
+    -42, 9, -35, 49, -14, -54, 47, -81, -10, 10, -45, 36, -73, -32, -22, 64, 
+    60, 53, -39, -90, -89, -11, -51, -69, -83, 53, 4, -1, 89, 51, 43, 75, 
+    -12, 34, -15, -39, 74, 20, -74, -80, 11, -68, -4, 21, 56, 93, -33, -85, 
+    5, 35, 72, -10, -40, -35, 0, 2, 68, -8, 64, 10, -47, 16, -9, -77, -4, 
+    -90, -81, -92, 23, 40, 44, -72, -52, 54, -51, 27, -83, 73, 72, -73, -58, 
+    -68, -9, 54, -24, 67, -21, -27, 34, -100, 71, -81, 49, -56, -21, 26, 29, 
+    -22, -37, 51, -71, 26, -32, -29, 50, -10, 48, 26, 21, 54, 11, -72, -11, 
+    61, -34, -11, -70, 60, -2, 40, -36, 69, -66, 33, -74, -40, 27, -85, 88, 
+    14, 29, -29, 18, 33, 26, -55, -79, -64, 32, 22,
+  71, 57, -76, -50, -29, -68, 79, -9, -3, -26, 0, -21, -16, -98, -15, -28, 
+    -100, -55, -66, -41, -88, -27, -31, -20, 23, -58, -4, -6, 61, -25, 85, 
+    -16, -31, 66, -7, 78, -80, -88, 98, 13, -6, 30, -78, 2, 45, -64, -48, 
+    -84, -94, -63, 94, 76, 13, 45, 98, 61, 7, -85, 93, 21, 84, 98, 88, -74, 
+    77, -5, 9, -70, -70, 8, -71, -94, 45, 9, -41, 83, 22, -39, -72, -28, -11, 
+    -79, 77, 65, 39, -41, -21, 89, 0, -46, 82, 55, -14, 26, -63, 92, 54, -68, 
+    -98, 90, 29, 47, 1, -23, 25, 10, -62, 67, -52, 46, 20, -22, -7, 27, 79, 
+    42, -94, 89, 37, 93, 98, 21, -35, 37, 48, -1, 85, 80, -10, 21, -83, -73, 
+    -18, -56, -63, -22, 18, -91, 35, 96, -54, 35, -23, 85, 46, 57, -55, 30, 
+    73, 31, 62, 80, -1, -56, -64, -32, -54, -1, -41, -94, -40, 19, 62, 35, 
+    91, -21, -1, 31, 79, -39, 9, -66, 64, -41, 40, 22, -37, -4, -56, 46, 46, 
+    -29, 64, 38, 1, -3, -2, 45, 87, -8, -10, 46, 51, 64, 77, 98, -73, -13, 
+    47, 9, 24, -78, 18, 18, -73, 85, 60, 22, 91, -67, 96, 8, -97, 31, 23, 
+    -42, 28, -52, -46, -81, -25, 68, 54, 7, -10, 13, -70, -37, 21, 12, -31, 
+    99, 26, 79, 34, 29, -82, -2, 34, -70, -68, -78, -5, -54, 46, 55, 41, -19, 
+    69, -47, 80, -94, -46, -56, -33, -82, 26, -7, 74, -7, 93, 29, -61, -87, 
+    -90, 7, -2, -64, -97, -76, 85, 11, 52, -1, -29, 56, 80, 4, -76, 82, 68, 
+    33, -85, 71, -67, -53, -78, -12, -52, 98, -83, -25, -51, -88, 47, 39, 64, 
+    -89, 86, 77, 85, -67, 49, -85, -39, -15, -18, 32, 4, -96, -59, -34, 97, 
+    84, 65, 81, 94, -29, -49, -16, -35, 72, -56, 39, 85, 93, -26, -46, -36, 
+    73, -82, -95, -6 ;
+
+ hrap_xor = 14 ;
+
+ hrap_yor = 10 ;
+
+ true_lat = 60 ;
+
+ true_lon = 105 ;
+}
diff --git a/nc_test/tst_elatefill.c b/nc_test/tst_elatefill.c
new file mode 100644
index 0000000..0b9ca6a
--- /dev/null
+++ b/nc_test/tst_elatefill.c
@@ -0,0 +1,45 @@
+/* This is part of the netCDF package. Copyright 2017 University
+   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
+   conditions of use. See www.unidata.ucar.edu for more info.
+
+   Test proper elatefill return when fillvalue is assigned outside of
+   the initial define.
+
+   Contributed by wkliao, see the following for more information:
+
+   * https://github.com/Unidata/netcdf-c/issues/384
+   * https://github.com/Unidata/netcdf-c/pull/387
+   * https://github.com/Unidata/netcdf-c/issues/390
+*/
+
+#include "config.h"
+#include <nc_tests.h>
+#include "err_macros.h"
+#include <stdio.h>
+#include <netcdf.h>
+
+#define FILE_NAME "tst_elatefill.nc"
+
+#define ERR_CHK {if(err!=NC_NOERR)printf("Error at line %d: %s\n",__LINE__,nc_strerror(err));}
+
+int
+main(int argc, char **argv)
+{
+    int ncid, dimid, varid, err;
+    int no_fill, fillv, buf[10];
+
+    err = nc_create(FILE_NAME, NC_NETCDF4, &ncid); ERR_CHK;
+    err = nc_def_dim(ncid, "dim", 10, &dimid); ERR_CHK;
+    err = nc_def_var(ncid, "var", NC_INT, 1, &dimid, &varid); ERR_CHK;
+    err = nc_enddef(ncid); ERR_CHK;
+
+    err = nc_redef(ncid); ERR_CHK;
+
+    /* try put attribute _FillValue and expect NC_ELATEFILL */
+    fillv = 9;
+    err = nc_put_att_int(ncid, varid, _FillValue, NC_INT, 1, &fillv);
+    if (err != NC_ELATEFILL)
+        printf("line %d expecting NC_ELATEFILL but got %d\n",__LINE__,err);
+    err = nc_close(ncid); ERR_CHK;
+    return 0;
+}
diff --git a/nc_test/tst_global_fillval.c b/nc_test/tst_global_fillval.c
new file mode 100644
index 0000000..489931f
--- /dev/null
+++ b/nc_test/tst_global_fillval.c
@@ -0,0 +1,49 @@
+/* This is part of the netCDF package. Copyright 2017 University
+   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
+   conditions of use. See www.unidata.ucar.edu for more info.
+
+   Test proper elatefill return when fillvalue is assigned outside of
+   the initial define.
+
+   Contributed by wkliao, see the following for more information:
+
+   * https://github.com/Unidata/netcdf-c/issues/388
+   * https://github.com/Unidata/netcdf-c/pull/389
+*/
+
+#include "config.h"
+#include <nc_tests.h>
+#include <stdio.h>
+#include <netcdf.h>
+
+#define FILE_NAME "tst_global_fillval.nc"
+
+#define ERR {if(err!=NC_NOERR){printf("Error at line %d: %s\n",__LINE__,nc_strerror(err)); toterrs++; break;}}
+int
+main(int argc, char **argv)
+{
+    int i, ncid, cmode, err, fillv=9;
+    int toterrs = 0;
+    int formats[5]={0,
+                    NC_64BIT_OFFSET,
+                    NC_64BIT_DATA,
+                    NC_NETCDF4,
+                    NC_CLASSIC_MODEL | NC_NETCDF4};
+    char *formatnames[5]={"CDF-1", "CDF-2", "CDF-5", "NETCDF4", "CLASSIC_MODEL"};
+
+    for (i=0; i<5; i++) {
+        cmode = NC_CLOBBER | formats[i];
+        err = nc_create(FILE_NAME, cmode, &ncid); ERR
+
+        err = nc_put_att_int(ncid, NC_GLOBAL, "_FillValue", NC_INT, 1, &fillv);
+        if (err != NC_EGLOBAL) {
+          toterrs++;
+          printf("%13s Error at line %d: expecting NC_EINVAL but got %d\n",
+                   formatnames[i],__LINE__,err);
+        }
+        err = nc_close(ncid); ERR;
+
+    }
+    printf("Total errors: %d\n",toterrs);
+    return toterrs;
+}
diff --git a/nc_test/tst_small.c b/nc_test/tst_small.c
index 9d4791e..750baf5 100644
--- a/nc_test/tst_small.c
+++ b/nc_test/tst_small.c
@@ -104,6 +104,7 @@ test_small_atts(const char *testfile)
       {
 	 /* Create null-terminated text string of correct length. */
 	 strncpy(att, source, t);
+         att[t] = '\0';
 
 	 /* Create a file with one attribute. */
 	 if (file_create(testfile, NC_CLOBBER, &ncid)) ERR;
diff --git a/nc_test/tst_utf8_phrases.c b/nc_test/tst_utf8_phrases.c
new file mode 100644
index 0000000..3a4ef67
--- /dev/null
+++ b/nc_test/tst_utf8_phrases.c
@@ -0,0 +1,342 @@
+
+/*
+ * Copyright 1998-2015 University Corporation for Atmospheric Research/Unidata
+ *  See the LICENSE file for more information.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <nc_tests.h>
+#include "err_macros.h"
+#include <netcdf.h>
+#include <string.h>
+
+#include "ncutf8.h"
+
+/*
+  The test here are taken from the UTF-8 SAMPLER
+
+    Frank da Cruz
+    The Kermit Project <http://kermitproject.org/index.html>
+    New York City
+    fdc at kermitproject.org <mailto:fdc at kermitproject.org>
+
+    /Last update:/ Tue Jan 31 16:56:13 2017
+*/
+
+
+struct Test {
+    int xfail;
+    const char* id;
+    const char* description;
+    const char* data;
+};
+#define NULLTEST {0,NULL,NULL,NULL}
+
+static const struct Test utf8currency[] = {
+{0,"1.1","Currencies",  "¥£€$¢₡₢₣₤₥₦₧₨₩₪₫₭₮₯₹"},
+NULLTEST
+};
+
+static const struct Test utf8poems[] = {
+{0,"2.1","Runes",
+"ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ\nᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ\nᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ᛬\n"
+},
+{0,"2.2","Middle English",
+    "An preost wes on leoden, Laȝamon was ihoten"
+    "He wes Leovenaðes sone -- liðe him be Drihten."
+    "He wonede at Ernleȝe at æðelen are chirechen,"
+    "Uppen Sevarne staþe, sel þar him þuhte,"
+    "Onfest Radestone, þer he bock radde."
+},
+{0,"2.3","Middle High German",
+"Sîne klâwen durh die wolken sint geslagen,"
+"er stîget ûf mit grôzer kraft,"
+"ich sih in grâwen tägelîch als er wil tagen,"
+"den tac, der im geselleschaft"
+"erwenden wil, dem werden man,"
+"den ich mit sorgen în verliez."
+"ich bringe in hinnen, ob ich kan."
+"sîn vil manegiu tugent michz leisten hiez."
+},
+
+{0,"2.4",
+"Greek.1",
+"Τη γλώσσα μου έδωσαν ελληνικ το σπίτι φτωχικό στις αμμουδιές του Ομήρου. Μονάχη έγνοια η γλώσσα μου στις αμμουδιές του Ομήρου. από το Άξιον Εστί του Οδυσσέα Ελύτη"
+},
+{0,"2.5",
+"Greek.2",
+"Τὴ γλῶσσα μοῦ ἔδωσαν ἑλληνικὴτὸ σπίτι φτωχικὸ στὶς ἀμμουδιὲς τοῦ Ὁμήρου. Μονάχη ἔγνοια ἡ γλῶσσα μου στὶς ἀμμουδιὲς τοῦ Ὁμήρου.ἀπὸ τὸ Ἄξιον ἐστί τοῦ Ὀδυσσέα Ἐλύτη"
+},
+{0,"2.6",
+"Russion",
+"На берегу пустынных волнСтоял он, дум великих полн,И вдаль глядел. Пред ним широкоРека неслася; бедный чёлнПо ней стремился одиноко.По мшистым, топким берегамЧернели избы здесь и там,Приют убогого чухонца;И лес, неведомый лучамВ тумане спрятанного солнца, Кругом шумел."
+},
+{0,"2.7",
+"Georgian",
+"ვეპხის ტყაოსანი შოთა რუსთაველიღმერთსი შემვედრე, ნუთუ კვლა დამხსნას სოფლისა შრომასა, ცეცხლს, წყალსადა მიწასა, ჰაერთა თანა მრომასა; მომცნეს ფრთენი და აღვფრინდე,მივჰხვდე მას ჩემსა ნდომასა, დღისით და ღამით ვჰხედვიდე მზისა ელვათა კრთომაასა."
+},
+{0,"2.8",
+"Tamil.1",
+"யாமறிந்த மொழிகளிலே தமிழ்மொழி போல் இனிதாவது எங்கும் காணோம்,பாமரராய் விலங்குகளாய், உலகனைத்தும் இகழ்ச்சிசொலப் பான்மை கெட்டு,நாமமது தமிழரெனக் கொண்டு இங்கு வாழ்ந்திடுதல் நன்றோ? சொல்லீர்! தேமதுரத் தமிழோசை உலகமெலாம் பரவும்வகை செய்தல் வேண்டும்."
+},
+{0,"2.9",
+"Tamil.2",
+"ಬಾ ಇಲ್ಲಿ ಸಂಭವಿಸು ಇಂದೆನ್ನ ಹೃದಯದಲಿನಿತ್ಯವೂ ಅವತರಿಪ ಸತ್ಯಾವತಾರಮಣ್ಣಾಗಿ ಮರವಾಗಿ ಮಿಗವಾಗಿ ಕಗವಾಗೀ...ಮಣ್ಣಾಗಿ ಮರವಾಗಿ ಮಿಗವಾಗಿ ಕಗವಾಗಿಭವ ಭವದಿ ಭತಿಸಿಹೇ ಭವತಿ ದೂರ ನಿತ್ಯವೂ ಅವತರಿಪ ಸತ್ಯಾವತಾರ || ಬಾ ಇಲ್ಲಿ ||"
+},
+NULLTEST
+};
+
+static const struct Test utf8phrases1[] = {
+{0,"3.1","Sanskrit", "काचं शक्नोम्यत्तुम् । नोपहिनस्ति माम् ॥"},
+{0,"3.2","Sanskrit/(standard transcription)", "kācaṃ śaknomyattum nopahinasti mām."},
+{0,"3.3","Classical Greek", "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει."},
+{0,"3.4","Greek (monotonic)", "Μπορώ να φάω σπασμένα γυαλιά χωρίς να πάθω τίποτα."},
+{0,"3.5","Greek (polytonic)", "Μπορῶ νὰ φάω σπασμένα γυαλιὰ χωρὶς νὰ πάθω τίποτα."},
+{0,"3.6","Latin", "Vitrum edere possum; mihi non nocet."},
+{0,"3.7","Old French", "Je puis mangier del voirre. Ne me nuit."},
+{0,"3.8","French", "Je peux manger du verre, ça ne me fait pas mal."},
+{0,"3.9","Provençal / Occitan", "Pòdi manjar de veire, me nafrariá pas."},
+{0,"3.10","Québécois", "J'peux manger d'la vitre, ça m'fa pas mal."},
+{0,"3.11","Walloon", "Dji pou magnî do vêre, çoula m' freut nén må."},
+{0,"3.12","Picard", "Ch'peux mingi du verre, cha m'foé mie n'ma."},
+{0,"3.13","Kreyòl Ayisyen (Haitï)", "Mwen kap manje vè, li pa blese'm."},
+{0,"3.14","Basque", "Kristala jan dezaket, ez dit minik ematen."},
+{0,"3.15","Catalan / Català", "Puc menjar vidre, que no em fa mal."},
+{0,"3.16","Spanish", "Puedo comer vidrio, no me hace daño."},
+{0,"3.17","Aragonés", "Puedo minchar beire, no me'n fa mal ."},
+{0,"3.18","Galician", "Eu podo xantar cristais e non cortarme."},
+{0,"3.19","European Portuguese", "Posso comer vidro, não me faz mal."},
+{0,"3.20","Brazilian Portuguese (8 <#notes>)", "Posso comer vidro, não me machuca."},
+{0,"3.21","Caboverdiano/Kabuverdianu (Cape Verde)", "M' podê cumê vidru, ca ta maguâ-m'."},
+{0,"3.22","Papiamentu", "Ami por kome glas anto e no ta hasimi daño."},
+{0,"3.23","Italian", "Posso mangiare il vetro e non mi fa male."},
+{0,"3.24","Milanese", "Sôn bôn de magnà el véder, el me fa minga mal."},
+{0,"3.25","Roman", "Me posso magna' er vetro, e nun me fa male."},
+{0,"3.26","Napoletano", "M' pozz magna' o'vetr, e nun m' fa mal."},
+{0,"3.27","Venetian", "Mi posso magnare el vetro, no'l me fa mae."},
+{0,"3.28","Zeneise /(Genovese)", "/ Pòsso mangiâ o veddro e o no me fà mâ."},
+{0,"3.29","Sicilian", "Puotsu mangiari u vitru, nun mi fa mali."},
+{0,"3.30","Romansch (Grischun)", "Jau sai mangiar vaider, senza che quai fa donn a mai."},
+{0,"3.31","Romanian", "Pot să mănânc sticlă și ea nu mă rănește."},
+{0,"3.32","Esperanto", "Mi povas manĝi vitron, ĝi ne damaĝas min."},
+{0,"3.33","Cornish", "Mý a yl dybry gwéder hag éf ny wra ow ankenya."},
+{0,"3.34","Welsh", "Dw i'n gallu bwyta gwydr, 'dyw e ddim yn gwneud dolur i mi."},
+{0,"3.35","Manx Gaelic", "Foddym gee glonney agh cha jean eh gortaghey mee."},
+{0,"3.36","Old Irish /(Ogham)", "/ ᚛᚛ᚉᚑᚅᚔᚉᚉᚔᚋ ᚔᚈᚔ ᚍᚂᚐᚅᚑ ᚅᚔᚋᚌᚓᚅᚐ᚜"},
+{0,"3.37","Old Irish /(Latin)", "/ Con·iccim ithi nglano. Ním·géna."},
+{0,"3.38","Irish", "Is féidir liom gloinne a ithe. Ní dhéanann sí dochar ar bith dom."},
+{0,"3.39","Ulster Gaelic", "Ithim-sa gloine agus ní miste damh é."},
+{0,"3.40","Scottish Gaelic", "S urrainn dhomh gloinne ithe; cha ghoirtich i mi."},
+{0,"3.41","Anglo-Saxon /(Runes)", "/ ᛁᚳ᛫ᛗᚨᚷ᛫ᚷᛚᚨᛋ᛫ᛖᚩᛏᚪᚾ᛫ᚩᚾᛞ᛫ᚻᛁᛏ᛫ᚾᛖ᛫ᚻᛖᚪᚱᛗᛁᚪᚧ᛫ᛗᛖ᛬"},
+{0,"3.42","Anglo-Saxon /(Latin)", "/ Ic mæg glæs eotan ond hit ne hearmiað me."},
+{0,"3.43","Middle English", "Ich canne glas eten and hit hirtiþ me nouȝt."},
+{0,"3.44","English", "I can eat glass and it doesn't hurt me."},
+{0,"3.45","English /(IPA)", "/ [aɪ kæn iːt glɑːs ænd ɪt dɐz nɒt hɜːt miː]"},
+{0,"3.46","English /(Braille)", "/ ⠊⠀⠉⠁⠝⠀⠑⠁⠞⠀⠛⠇⠁⠎⠎⠀⠁⠝⠙⠀⠊⠞⠀⠙⠕⠑⠎⠝⠞⠀⠓⠥⠗⠞⠀⠍⠑"},
+{0,"3.47","Jamaican", "Mi kian niam glas han i neba hot mi."},
+{0,"3.48","Lalland Scots / Doric", "Ah can eat gless, it disnae hurt us."},
+{0,"3.49","Gothic (4)", "𐌼𐌰𐌲 𐌲𐌻𐌴𐍃 𐌹̈𐍄𐌰𐌽, 𐌽𐌹 𐌼𐌹𐍃 𐍅𐌿 𐌽𐌳𐌰𐌽 𐌱𐍂𐌹𐌲𐌲𐌹𐌸."},
+{0,"3.50","Old Norse /(Runes)", "/ ᛖᚴ ᚷᛖᛏ ᛖᛏᛁ ᚧ ᚷᛚᛖᚱ ᛘᚾ ᚦᛖᛋᛋ ᚨᚧ ᚡᛖ ᚱᚧᚨ ᛋᚨᚱ"},
+{0,"3.51","Old Norse /(Latin)", "/ Ek get etið gler án þess að verða sár."},
+{0,"3.52","Norsk / Norwegian (Nynorsk)", " Eg kan eta glas utan å skada meg."},
+{0,"3.53","Norsk / Norwegian (Bokmål)", " Jeg kan spise glass uten å skade meg."},
+{0,"3.54","Føroyskt / Faroese", "Eg kann eta glas, skaðaleysur."},
+{0,"3.55","Íslenska / Icelandic", "Ég get etið gler án þess að meiða mig."},
+{0,"3.56","Svenska / Swedish", "Jag kan äta glas utan att skada mig."},
+{0,"3.57","Dansk / Danish", "Jeg kan spise glas, det gør ikke ondt på mig."},
+{0,"3.58","Sønderjysk", "Æ ka æe glass uhen at det go mæ naue."},
+{0,"3.59","Frysk / Frisian", "Ik kin glês ite, it docht me net sear."},
+{0,"3.60","Nederlands / Dutch", "Ik kan glas eten, het doet mij geen kwaad."},
+{0,"3.61","Kirchröadsj/Bôchesserplat", "Iech ken glaas èèse, mer 't deet miech jing pieng."},
+{0,"3.62","Afrikaans", "Ek kan glas eet, maar dit doen my nie skade nie."},
+{0,"3.63","Lëtzebuergescht / Luxemburgish", "Ech kan Glas iessen, daat deet mir nët wei."},
+{0,"3.64","Deutsch / German", "Ich kann Glas essen, ohne mir zu schaden."},
+{0,"3.65","Ruhrdeutsch", "Ich kann Glas verkasematuckeln, ohne dattet mich wat jucken tut."},
+{0,"3.66","Langenfelder Platt", "Isch kann Jlaas kimmeln, uuhne datt mich datt weh dääd."},
+{0,"3.67","Lausitzer Mundart (Lusatian)", "Ich koann Gloos assn und doas dudd merr ni wii."},
+{0,"3.68","Odenwälderisch", "Iech konn glaasch voschbachteln ohne dass es mir ebbs daun doun dud."},
+{0,"3.69","Sächsisch / Saxon", "'sch kann Glos essn, ohne dass'sch mer wehtue."},
+{0,"3.70","Pfälzisch", "Isch konn Glass fresse ohne dasses mer ebbes ausmache dud."},
+{0,"3.71","Schwäbisch / Swabian", "I kå Glas frässa, ond des macht mr nix!"},
+{0,"3.72","Deutsch (Voralberg)", "I ka glas eassa, ohne dass mar weh tuat."},
+{0,"3.73","Bayrisch / Bavarian", "I koh Glos esa, und es duard ma ned wei."},
+{0,"3.74","Allemannisch", "I kaun Gloos essen, es tuat ma ned weh."},
+{0,"3.75","Schwyzerdütsch (Zürich)", "Ich chan Glaas ässe, das schadt mir nöd."},
+{0,"3.76","Schwyzerdütsch (Luzern)", "Ech cha Glâs ässe, das schadt mer ned."},
+{0,"3.77","Hungarian", "Meg tudom enni az üveget, nem lesz tőle bajom."},
+{0,"3.78","Suomi / Finnish", "Voin syödä lasia, se ei vahingoita minua."},
+{0,"3.79","Sami (Northern)", "Sáhtán borrat lása, dat ii leat bávččas."},
+{0,"3.80","Erzian", "Мон ярсан суликадо, ды зыян эйстэнзэ а ули."},
+{0,"3.81","Northern Karelian", "Mie voin syvvä lasie ta minla ei ole kipie."},
+{0,"3.82","Southern Karelian", "Minä voin syvvä st'oklua dai minule ei ole kibie."},
+{0,"3.83","Estonian", "Ma võin klaasi süüa, see ei tee mulle midagi."},
+{0,"3.84","Latvian", "Es varu ēst stiklu, tas man nekaitē."},
+{0,"3.85","Lithuanian", "Aš galiu valgyti stiklą ir jis manęs nežeidžia"},
+{0,"3.86","Czech", "Mohu jíst sklo, neublíží mi."},
+{0,"3.87","Slovak", "Môžem jesť sklo. Nezraní ma."},
+{0,"3.88","Polska / Polish", "Mogę jeść szkło i mi nie szkodzi."},
+{0,"3.89","Slovenian", "Lahko jem steklo, ne da bi mi škodovalo."},
+{0,"3.90","Bosnian, Croatian, Montenegrin and Serbian /(Latin)/", "Ja mogu jesti staklo, i to mi ne šteti."},
+{0,"3.91","Bosnian, Montenegrin and Serbian /(Cyrillic)/", "Ја могу јести стакло, и то ми не штети."},
+{0,"3.92","Macedonian", "Можам да јадам стакло, а не ме штета."},
+{0,"3.93","Russian", "Я могу есть стекло, оно мне не вредит."},
+{0,"3.94","Belarusian /(Cyrillic)", "Я магу есці шкло, яно мне не шкодзіць."},
+{0,"3.95","Belarusian /(Lacinka)", "Ja mahu jeści škło, jano mne ne škodzić."},
+{0,"3.96","Ukrainian", "Я можу їсти скло, і воно мені не зашкодить."},
+{0,"3.97","Bulgarian", "Мога да ям стъкло, то не ми вреди."},
+{0,"3.98","Georgian", "მინას ვჭამ და არა მტკივა."},
+{0,"3.99","Armenian", "Կրնամ ապակի ուտել և ինծի անհանգիստ չըներ։"},
+{0,"3.100","Albanian", "Unë mund të ha qelq dhe nuk më gjen gjë."},
+{0,"3.101","Turkish", "Cam yiyebilirim, bana zararı dokunmaz."},
+{0,"3.102","Turkish /(Ottoman)", "جام ييه بلورم بڭا ضررى طوقونمز"},
+{0,"3.103","Uzbek / O’zbekcha /(Roman)", "Men shisha yeyishim mumkin, ammo u menga zarar keltirmaydi."},
+{0,"3.104","Uzbek / Ўзбекча /(Cyrillic)/", "Мен шиша ейишим мумкин, аммо у менга зарар келтирмайди"},
+{0,"3.105","Bangla / Bengali", "আমি কাঁচ খেতে পারি, তাতে আমার কোনো ক্ষতি হয় না।"},
+{0,"3.106","Marathi", "मी काच खाऊ शकतो, मला ते दुखत नाही."},
+{0,"3.107","Kannada", "ನನಗೆ ಹಾನಿ ಆಗದೆ, ನಾನು ಗಜನ್ನು ತಿನಬಹುದು"},
+{0,"3.108","Hindi", "मैं काँच खा सकता हूँ और मुझे उससे कोई चोट नहीं पहुंचती."},
+{0,"3.109","Malayalam", "എനിക്ക് ഗ്ലാസ് തിന്നാം. അതെന്നെ വേദനിപ്പിക്കില്ല."},
+{0,"3.110","Tamil", "நான் கண்ணாடி சாப்பிடுவேன், அதனால் எனக்கு ஒரு கேடும் வராது."},
+{0,"3.111","Telugu", "నేను గాజు తినగలను మరియు అలా చేసినా నాకు ఏమి ఇబ్బంది లేదు"},
+{0,"3.112","Sinhalese", "මට වීදුරු කෑමට හැකියි. එයින් මට කිසි හානියක් සිදු නොවේ."},
+{0,"3.113","Urdu(3)", "میں کانچ کھا سکتا ہوں اور مجھے تکلیف نہیں ہوتی ۔"},
+{0,"3.114","Pashto(3)", "زه شيشه خوړلې شم، هغه ما نه خوږوي"},
+{0,"3.115","Farsi / Persian(3)", ".من می توانم بدونِ احساس درد شيشه بخورم"},
+{0,"3.116","Arabic(3)", "أنا قادر على أكل الزجاج و هذا لا يؤلمني."},
+{0,"3.117","Maltese", "Nista' niekol il-ħġieġ u ma jagħmilli xejn."},
+{0,"3.118","Hebrew(3)", "אני יכול לאכול זכוכית וזה לא מזיק לי."},
+{0,"3.119","Yiddish(3)", "איך קען עסן גלאָז און עס טוט מיר נישט װײ."},
+{0,"3.120","Twi", "Metumi awe tumpan, ɜnyɜ me hwee."},
+{0,"3.121","Hausa (/Latin/)", "Inā iya taunar gilāshi kuma in gamā lāfiyā."},
+{0,"3.122","Hausa (/Ajami/) (2)", "إِنا إِىَ تَونَر غِلَاشِ كُمَ إِن غَمَا لَافِىَا"},
+{0,"3.123","Yoruba(4)", "Mo lè je̩ dígí, kò ní pa mí lára."},
+{0,"3.124","Lingala", "Nakokí kolíya biténi bya milungi, ekosála ngáí mabé tɛ́."},
+{0,"3.125","(Ki)Swahili", "Naweza kula bilauri na sikunyui."},
+{0,"3.126","Malay", "Saya boleh makan kaca dan ia tidak mencederakan saya."},
+{0,"3.127","Tagalog", "Kaya kong kumain nang bubog at hindi ako masaktan."},
+{0,"3.128","Chamorro", "Siña yo' chumocho krestat, ti ha na'lalamen yo'."},
+{0,"3.129","Fijian", "Au rawa ni kana iloilo, ia au sega ni vakacacani kina."},
+{0,"3.130","Javanese", "Aku isa mangan beling tanpa lara."},
+{0,"3.131","Burmese (Unicode 4.0)", "က္ယ္ဝန္‌တော္‌၊က္ယ္ဝန္‌မ မ္ယက္‌စားနုိင္‌သည္‌။ ၎က္ရောင္‌့ ထိခုိက္‌မ္ဟု မရ္ဟိပာ။"},
+{0,"3.132","Burmese (Unicode 5.0)", "ကျွန်တော် ကျွန်မ မှန်စားနိုင်တယ်။ ၎င်းကြောင့် ထိခိုက်မှုမရှိပါ။"},
+{0,"3.133","Vietnamese (quốc ngữ)", "Tôi có thể ăn thủy tinh mà không hại gì."},
+{0,"3.134","Vietnamese (nôm) (4)", "些 𣎏 世 咹 水 晶 𦓡 空 𣎏 害 咦"},
+{0,"3.135","Khmer", "ខ្ញុំអាចញុំកញ្ចក់បាន ដោយគ្មានបញ្ហារ"},
+{0,"3.136","Lao", "ຂອ້ຍກິນແກ້ວໄດ້ໂດຍທີ່ມັນບໍ່ໄດ້ເຮັດໃຫ້ຂອ້ຍເຈັບ."},
+{0,"3.137","Thai", "ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ"},
+{0,"3.138","Mongolian /(Cyrillic)", "Би шил идэй чадна, надад хортой биш"},
+{0,"3.139","Mongolian /(Classic)/ (5)", "ᠪᠢ ᠰᠢᠯᠢ ᠢᠳᠡᠶᠦ ᠴᠢᠳᠠᠨᠠ ᠂ ᠨᠠᠳᠤᠷ ᠬᠣᠤᠷᠠᠳᠠᠢ ᠪᠢᠰᠢ"},
+{0,"3.140","Nepali", "म काँच खान सक्छू र मलाई केहि नी हुन्‍न् ।"},
+{0,"3.141","Tibetan", "ཤེལ་སྒོ་ཟ་ནས་ང་ན་གི་མ་རེད།"},
+{0,"3.142","Chinese", "我能吞下玻璃而不伤身体。"},
+{0,"3.143","Chinese (Traditional)", "我能吞下玻璃而不傷身體。"},
+{0,"3.144","Taiwanese(6)", "Góa ē-tàng chia̍h po-lê, mā bē tio̍h-siong."},
+{0,"3.145","Japanese", "私はガラスを食べられます。それは私を傷つけません。"},
+{0,"3.146","Korean", "나는 유리를 먹을 수 있어요. 그래도 아프지 않아요"},
+{0,"3.147","Bislama", "Mi save kakae glas, hemi no save katem mi."},
+{0,"3.148","Hawaiian", "Hiki iaʻu ke ʻai i ke aniani; ʻaʻole nō lā au e ʻeha."},
+{0,"3.149","Marquesan", "E koʻana e kai i te karahi, mea ʻā, ʻaʻe hauhau."},
+{0,"3.150","Inuktitut (10)", "ᐊᓕᒍᖅ ᓂᕆᔭᕌᖓᒃᑯ ᓱᕋᙱᑦᑐᓐᓇᖅᑐᖓ"},
+{0,"3.151","Chinook Jargon", "Naika məkmək kakshət labutay, pi weyk ukuk munk-sik nay."},
+{0,"3.152","Navajo", "Tsésǫʼ yishą́ągo bííníshghah dóó doo shił neezgai da."},
+{0,"3.153","Lojban", "mi kakne le nu citka le blaci .iku'i le se go'i na xrani mi"},
+{0,"3.154","Nórdicg", "Ljœr ye caudran créneþ ý jor cẃran."},
+NULLTEST
+};
+
+static const struct Test utf8phrases2[] = {
+{0,"4.1","Euro Symbol", "€."},
+{0,"4.2","Greek", "Μπορώ να φάω σπασμένα γυαλιά χωρίς να πάθω τίποτα."},
+{0,"4.3","Íslenska / Icelandic", "Ég get etið gler án þess að meiða mig."},
+{0,"4.4","Polish", "Mogę jeść szkło, i mi nie szkodzi."},
+{0,"4.5","Romanian", "Pot să mănânc sticlă și ea nu mă rănește."},
+{0,"4.6","Ukrainian", "Я можу їсти шкло, й воно мені не пошкодить."},
+{0,"4.7","Armenian", "Կրնամ ապակի ուտել և ինծի անհանգիստ չըներ։"},
+{0,"4.8","Georgian", "მინას ვჭამ და არა მტკივა."},
+{0,"4.9","Hindi", "मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा नहीं होती."},
+{0,"4.10", "Hebrew", "אני יכול לאכול זכוכית וזה לא מזיק לי."},
+{0,"4.11","Yiddish", "איך קען עסן גלאָז און עס טוט מיר נישט װײ."},
+{0,"4.12","Arabic", "أنا قادر على أكل الزجاج و هذا لا يؤلمني."},
+{0,"4.13","Japanese", "私はガラスを食べられます。それは私を傷つけません。"},
+{0,"4.14","Thai", "ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ "},
+NULLTEST
+};
+
+static char*
+trim(const char* s)
+{
+    int i;
+    size_t l = strlen(s);
+    char* t = strdup(s);
+    for(i=l-1;l >= 0; i--) {
+        if(t[i] != ' ') break;
+    }
+    t[i+1] = '\0';
+    return t;
+}
+
+static int
+test(const struct Test* tests, const char* title)
+{
+    int status = NC_NOERR;
+    int i,failures = 0;
+    const struct Test* p;
+
+    fprintf(stderr,"Testing %s...\n",title);
+    for(p=tests;p->id;p++) {
+	unsigned char* normal;
+	char* id;
+        char* description;
+        const char* pf;
+        id = trim(p->id);
+        description = trim(p->description);
+	/* 1. validate the string */
+        status = nc_utf8_validate((const unsigned char*)p->data);
+        if(status != NC_NOERR) {pf = "Fail"; failures++; goto fail;}
+	/* 2. normalize the string */
+        status = nc_utf8_normalize((const unsigned char*)p->data,&normal);
+        if(status != NC_NOERR) {pf = "Fail"; failures++; goto fail;}
+	/* 3. re-validate the normalized string */
+        status = nc_utf8_validate((const unsigned char*)normal);
+        if(status != NC_NOERR) {pf = "Fail"; failures++; goto fail;}
+	/* 3. compare input with output */
+	{
+	    int dlen = strlen((const char*)p->data);
+	    int nlen = strlen((const char*)normal);
+	    int mlen,i;
+	    if(dlen != nlen)
+		fprintf(stderr,"\t%s: length mismatch: in=%d norm=%d\n",p->id,dlen,nlen);
+	    mlen = (dlen < nlen ? dlen : nlen);
+	    for(i=0;i<mlen;i++) {
+		unsigned char cd = p->data[i];
+		unsigned char cn = normal[i];
+		if(cd != cn) {
+		    fprintf(stderr,"\t%s: [%d] data=|%02x| normal=|%02x|\n",p->id,i,cd,cn);
+		    break;
+		}
+	    }
+	}
+	pf = "Pass";
+fail:
+        fprintf(stderr,"%s: %s %s\n",pf,id,description);
+        fflush(stderr);
+    }
+    return failures;
+}
+
+int
+main(int argc, char** argv)
+{
+    int i, status;
+    int failures = 0;
+    int tstcnt = 0;
+
+    printf("\n Testing UTF-8 sequences.\n");
+    failures += test(utf8currency,"Currencies");
+    failures += test(utf8poems,"Poetry");
+    failures += test(utf8phrases1,"Phrases Set 1");
+    failures += test(utf8phrases2,"Phrases Set 2");
+    fprintf(stderr,"No. of failures = %d\n",failures);
+    exit(failures == 0 ? 0 : 1);
+}
diff --git a/nc_test/tst_utf8_validate.c b/nc_test/tst_utf8_validate.c
new file mode 100644
index 0000000..ccb9641
Binary files /dev/null and b/nc_test/tst_utf8_validate.c differ
diff --git a/nc_test/util.c b/nc_test/util.c
index 25f0b82..33b5323 100644
--- a/nc_test/util.c
+++ b/nc_test/util.c
@@ -4,8 +4,9 @@
  *   $Id: util.c 2792 2014-10-27 06:02:59Z wkliao $
  *********************************************************************/
 
+#include <math.h> /* floor() */
 #include "tests.h"
-#include <math.h>
+
 void
 print_nok(int nok)
 {
@@ -17,63 +18,58 @@ print_nok(int nok)
 
 /* Is value within external type range? */
 int
-inRange(const double value, const nc_type datatype)
-{
-    double min, max;
-
-    switch (datatype) {
-        case NC_CHAR:   return value >= X_CHAR_MIN   && value <= X_CHAR_MAX;
-        case NC_BYTE:   return value >= X_BYTE_MIN   && value <= X_BYTE_MAX;
-        case NC_SHORT:  return value >= X_SHORT_MIN  && value <= X_SHORT_MAX;
-        case NC_INT:    return value >= X_INT_MIN    && value <= X_INT_MAX;
-        case NC_FLOAT:  return value >= X_FLOAT_MIN  && value <= X_FLOAT_MAX;
-        case NC_DOUBLE: return value >= X_DOUBLE_MIN && value <= X_DOUBLE_MAX;
-        case NC_UBYTE:  return value >= 0            && value <= X_UCHAR_MAX;
-        case NC_USHORT: return value >= 0            && value <= X_USHORT_MAX;
-        case NC_UINT:   return value >= 0            && value <= X_UINT_MAX;
-        case NC_INT64:  return value >= X_INT64_MIN  && value <= X_INT64_MAX;
-        case NC_UINT64: return value >= 0            && value <= X_UINT64_MAX;
-	default:  assert(0);
-    }
-    return value >= min && value <= max;
-}
-
-static int
-inRange_uchar(const double value, const nc_type datatype)
+inRange(const double value, const nc_type xtype)
 {
-    if (datatype == NC_BYTE) {
-	return(value >= 0 && value <= 255);
-    }
-    /* else */
-    return inRange(value, datatype);
+  switch (xtype) {
+    double min = 0.0;
+    double max = 0.0;
+
+
+  case NC_CHAR:   return value >= X_CHAR_MIN   && value <= X_CHAR_MAX;
+  case NC_BYTE:   return value >= X_BYTE_MIN   && value <= X_BYTE_MAX;
+  case NC_SHORT:  return value >= X_SHORT_MIN  && value <= X_SHORT_MAX;
+  case NC_INT:    return value >= X_INT_MIN    && value <= X_INT_MAX;
+  case NC_FLOAT:  return value >= X_FLOAT_MIN  && value <= X_FLOAT_MAX;
+  case NC_DOUBLE: return value >= X_DOUBLE_MIN && value <= X_DOUBLE_MAX;
+  case NC_UBYTE:  return value >= 0            && value <= X_UCHAR_MAX;
+  case NC_USHORT: return value >= 0            && value <= X_USHORT_MAX;
+  case NC_UINT:   return value >= 0            && value <= X_UINT_MAX;
+  case NC_INT64:  return value >= X_INT64_MIN  && value <= X_INT64_MAX;
+  case NC_UINT64: return value >= 0            && value <= X_UINT64_MAX;
+  default:  assert(0);
+    return(0);
+  }
 }
 
 static int
-inRange_schar(const double value, const nc_type datatype)
+inRange_uchar(const int     cdf_format,
+              const double  value,
+              const nc_type xtype)
 {
-    /* check value of type datatype if within schar range */
+    /* check value of type xtype if within uchar range */
 
-    if (datatype == NC_UBYTE) {
+    if (cdf_format < NC_FORMAT_CDF5 && xtype == NC_BYTE) {
         /* netCDF specification make a special case for type conversion between
          * uchar and scahr: do not check for range error. See
-         * http://www.unidata.ucar.edu/software/netcdf/docs_rc/data_type.html#type_conversion
+         * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
          */
-        return(value >= X_CHAR_MIN && value <= X_CHAR_MAX);
+        return(value >= 0 && value <= 255);
+        /* this is to ensure value is within the range of uchar */
     }
     /* else */
-    return inRange(value, datatype);
+    return inRange(value, xtype);
 }
 
 static int
-inRange_float(const double value, const nc_type datatype)
+inRange_float(const double value, const nc_type xtype)
 {
     double min, max;
 
-    switch (datatype) {
-	case NC_CHAR:   min = X_CHAR_MIN;   max = X_CHAR_MAX; break;
-	case NC_BYTE:   min = X_BYTE_MIN;   max = X_BYTE_MAX; break;
+    switch (xtype) {
+	case NC_CHAR:   min = X_CHAR_MIN;   max = X_CHAR_MAX;  break;
+	case NC_BYTE:   min = X_BYTE_MIN;   max = X_BYTE_MAX;  break;
 	case NC_SHORT:  min = X_SHORT_MIN;  max = X_SHORT_MAX; break;
-	case NC_INT:   min = X_INT_MIN;   max = X_INT_MAX; break;
+	case NC_INT:    min = X_INT_MIN;    max = X_INT_MAX;   break;
 	case NC_FLOAT:
 		if(FLT_MAX < X_FLOAT_MAX) {
 			min = (-FLT_MAX);
@@ -101,7 +97,7 @@ inRange_float(const double value, const nc_type datatype)
     }
     if(!( value >= min && value <= max)) {
 #if 0	/* DEBUG */
-	if(datatype == NC_FLOAT) {
+	if(xtype == NC_FLOAT) {
 	fprintf(stderr, "\n");
 	fprintf(stderr, "min   % .17e\n", min);
 	fprintf(stderr, "value % .17e\n", value);
@@ -113,7 +109,7 @@ inRange_float(const double value, const nc_type datatype)
 #if FLT_MANT_DIG != DBL_MANT_DIG
     /* else */
     {
-	const float fvalue = value;
+	const float fvalue = (float)value;
 	return fvalue >= min && fvalue <= max;
     }
 #else
@@ -122,24 +118,37 @@ inRange_float(const double value, const nc_type datatype)
 }
 
 /* wrapper for inRange to handle special NC_BYTE/uchar adjustment */
+/* this function checks whether "value" to be casted to type "itype" is
+ * within the range of external "xtype".
+ */
 int
-inRange3(
-    const double value,
-    const nc_type datatype,
-    const nct_itype itype)
+inRange3(const int    cdf_format,
+         const double value,
+         const nc_type xtype,
+         const nct_itype itype)
 {
+    /* netCDF specification make a special case for type conversion between
+     * uchar and NC_BYTE: do not check for range error. See
+     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+     * The _uchar and _schar functions were introduced in netCDF-3 to eliminate
+     * an ambiguity, and support both signed and unsigned byte data. In
+     * netCDF-2, whether the external NC_BYTE type represented signed or
+     * unsigned values was left up to the user. In netcdf-3, we treat NC_BYTE
+     * as signed for the purposes of conversion to short, int, long, float, or
+     * double. (Of course, no conversion takes place when the internal type is
+     * signed char.) In the _uchar functions, we treat NC_BYTE as if it were
+     * unsigned. Thus, no NC_ERANGE error can occur converting between NC_BYTE
+     * and unsigned char.
+     */
     switch (itype) {
-        case NCT_SCHAR:
-        case NCT_CHAR:
-            return inRange_schar(value, datatype);
-    case NCT_UCHAR:
-	return inRange_uchar(value, datatype);
-    case NCT_FLOAT:
-	return inRange_float(value, datatype);
-    default:
-	break;
+        case NCT_UCHAR:
+	    return inRange_uchar(cdf_format, value, xtype);
+        case NCT_FLOAT:
+	    return inRange_float(value, xtype);
+        default:
+	    break;
     }
-    return inRange(value, datatype);
+    return inRange(value, xtype);
 }
 
 
@@ -148,17 +157,51 @@ inRange3(
  *  Use tolerant comparison based on IEEE FLT_EPSILON or DBL_EPSILON.
  */
 int
-equal(
-    const double x,
-    const double y,
-    nc_type extType, 	/* external data type */
-    nct_itype itype)
+equal(const double x,
+      const double y,
+      nc_type xtype, 	/* external data type */
+      nct_itype itype)
+{
+    const double flt_epsilon = 1.19209290E-07;
+    const double dbl_epsilon = 2.2204460492503131E-16;
+    double epsilon;
+
+    epsilon = xtype == NC_FLOAT ||
+              itype == NCT_FLOAT ? flt_epsilon : dbl_epsilon;
+
+    if (xtype == NC_CHAR && itype == NCT_TEXT) {
+        /* because in-memory data type char can be signed or unsigned,
+         * type cast the value from external NC_CHAR before the comparison
+         */
+        char x2 = (char) x;
+        char y2 = (char) y;
+        return ABS(x2-y2) <= epsilon * MAX( ABS(x2), ABS(y2));
+    }
+
+    return ABS(x-y) <= epsilon * MAX( ABS(x), ABS(y));
+}
+
+/* this function is for the APIs without itype, i.e. xtype == itype */
+int
+equal2(const double x,
+       const double y,
+       nc_type xtype)    /* external data type */
 {
     const double flt_epsilon = 1.19209290E-07;
     const double dbl_epsilon = 2.2204460492503131E-16;
     double epsilon;
 
-    epsilon = extType == NC_FLOAT || itype == NCT_FLOAT ? flt_epsilon : dbl_epsilon;
+    epsilon = xtype == NC_FLOAT ? flt_epsilon : dbl_epsilon;
+
+    if (xtype == NC_CHAR) {
+        /* because in-memory data type char can be signed or unsigned,
+         * type cast the value from external NC_CHAR before the comparison
+         */
+        char x2 = (char) x;
+        char y2 = (char) y;
+        return ABS(x2-y2) <= epsilon * MAX( ABS(x2), ABS(y2));
+    }
+
     return ABS(x-y) <= epsilon * MAX( ABS(x), ABS(y));
 }
 
@@ -177,9 +220,9 @@ int_vec_eq(const int *v1, const int *v2, const int n)
  *  Generate random integer from 0 to n-1
  *  Like throwing an n-sided dice marked 0, 1, 2, ..., n-1
  */
-int roll( int n )
+size_t roll( size_t n )
 {
-    int  r;
+    size_t r;
 
     do
 	/*
@@ -189,7 +232,7 @@ int roll( int n )
 	 * We don't use RAND_MAX here because not all compilation
 	 * environments define it (e.g. gcc(1) under SunOS 4.1.4).
 	 */
-	r = ((rand() % 32768) / 32767.0) * (n - 1) + 0.5;
+	r = (size_t)(((rand() % 32768) / 32767.0) * (n - 1) + 0.5);
     while (r >= n);
 
     return r;
@@ -209,16 +252,15 @@ int roll( int n )
 int
 toMixedBase(
     size_t number,        /* number to be converted to mixed base */
-    size_t length,
+    int length,
     const size_t base[],        /* dimensioned [length], base[0] ignored */
     size_t result[])      /* dimensioned [length] */
 {
-    size_t i;
+    int i;
 
     if (length > 0) {
 	for (i = length - 1; i > 0; i--) {
-	    if (base[i] == 0)
-		return 1;
+	    if (base[i] == 0) return 1;
 	    result[i] = number % base[i];
 	    number = number / base[i];
 	}
@@ -238,10 +280,9 @@ toMixedBase(
  *      Author: Harvey Davies, Unidata/UCAR, Boulder, Colorado
  */
 size_t
-fromMixedBase(
-    size_t length,
-    size_t number[],      /* dimensioned [length] */
-    size_t base[])        /* dimensioned [length], base[0] ignored */
+fromMixedBase(int    length,
+              size_t number[],      /* dimensioned [length] */
+              size_t base[])        /* dimensioned [length], base[0] ignored */
 {
     size_t i;
     size_t result = 0;
@@ -257,30 +298,30 @@ fromMixedBase(
 
 
 /* Convert any nc_type to double */
-int nc2dbl ( const nc_type datatype, const void *p, double *result)
+int nc2dbl ( const nc_type xtype, const void *p, double *result)
 {
     if ( ! p ) return 2;
     if ( ! result ) return 3;
-    switch (datatype) {
-        case NC_BYTE: *result = *((signed char *) p); break;
-        case NC_CHAR: *result = *((signed char *) p); break;
-        case NC_SHORT: *result = *((short *) p); break;
+    switch (xtype) {
+        case NC_CHAR:   *result = *((char *)          p); break;
+        case NC_BYTE:   *result = *((signed char *)    p); break;
+        case NC_UBYTE:  *result = *((unsigned char *)  p); break;
+        case NC_SHORT:  *result = *((short *)          p); break;
+        case NC_USHORT: *result = *((unsigned short *) p); break;
         case NC_INT:
 #if INT_MAX >= X_INT_MAX
 		*result = *((int *) p); break;
 #else
 		*result = *((long *) p); break;
 #endif
-        case NC_FLOAT: *result = *((float *) p); break;
-        case NC_DOUBLE: *result = *((double *) p); break;
-        case NC_UBYTE:  *result = *((unsigned char *)  p); break;
-        case NC_USHORT: *result = *((unsigned short *) p); break;
         case NC_UINT:
 #if UINT_MAX >= X_UINT_MAX
             *result = *((unsigned int *) p); break;
 #else
             *result = *((unsigned long *) p); break;
 #endif
+        case NC_FLOAT:  *result = *((float *)              p); break;
+        case NC_DOUBLE: *result = *((double *)             p); break;
         case NC_INT64:  *result = *((long long *)          p); break;
         case NC_UINT64: *result = *((unsigned long long *) p); break;
         default: return 1;
@@ -290,83 +331,86 @@ int nc2dbl ( const nc_type datatype, const void *p, double *result)
 
 
 /* Convert double to any nc_type */
-int dbl2nc ( const double d, const nc_type datatype, void *p)
+int dbl2nc ( const double d, const nc_type xtype, void *p)
 {
     double r;   /* rounded value */
 
-    if (p) {
-        switch (datatype) {
-            case NC_BYTE:
-                r = floor(0.5+d);
-                if ( r < schar_min  ||  r > schar_max )  return 2;
-                *((signed char *) p) = r;
-                break;
-            case NC_CHAR:
-              r = floor(0.5+d);
-              if ( r < text_min  ||  r > text_max )  return 2;
-#ifndef __CHAR_UNSIGNED__
-              *((char   *) p) = r;
-#else
-              *((signed char*) p) = r;
-#endif
-              break;
-            case NC_SHORT:
-                r = floor(0.5+d);
-                if ( r < short_min  ||  r > short_max )  return 2;
-                *((short  *) p) = r;
-                break;
-            case NC_INT:
-                r = floor(0.5+d);
-                if ( r < long_min  ||  r > long_max )  return 2;
-#if INT_MAX >= X_INT_MAX
-                *((int   *) p) = r;
+    if (p == NULL) return 1;
+    switch (xtype) {
+        case NC_CHAR:
+            r = floor(0.5+d);
+            /* d is obtained from hash() which may be set to X_CHAR_MIN (0)
+             * or X_CHAR_MAX (255). When in-memory data type char is signed
+             * (i.e. ranged from -128 to 127), we should still allow a type
+             * cast a unsigned value > 127 to a signed char without
+             * reporting it as a range error.
+             */
+            if ( r < X_CHAR_MIN || r > X_CHAR_MAX ) return 2;
+#if defined(__CHAR_UNSIGNED__) && __CHAR_UNSIGNED__ != 0
+            *((signed char*) p) = (signed char)r;
 #else
-                *((long   *) p) = r;
+            *((char   *) p) = (char)r;
 #endif
-                break;
-            case NC_FLOAT:
-                if ( fabs(d) > float_max )  return 2;
-                *((float  *) p) = d;
-                break;
-            case NC_DOUBLE:
-                *((double *) p) = d;
-                break;
+            break;
+        case NC_BYTE:
+            r = floor(0.5+d);
+            if ( r < schar_min  ||  r > schar_max )  return 2;
+            *((signed char *) p) = (signed char)r;
+            break;
         case NC_UBYTE:
             r = floor(0.5+d);
             if ( r < 0.0  ||  r > uchar_max )  return 2;
-            *((unsigned char *) p) = r;
+            *((unsigned char *) p) = (unsigned char)r;
+            break;
+        case NC_SHORT:
+            r = floor(0.5+d);
+            if ( r < short_min  ||  r > short_max )  return 2;
+            *((short  *) p) = (short)r;
             break;
         case NC_USHORT:
             r = floor(0.5+d);
             if ( r < 0.0  ||  r > ushort_max )  return 2;
-            *((unsigned short *) p) = r;
+            *((unsigned short *) p) = (unsigned short)r;
+            break;
+        case NC_INT:
+            r = floor(0.5+d);
+            if ( r < long_min  ||  r > long_max )  return 2;
+#if INT_MAX >= X_INT_MAX
+            *((int   *) p) = (int)r;
+#else
+            *((long   *) p) = (long)r;
+#endif
             break;
         case NC_UINT:
             r = floor(0.5+d);
             if ( r < 0.0  ||  r > uint_max )  return 2;
 #if UINT_MAX >= X_UINT_MAX
-            *((unsigned int  *) p) = r;
+            *((unsigned int  *) p) = (unsigned int)r;
 #else
-            *((unsigned long *) p) = r;
+            *((unsigned long *) p) = (unsigned long)r;
 #endif
             break;
+        case NC_FLOAT:
+            if ( fabs(d) > float_max )  return 2;
+            *((float  *) p) = (float)d;
+            break;
+        case NC_DOUBLE:
+            *((double *) p) = (double)d;
+            break;
         case NC_INT64:
             r = floor(0.5+d);
             if ( r < int64_min  ||  r > int64_max )  return 2;
-            *((long long *) p) = r;
+            *((long long *) p) = (long long)r;
             break;
         case NC_UINT64:
             r = floor(0.5+d);
             if ( r < 0.0  ||  r > uint64_max )  return 2;
-            *((unsigned long long *) p) = r;
+            *((unsigned long long *) p) = (unsigned long long)r;
             break;
-            default:
-                return 1;
-        }
-	return 0;
-    } else {
-	return 1;
+        default:
+            return 1;
     }
+    return 0;
 }
 
 #define FUZZ (1.19209290E-07)
@@ -374,7 +418,7 @@ int dbl2nc ( const double d, const nc_type datatype, void *p)
 #ifdef USE_EXTREME_NUMBERS
 /* Generate data values as function of type, rank (-1 for attribute), index */
 double
-hash( const nc_type type, const int rank, const size_t *index )
+hash( const nc_type xtype, const int rank, const size_t *index )
 {
     double base;
     double result;
@@ -385,11 +429,11 @@ hash( const nc_type type, const int rank, const size_t *index )
     if (abs(rank) == 1 && index[0] <= 3) {
 	switch (index[0]) {
 	    case 0:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return X_CHAR_MIN;
 		    case NC_BYTE:   return X_BYTE_MIN;
 		    case NC_SHORT:  return X_SHORT_MIN;
-		    case NC_INT:   return X_INT_MIN;
+		    case NC_INT:    return X_INT_MIN;
 		    case NC_FLOAT:  return X_FLOAT_MIN;
 		    case NC_DOUBLE: return X_DOUBLE_MIN;
                     case NC_UBYTE:  return 0;
@@ -401,11 +445,11 @@ hash( const nc_type type, const int rank, const size_t *index )
 		    default:  assert(0);
 		}
 	    case 1:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return X_CHAR_MAX;
 		    case NC_BYTE:   return X_BYTE_MAX;
 		    case NC_SHORT:  return X_SHORT_MAX;
-		    case NC_INT:   return X_INT_MAX;
+		    case NC_INT:    return X_INT_MAX;
 		    case NC_FLOAT:  return X_FLOAT_MAX;
 		    case NC_DOUBLE: return X_DOUBLE_MAX;
                     case NC_UBYTE:  return X_UCHAR_MAX;
@@ -418,11 +462,11 @@ hash( const nc_type type, const int rank, const size_t *index )
 		    default:  assert(0);
 		}
 	    case 2:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return 'A';
 		    case NC_BYTE:   return X_BYTE_MIN-1.0;
 		    case NC_SHORT:  return X_SHORT_MIN-1.0;
-		    case NC_INT:   return X_INT_MIN-1.0;
+		    case NC_INT:    return X_INT_MIN-1.0;
 		    case NC_FLOAT:  return X_FLOAT_MIN * (1.0 + FUZZ);
 		    case NC_DOUBLE: return -1.0;
                     case NC_UBYTE:  return -1.0;
@@ -433,11 +477,11 @@ hash( const nc_type type, const int rank, const size_t *index )
 		    default:  assert(0);
 		}
 	    case 3:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return 'Z';
 		    case NC_BYTE:   return X_BYTE_MAX+1.0;
 		    case NC_SHORT:  return X_SHORT_MAX+1.0;
-		    case NC_INT:   return X_INT_MAX+1.0;
+		    case NC_INT:    return X_INT_MAX+1.0;
 		    case NC_FLOAT:  return X_FLOAT_MAX * (1.0 + FUZZ);
 		    case NC_DOUBLE: return 1.0;
                     case NC_UBYTE:  return X_UCHAR_MAX +1.0;
@@ -449,12 +493,12 @@ hash( const nc_type type, const int rank, const size_t *index )
 		}
 	}
     } else {
-	switch (type) {
-	    case NC_CHAR: base = 2; break;
-	    case NC_BYTE: base = -2; break;
-	    case NC_SHORT: base = -5; break;
-	    case NC_INT: base = -20; break;
-	    case NC_FLOAT: base = -9; break;
+	switch (xtype) {
+	    case NC_CHAR:   base =   2; break;
+	    case NC_BYTE:   base =  -2; break;
+	    case NC_SHORT:  base =  -5; break;
+	    case NC_INT:    base = -20; break;
+	    case NC_FLOAT:  base =  -9; break;
 	    case NC_DOUBLE: base = -10; break;
 
             /* not sure what right values are */
@@ -479,7 +523,7 @@ hash( const nc_type type, const int rank, const size_t *index )
 
 /* Generate data values as function of type, rank (-1 for attribute), index */
 double
-hash( const nc_type type, const int rank, const size_t *index )
+hash( const nc_type xtype, const int rank, const size_t *index )
 {
     double base;
     double result;
@@ -490,7 +534,7 @@ hash( const nc_type type, const int rank, const size_t *index )
     if (abs(rank) == 1 && index[0] <= 3) {
 	switch (index[0]) {
 	    case 0:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return X_CHAR_MIN;
 		    case NC_BYTE:   return X_BYTE_MIN;
 		    case NC_SHORT:  return SANE_SHORT;
@@ -506,7 +550,7 @@ hash( const nc_type type, const int rank, const size_t *index )
 		    default:  assert(0);
 		}
 	    case 1:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return X_CHAR_MAX;
 		    case NC_BYTE:   return X_BYTE_MAX;
 		    case NC_SHORT:  return SANE_SHORT;
@@ -523,7 +567,7 @@ hash( const nc_type type, const int rank, const size_t *index )
 		    default:  assert(0);
 		}
 	    case 2:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return 'A';
 		    case NC_BYTE:   return X_BYTE_MIN-1.0;
 		    case NC_SHORT:  return SANE_SHORT-1.0;
@@ -538,7 +582,7 @@ hash( const nc_type type, const int rank, const size_t *index )
 		    default:  assert(0);
 		}
 	    case 3:
-		switch (type) {
+		switch (xtype) {
 		    case NC_CHAR:   return 'Z';
 		    case NC_BYTE:   return X_BYTE_MAX+1.0;
 		    case NC_SHORT:  return SANE_SHORT+1.0;
@@ -554,7 +598,7 @@ hash( const nc_type type, const int rank, const size_t *index )
 		}
 	}
     } else {
-	switch (type) {
+	switch (xtype) {
 	    case NC_CHAR: base = 2; break;
 	    case NC_BYTE: base = -2; break;
 	    case NC_SHORT: base = -5; break;
@@ -579,17 +623,34 @@ hash( const nc_type type, const int rank, const size_t *index )
 #endif
 /* wrapper for hash to handle special NC_BYTE/uchar adjustment */
 double
-hash4(
-    const nc_type type,
-    const int rank,
-    const size_t *index,
-    const nct_itype itype)
+hash4(const int        cdf_format,
+      const nc_type    xtype,
+      const int        rank,
+      const size_t    *index,
+      const nct_itype  itype)
 {
     double result;
 
-    result = hash( type, rank, index );
-    if (itype == NCT_UCHAR && type == NC_BYTE && result >= -128 && result < 0)
+    result = hash( xtype, rank, index );
+
+    /* netCDF specification make a special case for type conversion between
+     * uchar and NC_BYTE: do not check for range error. See
+     * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
+     * The _uchar and _schar functions were introduced in netCDF-3 to eliminate
+     * an ambiguity, and support both signed and unsigned byte data. In
+     * netCDF-2, whether the external NC_BYTE type represented signed or
+     * unsigned values was left up to the user. In netcdf-3, we treat NC_BYTE
+     * as signed for the purposes of conversion to short, int, long, float, or
+     * double. (Of course, no conversion takes place when the internal type is
+     * signed char.) In the _uchar functions, we treat NC_BYTE as if it were
+     * unsigned. Thus, no NC_ERANGE error can occur converting between NC_BYTE
+     * and unsigned char.
+     */
+    if (cdf_format < NC_FORMAT_CDF5 &&
+        itype == NCT_UCHAR && xtype == NC_BYTE &&
+        result >= -128 && result < 0)
 	result += 256;
+
     return result;
 }
 
@@ -641,7 +702,7 @@ init_gatts(const char *type_letter)
 }
 
 static size_t
-product(size_t nn, const size_t *sp)
+product(int nn, const size_t *sp)
 {
 	size_t result = 1;
 	while(nn-- > 0)
@@ -669,7 +730,7 @@ init_gvars (void)
      */
 	const char digit[] = "r123456789";
 
-	size_t rank;
+	int rank;
 	int vn;			/* var number */
 	int xtype;		/* index of type */
 	int an;			/* attribute number */
@@ -685,7 +746,7 @@ init_gvars (void)
 	{
 			/* number variables of a type and rank */
 		const size_t nvars = product(rank, max_dim_len);
-		int jj;
+		size_t jj;
 
 		for (jj = 0; jj < nvars; jj++)
 		{
@@ -781,13 +842,13 @@ put_atts(int ncid)
     int  j;		/* index of attribute */
     int  allInRange;
     double att[MAX_NELS];
-    signed char catt[MAX_NELS];
+    char catt[MAX_NELS];
 
     for (i = -1; i < numVars; i++) {
 	for (j = 0; j < NATTS(i); j++) {
 	    if (ATT_TYPE(i,j) == NC_CHAR) {
 		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    catt[k] = hash(ATT_TYPE(i,j), -1, &k);
+                    catt[k] = (char) hash(ATT_TYPE(i,j), -1, &k);
 		}
 		err = nc_put_att_text(ncid, i, ATT_NAME(i,j),
 		    ATT_LEN(i,j), catt);
@@ -822,7 +883,7 @@ put_vars(int ncid)
     int  i;
     size_t  j;
     double value[MAX_NELS];
-    signed char text[MAX_NELS];
+    char text[MAX_NELS];
     int  allInRange;
 
     for (j = 0; j < MAX_RANK; j++)
@@ -832,7 +893,7 @@ put_vars(int ncid)
 	    err = toMixedBase(j, var_rank[i], var_shape[i], index);
 	    IF (err) error("toMixedBase");
 	    if (var_name[i][0] == 'c') {
-		text[j] = hash(var_type[i], var_rank[i], index);
+		text[j] = (char) hash(var_type[i], var_rank[i], index);
 	    } else {
 		value[j]  = hash(var_type[i], var_rank[i], index);
 		allInRange = allInRange && inRange(value[j], var_type[i]);
@@ -922,28 +983,23 @@ void
 check_vars(int  ncid)
 {
     size_t index[MAX_RANK];
-    int  err;		/* status */
-    int  i;
+    char  text, name[NC_MAX_NAME];
+    int  i, err;		/* status */
     size_t  j;
-    signed char  text;
-    double value;
-    nc_type datatype;
-    int ndims;
-    int dimids[MAX_RANK];
-    int isChar;
-    double expect;
-    char name[NC_MAX_NAME];
-    size_t length;
     int nok = 0;      /* count of valid comparisons */
+    int isChar, ndims, dimids[MAX_RANK];
+    double value, expect;
+    nc_type xtype;
+    size_t length;
 
     for (i = 0; i < numVars; i++) {
         isChar = var_type[i] == NC_CHAR;
-	err = nc_inq_var(ncid, i, name, &datatype, &ndims, dimids, NULL);
+	err = nc_inq_var(ncid, i, name, &xtype, &ndims, dimids, NULL);
 	IF (err)
 	    error("nc_inq_var: %s", nc_strerror(err));
 	IF (strcmp(name, var_name[i]) != 0)
 	    error("Unexpected var_name");
-	IF (datatype != var_type[i])
+	IF (xtype != var_type[i])
 	    error("Unexpected type");
 	IF (ndims != var_rank[i])
 	    error("Unexpected rank");
@@ -960,18 +1016,14 @@ check_vars(int  ncid)
 		error("error in toMixedBase 2");
 	    expect = hash( var_type[i], var_rank[i], index );
 	    if (isChar) {
-          err = nc_get_var1_text(ncid, i, index, &text);
-          IF (err)
+          	err = nc_get_var1_text(ncid, i, index, &text);
+            IF (err)
 		    error("nc_get_var1_text: %s", nc_strerror(err));
-		IF (text != expect) {
-		    error("Var %s value read 0x%02x not that expected 0x%02x ",
-			var_name[i], text, (char)expect);
-			print_n_size_t(var_rank[i], index);
+            IF (text != (char)expect) {
+              error("Var %s [%lu] value read %hhd not that expected %g ",
+                  var_name[i], j, text, expect);
+		    print_n_size_t(var_rank[i], index);
 		} else {
-#if 0
-			print("\nOk %s ", var_name[i]);
-			print_n_size_t(var_rank[i], index);
-#endif
 		    nok++;
 		}
 	    } else {
@@ -981,16 +1033,10 @@ check_vars(int  ncid)
 			error("nc_get_var1_double: %s", nc_strerror(err));
 		    } else {
 			IF (!equal(value,expect,var_type[i], NCT_DOUBLE)) {
-			    value = 0;
-	  		    err = nc_get_var1_double(ncid, i, index, &value);
-			    error("Var %s value read % 12.5e not that expected % 12.7e ",
-					var_name[i], value, expect);
+			    error("Var %s [%lu] value read %g  not that expected %g ",
+				  var_name[i], j, value, expect);
 			    print_n_size_t(var_rank[i], index);
 			} else {
-#if 0
-			print("\nOk %s ", var_name[i]);
-			print_n_size_t(var_rank[i], index);
-#endif
 			    nok++;
 			}
 		    }
@@ -1012,10 +1058,10 @@ check_atts(int  ncid)
     int  i;
     int  j;
     size_t  k;
-    nc_type datatype;
+    nc_type xtype;
     char name[NC_MAX_NAME];
     size_t length;
-    signed char text[MAX_NELS];
+    char text[MAX_NELS];
     double value[MAX_NELS];
     double expect;
     int nok = 0;      /* count of valid comparisons */
@@ -1027,28 +1073,29 @@ check_atts(int  ncid)
                 error("nc_inq_attname: %s", nc_strerror(err));
             IF (strcmp(name, ATT_NAME(i,j)) != 0)
                 error("nc_inq_attname: unexpected name");
-	    err = nc_inq_att(ncid, i, name, &datatype, &length);
+	    err = nc_inq_att(ncid, i, name, &xtype, &length);
 	    IF (err)
 		error("nc_inq_att: %s", nc_strerror(err));
-	    IF (datatype != ATT_TYPE(i,j))
+	    IF (xtype != ATT_TYPE(i,j))
 		error("nc_inq_att: unexpected type");
 	    IF (length != ATT_LEN(i,j))
 		error("nc_inq_att: unexpected length");
-	    if (datatype == NC_CHAR) {
+	    if (xtype == NC_CHAR) {
 		err = nc_get_att_text(ncid, i, name, text);
 		IF (err)
 		    error("nc_get_att_text: %s", nc_strerror(err));
 		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    IF (text[k] != hash(datatype, -1, &k)) {
+		    expect = hash(xtype, -1, &k);
+		    IF (text[k] != (char)expect) {
 			error("nc_get_att_text: unexpected value");
-            } else {
-              nok++;
-            }
+            	    } else {
+              		nok++;
+            	    }
 		}
 	    } else {
 		err = nc_get_att_double(ncid, i, name, value);
 		for (k = 0; k < ATT_LEN(i,j); k++) {
-		    expect = hash(datatype, -1, &k);
+		    expect = hash(xtype, -1, &k);
 		    if (inRange(expect,ATT_TYPE(i,j))) {
 			IF (err)
 			    error("nc_get_att_double: %s", nc_strerror(err));
@@ -1088,9 +1135,9 @@ check_file(char *filename)
 
 /* TODO: Maybe this function belongs in the netcdf library. */
 const char *
-s_nc_type(nc_type type)
+s_nc_type(nc_type xtype)
 {
-	switch((int)type){
+	switch((int)xtype){
         case NC_CHAR:   return "NC_CHAR";
         case NC_BYTE:   return "NC_BYTE";
         case NC_UBYTE:  return "NC_UBYTE";
@@ -1111,13 +1158,13 @@ int file_create(const char *filename, int cmode, int *ncid)
 {
     int err;
 
+#ifdef USE_PNETCDF
     /* get the default file format */
     int default_format;
     nc_set_default_format(NC_FORMAT_CLASSIC, &default_format);
     /* set it back to the default */
     nc_set_default_format(default_format, NULL);
 
-#ifdef USE_PNETCDF
     if (default_format == NC_FORMAT_CLASSIC ||
         default_format == NC_FORMAT_64BIT_OFFSET ||
         default_format == NC_FORMAT_64BIT_DATA)
@@ -1129,17 +1176,43 @@ int file_create(const char *filename, int cmode, int *ncid)
     return err;
 }
 
-int file_open(const char *filename, int omode, int *ncid)
+int file__create(const char *filename,
+                 int         cmode,
+                 size_t      initialsz,
+                 size_t     *bufrsizehintp,
+                 int        *ncid)
 {
     int err;
 
+#ifdef USE_PNETCDF
     /* get the default file format */
     int default_format;
     err = nc_set_default_format(NC_FORMAT_CLASSIC, &default_format);
     /* set it back to the default */
     err = nc_set_default_format(default_format, NULL);
 
+    if (default_format == NC_FORMAT_CLASSIC ||
+        default_format == NC_FORMAT_64BIT_OFFSET ||
+        default_format == NC_FORMAT_64BIT_DATA)
+        err = nc_create_par(filename, cmode|NC_PNETCDF, MPI_COMM_WORLD, MPI_INFO_NULL, ncid);
+    else
+#endif
+        err = nc__create(filename, cmode, initialsz, bufrsizehintp, ncid);
+
+    return err;
+}
+
+int file_open(const char *filename, int omode, int *ncid)
+{
+    int err;
+
 #ifdef USE_PNETCDF
+    /* get the default file format */
+    int default_format;
+    err = nc_set_default_format(NC_FORMAT_CLASSIC, &default_format);
+    /* set it back to the default */
+    err = nc_set_default_format(default_format, NULL);
+
     if (default_format == NC_FORMAT_CLASSIC ||
         default_format == NC_FORMAT_64BIT_OFFSET ||
         default_format == NC_FORMAT_64BIT_DATA)
@@ -1150,3 +1223,241 @@ int file_open(const char *filename, int omode, int *ncid)
 
     return err;
 }
+
+
+#ifdef USE_PNETCDF
+#include <pnetcdf.h>  /* to include PnetCDF error codes */
+#endif
+
+char* nc_err_code_name(int err)
+{
+    static char unknown_str[32];
+
+    if (err > 0) { /* system error */
+        const char *cp = (const char *) strerror(err);
+        if (cp == NULL)
+            sprintf(unknown_str,"Unknown error code %d",err);
+        else
+            sprintf(unknown_str,"Error code %d (%s)",err,cp);
+        return unknown_str;
+    }
+
+    switch (err) {
+        case (NC_NOERR):			return "NC_NOERR";
+        case (NC_EBADID):			return "NC_EBADID";
+        case (NC_ENFILE):			return "NC_ENFILE";
+        case (NC_EEXIST):			return "NC_EEXIST";
+        case (NC_EINVAL):			return "NC_EINVAL";
+        case (NC_EPERM):			return "NC_EPERM";
+        case (NC_ENOTINDEFINE):			return "NC_ENOTINDEFINE";
+        case (NC_EINDEFINE):			return "NC_EINDEFINE";
+        case (NC_EINVALCOORDS):			return "NC_EINVALCOORDS";
+        case (NC_EMAXDIMS):			return "NC_EMAXDIMS";
+        case (NC_ENAMEINUSE):			return "NC_ENAMEINUSE";
+        case (NC_ENOTATT):			return "NC_ENOTATT";
+        case (NC_EMAXATTS):			return "NC_EMAXATTS";
+        case (NC_EBADTYPE):			return "NC_EBADTYPE";
+        case (NC_EBADDIM):			return "NC_EBADDIM";
+        case (NC_EUNLIMPOS):			return "NC_EUNLIMPOS";
+        case (NC_EMAXVARS):			return "NC_EMAXVARS";
+        case (NC_ENOTVAR):			return "NC_ENOTVAR";
+        case (NC_EGLOBAL):			return "NC_EGLOBAL";
+        case (NC_ENOTNC):			return "NC_ENOTNC";
+        case (NC_ESTS):				return "NC_ESTS";
+        case (NC_EMAXNAME):			return "NC_EMAXNAME";
+        case (NC_EUNLIMIT):			return "NC_EUNLIMIT";
+        case (NC_ENORECVARS):			return "NC_ENORECVARS";
+        case (NC_ECHAR):			return "NC_ECHAR";
+        case (NC_EEDGE):			return "NC_EEDGE";
+        case (NC_ESTRIDE):			return "NC_ESTRIDE";
+        case (NC_EBADNAME):			return "NC_EBADNAME";
+        case (NC_ERANGE):			return "NC_ERANGE";
+        case (NC_ENOMEM):			return "NC_ENOMEM";
+        case (NC_EVARSIZE):			return "NC_EVARSIZE";
+        case (NC_EDIMSIZE):			return "NC_EDIMSIZE";
+        case (NC_ETRUNC):			return "NC_ETRUNC";
+        case (NC_EAXISTYPE):			return "NC_EAXISTYPE";
+        case (NC_EDAP):				return "NC_EDAP";
+        case (NC_ECURL):			return "NC_ECURL";
+        case (NC_EIO):				return "NC_EIO";
+        case (NC_ENODATA):			return "NC_ENODATA";
+        case (NC_EDAPSVC):			return "NC_EDAPSVC";
+        case (NC_EDAS):				return "NC_EDAS";
+        case (NC_EDDS):				return "NC_EDDS";
+        case (NC_EDATADDS):			return "NC_EDATADDS";
+        case (NC_EDAPURL):			return "NC_EDAPURL";
+        case (NC_EDAPCONSTRAINT):		return "NC_EDAPCONSTRAINT";
+        case (NC_ETRANSLATION):			return "NC_ETRANSLATION";
+        case (NC_EACCESS):			return "NC_EACCESS";
+        case (NC_EAUTH):			return "NC_EAUTH";
+        case (NC_ENOTFOUND):			return "NC_ENOTFOUND";
+        case (NC_ECANTREMOVE):			return "NC_ECANTREMOVE";
+        case (NC_EHDFERR):			return "NC_EHDFERR";
+        case (NC_ECANTREAD):			return "NC_ECANTREAD";
+        case (NC_ECANTWRITE):			return "NC_ECANTWRITE";
+        case (NC_ECANTCREATE):			return "NC_ECANTCREATE";
+        case (NC_EFILEMETA):			return "NC_EFILEMETA";
+        case (NC_EDIMMETA):			return "NC_EDIMMETA";
+        case (NC_EATTMETA):			return "NC_EATTMETA";
+        case (NC_EVARMETA):			return "NC_EVARMETA";
+        case (NC_ENOCOMPOUND):			return "NC_ENOCOMPOUND";
+        case (NC_EATTEXISTS):			return "NC_EATTEXISTS";
+        case (NC_ENOTNC4):			return "NC_ENOTNC4";
+        case (NC_ESTRICTNC3):			return "NC_ESTRICTNC3";
+        case (NC_ENOTNC3):			return "NC_ENOTNC3";
+        case (NC_ENOPAR):			return "NC_ENOPAR";
+        case (NC_EPARINIT):			return "NC_EPARINIT";
+        case (NC_EBADGRPID):			return "NC_EBADGRPID";
+        case (NC_EBADTYPID):			return "NC_EBADTYPID";
+        case (NC_ETYPDEFINED):			return "NC_ETYPDEFINED";
+        case (NC_EBADFIELD):			return "NC_EBADFIELD";
+        case (NC_EBADCLASS):			return "NC_EBADCLASS";
+        case (NC_EMAPTYPE):			return "NC_EMAPTYPE";
+        case (NC_ELATEFILL):			return "NC_ELATEFILL";
+        case (NC_ELATEDEF):			return "NC_ELATEDEF";
+        case (NC_EDIMSCALE):			return "NC_EDIMSCALE";
+        case (NC_ENOGRP):			return "NC_ENOGRP";
+        case (NC_ESTORAGE):			return "NC_ESTORAGE";
+        case (NC_EBADCHUNK):			return "NC_EBADCHUNK";
+        case (NC_ENOTBUILT):			return "NC_ENOTBUILT";
+        case (NC_EDISKLESS):			return "NC_EDISKLESS";
+        case (NC_ECANTEXTEND):			return "NC_ECANTEXTEND";
+        case (NC_EMPI):				return "NC_EMPI";
+        // case (NC_EURL):				return "NC_EURL";
+        // case (NC_ECONSTRAINT):			return "NC_ECONSTRAINT";
+#ifdef USE_PNETCDF
+        case (NC_ESMALL):			return "NC_ESMALL";
+        case (NC_ENOTINDEP):			return "NC_ENOTINDEP";
+        case (NC_EINDEP):			return "NC_EINDEP";
+        case (NC_EFILE):			return "NC_EFILE";
+        case (NC_EREAD):			return "NC_EREAD";
+        case (NC_EWRITE):			return "NC_EWRITE";
+        case (NC_EOFILE):			return "NC_EOFILE";
+        case (NC_EMULTITYPES):			return "NC_EMULTITYPES";
+        case (NC_EIOMISMATCH):			return "NC_EIOMISMATCH";
+        case (NC_ENEGATIVECNT):			return "NC_ENEGATIVECNT";
+        case (NC_EUNSPTETYPE):			return "NC_EUNSPTETYPE";
+        case (NC_EINVAL_REQUEST):		return "NC_EINVAL_REQUEST";
+        case (NC_EAINT_TOO_SMALL):		return "NC_EAINT_TOO_SMALL";
+        case (NC_ENOENT):			return "NC_ENOENT";
+#ifdef NC_EMULTIDEFINE
+        case (NC_EMULTIDEFINE):			return "NC_EMULTIDEFINE";
+#endif
+#if PNETCDF_VERSION_MAJOR>=1 && PNETCDF_VERSION_MINOR>=3
+        case (NC_ENOTSUPPORT):			return "NC_ENOTSUPPORT";
+        case (NC_ENULLBUF):			return "NC_ENULLBUF";
+        case (NC_EPREVATTACHBUF):		return "NC_EPREVATTACHBUF";
+        case (NC_ENULLABUF):			return "NC_ENULLABUF";
+        case (NC_EPENDINGBPUT):			return "NC_EPENDINGBPUT";
+        case (NC_EINSUFFBUF):			return "NC_EINSUFFBUF";
+#endif
+#if PNETCDF_VERSION_MAJOR>=1 && PNETCDF_VERSION_MINOR>=4
+        case (NC_EINTOVERFLOW):			return "NC_EINTOVERFLOW";
+        case (NC_EMULTIDEFINE_OMODE):		return "NC_EMULTIDEFINE_OMODE";
+        case (NC_EMULTIDEFINE_DIM_NUM):		return "NC_EMULTIDEFINE_DIM_NUM";
+        case (NC_EMULTIDEFINE_DIM_SIZE):	return "NC_EMULTIDEFINE_DIM_SIZE";
+        case (NC_EMULTIDEFINE_DIM_NAME):	return "NC_EMULTIDEFINE_DIM_NAME";
+        case (NC_EMULTIDEFINE_VAR_NUM):		return "NC_EMULTIDEFINE_VAR_NUM";
+        case (NC_EMULTIDEFINE_VAR_NAME):	return "NC_EMULTIDEFINE_VAR_NAME";
+        case (NC_EMULTIDEFINE_VAR_NDIMS):	return "NC_EMULTIDEFINE_VAR_NDIMS";
+        case (NC_EMULTIDEFINE_VAR_DIMIDS):	return "NC_EMULTIDEFINE_VAR_DIMIDS";
+        case (NC_EMULTIDEFINE_VAR_TYPE):	return "NC_EMULTIDEFINE_VAR_TYPE";
+        case (NC_EMULTIDEFINE_VAR_LEN):		return "NC_EMULTIDEFINE_VAR_LEN";
+        case (NC_EMULTIDEFINE_NUMRECS):		return "NC_EMULTIDEFINE_NUMRECS";
+        case (NC_EMULTIDEFINE_VAR_BEGIN):	return "NC_EMULTIDEFINE_VAR_BEGIN";
+        case (NC_EMULTIDEFINE_ATTR_NUM):	return "NC_EMULTIDEFINE_ATTR_NUM";
+        case (NC_EMULTIDEFINE_ATTR_SIZE):	return "NC_EMULTIDEFINE_ATTR_SIZE";
+        case (NC_EMULTIDEFINE_ATTR_NAME):	return "NC_EMULTIDEFINE_ATTR_NAME";
+        case (NC_EMULTIDEFINE_ATTR_TYPE):	return "NC_EMULTIDEFINE_ATTR_TYPE";
+        case (NC_EMULTIDEFINE_ATTR_LEN):	return "NC_EMULTIDEFINE_ATTR_LEN";
+        case (NC_EMULTIDEFINE_ATTR_VAL):	return "NC_EMULTIDEFINE_ATTR_VAL";
+#endif
+#if PNETCDF_VERSION_MAJOR>=1 && PNETCDF_VERSION_MINOR>=5
+        case (NC_ENOTENABLED):			return "NC_ENOTENABLED";
+        case (NC_EBAD_FILE):			return "NC_EBAD_FILE";
+        case (NC_ENO_SPACE):			return "NC_ENO_SPACE";
+        case (NC_EQUOTA):			return "NC_EQUOTA";
+        case (NC_EMULTIDEFINE_FNC_ARGS):	return "NC_EMULTIDEFINE_FNC_ARGS";
+#endif
+#if PNETCDF_VERSION_MAJOR>=1 && PNETCDF_VERSION_MINOR>=6
+        case (NC_EINVAL_CMODE):			return "NC_EINVAL_CMODE";
+        case (NC_ENULLSTART):			return "NC_ENULLSTART";
+        case (NC_ENULLCOUNT):			return "NC_ENULLCOUNT";
+        case (NC_ETYPESIZE_MISMATCH):		return "NC_ETYPESIZE_MISMATCH";
+        case (NC_ETYPESIZE):			return "NC_ETYPESIZE";
+        case (NC_ETYPE_MISMATCH):		return "NC_ETYPE_MISMATCH";
+        case (NC_ESTRICTCDF2):			return "NC_ESTRICTCDF2";
+#endif
+#if PNETCDF_VERSION_MAJOR>=1 && PNETCDF_VERSION_MINOR>=7
+        case (NC_ENOTRECVAR):			return "NC_ENOTRECVAR";
+        case (NC_ENOTFILL):			return "NC_ENOTFILL";
+        case (NC_EMULTIDEFINE_FILL_MODE):	return "NC_EMULTIDEFINE_FILL_MODE";
+        case (NC_EMULTIDEFINE_VAR_FILL_MODE):	return "NC_EMULTIDEFINE_VAR_FILL_MODE";
+        case (NC_EMULTIDEFINE_VAR_FILL_VALUE):	return "NC_EMULTIDEFINE_VAR_FILL_VALUE";
+#endif
+#if PNETCDF_VERSION_MAJOR>=1 && PNETCDF_VERSION_MINOR>=8
+        case (NC_EPENDING):			return "NC_EPENDING";
+        case (NC_EINVAL_OMODE):			return "NC_EINVAL_OMODE";
+        case (NC_EMULTIDEFINE_CMODE):		return "NC_EMULTIDEFINE_CMODE";
+#endif
+#endif
+        default:
+              sprintf(unknown_str,"Unknown code %d",err);
+    }
+    return unknown_str;
+}
+
+
+int
+test_nc_against_pnetcdf(void)
+{
+#ifdef USE_PNETCDF
+    int  ncid; /* netCDF id */
+    int  err;  /* status */
+
+    /* Using netCDF library to create file */
+    err = nc_create(scratch, NC_CLOBBER, &ncid);
+    IF (err != NC_NOERR) error("nc_create: %s", nc_strerror(err));
+    def_dims(ncid);
+    def_vars(ncid);
+    put_atts(ncid);
+    err = nc_enddef(ncid);
+    IF (err != NC_NOERR) error("nc_enddef: %s", nc_strerror(err));
+    put_vars(ncid);
+    err = nc_close (ncid);
+    IF (err != NC_NOERR) error("nc_close: %s", nc_strerror(err));
+
+    /* Using PnetCDF library to check file */
+    err = nc_open_par(scratch, NC_NOWRITE|NC_PNETCDF, MPI_COMM_WORLD, MPI_INFO_NULL, &ncid);
+    IF (err != NC_NOERR) error("nc_open_par: %s", nc_strerror(err));
+    check_dims(ncid);
+    check_vars(ncid);
+    check_atts(ncid);
+    err = nc_close (ncid);
+    IF (err != NC_NOERR) error("nc_close: %s", nc_strerror(err));
+
+    /* Using PnetCDF library to create file */
+    err = nc_create_par(scratch, NC_PNETCDF, MPI_COMM_WORLD, MPI_INFO_NULL, &ncid);
+    IF (err != NC_NOERR) error("nc_create_par: %s", nc_strerror(err));
+    def_dims(ncid);
+    def_vars(ncid);
+    put_atts(ncid);
+    err = nc_enddef(ncid);
+    IF (err != NC_NOERR) error("nc_enddef: %s", nc_strerror(err));
+    put_vars(ncid);
+    err = nc_close (ncid);
+    IF (err != NC_NOERR) error("nc_close: %s", nc_strerror(err));
+
+    /* Using NetCDF library to check file */
+    err = nc_open(scratch, NC_NOWRITE, &ncid);
+    IF (err != NC_NOERR) error("nc_open: %s", nc_strerror(err));
+    check_dims(ncid);
+    check_vars(ncid);
+    check_atts(ncid);
+    err = nc_close (ncid);
+    IF (err != NC_NOERR) error("nc_close: %s", nc_strerror(err));
+    err = nc_delete(scratch);
+    IF (err != NC_NOERR) error("remove of %s failed", scratch);
+#endif
+    return 1;
+}
diff --git a/nc_test4/CMakeLists.txt b/nc_test4/CMakeLists.txt
index 12199ca..c64a632 100644
--- a/nc_test4/CMakeLists.txt
+++ b/nc_test4/CMakeLists.txt
@@ -28,8 +28,6 @@ ENDIF(BUILD_UTILITIES)
 BUILD_BIN_TEST(tst_empty_vlen_unlim)
 ADD_SH_TEST(nc_test4 run_empty_vlen_test)
 
-
-
 IF(NOT MSVC)
   SET(NC4_TESTS ${NC4_TESTS} tst_interops5 tst_camrun)
 ENDIF()
@@ -63,7 +61,7 @@ IF(BUILD_BENCHMARKS)
 ENDIF()
 
 # Copy some test files from current source dir to out-of-tree build dir.
-FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.nc ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
+FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.nc ${CMAKE_CURRENT_SOURCE_DIR}/*.sh ${CMAKE_CURRENT_SOURCE_DIR}/*.hdf4)
 FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
 IF(MSVC)
   FILE(COPY ${COPY_FILES} DESTINATION ${RUNTIME_OUTPUT_DIRECTORY}/)
diff --git a/nc_test4/Makefile.am b/nc_test4/Makefile.am
index 0a31560..b6250c3 100644
--- a/nc_test4/Makefile.am
+++ b/nc_test4/Makefile.am
@@ -20,10 +20,16 @@ tst_enums tst_coords tst_coords2 tst_coords3 tst_vars3 tst_vars4	\
 tst_chunks tst_chunks2 tst_utf8 tst_fills tst_fills2 tst_fillbug	\
 tst_xplatform tst_xplatform2 tst_h_atts2 tst_endian_fill tst_atts	\
 t_type cdm_sea_soundings tst_camrun tst_vl tst_atts1 tst_atts2		\
-tst_vars2 tst_files5 tst_files6 tst_sync tst_h_strbug tst_h_refs        \
-tst_h_scalar tst_rename tst_h5_endians tst_atts_string_rewrite \
+tst_vars2 tst_files5 tst_files6 tst_sync         			\
+tst_h_scalar tst_rename tst_h5_endians tst_atts_string_rewrite 		\
 tst_hdf5_file_compat tst_fill_attr_vanish tst_rehash
 
+# Temporary I hope
+if !ISCYGWIN
+NC4_TESTS += tst_h_strbug tst_h_refs
+endif
+
+
 check_PROGRAMS = $(NC4_TESTS) renamegroup tst_empty_vlen_unlim
 
 # Add these if large file tests are turned on.
@@ -125,12 +131,11 @@ run_get_hdf4_files.sh run_valgrind_tests.sh run_valgrind_tests2.sh	\
 run_bm_ar4.sh ref_tst_compounds.nc run_hdf4_valgrind_tests.sh		\
 ref_tst_xplatform2_1.nc ref_tst_xplatform2_2.nc ref_tst_dims.nc		\
 ref_tst_interops4.nc run_get_knmi_files.sh CMakeLists.txt               \
-run_grp_rename.sh tst_formatx_hdf4.sh                                   \
-run_chunk_hdf4.sh contiguous.hdf4 chunked.hdf4 \
+run_grp_rename.sh tst_formatx_hdf4.sh run_chunk_hdf4.sh \
 tst_h5_endians.c tst_h4_lendian.c tst_atts_string_rewrite.c \
 tst_put_vars_two_unlim_dim.c tst_empty_vlen_unlim.c run_empty_vlen_test.sh \
 ref_hdf5_compat1.nc ref_hdf5_compat2.nc ref_hdf5_compat3.nc tst_misc.sh \
-tdset.h5 tst_hdf4_read_var.sh
+tdset.h5 tst_hdf4_read_var.sh ref_contiguous.hdf4 ref_chunked.hdf4
 
 
 CLEANFILES = tst_mpi_parallel.bin cdm_sea_soundings.nc bm_chunking.nc	\
@@ -151,4 +156,6 @@ AMSR_E_L3_DailyLand_V06_20020619.hdf			\
 MYD29.A2009152.0000.005.2009153124331.hdf		\
 MYD29.A2002185.0000.005.2007160150627.hdf		\
 MOD29.A2000055.0005.005.2006267200024.hdf
+
+
 endif # HDF4_FILE_TESTS
diff --git a/nc_test4/Makefile.in b/nc_test4/Makefile.in
index 793b30b..0245568 100644
--- a/nc_test4/Makefile.in
+++ b/nc_test4/Makefile.in
@@ -107,26 +107,29 @@ target_triplet = @target@
 
 # This turns on declspec magic in netcdf.h for windows DLLs.
 @BUILD_DLL_TRUE at am__append_2 = -DDLL_NETCDF
-check_PROGRAMS = $(am__EXEEXT_1) renamegroup$(EXEEXT) \
-	tst_empty_vlen_unlim$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_3) \
-	$(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
-	$(am__EXEEXT_7) $(am__EXEEXT_8)
+
+# Temporary I hope
+ at ISCYGWIN_FALSE@am__append_3 = tst_h_strbug tst_h_refs
+check_PROGRAMS = $(am__EXEEXT_2) renamegroup$(EXEEXT) \
+	tst_empty_vlen_unlim$(EXEEXT) $(am__EXEEXT_3) $(am__EXEEXT_4) \
+	$(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \
+	$(am__EXEEXT_8) $(am__EXEEXT_9)
 
 # Add these if large file tests are turned on.
- at LARGE_FILE_TESTS_TRUE@am__append_3 = tst_large tst_large2
-TESTS = $(am__EXEEXT_1) run_empty_vlen_test.sh $(am__EXEEXT_3) \
-	$(am__EXEEXT_4) $(am__EXEEXT_9) $(am__append_10) \
-	$(am__EXEEXT_10) $(am__EXEEXT_11) $(am__append_15) \
-	$(am__append_16) $(am__append_18)
+ at LARGE_FILE_TESTS_TRUE@am__append_4 = tst_large tst_large2
+TESTS = $(am__EXEEXT_2) run_empty_vlen_test.sh $(am__EXEEXT_4) \
+	$(am__EXEEXT_5) $(am__EXEEXT_10) $(am__append_11) \
+	$(am__EXEEXT_11) $(am__EXEEXT_12) $(am__append_16) \
+	$(am__append_17) $(am__append_19)
 
 # If the v2 API was built, add its test program.
- at BUILD_V2_TRUE@am__append_4 = tst_v2
 @BUILD_V2_TRUE at am__append_5 = tst_v2
- at LARGE_FILE_TESTS_TRUE@am__append_6 = tst_large
+ at BUILD_V2_TRUE@am__append_6 = tst_v2
 @LARGE_FILE_TESTS_TRUE at am__append_7 = tst_large
+ at LARGE_FILE_TESTS_TRUE@am__append_8 = tst_large
 
 # If benchmarks were turned on, build and run a bunch more tests.
- at BUILD_BENCHMARKS_TRUE@am__append_8 = tst_create_files bm_file tst_chunks3 tst_ar4	\
+ at BUILD_BENCHMARKS_TRUE@am__append_9 = tst_create_files bm_file tst_chunks3 tst_ar4	\
 @BUILD_BENCHMARKS_TRUE at tst_ar4_3d tst_ar4_4d bm_many_objs tst_h_many_atts bm_many_atts	\
 @BUILD_BENCHMARKS_TRUE at tst_files2 tst_files3 tst_ar5 tst_h_files3 tst_mem tst_knmi     \
 @BUILD_BENCHMARKS_TRUE at bm_netcdf4_recs
@@ -134,34 +137,34 @@ TESTS = $(am__EXEEXT_1) run_empty_vlen_test.sh $(am__EXEEXT_3) \
 
 #WARNING: test_knmi depends on run_get_knmi_files.sh,
 # so they must appear in the appropriate order.
- at BUILD_BENCHMARKS_TRUE@am__append_9 = tst_ar4_3d tst_create_files run_bm_test1.sh run_bm_elena.sh	\
+ at BUILD_BENCHMARKS_TRUE@am__append_10 = tst_ar4_3d tst_create_files run_bm_test1.sh run_bm_elena.sh	\
 @BUILD_BENCHMARKS_TRUE at run_bm_test2.sh run_tst_chunks.sh tst_files2 tst_files3	\
 @BUILD_BENCHMARKS_TRUE at tst_ar5 tst_h_files3 tst_mem                                            \
 @BUILD_BENCHMARKS_TRUE at run_get_knmi_files.sh tst_knmi
 
 
 # This will run a parallel I/O benchmark for parallel builds.
- at BUILD_BENCHMARKS_TRUE@@TEST_PARALLEL4_TRUE at am__append_10 = run_par_bm_test.sh
+ at BUILD_BENCHMARKS_TRUE@@TEST_PARALLEL4_TRUE at am__append_11 = run_par_bm_test.sh
 
 # These are the tests for HDF4.
- at USE_HDF4_TRUE@am__append_11 = tst_interops2 tst_chunk_hdf4 tst_h4_lendian
- at USE_HDF4_TRUE@am__append_12 = tst_interops2  tst_formatx_hdf4.sh run_chunk_hdf4.sh tst_h4_lendian
- at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__append_13 = tst_interops3
- at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__append_14 = run_get_hdf4_files.sh tst_interops3 tst_hdf4_read_var.sh
+ at USE_HDF4_TRUE@am__append_12 = tst_interops2 tst_chunk_hdf4 tst_h4_lendian
+ at USE_HDF4_TRUE@am__append_13 = tst_interops2  tst_formatx_hdf4.sh run_chunk_hdf4.sh tst_h4_lendian
+ at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__append_14 = tst_interops3
+ at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__append_15 = run_get_hdf4_files.sh tst_interops3 tst_hdf4_read_var.sh
 #tst_interops2_LDADD = ${lib_LTLIBRARIES} -lmfhdf -ldf -ljpeg -lhdf5_hl	\
 #-lhdf5 -lz
 
 # This will run a bunch of the test programs with valgrind, the memory
 # checking tool. (Valgrind must be present for this to work.)
- at USE_VALGRIND_TESTS_TRUE@am__append_15 = run_valgrind_tests.sh run_valgrind_tests2.sh
- at USE_HDF4_TRUE@@USE_VALGRIND_TESTS_TRUE at am__append_16 = run_hdf4_valgrind_tests.sh
+ at USE_VALGRIND_TESTS_TRUE@am__append_16 = run_valgrind_tests.sh run_valgrind_tests2.sh
+ at USE_HDF4_TRUE@@USE_VALGRIND_TESTS_TRUE at am__append_17 = run_hdf4_valgrind_tests.sh
 
 # This are extra tests that will only be run if netcdf-4 is configured
 # with --enable-parallel-tests.
- at TEST_PARALLEL4_TRUE@am__append_17 = tst_mpi_parallel tst_parallel tst_parallel3	\
+ at TEST_PARALLEL4_TRUE@am__append_18 = tst_mpi_parallel tst_parallel tst_parallel3	\
 @TEST_PARALLEL4_TRUE at tst_parallel4 tst_nc4perf tst_mode tst_simplerw_coll_r
 
- at TEST_PARALLEL4_TRUE@am__append_18 = run_par_test.sh
+ at TEST_PARALLEL4_TRUE@am__append_19 = run_par_test.sh
 subdir = nc_test4
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -175,8 +178,10 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES = ref_hdf5_compat1.nc ref_hdf5_compat2.nc \
-	ref_hdf5_compat3.nc
-am__EXEEXT_1 = tst_dims$(EXEEXT) tst_dims2$(EXEEXT) tst_dims3$(EXEEXT) \
+	ref_hdf5_compat3.nc ref_chunked.hdf4 ref_contiguous.hdf4
+ at ISCYGWIN_FALSE@am__EXEEXT_1 = tst_h_strbug$(EXEEXT) \
+ at ISCYGWIN_FALSE@	tst_h_refs$(EXEEXT)
+am__EXEEXT_2 = tst_dims$(EXEEXT) tst_dims2$(EXEEXT) tst_dims3$(EXEEXT) \
 	tst_files$(EXEEXT) tst_files4$(EXEEXT) tst_vars$(EXEEXT) \
 	tst_varms$(EXEEXT) tst_unlim_vars$(EXEEXT) \
 	tst_converts$(EXEEXT) tst_converts2$(EXEEXT) tst_grps$(EXEEXT) \
@@ -195,16 +200,15 @@ am__EXEEXT_1 = tst_dims$(EXEEXT) tst_dims2$(EXEEXT) tst_dims3$(EXEEXT) \
 	cdm_sea_soundings$(EXEEXT) tst_camrun$(EXEEXT) tst_vl$(EXEEXT) \
 	tst_atts1$(EXEEXT) tst_atts2$(EXEEXT) tst_vars2$(EXEEXT) \
 	tst_files5$(EXEEXT) tst_files6$(EXEEXT) tst_sync$(EXEEXT) \
-	tst_h_strbug$(EXEEXT) tst_h_refs$(EXEEXT) \
 	tst_h_scalar$(EXEEXT) tst_rename$(EXEEXT) \
 	tst_h5_endians$(EXEEXT) tst_atts_string_rewrite$(EXEEXT) \
 	tst_hdf5_file_compat$(EXEEXT) tst_fill_attr_vanish$(EXEEXT) \
-	tst_rehash$(EXEEXT)
- at LARGE_FILE_TESTS_TRUE@am__EXEEXT_2 = tst_large$(EXEEXT) \
+	tst_rehash$(EXEEXT) $(am__EXEEXT_1)
+ at LARGE_FILE_TESTS_TRUE@am__EXEEXT_3 = tst_large$(EXEEXT) \
 @LARGE_FILE_TESTS_TRUE@	tst_large2$(EXEEXT)
- at BUILD_V2_TRUE@am__EXEEXT_3 = tst_v2$(EXEEXT)
- at LARGE_FILE_TESTS_TRUE@am__EXEEXT_4 = tst_large$(EXEEXT)
- at BUILD_BENCHMARKS_TRUE@am__EXEEXT_5 = tst_create_files$(EXEEXT) \
+ at BUILD_V2_TRUE@am__EXEEXT_4 = tst_v2$(EXEEXT)
+ at LARGE_FILE_TESTS_TRUE@am__EXEEXT_5 = tst_large$(EXEEXT)
+ at BUILD_BENCHMARKS_TRUE@am__EXEEXT_6 = tst_create_files$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	bm_file$(EXEEXT) tst_chunks3$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	tst_ar4$(EXEEXT) tst_ar4_3d$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	tst_ar4_4d$(EXEEXT) \
@@ -215,10 +219,10 @@ am__EXEEXT_1 = tst_dims$(EXEEXT) tst_dims2$(EXEEXT) tst_dims3$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	tst_ar5$(EXEEXT) tst_h_files3$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	tst_mem$(EXEEXT) tst_knmi$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	bm_netcdf4_recs$(EXEEXT)
- at USE_HDF4_TRUE@am__EXEEXT_6 = tst_interops2$(EXEEXT) \
+ at USE_HDF4_TRUE@am__EXEEXT_7 = tst_interops2$(EXEEXT) \
 @USE_HDF4_TRUE@	tst_chunk_hdf4$(EXEEXT) tst_h4_lendian$(EXEEXT)
- at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__EXEEXT_7 = tst_interops3$(EXEEXT)
- at TEST_PARALLEL4_TRUE@am__EXEEXT_8 = tst_mpi_parallel$(EXEEXT) \
+ at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__EXEEXT_8 = tst_interops3$(EXEEXT)
+ at TEST_PARALLEL4_TRUE@am__EXEEXT_9 = tst_mpi_parallel$(EXEEXT) \
 @TEST_PARALLEL4_TRUE@	tst_parallel$(EXEEXT) \
 @TEST_PARALLEL4_TRUE@	tst_parallel3$(EXEEXT) \
 @TEST_PARALLEL4_TRUE@	tst_parallel4$(EXEEXT) \
@@ -818,7 +822,7 @@ am__set_TESTS_bases = \
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
 AM_RECURSIVE_TARGETS = check recheck
- at BUILD_BENCHMARKS_TRUE@am__EXEEXT_9 = tst_ar4_3d$(EXEEXT) \
+ at BUILD_BENCHMARKS_TRUE@am__EXEEXT_10 = tst_ar4_3d$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	tst_create_files$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	run_bm_test1.sh run_bm_elena.sh \
 @BUILD_BENCHMARKS_TRUE@	run_bm_test2.sh run_tst_chunks.sh \
@@ -826,10 +830,10 @@ AM_RECURSIVE_TARGETS = check recheck
 @BUILD_BENCHMARKS_TRUE@	tst_ar5$(EXEEXT) tst_h_files3$(EXEEXT) \
 @BUILD_BENCHMARKS_TRUE@	tst_mem$(EXEEXT) run_get_knmi_files.sh \
 @BUILD_BENCHMARKS_TRUE@	tst_knmi$(EXEEXT)
- at USE_HDF4_TRUE@am__EXEEXT_10 = tst_interops2$(EXEEXT) \
+ at USE_HDF4_TRUE@am__EXEEXT_11 = tst_interops2$(EXEEXT) \
 @USE_HDF4_TRUE@	tst_formatx_hdf4.sh run_chunk_hdf4.sh \
 @USE_HDF4_TRUE@	tst_h4_lendian$(EXEEXT)
- at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__EXEEXT_11 = run_get_hdf4_files.sh \
+ at USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE at am__EXEEXT_12 = run_get_hdf4_files.sh \
 @USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE@	tst_interops3$(EXEEXT) \
 @USE_HDF4_FILE_TESTS_TRUE@@USE_HDF4_TRUE@	tst_hdf4_read_var.sh
 TEST_SUITE_LOG = test-suite.log
@@ -852,7 +856,8 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
 	$(TEST_LOG_FLAGS)
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/ref_hdf5_compat1.nc \
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/ref_chunked.hdf4 \
+	$(srcdir)/ref_contiguous.hdf4 $(srcdir)/ref_hdf5_compat1.nc \
 	$(srcdir)/ref_hdf5_compat2.nc $(srcdir)/ref_hdf5_compat3.nc \
 	$(top_srcdir)/depcomp $(top_srcdir)/lib_flags.am \
 	$(top_srcdir)/test-driver
@@ -902,6 +907,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -929,12 +935,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -969,6 +977,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -1033,20 +1042,22 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # These are netCDF-4 test programs.
-NC4_TESTS = tst_dims tst_dims2 tst_dims3 tst_files tst_files4 tst_vars	\
-tst_varms tst_unlim_vars tst_converts tst_converts2 tst_grps tst_grps2	\
-tst_compounds tst_compounds2 tst_compounds3 tst_opaques tst_strings	\
-tst_strings2 tst_interops tst_interops4 tst_interops5 tst_interops6	\
-tst_enums tst_coords tst_coords2 tst_coords3 tst_vars3 tst_vars4	\
-tst_chunks tst_chunks2 tst_utf8 tst_fills tst_fills2 tst_fillbug	\
-tst_xplatform tst_xplatform2 tst_h_atts2 tst_endian_fill tst_atts	\
-t_type cdm_sea_soundings tst_camrun tst_vl tst_atts1 tst_atts2		\
-tst_vars2 tst_files5 tst_files6 tst_sync tst_h_strbug tst_h_refs        \
-tst_h_scalar tst_rename tst_h5_endians tst_atts_string_rewrite \
-tst_hdf5_file_compat tst_fill_attr_vanish tst_rehash
-
+NC4_TESTS = tst_dims tst_dims2 tst_dims3 tst_files tst_files4 tst_vars \
+	tst_varms tst_unlim_vars tst_converts tst_converts2 tst_grps \
+	tst_grps2 tst_compounds tst_compounds2 tst_compounds3 \
+	tst_opaques tst_strings tst_strings2 tst_interops \
+	tst_interops4 tst_interops5 tst_interops6 tst_enums tst_coords \
+	tst_coords2 tst_coords3 tst_vars3 tst_vars4 tst_chunks \
+	tst_chunks2 tst_utf8 tst_fills tst_fills2 tst_fillbug \
+	tst_xplatform tst_xplatform2 tst_h_atts2 tst_endian_fill \
+	tst_atts t_type cdm_sea_soundings tst_camrun tst_vl tst_atts1 \
+	tst_atts2 tst_vars2 tst_files5 tst_files6 tst_sync \
+	tst_h_scalar tst_rename tst_h5_endians tst_atts_string_rewrite \
+	tst_hdf5_file_compat tst_fill_attr_vanish tst_rehash \
+	$(am__append_3)
 @BUILD_BENCHMARKS_TRUE at bm_netcdf4_recs_SOURCES = bm_netcdf4_recs.c tst_utils.c
 @BUILD_BENCHMARKS_TRUE at bm_many_atts_SOURCES = bm_many_atts.c tst_utils.c
 @BUILD_BENCHMARKS_TRUE at bm_many_objs_SOURCES = bm_many_objs.c tst_utils.c
@@ -1065,12 +1076,11 @@ run_get_hdf4_files.sh run_valgrind_tests.sh run_valgrind_tests2.sh	\
 run_bm_ar4.sh ref_tst_compounds.nc run_hdf4_valgrind_tests.sh		\
 ref_tst_xplatform2_1.nc ref_tst_xplatform2_2.nc ref_tst_dims.nc		\
 ref_tst_interops4.nc run_get_knmi_files.sh CMakeLists.txt               \
-run_grp_rename.sh tst_formatx_hdf4.sh                                   \
-run_chunk_hdf4.sh contiguous.hdf4 chunked.hdf4 \
+run_grp_rename.sh tst_formatx_hdf4.sh run_chunk_hdf4.sh \
 tst_h5_endians.c tst_h4_lendian.c tst_atts_string_rewrite.c \
 tst_put_vars_two_unlim_dim.c tst_empty_vlen_unlim.c run_empty_vlen_test.sh \
 ref_hdf5_compat1.nc ref_hdf5_compat2.nc ref_hdf5_compat3.nc tst_misc.sh \
-tdset.h5 tst_hdf4_read_var.sh
+tdset.h5 tst_hdf4_read_var.sh ref_contiguous.hdf4 ref_chunked.hdf4
 
 CLEANFILES = tst_mpi_parallel.bin cdm_sea_soundings.nc bm_chunking.nc	\
 bm_radar.nc bm_radar1.nc radar_3d_compression_test.txt			\
@@ -2158,20 +2168,6 @@ tst_sync.log: tst_sync$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
-tst_h_strbug.log: tst_h_strbug$(EXEEXT)
-	@p='tst_h_strbug$(EXEEXT)'; \
-	b='tst_h_strbug'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-tst_h_refs.log: tst_h_refs$(EXEEXT)
-	@p='tst_h_refs$(EXEEXT)'; \
-	b='tst_h_refs'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
 tst_h_scalar.log: tst_h_scalar$(EXEEXT)
 	@p='tst_h_scalar$(EXEEXT)'; \
 	b='tst_h_scalar'; \
@@ -2221,6 +2217,20 @@ tst_rehash.log: tst_rehash$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_h_strbug.log: tst_h_strbug$(EXEEXT)
+	@p='tst_h_strbug$(EXEEXT)'; \
+	b='tst_h_strbug'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_h_refs.log: tst_h_refs$(EXEEXT)
+	@p='tst_h_refs$(EXEEXT)'; \
+	b='tst_h_refs'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 run_empty_vlen_test.sh.log: run_empty_vlen_test.sh
 	@p='run_empty_vlen_test.sh'; \
 	b='run_empty_vlen_test.sh'; \
diff --git a/nc_test4/clear_cache.sh b/nc_test4/clear_cache.sh
old mode 100644
new mode 100755
diff --git a/nc_test4/chunked.hdf4 b/nc_test4/ref_chunked.hdf4
old mode 100755
new mode 100644
similarity index 100%
rename from nc_test4/chunked.hdf4
rename to nc_test4/ref_chunked.hdf4
diff --git a/nc_test4/contiguous.hdf4 b/nc_test4/ref_contiguous.hdf4
similarity index 100%
rename from nc_test4/contiguous.hdf4
rename to nc_test4/ref_contiguous.hdf4
diff --git a/nc_test4/run_bm.sh b/nc_test4/run_bm.sh
index f76575b..2b8d090 100755
--- a/nc_test4/run_bm.sh
+++ b/nc_test4/run_bm.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs a bunch of benchmarks on some specific files
 # available at Unidata.
 
@@ -27,7 +30,7 @@ for ((s=0; s < 2 ; s++))
 do
     for ((d=0; d <= 9 ; d=d+2))
     do
-	cmd="./bm_file $h -f 3 -o $TMP/$d1-2d.nc4 -c 0:${d}:${s}:${c0}:${c1}"
+	cmd="${execdir}/bm_file $h -f 3 -o $TMP/$d1-2d.nc4 -c 0:${d}:${s}:${c0}:${c1}"
 	for ((v=1; v < 12; v++))
 	do
 	    cmd="$cmd,${v}:${d}:${s}:${c0}:${c1}"
@@ -59,7 +62,7 @@ for ((s=0; s < 2 ; s++))
 do
     for ((d=0; d <= 9 ; d++))
     do
-	cmd="./bm_file $h -f 3 -o $TMP/$d1.nc4 -c 0:${d}:${s}:${c0}:${c1}:${c2} $TMP/$d1.nc3"
+	cmd="${execdir}/bm_file $h -f 3 -o $TMP/$d1.nc4 -c 0:${d}:${s}:${c0}:${c1}:${c2} $TMP/$d1.nc3"
 	echo "cmd=$cmd"
 	if ! ($cmd >> $out1); then
 	    exit 1;
@@ -79,7 +82,7 @@ do
     do
 	for c3 in 10 100 200 500
 	do
-	    cmd="./bm_file $h -f 3 -o $TMP/$d1.nc4 -c 0:${d}:${s}:${c0}:${c1}:${c2} $TMP/$d1.nc3"
+	    cmd="${execdir}/bm_file $h -f 3 -o $TMP/$d1.nc4 -c 0:${d}:${s}:${c0}:${c1}:${c2} $TMP/$d1.nc3"
 	    echo "cmd=$cmd"
 	    if ! ($cmd >> $out1); then
 		exit 1;
diff --git a/nc_test4/run_bm_ar4.sh b/nc_test4/run_bm_ar4.sh
index 116f91f..4e4ebc8 100755
--- a/nc_test4/run_bm_ar4.sh
+++ b/nc_test4/run_bm_ar4.sh
@@ -55,7 +55,7 @@ do
 		if test -f $file_out; then
 		    echo "found existing $file_out"
 		else
-		    cmd="./bm_file $h -f 3 -c 6:${d}:${s}:${c0}:${c1}:${c2} -o ${file_out} ${pr_ar4_sample}"
+		    cmd="${execdir}/bm_file $h -f 3 -c 6:${d}:${s}:${c0}:${c1}:${c2} -o ${file_out} ${pr_ar4_sample}"
 		    echo "cmd=$cmd"
 # 	            bash ./clear_cache.sh
  		    if ! ($cmd >> $out); then
@@ -74,20 +74,20 @@ echo $out_files
 
 # Do the horizonatal runs.
 #bash ./clear_cache.sh
-./tst_ar4 -h $pr_ar4_sample
+${execdir}/tst_ar4 -h $pr_ar4_sample
 for f1 in $out_files
 do
 #    bash ./clear_cache.sh
-    ./tst_ar4 ${f1}
+    ${execdir}/tst_ar4 ${f1}
 done
 
 # Do the timeseries runs.
 #bash ./clear_cache.sh
-./tst_ar4 -t -h $pr_ar4_sample
+${execdir}/tst_ar4 -t -h $pr_ar4_sample
 for f1 in $out_files
 do
 #    bash ./clear_cache.sh
-    ./tst_ar4 -t ${f1}
+    ${execdir}/tst_ar4 -t ${f1}
 done
 
 echo "SUCCESS!!!"
diff --git a/nc_test4/run_bm_elena.sh b/nc_test4/run_bm_elena.sh
index 819141e..cf8c175 100755
--- a/nc_test4/run_bm_elena.sh
+++ b/nc_test4/run_bm_elena.sh
@@ -9,12 +9,12 @@ set -e
 echo ""
 
 echo "*** Testing the benchmarking program bm_file for simple float file, no compression..."
-./bm_file -h -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:1024:16:256 tst_elena_int_3D.nc
-./bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:1024:256:256 tst_elena_int_3D.nc
-./bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:512:64:256 tst_elena_int_3D.nc
-./bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:512:256:256 tst_elena_int_3D.nc
-./bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:256:64:256 tst_elena_int_3D.nc
-./bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:256:256:256 tst_elena_int_3D.nc
+${execdir}/bm_file -h -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:1024:16:256 tst_elena_int_3D.nc
+${execdir}/bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:1024:256:256 tst_elena_int_3D.nc
+${execdir}/bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:512:64:256 tst_elena_int_3D.nc
+${execdir}/bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:512:256:256 tst_elena_int_3D.nc
+${execdir}/bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:256:64:256 tst_elena_int_3D.nc
+${execdir}/bm_file -d -f 3 -o  tst_elena_out.nc -c 0:-1:0:256:256:256 tst_elena_int_3D.nc
 echo '*** SUCCESS!!!'
 
-exit 0
\ No newline at end of file
+exit 0
diff --git a/nc_test4/run_bm_radar_2D.sh b/nc_test4/run_bm_radar_2D.sh
index 3b163a1..a05d812 100755
--- a/nc_test4/run_bm_radar_2D.sh
+++ b/nc_test4/run_bm_radar_2D.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs a bunch of benchmarks on some specific files
 # available at Unidata. If you want to run this shell, you need these
 # data files.
diff --git a/nc_test4/run_bm_radar_2D_endianness1.sh b/nc_test4/run_bm_radar_2D_endianness1.sh
index 5543768..edbc37a 100755
--- a/nc_test4/run_bm_radar_2D_endianness1.sh
+++ b/nc_test4/run_bm_radar_2D_endianness1.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs a bunch of benchmarks on some specific files
 # available at Unidata. If you want to run this shell, you need these
 # data files.
diff --git a/nc_test4/run_bm_test1.sh b/nc_test4/run_bm_test1.sh
index 61fee6d..0a6ed37 100755
--- a/nc_test4/run_bm_test1.sh
+++ b/nc_test4/run_bm_test1.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell just tests the bm_file program by running it a few times
 # on a simple test file. Then it uses ncdum to check that the output
 # is what it should be.
@@ -21,9 +24,9 @@ do
 	test $i = 4 && chunksizes="17:17:17:17" && s="-s 1"
 	test $i = 5 && chunksizes="10:10:10:10:10" && s="-s 1"
 	test $i = 6 && chunksizes="6:6:6:6:6:6" && s="-s 1"
-	./bm_file -d ${header} ${s} -f 4 -o ${type_name}2_${i}D_3.nc -c 0:0:0:${chunksizes} tst_${type_name}2_${i}D.nc 
-	../ncdump/ncdump tst_${type_name}2_${i}D.nc > tst_${type_name}2_${i}D.cdl
-	../ncdump/ncdump -n tst_${type_name}2_${i}D ${type_name}2_${i}D_3.nc > ${type_name}2_${i}D.cdl
+	${execdir}/bm_file -d ${header} ${s} -f 4 -o ${type_name}2_${i}D_3.nc -c 0:0:0:${chunksizes} tst_${type_name}2_${i}D.nc 
+	${NCDUMP} tst_${type_name}2_${i}D.nc > tst_${type_name}2_${i}D.cdl
+	${NCDUMP} -n tst_${type_name}2_${i}D ${type_name}2_${i}D_3.nc > ${type_name}2_${i}D.cdl
 	diff tst_${type_name}2_${i}D.cdl ${type_name}2_${i}D.cdl
 	header=
     done
@@ -32,50 +35,50 @@ done
 
 echo ""
 echo "*** Testing the benchmarking program bm_file for simple float file, no compression..."
-./bm_file -d -h -f 3 -o floats_1D_3.nc -c 0:-1:0:10000 tst_floats_1D.nc
-../ncdump/ncdump tst_floats_1D.nc > tst_floats_1D.cdl
-../ncdump/ncdump -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
+${execdir}/bm_file -d -h -f 3 -o floats_1D_3.nc -c 0:-1:0:10000 tst_floats_1D.nc
+${NCDUMP} tst_floats_1D.nc > tst_floats_1D.cdl
+${NCDUMP} -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
 diff tst_floats_1D.cdl floats_1D.cdl
 echo '*** SUCCESS!!!'
 
 echo ""
 echo "*** Testing the benchmarking program bm_file for simple float file, with compression..."
-./bm_file -d -h -f 3 -o floats_1D_3.nc -c 0:1:0:10000 tst_floats_1D.nc
-../ncdump/ncdump tst_floats_1D.nc > tst_floats_1D.cdl
-../ncdump/ncdump -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
+${execdir}/bm_file -d -h -f 3 -o floats_1D_3.nc -c 0:1:0:10000 tst_floats_1D.nc
+${NCDUMP} tst_floats_1D.nc > tst_floats_1D.cdl
+${NCDUMP} -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
 diff tst_floats_1D.cdl floats_1D.cdl
 echo '*** SUCCESS!!!'
 
 echo ""
 echo "*** Testing the benchmarking program bm_file for simple float file, with more compression..."
-./bm_file -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
-../ncdump/ncdump tst_floats_1D.nc > tst_floats_1D.cdl
-../ncdump/ncdump -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
+${execdir}/bm_file -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
+${NCDUMP} tst_floats_1D.nc > tst_floats_1D.cdl
+${NCDUMP} -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
 diff tst_floats_1D.cdl floats_1D.cdl
 echo '*** SUCCESS!!!'
 
 echo ""
 echo "*** Testing the benchmarking program bm_file for simple float file, with endianness set to native..."
-./bm_file -e 0 -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
-../ncdump/ncdump tst_floats_1D.nc > tst_floats_1D.cdl
-../ncdump/ncdump -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
+${execdir}/bm_file -e 0 -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
+${NCDUMP} tst_floats_1D.nc > tst_floats_1D.cdl
+${NCDUMP} -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
 diff tst_floats_1D.cdl floats_1D.cdl
 echo '*** SUCCESS!!!'
 
 echo ""
 echo "*** Testing the benchmarking program bm_file for simple float file, with endianness set to little..."
-./bm_file -e 1 -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
-../ncdump/ncdump tst_floats_1D.nc > tst_floats_1D.cdl
-../ncdump/ncdump -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
+${execdir}/bm_file -e 1 -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
+${NCDUMP} tst_floats_1D.nc > tst_floats_1D.cdl
+${NCDUMP} -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
 diff tst_floats_1D.cdl floats_1D.cdl
 echo '*** SUCCESS!!!'
 
 echo ""
 echo "*** Testing the benchmarking program bm_file for simple float file, with endianness set to big..."
-./bm_file -e 2 -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
-../ncdump/ncdump tst_floats_1D.nc > tst_floats_1D.cdl
-../ncdump/ncdump -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
+${execdir}/bm_file -e 2 -d -h -f 3 -o floats_1D_3.nc -c 0:9:1:10000 tst_floats_1D.nc
+${NCDUMP} tst_floats_1D.nc > tst_floats_1D.cdl
+${NCDUMP} -n tst_floats_1D floats_1D_3.nc > floats_1D.cdl
 diff tst_floats_1D.cdl floats_1D.cdl
 echo '*** SUCCESS!!!'
 
-exit 0
\ No newline at end of file
+exit 0
diff --git a/nc_test4/run_bm_test2.sh b/nc_test4/run_bm_test2.sh
index 4bf5317..ed747b1 100755
--- a/nc_test4/run_bm_test2.sh
+++ b/nc_test4/run_bm_test2.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell tests non-sequential reads for bm_file.c
 
 # $Id: run_bm_test2.sh,v 1.3 2007/12/27 03:43:13 ed Exp $
@@ -8,31 +11,31 @@ set -e
 echo ""
 
 echo "*** Testing the benchmarking program bm_file using start/count/inc..."
-./bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:0 -u 0:1 -r 0:1 tst_simple.nc
-../ncdump/ncdump tst_simple.nc > tst_simple.cdl
-../ncdump/ncdump -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
+${execdir}/bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:0 -u 0:1 -r 0:1 tst_simple.nc
+${NCDUMP} tst_simple.nc > tst_simple.cdl
+${NCDUMP} -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
 diff tst_simple.cdl tst_simple_3.cdl
 echo '*** SUCCESS!!!'
 
 echo "*** Testing the benchmarking program bm_file using start/count/inc with negative increment..."
-./bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:9 -u 0:1 -r 0:-1 tst_simple.nc
-../ncdump/ncdump tst_simple.nc > tst_simple.cdl
-../ncdump/ncdump -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
+${execdir}/bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:9 -u 0:1 -r 0:-1 tst_simple.nc
+${NCDUMP} tst_simple.nc > tst_simple.cdl
+${NCDUMP} -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
 diff tst_simple.cdl tst_simple_3.cdl
 echo '*** SUCCESS!!!'
 
 echo "*** Testing the benchmarking program bm_file using start/count/inc with count > 1..."
-./bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:0 -u 0:2 -r 0:2 tst_simple.nc
-../ncdump/ncdump tst_simple.nc > tst_simple.cdl
-../ncdump/ncdump -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
+${execdir}/bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:0 -u 0:2 -r 0:2 tst_simple.nc
+${NCDUMP} tst_simple.nc > tst_simple.cdl
+${NCDUMP} -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
 diff tst_simple.cdl tst_simple_3.cdl
 echo '*** SUCCESS!!!'
 
 echo "*** Testing the benchmarking program bm_file using start/count/inc with uneven count..."
-./bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:0 -u 0:4 -r 0:4 tst_simple.nc
-../ncdump/ncdump tst_simple.nc > tst_simple.cdl
-../ncdump/ncdump -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
+${execdir}/bm_file -h -f 3 -o tst_simple_3.nc -c 0:-1:0:10  -t 0:0 -u 0:4 -r 0:4 tst_simple.nc
+${NCDUMP} tst_simple.nc > tst_simple.cdl
+${NCDUMP} -n tst_simple tst_simple_3.nc > tst_simple_3.cdl
 diff tst_simple.cdl tst_simple_3.cdl
 echo '*** SUCCESS!!!'
 
-exit 0
\ No newline at end of file
+exit 0
diff --git a/nc_test4/run_chunk_hdf4.sh b/nc_test4/run_chunk_hdf4.sh
index d2da211..5debe5f 100755
--- a/nc_test4/run_chunk_hdf4.sh
+++ b/nc_test4/run_chunk_hdf4.sh
@@ -1,34 +1,26 @@
 #!/bin/sh
-# Run test_chunk_hdf4 passing ${src_dir}
-set -x
-CHUNKED=chunked.hdf4
-CONTIG=contiguous.hdf4
+# Run test_chunk_hdf4 passing ${srcdir}
+
+
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+set -e
 
 echo ""
 echo "*** Testing hdf4 chunking..."
 
-if test "x${src_dir}" = "x" ; then
-src_dir="."
-fi
-
-# Move the data sets into place
-ISDISTCHECK=0
-if test -f ./${CHUNKED} ; then
-ISDISTCHECK=0
-else
-ISDISTCHECK=1
-cp ${src_dir}/${CHUNKED} .
-cp ${src_dir}/${CONTIG} .
+if test "x${srcdir}" = "x" ; then
+srcdir="."
 fi
 
 if ./tst_chunk_hdf4 ; then
   echo "***SUCCESS!! tst_chunk_hdf4"
 else
+  RES=$?
   echo "***FAIL: tst_chunk_hdf4"
-fi
-
-if test "x${ISDISTCHECK}" = "x1" ; then
-echo rm -f ./${CHUNKED} ./${CONTIG}
+  exit $RES
 fi
 
 exit 0
diff --git a/nc_test4/run_empty_vlen_test.sh b/nc_test4/run_empty_vlen_test.sh
index 57a1405..9cb057b 100755
--- a/nc_test4/run_empty_vlen_test.sh
+++ b/nc_test4/run_empty_vlen_test.sh
@@ -11,25 +11,24 @@
 # full details.
 #
 
-set -e
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
+set -e
 
 echo ""
 echo "* Testing Empty Ragged Arrays (VLEN)"
 
 echo "Generating test netcdf files."
-./tst_empty_vlen_unlim
+${execdir}/tst_empty_vlen_unlim
 
 # Since no comparison is made, I am not sure 
 # if this is useful.
 #echo "Validating Files with ncdump."
 #echo "======================================"
-#../ncdump/ncdump -s tst_empty_vlen_unlim.nc
+#${NCDUMP} -s tst_empty_vlen_unlim.nc
 #echo "---------------------------------------"
-#../ncdump/ncdump -s tst_empty_vlen_lim.nc
+#${NCDUMP} -s tst_empty_vlen_lim.nc
 #echo "======================================"
 
 
diff --git a/nc_test4/run_get_knmi_files.sh b/nc_test4/run_get_knmi_files.sh
index e5c335a..7613950 100755
--- a/nc_test4/run_get_knmi_files.sh
+++ b/nc_test4/run_get_knmi_files.sh
@@ -1,5 +1,4 @@
 #!/bin/sh
-set -x
 
 # This shell gets files from the netCDF ftp site for testing.
 
diff --git a/nc_test4/run_grp_rename.sh b/nc_test4/run_grp_rename.sh
index 24f15e4..ab5a72c 100755
--- a/nc_test4/run_grp_rename.sh
+++ b/nc_test4/run_grp_rename.sh
@@ -1,15 +1,13 @@
 #!/bin/sh
-#set -x
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
 # This shell just tests the group renaming.
 
 set -e
 echo ""
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
-
 # Create the input cdl file
 rm -f tst_grp_rename.cdl
 cat >tst_grp_rename.cdl <<EOF
@@ -85,23 +83,23 @@ FAIL=0
 
 # Create ref_tst_group_rename.nc
 rm -f tst_grp_rename.nc
-../ncgen/ncgen -k nc4 ./tst_grp_rename.cdl
+${NCGEN} -k nc4 ./tst_grp_rename.cdl
 
 # Try to rename 2nd level group
-if ! ./renamegroup tst_grp_rename.nc "inner/inner_inner" "inner_renamed" ; then
+if ! ${execdir}/renamegroup tst_grp_rename.nc "inner/inner_inner" "inner_renamed" ; then
   echo "***FAIL: attempt to rename /inner/inner_inner failed"
   FAIL=1
 fi
 
 # Try to 1st level group
-if ! ./renamegroup tst_grp_rename.nc "inner" "renamed" ; then
+if ! ${execdir}/renamegroup tst_grp_rename.nc "inner" "renamed" ; then
   echo "***FAIL: attempt to rename /inner failed"
   FAIL=1
 fi
 
 # Dump the final .nc and compare with the reference
 rm -f tst_grp_rename.dmp
-../ncdump/ncdump tst_grp_rename.nc > ./tst_grp_rename.dmp
+${NCDUMP} tst_grp_rename.nc > ./tst_grp_rename.dmp
 
 if ! diff -b ref_grp_rename.cdl tst_grp_rename.dmp ; then
   echo "***FAIL: output and reference output differ"
@@ -109,7 +107,7 @@ if ! diff -b ref_grp_rename.cdl tst_grp_rename.dmp ; then
 fi
 
 # Finally, try to rename root group; should fail
-if ./renamegroup tst_grp_rename.nc "/" "rootgroup" ; then
+if ${execdir}/renamegroup tst_grp_rename.nc "/" "rootgroup" ; then
   echo "***FAIL: attempt to rename root group should not have succeeded"
   FAIL=1
 else
diff --git a/nc_test4/run_hdf4_valgrind_tests.sh b/nc_test4/run_hdf4_valgrind_tests.sh
index 3574603..ba3c9c7 100755
--- a/nc_test4/run_hdf4_valgrind_tests.sh
+++ b/nc_test4/run_hdf4_valgrind_tests.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs the HDF4 tests with valgrind.
 
 # $Id: run_hdf4_valgrind_tests.sh,v 1.1 2009/07/13 14:53:52 ed Exp $
diff --git a/nc_test4/run_par_bm_test.sh b/nc_test4/run_par_bm_test.sh
index c787d3c..3d8ce13 100755
--- a/nc_test4/run_par_bm_test.sh
+++ b/nc_test4/run_par_bm_test.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell file tests the bm_ile program for parallel I/O.
 
 # $Id: run_par_bm_test.sh,v 1.5 2007/12/12 18:00:39 ed Exp $
@@ -18,7 +21,7 @@ do
 	for numproc in 1 4 16
 	do
 	    mpiexec -n $numproc ./bm_file -p -d ${header} -s ${numproc} -f 4 -o p_${type_name}2_${i}D_3.nc -c 0:-1:0:${chunksizes} ${type_name}2_${i}D_3.nc 
-	    ../ncdump/ncdump -n tst_${type_name}2_${i}D p_${type_name}2_${i}D_3.nc > p_${type_name}2_${i}D.cdl
+	    ${NCDUMP} -n tst_${type_name}2_${i}D p_${type_name}2_${i}D_3.nc > p_${type_name}2_${i}D.cdl
 	    diff tst_${type_name}2_${i}D.cdl p_${type_name}2_${i}D.cdl &> /dev/null
 	    header=
 	done
@@ -26,4 +29,4 @@ do
     echo '*** SUCCESS!!!'
 done
 
-exit 0
\ No newline at end of file
+exit 0
diff --git a/nc_test4/run_par_test.sh b/nc_test4/run_par_test.sh
index 196361e..5c5ab5b 100755
--- a/nc_test4/run_par_test.sh
+++ b/nc_test4/run_par_test.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs some parallel I/O tests.
 
 set -e
diff --git a/nc_test4/run_tst_chunks.sh b/nc_test4/run_tst_chunks.sh
index ef1a436..a002471 100755
--- a/nc_test4/run_tst_chunks.sh
+++ b/nc_test4/run_tst_chunks.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell just tests the tst_chunks3 program by running it a few
 # times to generate a simple test file. Then it uses ncdump -s to
 # check that the output is what it should be.
@@ -17,8 +20,8 @@ dim2=12
 chunk2=3
 dim3=4
 chunk3=1
-./tst_chunks3 $compress_level $dim1 $chunk1 $dim2 $chunk2 $dim3 $chunk3
-../ncdump/ncdump -n tst_chunks -s tst_chunks3.nc > tst_chunks3.cdl
+${execdir}/tst_chunks3 $compress_level $dim1 $chunk1 $dim2 $chunk2 $dim3 $chunk3
+${NCDUMP} -n tst_chunks -s tst_chunks3.nc > tst_chunks3.cdl
 diff tst_chunks3.cdl ref_chunks1.cdl
 echo '*** SUCCESS!!!'
 
@@ -34,8 +37,8 @@ chunk3=13
 cachesize=10000000
 cachehash=10000
 cachepre=0.0
-./tst_chunks3 $compress_level $dim1 $chunk1 $dim2 $chunk2 $dim3 $chunk3 $cachesize $cachehash $cachepre
-../ncdump/ncdump -n tst_chunks -s -h tst_chunks3.nc > tst_chunks3.cdl
+${execdir}/tst_chunks3 $compress_level $dim1 $chunk1 $dim2 $chunk2 $dim3 $chunk3 $cachesize $cachehash $cachepre
+${NCDUMP} -n tst_chunks -s -h tst_chunks3.nc > tst_chunks3.cdl
 diff tst_chunks3.cdl ref_chunks2.cdl
 echo '*** SUCCESS!!!'
 
diff --git a/nc_test4/run_valgrind_tests.sh b/nc_test4/run_valgrind_tests.sh
index 9a44fd2..1a8da11 100755
--- a/nc_test4/run_valgrind_tests.sh
+++ b/nc_test4/run_valgrind_tests.sh
@@ -1,5 +1,9 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+
 # This shell runs the tests with valgrind.
 
 set -e
diff --git a/nc_test4/tst_chunk_hdf4.c b/nc_test4/tst_chunk_hdf4.c
index 137f0d8..104e44b 100644
--- a/nc_test4/tst_chunk_hdf4.c
+++ b/nc_test4/tst_chunk_hdf4.c
@@ -11,10 +11,10 @@
 #include <H5DSpublic.h>
 #include <mfhdf.h>
 
-#define CHUNKEDFILE "chunked.hdf4"
+#define CHUNKEDFILE "ref_chunked.hdf4"
 #define CHUNKEDVAR "LandWater"
 
-#define CONTIGFILE "contiguous.hdf4"
+#define CONTIGFILE "ref_contiguous.hdf4"
 #define CONTIGVAR "pres"
 
 #define LAT_LEN 3
diff --git a/nc_test4/tst_chunks.c b/nc_test4/tst_chunks.c
index cc85ec0..160d92c 100644
--- a/nc_test4/tst_chunks.c
+++ b/nc_test4/tst_chunks.c
@@ -259,14 +259,9 @@ main(int argc, char **argv)
 #define D_SMALL_LEN2 66
       int stat = NC_NOERR;
       int ncid;
-      int nvars, ndims, ngatts, unlimdimid;
-      int contig;
-      int ndims_in, natts_in, dimids_in;
-      int small_dimid, medium_dimid, large_dimid;
+      int small_dimid;
       int small_varid;
-      char var_name_in[NC_MAX_NAME + 1];
-      size_t chunks[1], chunksize_in;
-      nc_type xtype_in;
+      size_t chunks[1];
 
       /* Create a netcdf-4 file with three dimensions. */
       if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
diff --git a/nc_test4/tst_chunks3.c b/nc_test4/tst_chunks3.c
index 2c95338..6868b23 100644
--- a/nc_test4/tst_chunks3.c
+++ b/nc_test4/tst_chunks3.c
@@ -1,19 +1,25 @@
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>		/* for sysconf */
+#endif
+#ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
+#endif
 #ifdef HAVE_SYS_TIMES_H
 #  include <sys/times.h>
 #endif
-#include <sys/stat.h>
-#include <assert.h>
+#ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
-#include <unistd.h>		/* for sysconf */
+#endif
+#include <assert.h>
 #ifdef HAVE_SYS_RESOURCE_H
 #  include <sys/resource.h>
 #endif
-#include <nc_tests.h>		/* The ERR macro is here... */
-#include <netcdf.h>
+#include "nc_tests.h"		/* The ERR macro is here... */
+#include "netcdf.h"
 
 #define FILENAME "tst_chunks3.nc"
 
diff --git a/nc_test4/tst_converts.c b/nc_test4/tst_converts.c
index e0e3deb..183da06 100644
--- a/nc_test4/tst_converts.c
+++ b/nc_test4/tst_converts.c
@@ -70,8 +70,12 @@ create_file(int format, unsigned char *uchar_out)
    if (nc_def_var(ncid, VAR1_NAME, NC_BYTE, 1, dimids, &varid)) ERR;
    if (nc_enddef(ncid)) ERR;
    retval = nc_put_var_uchar(ncid, varid, uchar_out);
-   if ((format != NC_FORMAT_NETCDF4) && retval) ERR;
-   if ((format == NC_FORMAT_NETCDF4) && (retval != NC_ERANGE)) ERR;
+   if (format == NC_FORMAT_NETCDF4 || format == NC_FORMAT_64BIT_DATA)
+   {
+     if (retval != NC_ERANGE) ERR;
+   }
+   else if (retval != NC_NOERR) ERR;
+
    if (nc_close(ncid)) ERR;
    return NC_NOERR;
 }
@@ -105,7 +109,7 @@ check_file(int format, unsigned char *uchar_out)
     * because range errors are not generated for byte type
     * conversions. */
    res = nc_get_var_uchar(ncid, 0, uchar_in);
-   if (format == NC_FORMAT_NETCDF4)
+   if (format == NC_FORMAT_NETCDF4 || format == NC_FORMAT_64BIT_DATA)
    {
       if (res != NC_ERANGE) ERR;
    }
diff --git a/nc_test4/tst_files.c b/nc_test4/tst_files.c
index 5b949a9..1fe342c 100644
--- a/nc_test4/tst_files.c
+++ b/nc_test4/tst_files.c
@@ -502,8 +502,11 @@ test_redef(int format)
 
    /* Add att. */
    ret = nc_put_att_uchar(ncid, NC_GLOBAL, REDEF_ATT3_NAME, NC_BYTE, 1, &uchar_out);
-   if (format != NC_FORMAT_NETCDF4 && ret) ERR;
-   else if (format == NC_FORMAT_NETCDF4 && ret != NC_ERANGE) ERR;
+   if (format == NC_FORMAT_NETCDF4 || format == NC_FORMAT_64BIT_DATA)
+   {
+      if (ret != NC_ERANGE) ERR;
+   }
+   else if (ret) ERR;
 
    /* Check it out. */
    if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
@@ -539,7 +542,7 @@ test_redef(int format)
    if (nc_get_att_int(ncid, NC_GLOBAL, REDEF_ATT2_NAME, &int_in)) ERR;
    if (int_in != short_out) ERR;
    ret = nc_get_att_uchar(ncid, NC_GLOBAL, REDEF_ATT3_NAME, &uchar_in);
-   if (format == NC_FORMAT_NETCDF4)
+   if (format == NC_FORMAT_NETCDF4 || format == NC_FORMAT_64BIT_DATA)
    {
       if (ret != NC_ERANGE) ERR;
    }
diff --git a/nc_test4/tst_fill_attr_vanish.c b/nc_test4/tst_fill_attr_vanish.c
index 4d119cd..511d41e 100644
--- a/nc_test4/tst_fill_attr_vanish.c
+++ b/nc_test4/tst_fill_attr_vanish.c
@@ -33,7 +33,7 @@
  */
 int main()
 {
-  int ncid, dimids[RANK_P], time_id, p_id, test_id;
+  int ncid, dimids[RANK_P], time_id, p_id, test_id, status;
   int ndims, dimids_in[RANK_P];
 
   int test_data[1] = {1};
@@ -87,21 +87,28 @@ int main()
 
   /* Query existing attribute. */
   {
-    printf("**** Checking that attribute still exists:\t");
     char *attval = malloc(sizeof(char) * strlen(ATTVAL));
+    printf("**** Checking that attribute still exists:\t");
     if(nc_get_att_text(ncid,test_id,ATTNAME,attval)) {printf("Fail\n"); ERR;}
     else {printf("%s\n",attval);}
     free(attval);
 
   }
 
-  printf("**** Adding _FillValue attribute.\n");
-  if (nc_put_att_int(ncid, test_id, "_FillValue", NC_INT, 1, test_fill_val)) ERR;
+  printf("**** Expecting NC_ELATEFILL when adding _FillValue attribute if variable exists.\n");
+  status = nc_put_att_int(ncid, test_id, "_FillValue", NC_INT, 1, test_fill_val);
+  if (status != NC_ELATEFILL) {
+      fflush(stdout); /* Make sure our stdout is synced with stderr. */
+      err++;
+      fprintf(stderr, "Sorry! Expecting NC_ELATEFILL but got %s, at file %s line: %d\n",
+              nc_strerror(status), __FILE__, __LINE__);
+      return 2;
+  }
 
   /* Query existing attribute. */
   {
-    printf("**** Checking that attribute still exists, pre-write:\t");
     char *attval = malloc(sizeof(char) * strlen(ATTVAL));
+    printf("**** Checking that attribute still exists, pre-write:\t");
     if(nc_get_att_text(ncid,test_id,ATTNAME,attval)) {printf("Fail\n"); ERR;}
     else {printf("%s\n",attval);}
     free(attval);
@@ -120,8 +127,8 @@ int main()
 
   /* Query existing attribute. */
   {
-    printf("**** Checking that attribute still exists:\t");
     char *attval = malloc(sizeof(char) * strlen(ATTVAL));
+    printf("**** Checking that attribute still exists:\t");
     if(nc_get_att_text(ncid,test_id,ATTNAME,attval)) {printf("Fail\n"); ERR;}
     else {printf("%s\n",attval);}
     free(attval);
diff --git a/nc_test4/tst_formatx_hdf4.sh b/nc_test4/tst_formatx_hdf4.sh
index 54ea1cf..e954d3e 100755
--- a/nc_test4/tst_formatx_hdf4.sh
+++ b/nc_test4/tst_formatx_hdf4.sh
@@ -2,6 +2,9 @@
 # This shell script tests the output several previous tests.
 # $Id: tst_output.sh,v 1.17 2010/05/14 16:21:15 ed Exp $
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 FILE=tst_interops2.h4
 
 ECODE=0
@@ -12,7 +15,7 @@ set -e
 
 echo "Test extended format output for a HDF4 file"
 rm -f tmp
-../ncdump/ncdump -K $FILE >tmp
+${NCDUMP} -K $FILE >tmp
 if ! fgrep 'HDF4 mode=00001000' <tmp ; then
 TMP=`cat tmp`
 echo "*** Fail: extended format for an HDF4 file: result=" $TMP
diff --git a/nc_test4/tst_hdf4_read_var.sh b/nc_test4/tst_hdf4_read_var.sh
index a7f35f0..a59d96f 100755
--- a/nc_test4/tst_hdf4_read_var.sh
+++ b/nc_test4/tst_hdf4_read_var.sh
@@ -4,6 +4,10 @@
 #
 # this was added in support of https://github.com/Unidata/netcdf-c/issues/264
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+
 FILE=tst_interops2.h4
 
 set -e
@@ -11,13 +15,13 @@ set -e
 echo ""
 echo "*** Testing reading an individual variable from an HDF4 file."
 
-../ncdump/ncdump -v hdf4_dataset_type_0 $FILE
-../ncdump/ncdump -v hdf4_dataset_type_1 $FILE
-../ncdump/ncdump -v hdf4_dataset_type_2 $FILE
-../ncdump/ncdump -v hdf4_dataset_type_3 $FILE
-../ncdump/ncdump -v hdf4_dataset_type_4 $FILE
-../ncdump/ncdump -v hdf4_dataset_type_5 $FILE
-../ncdump/ncdump -v hdf4_dataset_type_6 $FILE
-../ncdump/ncdump -v hdf4_dataset_type_7 $FILE
+${NCDUMP} -v hdf4_dataset_type_0 $FILE
+${NCDUMP} -v hdf4_dataset_type_1 $FILE
+${NCDUMP} -v hdf4_dataset_type_2 $FILE
+${NCDUMP} -v hdf4_dataset_type_3 $FILE
+${NCDUMP} -v hdf4_dataset_type_4 $FILE
+${NCDUMP} -v hdf4_dataset_type_5 $FILE
+${NCDUMP} -v hdf4_dataset_type_6 $FILE
+${NCDUMP} -v hdf4_dataset_type_7 $FILE
 
 echo "*** Success."
diff --git a/nc_test4/tst_misc.sh b/nc_test4/tst_misc.sh
index e5549f9..1642f5b 100755
--- a/nc_test4/tst_misc.sh
+++ b/nc_test4/tst_misc.sh
@@ -1,17 +1,13 @@
 #!/bin/sh
 
-if test "x$builddir" = "x"; then builddir=`pwd`; fi
-if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
-
-# Make buildir absolute
-cd $builddir
-builddir=`pwd`
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
 set -e
 
 echo "*** Testing phony dimension creation on pure h5 file"
 rm -f ./tmp
-if ../ncdump/ncdump -L0 -K ${srcdir}/tdset.h5 >./tmp ; then
+if $NCDUMP -L0 -K ${srcdir}/tdset.h5 >./tmp ; then
 echo "*** Pass: phony dimension creation"
 ECODE=0
 else
diff --git a/nc_test4/tst_rehash.c b/nc_test4/tst_rehash.c
index 04ed043..8fb5c4e 100644
--- a/nc_test4/tst_rehash.c
+++ b/nc_test4/tst_rehash.c
@@ -40,4 +40,5 @@ int main()
   nc_def_var(id, "var2", NC_FLOAT, 2, dimids,    &v4);
 
   nc_close(id);
+  return 0;
 }
diff --git a/nc_test4/tst_strings2.c b/nc_test4/tst_strings2.c
index f5c60d6..f0b7aa2 100644
--- a/nc_test4/tst_strings2.c
+++ b/nc_test4/tst_strings2.c
@@ -27,8 +27,9 @@ main(int argc, char **argv)
       int ncid, i;
       char *data_in[ATT_LEN];
       char *data[ATT_LEN] = {"An appeaser is one who feeds a crocodile — "
-			     "hoping it will eat him last."};
-
+                             "hoping it will eat him last. "
+                             "Here are some non-ASCII characters: "
+                             "\x00\xAA\xBB\xFF"};
 
       if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
       if (nc_put_att(ncid, NC_GLOBAL, ATT_NAME, NC_STRING, ATT_LEN, data)) ERR;
diff --git a/nc_test4/tst_vars.c b/nc_test4/tst_vars.c
index f7c991c..d0a0b3d 100644
--- a/nc_test4/tst_vars.c
+++ b/nc_test4/tst_vars.c
@@ -6,7 +6,7 @@
    $Id: tst_vars.c,v 1.49 2009/12/30 12:03:48 ed Exp $
 */
 
-#include <nc_tests.h>
+#include "nc_tests.h"
 #include "err_macros.h"
 #include "netcdf.h"
 
diff --git a/nc_test4/tst_vars2.c b/nc_test4/tst_vars2.c
index 5b8081b..4ed3147 100644
--- a/nc_test4/tst_vars2.c
+++ b/nc_test4/tst_vars2.c
@@ -61,13 +61,17 @@ main(int argc, char **argv)
 
       printf("**** testing simple fill value attribute creation...");
       {
+         int status;
          /* Create a netcdf-4 file with one scalar var. Add fill
           * value. */
          if (nc_create(FILE_NAME, cmode, &ncid)) ERR;
          if (nc_def_var(ncid, VAR_NAME, NC_BYTE, 0, NULL, &varid)) ERR;
+         if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value)) ERR;
          if (nc_enddef(ncid)) ERR;
          if (nc_redef(ncid)) ERR;
-         if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value)) ERR;
+         status = nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value);
+         if (status != NC_ELATEFILL)
+             printf("Error at line %d: expecting NC_ELATEFILL but got %s\n",__LINE__,nc_strerror(status));
          if (nc_close(ncid)) ERR;
 
          /* Open the file and check. */
@@ -94,8 +98,6 @@ main(int argc, char **argv)
          if (nc_create(FILE_NAME, cmode, &ncid)) ERR;
          if (nc_def_dim(ncid, DIM1_NAME, DIM1_LEN, &dimids[0])) ERR;
          if (nc_def_var(ncid, VAR_NAME, NC_BYTE, NUM_DIMS, dimids, &varid)) ERR;
-         if (nc_enddef(ncid)) ERR;
-         if (nc_redef(ncid)) ERR;
          if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value)) ERR;
          if (nc_enddef(ncid)) ERR;
 
diff --git a/ncdap_test/CMakeLists.txt b/ncdap_test/CMakeLists.txt
index 333bf31..4b4a70d 100644
--- a/ncdap_test/CMakeLists.txt
+++ b/ncdap_test/CMakeLists.txt
@@ -1,4 +1,5 @@
-SET(abs_top_srcdir ${CMAKE_CURRENT_SOURCE_DIR})
+add_definitions(-D"TOPSRCDIR=${CMAKE_SOURCE_DIR}")
+add_definitions(-D"TOPBINDIR=${CMAKE_BINARY_DIR}")
 
 remove_definitions(-DDLL_EXPORT)
 add_definitions(-D"TOPSRCDIR=${CMAKE_SOURCE_DIR}")
@@ -7,26 +8,6 @@ FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
 
 FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/ FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE)
 
-IF(ENABLE_DAP_REMOTE_TESTS)
-  ADD_EXECUTABLE(nctestserver nctestserver.c)
-  TARGET_LINK_LIBRARIES(nctestserver netcdf ${ALL_TLL_LIBS})
-
-  ####
-  # We have to do a little tweaking
-  # to remove the Release/ and Debug/ directories
-  # in MSVC builds.  This is required to get
-  # test scripts to work.
-  ####
-  IF(MSVC)
-    SET_TARGET_PROPERTIES(nctestserver PROPERTIES RUNTIME_OUTPUT_DIRECTORY
-      ${CMAKE_CURRENT_BINARY_DIR})
-    SET_TARGET_PROPERTIES(nctestserver PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
-      ${CMAKE_CURRENT_BINARY_DIR})
-    SET_TARGET_PROPERTIES(nctestserver PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
-      ${CMAKE_CURRENT_BINARY_DIR})
-  ENDIF()
-ENDIF()
-
 IF(ENABLE_TESTS)
   # Base tests
   # The tests are set up as a combination of shell scripts and executables that
@@ -43,18 +24,13 @@ IF(ENABLE_TESTS)
   ENDIF()
 
   IF(ENABLE_DAP_REMOTE_TESTS)
+
+    BUILD_BIN_TEST(findtestserver)
+
     IF(BUILD_UTILITIES)
       add_sh_test(ncdap tst_remote3)
-      add_sh_test(ncdap tst_formatx)
+# not yet      add_sh_test(ncdap tst_hyrax)
     ENDIF(BUILD_UTILITIES)
-    add_bin_test(ncdap test_partvar)
-    IF(ENABLE_DAP_LONG_TESTS)
-      add_sh_test(ncdap tst_longremote3)
-    ENDIF()
-    add_sh_test(ncdap testurl)
-
-    add_bin_test(ncdap test_nstride_cached)
-    add_bin_test(ncdap t_misc)
 
     IF(ENABLE_DAP_AUTH_TESTS)
 ##obsolete      add_bin_test(ncdap t_auth)
@@ -74,10 +50,7 @@ ENDIF()
 
 ADD_SUBDIRECTORY(testdata3)
 ADD_SUBDIRECTORY(expected3)
-ADD_SUBDIRECTORY(expected4)
 ADD_SUBDIRECTORY(expectremote3)
-ADD_SUBDIRECTORY(expectremote4)
-
 
 ## Specify files to be distributed by 'make dist'
 FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
diff --git a/ncdap_test/Makefile.am b/ncdap_test/Makefile.am
index f672ccb..875a186 100644
--- a/ncdap_test/Makefile.am
+++ b/ncdap_test/Makefile.am
@@ -3,35 +3,35 @@
 
 # This file builds and runs DAP tests.
 
+# This will not work until we get a new remotetest server set up 
+
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 include $(top_srcdir)/lib_flags.am
 
 LDADD = ${top_builddir}/liblib/libnetcdf.la
-AM_CPPFLAGS += -I$(top_builddir)/liblib
+AM_CPPFLAGS += -I$(top_srcdir)/liblib
+AM_CPPFLAGS += -DTOPSRCDIR=${abs_top_srcdir}
+AM_CPPFLAGS += -DTOPBINDIR=${abs_top_bindir}
 
 # Set up the tests; do the .sh first, then .c
 check_PROGRAMS =
 TESTS =
-TESTS_ENVIRONMENT=TOPSRCDIR=${abs_top_srcdir}
-
-TESTS += tst_ncdap3.sh
 
-t_dap3a_SOURCES = t_dap3a.c
-test_cvt3_SOURCES = test_cvt.c
-test_vara_SOURCES = test_vara.c
+t_dap3a_SOURCES = t_dap3a.c t_srcdir.h
+test_cvt3_SOURCES = test_cvt.c t_srcdir.h
+test_vara_SOURCES = test_vara.c t_srcdir.h
 
+if ENABLE_DAP
 check_PROGRAMS += t_dap3a test_cvt3 test_vara
-
 TESTS += t_dap3a test_cvt3 test_vara
+TESTS += tst_ncdap3.sh
 
 # remote tests are optional
 # because the server may be down or inaccessible
 
 if ENABLE_DAP_REMOTE_TESTS
-
-# Make nctestserver be the first test to be built
-check_PROGRAMS += nctestserver
-nctestserver_SOURCES = nctestserver.c
+check_PROGRAMS += findtestserver
+findtestserver_SOURCES = findtestserver.c
 
 if BUILD_UTILITIES
 TESTS += tst_remote3.sh tst_formatx.sh
@@ -44,12 +44,11 @@ if ENABLE_DAP_LONG_TESTS
 endif
 
 test_partvar_SOURCES = test_partvar.c
-test_nstride_cached_SOURCE = test_nstride_cached.c
+test_varm3_SOURCES = test_varm3.c
+test_nstride_cached_SOURCES = test_nstride_cached.c
+
 #t_auth_SOURCES = t_auth.c
-#t_auth1_SOURCES = t_auth1.c
 t_misc_SOURCES = t_misc.c
-test_varm3_SOURCES = test_varm3.c
-#t_ncf330_SOURCES = t_ncf330.c
 
 TESTS += test_varm3
 #TESTS += t_ncf330
@@ -70,44 +69,19 @@ endif
 
 endif #ENABLE_DAP_REMOTE_TESTS
 
-if USE_NETCDF4
-
-#TESTS += tst_ncdap4.sh
-
-if ENABLE_DAP_REMOTE_TESTS
-
-#TESTS += tst_remote4.sh
-
-if ENABLE_DAP_LONG_TESTS
-#TESTS += tst_longremote4.sh
-endif
-
-# Conversion tests
-
-#test_cvt4_SOURCES = test_cvt.c
-#t_dap4_SOURCES = t_dap4.c
-#check_PROGRAMS += test_cvt4 t_dap4
-#TESTS += test_cvt4 t_dap4
-
-endif ENABLE_DAP_REMOTE_TESTS
-
-endif #USE_NETCDF4
+endif #ENABLE_DAP
 
 # Need to add subdirs
-SUBDIRS = testdata3 expected3 expected4 expectremote3 expectremote4
+SUBDIRS = testdata3 expected3 expectremote3
 
-EXTRA_DIST = tst_ncdap3.sh tst_ncdap4.sh \
-             tst_remote3.sh tst_remote4.sh \
-             tst_longremote3.sh tst_longremote4.sh \
+EXTRA_DIST = tst_ncdap3.sh  \
+             tst_remote3.sh \
+             tst_longremote3.sh \
              tst_ncdap.sh tst_ncdap_shared.sh tst_remote.sh \
 	     t_dap.c CMakeLists.txt tst_formatx.sh testauth.sh testurl.sh \
 			t_ncf330.c
 
-CLEANFILES = test_varm3 test_cvt3 results/*.dmp results/*.das results/*.dds datadds* t_dap3a test_nstride_cached
-
-if USE_NETCDF4
-CLEANFILES += test_cvt4 t_dap4
-endif
+CLEANFILES = test_varm3 test_cvt3 results/*.dmp results/*.das results/*.dds datadds* t_dap3a test_nstride_cached *.exe
 
 # This rule are used if someone wants to rebuild t_dap3a.c
 # Otherwise never invoked, but records how to do it.
@@ -124,4 +98,11 @@ BUILT_SOURCES = .dodsrc
 .dodsrc:
 	echo "#DODSRC" >.dodsrc
 
-DISTCLEANFILES = .dodsrc results/* results
+clean-local: clean-local-check
+
+.PHONY: clean-local-check
+
+clean-local-check:
+	-rm -rf results
+	-rm .dodsrc
+
diff --git a/ncdap_test/Makefile.in b/ncdap_test/Makefile.in
index ba1a02d..0226fc8 100644
--- a/ncdap_test/Makefile.in
+++ b/ncdap_test/Makefile.in
@@ -18,6 +18,8 @@
 
 # This file builds and runs DAP tests.
 
+# This will not work until we get a new remotetest server set up 
+
 # This is part of the netCDF package.
 # Copyright 2005 University Corporation for Atmospheric Research/Unidata
 # See COPYRIGHT file for conditions of use.
@@ -104,31 +106,34 @@ target_triplet = @target@
 
 # This turns on declspec magic in netcdf.h for windows DLLs.
 @BUILD_DLL_TRUE at am__append_2 = -DDLL_NETCDF
-check_PROGRAMS = t_dap3a$(EXEEXT) test_cvt3$(EXEEXT) \
-	test_vara$(EXEEXT) $(am__EXEEXT_1)
-TESTS = tst_ncdap3.sh t_dap3a$(EXEEXT) test_cvt3$(EXEEXT) \
-	test_vara$(EXEEXT) $(am__append_4) $(am__EXEEXT_2) \
-	$(am__append_6) $(am__EXEEXT_3) $(am__append_8)
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+TESTS = $(am__EXEEXT_3) $(am__append_6) $(am__EXEEXT_4) \
+	$(am__append_8) $(am__EXEEXT_5) $(am__append_10)
+ at ENABLE_DAP_TRUE@am__append_3 = t_dap3a test_cvt3 test_vara
+ at ENABLE_DAP_TRUE@am__append_4 = t_dap3a test_cvt3 test_vara \
+ at ENABLE_DAP_TRUE@	tst_ncdap3.sh
 
 # remote tests are optional
 # because the server may be down or inaccessible
-
-# Make nctestserver be the first test to be built
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am__append_3 = nctestserver test_partvar \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_nstride_cached t_misc \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_varm3 t_ncf330
- at BUILD_UTILITIES_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE at am__append_4 = tst_remote3.sh tst_formatx.sh
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am__append_5 = test_partvar testurl.sh
- at ENABLE_DAP_LONG_TESTS_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE at am__append_6 = tst_longremote3.sh
-#t_ncf330_SOURCES = t_ncf330.c
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__append_5 =  \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	findtestserver \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_partvar \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_nstride_cached \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	t_misc \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_varm3 \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	t_ncf330
+ at BUILD_UTILITIES_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__append_6 = tst_remote3.sh tst_formatx.sh
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__append_7 = test_partvar testurl.sh
+ at ENABLE_DAP_LONG_TESTS_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__append_8 = tst_longremote3.sh
 #TESTS += t_ncf330
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am__append_7 = test_varm3 \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_nstride_cached t_misc
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__append_9 =  \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_varm3 \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_nstride_cached \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	t_misc
 
 #check_PROGRAMS += t_auth t_auth1
 #TESTS += t_auth
- at ENABLE_DAP_AUTH_TESTS_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE at am__append_8 = testauth.sh
- at USE_NETCDF4_TRUE@am__append_9 = test_cvt4 t_dap4
+ at ENABLE_DAP_AUTH_TESTS_TRUE@@ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__append_10 = testauth.sh
 subdir = ncdap_test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -142,18 +147,19 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am__EXEEXT_1 = nctestserver$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_partvar$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_nstride_cached$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	t_misc$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_varm3$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	t_ncf330$(EXEEXT)
-am__nctestserver_SOURCES_DIST = nctestserver.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am_nctestserver_OBJECTS =  \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	nctestserver.$(OBJEXT)
-nctestserver_OBJECTS = $(am_nctestserver_OBJECTS)
-nctestserver_LDADD = $(LDADD)
-nctestserver_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+ at ENABLE_DAP_TRUE@am__EXEEXT_1 = t_dap3a$(EXEEXT) test_cvt3$(EXEEXT) \
+ at ENABLE_DAP_TRUE@	test_vara$(EXEEXT)
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__EXEEXT_2 = findtestserver$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_partvar$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_nstride_cached$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	t_misc$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_varm3$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	t_ncf330$(EXEEXT)
+am__findtestserver_SOURCES_DIST = findtestserver.c
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am_findtestserver_OBJECTS = findtestserver.$(OBJEXT)
+findtestserver_OBJECTS = $(am_findtestserver_OBJECTS)
+findtestserver_LDADD = $(LDADD)
+findtestserver_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
@@ -163,7 +169,7 @@ t_dap3a_OBJECTS = $(am_t_dap3a_OBJECTS)
 t_dap3a_LDADD = $(LDADD)
 t_dap3a_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 am__t_misc_SOURCES_DIST = t_misc.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am_t_misc_OBJECTS = t_misc.$(OBJEXT)
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am_t_misc_OBJECTS = t_misc.$(OBJEXT)
 t_misc_OBJECTS = $(am_t_misc_OBJECTS)
 t_misc_LDADD = $(LDADD)
 t_misc_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
@@ -175,14 +181,14 @@ am_test_cvt3_OBJECTS = test_cvt.$(OBJEXT)
 test_cvt3_OBJECTS = $(am_test_cvt3_OBJECTS)
 test_cvt3_LDADD = $(LDADD)
 test_cvt3_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
-test_nstride_cached_SOURCES = test_nstride_cached.c
-test_nstride_cached_OBJECTS = test_nstride_cached.$(OBJEXT)
+am__test_nstride_cached_SOURCES_DIST = test_nstride_cached.c
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am_test_nstride_cached_OBJECTS = test_nstride_cached.$(OBJEXT)
+test_nstride_cached_OBJECTS = $(am_test_nstride_cached_OBJECTS)
 test_nstride_cached_LDADD = $(LDADD)
 test_nstride_cached_DEPENDENCIES =  \
 	${top_builddir}/liblib/libnetcdf.la
 am__test_partvar_SOURCES_DIST = test_partvar.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am_test_partvar_OBJECTS =  \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_partvar.$(OBJEXT)
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am_test_partvar_OBJECTS = test_partvar.$(OBJEXT)
 test_partvar_OBJECTS = $(am_test_partvar_OBJECTS)
 test_partvar_LDADD = $(LDADD)
 test_partvar_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
@@ -191,8 +197,7 @@ test_vara_OBJECTS = $(am_test_vara_OBJECTS)
 test_vara_LDADD = $(LDADD)
 test_vara_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 am__test_varm3_SOURCES_DIST = test_varm3.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am_test_varm3_OBJECTS =  \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_varm3.$(OBJEXT)
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am_test_varm3_OBJECTS = test_varm3.$(OBJEXT)
 test_varm3_OBJECTS = $(am_test_varm3_OBJECTS)
 test_varm3_LDADD = $(LDADD)
 test_varm3_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
@@ -230,14 +235,15 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(nctestserver_SOURCES) $(t_dap3a_SOURCES) $(t_misc_SOURCES) \
-	t_ncf330.c $(test_cvt3_SOURCES) test_nstride_cached.c \
-	$(test_partvar_SOURCES) $(test_vara_SOURCES) \
-	$(test_varm3_SOURCES)
-DIST_SOURCES = $(am__nctestserver_SOURCES_DIST) $(t_dap3a_SOURCES) \
+SOURCES = $(findtestserver_SOURCES) $(t_dap3a_SOURCES) \
+	$(t_misc_SOURCES) t_ncf330.c $(test_cvt3_SOURCES) \
+	$(test_nstride_cached_SOURCES) $(test_partvar_SOURCES) \
+	$(test_vara_SOURCES) $(test_varm3_SOURCES)
+DIST_SOURCES = $(am__findtestserver_SOURCES_DIST) $(t_dap3a_SOURCES) \
 	$(am__t_misc_SOURCES_DIST) t_ncf330.c $(test_cvt3_SOURCES) \
-	test_nstride_cached.c $(am__test_partvar_SOURCES_DIST) \
-	$(test_vara_SOURCES) $(am__test_varm3_SOURCES_DIST)
+	$(am__test_nstride_cached_SOURCES_DIST) \
+	$(am__test_partvar_SOURCES_DIST) $(test_vara_SOURCES) \
+	$(am__test_varm3_SOURCES_DIST)
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
 	ctags-recursive dvi-recursive html-recursive info-recursive \
 	install-data-recursive install-dvi-recursive \
@@ -461,11 +467,13 @@ am__set_TESTS_bases = \
   bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am__EXEEXT_2 = test_partvar$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	testurl.sh
- at ENABLE_DAP_REMOTE_TESTS_TRUE@am__EXEEXT_3 = test_varm3$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	test_nstride_cached$(EXEEXT) \
- at ENABLE_DAP_REMOTE_TESTS_TRUE@	t_misc$(EXEEXT)
+ at ENABLE_DAP_TRUE@am__EXEEXT_3 = t_dap3a$(EXEEXT) test_cvt3$(EXEEXT) \
+ at ENABLE_DAP_TRUE@	test_vara$(EXEEXT) tst_ncdap3.sh
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__EXEEXT_4 = test_partvar$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	testurl.sh
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at am__EXEEXT_5 = test_varm3$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	test_nstride_cached$(EXEEXT) \
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE@	t_misc$(EXEEXT)
 TEST_SUITE_LOG = test-suite.log
 TEST_EXTENSIONS = @EXEEXT@ .test
 LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
@@ -520,7 +528,8 @@ ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_CFLAGS = @AM_CFLAGS@
 AM_CPPFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) \
-	-I$(top_builddir)/liblib
+	-I$(top_srcdir)/liblib -DTOPSRCDIR=${abs_top_srcdir} \
+	-DTOPBINDIR=${abs_top_bindir}
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_LDFLAGS = 
 AR = @AR@
@@ -557,6 +566,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -584,12 +594,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -624,6 +636,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -688,50 +701,34 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 LDADD = ${top_builddir}/liblib/libnetcdf.la
-TESTS_ENVIRONMENT = TOPSRCDIR=${abs_top_srcdir}
-t_dap3a_SOURCES = t_dap3a.c
-test_cvt3_SOURCES = test_cvt.c
-test_vara_SOURCES = test_vara.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@nctestserver_SOURCES = nctestserver.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@test_partvar_SOURCES = test_partvar.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@test_nstride_cached_SOURCE = test_nstride_cached.c
-#t_auth_SOURCES = t_auth.c
-#t_auth1_SOURCES = t_auth1.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@t_misc_SOURCES = t_misc.c
- at ENABLE_DAP_REMOTE_TESTS_TRUE@test_varm3_SOURCES = test_varm3.c
-
-#TESTS += tst_ncdap4.sh
-
-#TESTS += tst_remote4.sh
-
-#TESTS += tst_longremote4.sh
-
-# Conversion tests
+t_dap3a_SOURCES = t_dap3a.c t_srcdir.h
+test_cvt3_SOURCES = test_cvt.c t_srcdir.h
+test_vara_SOURCES = test_vara.c t_srcdir.h
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at findtestserver_SOURCES = findtestserver.c
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at test_partvar_SOURCES = test_partvar.c
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at test_varm3_SOURCES = test_varm3.c
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at test_nstride_cached_SOURCES = test_nstride_cached.c
 
-#test_cvt4_SOURCES = test_cvt.c
-#t_dap4_SOURCES = t_dap4.c
-#check_PROGRAMS += test_cvt4 t_dap4
-#TESTS += test_cvt4 t_dap4
+#t_auth_SOURCES = t_auth.c
+ at ENABLE_DAP_REMOTE_TESTS_TRUE@@ENABLE_DAP_TRUE at t_misc_SOURCES = t_misc.c
 
 # Need to add subdirs
-SUBDIRS = testdata3 expected3 expected4 expectremote3 expectremote4
-EXTRA_DIST = tst_ncdap3.sh tst_ncdap4.sh \
-             tst_remote3.sh tst_remote4.sh \
-             tst_longremote3.sh tst_longremote4.sh \
+SUBDIRS = testdata3 expected3 expectremote3
+EXTRA_DIST = tst_ncdap3.sh  \
+             tst_remote3.sh \
+             tst_longremote3.sh \
              tst_ncdap.sh tst_ncdap_shared.sh tst_remote.sh \
 	     t_dap.c CMakeLists.txt tst_formatx.sh testauth.sh testurl.sh \
 			t_ncf330.c
 
-CLEANFILES = test_varm3 test_cvt3 results/*.dmp results/*.das \
-	results/*.dds datadds* t_dap3a test_nstride_cached \
-	$(am__append_9)
+CLEANFILES = test_varm3 test_cvt3 results/*.dmp results/*.das results/*.dds datadds* t_dap3a test_nstride_cached *.exe
 
 # One last thing
 BUILT_SOURCES = .dodsrc
-DISTCLEANFILES = .dodsrc results/* results
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
@@ -777,9 +774,9 @@ clean-checkPROGRAMS:
 	echo " rm -f" $$list; \
 	rm -f $$list
 
-nctestserver$(EXEEXT): $(nctestserver_OBJECTS) $(nctestserver_DEPENDENCIES) $(EXTRA_nctestserver_DEPENDENCIES) 
-	@rm -f nctestserver$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(nctestserver_OBJECTS) $(nctestserver_LDADD) $(LIBS)
+findtestserver$(EXEEXT): $(findtestserver_OBJECTS) $(findtestserver_DEPENDENCIES) $(EXTRA_findtestserver_DEPENDENCIES) 
+	@rm -f findtestserver$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(findtestserver_OBJECTS) $(findtestserver_LDADD) $(LIBS)
 
 t_dap3a$(EXEEXT): $(t_dap3a_OBJECTS) $(t_dap3a_DEPENDENCIES) $(EXTRA_t_dap3a_DEPENDENCIES) 
 	@rm -f t_dap3a$(EXEEXT)
@@ -819,7 +816,7 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nctestserver.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/findtestserver.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_dap3a.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_misc.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_ncf330.Po at am__quote@
@@ -1099,13 +1096,6 @@ recheck: all $(check_PROGRAMS)
 	        am__force_recheck=am--force-recheck \
 	        TEST_LOGS="$$log_list"; \
 	exit $$?
-tst_ncdap3.sh.log: tst_ncdap3.sh
-	@p='tst_ncdap3.sh'; \
-	b='tst_ncdap3.sh'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
 t_dap3a.log: t_dap3a$(EXEEXT)
 	@p='t_dap3a$(EXEEXT)'; \
 	b='t_dap3a'; \
@@ -1127,6 +1117,13 @@ test_vara.log: test_vara$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_ncdap3.sh.log: tst_ncdap3.sh
+	@p='tst_ncdap3.sh'; \
+	b='tst_ncdap3.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 tst_remote3.sh.log: tst_remote3.sh
 	@p='tst_remote3.sh'; \
 	b='tst_remote3.sh'; \
@@ -1299,7 +1296,6 @@ clean-generic:
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -1307,7 +1303,7 @@ maintainer-clean-generic:
 	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-recursive
 
-clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
 	mostlyclean-am
 
 distclean: distclean-recursive
@@ -1381,18 +1377,18 @@ uninstall-am:
 
 .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
 	check-TESTS check-am clean clean-checkPROGRAMS clean-generic \
-	clean-libtool cscopelist-am ctags ctags-am distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
-	uninstall uninstall-am
+	clean-libtool clean-local cscopelist-am ctags ctags-am \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
@@ -1409,6 +1405,14 @@ t_dap4a.c: t_dap.c
 .dodsrc:
 	echo "#DODSRC" >.dodsrc
 
+clean-local: clean-local-check
+
+.PHONY: clean-local-check
+
+clean-local-check:
+	-rm -rf results
+	-rm .dodsrc
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/ncdap_test/expected3/Makefile.in b/ncdap_test/expected3/Makefile.in
index fedad9e..4965c5d 100644
--- a/ncdap_test/expected3/Makefile.in
+++ b/ncdap_test/expected3/Makefile.in
@@ -170,6 +170,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -197,12 +198,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -237,6 +240,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/ncdap_test/expected4/123.nc.dmp b/ncdap_test/expected4/123.nc.dmp
deleted file mode 100644
index d51553f..0000000
--- a/ncdap_test/expected4/123.nc.dmp
+++ /dev/null
@@ -1,53 +0,0 @@
-netcdf \123 {
-types:
-  compound bears_t {
-    string bears(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // bears_t
-  compound order_t {
-    short order(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // order_t
-  compound shot_t {
-    int shot(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // shot_t
-  compound aloan_t {
-    float aloan(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // aloan_t
-  compound cross_t {
-    double cross(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // cross_t
-dimensions:
-	l = 3 ;
-variables:
-	bears_t bears ;
-	order_t order ;
-	shot_t shot ;
-	aloan_t aloan ;
-	cross_t cross ;
-	short l(l) ;
-
-// global attributes:
-		string :history = "This is an example of a multi-line global\\012attribute.  It could be used for representing the\\012processing history of the data, for example." ;
-data:
-
- bears = {{"ind", "ist", "ing", "uis", "hab", "le"}, {10, 20}, {2, 4, 6}} ;
-
- order = {{1, 2, 3, 4, 5, 6}, {10, 20}, {2, 4, 6}} ;
-
- shot = {{2, 3, 4, 5, 6, 7}, {10, 20}, {2, 4, 6}} ;
-
- aloan = {{3, 4, 5, 6, 7, 1e+12}, {10, 20}, {2, 4, 6}} ;
-
- cross = {{4, 5, 0.000244140625, 7, 8, 10000000000}, {10, 20}, {2, 4, 6}} ;
-
- l = 10, 9, 8 ;
-}
diff --git a/ncdap_test/expected4/123bears.nc.dmp b/ncdap_test/expected4/123bears.nc.dmp
deleted file mode 100644
index 7b2a97a..0000000
--- a/ncdap_test/expected4/123bears.nc.dmp
+++ /dev/null
@@ -1,53 +0,0 @@
-netcdf \123bears {
-types:
-  compound bears_t {
-    string bears(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // bears_t
-  compound order_t {
-    short order(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // order_t
-  compound shot_t {
-    int shot(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // shot_t
-  compound aloan_t {
-    float aloan(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // aloan_t
-  compound cross_t {
-    double cross(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // cross_t
-dimensions:
-	l = 3 ;
-variables:
-	bears_t bears ;
-	order_t order ;
-	shot_t shot ;
-	aloan_t aloan ;
-	cross_t cross ;
-	short l(l) ;
-
-// global attributes:
-		string :history = "This is an example of a multi-line global\\012attribute.  It could be used for representing the\\012processing history of the data, for example." ;
-data:
-
- bears = {{"ind", "ist", "ing", "uis", "hab", "le"}, {10, 20}, {2, 4, 6}} ;
-
- order = {{1, 2, 3, 4, 5, 6}, {10, 20}, {2, 4, 6}} ;
-
- shot = {{2, 3, 4, 5, 6, 7}, {10, 20}, {2, 4, 6}} ;
-
- aloan = {{3, 4, 5, 6, 7, 1e+12}, {10, 20}, {2, 4, 6}} ;
-
- cross = {{4, 5, 0.000244140625, 7, 8, 10000000000}, {10, 20}, {2, 4, 6}} ;
-
- l = 10, 9, 8 ;
-}
diff --git a/ncdap_test/expected4/1990-S1700101.HDF.WVC_Lat.dmp b/ncdap_test/expected4/1990-S1700101.HDF.WVC_Lat.dmp
deleted file mode 100644
index 596c57f..0000000
--- a/ncdap_test/expected4/1990-S1700101.HDF.WVC_Lat.dmp
+++ /dev/null
@@ -1,37 +0,0 @@
-netcdf \1990-S1700101.HDF {
-types:
-  compound NSCAT%20Rev%2017_t {
-    short WVC_Lat(558, 24) ;
-  }; // NSCAT%20Rev%2017_t
-variables:
-	NSCAT%20Rev%2017_t NSCAT%20Rev%2017 ;
-
-// global attributes:
-		string :Producer_Agency = "NASA\\000" ;
-		string :Producer_Institution = "JPL\\000" ;
-		string :Sensor_Name = "NSCAT\\000" ;
-		string :Project_ID = "NSCAT\\000" ;
-		string :SIS_ID = "697-512-23/1994-08-29\\000" ;
-		string :Build_ID = "SciSim 3.0\\000" ;
-		string :ADEOS_Data_Package_ID = "SIMULATED DATA PRODUCT TEST\\000" ;
-		string :ADEOS_Data_Package_Type = "S\\000" ;
-		string :Product_Creation_Time = "1995-278T23:30:04.000\\000" ;
-		string :Data_Type = "L17\\000" ;
-		string :Data_Status = "COMPLETE\\000" ;
-		:First_Rev_Number = 101 ;
-		string :First_Rev_Eq_Crossing_Time = "1996-215T01:31:07.223\\000" ;
-		:First_Rev_Eq_Crossing_Lon = 54.952f ;
-		string :First_Data_Time = "1996-215T01:13:28.456\\000" ;
-		string :Last_Data_Time = "1996-215T02:40:22.631\\000" ;
-		:Num_Expected_Output_Records = 558 ;
-		:Num_Actual_Output_Records = 558 ;
-		string :HDF_Build_ID = "JPL D-xxxxx 12/15/94\\000" ;
-		string :HDF_SIS_ID = "JPL D-12059 12/15/94\\000" ;
-		string :HDF_Conversion_Organization = "JPL PO.DAAC\\000" ;
-		string :HDF_Conversion_Time = "1996-047T11:13:05       " ;
-		string :Data_Format_Type = "HDF\\000" ;
-data:
-
- NSCAT%20Rev%2017 = 
-    {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5831, -5813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5794, -5774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5791, -5772, -5755, -5733, 0, 0, 0, 0 [...]
-}
diff --git a/ncdap_test/expected4/1998-6-avhrr.dat.dmp b/ncdap_test/expected4/1998-6-avhrr.dat.dmp
deleted file mode 100644
index ae2d0c8..0000000
--- a/ncdap_test/expected4/1998-6-avhrr.dat.dmp
+++ /dev/null
@@ -1,22 +0,0 @@
-netcdf \1998-6-avhrr {
-types:
-  compound GSO_AVHRR_record_t {
-    string satellite ;
-    int year ;
-    int day_num ;
-    int hh ;
-    int mm ;
-    int ss ;
-    string DODS_URL ;
-  }; // GSO_AVHRR_record_t
-  GSO_AVHRR_record_t(*) GSO_AVHRR_t ;
-variables:
-	GSO_AVHRR_t GSO_AVHRR ;
-
-// global attributes:
-		string :Server = "DODS FreeFrom based on FFND release 4.2.3" ;
-data:
-
- GSO_AVHRR = 
-    {{"f", 98, 152, 7, 45, 33, "http://dods.gso.uri.edu/cgi-bin/nph-dsp/avhrr/1998/6/f98152074533.pvu.Z"}, {"f", 98, 152, 19, 11, 2, "http://dods.gso.uri.edu/cgi-bin/nph-dsp/avhrr/1998/6/f98152191102.pvu.Z"}, {"f", 98, 153, 18, 59, 32, "http://dods.gso.uri.edu/cgi-bin/nph-dsp/avhrr/1998/6/f98153185932.pvu.Z"}, {"f", 98, 154, 7, 23, 29, "http://dods.gso.uri.edu/cgi-bin/nph-dsp/avhrr/1998/6/f98154072329.pvu.Z"}, {"f", 98, 154, 18, 48, 19, "http://dods.gso.uri.edu/cgi-bin/nph-dsp/avhrr/1998 [...]
-}
diff --git a/ncdap_test/expected4/D1.dmp b/ncdap_test/expected4/D1.dmp
deleted file mode 100644
index 22e9891..0000000
--- a/ncdap_test/expected4/D1.dmp
+++ /dev/null
@@ -1,16 +0,0 @@
-netcdf D1 {
-types:
-  compound Drifters_record_t {
-    string instrument_id ;
-    string location ;
-    double latitude ;
-    double longitude ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-variables:
-	Drifters_t Drifters ;
-data:
-
- Drifters = 
-    {{"This is a data test string (pass 0).", "This is a data test string (pass 1).", 1000, 999.950000416665}, {"This is a data test string (pass 2).", "This is a data test string (pass 3).", 999.800006666578, 999.550033748988}, {"This is a data test string (pass 4).", "This is a data test string (pass 5).", 999.200106660978, 998.750260394966}, {"This is a data test string (pass 6).", "This is a data test string (pass 7).", 998.200539935204, 997.55100025328}, {"This is a data test string [...]
-}
diff --git a/ncdap_test/expected4/Drifters.dmp b/ncdap_test/expected4/Drifters.dmp
deleted file mode 100644
index 7ccbd18..0000000
--- a/ncdap_test/expected4/Drifters.dmp
+++ /dev/null
@@ -1,31 +0,0 @@
-netcdf Drifters {
-types:
-  compound Drifters_record_t {
-    string Drifter_ID ;
-    string Date_Sampled ;
-    double Latitude ;
-    double Longitude ;
-    double SST ;
-    double Ed_490 ;
-    double Lu_412 ;
-    double Lu_443 ;
-    double Lu_490 ;
-    double Lu_510 ;
-    double Lu_555 ;
-    double Lu_670 ;
-    double Lu_683 ;
-    double CHL ;
-    double FLH ;
-    string Region ;
-    double Decimal_Day ;
-    string Calibration_File ;
-    string Drifter_Type ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-variables:
-	Drifters_t Drifters ;
-data:
-
- Drifters = 
-    {{"This is a data test string (pass 0).", "This is a data test string (pass 1).", 1000, 999.950000416665, 999.800006666578, 999.550033748988, 999.200106660978, 998.750260394966, 998.200539935204, 997.55100025328, 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697, 992.808635853866, "This is a data test string (pass 2).", 991.561893714788, "This is a data test string (pass 3).", "This is a data test string (pass 4)."}, {"This is a data test string (pass 5).", "This [...]
-}
diff --git a/ncdap_test/expected4/EOSDB.dmp b/ncdap_test/expected4/EOSDB.dmp
deleted file mode 100644
index 613414e..0000000
--- a/ncdap_test/expected4/EOSDB.dmp
+++ /dev/null
@@ -1,129 +0,0 @@
-netcdf EOSDB {
-types:
-  compound Abbott_Image_Data_record_t {
-    string Image_Name ;
-    string Date_Sampled ;
-    double North_Latitude ;
-    double South_Latitude ;
-    double West_Longitude ;
-    double East_Longitude ;
-    string Version ;
-    int Julian_Date ;
-    string PI ;
-    string Algorithm_Code ;
-    string Project ;
-    string Comments ;
-  }; // Abbott_Image_Data_record_t
-  Abbott_Image_Data_record_t(*) Abbott_Image_Data_t ;
-  compound Sat_Images_record_t {
-    string Image_Name ;
-    string Date_Sampled ;
-    double North_Latitude ;
-    double South_Latitude ;
-    double West_Longitude ;
-    double East_Longintude ;
-    string Version ;
-    string Satellite ;
-    string Instrument ;
-    string Channel ;
-    string Resolution ;
-    int Image_Size ;
-    string Image_Type ;
-    int Image_Bits_Per_Pixel ;
-    int Image_Width ;
-    int Image_Height ;
-    ubyte Image(1000) ;
-    int Raw_Image_Size ;
-    ubyte Raw_Image_Data(1000) ;
-    int Year ;
-    string Month ;
-    int Day ;
-    int Hour ;
-  }; // Sat_Images_record_t
-  Sat_Images_record_t(*) Sat_Images_t ;
-  compound Drifters_record_t {
-    string Instrument_ID ;
-    double Battery ;
-    double Checksum ;
-    double Date_Age ;
-    double Ed490 ;
-    double Ed490_stdev ;
-    double Latitude ;
-    double Longitude ;
-    double Lu412 ;
-    double Lu412_stdev ;
-    double Lu443 ;
-    double Lu443_stdev ;
-    double Lu490 ;
-    double Lu490_stdev ;
-    double Lu510 ;
-    double Lu510_stdev ;
-    double Lu555 ;
-    double Lu555_stdev ;
-    double Lu670 ;
-    double Lu670_stdev ;
-    double Lu683 ;
-    double Lu683_stdev ;
-    double Max_Depth ;
-    double Night_Len ;
-    double Number_Samples ;
-    double Num_Aves ;
-    double Press_Volts ;
-    double Sea_Surface_Temperature ;
-    double Sub_Wait ;
-    double Surf_Volts ;
-    double Surface_Average ;
-    double Surface_Percent ;
-    double Julian_Greenwich ;
-    double Sun_Angle ;
-    int Optical_Flag ;
-    int Sampling_Flag ;
-    int Tracking_Flag ;
-    int Hand_Checked_Flag ;
-    double Julian_Local_Time ;
-    string Date_Greenwich ;
-    string Date_Local_Time ;
-    string DateStamp ;
-    string algo_code ;
-    int GPS_hour ;
-    double GPS_lat ;
-    double GPS_lon ;
-    double rel1_lat ;
-    double rel1_lon ;
-    double rel2_lat ;
-    double rel2_lon ;
-    int time_to_1st_fix ;
-    int message_ID ;
-    int max_GPS_volt ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-  compound Instrument_record_t {
-    string Instrument_ID ;
-    string Instrument_Type ;
-    string Sensor_Platform_ID ;
-    string Comment ;
-  }; // Instrument_record_t
-  Instrument_record_t(*) Instrument_t ;
-variables:
-	Abbott_Image_Data_t Abbott_Image_Data ;
-	Sat_Images_t Sat_Images ;
-	Drifters_t Drifters ;
-	Instrument_t Instrument ;
-
-// global attributes:
-		string :history = "FERRET V4.11 (debug/no GUI) 19-Nov-95FERRET V4.20 (debug/no GUI) 12-Mar-96" ;
-		string :title = "COADS Surface Marine Observations (1854-1993)" ;
-data:
-
- Abbott_Image_Data = 
-    {{"This is a data test string (pass 0).", "This is a data test string (pass 1).", 1000, 999.950000416665, 999.800006666578, 999.550033748988, "This is a data test string (pass 2).", 1, "This is a data test string (pass 3).", "This is a data test string (pass 4).", "This is a data test string (pass 5).", "This is a data test string (pass 6)."}, {"This is a data test string (pass 7).", "This is a data test string (pass 8).", 999.200106660978, 998.750260394966, 998.200539935204, 997.551 [...]
-
- Sat_Images = 
-    {{"This is a data test string (pass 35).", "This is a data test string (pass 36).", 980.066577841242, 978.030914724148, 975.897449330605, 973.666395005375, "This is a data test string (pass 37).", "This is a data test string (pass 38).", "This is a data test string (pass 39).", "This is a data test string (pass 40).", "This is a data test string (pass 41).", 13, "This is a data test string (pass 42).", 21, 34, 55, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, [...]
-
- Drifters = 
-    {{"This is a data test string (pass 80).", 921.060994002885, 917.120822816605, 913.088940312308, 908.965749674885, 904.751663219963, 900.447102352677, 896.052497525525, 891.568288195329, 886.994922779284, 882.332858610121, 877.582561890373, 872.744507645751, 867.81917967765, 862.807070514761, 857.708681363824, 852.524522059506, 847.255111013416, 841.900975162269, 836.462649915187, 830.940679100163, 825.335614909678, 819.648017845479, 813.878456662534, 808.027508312152, 802.0957578842 [...]
-
- Instrument = 
-    {{"This is a data test string (pass 105).", "This is a data test string (pass 106).", "This is a data test string (pass 107).", "This is a data test string (pass 108)."}, {"This is a data test string (pass 109).", "This is a data test string (pass 110).", "This is a data test string (pass 111).", "This is a data test string (pass 112)."}, {"This is a data test string (pass 113).", "This is a data test string (pass 114).", "This is a data test string (pass 115).", "This is a data test [...]
-}
diff --git a/ncdap_test/expected4/Makefile.am b/ncdap_test/expected4/Makefile.am
deleted file mode 100644
index afb4391..0000000
--- a/ncdap_test/expected4/Makefile.am
+++ /dev/null
@@ -1,35 +0,0 @@
-## This is a automake file, part of Unidata's netCDF package.
-# Copyright 2007, see the COPYRIGHT file for more information.
-
-# This is to include the libnc-dap test comparison files
-
-# $Id: Makefile.am,v 1.4 2009/11/20 03:06:37 dmh Exp $
-EXTRA_DIST=\
-123bears.nc.dmp 123.nc.dmp 1990-S1700101.HDF.WVC_Lat.dmp \
-1998-6-avhrr.dat.dmp b31a.dmp b31.dmp \
-bears.nc.dmp ber-2002-10-01.nc.dmp ceopL2AIRS2-2.nc.dmp \
-D1.dmp data.nc.dmp Drifters.dmp \
-EOSDB.dmp fnoc1.nc.dmp in1.nc.dmp \
-in_2.nc.dmp ingrid.dmp in.nc.dmp \
-in_no_three_double_dmn.nc.dmp in_v.nc.dmp nestedDAS.dmp \
-NestedSeq2.dmp NestedSeq.dmp OverideExample.dmp \
-pbug0001b.dmp saco1.nc.dmp SimpleDrdsExample.dmp \
-synth1.dmp synth2.dmp synth3.dmp \
-synth4.dmp synth5.dmp synth6.dmp \
-synth7.dmp synth8.dmp test.01.dmp \
-test.02.dmp test.03.dmp test.04.dmp \
-test.05.dmp test.06a.dmp test.07a.dmp \
-test.07.dmp test.21.dmp test.22.dmp \
-test.23.dmp test.31.dmp test.50.dmp \
-test.53.dmp test.55.dmp test.56.dmp \
-test.57.dmp test.66.dmp test.67.dmp \
-test.68.dmp test.69.dmp test.an1.dmp \
-test.dfp1.dmp test.dfr1.dmp test.dfr2.dmp \
-test.dfr3.dmp test.gr1.dmp test.gr2.dmp \
-test.gr3.dmp test.gr4.dmp test.gr5.dmp \
-test.nc.dmp test.PointFile.dmp test.sds1.dmp \
-test.sds2.dmp test.sds3.dmp test.sds4.dmp \
-test.sds5.dmp test.sds6.dmp test.sds7.dmp \
-test.vs1.dmp test.vs2.dmp test.vs3.dmp \
-test.vs4.dmp test.vs5.dmp text.nc.dmp \
-whoi.dmp CMakeLists.txt
diff --git a/ncdap_test/expected4/Makefile.in b/ncdap_test/expected4/Makefile.in
deleted file mode 100644
index 8cadbb3..0000000
--- a/ncdap_test/expected4/Makefile.in
+++ /dev/null
@@ -1,528 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright 2007, see the COPYRIGHT file for more information.
-
-# This is to include the libnc-dap test comparison files
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-subdir = ncdap_test/expected4
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_ at AM_V@)
-am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_ at AM_V@)
-am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_ at AM_V@)
-am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_CFLAGS = @AM_CFLAGS@
-AM_CPPFLAGS = @AM_CPPFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_LDFLAGS = @AM_LDFLAGS@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BINFILE_NAME = @BINFILE_NAME@
-BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-CONFIG_DATE = @CONFIG_DATE@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DOT = @DOT@
-DOXYGEN = @DOXYGEN@
-DOXYGEN_CSS_FILE = @DOXYGEN_CSS_FILE@
-DOXYGEN_HEADER_FILE = @DOXYGEN_HEADER_FILE@
-DOXYGEN_SEARCHENGINE = @DOXYGEN_SEARCHENGINE@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-HAS_DAP = @HAS_DAP@
-HAS_DISKLESS = @HAS_DISKLESS@
-HAS_HDF4 = @HAS_HDF4@
-HAS_HDF5 = @HAS_HDF5@
-HAS_JNA = @HAS_JNA@
-HAS_LOGGING = @HAS_LOGGING@
-HAS_MMAP = @HAS_MMAP@
-HAS_NC2 = @HAS_NC2@
-HAS_NC4 = @HAS_NC4@
-HAS_PARALLEL = @HAS_PARALLEL@
-HAS_PARALLEL4 = @HAS_PARALLEL4@
-HAS_PNETCDF = @HAS_PNETCDF@
-HAS_SZLIB = @HAS_SZLIB@
-HAVE_DOT = @HAVE_DOT@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
-NC_HAS_DAP = @NC_HAS_DAP@
-NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
-NC_HAS_HDF4 = @NC_HAS_HDF4@
-NC_HAS_HDF5 = @NC_HAS_HDF5@
-NC_HAS_JNA = @NC_HAS_JNA@
-NC_HAS_MMAP = @NC_HAS_MMAP@
-NC_HAS_NC2 = @NC_HAS_NC2@
-NC_HAS_NC4 = @NC_HAS_NC4@
-NC_HAS_PARALLEL = @NC_HAS_PARALLEL@
-NC_HAS_PARALLEL4 = @NC_HAS_PARALLEL4@
-NC_HAS_PNETCDF = @NC_HAS_PNETCDF@
-NC_HAS_SZIP = @NC_HAS_SZIP@
-NC_LIBS = @NC_LIBS@
-NC_M4 = @NC_M4@
-NC_VERSION = @NC_VERSION@
-NC_VERSION_MAJOR = @NC_VERSION_MAJOR@
-NC_VERSION_MINOR = @NC_VERSION_MINOR@
-NC_VERSION_NOTE = @NC_VERSION_NOTE@
-NC_VERSION_PATCH = @NC_VERSION_PATCH@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NOUNDEFINED = @NOUNDEFINED@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SHOW_DOXYGEN_TAG_LIST = @SHOW_DOXYGEN_TAG_LIST@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-enable_shared = @enable_shared@
-enable_static = @enable_static@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-# $Id: Makefile.am,v 1.4 2009/11/20 03:06:37 dmh Exp $
-EXTRA_DIST = \
-123bears.nc.dmp 123.nc.dmp 1990-S1700101.HDF.WVC_Lat.dmp \
-1998-6-avhrr.dat.dmp b31a.dmp b31.dmp \
-bears.nc.dmp ber-2002-10-01.nc.dmp ceopL2AIRS2-2.nc.dmp \
-D1.dmp data.nc.dmp Drifters.dmp \
-EOSDB.dmp fnoc1.nc.dmp in1.nc.dmp \
-in_2.nc.dmp ingrid.dmp in.nc.dmp \
-in_no_three_double_dmn.nc.dmp in_v.nc.dmp nestedDAS.dmp \
-NestedSeq2.dmp NestedSeq.dmp OverideExample.dmp \
-pbug0001b.dmp saco1.nc.dmp SimpleDrdsExample.dmp \
-synth1.dmp synth2.dmp synth3.dmp \
-synth4.dmp synth5.dmp synth6.dmp \
-synth7.dmp synth8.dmp test.01.dmp \
-test.02.dmp test.03.dmp test.04.dmp \
-test.05.dmp test.06a.dmp test.07a.dmp \
-test.07.dmp test.21.dmp test.22.dmp \
-test.23.dmp test.31.dmp test.50.dmp \
-test.53.dmp test.55.dmp test.56.dmp \
-test.57.dmp test.66.dmp test.67.dmp \
-test.68.dmp test.69.dmp test.an1.dmp \
-test.dfp1.dmp test.dfr1.dmp test.dfr2.dmp \
-test.dfr3.dmp test.gr1.dmp test.gr2.dmp \
-test.gr3.dmp test.gr4.dmp test.gr5.dmp \
-test.nc.dmp test.PointFile.dmp test.sds1.dmp \
-test.sds2.dmp test.sds3.dmp test.sds4.dmp \
-test.sds5.dmp test.sds6.dmp test.sds7.dmp \
-test.vs1.dmp test.vs2.dmp test.vs3.dmp \
-test.vs4.dmp test.vs5.dmp text.nc.dmp \
-whoi.dmp CMakeLists.txt
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ncdap_test/expected4/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign ncdap_test/expected4/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	cscopelist-am ctags-am distclean distclean-generic \
-	distclean-libtool distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/ncdap_test/expected4/NestedSeq.dmp b/ncdap_test/expected4/NestedSeq.dmp
deleted file mode 100644
index 0c8b0ae..0000000
--- a/ncdap_test/expected4/NestedSeq.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf NestedSeq {
-types:
-  short(*) stuff_t ;
-  compound person1_record_t {
-    int age ;
-    stuff_t stuff ;
-  }; // person1_record_t
-  person1_record_t(*) person1_t ;
-variables:
-	person1_t person1 ;
-data:
-
- person1 = 
-    {{1, {0, 16, 32, 48, 64}}, {2, {80, 96, 112, 128, 144}}, {3, {160, 176, 192, 208, 224}}, {5, {240, 256, 272, 288, 304}}, {8, {320, 336, 352, 368, 384}}} ;
-}
diff --git a/ncdap_test/expected4/NestedSeq2.dmp b/ncdap_test/expected4/NestedSeq2.dmp
deleted file mode 100644
index 313984f..0000000
--- a/ncdap_test/expected4/NestedSeq2.dmp
+++ /dev/null
@@ -1,35 +0,0 @@
-netcdf NestedSeq2 {
-types:
-  compound person1.stuff_record_t {
-    short foo ;
-    short bar ;
-  }; // person1.stuff_record_t
-  person1.stuff_record_t(*) person1.stuff_t ;
-  compound person1_record_t {
-    int age ;
-    int size ;
-    person1.stuff_t stuff ;
-  }; // person1_record_t
-  person1_record_t(*) person1_t ;
-  compound stuff_record_t {
-    short foo ;
-    short bar ;
-  }; // stuff_record_t
-  stuff_record_t(*) stuff_t ;
-  compound person2_record_t {
-    int age ;
-    stuff_t stuff ;
-    int size ;
-  }; // person2_record_t
-  person2_record_t(*) person2_t ;
-variables:
-	person1_t person1 ;
-	person2_t person2 ;
-data:
-
- person1 = 
-    {{1, 2, {{0, 16}, {32, 48}, {64, 80}, {96, 112}, {128, 144}}}, {3, 5, {{160, 176}, {192, 208}, {224, 240}, {256, 272}, {288, 304}}}, {8, 13, {{320, 336}, {352, 368}, {384, 400}, {416, 432}, {448, 464}}}, {21, 34, {{480, 496}, {512, 528}, {544, 560}, {576, 592}, {608, 624}}}, {55, 89, {{640, 656}, {672, 688}, {704, 720}, {736, 752}, {768, 784}}}} ;
-
- person2 = 
-    {{144, {{800, 816}, {832, 848}, {864, 880}, {896, 912}, {928, 944}}, 233}, {377, {{960, 976}, {992, 1008}, {1024, 1040}, {1056, 1072}, {1088, 1104}}, 610}, {987, {{1120, 1136}, {1152, 1168}, {1184, 1200}, {1216, 1232}, {1248, 1264}}, 1597}, {2584, {{1280, 1296}, {1312, 1328}, {1344, 1360}, {1376, 1392}, {1408, 1424}}, 4181}, {6765, {{1440, 1456}, {1472, 1488}, {1504, 1520}, {1536, 1552}, {1568, 1584}}, 10946}} ;
-}
diff --git a/ncdap_test/expected4/OverideExample.dmp b/ncdap_test/expected4/OverideExample.dmp
deleted file mode 100644
index 988374b..0000000
--- a/ncdap_test/expected4/OverideExample.dmp
+++ /dev/null
@@ -1,25 +0,0 @@
-netcdf OverideExample {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042 [...]
-}
diff --git a/ncdap_test/expected4/SimpleDrdsExample.dmp b/ncdap_test/expected4/SimpleDrdsExample.dmp
deleted file mode 100644
index b5d3686..0000000
--- a/ncdap_test/expected4/SimpleDrdsExample.dmp
+++ /dev/null
@@ -1,62 +0,0 @@
-netcdf SimpleDrdsExample {
-types:
-  compound Drifters_record_t {
-    double battery ;
-    double checksum ;
-    double data_age ;
-    double ed490 ;
-    double ed490_stdev ;
-    string instrument_id ;
-    double flag_argos ;
-    double flag_gps ;
-    double flag_optical ;
-    double flag_sampling ;
-    double flag_tracking ;
-    double gpshour ;
-    double gpslat ;
-    double gpslon ;
-    double latitude ;
-    string location ;
-    double longitude ;
-    double lu412 ;
-    double lu412_stdev ;
-    double lu443 ;
-    double lu443_stdev ;
-    double lu490 ;
-    double lu490_stdev ;
-    double lu510 ;
-    double lu510_stdev ;
-    double lu555 ;
-    double lu555_stdev ;
-    double lu670 ;
-    double lu670_stdev ;
-    double lu683 ;
-    double lu683_stdev ;
-    double max_depth ;
-    double night_len ;
-    double nsamp ;
-    double numaves ;
-    double press_volts ;
-    double rellat1hr ;
-    double rellat2hr ;
-    double rellon1hr ;
-    double rellon2hr ;
-    double sst ;
-    double sub_wait ;
-    double surf_volts ;
-    double surface_average ;
-    double surface_percent ;
-    double time ;
-    double ttff ;
-    double maxgps ;
-    double rellat3hr ;
-    double rellon3hr ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-variables:
-	Drifters_t Drifters ;
-data:
-
- Drifters = 
-    {{1000, 999.950000416665, 999.800006666578, 999.550033748988, 999.200106660978, "This is a data test string (pass 0).", 998.750260394966, 998.200539935204, 997.55100025328, 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697, 992.808635853866, 991.561893714788, "This is a data test string (pass 1).", 990.215996212637, 988.771077936042, 987.227283375627, 985.584766909561, 983.843692788121, 982.00423511727, 980.066577841242, 978.030914724148, 975.897449330605, 973.66 [...]
-}
diff --git a/ncdap_test/expected4/b31.dmp b/ncdap_test/expected4/b31.dmp
deleted file mode 100644
index 1d5f1aa..0000000
--- a/ncdap_test/expected4/b31.dmp
+++ /dev/null
@@ -1,20 +0,0 @@
-netcdf b31 {
-types:
-  compound b31_record_t {
-    double id ;
-    string class ;
-    string text ;
-  }; // b31_record_t
-  b31_record_t(*) b31_t ;
-variables:
-	b31_t b31 ;
-	int b32 ;
-		string b32:billy = "Bob is my real name" ;
-		string b32:Robert = "Really wants to be called Billy" ;
-data:
-
- b31 = 
-    {{1000, "This is a data test string (pass 0).", "This is a data test string (pass 1)."}, {999.950000416665, "This is a data test string (pass 2).", "This is a data test string (pass 3)."}, {999.800006666578, "This is a data test string (pass 4).", "This is a data test string (pass 5)."}, {999.550033748988, "This is a data test string (pass 6).", "This is a data test string (pass 7)."}, {999.200106660978, "This is a data test string (pass 8).", "This is a data test string (pass 9)."}} ;
-
- b32 = 1 ;
-}
diff --git a/ncdap_test/expected4/b31a.dmp b/ncdap_test/expected4/b31a.dmp
deleted file mode 100644
index 5e5a5fc..0000000
--- a/ncdap_test/expected4/b31a.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf b31a {
-types:
-  compound b31_record_t {
-    double id ;
-    string class ;
-    string text ;
-  }; // b31_record_t
-  b31_record_t(*) b31_t ;
-variables:
-	b31_t b31 ;
-data:
-
- b31 = 
-    {{1000, "This is a data test string (pass 0).", "This is a data test string (pass 1)."}, {999.950000416665, "This is a data test string (pass 2).", "This is a data test string (pass 3)."}, {999.800006666578, "This is a data test string (pass 4).", "This is a data test string (pass 5)."}, {999.550033748988, "This is a data test string (pass 6).", "This is a data test string (pass 7)."}, {999.200106660978, "This is a data test string (pass 8).", "This is a data test string (pass 9)."}} ;
-}
diff --git a/ncdap_test/expected4/bears.nc.dmp b/ncdap_test/expected4/bears.nc.dmp
deleted file mode 100644
index eed1773..0000000
--- a/ncdap_test/expected4/bears.nc.dmp
+++ /dev/null
@@ -1,53 +0,0 @@
-netcdf bears {
-types:
-  compound bears_t {
-    string bears(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // bears_t
-  compound order_t {
-    short order(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // order_t
-  compound shot_t {
-    int shot(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // shot_t
-  compound aloan_t {
-    float aloan(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // aloan_t
-  compound cross_t {
-    double cross(2, 3) ;
-    int i(2) ;
-    float j(3) ;
-  }; // cross_t
-dimensions:
-	l = 3 ;
-variables:
-	bears_t bears ;
-	order_t order ;
-	shot_t shot ;
-	aloan_t aloan ;
-	cross_t cross ;
-	short l(l) ;
-
-// global attributes:
-		string :history = "This is an example of a multi-line global\\012attribute.  It could be used for representing the\\012processing history of the data, for example." ;
-data:
-
- bears = {{"ind", "ist", "ing", "uis", "hab", "le"}, {10, 20}, {2, 4, 6}} ;
-
- order = {{1, 2, 3, 4, 5, 6}, {10, 20}, {2, 4, 6}} ;
-
- shot = {{2, 3, 4, 5, 6, 7}, {10, 20}, {2, 4, 6}} ;
-
- aloan = {{3, 4, 5, 6, 7, 1e+12}, {10, 20}, {2, 4, 6}} ;
-
- cross = {{4, 5, 0.000244140625, 7, 8, 10000000000}, {10, 20}, {2, 4, 6}} ;
-
- l = 10, 9, 8 ;
-}
diff --git a/ncdap_test/expected4/ber-2002-10-01.nc.dmp b/ncdap_test/expected4/ber-2002-10-01.nc.dmp
deleted file mode 100644
index d06e01d..0000000
--- a/ncdap_test/expected4/ber-2002-10-01.nc.dmp
+++ /dev/null
@@ -1,38 +0,0 @@
-netcdf ber-2002-10-01 {
-types:
-  compound TSurfAir_t {
-    float TSurfAir(2, 10, 10) ;
-    double time(2) ;
-    double latitude(10) ;
-    double longitude(10) ;
-  }; // TSurfAir_t
-  compound Delta_Time_t {
-    double Delta_Time(2, 10, 10) ;
-    double time(2) ;
-    double latitude(10) ;
-    double longitude(10) ;
-  }; // Delta_Time_t
-  compound time_bnds_t {
-    double time_bnds(2, 2) ;
-    double time(2) ;
-    int nv(2) ;
-  }; // time_bnds_t
-variables:
-	TSurfAir_t TSurfAir ;
-	Delta_Time_t Delta_Time ;
-	time_bnds_t time_bnds ;
-
-// global attributes:
-		string :Conventions = "CF-1.0" ;
-		string :Institution = "CSISS,GMU" ;
-data:
-
- TSurfAir = 
-    {{274.2136, 274.2136, 274.2136, 274.2136, 273.5546, 273.9831, 273.9831, 273.9831, 273.9831, 273.9831, 274.2136, 274.2136, 274.2136, 274.2136, 273.5546, 273.5546, 273.5546, 273.9831, 273.9831, 274.2321, 274.2136, 274.2136, 274.2136, 274.2136, 273.5546, 273.5546, 273.5546, 273.5546, 274.2321, 274.2321, 274.2136, 274.2136, 274.2136, 274.2136, 272.9281, 272.9281, 273.5546, 273.5546, 273.7883, 274.2321, 271.0015, 271.0015, 274.2136, 271.3818, 272.9281, 272.9281, 272.9281, 273.7883, 273.78 [...]
-
- Delta_Time = 
-    {{29622.5192610025, 29622.5192610025, 29622.5192610025, 29622.5192610025, 29614.4520000219, 29606.4520000219, 29606.4520000219, 29606.4520000219, 29606.4520000219, 29606.4520000219, 29622.5192610025, 29622.5192610025, 29622.5192610025, 29622.5192610025, 29614.4520000219, 29614.4520000219, 29614.4520000219, 29606.4520000219, 29606.4520000219, 29614.3847849965, 29622.5192610025, 29622.5192610025, 29622.5192610025, 29622.5192610025, 29614.4520000219, 29614.4520000219, 29614.4520000219,  [...]
-
- time_bnds = 
-    {{307559753.548, 307619046.452, 307611681.615199, 307653518.384801}, {307589400, 307632600}, {0, 1}} ;
-}
diff --git a/ncdap_test/expected4/ceopL2AIRS2-2.nc.dmp b/ncdap_test/expected4/ceopL2AIRS2-2.nc.dmp
deleted file mode 100644
index 4ea66c6..0000000
--- a/ncdap_test/expected4/ceopL2AIRS2-2.nc.dmp
+++ /dev/null
@@ -1,1141 +0,0 @@
-netcdf ceopL2AIRS2-2 {
-dimensions:
-	H2OPressureLay = 14 ;
-	latitude = 20 ;
-	longitude = 20 ;
-	nv = 2 ;
-	time = 1 ;
-variables:
-	double longitude(longitude) ;
-		string longitude:units = "degrees_east" ;
-		string longitude:standard_name = "longitude" ;
-		string longitude:axis = "X" ;
-		string longitude:long_name = "longitude" ;
-	double latitude(latitude) ;
-		string latitude:units = "degrees_north" ;
-		string latitude:standard_name = "latitude" ;
-		string latitude:axis = "Y" ;
-		string latitude:long_name = "latitude" ;
-	int H2OPressureLay(H2OPressureLay, nv) ;
-		string H2OPressureLay:long_name = "H2OPressureLay" ;
-		string H2OPressureLay:axis = "Z" ;
-		string H2OPressureLay:units = "mph" ;
-	int time(time) ;
-		string time:long_name = "time" ;
-		string time:axis = "T" ;
-		string time:units = "days since 1970-01-01" ;
-	float H2OMMRStd_Orbit_1735(time, H2OPressureLay, latitude, longitude) ;
-		H2OMMRStd_Orbit_1735:_FillValue = -1.f ;
-		string H2OMMRStd_Orbit_1735:unit = "gm/kg" ;
-		string H2OMMRStd_Orbit_1735:H2OPressureLay_ = "1100-1000,1000-925,925-850,850-700,700-600,600-500,500-400,400-300,300-250,250-200,200-150,150-100,100-70,70-50" ;
-		string H2OMMRStd_Orbit_1735:long_name = "H2OMMRStd_Orbit_1735" ;
-		string H2OMMRStd_Orbit_1735:GCTP_Projection_Name = "Geographic" ;
-		string H2OMMRStd_Orbit_1735:GCTP_Spheroid_Name = "Clarke 1866" ;
-	float H2OMMRStd_Orbit_1742(time, H2OPressureLay, latitude, longitude) ;
-		H2OMMRStd_Orbit_1742:_FillValue = -1.000001f ;
-		string H2OMMRStd_Orbit_1742:unit = "gm/kg" ;
-		string H2OMMRStd_Orbit_1742:H2OPressureLay_ = "1100-1000,1000-925,925-850,850-700,700-600,600-500,500-400,400-300,300-250,250-200,200-150,150-100,100-70,70-50" ;
-		string H2OMMRStd_Orbit_1742:long_name = "H2OMMRStd_Orbit_1742" ;
-		string H2OMMRStd_Orbit_1742:GCTP_Projection_Name = "Geographic" ;
-		string H2OMMRStd_Orbit_1742:GCTP_Spheroid_Name = "Clarke 1866" ;
-
-// global attributes:
-		string :Conventions = "CF-1.0" ;
-		string :Institution = "CSISS,GMU" ;
-data:
-
- longitude = -99.865, -99.615, -99.365, -99.115, -98.865, -98.615, -98.365, 
-    -98.115, -97.865, -97.615, -97.365, -97.115, -96.865, -96.615, -96.365, 
-    -96.115, -95.865, -95.615, -95.365, -95.115 ;
-
- latitude = 38.985, 38.735, 38.485, 38.235, 37.985, 37.735, 37.485, 37.235, 
-    36.985, 36.735, 36.485, 36.235, 35.985, 35.735, 35.485, 35.235, 34.985, 
-    34.735, 34.485, 34.235 ;
-
- H2OPressureLay =
-  1100, 1000,
-  1000, 925,
-  925, 850,
-  850, 700,
-  700, 600,
-  600, 500,
-  500, 400,
-  400, 300,
-  300, 250,
-  250, 200,
-  200, 150,
-  150, 100,
-  100, 70,
-  70, 50 ;
-
- time = 11929 ;
-
- H2OMMRStd_Orbit_1735 =
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, 10.42683, _, _, 10.50696, _, _, _, _, _, _, _, 
-    10.56056,
-  _, _, _, 12.80856, _, 12.53336, _, _, _, _, _, _, _, _, 10.79308, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, _, 10.73799, _, 10.32333, _, _, _, _, _, _, _, 
-    11.27027, _,
-  _, _, _, _, 11.43723, _, _, _, _, _, _, _, _, _, 10.72748, _, _, _, _, _,
-  _, _, _, _, _, _, _, 11.73406, _, _, 10.41096, _, _, _, _, _, _, 11.3389, 
-    _, _,
-  _, _, _, _, 11.82485, _, _, _, _, _, _, _, _, 10.39163, _, _, _, _, _, _,
-  _, _, _, _, _, _, 10.89853, _, _, 11.66459, _, _, _, _, _, _, 11.35826, _, 
-    _, _,
-  _, _, _, 11.95294, _, _, 12.85001, _, _, _, _, _, 11.58182, _, _, 11.48493, 
-    _, _, _, _,
-  12.63652, _, _, _, _, _, _, _, 12.44498, _, _, _, _, _, _, _, _, _, _, 
-    12.52124,
-  _, _, 12.86209, _, _, 11.68635, _, _, _, _, _, 11.64139, _, _, _, 11.40699, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 12.62054, _, _, 12.03271, _, _, _, _, _, _, _, 
-    11.11348,
-  _, _, _, _, 12.85148, _, _, _, _, _, _, _, _, _, 11.59873, _, _, _, _, _,
-  _, _, _, _, _, _, _, 12.63671, _, _, 11.81004, _, _, _, _, _, _, _, 
-    11.73362, _,
-  _, _, _, 12.47033, _, _, _, _, _, _, _, _, _, 11.85189, _, _, _, _, _, _,
-  _, _, _, _, _, _, 13.5238, _, _, 11.49611, _, _, _, _, _, _, _, 11.82039, 
-    _, _,
-  12.64256, _, _, 10.61772, _, _, _, _, _, _, _, _, _, 11.55755, _, _, _, _, 
-    _, _,
-  13.49446, _, _, _, _, 11.76018, _, _, 11.84233, _, _, _, _, _, _, _, 
-    11.58694, _, _, _,
-  _, _, 12.71752, _, _, 12.82097, _, _, _, _, _, _, 11.63417, _, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, _, 10.14486, _, _, _, _, _, _, _, 12.36346, _, _, _,
-  _, 12.72816, _, _, 13.71777, _, _, _, _, _, _, 11.91062, _, _, _, 11.59973, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 9.772367, _, _, 9.194705, _, _, _, _, _, _, _, 
-    8.683325,
-  10.35767, _, _, 10.68043, _, 10.18837, _, _, _, _, _, _, _, _, 9.048093, _, 
-    _, _, _, _,
-  10.18949, _, _, _, _, _, _, _, 10.30815, _, 9.592661, _, _, _, _, _, _, _, 
-    9.373028, _,
-  _, _, 9.146196, _, 9.810217, _, _, _, _, _, _, _, _, _, 9.358518, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 10.23776, _, _, 9.660467, _, _, _, _, _, _, 9.624987, 
-    _, _,
-  _, 10.56269, _, _, 10.60803, _, _, _, _, _, _, _, _, 9.116282, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 10.73553, _, _, 10.14109, _, _, _, _, _, _, 9.459518, _, 
-    _, _,
-  _, 10.21269, _, 10.68794, _, _, 12.32669, _, _, _, _, _, 10.68715, _, _, 
-    9.579394, _, _, _, _,
-  10.92445, _, _, _, _, _, _, _, 11.65137, _, _, _, _, _, _, _, _, _, _, 
-    10.15341,
-  _, _, 10.98302, _, _, 10.09634, _, _, _, _, _, 10.3263, _, _, _, 9.548866, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 11.66984, _, _, 10.2735, _, _, _, _, _, _, _, 
-    10.53038,
-  _, _, 12.02855, _, 13.01514, _, _, _, _, _, _, _, _, _, 9.876745, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 11.80927, _, _, 10.25012, _, _, _, _, _, _, _, 
-    10.49022, _,
-  _, 13.92397, _, 14.31709, _, _, _, _, _, _, _, _, _, 10.16798, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 12.20892, _, _, 10.36588, _, _, _, _, _, _, _, 9.964018, 
-    _, _,
-  11.79558, _, _, 13.02969, _, _, _, _, _, _, _, _, _, 9.703039, _, _, _, _, 
-    _, _,
-  11.58657, _, _, _, _, 11.06567, _, _, 9.924013, _, _, _, _, _, _, _, 
-    9.357682, _, _, _,
-  _, _, 11.74401, _, _, 11.24235, _, _, _, _, _, _, 9.304838, _, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, _, 7.050066, _, _, _, _, _, _, _, 10.15053, _, _, _,
-  _, 13.24752, _, _, 11.99925, _, _, _, _, _, _, 9.49575, _, _, _, 9.066326, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 8.918771, _, _, 7.158425, _, _, _, _, _, _, _, 
-    5.771627,
-  7.256557, _, _, 8.523567, _, 8.7319, _, _, _, _, _, _, _, _, 6.294191, _, 
-    _, _, _, _,
-  7.559494, _, _, _, _, _, _, _, 9.083248, _, 7.687873, _, _, _, _, _, _, _, 
-    6.267635, _,
-  _, _, 8.126592, _, 8.317467, _, _, _, _, _, _, _, _, _, 6.758687, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 9.071494, _, _, 7.74412, _, _, _, _, _, _, 6.747161, 
-    _, _,
-  _, 8.175607, _, _, 8.297558, _, _, _, _, _, _, _, _, 6.63267, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 9.023491, _, _, 7.737569, _, _, _, _, _, _, 6.540256, _, 
-    _, _,
-  _, 8.413112, _, 8.170027, _, _, 9.149413, _, _, _, _, _, 7.4319, _, _, 
-    6.26823, _, _, _, _,
-  8.899057, _, _, _, _, _, _, _, 9.795968, _, _, _, _, _, _, _, _, _, _, 
-    6.829187,
-  _, _, 9.752924, _, _, 9.325312, _, _, _, _, _, 7.412814, _, _, _, 7.326201, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 8.970785, _, _, 7.643015, _, _, _, _, _, _, _, 
-    7.320814,
-  _, _, 9.874618, _, 10.65373, _, _, _, _, _, _, _, _, _, 7.429714, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 9.066382, _, _, 7.713646, _, _, _, _, _, _, _, 
-    7.165817, _,
-  _, 11.50497, _, 10.23989, _, _, _, _, _, _, _, _, _, 7.263686, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 9.024104, _, _, 7.809846, _, _, _, _, _, _, _, 6.550485, 
-    _, _,
-  9.357559, _, _, 9.339013, _, _, _, _, _, _, _, _, _, 7.013798, _, _, _, _, 
-    _, _,
-  9.77884, _, _, _, _, 7.975885, _, _, 7.424665, _, _, _, _, _, _, _, 
-    5.465125, _, _, _,
-  _, _, 9.38381, _, _, 8.548382, _, _, _, _, _, _, 6.153101, _, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, _, 4.042087, _, _, _, _, _, _, _, 5.670447, _, _, _,
-  _, 10.33477, _, _, 8.864391, _, _, _, _, _, _, 5.549394, _, _, _, 4.996204, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 6.019665, _, _, 4.965127, _, _, _, _, _, _, _, 
-    3.623973,
-  3.520382, _, _, 4.471444, _, 5.106831, _, _, _, _, _, _, _, _, 4.063688, _, 
-    _, _, _, _,
-  3.867551, _, _, _, _, _, _, _, 5.164579, _, 5.584627, _, _, _, _, _, _, _, 
-    3.983552, _,
-  _, _, 5.315122, _, 4.985534, _, _, _, _, _, _, _, _, _, 4.424124, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 5.514681, _, _, 5.389504, _, _, _, _, _, _, 4.237243, 
-    _, _,
-  _, 4.355546, _, _, 4.508291, _, _, _, _, _, _, _, _, 4.499592, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 4.922162, _, _, 5.672986, _, _, _, _, _, _, 4.151125, _, 
-    _, _,
-  _, 4.784837, _, 4.222713, _, _, 4.345345, _, _, _, _, _, 4.848848, _, _, 
-    4.100299, _, _, _, _,
-  5.434897, _, _, _, _, _, _, _, 6.679379, _, _, _, _, _, _, _, _, _, _, 
-    4.330585,
-  _, _, 6.048448, _, _, 5.377656, _, _, _, _, _, 5.176875, _, _, _, 4.911465, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 6.172438, _, _, 5.110558, _, _, _, _, _, _, _, 
-    3.996585,
-  _, _, 5.585401, _, 5.648882, _, _, _, _, _, _, _, _, _, 4.926129, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 5.557625, _, _, 4.556805, _, _, _, _, _, _, _, 
-    3.804101, _,
-  _, 6.095801, _, 3.634272, _, _, _, _, _, _, _, _, _, 4.399351, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 5.06394, _, _, 4.718143, _, _, _, _, _, _, _, 3.121289, 
-    _, _,
-  5.495305, _, _, 4.072839, _, _, _, _, _, _, _, _, _, 4.200701, _, _, _, _, 
-    _, _,
-  5.466282, _, _, _, _, 4.608902, _, _, 4.599293, _, _, _, _, _, _, _, 
-    2.03493, _, _, _,
-  _, _, 5.091508, _, _, 5.303615, _, _, _, _, _, _, 3.708326, _, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, _, 3.833514, _, _, _, _, _, _, _, 2.003222, _, _, _,
-  _, 5.063286, _, _, 5.335797, _, _, _, _, _, _, 2.887829, _, _, _, 2.080557, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 2.600815, _, _, 2.205894, _, _, _, _, _, _, _, 
-    1.763157,
-  1.184497, _, _, 1.373826, _, 1.698269, _, _, _, _, _, _, _, _, 1.900293, _, 
-    _, _, _, _,
-  1.269257, _, _, _, _, _, _, _, 1.765917, _, 2.510102, _, _, _, _, _, _, _, 
-    1.902913, _,
-  _, _, 1.730513, _, 1.767238, _, _, _, _, _, _, _, _, _, 2.12004, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 1.811384, _, _, 2.1383, _, _, _, _, _, _, 1.952306, _, _,
-  _, 1.336811, _, _, 1.484462, _, _, _, _, _, _, _, _, 2.125665, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 1.620859, _, _, 2.266819, _, _, _, _, _, _, 1.927027, _, 
-    _, _,
-  _, 1.666311, _, 1.572296, _, _, 1.614327, _, _, _, _, _, 2.175265, _, _, 
-    1.92464, _, _, _, _,
-  2.37118, _, _, _, _, _, _, _, 2.328851, _, _, _, _, _, _, _, _, _, _, 
-    2.193261,
-  _, _, 2.579261, _, _, 1.675537, _, _, _, _, _, 2.201659, _, _, _, 1.89812, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 2.42245, _, _, 2.04443, _, _, _, _, _, _, _, 
-    1.791352,
-  _, _, 2.968773, _, 3.034456, _, _, _, _, _, _, _, _, _, 1.959377, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 2.084338, _, _, 1.967747, _, _, _, _, _, _, _, 
-    1.727702, _,
-  _, 3.268435, _, 1.384629, _, _, _, _, _, _, _, _, _, 1.743225, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, 2.066008, _, _, 1.999298, _, _, _, _, _, _, _, 1.384796, 
-    _, _,
-  3.114085, _, _, 2.306065, _, _, _, _, _, _, _, _, _, 1.749381, _, _, _, _, 
-    _, _,
-  2.588423, _, _, _, _, 2.098056, _, _, 1.899747, _, _, _, _, _, _, _, 
-    0.8655578, _, _, _,
-  _, _, 2.47041, _, _, 2.412685, _, _, _, _, _, _, 1.750905, _, _, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, _, 2.287829, _, _, _, _, _, _, _, 0.7768297, _, _, _,
-  _, 2.648704, _, _, 2.077359, _, _, _, _, _, _, 1.421121, _, _, _, 
-    0.7892935, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.6291567, _, _, 0.4854234, _, _, _, _, _, _, _, 
-    0.4797352,
-  0.3157294, _, _, 0.3343098, _, 0.4024512, _, _, _, _, _, _, _, _, 
-    0.4738208, _, _, _, _, _,
-  0.3052132, _, _, _, _, _, _, _, 0.446995, _, 0.5301894, _, _, _, _, _, _, 
-    _, 0.5050504, _,
-  _, _, 0.3783778, _, 0.4262444, _, _, _, _, _, _, _, _, _, 0.5283793, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, 0.3654843, _, _, 0.4661307, _, _, _, _, _, _, 
-    0.5202098, _, _,
-  _, 0.2730667, _, _, 0.3313915, _, _, _, _, _, _, _, _, 0.5285911, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, 0.3268317, _, _, 0.4391789, _, _, _, _, _, _, 0.4965764, 
-    _, _, _,
-  _, 0.3654233, _, 0.3445751, _, _, 0.4274168, _, _, _, _, _, 0.5143459, _, 
-    _, 0.432492, _, _, _, _,
-  0.624234, _, _, _, _, _, _, _, 0.4346937, _, _, _, _, _, _, _, _, _, _, 
-    0.6410329,
-  _, _, 0.8371385, _, _, 0.5161644, _, _, _, _, _, 0.3939349, _, _, _, 
-    0.2794161, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.3987486, _, _, 0.3487488, _, _, _, _, _, _, _, 
-    0.5908926,
-  _, _, 1.476124, _, 1.525737, _, _, _, _, _, _, _, _, _, 0.3141694, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 0.4914477, _, _, 0.5601476, _, _, _, _, _, _, _, 
-    0.5246512, _,
-  _, 1.399957, _, 0.9261711, _, _, _, _, _, _, _, _, _, 0.4376495, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, 0.6401776, _, _, 0.5228487, _, _, _, _, _, _, _, 
-    0.5703739, _, _,
-  1.632739, _, _, 1.329874, _, _, _, _, _, _, _, _, _, 0.4660563, _, _, _, _, 
-    _, _,
-  1.144565, _, _, _, _, 0.7491207, _, _, 0.510797, _, _, _, _, _, _, _, 
-    0.466953, _, _, _,
-  _, _, 1.037078, _, _, 0.6208939, _, _, _, _, _, _, 0.6587166, _, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, _, 0.7381621, _, _, _, _, _, _, _, 0.4482371, _, _, _,
-  _, 0.9122726, _, _, 0.5953169, _, _, _, _, _, _, 0.55512, _, _, _, 
-    0.3188243, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.132651, _, _, 0.1022856, _, _, _, _, _, _, _, 
-    0.1194218,
-  0.1715599, _, _, 0.1635145, _, 0.15744, _, _, _, _, _, _, _, _, 0.1043912, 
-    _, _, _, _, _,
-  0.1705138, _, _, _, _, _, _, _, 0.1487642, _, 0.09528217, _, _, _, _, _, _, 
-    _, 0.1036556, _,
-  _, _, 0.1485861, _, 0.1614268, _, _, _, _, _, _, _, _, _, 0.1035215, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, 0.109576, _, _, 0.1058078, _, _, _, _, _, _, 
-    0.1129123, _, _,
-  _, 0.1531491, _, _, 0.136056, _, _, _, _, _, _, _, _, 0.1069928, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, 0.1008615, _, _, 0.1292468, _, _, _, _, _, _, 0.112548, 
-    _, _, _,
-  _, 0.1515007, _, 0.1357538, _, _, 0.09774403, _, _, _, _, _, 0.09116791, _, 
-    _, 0.09338746, _, _, _, _,
-  0.189439, _, _, _, _, _, _, _, 0.1093922, _, _, _, _, _, _, _, _, _, _, 
-    0.1405865,
-  _, _, 0.2404758, _, _, 0.2595569, _, _, _, _, _, 0.09822413, _, _, _, 
-    0.07383901, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.1190074, _, _, 0.1325311, _, _, _, _, _, _, _, 
-    0.1213829,
-  _, _, 0.597658, _, 0.6138088, _, _, _, _, _, _, _, _, _, 0.105895, _, _, _, 
-    _, _,
-  _, _, _, _, _, _, _, 0.2962824, _, _, 0.3015485, _, _, _, _, _, _, _, 
-    0.1542183, _,
-  _, 0.4986322, _, 0.6340318, _, _, _, _, _, _, _, _, _, 0.2095982, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, 0.4198576, _, _, 0.2471934, _, _, _, _, _, _, _, 
-    0.2758955, _, _,
-  0.677281, _, _, 0.6335158, _, _, _, _, _, _, _, _, _, 0.2423655, _, _, _, 
-    _, _, _,
-  0.5490316, _, _, _, _, 0.4164687, _, _, 0.2867492, _, _, _, _, _, _, _, 
-    0.2711674, _, _, _,
-  _, _, 0.4456161, _, _, 0.2605394, _, _, _, _, _, _, 0.2541651, _, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, _, 0.2922591, _, _, _, _, _, _, _, 0.252904, _, _, _,
-  _, 0.2595911, _, _, 0.2895615, _, _, _, _, _, _, 0.2156315, _, _, _, 
-    0.2008013, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.08037327, _, _, 0.07464832, _, _, _, _, _, _, _, 
-    0.06183392,
-  0.09488925, _, _, 0.09258211, _, 0.07416545, _, _, _, _, _, _, _, _, 
-    0.06979298, _, _, _, _, _,
-  0.1162478, _, _, _, _, _, _, _, 0.07478926, _, 0.07755646, _, _, _, _, _, 
-    _, _, 0.06081326, _,
-  _, _, 0.1020418, _, 0.0851082, _, _, _, _, _, _, _, _, _, 0.06841189, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, 0.07720956, _, _, 0.07250732, _, _, _, _, _, _, 
-    0.06408162, _, _,
-  _, 0.1302345, _, _, 0.1113517, _, _, _, _, _, _, _, _, 0.0760674, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, 0.0977348, _, _, 0.09942498, _, _, _, _, _, _, 
-    0.06811582, _, _, _,
-  _, 0.1180888, _, 0.1111216, _, _, 0.09291938, _, _, _, _, _, 0.09724257, _, 
-    _, 0.08563249, _, _, _, _,
-  0.1569083, _, _, _, _, _, _, _, 0.1904642, _, _, _, _, _, _, _, _, _, _, 
-    0.07021514,
-  _, _, 0.1716115, _, _, 0.2162313, _, _, _, _, _, 0.1512596, _, _, _, 
-    0.1938034, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.1757379, _, _, 0.2034774, _, _, _, _, _, _, _, 
-    0.09177032,
-  _, _, 0.2454274, _, 0.2578019, _, _, _, _, _, _, _, _, _, 0.194745, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, 0.2775753, _, _, 0.2322377, _, _, _, _, _, _, _, 
-    0.1373269, _,
-  _, 0.1895054, _, 0.2646919, _, _, _, _, _, _, _, _, _, 0.2040382, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, 0.3040908, _, _, 0.2665235, _, _, _, _, _, _, _, 
-    0.1741579, _, _,
-  0.2884258, _, _, 0.3443388, _, _, _, _, _, _, _, _, _, 0.2293898, _, _, _, 
-    _, _, _,
-  0.2932368, _, _, _, _, 0.2864713, _, _, 0.2741358, _, _, _, _, _, _, _, 
-    0.1728883, _, _, _,
-  _, _, 0.2729693, _, _, 0.2772094, _, _, _, _, _, _, 0.1907862, _, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, _, 0.1972843, _, _, _, _, _, _, _, 0.1762692, _, _, _,
-  _, 0.1458211, _, _, 0.2265337, _, _, _, _, _, _, 0.1434233, _, _, _, 
-    0.1201354, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.03995864, _, _, 0.04301612, _, _, _, _, _, _, _, 
-    0.03762819,
-  0.0475106, _, _, 0.04725369, _, 0.03649548, _, _, _, _, _, _, _, _, 
-    0.04384021, _, _, _, _, _,
-  0.05631673, _, _, _, _, _, _, _, 0.0388586, _, 0.04430887, _, _, _, _, _, 
-    _, _, 0.04095693, _,
-  _, _, 0.04991687, _, 0.03828994, _, _, _, _, _, _, _, _, _, 0.04261909, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, 0.0452977, _, _, 0.04760806, _, _, _, _, _, _, 
-    0.04243068, _, _,
-  _, 0.07091061, _, _, 0.06278864, _, _, _, _, _, _, _, _, 0.04721214, _, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, 0.06063705, _, _, 0.06542457, _, _, _, _, _, _, 
-    0.04433564, _, _, _,
-  _, 0.06277891, _, 0.0616699, _, _, 0.05746608, _, _, _, _, _, 0.06350318, 
-    _, _, 0.05924265, _, _, _, _,
-  0.07914826, _, _, _, _, _, _, _, 0.1082881, _, _, _, _, _, _, _, _, _, _, 
-    0.04842088,
-  _, _, 0.08982443, _, _, 0.1049104, _, _, _, _, _, 0.09244097, _, _, _, 
-    0.1151257, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.09985659, _, _, 0.1033329, _, _, _, _, _, _, _, 
-    0.07247344,
-  _, _, 0.08866598, _, 0.0888482, _, _, _, _, _, _, _, _, _, 0.1036271, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, 0.1205464, _, _, 0.09664892, _, _, _, _, _, _, _, 
-    0.08557931, _,
-  _, 0.07393657, _, 0.08420023, _, _, _, _, _, _, _, _, _, 0.09646645, _, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, 0.1095914, _, _, 0.1094659, _, _, _, _, _, _, _, 
-    0.08726138, _, _,
-  0.09197982, _, _, 0.126345, _, _, _, _, _, _, _, _, _, 0.1037143, _, _, _, 
-    _, _, _,
-  0.1077639, _, _, _, _, 0.1047624, _, _, 0.1081974, _, _, _, _, _, _, _, 
-    0.08545639, _, _, _,
-  _, _, 0.1075105, _, _, 0.1203896, _, _, _, _, _, _, 0.09561902, _, _, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, _, 0.08439046, _, _, _, _, _, _, _, 0.09637882, _, _, _,
-  _, 0.07405875, _, _, 0.1005222, _, _, _, _, _, _, 0.08044294, _, _, _, 
-    0.06979045, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.01397225, _, _, 0.01580808, _, _, _, _, _, _, _, 
-    0.01411265,
-  0.01681655, _, _, 0.01678746, _, 0.01371277, _, _, _, _, _, _, _, _, 
-    0.01619283, _, _, _, _, _,
-  0.01828054, _, _, _, _, _, _, _, 0.01375119, _, 0.01647641, _, _, _, _, _, 
-    _, _, 0.01614892, _,
-  _, _, 0.01730299, _, 0.01345285, _, _, _, _, _, _, _, _, _, 0.01668037, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, 0.01759028, _, _, 0.01941101, _, _, _, _, _, _, 
-    0.01709047, _, _,
-  _, 0.02290365, _, _, 0.02367288, _, _, _, _, _, _, _, _, 0.01813679, _, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, 0.02254198, _, _, 0.02578158, _, _, _, _, _, _, 
-    0.01734987, _, _, _,
-  _, 0.02162854, _, 0.02078216, _, _, 0.01909926, _, _, _, _, _, 0.02506261, 
-    _, _, 0.02282344, _, _, _, _,
-  0.02471745, _, _, _, _, _, _, _, 0.03318673, _, _, _, _, _, _, _, _, _, _, 
-    0.019798,
-  _, _, 0.02640743, _, _, 0.0260081, _, _, _, _, _, 0.02806349, _, _, _, 
-    0.03357667, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.02821634, _, _, 0.02974148, _, _, _, _, _, _, _, 
-    0.02696364,
-  _, _, 0.0201132, _, 0.0198185, _, _, _, _, _, _, _, _, _, 0.02949838, _, _, 
-    _, _, _,
-  _, _, _, _, _, _, _, 0.03079595, _, _, 0.02512017, _, _, _, _, _, _, _, 
-    0.03121963, _,
-  _, 0.01906762, _, 0.01512005, _, _, _, _, _, _, _, _, _, 0.02732853, _, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, 0.02716686, _, _, 0.02819475, _, _, _, _, _, _, _, 
-    0.02679006, _, _,
-  0.0182022, _, _, 0.02640342, _, _, _, _, _, _, _, _, _, 0.02899102, _, _, 
-    _, _, _, _,
-  0.02326424, _, _, _, _, 0.02618844, _, _, 0.02714735, _, _, _, _, _, _, _, 
-    0.02711672, _, _, _,
-  _, _, 0.02247029, _, _, 0.02987606, _, _, _, _, _, _, 0.02867859, _, _, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.02504346, _, _, _, _, _, _, _, 0.03144621, _, _, _,
-  _, 0.02028225, _, _, 0.03060555, _, _, _, _, _, _, 0.02752425, _, _, _, 
-    0.02587092, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.00405583, _, _, 0.004537465, _, _, _, _, _, _, _, 
-    0.00426196,
-  0.00442314, _, _, 0.004485251, _, 0.003900765, _, _, _, _, _, _, _, _, 
-    0.00450012, _, _, _, _, _,
-  0.004686644, _, _, _, _, _, _, _, 0.004081598, _, 0.004767802, _, _, _, _, 
-    _, _, _, 0.004607819, _,
-  _, _, 0.004715857, _, 0.00414123, _, _, _, _, _, _, _, _, _, 0.004785344, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, 0.004837892, _, _, 0.005328194, _, _, _, _, _, _, 
-    0.005039224, _, _,
-  _, 0.005483704, _, _, 0.005908733, _, _, _, _, _, _, _, _, 0.004882794, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, 0.005537251, _, _, 0.005752493, _, _, _, _, _, _, 
-    0.004738824, _, _, _,
-  _, 0.005264724, _, 0.004965357, _, _, 0.004700108, _, _, _, _, _, 
-    0.005923705, _, _, 0.005590363, _, _, _, _,
-  0.005749694, _, _, _, _, _, _, _, 0.007978138, _, _, _, _, _, _, _, _, _, 
-    _, 0.005250677,
-  _, _, 0.005538015, _, _, 0.005078285, _, _, _, _, _, 0.006771238, _, _, _, 
-    0.006997874, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.006330026, _, _, 0.006475414, _, _, _, _, _, _, 
-    _, 0.006639164,
-  _, _, 0.004207236, _, 0.00376306, _, _, _, _, _, _, _, _, _, 0.006358202, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, 0.005593626, _, _, 0.004980106, _, _, _, _, _, _, _, 
-    0.00755458, _,
-  _, 0.00403717, _, 0.002608601, _, _, _, _, _, _, _, _, _, 0.005724966, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, 0.005135283, _, _, 0.005274475, _, _, _, _, _, _, _, 
-    0.006355356, _, _,
-  0.003381781, _, _, 0.004529564, _, _, _, _, _, _, _, _, _, 0.005955895, _, 
-    _, _, _, _, _,
-  0.004385665, _, _, _, _, 0.004697463, _, _, 0.004887731, _, _, _, _, _, _, 
-    _, 0.006182333, _, _, _,
-  _, _, 0.004213462, _, _, 0.005763907, _, _, _, _, _, _, 0.005908161, _, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.005125896, _, _, _, _, _, _, _, 0.006488696, _, 
-    _, _,
-  _, 0.004063415, _, _, 0.006577578, _, _, _, _, _, _, 0.006016137, _, _, _, 
-    0.005995101, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.002144917, _, _, 0.00227489, _, _, _, _, _, _, _, 
-    0.002314828,
-  0.002283148, _, _, 0.002293594, _, 0.002025449, _, _, _, _, _, _, _, _, 
-    0.002257528, _, _, _, _, _,
-  0.002441752, _, _, _, _, _, _, _, 0.002260707, _, 0.002361776, _, _, _, _, 
-    _, _, _, 0.0023614, _,
-  _, _, 0.002497189, _, 0.002315958, _, _, _, _, _, _, _, _, _, 0.00240827, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, 0.00242131, _, _, 0.002533628, _, _, _, _, _, _, 
-    0.002493, _, _,
-  _, 0.002718076, _, _, 0.002691718, _, _, _, _, _, _, _, _, 0.002398272, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, 0.002533918, _, _, 0.002686566, _, _, _, _, _, _, 
-    0.002334306, _, _, _,
-  _, 0.002504684, _, 0.002363533, _, _, 0.002309511, _, _, _, _, _, 
-    0.002583462, _, _, 0.002518469, _, _, _, _,
-  0.002658015, _, _, _, _, _, _, _, 0.003554456, _, _, _, _, _, _, _, _, _, 
-    _, 0.002569,
-  _, _, 0.00254514, _, _, 0.002477052, _, _, _, _, _, 0.002980658, _, _, _, 
-    0.002953195, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.002896748, _, _, 0.002938448, _, _, _, _, _, _, 
-    _, 0.003076538,
-  _, _, 0.002080081, _, 0.001902956, _, _, _, _, _, _, _, _, _, 0.002853221, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, 0.002463343, _, _, 0.002318655, _, _, _, _, _, _, _, 
-    0.003379468, _,
-  _, 0.001940235, _, 0.001515619, _, _, _, _, _, _, _, _, _, 0.002698731, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, 0.0024105, _, _, 0.002375881, _, _, _, _, _, _, _, 
-    0.002997452, _, _,
-  0.001809219, _, _, 0.002211982, _, _, _, _, _, _, _, _, _, 0.002630881, _, 
-    _, _, _, _, _,
-  0.00218469, _, _, _, _, 0.002102388, _, _, 0.002185251, _, _, _, _, _, _, 
-    _, 0.002904708, _, _, _,
-  _, _, 0.002046105, _, _, 0.002629467, _, _, _, _, _, _, 0.002602894, _, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.002470857, _, _, _, _, _, _, _, 0.002828047, _, 
-    _, _,
-  _, 0.001865821, _, _, 0.003038337, _, _, _, _, _, _, 0.002685659, _, _, _, 
-    0.002797281, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.002014709, _, _, 0.002089367, _, _, _, _, _, _, 
-    _, 0.002198119,
-  0.002139243, _, _, 0.002148028, _, 0.001886177, _, _, _, _, _, _, _, _, 
-    0.002076203, _, _, _, _, _,
-  0.002279266, _, _, _, _, _, _, _, 0.002170773, _, 0.002167467, _, _, _, _, 
-    _, _, _, 0.002199032, _,
-  _, _, 0.002361774, _, 0.002242618, _, _, _, _, _, _, _, _, _, 0.002229875, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, 0.002228162, _, _, 0.00230085, _, _, _, _, _, _, 
-    0.002271566, _, _,
-  _, 0.00249256, _, _, 0.002400191, _, _, _, _, _, _, _, _, 0.002212032, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, 0.002236282, _, _, 0.002534942, _, _, _, _, _, _, 
-    0.002139803, _, _, _,
-  _, 0.002270195, _, 0.002134633, _, _, 0.002153071, _, _, _, _, _, 
-    0.002306994, _, _, 0.002254453, _, _, _, _,
-  0.002383106, _, _, _, _, _, _, _, 0.003077176, _, _, _, _, _, _, _, _, _, 
-    _, 0.002385886,
-  _, _, 0.002303027, _, _, 0.002227167, _, _, _, _, _, 0.002593911, _, _, _, 
-    0.002595842, _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.002535704, _, _, 0.002632418, _, _, _, _, _, _, 
-    _, 0.002777772,
-  _, _, 0.001922599, _, 0.001773139, _, _, _, _, _, _, _, _, _, 0.002515383, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, _, 0.002172667, _, _, 0.002093839, _, _, _, _, _, _, _, 
-    0.002999837, _,
-  _, 0.001815335, _, 0.001482393, _, _, _, _, _, _, _, _, _, 0.002425786, _, 
-    _, _, _, _, _,
-  _, _, _, _, _, _, 0.002201422, _, _, 0.002111604, _, _, _, _, _, _, _, 
-    0.002699859, _, _,
-  0.001671795, _, _, 0.001989888, _, _, _, _, _, _, _, _, _, 0.002291486, _, 
-    _, _, _, _, _,
-  0.001988123, _, _, _, _, 0.001871231, _, _, 0.001938802, _, _, _, _, _, _, 
-    _, 0.002593103, _, _, _,
-  _, _, 0.00180548, _, _, 0.002384434, _, _, _, _, _, _, 0.0022523, _, _, _, 
-    _, _, _, _,
-  _, _, _, _, _, _, _, _, 0.002237851, _, _, _, _, _, _, _, 0.002505273, _, 
-    _, _,
-  _, 0.001673772, _, _, 0.002714993, _, _, _, _, _, _, 0.002356096, _, _, _, 
-    0.002495558, _, _, _, _ ;
-
- H2OMMRStd_Orbit_1742 =
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 12.38362, -1, -1, 10.64975, -1, 11.67567, 
-    -1, -1, -1, 11.68133, -1, -1,
-  -1, -1, -1, 14.29292, -1, -1, 14.3746, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 11.84192, -1, -1, 11.61031, -1, -1, 
-    10.79061, -1, -1, 10.84638, -1, -1,
-  -1, -1, -1, -1, 13.83816, -1, 13.99947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, 11.34708, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 12.25145, -1, 9.402631, -1, -1, 
-    9.894357, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, 13.65246, -1, -1, 13.84942, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 10.945, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 11.62382, -1, -1, 9.694736, -1, -1, 
-    10.42728, -1, -1, -1, -1,
-  -1, 13.48009, -1, 13.65836, -1, 14.28646, -1, 12.36918, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 11.8552, -1,
-  -1, -1, -1, -1, -1, -1, -1, 14.07927, -1, -1, 10.71713, -1, 11.40197, -1, 
-    -1, 11.48643, -1, -1, -1, -1,
-  -1, 14.70246, -1, 15.31367, -1, 14.41566, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 12.97165,
-  -1, -1, -1, -1, -1, -1, -1, -1, 12.09653, -1, 12.20885, -1, -1, 12.24429, 
-    -1, -1, 11.16811, -1, -1, -1,
-  -1, -1, -1, -1, 15.18609, -1, 14.00363, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-    14.26085, -1, -1, 14.36556,
-  -1, -1, -1, -1, -1, -1, -1, -1, 13.41577, -1, -1, 12.65541, -1, 12.2159, 
-    -1, -1, -1, -1, -1, -1,
-  -1, -1, 12.91161, -1, 14.6521, -1, 12.09737, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 12.12238, -1, -1, 13.3686,
-  -1, -1, -1, -1, -1, -1, -1, 10.98875, -1, 11.52529, -1, 12.34414, -1, -1, 
-    12.22066, -1, -1, -1, -1, -1,
-  -1, 9.9169, -1, 13.03579, -1, 13.87691, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 11.6278, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 11.18389, -1, 12.20102, -1, -1, 12.17034, -1, 
-    11.46207, -1, -1, -1, -1, -1,
-  -1, 15.53603, -1, 13.57182, -1, 12.50811, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 11.28121, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 10.36662, -1, 11.84369, -1, 11.8321, -1, 
-    -1, 11.65275, -1, -1, -1, -1,
-  13.60668, -1, 12.70099, -1, 13.03724, -1, 12.16311, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 13.33916, -1, -1, 12.26843, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 12.04619, -1, -1, 9.994142, -1, 10.19553, 
-    -1, -1, -1, 10.29205, -1, -1,
-  -1, 14.43294, -1, 15.43404, -1, -1, 15.01783, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 11.69763, -1, -1, 11.29698, -1, -1, 
-    9.357984, -1, -1, 9.403737, -1, -1,
-  14.94741, -1, 12.04981, -1, 14.53561, -1, 14.05362, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 10.00885, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 11.80358, -1, 9.079291, -1, -1, 
-    8.690677, -1, -1, -1, -1, -1,
-  14.18867, -1, 14.15842, -1, 14.08122, -1, -1, 13.75745, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 9.778666, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 11.43851, -1, -1, 8.911757, -1, -1, 
-    8.942759, -1, -1, -1, -1,
-  -1, 13.7797, -1, 13.03204, -1, 13.74864, -1, 12.52044, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 10.7647, -1,
-  -1, -1, -1, -1, -1, -1, -1, 13.92307, -1, -1, 10.61651, -1, 10.16686, -1, 
-    -1, 9.931579, -1, -1, -1, -1,
-  -1, 12.53611, -1, 13.74296, -1, 14.29867, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 11.54485,
-  -1, -1, -1, -1, -1, -1, -1, -1, 11.90044, -1, 11.68985, -1, -1, 10.68976, 
-    -1, -1, 10.01459, -1, -1, -1,
-  12.98678, -1, 12.90685, -1, 13.25818, -1, 14.10182, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 12.37179, -1, -1, 12.79675,
-  -1, -1, -1, -1, -1, -1, -1, -1, 12.94639, -1, -1, 11.66776, -1, 10.83912, 
-    -1, -1, -1, -1, -1, -1,
-  10.52359, -1, 12.06072, -1, 13.67731, -1, 12.08641, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 10.1441, -1, -1, 11.81445,
-  -1, -1, -1, -1, -1, -1, -1, 10.85104, -1, 11.16424, -1, 11.47569, -1, -1, 
-    10.98466, -1, -1, -1, -1, -1,
-  -1, 9.026844, -1, 12.42062, -1, 12.04864, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 9.823149, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 10.83146, -1, 10.82942, -1, -1, 10.61149, -1, 
-    10.04111, -1, -1, -1, -1, -1,
-  -1, 14.6738, -1, 12.8005, -1, 11.79987, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 9.836681, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 9.957008, -1, 10.27876, -1, 10.07308, -1, 
-    -1, 9.917186, -1, -1, -1, -1,
-  12.68189, -1, 11.94567, -1, 12.51936, -1, 10.70425, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 11.71425, -1, -1, 10.62009, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 10.61147, -1, -1, 8.898002, -1, 8.016523, 
-    -1, -1, -1, 7.242176, -1, -1,
-  -1, 10.0618, -1, 10.59666, -1, -1, 11.06453, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 10.51287, -1, -1, 9.223976, -1, -1, 
-    7.693172, -1, -1, 6.893898, -1, -1,
-  10.21342, -1, 11.51974, -1, 10.26225, -1, 10.97971, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 7.257115, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 10.04801, -1, 7.546216, -1, -1, 
-    7.209318, -1, -1, -1, -1, -1,
-  10.71987, -1, 9.799483, -1, 11.58493, -1, -1, 11.30658, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 6.958184, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 9.383289, -1, -1, 7.004887, -1, -1, 
-    7.066679, -1, -1, -1, -1,
-  -1, 9.32733, -1, 9.660233, -1, 12.10942, -1, 10.39578, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 8.014044, -1,
-  -1, -1, -1, -1, -1, -1, -1, 11.77655, -1, -1, 8.945783, -1, 7.306826, -1, 
-    -1, 7.466043, -1, -1, -1, -1,
-  -1, 10.2777, -1, 11.68908, -1, 12.22422, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 8.780133,
-  -1, -1, -1, -1, -1, -1, -1, -1, 10.46407, -1, 9.057076, -1, -1, 7.65333, 
-    -1, -1, 9.359784, -1, -1, -1,
-  11.178, -1, 11.36329, -1, 11.27319, -1, 12.07439, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 9.165315, -1, -1, 9.815444,
-  -1, -1, -1, -1, -1, -1, -1, -1, 10.79784, -1, -1, 9.007884, -1, 8.140968, 
-    -1, -1, -1, -1, -1, -1,
-  10.22235, -1, 10.5732, -1, 11.71384, -1, 11.17817, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 7.989646, -1, -1, 8.879281,
-  -1, -1, -1, -1, -1, -1, -1, 9.252629, -1, 9.209252, -1, 8.903582, -1, -1, 
-    8.552207, -1, -1, -1, -1, -1,
-  -1, 9.327926, -1, 10.41602, -1, 9.433717, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 8.389853, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 8.360893, -1, 8.093883, -1, -1, 8.040504, -1, 
-    7.828959, -1, -1, -1, -1, -1,
-  -1, 11.6624, -1, 9.665039, -1, 8.286007, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 8.028294, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 7.729041, -1, 7.446854, -1, 6.613822, -1, 
-    -1, 7.051621, -1, -1, -1, -1,
-  10.18543, -1, 9.833223, -1, 9.252248, -1, 6.78778, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 6.825848, -1, -1, 7.120554, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 6.429665, -1, -1, 6.210791, -1, 4.868364, 
-    -1, -1, -1, 3.974777, -1, -1,
-  -1, 4.142265, -1, 3.53938, -1, -1, 4.370872, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 6.36399, -1, -1, 5.542277, -1, -1, 
-    5.152528, -1, -1, 3.983243, -1, -1,
-  3.723314, -1, 3.088058, -1, 3.551063, -1, 4.830272, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 3.987427, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 5.569803, -1, 4.767272, -1, -1, 
-    4.771811, -1, -1, -1, -1, -1,
-  4.442745, -1, 3.880895, -1, 5.248265, -1, -1, 5.328406, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 3.978646, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 4.932638, -1, -1, 4.477881, -1, -1, 
-    4.637861, -1, -1, -1, -1,
-  -1, 4.138938, -1, 4.834995, -1, 6.949813, -1, 5.070393, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 4.347741, -1,
-  -1, -1, -1, -1, -1, -1, -1, 6.195211, -1, -1, 4.945945, -1, 3.909096, -1, 
-    -1, 4.303785, -1, -1, -1, -1,
-  -1, 6.960253, -1, 7.682668, -1, 6.341686, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 5.126359,
-  -1, -1, -1, -1, -1, -1, -1, -1, 6.404423, -1, 4.591238, -1, -1, 4.121669, 
-    -1, -1, 5.508808, -1, -1, -1,
-  7.452466, -1, 8.148824, -1, 7.504981, -1, 6.835045, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 4.666038, -1, -1, 5.288129,
-  -1, -1, -1, -1, -1, -1, -1, -1, 5.616419, -1, -1, 4.513792, -1, 4.172001, 
-    -1, -1, -1, -1, -1, -1,
-  8.123507, -1, 7.518586, -1, 7.882612, -1, 6.721637, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 4.75959, -1, -1, 4.767568,
-  -1, -1, -1, -1, -1, -1, -1, 5.794287, -1, 4.811872, -1, 4.349126, -1, -1, 
-    4.601245, -1, -1, -1, -1, -1,
-  -1, 8.43891, -1, 7.452432, -1, 6.775403, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 5.166274, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 4.486325, -1, 4.383745, -1, -1, 4.400574, -1, 
-    4.740035, -1, -1, -1, -1, -1,
-  -1, 6.678753, -1, 6.185923, -1, 4.912583, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 4.304421, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 4.456388, -1, 4.121171, -1, 3.56264, -1, 
-    -1, 3.875491, -1, -1, -1, -1,
-  6.273441, -1, 6.653442, -1, 5.62796, -1, 4.547194, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 2.329102, -1, -1, 2.925502, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 2.368985, -1, -1, 2.506599, -1, 1.75304, 
-    -1, -1, -1, 1.499937, -1, -1,
-  -1, 1.074408, -1, 0.691287, -1, -1, 1.123711, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 2.199787, -1, -1, 2.156072, -1, -1, 
-    1.861145, -1, -1, 1.498315, -1, -1,
-  0.7953327, -1, 0.483124, -1, 0.6261673, -1, 1.230006, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 1.478659, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 1.639869, -1, 1.703768, -1, -1, 
-    1.724268, -1, -1, -1, -1, -1,
-  0.8596335, -1, 0.6813142, -1, 1.173104, -1, -1, 1.262905, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 1.474467, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 1.460897, -1, -1, 1.690088, -1, -1, 
-    1.698055, -1, -1, -1, -1,
-  -1, 0.9608809, -1, 1.292584, -1, 2.265428, -1, 1.359412, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 1.552831, -1,
-  -1, -1, -1, -1, -1, -1, -1, 1.951508, -1, -1, 1.571579, -1, 1.563752, -1, 
-    -1, 1.580687, -1, -1, -1, -1,
-  -1, 3.349823, -1, 3.115479, -1, 1.985466, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 1.929037,
-  -1, -1, -1, -1, -1, -1, -1, -1, 2.221276, -1, 1.508751, -1, -1, 1.609182, 
-    -1, -1, 1.509019, -1, -1, -1,
-  3.748283, -1, 3.765379, -1, 3.169544, -1, 2.728518, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 1.418754, -1, -1, 1.84425,
-  -1, -1, -1, -1, -1, -1, -1, -1, 1.932889, -1, -1, 1.481287, -1, 1.451586, 
-    -1, -1, -1, -1, -1, -1,
-  4.113621, -1, 3.680743, -1, 3.430924, -1, 2.587143, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 1.695059, -1, -1, 1.796517,
-  -1, -1, -1, -1, -1, -1, -1, 2.375796, -1, 1.597223, -1, 1.408737, -1, -1, 
-    1.631567, -1, -1, -1, -1, -1,
-  -1, 3.881472, -1, 3.248815, -1, 2.913086, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 1.962904, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 1.64705, -1, 1.690192, -1, -1, 1.749783, -1, 
-    1.962349, -1, -1, -1, -1, -1,
-  -1, 2.930567, -1, 2.715554, -1, 2.17049, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 1.274617, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 1.713158, -1, 1.662155, -1, 1.625277, -1, 
-    -1, 1.611186, -1, -1, -1, -1,
-  2.547604, -1, 2.637157, -1, 2.099942, -1, 1.771232, -1, -1, -1, -1, -1, -1, 
-    -1, -1, 0.7116678, -1, -1, 0.7481387, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.422663, -1, -1, 0.4942754, -1, 0.3776747, 
-    -1, -1, -1, 0.3729632, -1, -1,
-  -1, 0.2918694, -1, 0.07599716, -1, -1, 0.2019217, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.3978807, -1, -1, 0.3970318, -1, -1, 
-    0.3768882, -1, -1, 0.3876787, -1, -1,
-  0.1764775, -1, 0.2381255, -1, 0.1575044, -1, 0.1933141, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.3469307, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.2999924, -1, 0.3261201, -1, -1, 
-    0.3410881, -1, -1, -1, -1, -1,
-  0.2110218, -1, 0.2043043, -1, 0.2368577, -1, -1, 0.2018194, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.3416399, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.3871345, -1, -1, 0.3728305, -1, -1, 
-    0.3579137, -1, -1, -1, -1,
-  -1, 0.2584873, -1, 0.3618549, -1, 0.5991492, -1, 0.3733209, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.3085955, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.5798641, -1, -1, 0.5021927, -1, 0.4799645, 
-    -1, -1, 0.3420441, -1, -1, -1, -1,
-  -1, 1.35615, -1, 1.208266, -1, 0.6982037, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.3847079,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.7585106, -1, 0.5003067, -1, -1, 
-    0.5185027, -1, -1, 0.1879701, -1, -1, -1,
-  1.360265, -1, 1.475075, -1, 1.224311, -1, 1.075896, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.3016706, -1, -1, 0.3321739,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.6367921, -1, -1, 0.5911005, -1, 
-    0.4831443, -1, -1, -1, -1, -1, -1,
-  1.811171, -1, 1.730461, -1, 1.586739, -1, 1.21242, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.3777315, -1, -1, 0.3437368,
-  -1, -1, -1, -1, -1, -1, -1, 1.119577, -1, 0.5838587, -1, 0.4982553, -1, -1, 
-    0.4768365, -1, -1, -1, -1, -1,
-  -1, 1.537141, -1, 1.367134, -1, 1.270117, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.5149102, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.6438604, -1, 0.5536297, -1, -1, 0.5665911, 
-    -1, 0.6416807, -1, -1, -1, -1, -1,
-  -1, 1.43777, -1, 1.288699, -1, 0.9874995, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.3047381, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.6091524, -1, 0.6313369, -1, 0.5966316, 
-    -1, -1, 0.5886483, -1, -1, -1, -1,
-  1.000596, -1, 1.007105, -1, 0.8772323, -1, 0.5747824, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.3091379, -1, -1, 0.2750811, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.09479251, -1, -1, 0.08492569, -1, 
-    0.1321602, -1, -1, -1, 0.1235197, -1, -1,
-  -1, 0.1878974, -1, 0.1278429, -1, -1, 0.1234083, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.1241301, -1, -1, 0.1185216, -1, -1, 
-    0.1462902, -1, -1, 0.1314269, -1, -1,
-  0.264523, -1, 0.2510378, -1, 0.2728057, -1, 0.1724796, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.1346977, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.1657145, -1, 0.1480499, -1, -1, 
-    0.150274, -1, -1, -1, -1, -1,
-  0.2870461, -1, 0.32347, -1, 0.2789751, -1, -1, 0.219703, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.1213938, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.2463592, -1, -1, 0.1580852, -1, -1, 
-    0.1471856, -1, -1, -1, -1,
-  -1, 0.2972445, -1, 0.2870857, -1, 0.305277, -1, 0.3092072, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.1103997, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.3836747, -1, -1, 0.3414937, -1, 0.2760163, 
-    -1, -1, 0.1368032, -1, -1, -1, -1,
-  -1, 0.4918324, -1, 0.4732783, -1, 0.4446527, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.1273054,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.4618959, -1, 0.4258333, -1, -1, 
-    0.3472718, -1, -1, 0.09352233, -1, -1, -1,
-  0.4871188, -1, 0.4887983, -1, 0.4948103, -1, 0.5568228, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.1893833, -1, -1, 0.1177494,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.4402539, -1, -1, 0.5178307, -1, 
-    0.4412312, -1, -1, -1, -1, -1, -1,
-  0.682815, -1, 0.7268168, -1, 0.7276757, -1, 0.6316776, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.2183255, -1, -1, 0.1283906,
-  -1, -1, -1, -1, -1, -1, -1, 0.5937, -1, 0.4400036, -1, 0.4364025, -1, -1, 
-    0.3617183, -1, -1, -1, -1, -1,
-  -1, 0.5993655, -1, 0.5993466, -1, 0.6187661, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.2843606, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.3997332, -1, 0.3108829, -1, -1, 0.3605699, 
-    -1, 0.3787363, -1, -1, -1, -1, -1,
-  -1, 0.5416973, -1, 0.5746801, -1, 0.4740594, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.2383836, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.3367812, -1, 0.4095963, -1, 0.3891692, 
-    -1, -1, 0.4123557, -1, -1, -1, -1,
-  0.45012, -1, 0.3853252, -1, 0.3806758, -1, 0.2868859, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.3978859, -1, -1, 0.3548206, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.08562002, -1, -1, 0.1005258, -1, 
-    0.07317902, -1, -1, -1, 0.06707428, -1, -1,
-  -1, 0.078866, -1, 0.0586053, -1, -1, 0.06955986, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.1219912, -1, -1, 0.1226388, -1, -1, 
-    0.09327748, -1, -1, 0.07736786, -1, -1,
-  0.1226509, -1, 0.1292475, -1, 0.1337245, -1, 0.1265086, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.1093902, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.167218, -1, 0.1498424, -1, -1, 
-    0.1182711, -1, -1, -1, -1, -1,
-  0.1652938, -1, 0.1735396, -1, 0.188093, -1, -1, 0.1661652, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.1121845, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.192591, -1, -1, 0.1468572, -1, -1, 
-    0.1229911, -1, -1, -1, -1,
-  -1, 0.1736851, -1, 0.1847906, -1, 0.1971201, -1, 0.1912189, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.121524, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.2363025, -1, -1, 0.2341728, -1, 0.2043514, 
-    -1, -1, 0.123593, -1, -1, -1, -1,
-  -1, 0.1890311, -1, 0.2000983, -1, 0.2330877, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.1368979,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.2830437, -1, 0.2763612, -1, -1, 
-    0.2348724, -1, -1, 0.1350377, -1, -1, -1,
-  0.218934, -1, 0.2081618, -1, 0.227054, -1, 0.256825, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.1796862, -1, -1, 0.157887,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.279285, -1, -1, 0.2471177, -1, 0.2773055, 
-    -1, -1, -1, -1, -1, -1,
-  0.2534964, -1, 0.2694519, -1, 0.2715401, -1, 0.3116022, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.2057946, -1, -1, 0.1502556,
-  -1, -1, -1, -1, -1, -1, -1, 0.2624417, -1, 0.2896295, -1, 0.2623805, -1, 
-    -1, 0.2362952, -1, -1, -1, -1, -1,
-  -1, 0.2652172, -1, 0.2611712, -1, 0.2527854, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.209823, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.26852, -1, 0.2546368, -1, -1, 0.2540614, -1, 
-    0.2348363, -1, -1, -1, -1, -1,
-  -1, 0.210671, -1, 0.2400022, -1, 0.2360022, -1, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.1936144, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.2347605, -1, 0.2683289, -1, 0.2680696, 
-    -1, -1, 0.2439998, -1, -1, -1, -1,
-  0.2578581, -1, 0.216202, -1, 0.1999721, -1, 0.1815215, -1, -1, -1, -1, -1, 
-    -1, -1, -1, 0.272619, -1, -1, 0.228561, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.04721661, -1, -1, 0.04999025, -1, 
-    0.04409112, -1, -1, -1, 0.04262836, -1, -1,
-  -1, 0.0419007, -1, 0.04079619, -1, -1, 0.0466764, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.06184521, -1, -1, 0.0602206, -1, -1, 
-    0.05375875, -1, -1, 0.04756131, -1, -1,
-  0.05644052, -1, 0.05625408, -1, 0.06335213, -1, 0.06529769, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.05999582, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.0777808, -1, 0.06790397, -1, -1, 
-    0.06152761, -1, -1, -1, -1, -1,
-  0.07432938, -1, 0.06950191, -1, 0.08273683, -1, -1, 0.07695454, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.06004465, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.08440053, -1, -1, 0.07162194, -1, -1, 
-    0.06523395, -1, -1, -1, -1,
-  -1, 0.07850214, -1, 0.08101783, -1, 0.08529643, -1, 0.0791195, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.06414901, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.09439926, -1, -1, 0.09327946, -1, 0.08703773, 
-    -1, -1, 0.06853594, -1, -1, -1, -1,
-  -1, 0.078962, -1, 0.08275281, -1, 0.09390261, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.07635441,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.1125235, -1, 0.1005539, -1, -1, 
-    0.09245986, -1, -1, 0.09145868, -1, -1, -1,
-  0.09205689, -1, 0.08832586, -1, 0.09250925, -1, 0.1018019, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.08786064, -1, -1, 0.08079787,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.1134847, -1, -1, 0.08578721, -1, 
-    0.09644347, -1, -1, -1, -1, -1, -1,
-  0.1037123, -1, 0.1009538, -1, 0.1040132, -1, 0.1173782, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.08941451, -1, -1, 0.0784642,
-  -1, -1, -1, -1, -1, -1, -1, 0.09994371, -1, 0.1062034, -1, 0.09401115, -1, 
-    -1, 0.08643249, -1, -1, -1, -1, -1,
-  -1, 0.105192, -1, 0.1007438, -1, 0.09804475, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.08479143, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.1073835, -1, 0.1057243, -1, -1, 0.09818381, 
-    -1, 0.08703238, -1, -1, -1, -1, -1,
-  -1, 0.09329951, -1, 0.1015378, -1, 0.09705323, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.08481453, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.1015944, -1, 0.1007104, -1, 0.1034859, 
-    -1, -1, 0.08818486, -1, -1, -1, -1,
-  0.1114342, -1, 0.1028191, -1, 0.09337839, -1, 0.0864953, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.0978768, -1, -1, 0.08655781, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.01933227, -1, -1, 0.01910428, -1, 
-    0.01819636, -1, -1, -1, 0.01833303, -1, -1,
-  -1, 0.01597328, -1, 0.01760089, -1, -1, 0.01909891, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.02161555, -1, -1, 0.02194635, -1, -1, 
-    0.02105259, -1, -1, 0.01942062, -1, -1,
-  0.01761442, -1, 0.01594109, -1, 0.01918398, -1, 0.02119223, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.02158413, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.02364152, -1, 0.02178285, -1, -1, 
-    0.02162859, -1, -1, -1, -1, -1,
-  0.02007798, -1, 0.01842526, -1, 0.02255381, -1, -1, 0.02154424, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.02094251, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.02376816, -1, -1, 0.02366706, -1, -1, 
-    0.02333151, -1, -1, -1, -1,
-  -1, 0.02171342, -1, 0.02312957, -1, 0.02382663, -1, 0.02059482, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.02178398, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.02465881, -1, -1, 0.02435155, -1, 0.02397916, 
-    -1, -1, 0.02451453, -1, -1, -1, -1,
-  -1, 0.02366268, -1, 0.0263331, -1, 0.02469503, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.02625937,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.02798841, -1, 0.02376844, -1, -1, 
-    0.02456897, -1, -1, 0.02558341, -1, -1, -1,
-  0.0252708, -1, 0.02666527, -1, 0.02806178, -1, 0.02731119, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.02881429, -1, -1, 0.02712589,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.03011552, -1, -1, 0.02190213, -1, 
-    0.02349437, -1, -1, -1, -1, -1, -1,
-  0.03015553, -1, 0.02838772, -1, 0.03021435, -1, 0.02952271, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.02591157, -1, -1, 0.02648677,
-  -1, -1, -1, -1, -1, -1, -1, 0.02651614, -1, 0.02552809, -1, 0.02306335, -1, 
-    -1, 0.02234053, -1, -1, -1, -1, -1,
-  -1, 0.02901982, -1, 0.02868041, -1, 0.02825027, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.02546916, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.02735885, -1, 0.02780072, -1, -1, 0.02516262, 
-    -1, 0.02329902, -1, -1, -1, -1, -1,
-  -1, 0.03058489, -1, 0.03060636, -1, 0.02760777, -1, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.0265927, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.02722157, -1, 0.02572624, -1, 0.02605108, 
-    -1, -1, 0.02403711, -1, -1, -1, -1,
-  0.0311056, -1, 0.03095211, -1, 0.02847764, -1, 0.02580394, -1, -1, -1, -1, 
-    -1, -1, -1, -1, 0.02457416, -1, -1, 0.02553482, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.005640676, -1, -1, 0.005223408, -1, 
-    0.005877499, -1, -1, -1, 0.005917228, -1, -1,
-  -1, 0.004955817, -1, 0.004909407, -1, -1, 0.005221204, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.005639876, -1, -1, 0.005608505, -1, -1, 
-    0.00632083, -1, -1, 0.005871074, -1, -1,
-  0.005082103, -1, 0.004869324, -1, 0.004623144, -1, 0.005263111, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.00611334, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.005644931, -1, 0.005245841, -1, -1, 
-    0.006237822, -1, -1, -1, -1, -1,
-  0.005603259, -1, 0.004883656, -1, 0.005191565, -1, -1, 0.005076326, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1, 0.006039825, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.005326479, -1, -1, 0.005627634, -1, 
-    -1, 0.006514915, -1, -1, -1, -1,
-  -1, 0.005760423, -1, 0.005702388, -1, 0.005595339, -1, 0.004501231, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1, 0.006442659, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.00535816, -1, -1, 0.005159518, -1, 
-    0.005222405, -1, -1, 0.00685269, -1, -1, -1, -1,
-  -1, 0.00576905, -1, 0.006462569, -1, 0.005432748, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.00741261,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.005714609, -1, 0.00488958, -1, -1, 
-    0.005349049, -1, -1, 0.00667874, -1, -1, -1,
-  0.006187082, -1, 0.006232561, -1, 0.006340918, -1, 0.005905484, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.007254547, -1, -1, 0.007040903,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.006180467, -1, -1, 0.004664623, -1, 
-    0.005029179, -1, -1, -1, -1, -1, -1,
-  0.006574416, -1, 0.006590126, -1, 0.006972703, -1, 0.006049082, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.006417532, -1, -1, 0.006984773,
-  -1, -1, -1, -1, -1, -1, -1, 0.005431044, -1, 0.005141323, -1, 0.004875841, 
-    -1, -1, 0.004895196, -1, -1, -1, -1, -1,
-  -1, 0.006260087, -1, 0.006546667, -1, 0.006617177, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.006238573, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.005552614, -1, 0.005906885, -1, -1, 
-    0.005357576, -1, 0.005252023, -1, -1, -1, -1, -1,
-  -1, 0.00692776, -1, 0.006982017, -1, 0.006211043, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.006648999, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.005602703, -1, 0.005401659, -1, 
-    0.00529094, -1, -1, 0.005317866, -1, -1, -1, -1,
-  0.006675695, -1, 0.006807875, -1, 0.006484197, -1, 0.006295248, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.005214022, -1, -1, 0.005918572, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002897259, -1, -1, 0.00265262, -1, 
-    0.002870859, -1, -1, -1, 0.002856574, -1, -1,
-  -1, 0.002780663, -1, 0.00277109, -1, -1, 0.002801915, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002887234, -1, -1, 0.002814294, -1, -1, 
-    0.002921524, -1, -1, 0.002753877, -1, -1,
-  0.002723944, -1, 0.002669347, -1, 0.002598929, -1, 0.002794395, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.002872241, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.002908573, -1, 0.00270738, -1, -1, 
-    0.002936858, -1, -1, -1, -1, -1,
-  0.002863528, -1, 0.002689734, -1, 0.002823103, -1, -1, 0.002760003, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1, 0.002812765, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.002713234, -1, -1, 0.002755286, -1, 
-    -1, 0.002963391, -1, -1, -1, -1,
-  -1, 0.002983341, -1, 0.002874867, -1, 0.002828069, -1, 0.002440525, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1, 0.002993037, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.002752162, -1, -1, 0.002629921, -1, 
-    0.002616266, -1, -1, 0.00307465, -1, -1, -1, -1,
-  -1, 0.00279646, -1, 0.003084347, -1, 0.002813007, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.003186504,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002734835, -1, 0.002499943, -1, -1, 
-    0.002635671, -1, -1, 0.003058562, -1, -1, -1,
-  0.002875507, -1, 0.002808517, -1, 0.002943425, -1, 0.00290038, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.003155207, -1, -1, 0.003078914,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.003036741, -1, -1, 0.002412982, -1, 
-    0.002613348, -1, -1, -1, -1, -1, -1,
-  0.003010268, -1, 0.0031765, -1, 0.003182251, -1, 0.002897787, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.002997119, -1, -1, 0.003212751,
-  -1, -1, -1, -1, -1, -1, -1, 0.0026237, -1, 0.002616077, -1, 0.00256031, -1, 
-    -1, 0.002560063, -1, -1, -1, -1, -1,
-  -1, 0.00296652, -1, 0.003062244, -1, 0.003054794, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.002888574, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.002705727, -1, 0.002837356, -1, -1, 
-    0.002626978, -1, 0.002625805, -1, -1, -1, -1, -1,
-  -1, 0.003242166, -1, 0.003238396, -1, 0.002971262, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.002985405, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002749498, -1, 0.002654247, -1, 
-    0.002573213, -1, -1, 0.002660715, -1, -1, -1, -1,
-  0.003107514, -1, 0.003110364, -1, 0.003089213, -1, 0.003089355, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.002653314, -1, -1, 0.002816054, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002772469, -1, -1, 0.002576804, -1, 
-    0.002672293, -1, -1, -1, 0.002626404, -1, -1,
-  -1, 0.002722804, -1, 0.002709695, -1, -1, 0.002699778, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002717481, -1, -1, 0.002652653, -1, -1, 
-    0.002638043, -1, -1, 0.002492113, -1, -1,
-  0.002597935, -1, 0.002570902, -1, 0.002533907, -1, 0.002668346, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.00261373, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.002735798, -1, 0.002560628, -1, -1, 
-    0.002683372, -1, -1, -1, -1, -1,
-  0.002650293, -1, 0.002609437, -1, 0.002726222, -1, -1, 0.002656443, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1, 0.002588663, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.002534672, -1, -1, 0.00254983, -1, 
-    -1, 0.002670548, -1, -1, -1, -1,
-  -1, 0.002798069, -1, 0.002698702, -1, 0.002652901, -1, 0.002344788, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, -1, 0.002723842, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.00260032, -1, -1, 0.002460329, -1, 
-    0.002445537, -1, -1, 0.002771361, -1, -1, -1, -1,
-  -1, 0.002675227, -1, 0.002948606, -1, 0.002683953, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, -1, 0.002795885,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.00251489, -1, 0.00235068, -1, -1, 
-    0.002447522, -1, -1, 0.002712957, -1, -1, -1,
-  0.002692607, -1, 0.002587649, -1, 0.002776072, -1, 0.002712202, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.002814738, -1, -1, 0.002741431,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002825865, -1, -1, 0.0023038, -1, 
-    0.002492012, -1, -1, -1, -1, -1, -1,
-  0.002783785, -1, 0.00301627, -1, 0.00295905, -1, 0.002651443, -1, -1, -1, 
-    -1, -1, -1, -1, -1, -1, 0.002736788, -1, -1, 0.00288234,
-  -1, -1, -1, -1, -1, -1, -1, 0.002411855, -1, 0.00245376, -1, 0.002435386, 
-    -1, -1, 0.002426023, -1, -1, -1, -1, -1,
-  -1, 0.002769004, -1, 0.002866582, -1, 0.002839245, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.002641699, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, 0.00247752, -1, 0.002611536, -1, -1, 
-    0.002433883, -1, 0.002462394, -1, -1, -1, -1, -1,
-  -1, 0.003027125, -1, 0.002961707, -1, 0.002720762, -1, -1, -1, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.00270662, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, 0.002520365, -1, 0.002459628, -1, 
-    0.002373158, -1, -1, 0.002486733, -1, -1, -1, -1,
-  0.002857551, -1, 0.002813199, -1, 0.002847445, -1, 0.002854384, -1, -1, -1, 
-    -1, -1, -1, -1, -1, 0.002498582, -1, -1, 0.002606415, -1 ;
-}
diff --git a/ncdap_test/expected4/data.nc.dmp b/ncdap_test/expected4/data.nc.dmp
deleted file mode 100644
index aee62b8..0000000
--- a/ncdap_test/expected4/data.nc.dmp
+++ /dev/null
@@ -1,25 +0,0 @@
-netcdf data {
-types:
-  compound SST_t {
-    float SST(12) ;
-    double TIME(12) ;
-  }; // SST_t
-dimensions:
-	TIME = 12 ;
-variables:
-	double TIME(TIME) ;
-		string TIME:units = "hour" ;
-		string TIME:time_origin = "1-JAN-0000 00:00:00" ;
-		string TIME:modulo = " " ;
-	SST_t SST ;
-
-// global attributes:
-		string :history = "FERRET V3.20 (development) 24-Jan-95" ;
-data:
-
- TIME = 366, 1096.485, 1826.97, 2557.455, 3287.94, 4018.425, 4748.91, 
-    5479.395, 6209.88, 6940.365, 7670.85, 8401.335 ;
-
- SST = 
-    {{27.54567, 28.3144, 28.61936, 28.66284, 27.93789, 25.67098, 24.74051, 24.5248, 25.00667, 25.83214, 26.57257, 27.17107}, {366, 1096.485, 1826.97, 2557.455, 3287.94, 4018.425, 4748.91, 5479.395, 6209.88, 6940.365, 7670.85, 8401.335}} ;
-}
diff --git a/ncdap_test/expected4/fnoc1.nc.dmp b/ncdap_test/expected4/fnoc1.nc.dmp
deleted file mode 100644
index bd8353d..0000000
--- a/ncdap_test/expected4/fnoc1.nc.dmp
+++ /dev/null
@@ -1,1129 +0,0 @@
-netcdf fnoc1 {
-dimensions:
-	lat = 17 ;
-	lon = 21 ;
-	time = 16 ;
-	time_a = 16 ;
-variables:
-	short u(time_a, lat, lon) ;
-		string u:units = "meter per second" ;
-		string u:long_name = "Vector wind eastward component" ;
-		string u:missing_value = "-32767" ;
-		string u:scale_factor = "0.005" ;
-	short v(time_a, lat, lon) ;
-		string v:units = "meter per second" ;
-		string v:long_name = "Vector wind northward component" ;
-		string v:missing_value = "-32767" ;
-		string v:scale_factor = "0.005" ;
-	float lat(lat) ;
-		string lat:units = "degree North" ;
-	float lon(lon) ;
-		string lon:units = "degree East" ;
-	float time(time) ;
-		string time:units = "hours from base_time" ;
-
-// global attributes:
-		string :base_time = "88- 10-00:00:00" ;
-		string :title = " FNOC UV wind components from 1988- 10 to 1988- 13." ;
-data:
-
- u =
-  -1728, -2449, -3099, -3585, -3254, -2406, -1252, 662, 2483, 2910, 2819, 
-    2946, 2745, 2734, 2931, 2601, 2139, 1845, 1754, 1897, 1854,
-  -1686, -1985, -2508, -3397, -3501, -3268, -2700, -705, 1834, 2728, 2484, 
-    2465, 2531, 2591, 2514, 2200, 1934, 1677, 1401, 1202, 1084,
-  -223, -864, -864, -1152, -1427, -1717, -1992, -1211, 791, 2235, 2558, 2770, 
-    2961, 2663, 2131, 1959, 2035, 2053, 1732, 926, 581,
-  1924, 1664, 1555, 1551, 1190, 430, -459, -453, 914, 2055, 2526, 2916, 2761, 
-    1955, 1418, 1509, 1645, 1720, 1510, 739, 318,
-  2869, 3660, 3561, 3069, 2378, 1453, 601, 479, 953, 1237, 1494, 1700, 1436, 
-    751, 358, 732, 1067, 922, 701, 484, 166,
-  2012, 2885, 3172, 2734, 2141, 1453, 795, 420, -98, -415, -37, 108, -104, 
-    -313, -609, -225, 559, 508, 144, 128, -57,
-  685, 1311, 1566, 1458, 1174, 762, 327, -113, -779, -1281, -1168, -968, 
-    -932, -1048, -1344, -1051, -235, 72, -14, -6, -83,
-  -135, 336, 408, 261, -1, -305, -509, -664, -932, -1326, -1734, -1680, 
-    -1197, -1260, -1784, -1724, -1132, -545, -169, -26, 92,
-  -628, -593, -482, -575, -792, -1064, -1290, -1280, -1125, -1202, -1598, 
-    -1676, -1340, -1307, -1652, -1748, -1393, -896, -534, -363, -175,
-  -903, -1244, -1158, -1036, -1219, -1432, -1556, -1551, -1223, -1041, -1074, 
-    -1040, -1194, -1380, -1351, -1211, -916, -749, -956, -1132, -1125,
-  -1247, -1435, -1261, -1147, -1445, -1657, -1641, -1599, -1298, -1042, -946, 
-    -630, -512, -1018, -1489, -1185, -483, -401, -1168, -1888, -2185,
-  -1873, -1883, -1557, -1411, -1469, -1584, -1648, -1599, -1362, -1119, 
-    -1068, -760, -282, -690, -1633, -1489, -569, -324, -906, -1711, -2371,
-  -2116, -2318, -2171, -1834, -1610, -1576, -1672, -1547, -1307, -1238, 
-    -1113, -936, -745, -782, -1320, -1385, -635, -48, -131, -907, -1877,
-  -2055, -2123, -2049, -1781, -1842, -2019, -2132, -1775, -1288, -1227, 
-    -1023, -787, -848, -845, -1010, -1162, -522, 403, 488, -509, -1602,
-  -2087, -1807, -1623, -1734, -1891, -2086, -2257, -1897, -1349, -1079, -811, 
-    -698, -1040, -1163, -933, -944, -617, 193, 388, -413, -1269,
-  -1942, -1670, -1472, -1896, -1915, -1669, -1709, -1607, -1319, -1140, -959, 
-    -911, -1290, -1252, -467, -281, -597, -429, -251, -484, -749,
-  -1661, -1294, -934, -1328, -1643, -1426, -1321, -1400, -1250, -1130, -1209, 
-    -1096, -929, -669, 42, 212, -485, -892, -865, -605, -303,
-  -146, -422, -1033, -1668, -2000, -2307, -2216, -1757, -1231, -294, 861, 
-    1807, 2561, 3064, 3235, 3228, 3132, 2854, 2510, 2241, 1853,
-  695, 1086, 962, -3, -491, -679, -1114, -1268, -918, -159, 783, 1642, 2133, 
-    2245, 2376, 2497, 2381, 2218, 2058, 1630, 1081,
-  1437, 2109, 2430, 1835, 1600, 1931, 1692, 1011, 552, 553, 1212, 2068, 2082, 
-    1460, 1365, 1775, 2045, 2174, 2019, 1332, 640,
-  1372, 2221, 2958, 3042, 3039, 3570, 3694, 2954, 1807, 871, 1154, 2053, 
-    1842, 960, 790, 1234, 1735, 1921, 1599, 1116, 646,
-  613, 1528, 2490, 2979, 2993, 3147, 3254, 2895, 1955, 799, 626, 1271, 1165, 
-    517, 574, 998, 1115, 999, 765, 608, 424,
-  -317, 593, 1389, 1808, 1871, 1832, 1882, 1903, 1435, 400, -104, 148, 82, 
-    -243, -47, 359, 387, 279, 234, 94, -101,
-  -762, 139, 483, 508, 645, 946, 1046, 986, 768, -26, -655, -615, -665, -843, 
-    -787, -509, -113, 86, 9, -51, -155,
-  -454, -98, -183, -461, -318, -3, 12, -84, -146, -483, -836, -810, -770, 
-    -981, -1210, -1065, -472, -85, -197, -181, 66,
-  -132, -567, -819, -1009, -911, -893, -1117, -1184, -975, -890, -972, -948, 
-    -821, -944, -1380, -1382, -827, -456, -385, -252, 55,
-  -311, -901, -1235, -1142, -1147, -1303, -1585, -1713, -1324, -1024, -1088, 
-    -1157, -1080, -1073, -1292, -1173, -791, -754, -670, -360, -283,
-  -722, -809, -1119, -1167, -1312, -1516, -1530, -1439, -1258, -1132, -1189, 
-    -1291, -1345, -1393, -1261, -771, -441, -649, -898, -916, -1072,
-  -1065, -919, -1196, -1345, -1373, -1519, -1366, -1063, -1099, -1218, -1246, 
-    -1309, -1408, -1541, -1462, -1017, -656, -596, -840, -1364, -1816,
-  -1404, -1508, -1839, -1682, -1494, -1520, -1409, -1209, -1051, -990, -1137, 
-    -1291, -1252, -1311, -1627, -1643, -1108, -659, -790, -1321, -1762,
-  -1896, -1864, -1990, -1901, -1938, -1827, -1511, -1432, -1164, -829, -1014, 
-    -1187, -1036, -1048, -1740, -2259, -1314, -439, -884, -1277, -1245,
-  -2076, -1719, -1547, -1800, -2135, -2002, -1509, -1336, -1398, -1171, -854, 
-    -913, -1215, -1248, -1615, -2352, -1788, -818, -1102, -1331, -984,
-  -1858, -1614, -1321, -1603, -1927, -1849, -1496, -1122, -1198, -1211, -753, 
-    -828, -1383, -1291, -920, -1338, -1905, -1782, -1455, -1160, -851,
-  -1571, -1384, -1038, -1207, -1521, -1476, -1185, -824, -700, -809, -898, 
-    -1003, -1023, -781, -328, -379, -1285, -1985, -1672, -885, -460,
-  1418, 1662, 1172, 67, -112, 5, -840, -1933, -2373, -1796, -665, -79, 69, 
-    862, 2036, 2481, 2515, 2522, 2259, 2181, 2399,
-  2147, 2461, 2003, 1414, 2067, 2979, 2542, 1311, 186, -328, -203, -18, 349, 
-    1192, 1850, 1958, 2062, 1977, 1439, 1507, 2106,
-  1628, 2179, 2018, 2273, 3051, 3867, 4409, 4158, 2936, 1621, 1015, 899, 987, 
-    1276, 1445, 1450, 1570, 1438, 1147, 1435, 1539,
-  679, 1404, 1864, 2519, 3168, 3503, 3701, 3890, 3459, 2181, 1329, 1221, 
-    1062, 1074, 1237, 1147, 1144, 1185, 1087, 1066, 874,
-  28, 1030, 1771, 2167, 3077, 3717, 2892, 2197, 2338, 1620, 527, 353, 399, 
-    640, 990, 625, 414, 727, 597, 277, 335,
-  -122, 1100, 1714, 1659, 2191, 2896, 2504, 1554, 1147, 757, -215, -672, 
-    -304, 37, 104, -166, -377, -69, 191, 73, -31,
-  90, 717, 1403, 1341, 915, 930, 1231, 1053, 405, -121, -810, -1283, -793, 
-    -578, -1080, -1127, -813, -457, -56, -1, -147,
-  277, 119, 653, 708, -25, -307, -110, -125, -346, -656, -1170, -1564, -1508, 
-    -1510, -1783, -1602, -860, -317, -168, -109, 73,
-  121, -208, -209, -335, -856, -950, -676, -871, -1039, -878, -1015, -1404, 
-    -1701, -1920, -1913, -1299, -430, -104, -171, -116, 46,
-  -496, -793, -1089, -1372, -1611, -1570, -1254, -1141, -1201, -1102, -1005, 
-    -1163, -1455, -1709, -1509, -738, -203, -274, -618, -754, -696,
-  -1358, -1633, -1926, -2062, -2029, -1964, -1824, -1519, -1310, -1310, 
-    -1220, -1116, -1423, -1602, -999, -481, -461, -677, -1296, -1708, -1735,
-  -1899, -2021, -2231, -2193, -1979, -1867, -1847, -1804, -1742, -1582, 
-    -1236, -1013, -1318, -1493, -1006, -656, -591, -695, -1205, -1703, -2179,
-  -2027, -1979, -2138, -2164, -1782, -1495, -1590, -1742, -1894, -1817, 
-    -1309, -1002, -1153, -1267, -1148, -987, -741, -425, -692, -1521, -2216,
-  -2179, -2049, -2150, -2167, -1713, -1413, -1552, -1631, -1660, -1587, 
-    -1216, -1007, -1027, -938, -1097, -1437, -966, -348, -1036, -2082, -2271,
-  -2333, -2032, -1992, -1948, -1697, -1598, -1658, -1706, -1554, -1100, -762, 
-    -886, -1196, -1068, -1045, -1507, -1171, -849, -1606, -2073, -1907,
-  -2101, -2059, -1976, -1827, -1752, -1827, -1737, -1683, -1550, -902, -510, 
-    -980, -1687, -1582, -812, -764, -1310, -1544, -1376, -1131, -1207,
-  -1359, -2069, -2216, -1995, -1795, -1892, -1731, -1502, -1433, -882, -645, 
-    -1420, -1975, -1535, -554, -174, -825, -1343, -874, -59, 32,
-  1612, 1533, 1633, 1733, 1706, 2090, 2275, 1806, 1156, 563, 268, 211, 271, 
-    538, 907, 1261, 1702, 2293, 2649, 2660, 2547,
-  2419, 2111, 1824, 2342, 3078, 3489, 3817, 4036, 3536, 2721, 2431, 2223, 
-    1621, 1130, 1099, 1187, 1365, 1734, 1853, 1794, 1817,
-  1935, 1673, 1398, 1701, 2421, 3096, 3725, 4314, 4164, 3743, 3588, 3133, 
-    2378, 1688, 1220, 1003, 988, 969, 815, 923, 1067,
-  744, 968, 815, 368, 815, 2042, 2964, 3450, 3400, 3221, 3209, 2738, 1997, 
-    1475, 939, 506, 417, 350, 143, 211, 425,
-  215, 1092, 1203, 423, 633, 1662, 2350, 2653, 2482, 2187, 2131, 1832, 1219, 
-    683, 233, -171, -361, -278, -184, -190, -15,
-  693, 1507, 1919, 1710, 1579, 1594, 1662, 1694, 1533, 1368, 1159, 757, 344, 
-    -44, -499, -998, -1219, -872, -406, -249, -112,
-  1045, 1544, 1995, 2184, 1977, 1340, 673, 313, 214, 185, 12, -452, -773, 
-    -650, -912, -1653, -1735, -1047, -383, -88, 38,
-  685, 967, 1370, 1446, 1268, 795, -83, -864, -1104, -1141, -1291, -1525, 
-    -1653, -1407, -1234, -1576, -1625, -857, -138, -4, 71,
-  11, -76, 43, 22, -130, -159, -482, -1208, -1456, -1438, -1633, -1601, 
-    -1696, -1930, -1561, -1306, -1422, -957, -331, -135, -31,
-  -574, -793, -1124, -1298, -1361, -1140, -863, -1078, -1193, -1117, -1211, 
-    -1019, -1012, -1437, -1407, -1178, -1199, -1186, -1020, -616, -303,
-  -856, -1188, -1693, -1954, -1923, -1592, -1083, -990, -1125, -1097, -1301, 
-    -1359, -979, -880, -910, -624, -482, -809, -1253, -1242, -971,
-  -1065, -1411, -1732, -2012, -2081, -1700, -1100, -851, -950, -1076, -1524, 
-    -1850, -1449, -1122, -925, -393, -115, -346, -841, -1276, -1519,
-  -1514, -1497, -1531, -1792, -2015, -1650, -1109, -901, -843, -863, -1119, 
-    -1238, -910, -795, -1027, -928, -584, -300, -225, -746, -1568,
-  -1957, -1763, -1813, -1844, -1670, -1419, -1360, -1285, -964, -680, -574, 
-    -578, -336, -107, -698, -1228, -850, -162, 237, -353, -1340,
-  -2161, -2050, -2130, -1914, -1515, -1583, -1719, -1428, -1007, -603, -294, 
-    -440, -721, -535, -548, -971, -904, -323, 95, -301, -984,
-  -2030, -2155, -1937, -1639, -1682, -2055, -1951, -1495, -1172, -621, -213, 
-    -497, -1013, -887, -336, -545, -1233, -1170, -526, -400, -750,
-  -1257, -1738, -1586, -1533, -1619, -1790, -1867, -1708, -1393, -755, -350, 
-    -664, -788, -165, 225, -279, -1087, -1361, -850, -279, -186,
-  2474, 2571, 2659, 2430, 2349, 2731, 3231, 3686, 3985, 3662, 2877, 2088, 
-    1191, 510, 555, 982, 1337, 1673, 2035, 2259, 2262,
-  2625, 2713, 2732, 2289, 2026, 2622, 3480, 4089, 4433, 4393, 3943, 3208, 
-    2407, 1855, 1627, 1610, 1735, 1783, 1792, 1856, 1648,
-  1896, 2269, 2233, 1792, 1613, 1835, 2432, 2920, 2844, 2811, 2891, 2797, 
-    2739, 2403, 1841, 1697, 1783, 1560, 1220, 1072, 852,
-  975, 1540, 1566, 1303, 1414, 1406, 1500, 1870, 1814, 1653, 1946, 2335, 
-    2361, 1933, 1342, 938, 842, 781, 456, 144, 61,
-  205, 921, 1079, 1105, 1544, 1868, 1784, 1688, 1727, 1716, 1585, 1576, 1600, 
-    1303, 613, -140, -326, -42, -10, -241, -289,
-  -160, 660, 1015, 1137, 1533, 2224, 2340, 1737, 1462, 1501, 886, 149, 191, 
-    398, 45, -611, -911, -603, -166, -75, -98,
-  -48, 647, 1094, 1159, 1348, 1750, 1752, 1300, 960, 765, 204, -714, -1233, 
-    -955, -634, -936, -1252, -936, -346, -4, 104,
-  300, 646, 833, 837, 881, 824, 565, 335, 112, -163, -486, -1126, -1850, 
-    -1925, -1592, -1524, -1439, -964, -396, -79, 53,
-  348, 360, 176, 43, -98, -198, -389, -739, -913, -916, -1130, -1579, -1998, 
-    -2258, -2241, -1914, -1390, -687, -201, -124, 38,
-  -402, -520, -734, -887, -1006, -951, -1116, -1562, -1557, -1253, -1356, 
-    -1521, -1646, -2156, -2417, -2030, -1412, -594, -76, -143, -170,
-  -1335, -1331, -1563, -1667, -1588, -1480, -1672, -2035, -1966, -1586, 
-    -1497, -1366, -1126, -1449, -1855, -1639, -1169, -778, -425, -347, -821,
-  -1777, -1576, -1879, -2025, -1891, -1880, -1956, -2089, -2138, -1870, 
-    -1630, -1504, -1124, -798, -838, -731, -482, -665, -854, -762, -1259,
-  -2111, -2096, -2023, -2015, -2044, -2044, -2041, -2122, -2107, -1925, 
-    -1759, -1495, -1092, -851, -908, -873, -555, -523, -852, -1068, -1450,
-  -2080, -2246, -2145, -2062, -2124, -2105, -2181, -2263, -2083, -1902, 
-    -1746, -1366, -953, -968, -1763, -2214, -1130, -426, -1049, -1440, -1559,
-  -1518, -1342, -1728, -1985, -1913, -1976, -2088, -1869, -1825, -1806, 
-    -1310, -1038, -1096, -1128, -1758, -2031, -696, -91, -1144, -1562, -1249,
-  -1583, -1333, -1508, -1782, -1825, -1870, -1789, -1411, -1597, -1912, 
-    -1329, -859, -1149, -1305, -901, -251, 110, -24, -457, -821, -780,
-  -1882, -1800, -1749, -1918, -1989, -1852, -1741, -1674, -1581, -1495, 
-    -1447, -1309, -994, -701, -22, 785, 468, -149, -12, -65, -280,
-  2293, 2249, 2339, 2492, 2972, 3740, 4023, 3937, 3896, 3779, 3491, 2911, 
-    2291, 1825, 1271, 874, 857, 1070, 1279, 1270, 1364,
-  2172, 1871, 1841, 2386, 2934, 3373, 3449, 3243, 3436, 3802, 3900, 3652, 
-    2976, 2045, 1547, 1740, 1825, 1616, 1506, 1302, 1153,
-  1109, 1265, 1488, 1948, 2382, 2486, 2410, 2381, 2453, 2432, 2351, 2437, 
-    2348, 1734, 1371, 1731, 1989, 1763, 1279, 737, 611,
-  80, 747, 1357, 1598, 1798, 1707, 1454, 1640, 1789, 1568, 1476, 1444, 1296, 
-    1248, 1377, 1532, 1428, 1083, 618, 63, -121,
-  -636, 309, 1179, 1432, 1444, 1468, 1303, 1262, 1563, 1834, 1896, 1541, 882, 
-    607, 815, 1004, 817, 333, -82, -421, -584,
-  -573, 452, 1249, 1494, 1385, 1460, 1707, 1667, 1641, 1878, 1864, 1346, 753, 
-    246, -80, 114, 257, -79, -214, -207, -233,
-  180, 1178, 1745, 1714, 1318, 1123, 1472, 1609, 1276, 1088, 939, 498, 230, 
-    -120, -830, -918, -682, -672, -259, 103, 156,
-  448, 1115, 1402, 1119, 633, 464, 617, 593, 359, 147, -39, -238, -477, -909, 
-    -1481, -1646, -1331, -921, -665, -645, -565,
-  66, 191, 196, -179, -481, -275, -77, -307, -680, -825, -727, -674, -948, 
-    -1361, -1571, -1423, -783, -238, -545, -1237, -1576,
-  -682, -590, -394, -844, -1277, -928, -599, -883, -1412, -1532, -1185, 
-    -1048, -1142, -1090, -1159, -1157, -658, -261, -243, -599, -1468,
-  -1445, -1123, -792, -1205, -1722, -1512, -1218, -1343, -1533, -1564, -1409, 
-    -1237, -1108, -876, -917, -1230, -1291, -1097, -551, -154, -932,
-  -1811, -1662, -1695, -1849, -1953, -1820, -1534, -1461, -1526, -1547, 
-    -1505, -1289, -1071, -916, -712, -655, -835, -851, -520, -280, -795,
-  -2076, -2364, -2370, -2125, -1922, -1779, -1466, -1411, -1684, -1757, 
-    -1699, -1558, -1234, -959, -720, -382, -204, -144, -30, -221, -884,
-  -2101, -2443, -2302, -1967, -1814, -1833, -1731, -1619, -1721, -1773, 
-    -1689, -1592, -1285, -991, -1213, -1198, -416, 149, 224, -215, -1099,
-  -1841, -1785, -1844, -1836, -1751, -1806, -1914, -1721, -1619, -1611, 
-    -1233, -1077, -1233, -1182, -1322, -1204, -185, 482, 168, -555, -1102,
-  -1668, -1649, -1790, -1834, -1717, -1625, -1610, -1448, -1517, -1572, 
-    -1055, -886, -1423, -1562, -782, 227, 737, 635, -51, -785, -862,
-  -732, -1054, -1586, -1822, -1637, -1517, -1465, -1364, -1353, -1228, -1025, 
-    -1107, -1399, -1333, -208, 1085, 1067, 361, -132, -425, -426,
-  1667, 1421, 1436, 2225, 3262, 3779, 3435, 2582, 2653, 3674, 4454, 5052, 
-    5399, 4675, 3239, 2622, 2738, 2388, 1992, 2012, 1818,
-  1666, 1363, 1229, 1933, 2705, 3135, 3131, 2428, 1931, 2257, 2902, 3394, 
-    3448, 3075, 2542, 2370, 2741, 2809, 2228, 1823, 1580,
-  783, 950, 1085, 1642, 2163, 2425, 2616, 2612, 1997, 1392, 1714, 2159, 2119, 
-    1944, 1760, 1789, 2141, 2346, 1987, 1442, 808,
-  -56, 140, 434, 1023, 1492, 1787, 2182, 2426, 1863, 1280, 1657, 2177, 2304, 
-    2040, 1580, 1500, 1499, 1189, 925, 792, 304,
-  -420, -506, -322, 255, 789, 1325, 1906, 1912, 1438, 1556, 2258, 2585, 2467, 
-    2127, 1672, 1439, 1120, 453, 98, 126, -34,
-  -414, -320, -215, 181, 719, 1212, 1552, 1525, 1566, 2146, 2655, 2373, 1771, 
-    1537, 1263, 841, 523, 117, -128, -53, 80,
-  -56, 383, 620, 805, 1135, 1429, 1231, 1059, 1501, 1929, 1836, 1234, 478, 
-    243, 257, -29, -310, -350, -287, 8, 523,
-  375, 689, 1034, 1071, 999, 1046, 593, 166, 416, 500, 226, -108, -627, -855, 
-    -595, -585, -763, -487, -148, -97, 113,
-  26, 205, 485, 509, 325, 110, -292, -608, -537, -584, -832, -1011, -1126, 
-    -964, -766, -885, -749, -240, -121, -373, -391,
-  -915, -719, -548, -374, -477, -688, -793, -1029, -1124, -988, -1064, -1288, 
-    -1368, -1123, -892, -948, -663, -332, -701, -885, -584,
-  -1364, -1315, -1279, -1051, -1207, -1378, -1276, -1383, -1514, -1361, 
-    -1279, -1327, -1449, -1512, -1328, -1169, -1010, -853, -1141, -1491, -1433,
-  -1498, -1413, -1457, -1419, -1550, -1710, -1702, -1579, -1465, -1487, 
-    -1595, -1440, -1159, -1292, -1616, -1651, -1353, -922, -924, -1512, -1984,
-  -1973, -1729, -1528, -1627, -1903, -2021, -1919, -1807, -1697, -1617, 
-    -1710, -1503, -847, -665, -1215, -1641, -1271, -568, -510, -1038, -1632,
-  -2260, -2095, -1652, -1678, -2242, -2512, -2179, -1979, -1962, -1806, 
-    -1683, -1449, -925, -454, -617, -1277, -1335, -864, -833, -1049, -1344,
-  -1901, -1964, -1752, -1560, -1959, -2419, -2062, -1664, -1718, -1766, 
-    -1464, -1039, -1202, -1388, -1019, -856, -882, -1109, -1661, -1632, -1290,
-  -1650, -1900, -1891, -1570, -1556, -1962, -1788, -1293, -1427, -1757, 
-    -1417, -861, -1526, -2511, -1711, -246, 93, -737, -1909, -1986, -1249,
-  -1575, -1726, -1604, -1568, -1515, -1511, -1528, -1260, -1213, -1475, 
-    -1391, -1159, -1628, -2253, -1441, 1, 140, -811, -1590, -1479, -896,
-  1386, 1306, 2063, 2993, 3321, 3242, 3314, 3792, 4077, 3984, 4054, 4153, 
-    4016, 3658, 2834, 1874, 1431, 1290, 1099, 1073, 1305,
-  2009, 1320, 1219, 1951, 2638, 2786, 2781, 3372, 4094, 4275, 4502, 4464, 
-    3700, 2911, 2324, 1930, 1920, 1902, 1489, 1344, 1740,
-  854, 1098, 677, 561, 1587, 2233, 2197, 2738, 3698, 4354, 4460, 3851, 3005, 
-    2505, 2112, 1803, 1951, 2140, 1776, 1429, 1548,
-  -410, 354, 189, -209, 414, 1015, 1397, 2221, 3180, 3623, 3239, 2768, 2768, 
-    2766, 2331, 1772, 1720, 1864, 1414, 426, -83,
-  -1138, -795, -561, -580, -387, 181, 1013, 1982, 2618, 2468, 2351, 2998, 
-    3348, 2917, 2578, 2187, 1630, 1278, 695, -243, -792,
-  -1774, -1760, -1385, -910, -277, 584, 1263, 1873, 2281, 2209, 2410, 3107, 
-    3248, 2417, 1774, 1572, 1025, 429, 89, -24, 37,
-  -1740, -1605, -1131, -308, 557, 1143, 1396, 1680, 2055, 2329, 2239, 1959, 
-    1947, 1470, 416, -42, -25, -127, -243, -168, 267,
-  -1001, -649, -90, 595, 864, 861, 1092, 1193, 1237, 1446, 1170, 584, 462, 
-    408, -93, -615, -635, -334, -369, -700, -501,
-  -673, -281, 89, 329, 172, 110, 482, 425, 143, 40, -332, -719, -765, -571, 
-    -379, -600, -920, -703, -491, -769, -868,
-  -1240, -778, -545, -590, -656, -605, -535, -606, -734, -963, -1422, -1814, 
-    -1737, -1364, -1084, -1000, -1133, -1171, -835, -504, -548,
-  -1711, -1339, -1092, -1090, -1080, -1165, -1403, -1509, -1499, -1621, 
-    -2035, -2497, -2474, -1981, -1356, -916, -957, -1203, -1059, -681, -671,
-  -1654, -1723, -1609, -1382, -1384, -1570, -1680, -1856, -1970, -2004, 
-    -2282, -2550, -2557, -2101, -1198, -710, -722, -631, -565, -714, -960,
-  -1921, -1943, -1896, -1747, -1776, -1926, -1898, -1946, -1985, -1942, 
-    -2037, -2025, -1839, -1567, -1333, -1274, -997, -396, -42, -333, -986,
-  -2395, -2005, -1694, -1732, -1991, -2159, -2042, -1840, -1784, -1855, 
-    -1834, -1601, -1233, -1079, -1405, -1632, -1294, -525, 105, -382, -1288,
-  -2310, -2085, -1655, -1488, -1846, -2147, -1818, -1420, -1659, -2056, 
-    -1827, -1362, -1408, -1607, -1459, -1247, -955, -190, 465, -33, -910,
-  -1941, -2047, -1904, -1608, -1675, -1997, -1673, -1256, -1722, -2207, 
-    -1786, -1316, -1953, -2615, -1872, -687, -146, 41, 484, 819, 177,
-  -1490, -1661, -1667, -1718, -1706, -1728, -1657, -1416, -1536, -1862, 
-    -1688, -1460, -2020, -2502, -1643, -117, 536, 152, 175, 913, 704,
-  1560, 1537, 1595, 2139, 2557, 2822, 3389, 3820, 3611, 3661, 4166, 4202, 
-    3782, 3229, 2478, 1756, 1319, 817, 377, 480, 765,
-  1954, 1831, 1567, 1906, 2276, 2448, 3084, 3872, 3910, 3975, 4660, 4480, 
-    3317, 2569, 2136, 1814, 1850, 1574, 846, 461, 585,
-  711, 1123, 1388, 1330, 1144, 1385, 2031, 2649, 3130, 3814, 4493, 4059, 
-    2906, 2363, 2150, 1900, 2117, 2285, 1556, 594, 262,
-  -313, 146, 287, -110, -284, 267, 797, 1284, 2223, 2975, 3181, 3171, 3034, 
-    2945, 2782, 2354, 2227, 2376, 1974, 915, 8,
-  -480, -292, -537, -672, -539, -404, -90, 582, 1351, 1745, 1897, 2423, 3096, 
-    3413, 3246, 2682, 2203, 2050, 1889, 1258, 501,
-  -1032, -346, 30, 336, 340, -164, -125, 596, 1117, 1395, 1742, 2083, 2390, 
-    2753, 2805, 2229, 1526, 1215, 1126, 1029, 1028,
-  -1084, 119, 1055, 1418, 1379, 944, 634, 1110, 1669, 1691, 1849, 1966, 1537, 
-    1291, 1438, 1192, 594, 279, 203, 334, 774,
-  6, 650, 1219, 1509, 1437, 1142, 813, 1036, 1495, 1421, 1274, 1307, 917, 
-    284, 108, 195, 126, -62, -326, -429, 4,
-  123, 56, 140, 262, 126, 52, 90, 156, 426, 455, 65, -167, -197, -267, -329, 
-    -311, -201, -337, -757, -815, -263,
-  -1092, -1086, -954, -1009, -1052, -933, -809, -741, -565, -527, -847, 
-    -1263, -1389, -1053, -552, -363, -531, -896, -1088, -618, 40,
-  -1526, -1447, -1161, -1282, -1375, -1450, -1571, -1389, -1193, -1104, 
-    -1083, -1334, -1541, -1441, -930, -409, -604, -1088, -1155, -747, -326,
-  -984, -1255, -1386, -1492, -1537, -1711, -1886, -1805, -1724, -1580, -1283, 
-    -1209, -1274, -1278, -1024, -503, -380, -626, -865, -1078, -1089,
-  -993, -1159, -1655, -1921, -1834, -1819, -1886, -1959, -2060, -1942, -1564, 
-    -1318, -1208, -1058, -876, -543, -223, -160, -387, -861, -1170,
-  -1548, -1377, -1532, -1965, -2070, -1933, -1946, -1909, -1907, -1918, 
-    -1603, -1195, -1034, -1087, -1081, -793, -306, 51, -44, -666, -1166,
-  -1961, -1933, -1834, -1839, -1974, -1951, -1710, -1519, -1709, -1892, 
-    -1412, -932, -1367, -2051, -1993, -1197, -92, 646, 487, -369, -1058,
-  -2098, -2261, -2268, -1974, -1889, -1899, -1397, -1082, -1574, -1867, 
-    -1199, -943, -2151, -3147, -2577, -1132, 303, 1097, 979, 443, -141,
-  -1553, -1766, -1885, -2041, -2109, -1981, -1565, -1122, -1140, -1363, 
-    -1067, -953, -2114, -3103, -2254, -585, 433, 824, 1052, 1097, 616,
-  3121, 2355, 1986, 2431, 2707, 2712, 2925, 3483, 4042, 4327, 4538, 4975, 
-    4862, 3967, 3176, 2254, 1187, 539, 283, 306, 457,
-  2458, 1759, 1739, 2130, 2261, 2510, 2722, 3034, 3615, 4275, 4986, 5510, 
-    4643, 2543, 1639, 1834, 1451, 998, 991, 880, 687,
-  724, 832, 1199, 1433, 1580, 1663, 1776, 2216, 2922, 3725, 4606, 4658, 3052, 
-    1052, 925, 2115, 2261, 1813, 1765, 1476, 913,
-  -128, -27, 230, 459, 473, 263, 487, 1300, 2164, 2690, 3165, 3145, 2002, 
-    1014, 1507, 2636, 3014, 2643, 1887, 1295, 851,
-  -412, -399, -292, -289, -526, -662, -428, 222, 1078, 1499, 1498, 1803, 
-    2143, 2151, 2374, 2730, 2851, 2469, 1470, 816, 609,
-  -700, -219, -96, -185, -158, -185, -316, -64, 428, 580, 574, 1108, 1982, 
-    2346, 2283, 2201, 2002, 1640, 1210, 712, 471,
-  -680, -357, -58, 261, 903, 1056, 720, 754, 869, 649, 753, 1323, 1644, 1580, 
-    1459, 1370, 1192, 946, 782, 617, 582,
-  -401, -626, -369, 159, 922, 1432, 1400, 1356, 1418, 1162, 984, 1209, 1250, 
-    949, 688, 569, 502, 350, 158, 149, 202,
-  -113, -592, -835, -567, -99, 448, 855, 1034, 918, 498, 244, 270, 267, 113, 
-    -155, -310, -267, -269, -344, -395, -475,
-  -111, -685, -1207, -1330, -1243, -1019, -529, -206, -545, -957, -905, -782, 
-    -808, -833, -902, -1028, -1025, -949, -980, -923, -699,
-  -432, -900, -1294, -1565, -1767, -1879, -1751, -1579, -1767, -1978, -1889, 
-    -1679, -1481, -1451, -1441, -1367, -1488, -1639, -1716, -1606, -1139,
-  -722, -912, -1143, -1302, -1457, -1639, -1863, -1974, -2054, -2229, -2314, 
-    -2225, -1987, -1769, -1644, -1499, -1466, -1638, -1881, -2082, -1921,
-  -833, -699, -767, -946, -1012, -951, -1185, -1771, -2008, -1930, -1991, 
-    -2089, -1989, -1559, -1240, -1254, -919, -554, -1041, -1875, -2034,
-  -993, -908, -810, -770, -805, -808, -1127, -1744, -1930, -1770, -1627, 
-    -1448, -1356, -1281, -1204, -1090, -299, 558, 10, -1166, -1486,
-  -1563, -1838, -1681, -1148, -1027, -1280, -1513, -1580, -1751, -1886, 
-    -1454, -1033, -1373, -2002, -2162, -1527, -94, 811, 195, -690, -996,
-  -2047, -2325, -2257, -1877, -1755, -1810, -1492, -1194, -1585, -1844, 
-    -1233, -1038, -2089, -3058, -2777, -1517, -56, 588, 163, -346, -535,
-  -1536, -1751, -1855, -2057, -2175, -2020, -1543, -1134, -1220, -1391, 
-    -1074, -1036, -2100, -3093, -2500, -957, 25, 448, 644, 429, 109,
-  2617, 2084, 2175, 2374, 2321, 2337, 2684, 3207, 3890, 4638, 5180, 5469, 
-    4979, 3972, 3578, 3592, 3437, 3211, 2720, 1776, 851,
-  1271, 1306, 1806, 2008, 1945, 1948, 2247, 2628, 2891, 3094, 3242, 3581, 
-    3951, 3859, 3660, 3791, 3820, 3501, 3042, 2280, 1481,
-  -32, 227, 598, 459, 491, 928, 1532, 1797, 1713, 1961, 2428, 2857, 3339, 
-    3406, 3137, 3333, 3637, 3324, 2754, 2291, 1875,
-  -290, -477, -967, -1233, -497, 804, 1566, 1356, 977, 1523, 2393, 2660, 
-    2688, 2629, 2457, 2610, 2961, 2747, 2199, 2069, 1725,
-  -815, -1465, -1873, -1958, -1281, 18, 738, 591, 413, 992, 1759, 1987, 2068, 
-    2157, 2173, 2129, 2194, 2238, 1860, 1551, 1236,
-  -1096, -1356, -1260, -1938, -2448, -1947, -1308, -578, 112, 409, 838, 1560, 
-    1899, 1788, 1922, 2104, 2075, 2186, 1825, 1126, 942,
-  -280, 133, 177, -974, -2053, -1780, -1051, -184, 552, 451, 527, 1420, 1895, 
-    1652, 1653, 2040, 2047, 1727, 1517, 1171, 687,
-  182, 677, 743, 178, -499, -160, 678, 934, 882, 856, 1070, 1552, 1845, 1751, 
-    1438, 1408, 1469, 984, 622, 638, 84,
-  41, 74, -73, -196, -328, -137, 368, 503, 479, 696, 1023, 1263, 1358, 1219, 
-    637, 211, 500, 521, -92, -326, -499,
-  -241, -522, -960, -1173, -1062, -956, -940, -691, -283, -103, -82, -1, 208, 
-    282, -187, -710, -553, -196, -443, -851, -849,
-  -754, -1208, -1403, -1356, -1180, -1188, -1397, -1284, -1050, -967, -868, 
-    -788, -686, -502, -509, -799, -946, -870, -1078, -1381, -1222,
-  -1179, -1646, -1699, -1416, -1220, -1324, -1527, -1478, -1499, -1587, 
-    -1278, -834, -766, -810, -739, -815, -912, -1002, -1394, -1715, -1670,
-  -1379, -1451, -1747, -1908, -1788, -1749, -1890, -1863, -1757, -1795, 
-    -1546, -891, -481, -480, -763, -1087, -1087, -896, -962, -1423, -1864,
-  -1428, -1424, -1911, -2350, -2174, -1920, -2029, -2171, -2017, -1812, 
-    -1404, -578, -167, -467, -976, -1243, -870, -495, -815, -1333, -1638,
-  -1568, -1866, -2271, -2316, -2123, -1910, -1663, -1630, -1748, -1651, 
-    -1110, -393, -554, -1472, -1877, -1406, -375, -196, -1211, -1652, -1394,
-  -1698, -2042, -2194, -2007, -1983, -2028, -1442, -985, -1307, -1341, -821, 
-    -722, -1593, -2599, -2452, -1258, -171, -244, -1079, -1485, -1362,
-  -1602, -1604, -1574, -1747, -1781, -1886, -1646, -1267, -1419, -1369, -880, 
-    -881, -1801, -2649, -2116, -762, -115, -164, -315, -698, -978,
-  943, 1109, 1697, 1923, 1965, 2570, 3254, 3502, 3869, 4168, 4222, 4818, 
-    5522, 5346, 4585, 4179, 4066, 3594, 3358, 3100, 1666,
-  898, 1172, 1824, 2250, 2090, 2225, 2932, 3241, 3321, 3283, 3388, 4350, 
-    4946, 4331, 3927, 4137, 3904, 3484, 3357, 2703, 1439,
-  769, 593, 788, 1096, 1231, 1587, 2238, 2669, 2636, 2518, 2888, 3658, 3841, 
-    3389, 3455, 3572, 2915, 2743, 3121, 2531, 1373,
-  -83, -825, -1162, -1043, -588, 423, 1391, 1810, 1830, 2121, 2687, 2962, 
-    2837, 2690, 2640, 2309, 2083, 2313, 2412, 1887, 768,
-  -1450, -2061, -2359, -2269, -1834, -824, 222, 945, 1400, 1830, 2285, 2438, 
-    2420, 2373, 1904, 1460, 1777, 1964, 1779, 1663, 656,
-  -1954, -2109, -2079, -1738, -1386, -807, -105, 412, 965, 1470, 1705, 1885, 
-    2173, 2203, 1760, 1588, 1868, 1839, 1865, 2016, 1176,
-  -1366, -1099, -1000, -490, 205, 711, 582, -66, 173, 1061, 1349, 1526, 1859, 
-    1884, 1726, 1685, 1809, 1945, 1931, 1682, 1161,
-  -448, -14, -140, -36, 781, 1420, 879, -33, 137, 928, 1353, 1561, 1636, 
-    1513, 1398, 1338, 1313, 1365, 1227, 834, 578,
-  192, 244, -222, -528, 15, 762, 710, 264, 308, 719, 1132, 1331, 1240, 970, 
-    629, 494, 508, 343, 127, 63, 93,
-  58, -146, -575, -855, -558, -144, -69, -348, -463, -154, 262, 467, 424, 
-    181, -326, -643, -400, -351, -677, -631, -363,
-  -480, -803, -877, -874, -783, -970, -1172, -1147, -1200, -1130, -785, -547, 
-    -549, -648, -877, -1052, -867, -701, -942, -1170, -1060,
-  -1072, -1509, -1348, -1056, -1136, -1483, -1564, -1217, -1103, -1364, 
-    -1383, -1191, -1121, -1035, -921, -908, -873, -632, -658, -1214, -1428,
-  -1510, -1866, -1662, -1436, -1804, -2159, -1910, -1340, -1114, -1447, 
-    -1610, -1275, -881, -665, -667, -733, -614, -84, 203, -545, -1230,
-  -1363, -1864, -2002, -2030, -2403, -2810, -2578, -2016, -1809, -1888, 
-    -1672, -908, -238, -316, -635, -550, -289, 357, 996, 272, -817,
-  -1207, -1748, -2253, -2168, -2107, -2373, -2349, -2126, -1902, -1664, 
-    -1415, -776, -312, -831, -1176, -625, -209, 293, 953, 503, -400,
-  -1419, -1903, -2167, -1858, -1711, -1622, -1295, -1164, -1097, -1069, 
-    -1174, -1035, -1052, -1631, -1516, -425, 123, 192, 360, 63, -428,
-  -1238, -1858, -2047, -1955, -1958, -1624, -1003, -738, -876, -1261, -1271, 
-    -868, -1111, -1652, -1139, 85, 620, 391, 132, -212, -558,
-  954, 1376, 1807, 1755, 1742, 2562, 3203, 3066, 3126, 3721, 4305, 4744, 
-    4961, 4876, 4679, 4141, 3358, 2829, 2611, 2662, 2521,
-  1203, 1209, 1348, 1710, 2104, 2243, 2523, 3307, 3745, 3851, 4052, 4060, 
-    4198, 4496, 4571, 4427, 3977, 3382, 2919, 2646, 2512,
-  688, 650, 538, 581, 954, 1229, 1600, 2411, 3144, 3380, 3238, 3171, 3433, 
-    3693, 3758, 3920, 4118, 3825, 2996, 2315, 1941,
-  -529, -544, -711, -973, -767, -283, 487, 1433, 2005, 2109, 1993, 2116, 
-    2426, 2682, 2944, 3103, 3283, 3305, 2635, 1721, 1046,
-  -1952, -1916, -1649, -1386, -1054, -646, -236, 339, 791, 1132, 1563, 1566, 
-    1446, 1961, 2414, 2320, 2175, 2140, 2152, 1865, 1256,
-  -2613, -2349, -1575, -530, 125, 357, 386, 244, 257, 1076, 1976, 1549, 965, 
-    1524, 1728, 1407, 1527, 1610, 1791, 1988, 1719,
-  -1623, -1290, -496, 598, 1314, 1265, 1285, 1034, 404, 920, 1643, 1018, 545, 
-    926, 830, 792, 1522, 1920, 1919, 1743, 1214,
-  298, 232, 563, 1037, 1296, 1086, 884, 789, 527, 469, 514, 310, 354, 411, 
-    47, 268, 1268, 1926, 2029, 1667, 771,
-  1141, 536, 361, 447, 355, 39, -266, -46, 391, 171, -164, 123, 509, 159, 
-    -507, -446, 161, 618, 641, 578, 456,
-  395, -301, -705, -721, -723, -962, -1031, -539, -68, -268, -642, -407, 85, 
-    -153, -752, -736, -516, -695, -1288, -1394, -479,
-  -340, -1041, -1644, -1673, -1443, -1377, -1346, -1116, -887, -953, -1191, 
-    -1194, -877, -737, -878, -677, -407, -701, -1459, -2012, -1423,
-  -767, -1460, -1926, -1857, -1684, -1550, -1494, -1511, -1484, -1407, -1244, 
-    -1209, -1521, -1677, -1362, -929, -606, -381, -540, -1184, -1465,
-  -1464, -1560, -1664, -1736, -1835, -1922, -1814, -1591, -1558, -1579, 
-    -1192, -807, -1141, -1624, -1555, -1235, -684, 43, 135, -495, -1078,
-  -1627, -1440, -1662, -1947, -2109, -2256, -2140, -1836, -1779, -1812, 
-    -1364, -492, 105, -159, -989, -1255, -535, 298, 376, -314, -997,
-  -1428, -1737, -2020, -2034, -2060, -2088, -1873, -1738, -1777, -1700, 
-    -1348, -449, 291, -223, -1163, -1458, -1291, -837, -382, -426, -733,
-  -1557, -2107, -2107, -1750, -1629, -1629, -1377, -1185, -1234, -1239, 
-    -1138, -856, -1087, -2027, -2058, -1422, -1492, -1588, -1188, -709, -466,
-  -1220, -1665, -1757, -1651, -1564, -1581, -1574, -1364, -1287, -1433, 
-    -1228, -1060, -1843, -2627, -2002, -697, -256, -599, -760, -639, -495,
-  23, 619, 1507, 2030, 2017, 2107, 2616, 3196, 3226, 2826, 2614, 2705, 2897, 
-    3001, 3273, 3878, 4189, 3952, 3455, 2970, 2443,
-  608, 656, 1142, 1607, 1745, 1860, 2490, 3165, 3006, 2414, 2249, 2392, 2306, 
-    2042, 2504, 3811, 4385, 4018, 3673, 3090, 2302,
-  187, 161, 268, 714, 1465, 1661, 1658, 1857, 1907, 2011, 2399, 2620, 2182, 
-    1905, 2721, 3704, 3740, 3289, 2947, 2532, 1838,
-  -1088, -1119, -692, -284, 365, 624, 62, -77, 652, 1645, 2450, 2542, 2118, 
-    2506, 3388, 3321, 2847, 2378, 1589, 1225, 1073,
-  -2452, -2384, -1711, -1146, -725, -586, -953, -1033, -286, 839, 1675, 1726, 
-    1568, 2331, 3065, 2617, 2209, 2007, 1262, 745, 704,
-  -2684, -2430, -1976, -1522, -946, -195, 34, -466, -576, 11, 541, 693, 891, 
-    1487, 1983, 1905, 1738, 1856, 1753, 1430, 1465,
-  -1160, -1078, -801, -768, -514, 560, 1155, 575, 27, -53, 153, 551, 860, 
-    1262, 1632, 1537, 1381, 1573, 1771, 1824, 1929,
-  786, 486, 417, 266, 13, 225, 806, 956, 654, 423, 680, 1157, 1168, 1174, 
-    1394, 1298, 1232, 1281, 1316, 1491, 1387,
-  1532, 921, 474, 208, -125, -327, 81, 533, 556, 708, 1149, 1322, 1020, 561, 
-    337, 559, 965, 1026, 862, 861, 695,
-  1050, 344, -172, -513, -632, -597, -456, -172, 73, 314, 647, 736, 457, 5, 
-    -472, -498, 25, 331, 175, 42, 41,
-  51, -492, -942, -1124, -1037, -1010, -1055, -895, -690, -691, -532, -196, 
-    -173, -367, -881, -1453, -1168, -608, -609, -694, -585,
-  -888, -1217, -1499, -1588, -1489, -1460, -1471, -1404, -1488, -1751, -1612, 
-    -1141, -904, -911, -1353, -1860, -1587, -980, -793, -945, -1019,
-  -1486, -1686, -1716, -1885, -1880, -1699, -1708, -1662, -1776, -2254, 
-    -2308, -1782, -1243, -1074, -1374, -1467, -998, -602, -604, -880, -1083,
-  -1532, -1734, -1825, -2074, -2145, -1942, -1972, -1961, -1908, -2214, 
-    -2369, -1648, -526, -317, -1019, -1211, -523, -95, -433, -851, -964,
-  -1330, -1527, -1840, -1965, -2061, -2040, -1826, -1801, -1937, -1975, 
-    -1862, -1158, -291, -478, -1254, -1495, -1154, -568, -336, -692, -934,
-  -1451, -1552, -1569, -1546, -1752, -1864, -1447, -1165, -1431, -1589, 
-    -1411, -1236, -1542, -2124, -1942, -1375, -1407, -1235, -578, -501, -742,
-  -1688, -1605, -1170, -1250, -1517, -1522, -1496, -1219, -1119, -1448, 
-    -1447, -1414, -2154, -2725, -1943, -693, -365, -650, -618, -407, -392,
-  -363, -535, -1, 489, 988, 1853, 2595, 3225, 3585, 3240, 2624, 2268, 2477, 
-    3096, 3433, 3482, 3629, 3805, 3383, 2266, 1932,
-  108, -370, 215, 901, 967, 1114, 1879, 2756, 3153, 3080, 2581, 2028, 2102, 
-    2446, 2727, 3331, 3688, 3533, 3335, 2760, 2169,
-  -32, -465, -251, -132, -80, 424, 1398, 2292, 2694, 2794, 2665, 2434, 2367, 
-    2498, 2876, 3322, 3305, 3030, 3167, 3077, 2288,
-  -824, -1175, -775, -768, -1080, -569, 476, 1386, 1905, 2099, 2361, 2972, 
-    3378, 3164, 2889, 2850, 2737, 2418, 2285, 2262, 2064,
-  -1770, -2058, -983, -583, -1548, -1765, -945, 24, 816, 1441, 2126, 2704, 
-    3007, 2817, 2361, 2291, 2344, 1872, 990, 882, 1761,
-  -1899, -1984, -825, -501, -1759, -2306, -1914, -1317, -456, 521, 1405, 
-    1449, 1183, 1525, 1929, 1956, 1740, 1449, 698, 244, 1039,
-  -673, -602, -233, -325, -1095, -1505, -1721, -1797, -1204, -406, 187, 474, 
-    660, 1056, 1345, 1266, 1056, 902, 642, 554, 1009,
-  1301, 1254, 475, -91, -68, -191, -550, -677, -420, -241, -143, 465, 1122, 
-    1204, 966, 793, 730, 508, 478, 1154, 1755,
-  2456, 1778, 481, -262, -257, -86, 35, 211, 573, 657, 350, 493, 1031, 1206, 
-    1040, 778, 574, 620, 897, 1349, 1574,
-  1786, 685, -338, -835, -1076, -909, -680, -505, 183, 802, 331, -258, 151, 
-    609, 572, 470, 384, 450, 570, 643, 709,
-  334, -474, -1025, -1070, -1077, -1292, -1226, -812, -398, -102, -415, 
-    -1131, -1212, -738, -412, -251, -110, -201, -462, -373, -44,
-  -612, -1125, -1205, -929, -1026, -1581, -1521, -748, -400, -596, -722, 
-    -1139, -1845, -1722, -1074, -931, -920, -670, -570, -734, -815,
-  -1274, -1514, -1391, -1390, -1781, -2152, -2217, -1822, -1000, -374, -439, 
-    -1040, -1621, -1653, -1342, -1139, -991, -625, -318, -704, -1315,
-  -1732, -1731, -1799, -2265, -2601, -2553, -2602, -2765, -2137, -983, -868, 
-    -1178, -742, -557, -1024, -1043, -442, -152, -432, -918, -1363,
-  -1870, -2005, -2141, -2418, -2784, -2773, -2520, -2642, -2567, -2028, 
-    -1540, -549, 487, 385, -442, -1023, -781, -274, -342, -811, -1169,
-  -2114, -2219, -1877, -1744, -2291, -2504, -2067, -1875, -1905, -1900, 
-    -1377, -30, 459, -313, -799, -938, -1071, -748, -147, -231, -794,
-  -2062, -1953, -1273, -1165, -1526, -1630, -1546, -1346, -1226, -1471, 
-    -1336, -551, -469, -1263, -1478, -799, -307, -265, -2, 81, -397,
-  364, -76, 491, 1095, 1571, 2062, 2116, 2507, 3128, 3149, 2948, 2830, 2536, 
-    2318, 2427, 2582, 2852, 3280, 3222, 2446, 1928,
-  833, -111, 57, 768, 830, 995, 1589, 2420, 2709, 2284, 2466, 2718, 2179, 
-    2095, 2111, 1441, 1666, 2758, 2995, 2476, 1922,
-  276, -431, -748, -387, -332, -258, 689, 1794, 1998, 2007, 2661, 2996, 2696, 
-    2583, 2412, 1782, 1409, 1538, 1897, 2251, 1737,
-  -954, -1416, -1266, -990, -924, -665, 106, 754, 1372, 2487, 3044, 3156, 
-    3532, 3316, 2889, 2779, 2216, 1475, 1541, 2007, 1718,
-  -1786, -1737, -1346, -1280, -1160, -740, -348, 159, 1179, 2210, 2599, 2785, 
-    2999, 2995, 3059, 3034, 2741, 2511, 2109, 1589, 1290,
-  -1033, -761, -1053, -1500, -1317, -933, -756, -183, 528, 727, 1070, 1611, 
-    1883, 2208, 2685, 2740, 2517, 2435, 1825, 1001, 760,
-  913, 488, -533, -1155, -981, -845, -1162, -1064, -698, -503, -36, 620, 
-    1280, 1658, 1718, 1739, 1657, 1364, 951, 784, 778,
-  2073, 1508, 412, -356, -390, -370, -909, -1112, -787, -488, -38, 389, 761, 
-    1011, 806, 647, 844, 830, 649, 604, 620,
-  1799, 1790, 1166, 276, -91, -2, -85, -195, -182, -240, -146, -14, 131, 450, 
-    506, 602, 1000, 971, 654, 445, 335,
-  1090, 918, 571, 161, -150, -161, -37, -96, -318, -455, -473, -494, -244, 
-    238, 472, 870, 1213, 774, 364, 311, 128,
-  487, -170, -648, -602, -716, -971, -974, -743, -573, -689, -780, -666, 
-    -341, 28, 82, 176, 249, -6, -129, -247, -455,
-  -245, -808, -978, -979, -1427, -1900, -1914, -1363, -750, -881, -1179, 
-    -1058, -953, -848, -819, -1041, -1001, -513, -284, -596, -823,
-  -965, -1203, -1009, -1122, -1650, -1916, -1915, -1743, -1339, -1114, -1158, 
-    -1188, -1398, -1685, -1738, -1670, -1330, -630, -257, -537, -889,
-  -1484, -1491, -1558, -1849, -1969, -1725, -1685, -1938, -1874, -1552, 
-    -1233, -618, -159, -671, -1479, -1522, -1042, -563, -300, -572, -1025,
-  -2011, -1986, -1952, -2108, -2311, -2136, -1955, -1917, -1746, -1792, 
-    -1614, -188, 1269, 955, -337, -1037, -853, -294, -12, -325, -774,
-  -2380, -2446, -1790, -1520, -2075, -2111, -1564, -1154, -884, -987, -1048, 
-    -53, 958, 623, -120, -464, -465, 59, 469, -44, -651,
-  -2046, -2134, -1534, -1309, -1723, -1591, -997, -641, -373, -317, -415, 
-    -61, 137, -432, -653, -214, 117, 488, 550, -252, -774 ;
-
- v =
-  -2067, -2025, -668, 603, 1419, 2261, 2410, 1566, 429, -286, -475, -838, 
-    -1354, -1373, -969, -524, -28, 452, 640, 618, 595,
-  -3100, -3037, -999, 1124, 2528, 3511, 3779, 2626, 695, -340, -579, -780, 
-    -833, -915, -1144, -982, -279, 344, 510, 291, -2,
-  -3139, -3255, -750, 1608, 2788, 3856, 4321, 3137, 1477, 692, 200, -123, 
-    -252, -919, -1623, -1334, -385, 432, 708, 201, -328,
-  -2858, -2657, -155, 2000, 3020, 4009, 4239, 3193, 1562, 483, 265, 105, 
-    -456, -1483, -2014, -1368, -373, 471, 740, 224, -139,
-  -1812, -1465, 362, 2554, 3907, 4324, 4030, 3236, 1379, -376, -547, -564, 
-    -1144, -1751, -1939, -1405, -651, 2, 266, 141, 63,
-  -511, -288, 1165, 3002, 3738, 3543, 3070, 2283, 1194, 17, -798, -1211, 
-    -1345, -1348, -1471, -1617, -1497, -747, 12, 114, -40,
-  335, 570, 1698, 2684, 2511, 1891, 1384, 698, 337, 130, -635, -1090, -855, 
-    -953, -1401, -1825, -1995, -1011, 201, 235, -16,
-  776, 901, 1179, 1530, 1528, 981, 331, -209, -640, -706, -731, -764, -539, 
-    -721, -1419, -1868, -1785, -991, 46, 353, 231,
-  891, 570, 231, 619, 1169, 874, 189, -370, -982, -1198, -792, -517, -463, 
-    -403, -898, -1505, -1338, -781, -175, 256, 299,
-  614, 44, -232, 314, 816, 410, -83, -356, -857, -1158, -747, -256, -245, 
-    -457, -875, -1137, -734, -198, -35, 9, 108,
-  97, -206, -208, -51, -32, -459, -687, -531, -649, -982, -833, -270, -257, 
-    -1092, -1680, -1157, -259, 110, 135, 110, -69,
-  -304, -342, -292, -421, -627, -802, -856, -747, -740, -895, -864, -562, 
-    -560, -1393, -2086, -1354, -320, -125, 115, 348, -153,
-  -425, -325, -399, -606, -713, -679, -730, -892, -989, -915, -738, -763, 
-    -865, -1108, -1557, -1276, -544, -306, -102, 27, -407,
-  -123, -68, -262, -579, -651, -751, -830, -922, -1085, -1004, -710, -734, 
-    -994, -997, -821, -604, -317, -178, -273, -500, -811,
-  145, -90, -282, -449, -555, -653, -687, -823, -1017, -963, -775, -702, 
-    -855, -934, -623, -338, -240, -204, -356, -635, -917,
-  110, -224, -374, -422, -517, -309, -347, -640, -640, -711, -782, -620, 
-    -663, -792, -756, -729, -635, -524, -477, -414, -527,
-  345, 96, -107, -149, -220, -333, -437, -346, -397, -768, -584, -185, -629, 
-    -1203, -1068, -628, -493, -719, -646, 19, 356,
-  -195, -835, -1591, -1109, 97, 479, 800, 1742, 2298, 2139, 1656, 1054, 481, 
-    85, 25, 111, -44, -239, 100, 899, 1291,
-  -880, -1499, -1880, -1242, -127, 509, 1096, 2092, 2886, 2763, 1953, 1041, 
-    387, 117, -21, -165, -376, -651, -465, 369, 684,
-  -848, -1522, -1860, -1039, 258, 1053, 1566, 2131, 2737, 2887, 2027, 633, 
-    -78, -21, -155, -602, -991, -1039, -682, -201, 82,
-  -405, -984, -1270, -393, 1042, 1684, 1795, 2035, 2418, 2619, 1802, 313, 
-    -345, -255, -431, -873, -1179, -1057, -641, -207, 358,
-  94, -256, -358, 173, 1226, 1841, 1777, 1719, 1999, 2051, 1216, 36, -518, 
-    -559, -703, -976, -1015, -854, -582, 114, 910,
-  337, 443, 503, 739, 1266, 1595, 1462, 1224, 1236, 1156, 502, -384, -781, 
-    -760, -842, -973, -921, -869, -669, 52, 661,
-  562, 1194, 1288, 1321, 1366, 1139, 833, 635, 438, 198, -156, -572, -764, 
-    -879, -1113, -1140, -1023, -951, -609, -29, 247,
-  1114, 1566, 1486, 1255, 1055, 765, 410, 106, -169, -486, -705, -627, -506, 
-    -842, -1456, -1593, -1204, -695, -126, 274, 257,
-  1363, 1289, 1042, 722, 575, 449, 173, -155, -535, -905, -1021, -796, -477, 
-    -729, -1548, -1739, -1039, -343, 179, 542, 402,
-  842, 649, 419, 214, 133, -55, -243, -279, -606, -1057, -1074, -884, -733, 
-    -854, -1341, -1404, -843, -372, -17, 343, 221,
-  121, 68, 28, -145, -297, -555, -661, -496, -623, -995, -1099, -1021, -1007, 
-    -1027, -1121, -1204, -1026, -608, -124, 87, -241,
-  -156, -46, 13, -260, -504, -650, -748, -682, -714, -986, -1153, -1156, 
-    -1146, -1095, -1182, -1353, -1212, -708, -140, -76, -560,
-  -194, -15, -46, -288, -525, -586, -614, -648, -707, -973, -1167, -1137, 
-    -1110, -1097, -1246, -1368, -1092, -686, -457, -532, -784,
-  -228, -236, -293, -350, -520, -679, -583, -650, -875, -1044, -1174, -1115, 
-    -1053, -1057, -1031, -962, -732, -620, -800, -980, -983,
-  -144, -469, -487, -430, -529, -670, -736, -988, -1196, -1106, -1057, -1080, 
-    -1060, -978, -809, -703, -634, -722, -1027, -1131, -972,
-  -210, -463, -466, -507, -614, -640, -967, -1167, -929, -842, -990, -1054, 
-    -954, -824, -707, -689, -761, -876, -1045, -967, -736,
-  -368, -316, -331, -264, -267, -580, -917, -667, -453, -824, -986, -810, 
-    -883, -1096, -845, -337, -348, -709, -714, -308, -95,
-  -1085, -782, -1356, -2034, -2482, -2521, -1387, 860, 2728, 3318, 3258, 
-    2861, 2595, 2322, 1203, 298, 183, -310, -735, -214, 391,
-  -618, -291, -945, -1802, -2201, -2115, -1096, 836, 2966, 4124, 4091, 3486, 
-    2591, 1546, 516, -117, -217, -484, -716, -532, -452,
-  -218, -591, -814, -1263, -1468, -1064, -307, 951, 2737, 4068, 4284, 3598, 
-    2289, 965, 36, -396, -559, -868, -1048, -1212, -933,
-  -273, -663, -716, -830, -661, -90, 433, 1398, 2728, 3809, 4086, 3131, 1607, 
-    417, -262, -520, -882, -1369, -1376, -1221, -773,
-  -155, 179, -22, -303, -213, 120, 767, 1872, 2782, 3191, 2980, 2010, 926, 
-    -99, -670, -663, -1194, -1763, -1378, -895, -591,
-  442, 1036, 1092, 779, 486, 467, 1118, 2114, 2508, 2195, 1578, 865, 441, 
-    -227, -1100, -1149, -1333, -1741, -1160, -641, -517,
-  1167, 1416, 1896, 1918, 1449, 1068, 1125, 1627, 1728, 1143, 620, 277, 4, 
-    -541, -1561, -1873, -1499, -1259, -666, -208, -209,
-  1544, 1470, 1829, 1799, 1333, 942, 640, 673, 640, 177, -132, -196, -417, 
-    -984, -1824, -2090, -1382, -561, -60, 73, 103,
-  1410, 1329, 1155, 639, 366, 365, 187, 59, -85, -502, -884, -867, -741, 
-    -1108, -1752, -1719, -960, -240, 164, 215, 350,
-  964, 829, 455, -20, -91, -149, -338, -329, -364, -751, -1295, -1390, -1104, 
-    -1159, -1436, -1367, -1042, -538, 96, 317, 279,
-  340, 59, -106, -160, -158, -477, -800, -725, -635, -871, -1193, -1314, 
-    -1296, -1214, -1144, -1203, -1164, -672, 11, 195, -77,
-  -255, -348, -396, -397, -417, -540, -759, -928, -987, -1012, -941, -951, 
-    -1145, -1181, -1165, -1253, -1014, -487, -98, 12, -212,
-  -442, -489, -443, -449, -624, -585, -565, -938, -1199, -1064, -872, -920, 
-    -1119, -1169, -1165, -1226, -1005, -540, -329, -368, -465,
-  -333, -737, -586, -480, -664, -730, -795, -911, -872, -860, -869, -1015, 
-    -1362, -1293, -878, -761, -827, -750, -725, -909, -997,
-  -430, -822, -735, -627, -801, -945, -1090, -1032, -684, -660, -812, -993, 
-    -1383, -1269, -665, -475, -710, -995, -1116, -1127, -1144,
-  -702, -668, -535, -601, -971, -1068, -1055, -1238, -1184, -906, -739, -705, 
-    -745, -679, -522, -578, -869, -1164, -1140, -923, -864,
-  -865, -618, -326, -404, -601, -715, -929, -1075, -1154, -1149, -691, -49, 
-    15, -342, -419, -399, -696, -988, -770, -251, -71,
-  -1258, -453, -215, -473, -694, -809, -681, -203, 1020, 2357, 3323, 4291, 
-    4651, 4120, 3367, 2613, 1626, 466, -285, -620, -699,
-  -1087, -345, -7, 65, -78, -646, -674, -109, 991, 2815, 4677, 5509, 4983, 
-    4145, 3419, 2552, 1608, 480, -493, -961, -892,
-  -529, -783, -772, -480, -27, -233, -637, -221, 1022, 3112, 5179, 5581, 
-    4476, 3286, 2370, 1498, 820, 187, -636, -1159, -1080,
-  -202, -534, -871, -828, -255, -319, -787, -591, 704, 3072, 4847, 4712, 
-    3493, 2155, 1079, 381, -99, -533, -952, -1133, -1002,
-  -24, 165, 228, 328, 173, -454, -727, -599, 265, 2523, 4162, 3721, 2481, 
-    1149, 80, -410, -921, -1253, -1033, -922, -750,
-  169, 571, 964, 1148, 639, 37, 99, 156, 251, 1503, 2746, 2310, 1017, 77, 
-    -400, -822, -1368, -1346, -758, -680, -671,
-  482, 1104, 1186, 997, 724, 572, 755, 787, 352, 258, 892, 828, -205, -587, 
-    -605, -1057, -1264, -942, -494, -367, -407,
-  949, 1584, 1451, 928, 572, 407, 562, 759, 419, -161, -242, -193, -482, 
-    -800, -1090, -1207, -972, -582, -175, -6, -61,
-  1180, 1532, 1377, 716, 230, 46, 176, 374, 214, -208, -523, -513, -634, 
-    -1255, -1507, -1080, -702, -345, 37, -115, -294,
-  967, 927, 651, 163, -111, -77, 25, -177, -469, -661, -724, -527, -729, 
-    -1323, -1209, -655, -479, -399, -257, -478, -707,
-  575, 113, -186, -240, -304, -188, -16, -405, -866, -925, -965, -910, -846, 
-    -890, -543, -148, -345, -591, -463, -425, -642,
-  177, -236, -389, -444, -440, -350, -224, -369, -714, -846, -1003, -1176, 
-    -1045, -729, -248, 29, -373, -593, -223, -169, -487,
-  130, -257, -361, -673, -716, -591, -605, -617, -655, -722, -838, -913, 
-    -763, -463, -215, -228, -563, -608, -145, -88, -555,
-  375, -551, -714, -776, -865, -780, -762, -754, -611, -536, -601, -674, 
-    -554, -196, -78, -350, -648, -671, -284, -139, -610,
-  73, -686, -796, -737, -825, -772, -697, -681, -524, -408, -513, -708, -643, 
-    -200, -11, -315, -699, -794, -434, -241, -542,
-  -445, -449, -469, -754, -929, -787, -734, -818, -752, -579, -497, -607, 
-    -612, -307, -155, -378, -759, -924, -594, -297, -391,
-  -643, -514, -515, -748, -723, -519, -638, -781, -902, -980, -570, -242, 
-    -627, -993, -663, -282, -523, -830, -517, 16, 142,
-  -853, -559, -734, -530, -278, -910, -1561, -1764, -1486, -265, 1601, 3370, 
-    4292, 4040, 3393, 2689, 1857, 1239, 857, 546, 283,
-  -1624, -612, -239, -281, -82, -344, -836, -1100, -956, -90, 1324, 2880, 
-    3710, 3599, 3234, 2559, 1674, 897, 358, 184, -87,
-  -1172, -1147, -937, -672, -386, -174, -203, -497, -553, 74, 1099, 2276, 
-    3193, 3216, 2682, 2121, 1370, 416, -176, -336, -637,
-  -669, -1594, -1796, -1085, -523, -195, 124, 171, 156, 595, 1334, 2163, 
-    2831, 2662, 2030, 1541, 774, -81, -616, -1034, -1148,
-  -508, -1446, -1656, -826, -180, 115, 422, 747, 1006, 1213, 1509, 1956, 
-    2140, 1860, 1415, 773, -6, -568, -1045, -1459, -1337,
-  -229, -339, -220, 156, 387, 593, 915, 1247, 1419, 1335, 1240, 1319, 1260, 
-    955, 507, -152, -724, -1034, -1239, -1292, -1094,
-  417, 1233, 1643, 1195, 591, 733, 1288, 1448, 1191, 921, 827, 736, 526, 108, 
-    -507, -999, -1220, -1252, -1163, -959, -546,
-  767, 1565, 2109, 1508, 366, 181, 796, 1078, 688, 180, 39, 3, -200, -566, 
-    -1086, -1406, -1266, -919, -688, -448, 50,
-  495, 783, 1348, 955, -6, -364, 44, 422, 93, -557, -934, -941, -850, -974, 
-    -1207, -1209, -945, -562, -129, 177, 290,
-  276, 301, 666, 256, -266, -341, -124, 2, -375, -1013, -1426, -1305, -958, 
-    -999, -1085, -808, -594, -526, -184, 160, 115,
-  141, 212, 354, 83, -191, -268, -330, -392, -639, -1230, -1602, -1245, -755, 
-    -750, -771, -556, -409, -427, -474, -315, -126,
-  -50, 21, 4, -61, -116, -342, -648, -871, -1020, -1237, -1423, -1223, -801, 
-    -531, -368, -370, -535, -577, -538, -424, -319,
-  -31, -27, -355, -537, -570, -624, -676, -872, -1120, -1073, -891, -767, 
-    -645, -502, -315, -291, -699, -1061, -810, -532, -743,
-  -78, -91, -377, -608, -956, -1078, -821, -693, -836, -922, -764, -477, 
-    -494, -819, -849, -550, -628, -1071, -1093, -946, -1140,
-  -129, -241, -130, -211, -688, -1110, -1043, -853, -908, -933, -889, -866, 
-    -883, -1131, -1280, -952, -617, -646, -813, -911, -905,
-  -114, -133, -29, -117, -412, -804, -1005, -967, -1098, -1072, -815, -855, 
-    -971, -1057, -1107, -802, -409, -274, -278, -328, -436,
-  -287, -113, -247, -360, -408, -636, -887, -918, -895, -802, -560, -481, 
-    -843, -1337, -1025, -46, 237, -113, -69, 160, -88,
-  419, -12, -1163, -2183, -2219, -1935, -1534, -1059, -651, 60, 1074, 1745, 
-    2431, 3715, 4627, 4565, 4081, 3379, 2375, 1145, 69,
-  -553, -626, -980, -1757, -2085, -1768, -1023, -169, 208, 253, 337, 607, 
-    1672, 3365, 4362, 4414, 4013, 3187, 2152, 1026, 66,
-  -1323, -1542, -1406, -1489, -1683, -1430, -786, -146, -1, -30, 214, 709, 
-    1785, 3207, 3859, 3660, 3294, 2633, 1471, 280, -118,
-  -1603, -1354, -1019, -949, -1245, -1307, -761, -219, -187, -50, 491, 1187, 
-    2108, 2825, 2940, 2578, 1959, 1243, 249, -742, -885,
-  -1534, -529, -59, -330, -883, -1142, -568, 175, 295, 193, 446, 1124, 1891, 
-    2123, 1803, 1283, 572, -126, -773, -1402, -1459,
-  -1229, -380, 66, -123, -241, -117, 249, 661, 738, 486, 454, 850, 1196, 
-    1222, 869, 213, -327, -632, -1018, -1421, -1237,
-  -467, -381, -202, 24, 504, 1056, 1109, 842, 673, 475, 355, 476, 438, 177, 
-    -98, -528, -843, -858, -984, -1248, -913,
-  402, 261, 236, 524, 924, 1139, 921, 573, 335, 41, -147, 8, 18, -444, -858, 
-    -982, -917, -698, -616, -897, -746,
-  810, 871, 900, 961, 902, 556, 150, 8, 17, -204, -513, -465, -345, -521, 
-    -814, -876, -500, -103, -185, -451, -349,
-  620, 659, 841, 831, 479, 67, -290, -476, -293, -296, -655, -759, -751, 
-    -749, -651, -546, -228, -35, -349, -450, -205,
-  159, 169, 316, 241, -36, -262, -466, -602, -532, -546, -735, -834, -953, 
-    -1054, -903, -640, -459, -417, -550, -644, -571,
-  -55, 4, -70, -282, -301, -380, -553, -610, -691, -739, -800, -995, -1072, 
-    -1016, -954, -821, -727, -636, -498, -587, -766,
-  -41, 15, -184, -385, -388, -467, -669, -837, -939, -948, -953, -1013, 
-    -1055, -983, -844, -820, -909, -850, -558, -455, -671,
-  -114, -114, -308, -345, -428, -786, -1063, -1098, -1051, -1058, -987, -773, 
-    -859, -1184, -1215, -1087, -1122, -1071, -753, -557, -684,
-  -223, -329, -511, -532, -612, -1115, -1341, -1114, -1023, -968, -817, -726, 
-    -789, -1183, -1616, -1550, -1239, -1141, -1067, -846, -754,
-  -284, -345, -595, -863, -948, -1157, -1162, -964, -1032, -933, -668, -705, 
-    -762, -904, -1305, -1372, -1069, -1009, -1008, -771, -662,
-  -300, -199, -535, -947, -899, -875, -998, -976, -904, -774, -594, -599, 
-    -895, -1225, -1098, -581, -428, -592, -417, -203, -327,
-  202, 408, -57, -889, -1641, -1760, -1525, -1992, -2305, -1783, -908, -25, 
-    507, 701, 1321, 2747, 3967, 4433, 4490, 3768, 2357,
-  140, 285, 189, -708, -1715, -1469, -977, -1591, -2222, -1729, -470, 351, 
-    479, 688, 1294, 2470, 3601, 3901, 3855, 3144, 1543,
-  -215, -186, -309, -933, -1764, -2028, -1774, -1461, -1511, -964, 752, 1613, 
-    1191, 958, 1309, 2274, 3196, 3050, 2362, 1675, 636,
-  -486, -621, -1045, -1392, -1714, -2010, -1760, -1247, -1029, -10, 1908, 
-    2872, 2649, 2012, 1667, 2045, 2443, 2036, 865, -135, -769,
-  -881, -1045, -1327, -1398, -1412, -1309, -1030, -1337, -1280, 563, 2393, 
-    2762, 2740, 2676, 2327, 1797, 1277, 895, 34, -1368, -2380,
-  -1142, -1138, -886, -572, -481, -530, -649, -1139, -807, 987, 2022, 1721, 
-    1781, 2149, 1845, 1044, 249, -301, -705, -1416, -2101,
-  -393, -355, 135, 480, 692, 600, 32, -291, 97, 765, 975, 967, 1306, 1225, 
-    403, -177, -579, -1197, -1329, -939, -660,
-  914, 714, 786, 817, 929, 955, 474, 114, 165, 199, 219, 404, 517, 8, -832, 
-    -1112, -1088, -1171, -1003, -593, -73,
-  1275, 810, 552, 532, 405, 196, 74, -26, -83, -63, -35, -111, -496, -1001, 
-    -1265, -1253, -1161, -872, -547, -483, -47,
-  750, 299, 223, 240, 22, -132, -202, -266, -248, -288, -258, -357, -920, 
-    -1293, -1237, -1136, -1097, -1008, -837, -715, -429,
-  165, 186, 272, 58, -147, -171, -407, -625, -508, -415, -440, -609, -1059, 
-    -1504, -1459, -1141, -1091, -1043, -774, -734, -987,
-  -195, 138, 140, -251, -311, -436, -775, -825, -601, -459, -684, -889, 
-    -1025, -1329, -1146, -945, -1192, -903, -377, -462, -933,
-  -124, -178, -427, -554, -469, -568, -836, -818, -661, -800, -1076, -1088, 
-    -1003, -764, -428, -768, -1205, -881, -413, -312, -581,
-  -85, -401, -750, -504, -491, -794, -906, -828, -854, -1053, -1088, -1130, 
-    -1236, -980, -746, -962, -1222, -1100, -626, -357, -569,
-  -293, -223, -589, -564, -568, -1046, -1060, -809, -826, -863, -898, -984, 
-    -1194, -1523, -1594, -1375, -1340, -1335, -1011, -735, -689,
-  -246, -3, -618, -1005, -879, -1137, -1019, -707, -828, -1055, -1317, -1115, 
-    -890, -1467, -1847, -1450, -1110, -1094, -967, -656, -442,
-  -230, -368, -817, -1085, -1013, -1049, -944, -677, -756, -1299, -1741, 
-    -1370, -1091, -1674, -1783, -1019, -568, -497, -137, 219, 147,
-  1793, 1665, 799, 44, -490, -1353, -1699, -1655, -1972, -1930, -1284, -545, 
-    135, 413, 608, 1454, 2665, 3509, 3731, 3620, 3106,
-  1156, 1257, 1082, 424, -392, -1155, -1460, -1169, -974, -1124, -768, -195, 
-    -195, -279, 232, 1523, 3037, 3775, 3693, 3273, 2331,
-  627, 591, 593, 315, -670, -1605, -1836, -1740, -1391, -1026, -851, -332, 
-    352, 585, 1149, 2493, 3472, 3740, 3305, 1816, 820,
-  63, -76, -187, -282, -968, -1804, -2132, -2136, -1674, -1247, -1511, -655, 
-    1507, 2409, 2526, 3099, 3202, 2994, 2339, 507, -534,
-  -569, -811, -712, -558, -923, -1538, -1792, -1520, -1326, -1559, -1070, 
-    493, 2047, 3037, 3146, 2472, 1813, 1532, 1018, -177, -1110,
-  -1002, -1030, -396, 18, -345, -919, -904, -218, -254, -745, 349, 1564, 
-    1690, 2099, 2188, 1373, 513, 97, -150, -853, -1411,
-  -1048, -619, 284, 713, 521, 131, 8, 708, 1360, 1311, 1181, 1020, 983, 922, 
-    532, 240, -158, -612, -854, -1263, -1320,
-  -324, -138, 464, 926, 890, 569, 246, 614, 1654, 1952, 1136, 424, 244, 17, 
-    -189, -241, -433, -652, -948, -1193, -615,
-  673, 241, 435, 757, 561, 178, -49, 86, 633, 880, 555, 83, -475, -761, -456, 
-    -244, -389, -769, -1299, -1141, -125,
-  919, 313, 347, 427, 184, -86, -214, -206, -75, 38, -42, -340, -853, -1175, 
-    -1026, -767, -620, -1121, -1663, -1031, -307,
-  501, 40, 173, 164, -252, -427, -324, -287, -263, -210, -280, -523, -874, 
-    -1124, -1168, -1102, -1056, -1147, -968, -562, -607,
-  -406, -507, -57, -191, -972, -1088, -510, -183, -212, -306, -484, -683, 
-    -812, -920, -1028, -1138, -1177, -870, -361, -283, -567,
-  -1009, -1170, -553, -610, -1329, -1238, -467, -17, -105, -501, -846, -896, 
-    -792, -739, -975, -1354, -1289, -795, -373, -287, -509,
-  -428, -1353, -1179, -706, -845, -699, -268, -89, -228, -700, -959, -946, 
-    -1022, -1001, -1032, -1333, -1514, -1066, -310, -213, -681,
-  174, -955, -1485, -882, -529, -591, -342, -141, -387, -752, -837, -851, 
-    -1116, -1475, -1529, -1357, -1475, -1321, -470, -140, -575,
-  221, -412, -1223, -1405, -1151, -1226, -916, -394, -555, -980, -1138, -938, 
-    -841, -1393, -1739, -1293, -1075, -1116, -525, 81, -44,
-  287, -109, -644, -1379, -1604, -1560, -1511, -1063, -652, -1022, -1508, 
-    -1181, -924, -1431, -1478, -763, -458, -416, 33, 499, 446,
-  1907, 2027, 2518, 1780, -385, -1840, -2054, -2520, -2960, -2326, -1518, 
-    -1434, -1345, -748, 39, 671, 1198, 2248, 3525, 4017, 3907,
-  1262, 1272, 1829, 1382, -243, -1247, -1476, -2078, -2393, -1752, -1473, 
-    -1918, -1848, -1249, -492, 522, 1245, 2136, 3727, 4403, 3621,
-  808, 599, 510, 228, -480, -1125, -1526, -1807, -1798, -1502, -1565, -2188, 
-    -2378, -1823, -704, 1092, 2311, 2631, 3425, 3972, 3003,
-  655, 275, -2, -514, -1124, -1364, -1608, -1675, -1383, -1305, -1481, -1774, 
-    -2032, -1772, -469, 1598, 2970, 3065, 2762, 2525, 1761,
-  652, -55, -287, -603, -1211, -1479, -1610, -1511, -971, -840, -753, -131, 
-    26, -213, 350, 1487, 2328, 2437, 1576, 606, 159,
-  862, -154, -533, -74, -183, -965, -1362, -1061, -494, -197, 323, 1182, 
-    1824, 1990, 1537, 1157, 1250, 1144, 390, -460, -704,
-  1121, 289, -133, 397, 683, 32, -548, -432, -84, 285, 834, 1135, 1444, 1871, 
-    1523, 784, 384, 283, 46, -510, -726,
-  928, 718, 467, 443, 724, 613, 187, -6, 48, 259, 551, 660, 348, 89, 312, 
-    413, 127, -140, -281, -385, -478,
-  776, 763, 483, 385, 561, 451, 195, 6, -152, -25, 251, 177, -254, -506, 
-    -303, 3, -218, -1090, -1421, -795, -437,
-  790, 572, 360, 385, 384, 118, -102, -173, -242, -78, 80, -332, -711, -563, 
-    -493, -619, -1030, -1835, -2232, -1660, -840,
-  190, 230, 472, 280, 19, 38, -16, -185, -200, -149, -305, -720, -1088, -974, 
-    -839, -1209, -1429, -1410, -1946, -2105, -1257,
-  -564, -275, 194, 65, -185, -126, -96, -211, -294, -435, -695, -995, -1221, 
-    -1055, -931, -1367, -1424, -1041, -1372, -1685, -1268,
-  -768, -758, -265, -80, -356, -621, -693, -560, -476, -655, -891, -1095, 
-    -1119, -825, -738, -1117, -1449, -1365, -1019, -913, -1181,
-  -541, -1009, -707, -338, -531, -708, -750, -780, -796, -911, -960, -1020, 
-    -1132, -1034, -909, -1087, -1558, -1537, -756, -592, -1233,
-  -155, -745, -981, -611, -405, -365, -237, -431, -958, -1194, -1011, -959, 
-    -1255, -1620, -1689, -1527, -1547, -1306, -652, -572, -964,
-  125, -59, -661, -596, -362, -452, -280, -155, -675, -1116, -1074, -986, 
-    -1133, -1647, -1924, -1523, -1138, -910, -517, -279, -337,
-  17, 129, -343, -508, -282, -392, -634, -337, -190, -755, -1231, -1073, 
-    -1080, -1642, -1658, -942, -518, -323, 41, 255, 187,
-  2023, 1689, 1343, 1190, 660, -358, -1214, -1685, -1859, -1569, -739, -572, 
-    -1245, -942, -602, -1290, -1290, -559, 459, 2092, 3602,
-  1120, 735, 860, 954, 540, -131, -1018, -1346, -1047, -917, -1182, -1887, 
-    -2366, -1712, -1168, -1639, -1613, -481, 1083, 2377, 3107,
-  122, 40, 399, 650, 487, -161, -948, -1027, -840, -1218, -1976, -2639, 
-    -2818, -2245, -1065, -413, -491, 267, 1798, 2597, 2332,
-  8, 28, 235, 244, 100, -446, -1000, -1213, -1441, -1742, -2014, -2408, 
-    -2601, -1996, -664, 578, 1308, 1815, 2282, 2399, 1314,
-  95, 8, -132, -87, -55, -448, -989, -1371, -1487, -1527, -1667, -1745, 
-    -1627, -1152, -236, 858, 1802, 2164, 2006, 1573, 476,
-  87, -126, -165, 173, 331, -56, -504, -774, -922, -1054, -1064, -499, 76, 
-    -58, 71, 846, 1391, 1497, 1233, 680, 180,
-  810, 489, 627, 759, 735, 454, 165, 26, -262, -585, -273, 638, 951, 395, 
-    215, 677, 999, 917, 505, 123, -74,
-  1483, 1425, 1337, 926, 736, 656, 480, 432, 238, -228, -19, 700, 582, 18, 
-    194, 522, 284, -20, -164, -226, -372,
-  1075, 1308, 1201, 718, 398, 250, 271, 399, 239, -204, -154, 218, -60, -472, 
-    -145, 65, -386, -706, -781, -830, -659,
-  288, 458, 600, 458, 118, -286, -421, -222, -146, -360, -371, -251, -634, 
-    -936, -673, -533, -603, -650, -914, -1279, -1005,
-  -235, -198, 38, 7, -228, -574, -991, -1078, -689, -434, -680, -1092, -1346, 
-    -1346, -1141, -874, -722, -688, -647, -806, -828,
-  -398, -516, -336, -421, -669, -899, -1157, -1318, -988, -485, -807, -1650, 
-    -1863, -1526, -1220, -1027, -934, -842, -543, -251, -327,
-  -271, -621, -545, -505, -799, -1200, -1276, -1065, -855, -665, -808, -1299, 
-    -1522, -1200, -799, -980, -1305, -1053, -583, -308, -344,
-  -117, -765, -831, -620, -768, -1052, -1018, -806, -812, -913, -891, -910, 
-    -1012, -987, -862, -1162, -1779, -1608, -761, -404, -554,
-  6, -664, -985, -827, -741, -650, -379, -447, -907, -1118, -987, -926, 
-    -1101, -1480, -1755, -1768, -1885, -1766, -988, -426, -533,
-  107, -146, -662, -660, -477, -484, -306, -238, -686, -1074, -1052, -950, 
-    -1102, -1654, -2057, -1794, -1434, -1187, -715, -379, -409,
-  2, 72, -336, -458, -228, -346, -580, -327, -203, -760, -1207, -1021, -997, 
-    -1588, -1795, -1227, -819, -559, -130, 23, -41,
-  -514, 1, 646, 1054, 772, -168, -1082, -1662, -1930, -2158, -2325, -2219, 
-    -2121, -1725, -482, 716, 819, 78, 83, 1737, 3495,
-  -342, -49, 595, 1114, 878, 39, -781, -1401, -1924, -2332, -2191, -1546, 
-    -1392, -1542, -854, -26, -207, -547, 379, 2195, 3433,
-  -102, -136, 276, 961, 912, 18, -554, -1016, -1989, -2417, -1647, -797, 
-    -1055, -1642, -1424, -1159, -1405, -1401, 19, 2569, 3858,
-  -248, 50, 354, 629, 567, 33, -381, -969, -1935, -2194, -1555, -1038, -1264, 
-    -1657, -1632, -1478, -1297, -1018, 259, 2541, 3265,
-  -445, -34, 247, 481, 535, 344, -317, -1267, -1867, -2206, -1997, -1385, 
-    -1418, -1689, -1495, -884, -177, 581, 1811, 2577, 1660,
-  -197, -125, 74, 632, 931, 608, -242, -1114, -1609, -2072, -1982, -1525, 
-    -1719, -1790, -954, 191, 769, 1125, 1969, 2308, 1086,
-  462, 454, 584, 902, 1013, 577, -20, -512, -961, -1149, -1228, -1348, -1340, 
-    -1224, -214, 1335, 1578, 1008, 1044, 1262, 728,
-  997, 899, 887, 945, 811, 462, 191, -124, -265, -21, -227, -610, -533, -549, 
-    51, 1392, 1682, 1063, 663, 324, -53,
-  1378, 1197, 791, 633, 455, 215, -5, -303, -181, 239, 191, -278, -620, -509, 
-    -27, 455, 542, 406, 166, -231, -454,
-  1880, 1531, 624, 214, 109, 76, -91, -448, -535, -334, -209, -475, -671, 
-    -303, -125, -401, -546, -439, -481, -643, -541,
-  1746, 1057, 348, 183, 45, 109, 177, -125, -502, -698, -678, -589, -398, 
-    -71, -207, -812, -1004, -805, -751, -646, -374,
-  749, 266, 343, 427, 12, -163, -86, -62, -211, -636, -906, -746, -536, -432, 
-    -554, -1098, -1476, -1286, -863, -507, -326,
-  42, 72, 278, 105, -234, -389, -470, -371, -264, -545, -905, -850, -592, 
-    -662, -1078, -1490, -1769, -1692, -1122, -607, -453,
-  -123, -319, -266, -500, -635, -442, -348, -529, -693, -776, -859, -756, 
-    -652, -827, -1073, -1395, -1799, -1698, -1157, -714, -401,
-  -173, -756, -652, -558, -892, -869, -378, -398, -962, -1183, -978, -745, 
-    -912, -1148, -847, -903, -1610, -1548, -865, -640, -445,
-  -82, -616, -833, -601, -860, -1143, -513, -117, -774, -1165, -951, -826, 
-    -919, -1021, -760, -414, -630, -881, -639, -529, -516,
-  44, -599, -1129, -956, -896, -901, -429, -184, -629, -985, -935, -843, 
-    -886, -1140, -1033, -131, 340, -171, -473, -279, -157,
-  -19, 256, 130, 153, 469, 381, -96, -731, -1374, -2161, -2644, -2359, -2022, 
-    -1706, -895, -71, 238, 583, 874, 485, 1010,
-  -135, 265, 451, 152, 183, 443, 270, -319, -1104, -2079, -2362, -1781, 
-    -1392, -1060, -659, -446, -200, 158, 330, 46, 944,
-  -157, -212, 49, 146, 343, 416, 154, -229, -988, -1943, -1954, -1198, -717, 
-    -694, -1235, -1561, -769, -56, -376, -55, 1947,
-  -555, -390, -10, 415, 516, 36, -253, -389, -1032, -1743, -1714, -963, -278, 
-    -633, -1648, -1611, -426, -88, -1063, -147, 3017,
-  -933, -158, 443, 809, 744, 107, -303, -589, -1159, -1608, -1782, -1442, 
-    -698, -748, -1390, -1091, -328, -524, -898, 337, 2536,
-  -775, 88, 863, 1163, 1228, 869, 208, -472, -1056, -1526, -1949, -1980, 
-    -1501, -1233, -1368, -1125, -666, -502, 355, 1541, 1718,
-  202, 667, 1248, 1391, 1468, 1141, 495, 18, -481, -1100, -1576, -1769, 
-    -1682, -1547, -1575, -1132, -70, 620, 1041, 1529, 1319,
-  1453, 1394, 1400, 1154, 1131, 877, 384, 105, -128, -307, -505, -905, -1104, 
-    -1059, -1296, -992, 503, 1275, 681, 440, 491,
-  1712, 1550, 1183, 731, 598, 526, 196, -235, -322, -31, 57, -95, -151, -283, 
-    -735, -878, -90, 511, 202, -181, -387,
-  1290, 1230, 715, 497, 419, 129, -97, -301, -468, -349, -208, -71, 15, -315, 
-    -683, -735, -616, -330, -184, -409, -633,
-  985, 729, 206, 152, 297, 27, -228, -361, -501, -440, -396, -422, -533, 
-    -841, -979, -865, -682, -457, -460, -610, -610,
-  497, 241, -44, -178, -48, 56, -155, -575, -609, -387, -465, -482, -525, 
-    -965, -1278, -1195, -955, -741, -671, -649, -621,
-  35, 12, -110, -200, -266, -200, -146, -395, -599, -599, -690, -650, -584, 
-    -1177, -1795, -1607, -1362, -1292, -855, -490, -524,
-  -138, -201, -202, -355, -608, -642, -346, -139, -379, -703, -771, -983, 
-    -1481, -1952, -2207, -2100, -1889, -1531, -743, -202, -261,
-  -205, -286, -294, -656, -812, -615, -432, -166, -166, -554, -621, -768, 
-    -1611, -2243, -2193, -2153, -2165, -1493, -401, 51, -130,
-  -391, -352, -635, -850, -645, -261, -62, -40, -251, -540, -576, -337, -512, 
-    -1470, -1938, -1657, -1489, -1024, -251, -2, -219,
-  -586, -694, -1038, -887, -683, -456, -1, -45, -496, -660, -777, -571, -199, 
-    -876, -1621, -1146, -421, -312, -347, -144, -88,
-  1295, 490, -525, -473, -83, -714, -1155, -1082, -863, -441, -297, -905, 
-    -2060, -2556, -2076, -1124, 260, 1465, 2010, 1777, 901,
-  879, 485, -6, -502, -830, -738, -449, -573, -637, -645, -1029, -1474, 
-    -1805, -1852, -1372, -681, -115, 348, 875, 1465, 1295,
-  222, 85, -128, -605, -859, -612, -428, -655, -835, -950, -1151, -1178, 
-    -1143, -1134, -751, -342, -647, -1201, -1055, -44, 1058,
-  -806, -663, -531, -556, -469, -310, -359, -600, -814, -867, -806, -832, 
-    -899, -840, -661, -247, -285, -1106, -1346, -562, 809,
-  -1373, -1128, -640, 26, 252, 148, -24, -282, -375, -339, -535, -983, -1093, 
-    -931, -947, -448, 62, -349, -352, 513, 1434,
-  -854, -656, 219, 1220, 1053, 650, 396, 69, 67, 120, -207, -895, -1192, 
-    -891, -871, -903, -841, -1092, -682, 611, 1503,
-  553, 808, 1827, 2389, 1617, 938, 428, -53, -72, -61, -306, -651, -656, 
-    -276, -520, -1454, -2046, -1911, -902, 214, 485,
-  1541, 1900, 2705, 2990, 2286, 1042, -1, -335, -416, -529, -645, -667, -463, 
-    -288, -711, -1743, -2165, -1283, 221, 1011, 302,
-  1348, 1651, 2228, 2386, 1912, 949, 82, -216, -399, -561, -686, -957, -1127, 
-    -1050, -1093, -1459, -1388, -519, 372, 947, 577,
-  1008, 1204, 797, 396, 443, 532, 281, -82, -312, -487, -751, -1185, -1316, 
-    -1055, -991, -1008, -766, -561, -587, -382, -122,
-  830, 1025, -311, -1111, -377, 139, 2, -101, -251, -591, -956, -1130, -836, 
-    -554, -784, -953, -874, -942, -893, -722, -694,
-  241, 347, -424, -874, -355, -42, -205, -278, -319, -573, -986, -1035, -511, 
-    -269, -697, -1093, -1245, -1247, -821, -401, -596,
-  -166, -169, -272, -305, -207, -80, -141, -606, -776, -636, -929, -1112, 
-    -713, -584, -1034, -1353, -1491, -1511, -1104, -565, -543,
-  -169, -215, -252, -267, -181, -24, 3, -514, -947, -871, -919, -1251, -1607, 
-    -1859, -1922, -1862, -1856, -1642, -1069, -632, -590,
-  -472, -483, -447, -435, -209, 50, 117, -147, -825, -1135, -807, -974, 
-    -1864, -2344, -2118, -1890, -1721, -1109, -363, -244, -486,
-  -823, -763, -719, -732, -457, -107, 26, -231, -1019, -1370, -815, -381, 
-    -586, -1075, -1325, -1140, -780, -334, 22, -51, -296,
-  -651, -689, -754, -858, -787, -555, -518, -779, -1062, -1189, -1070, -389, 
-    270, -161, -825, -503, -36, -169, -288, -119, 4,
-  2714, 2432, 1579, 559, -346, -1068, -1551, -1840, -1865, -1589, -1325, 
-    -1426, -2038, -2918, -2857, -1577, -412, 459, 1340, 1776, 1735,
-  2269, 2011, 1412, 467, -196, -550, -1134, -1781, -1981, -1587, -1096, 
-    -1298, -2408, -3328, -2450, -862, -266, 289, 903, 965, 978,
-  1221, 809, 382, -29, -272, -432, -1002, -2081, -2351, -1299, -482, -994, 
-    -2286, -2667, -1396, -405, -575, -378, 192, 366, 521,
-  396, 111, -247, -136, 138, -268, -1373, -2414, -2022, -490, 49, -921, 
-    -1890, -1505, -614, -770, -1241, -974, -480, -235, -38,
-  -81, 257, 255, 641, 1242, 561, -1083, -1659, -895, -100, -113, -911, -1369, 
-    -743, -453, -1262, -1506, -880, -730, -686, -22,
-  -48, 744, 950, 1308, 1704, 1217, 243, -57, 3, -305, -529, -556, -517, -314, 
-    -503, -1208, -1396, -991, -887, -392, 940,
-  531, 1283, 1334, 1177, 1127, 996, 797, 586, 148, -482, -658, -404, -226, 
-    -194, -571, -1220, -1399, -1065, -599, 154, 1183,
-  1146, 1621, 1636, 1037, 700, 658, 492, 279, -90, -536, -770, -849, -697, 
-    -253, -316, -1076, -1277, -544, 209, 423, 444,
-  1380, 1548, 1540, 1090, 633, 498, 336, 63, -144, -464, -954, -1111, -686, 
-    -32, 78, -524, -670, -20, 520, 673, 485,
-  1278, 1096, 773, 540, 301, 167, 47, -141, -167, -312, -737, -825, -354, 81, 
-    -105, -517, -426, -91, 273, 745, 761,
-  921, 636, 162, -103, -8, -99, -346, -394, -415, -512, -637, -742, -600, 
-    -431, -705, -1048, -1047, -805, -237, 212, 136,
-  340, 262, 169, -38, -89, -206, -450, -495, -610, -954, -1159, -1125, -978, 
-    -923, -1062, -1230, -1383, -1257, -721, -494, -620,
-  42, 1, 163, 37, -336, -436, -451, -574, -691, -1037, -1452, -1460, -1216, 
-    -1152, -1298, -1362, -1282, -1049, -718, -658, -743,
-  208, 1, -63, -120, -338, -483, -532, -654, -785, -929, -1147, -1451, -1813, 
-    -2026, -2037, -1918, -1486, -808, -456, -524, -568,
-  85, -172, -349, -249, -134, -368, -553, -581, -901, -1044, -738, -928, 
-    -1849, -2476, -2365, -1989, -1373, -560, -248, -419, -506,
-  -422, -578, -555, -535, -509, -563, -499, -490, -870, -1009, -525, -192, 
-    -579, -1198, -1436, -1213, -663, -244, -228, -308, -376,
-  -629, -638, -467, -576, -687, -592, -629, -672, -441, -417, -562, -106, 
-    332, -179, -772, -531, -90, -202, -412, -218, -63,
-  3562, 3347, 2976, 2244, 934, -749, -2008, -2389, -2251, -1780, -1278, 
-    -1302, -1606, -1791, -1784, -1291, -172, 914, 1598, 2421, 2948,
-  3243, 2749, 1867, 1099, 460, -72, -821, -1574, -1605, -1203, -1184, -1523, 
-    -1647, -1342, -875, -679, -87, 1278, 1884, 1773, 2073,
-  2148, 1674, 1079, 676, 405, 236, -88, -839, -1278, -1102, -1153, -1672, 
-    -1824, -1361, -961, -785, -243, 876, 1567, 1241, 834,
-  771, 637, 730, 774, 828, 988, 712, -322, -1320, -1518, -1351, -1699, -1970, 
-    -1433, -968, -761, -197, 425, 800, 830, 622,
-  -233, 82, 580, 1092, 1379, 1649, 1297, -46, -1342, -1648, -1378, -1432, 
-    -1528, -898, -197, -143, -88, 79, -52, 32, 543,
-  -910, 237, 961, 1358, 1342, 1200, 846, -5, -1101, -1652, -1319, -1014, 
-    -1026, -783, -299, -44, -230, -436, -726, -1131, -623,
-  -1038, 912, 1679, 1539, 1170, 854, 466, 27, -594, -1254, -1150, -879, 
-    -1138, -1281, -914, -487, -652, -905, -1000, -1485, -1064,
-  -228, 1670, 2104, 1831, 1482, 1090, 729, 212, -224, -474, -614, -727, 
-    -1066, -1027, -532, -557, -995, -1111, -786, -489, 2,
-  546, 1796, 2000, 1686, 1138, 716, 688, 366, -220, -418, -394, -495, -552, 
-    -177, 87, -404, -931, -918, -285, 671, 1062,
-  551, 1219, 1550, 1166, 262, -20, 284, 203, -342, -568, -518, -723, -542, 
-    83, 104, -409, -678, -600, -52, 987, 1432,
-  291, 675, 978, 787, 79, -321, -167, -149, -383, -329, -332, -827, -1040, 
-    -645, -369, -475, -610, -608, -244, 665, 1312,
-  102, 254, 404, 399, 70, -413, -589, -528, -434, -163, 66, -238, -930, 
-    -1183, -862, -692, -869, -891, -501, 85, 570,
-  -69, -104, 50, -1, -293, -522, -685, -776, -558, -97, 186, 8, -488, -857, 
-    -1054, -1317, -1526, -1286, -689, -369, -320,
-  121, 95, -11, -168, -354, -476, -556, -756, -736, -344, -288, -792, -1285, 
-    -1535, -1846, -2246, -2212, -1682, -1123, -763, -604,
-  580, 512, 45, -224, -235, -407, -513, -605, -925, -884, -744, -1416, -2423, 
-    -2880, -2834, -2630, -2117, -1618, -1502, -1097, -509,
-  609, 371, -58, -456, -532, -543, -487, -417, -771, -912, -663, -1071, 
-    -1929, -2357, -2232, -1814, -1289, -1011, -1126, -866, -314,
-  100, -94, -302, -541, -607, -493, -546, -725, -524, -296, -521, -716, -811, 
-    -1147, -1171, -724, -547, -645, -614, -321, 30,
-  3023, 3200, 3082, 2904, 2798, 1800, 141, -881, -1527, -1891, -1784, -2033, 
-    -2631, -2504, -1678, -1029, -467, 161, 680, 1417, 2318,
-  2837, 2881, 2695, 2306, 1906, 1034, 79, -410, -1436, -2374, -1997, -2051, 
-    -2937, -2861, -1847, -752, -105, 119, 432, 903, 1659,
-  2769, 2420, 2059, 1666, 1240, 794, 485, -45, -1226, -1918, -1748, -2259, 
-    -3003, -2841, -2142, -1053, -51, 472, 879, 1076, 996,
-  2668, 1919, 1547, 1362, 1004, 1117, 1229, 184, -867, -1022, -1529, -2156, 
-    -2196, -2220, -1914, -1042, -114, 566, 961, 1121, 761,
-  2136, 1071, 1137, 1819, 1642, 1527, 1375, 138, -633, -592, -1251, -1641, 
-    -1524, -1819, -1459, -663, -392, -83, 184, 152, 157,
-  1223, 753, 1301, 2526, 2528, 1788, 1039, 36, -499, -584, -903, -1239, 
-    -1440, -1364, -816, -654, -910, -481, -144, -472, -395,
-  314, 1210, 2193, 2950, 2729, 1546, 486, 228, 98, -488, -742, -905, -1301, 
-    -928, -761, -1570, -1581, -543, 127, 17, -189,
-  244, 1428, 2475, 2971, 2424, 923, 206, 912, 912, -211, -681, -882, -1350, 
-    -1055, -1125, -1993, -1795, -817, -21, 36, -236,
-  554, 1397, 2141, 2524, 1798, 403, 220, 1108, 799, -429, -933, -1154, -1304, 
-    -813, -468, -865, -1224, -943, -248, -15, -53,
-  763, 1563, 1790, 1563, 1016, 319, 149, 364, 34, -716, -1088, -1111, -738, 
-    4, 232, -376, -990, -814, -60, 518, 543,
-  816, 1335, 1037, 602, 556, 432, 78, -162, -244, -416, -712, -793, -347, 
-    111, -217, -1022, -1355, -901, -114, 365, 410,
-  195, 533, 374, 215, 289, 246, -86, -156, 63, -101, -536, -647, -479, -437, 
-    -689, -1162, -1326, -904, -409, -54, 259,
-  -24, 144, 144, 67, -3, -34, -336, -351, 48, -252, -722, -642, -686, -628, 
-    -396, -750, -1070, -780, -408, 38, 310,
-  545, 335, -86, -190, -221, -157, -355, -660, -646, -787, -905, -926, -1331, 
-    -1325, -754, -819, -1275, -1008, -175, 209, -98,
-  126, 70, -373, -585, -455, -219, -359, -722, -941, -990, -996, -1454, 
-    -2354, -2849, -2485, -1779, -1391, -879, 61, 244, -351,
-  -1030, -632, -633, -789, -527, -237, -352, -629, -691, -480, -596, -1394, 
-    -2294, -3011, -3241, -2272, -940, -331, 0, 68, -239,
-  -1414, -884, -601, -316, -199, -486, -743, -999, -785, -13, -86, -888, 
-    -1325, -1804, -2218, -1544, -539, -354, -342, -121, -27 ;
-
- lat = 50, 47.5, 45, 42.5, 40, 37.5, 35, 32.5, 30, 27.5, 25, 22.5, 20, 17.5, 
-    15, 12.5, 10 ;
-
- lon = -60, -57.5, -55, -52.5, -50, -47.5, -45, -42.5, -40, -37.5, -35, 
-    -32.5, -30, -27.5, -25, -22.5, -20, -17.5, -15, -12.5, -10 ;
-
- time = 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90 ;
-}
diff --git a/ncdap_test/expected4/in.nc.dmp b/ncdap_test/expected4/in.nc.dmp
deleted file mode 100644
index 201d053..0000000
--- a/ncdap_test/expected4/in.nc.dmp
+++ /dev/null
@@ -1,760 +0,0 @@
-netcdf in {
-types:
-  compound lat_var_t {
-    float lat_var(2) ;
-    float lat(2) ;
-  }; // lat_var_t
-  compound lat_wgt_t {
-    float lat_wgt(2) ;
-    float lat(2) ;
-  }; // lat_wgt_t
-  compound hyam_t {
-    float hyam(3) ;
-    float lev(3) ;
-  }; // hyam_t
-  compound hybm_t {
-    float hybm(3) ;
-    float lev(3) ;
-  }; // hybm_t
-  compound PS_t {
-    float PS(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // PS_t
-  compound date_t {
-    int date(10) ;
-    double time(10) ;
-  }; // date_t
-  compound lon_wgt_t {
-    float lon_wgt(4) ;
-    float lon(4) ;
-  }; // lon_wgt_t
-  compound msk_prt_mss_prt_t {
-    float msk_prt_mss_prt(4) ;
-    float lon(4) ;
-  }; // msk_prt_mss_prt_t
-  compound mss_val_t {
-    float mss_val(4) ;
-    float lon(4) ;
-  }; // mss_val_t
-  compound mss_val_fst_t {
-    float mss_val_fst(4) ;
-    float lon(4) ;
-  }; // mss_val_fst_t
-  compound fll_val_t {
-    float fll_val(4) ;
-    float lon(4) ;
-  }; // fll_val_t
-  compound no_mss_val_t {
-    float no_mss_val(4) ;
-    float lon(4) ;
-  }; // no_mss_val_t
-  compound val_one_mss_t {
-    float val_one_mss(2) ;
-    float lat(2) ;
-  }; // val_one_mss_t
-  compound pck_arr_t {
-    short pck_arr(4) ;
-    float lon(4) ;
-  }; // pck_arr_t
-  compound upk_arr_t {
-    double upk_arr(4) ;
-    float lon(4) ;
-  }; // upk_arr_t
-  compound val_one_one_int_t {
-    int val_one_one_int(2) ;
-    float lat(2) ;
-  }; // val_one_one_int_t
-  compound val_max_max_sht_t {
-    short val_max_max_sht(2) ;
-    float lat(2) ;
-  }; // val_max_max_sht_t
-  compound val_one_mss_int_t {
-    int val_one_mss_int(2) ;
-    float lat(2) ;
-  }; // val_one_mss_int_t
-  compound val_half_half_t {
-    float val_half_half(2) ;
-    float lat(2) ;
-  }; // val_half_half_t
-  compound wgt_one_t {
-    float wgt_one(2) ;
-    float lat(2) ;
-  }; // wgt_one_t
-  compound mss_val_all_t {
-    float mss_val_all(4) ;
-    float lon(4) ;
-  }; // mss_val_all_t
-  compound char_var_multinul_t {
-    string char_var_multinul(3) ;
-    float lev(3) ;
-  }; // char_var_multinul_t
-  compound lev_var_t {
-    float lev_var(3) ;
-    float lev(3) ;
-  }; // lev_var_t
-  compound lev_wgt_t {
-    float lev_wgt(3) ;
-    float lev(3) ;
-  }; // lev_wgt_t
-  compound z_t {
-    float z(3) ;
-    float lev(3) ;
-  }; // z_t
-  compound rz_t {
-    float rz(3) ;
-    float rlev(3) ;
-  }; // rz_t
-  compound three_dmn_var_t {
-    float three_dmn_var(2, 3, 4) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // three_dmn_var_t
-  compound three_dmn_var_crd_t {
-    float three_dmn_var_crd(3, 2, 4) ;
-    float lev(3) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_crd_t
-  compound prs_sfc_t {
-    float prs_sfc(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // prs_sfc_t
-  compound two_dmn_var_t {
-    float two_dmn_var(2, 3) ;
-    float lat(2) ;
-    float lev(3) ;
-  }; // two_dmn_var_t
-  compound mask_t {
-    float mask(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // mask_t
-  compound ORO_t {
-    float ORO(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // ORO_t
-  compound weight_t {
-    float weight(2) ;
-    float lat(2) ;
-  }; // weight_t
-  compound gw_t {
-    float gw(2) ;
-    float lat(2) ;
-  }; // gw_t
-  compound gw_T42_t {
-    float gw_T42(64) ;
-    float lat_T42(64) ;
-  }; // gw_T42_t
-  compound rec_var_flt_t {
-    float rec_var_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_t
-  compound rec_var_dbl_t {
-    double rec_var_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_t
-  compound one_dmn_rec_var_t {
-    int one_dmn_rec_var(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_t
-  compound tpt_t {
-    float tpt(10) ;
-    double time(10) ;
-  }; // tpt_t
-  compound rec_var_dbl_mss_val_dbl_upk_t {
-    double rec_var_dbl_mss_val_dbl_upk(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_upk_t
-  compound rec_var_dbl_mss_val_dbl_pck_t {
-    short rec_var_dbl_mss_val_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_t
-  compound rec_var_flt_mss_val_flt_t {
-    float rec_var_flt_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_flt_t
-  compound rec_var_flt_pck_t {
-    short rec_var_flt_pck(10) ;
-    double time(10) ;
-  }; // rec_var_flt_pck_t
-  compound rec_var_dbl_pck_t {
-    short rec_var_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_pck_t
-  compound rec_var_flt_mss_val_dbl_t {
-    float rec_var_flt_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_dbl_t
-  compound rec_var_flt_mss_val_int_t {
-    float rec_var_flt_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_int_t
-  compound rec_var_int_mss_val_int_t {
-    int rec_var_int_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_int_t
-  compound rec_var_int_mss_val_flt_t {
-    int rec_var_int_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_flt_t
-  compound rec_var_int_mss_val_dbl_t {
-    int rec_var_int_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_dbl_t
-  compound rec_var_dbl_mss_val_dbl_pck_lng_t {
-    int rec_var_dbl_mss_val_dbl_pck_lng(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_lng_t
-  compound one_dmn_rec_var_sng_t {
-    string one_dmn_rec_var_sng(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_sng_t
-  compound time_lon_t {
-    float time_lon(10, 4) ;
-    double time(10) ;
-    float lon(4) ;
-  }; // time_lon_t
-  compound two_dmn_rec_var_sng_t {
-    string two_dmn_rec_var_sng(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_sng_t
-  compound two_dmn_rec_var_t {
-    float two_dmn_rec_var(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_t
-  compound three_dmn_rec_var_t {
-    float three_dmn_rec_var(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_rec_var_t
-  compound three_dmn_var_dbl_t {
-    double three_dmn_var_dbl(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_dbl_t
-  compound three_dmn_var_int_t {
-    int three_dmn_var_int(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_int_t
-  compound three_dmn_var_sht_t {
-    short three_dmn_var_sht(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_sht_t
-  compound four_dmn_rec_var_t {
-    float four_dmn_rec_var(10, 2, 3, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // four_dmn_rec_var_t
-  compound u_t {
-    float u(10) ;
-    double time(10) ;
-  }; // u_t
-  compound v_t {
-    float v(10) ;
-    double time(10) ;
-  }; // v_t
-dimensions:
-	bnd = 2 ;
-	char_dmn_lng = 80 ;
-	char_dmn_sml = 4 ;
-	fl_dmn = 3 ;
-	lat = 2 ;
-	lat_T42 = 64 ;
-	lev = 3 ;
-	lon = 4 ;
-	lon_T42 = 128 ;
-	lsmlev = 6 ;
-	rlev = 3 ;
-	time = 10 ;
-	time_udunits = 3 ;
-	wvl = 2 ;
-variables:
-	float lat(lat) ;
-	lat_var_t lat_var ;
-	lat_wgt_t lat_wgt ;
-	float lev(lev) ;
-		string lev:purpose = "Monotonically increasing coordinate pressure" ;
-		string lev:units = "hybrid_sigma_pressure" ;
-		string lev:positive = "down" ;
-		string lev:A_var = "hyam" ;
-		string lev:B_var = "hybm" ;
-		string lev:P0_var = "P0" ;
-		string lev:PS_var = "PS" ;
-		string lev:bounds = "ilev" ;
-	float lon_T42(lon_T42) ;
-	float lat_T42(lat_T42) ;
-	float rlev(rlev) ;
-		string rlev:purpose = "Monotonically decreasing coordinate pressure" ;
-	float lon(lon) ;
-	double time(time) ;
-	float lsmlev(lsmlev) ;
-		string lsmlev:purpose = "Homebrew level coordinate for LSM" ;
-		string lsmlev:long_name = "Soil depth" ;
-		string lsmlev:units = "meter" ;
-	float wvl(wvl) ;
-		string wvl:long_name = "Wavelength" ;
-		string wvl:units = "meter" ;
-	hyam_t hyam ;
-	hybm_t hybm ;
-	float P0 ;
-		string P0:long_name = "reference pressure" ;
-		string P0:units = "pascal" ;
-	PS_t PS ;
-	string fl_dmn(fl_dmn) ;
-		string fl_dmn:long_name = "Character coordinate" ;
-		string fl_dmn:units = "[chr]" ;
-	int nbdate ;
-		string nbdate:long_name = "base date as 6 or 8 digit integer (YYMMDD or YYYYMMDD)" ;
-	date_t date ;
-	lon_wgt_t lon_wgt ;
-	msk_prt_mss_prt_t msk_prt_mss_prt ;
-	mss_val_t mss_val ;
-	float mss_val_scl ;
-		string mss_val_scl:long_name = "scalar missing value" ;
-		mss_val_scl:missing_value = 1.e+36f ;
-	mss_val_fst_t mss_val_fst ;
-	fll_val_t fll_val ;
-	no_mss_val_t no_mss_val ;
-	val_one_mss_t val_one_mss ;
-	short pck ;
-		string pck:long_name = "Packed scalar variable" ;
-		string pck:note = "Original packed value was 1s with scale_factor = 2.0d and add_offset = 1.0d. Unpacked value should be 3.0 = 2.0d*1s + 1.0d. NCO algorithms would pack this variable as scale_factor = 0.0d and add_offset = 3.0d." ;
-		pck:scale_factor = 2. ;
-		pck:add_offset = 1. ;
-	pck_arr_t pck_arr ;
-	double upk ;
-		string upk:long_name = "Unpacked scalar variable" ;
-		string upk:note = "Unpacked value is 3.0d0, upk=unpack(pck)= 2.0d0*1s + 1.0d0 = 3.0d0. Packing this variable should create an NC_SHORT scalar = 0s with packing attribute add_offset=3.0d and either no scale_factor (ncap) or scale_factor = 0.0d (ncpdq)." ;
-	upk_arr_t upk_arr ;
-	int val_one_int ;
-		string val_one_int:long_name = "scalar equal to 1" ;
-		val_one_int:missing_value = -99 ;
-	val_one_one_int_t val_one_one_int ;
-	val_max_max_sht_t val_max_max_sht ;
-	val_one_mss_int_t val_one_mss_int ;
-	float val_half ;
-		string val_half:long_name = "Scalar with value 0.5" ;
-		val_half:missing_value = 1.e+36f ;
-	val_half_half_t val_half_half ;
-	wgt_one_t wgt_one ;
-	mss_val_all_t mss_val_all ;
-	float scalar_var ;
-		string scalar_var:long_name = "scalar variable" ;
-		string scalar_var:units = "Fraction" ;
-	float float_var ;
-		string float_var:long_name = "float" ;
-	double double_var ;
-		string double_var:long_name = "double" ;
-	double double_var2 ;
-		string double_var2:long_name = "double" ;
-		double_var2:missing_value = 1.e+36 ;
-	int int_var ;
-		string int_var:long_name = "int" ;
-	short short_var ;
-		string short_var:long_name = "short" ;
-	string char_var ;
-		string char_var:long_name = "char" ;
-	string char_var_space ;
-		string char_var_space:long_name = "Character variable with whitespace on ends" ;
-	string char_var_nul ;
-		string char_var_nul:long_name = "Character variable containing one NUL" ;
-	char_var_multinul_t char_var_multinul ;
-	string fl_nm(char_dmn_lng) ;
-		string fl_nm:long_name = "Variable contains a file name" ;
-	string fl_nm_arr(fl_dmn, char_dmn_lng) ;
-		string fl_nm_arr:long_name = "Variable that contains a short array of file names" ;
-		string fl_nm_arr:units = "[sng]" ;
-	string non_nul_trm_char_one_dmn(char_dmn_sml) ;
-		string non_nul_trm_char_one_dmn:long_name = "Variable contains a one-dimensional array of characters that is not NUL-terminated" ;
-		string non_nul_trm_char_one_dmn:units = "[chr]" ;
-	string non_nul_trm_char_two_dmn(fl_dmn, char_dmn_sml) ;
-		string non_nul_trm_char_two_dmn:long_name = "Variable contains a two-dimensional array of characters that are not NUL-terminated" ;
-		string non_nul_trm_char_two_dmn:units = "[chr]" ;
-	ubyte byte_var ;
-		string byte_var:long_name = "byte" ;
-	float zero ;
-		string zero:long_name = "zero" ;
-	float one ;
-		string one:long_name = "one" ;
-	float two ;
-		string two:long_name = "two" ;
-	double e_dbl ;
-		string e_dbl:long_name = "e, base of the natural logarithm" ;
-	float e_flt ;
-		string e_flt:long_name = "e, base of the natural logarithm" ;
-	float three ;
-		string three:long_name = "three" ;
-	float four ;
-		string four:long_name = "four" ;
-	float negative_one ;
-		string negative_one:long_name = "negative one" ;
-	lev_var_t lev_var ;
-	lev_wgt_t lev_wgt ;
-	float g ;
-		string g:long_name = "g" ;
-	z_t z ;
-	rz_t rz ;
-	float one_dmn_var(bnd) ;
-	float att_var ;
-		att_var:byte_att = 0UB ;
-		string att_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		att_var:short_att = 37s ;
-		att_var:int_att = 73 ;
-		att_var:float_att = 73.f, 72.f, 71.f ;
-		att_var:double_att = 73. ;
-	int bnd_var(lev, bnd) ;
-		bnd_var:byte_att = 0UB ;
-		string bnd_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		bnd_var:short_att = 37s ;
-		bnd_var:int_att = 73 ;
-		bnd_var:float_att = 73.f ;
-		bnd_var:double_att = 73. ;
-	three_dmn_var_t three_dmn_var ;
-	three_dmn_var_crd_t three_dmn_var_crd ;
-	prs_sfc_t prs_sfc ;
-	two_dmn_var_t two_dmn_var ;
-	mask_t mask ;
-	ORO_t ORO ;
-	weight_t weight ;
-	gw_t gw ;
-	gw_T42_t gw_T42 ;
-	rec_var_flt_t rec_var_flt ;
-	rec_var_dbl_t rec_var_dbl ;
-	one_dmn_rec_var_t one_dmn_rec_var ;
-	tpt_t tpt ;
-	rec_var_dbl_mss_val_dbl_upk_t rec_var_dbl_mss_val_dbl_upk ;
-	rec_var_dbl_mss_val_dbl_pck_t rec_var_dbl_mss_val_dbl_pck ;
-	rec_var_flt_mss_val_flt_t rec_var_flt_mss_val_flt ;
-	rec_var_flt_pck_t rec_var_flt_pck ;
-	rec_var_dbl_pck_t rec_var_dbl_pck ;
-	rec_var_flt_mss_val_dbl_t rec_var_flt_mss_val_dbl ;
-	rec_var_flt_mss_val_int_t rec_var_flt_mss_val_int ;
-	rec_var_int_mss_val_int_t rec_var_int_mss_val_int ;
-	rec_var_int_mss_val_flt_t rec_var_int_mss_val_flt ;
-	rec_var_int_mss_val_dbl_t rec_var_int_mss_val_dbl ;
-	rec_var_dbl_mss_val_dbl_pck_lng_t rec_var_dbl_mss_val_dbl_pck_lng ;
-	one_dmn_rec_var_sng_t one_dmn_rec_var_sng ;
-	time_lon_t time_lon ;
-	two_dmn_rec_var_sng_t two_dmn_rec_var_sng ;
-	two_dmn_rec_var_t two_dmn_rec_var ;
-	three_dmn_rec_var_t three_dmn_rec_var ;
-	three_dmn_var_dbl_t three_dmn_var_dbl ;
-	three_dmn_var_int_t three_dmn_var_int ;
-	three_dmn_var_sht_t three_dmn_var_sht ;
-	four_dmn_rec_var_t four_dmn_rec_var ;
-	double time_udunits(time_udunits) ;
-		string time_udunits:units = "hours since 1900-01-01 00:00:0.0" ;
-		string time_udunits:delta_t = "0000-00-00 06:00:0.0" ;
-	u_t u ;
-	v_t v ;
-
-// global attributes:
-		string :Conventions = "NCAR-CSM" ;
-		string :history = "History global attribute.\\012" ;
-		:julian_day = 200000.04 ;
-data:
-
- lat = _, _ ;
-
- lat_var = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- lat_wgt = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- lev = _, _, _ ;
-
- lon_T42 = _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _ ;
-
- lat_T42 = _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ ;
-
- rlev = _, _, _ ;
-
- lon = _, _, _, _ ;
-
- time = _, _, _, _, _, _, _, _, _, _ ;
-
- lsmlev = _, _, _, _, _, _ ;
-
- wvl = _, _ ;
-
- hyam = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- hybm = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- P0 = _ ;
-
- PS = 
-    {{101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325 [...]
-
- fl_dmn = _, _, _ ;
-
- nbdate = _ ;
-
- date = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- lon_wgt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- msk_prt_mss_prt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- mss_val = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- mss_val_scl = _ ;
-
- mss_val_fst = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- fll_val = 
-    {{-999, -999, -999, -999}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- no_mss_val = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- val_one_mss = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- pck = _ ;
-
- pck_arr = 
-    {{-32767, -32767, -32767, -32767}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- upk = _ ;
-
- upk_arr = 
-    {{9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- val_one_int = _ ;
-
- val_one_one_int = {{-2147483647, -2147483647}, {9.96921e+36, 9.96921e+36}} ;
-
- val_max_max_sht = {{-32767, -32767}, {9.96921e+36, 9.96921e+36}} ;
-
- val_one_mss_int = {{-2147483647, -2147483647}, {9.96921e+36, 9.96921e+36}} ;
-
- val_half = _ ;
-
- val_half_half = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- wgt_one = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- mss_val_all = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- scalar_var = _ ;
-
- float_var = _ ;
-
- double_var = _ ;
-
- double_var2 = _ ;
-
- int_var = _ ;
-
- short_var = _ ;
-
- char_var = _ ;
-
- char_var_space = _ ;
-
- char_var_nul = _ ;
-
- char_var_multinul = {{"", "", ""}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- fl_nm = _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _ ;
-
- fl_nm_arr =
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _ ;
-
- non_nul_trm_char_one_dmn = _, _, _, _ ;
-
- non_nul_trm_char_two_dmn =
-  _, _, _, _,
-  _, _, _, _,
-  _, _, _, _ ;
-
- byte_var = 129 ;
-
- zero = _ ;
-
- one = _ ;
-
- two = _ ;
-
- e_dbl = _ ;
-
- e_flt = _ ;
-
- three = _ ;
-
- four = _ ;
-
- negative_one = _ ;
-
- lev_var = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- lev_wgt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- g = _ ;
-
- z = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- rz = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- one_dmn_var = _, _ ;
-
- att_var = _ ;
-
- bnd_var =
-  _, _,
-  _, _,
-  _, _ ;
-
- three_dmn_var = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- three_dmn_var_crd = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- prs_sfc = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+3 [...]
-
- two_dmn_var = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- mask = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- ORO = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- weight = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- gw = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- gw_T42 = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.969 [...]
-
- rec_var_flt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl = 
-    {{9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- one_dmn_rec_var = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- tpt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_mss_val_dbl_upk = 
-    {{9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_mss_val_dbl_pck = 
-    {{-32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_mss_val_flt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_pck = 
-    {{-32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_pck = 
-    {{-32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_mss_val_dbl = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_mss_val_int = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_int_mss_val_int = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_int_mss_val_flt = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_int_mss_val_dbl = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_mss_val_dbl_pck_lng = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- one_dmn_rec_var_sng = 
-    {{"", "", "", "", "", "", "", "", "", ""}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- time_lon = 
-    {{0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- two_dmn_rec_var_sng = 
-    {{"a", "b", "c", "b", "c", "d", "c", "d", "e", "d", "e", "f", "e", "f", "g", "f", "g", "h", "g", "h", "i", "h", "i", "j", "j", "k", "l", "k", "l", "m"}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- two_dmn_rec_var = 
-    {{1, 2, 3, 1, 2.1, 3, 1, 2.2, 3, 1, 2.3, 3, 1, 2.4, 3, 1, 2.5, 3, 1, 2.6, 3, 1, 2.7, 3, 1, 2.8, 3, 1, 2.9, 3}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- three_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+3 [...]
-
- three_dmn_var_dbl = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -99, -99, -99, -99, -99, -99, -99, -99, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, 74, 75, 76, 77, 78, 79, -99}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.969209 [...]
-
- three_dmn_var_int = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -99, -99, -99, -99, -99, -99, -99, -99, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -99, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, -99, 62, 63, 64, 65, -99, 67, 68, 69, 70, 71, 72, -99, 74, 75, -99, 77, 78, 79, 80}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.969 [...]
-
- three_dmn_var_sht = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, -99, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -99, 34, 35, -99, 37, 38, 39, 40, 41, 42, 43, 44, -99, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, -99, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, -99, -99, -99, -99, -99, -99, -99}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.969 [...]
-
- four_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, [...]
-
- time_udunits = 876012, 876018, 876024 ;
-
- u = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- v = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-}
diff --git a/ncdap_test/expected4/in1.nc.dmp b/ncdap_test/expected4/in1.nc.dmp
deleted file mode 100644
index dd2db81..0000000
--- a/ncdap_test/expected4/in1.nc.dmp
+++ /dev/null
@@ -1,838 +0,0 @@
-netcdf in1 {
-types:
-  compound lat_var_t {
-    float lat_var(2) ;
-    float lat(2) ;
-  }; // lat_var_t
-  compound lat_wgt_t {
-    float lat_wgt(2) ;
-    float lat(2) ;
-  }; // lat_wgt_t
-  compound hyam_t {
-    float hyam(3) ;
-    float lev(3) ;
-  }; // hyam_t
-  compound hybm_t {
-    float hybm(3) ;
-    float lev(3) ;
-  }; // hybm_t
-  compound PS_t {
-    float PS(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // PS_t
-  compound date_t {
-    int date(10) ;
-    double time(10) ;
-  }; // date_t
-  compound lon_wgt_t {
-    float lon_wgt(4) ;
-    float lon(4) ;
-  }; // lon_wgt_t
-  compound msk_prt_mss_prt_t {
-    float msk_prt_mss_prt(4) ;
-    float lon(4) ;
-  }; // msk_prt_mss_prt_t
-  compound mss_val_t {
-    float mss_val(4) ;
-    float lon(4) ;
-  }; // mss_val_t
-  compound mss_val_fst_t {
-    float mss_val_fst(4) ;
-    float lon(4) ;
-  }; // mss_val_fst_t
-  compound fll_val_t {
-    float fll_val(4) ;
-    float lon(4) ;
-  }; // fll_val_t
-  compound no_mss_val_t {
-    float no_mss_val(4) ;
-    float lon(4) ;
-  }; // no_mss_val_t
-  compound val_one_mss_t {
-    float val_one_mss(2) ;
-    float lat(2) ;
-  }; // val_one_mss_t
-  compound pck_arr_t {
-    short pck_arr(4) ;
-    float lon(4) ;
-  }; // pck_arr_t
-  compound upk_arr_t {
-    double upk_arr(4) ;
-    float lon(4) ;
-  }; // upk_arr_t
-  compound val_one_one_int_t {
-    int val_one_one_int(2) ;
-    float lat(2) ;
-  }; // val_one_one_int_t
-  compound val_max_max_sht_t {
-    short val_max_max_sht(2) ;
-    float lat(2) ;
-  }; // val_max_max_sht_t
-  compound val_one_mss_int_t {
-    int val_one_mss_int(2) ;
-    float lat(2) ;
-  }; // val_one_mss_int_t
-  compound val_half_half_t {
-    float val_half_half(2) ;
-    float lat(2) ;
-  }; // val_half_half_t
-  compound wgt_one_t {
-    float wgt_one(2) ;
-    float lat(2) ;
-  }; // wgt_one_t
-  compound mss_val_all_t {
-    float mss_val_all(4) ;
-    float lon(4) ;
-  }; // mss_val_all_t
-  compound char_var_multinul_t {
-    string char_var_multinul(3) ;
-    float lev(3) ;
-  }; // char_var_multinul_t
-  compound lev_var_t {
-    float lev_var(3) ;
-    float lev(3) ;
-  }; // lev_var_t
-  compound lev_wgt_t {
-    float lev_wgt(3) ;
-    float lev(3) ;
-  }; // lev_wgt_t
-  compound z_t {
-    float z(3) ;
-    float lev(3) ;
-  }; // z_t
-  compound rz_t {
-    float rz(3) ;
-    float rlev(3) ;
-  }; // rz_t
-  compound one_dmn_int_val_one_t {
-    int one_dmn_int_val_one(2) ;
-    float lat(2) ;
-  }; // one_dmn_int_val_one_t
-  compound one_dmn_int_val_two_t {
-    int one_dmn_int_val_two(2) ;
-    float lat(2) ;
-  }; // one_dmn_int_val_two_t
-  compound three_dmn_var_t {
-    float three_dmn_var(2, 3, 4) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // three_dmn_var_t
-  compound three_dmn_var_crd_t {
-    float three_dmn_var_crd(3, 2, 4) ;
-    float lev(3) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_crd_t
-  compound prs_sfc_t {
-    float prs_sfc(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // prs_sfc_t
-  compound two_dmn_var_t {
-    float two_dmn_var(2, 3) ;
-    float lat(2) ;
-    float lev(3) ;
-  }; // two_dmn_var_t
-  compound mask_t {
-    float mask(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // mask_t
-  compound ORO_t {
-    float ORO(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // ORO_t
-  compound weight_t {
-    float weight(2) ;
-    float lat(2) ;
-  }; // weight_t
-  compound gw_t {
-    float gw(2) ;
-    float lat(2) ;
-  }; // gw_t
-  compound gw_T42_t {
-    float gw_T42(64) ;
-    float lat_T42(64) ;
-  }; // gw_T42_t
-  compound rec_var_flt_t {
-    float rec_var_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_t
-  compound rec_var_dbl_t {
-    double rec_var_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_t
-  compound one_dmn_rec_var_t {
-    int one_dmn_rec_var(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_t
-  compound tpt_t {
-    float tpt(10) ;
-    double time(10) ;
-  }; // tpt_t
-  compound rec_var_dbl_mss_val_dbl_upk_t {
-    double rec_var_dbl_mss_val_dbl_upk(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_upk_t
-  compound rec_var_dbl_mss_val_dbl_pck_t {
-    short rec_var_dbl_mss_val_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_t
-  compound rec_var_flt_mss_val_flt_t {
-    float rec_var_flt_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_flt_t
-  compound rec_var_flt_pck_t {
-    short rec_var_flt_pck(10) ;
-    double time(10) ;
-  }; // rec_var_flt_pck_t
-  compound rec_var_dbl_pck_t {
-    short rec_var_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_pck_t
-  compound rec_var_flt_mss_val_dbl_t {
-    float rec_var_flt_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_dbl_t
-  compound rec_var_flt_mss_val_int_t {
-    float rec_var_flt_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_int_t
-  compound rec_var_int_mss_val_int_t {
-    int rec_var_int_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_int_t
-  compound rec_var_int_mss_val_flt_t {
-    int rec_var_int_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_flt_t
-  compound rec_var_int_mss_val_dbl_t {
-    int rec_var_int_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_dbl_t
-  compound rec_var_dbl_mss_val_dbl_pck_lng_t {
-    int rec_var_dbl_mss_val_dbl_pck_lng(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_lng_t
-  compound one_dmn_rec_var_sng_t {
-    string one_dmn_rec_var_sng(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_sng_t
-  compound time_lon_t {
-    float time_lon(10, 4) ;
-    double time(10) ;
-    float lon(4) ;
-  }; // time_lon_t
-  compound two_dmn_rec_var_sng_t {
-    string two_dmn_rec_var_sng(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_sng_t
-  compound two_dmn_rec_var_t {
-    float two_dmn_rec_var(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_t
-  compound three_dmn_rec_var_t {
-    float three_dmn_rec_var(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_rec_var_t
-  compound three_dmn_var_dbl_t {
-    double three_dmn_var_dbl(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_dbl_t
-  compound three_dmn_var_int_t {
-    int three_dmn_var_int(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_int_t
-  compound three_dmn_var_sht_t {
-    short three_dmn_var_sht(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_sht_t
-  compound tx_t {
-    float tx(10, 4) ;
-    double time(10) ;
-    float lon(4) ;
-  }; // tx_t
-  compound ty_t {
-    float ty(10, 2) ;
-    double time(10) ;
-    float lat(2) ;
-  }; // ty_t
-  compound tz_t {
-    float tz(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // tz_t
-  compound txyz_t {
-    float txyz(10, 4, 2, 3) ;
-    double time(10) ;
-    float lon(4) ;
-    float lat(2) ;
-    float lev(3) ;
-  }; // txyz_t
-  compound four_dmn_rec_var_t {
-    float four_dmn_rec_var(10, 2, 3, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // four_dmn_rec_var_t
-  compound u_t {
-    float u(10) ;
-    double time(10) ;
-  }; // u_t
-  compound v_t {
-    float v(10) ;
-    double time(10) ;
-  }; // v_t
-dimensions:
-	bnd = 2 ;
-	char_dmn_lng = 80 ;
-	char_dmn_sml = 4 ;
-	dgn = 1 ;
-	fl_dmn = 3 ;
-	lat = 2 ;
-	lat_T42 = 64 ;
-	lev = 3 ;
-	lon = 4 ;
-	lon_T42 = 128 ;
-	lsmlev = 6 ;
-	rlev = 3 ;
-	time = 10 ;
-	time_udunits = 3 ;
-	wvl = 2 ;
-variables:
-	float lat(lat) ;
-		string lat:long_name = "Latitude" ;
-		string lat:units = "degrees_north" ;
-	lat_var_t lat_var ;
-	lat_wgt_t lat_wgt ;
-	float lon_T42(lon_T42) ;
-	float lat_T42(lat_T42) ;
-	float lev(lev) ;
-		string lev:purpose = "Monotonically increasing coordinate pressure" ;
-		string lev:units = "hybrid_sigma_pressure" ;
-		string lev:positive = "down" ;
-		string lev:A_var = "hyam" ;
-		string lev:B_var = "hybm" ;
-		string lev:P0_var = "P0" ;
-		string lev:PS_var = "PS" ;
-		string lev:bounds = "ilev" ;
-	float rlev(rlev) ;
-		string rlev:purpose = "Monotonically decreasing coordinate pressure" ;
-	float lon(lon) ;
-		string lon:long_name = "Latitude" ;
-		string lon:units = "degrees_north" ;
-	double time(time) ;
-	float lsmlev(lsmlev) ;
-		string lsmlev:purpose = "Homebrew level coordinate for LSM" ;
-		string lsmlev:long_name = "Soil depth" ;
-		string lsmlev:units = "meter" ;
-	float wvl(wvl) ;
-		string wvl:long_name = "Wavelength" ;
-		string wvl:units = "meter" ;
-	hyam_t hyam ;
-	hybm_t hybm ;
-	float P0 ;
-		string P0:long_name = "reference pressure" ;
-		string P0:units = "pascal" ;
-	PS_t PS ;
-	string fl_dmn(fl_dmn) ;
-		string fl_dmn:long_name = "Character coordinate" ;
-		string fl_dmn:units = "[chr]" ;
-	int nbdate ;
-		string nbdate:long_name = "base date as 6 or 8 digit integer (YYMMDD or YYYYMMDD)" ;
-	date_t date ;
-	lon_wgt_t lon_wgt ;
-	msk_prt_mss_prt_t msk_prt_mss_prt ;
-	mss_val_t mss_val ;
-	float mss_val_scl ;
-		string mss_val_scl:long_name = "scalar missing value" ;
-		mss_val_scl:missing_value = 1.e+36f ;
-	mss_val_fst_t mss_val_fst ;
-	fll_val_t fll_val ;
-	no_mss_val_t no_mss_val ;
-	val_one_mss_t val_one_mss ;
-	short pck ;
-		string pck:long_name = "Packed scalar variable" ;
-		string pck:note = "Original packed value was 1s with scale_factor = 2.0d and add_offset = 1.0d. Unpacked value should be 3.0 = 2.0d*1s + 1.0d. NCO algorithms would pack this variable as scale_factor = 0.0d and add_offset = 3.0d." ;
-		pck:scale_factor = 2. ;
-		pck:add_offset = 1. ;
-	pck_arr_t pck_arr ;
-	double upk ;
-		string upk:long_name = "Unpacked scalar variable" ;
-		string upk:note = "Unpacked value is 3.0d0, upk=unpack(pck)= 2.0d0*1s + 1.0d0 = 3.0d0. Packing this variable should create an NC_SHORT scalar = 0s with packing attribute add_offset=3.0d and either no scale_factor (ncap) or scale_factor = 0.0d (ncpdq)." ;
-	upk_arr_t upk_arr ;
-	int val_one_int ;
-		string val_one_int:long_name = "scalar equal to 1" ;
-		val_one_int:missing_value = -99 ;
-	val_one_one_int_t val_one_one_int ;
-	val_max_max_sht_t val_max_max_sht ;
-	val_one_mss_int_t val_one_mss_int ;
-	float val_half ;
-		string val_half:long_name = "Scalar with value 0.5" ;
-		val_half:missing_value = 1.e+36f ;
-	val_half_half_t val_half_half ;
-	wgt_one_t wgt_one ;
-	mss_val_all_t mss_val_all ;
-	float scalar_var ;
-		string scalar_var:long_name = "scalar variable" ;
-		string scalar_var:units = "Fraction" ;
-	float float_var ;
-		string float_var:long_name = "float" ;
-	double double_var ;
-		string double_var:long_name = "double" ;
-	double double_var2 ;
-		string double_var2:long_name = "double" ;
-		double_var2:missing_value = 1.e+36 ;
-	int int_var ;
-		string int_var:long_name = "int" ;
-	short short_var ;
-		string short_var:long_name = "short" ;
-	string char_var ;
-		string char_var:long_name = "char" ;
-	string char_var_space ;
-		string char_var_space:long_name = "Character variable with whitespace on ends" ;
-	string char_var_nul ;
-		string char_var_nul:long_name = "Character variable containing one NUL" ;
-	char_var_multinul_t char_var_multinul ;
-	string fl_nm(char_dmn_lng) ;
-		string fl_nm:long_name = "Variable contains a file name" ;
-	string fl_nm_arr(fl_dmn, char_dmn_lng) ;
-		string fl_nm_arr:long_name = "Variable that contains a short array of file names" ;
-		string fl_nm_arr:units = "[sng]" ;
-	string non_nul_trm_char_one_dmn(char_dmn_sml) ;
-		string non_nul_trm_char_one_dmn:long_name = "Variable contains a one-dimensional array of characters that is not NUL-terminated" ;
-		string non_nul_trm_char_one_dmn:units = "[chr]" ;
-	string non_nul_trm_char_two_dmn(fl_dmn, char_dmn_sml) ;
-		string non_nul_trm_char_two_dmn:long_name = "Variable contains a two-dimensional array of characters that are not NUL-terminated" ;
-		string non_nul_trm_char_two_dmn:units = "[chr]" ;
-	ubyte byte_var ;
-		string byte_var:long_name = "byte" ;
-	ubyte byte_var_neg ;
-		string byte_var_neg:long_name = "negative byte" ;
-	float zero ;
-		string zero:long_name = "zero" ;
-	float one ;
-		string one:long_name = "one" ;
-	float two ;
-		string two:long_name = "two" ;
-	double e_dbl ;
-		string e_dbl:long_name = "e, natural logarithm base" ;
-	float e_flt ;
-		string e_flt:long_name = "e, natural logarithm base" ;
-	float three ;
-		string three:long_name = "three" ;
-	float four ;
-		string four:long_name = "four" ;
-	float negative_one ;
-		string negative_one:long_name = "negative one" ;
-	lev_var_t lev_var ;
-	lev_wgt_t lev_wgt ;
-	float g ;
-		string g:long_name = "g" ;
-	z_t z ;
-	rz_t rz ;
-	float one_dmn_var(bnd) ;
-	one_dmn_int_val_one_t one_dmn_int_val_one ;
-	one_dmn_int_val_two_t one_dmn_int_val_two ;
-	float att_var ;
-		att_var:byte_att = 0UB ;
-		string att_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		att_var:short_att = 37s ;
-		att_var:int_att = 73 ;
-		att_var:float_att = 73.f, 72.f, 71.f ;
-		att_var:double_att = 73. ;
-	int bnd_var(lev, bnd) ;
-		bnd_var:byte_att = 0UB ;
-		string bnd_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		bnd_var:short_att = 37s ;
-		bnd_var:int_att = 73 ;
-		bnd_var:float_att = 73.f ;
-		bnd_var:double_att = 73. ;
-	three_dmn_var_t three_dmn_var ;
-	three_dmn_var_crd_t three_dmn_var_crd ;
-	prs_sfc_t prs_sfc ;
-	two_dmn_var_t two_dmn_var ;
-	mask_t mask ;
-	ORO_t ORO ;
-	weight_t weight ;
-	gw_t gw ;
-	gw_T42_t gw_T42 ;
-	rec_var_flt_t rec_var_flt ;
-	rec_var_dbl_t rec_var_dbl ;
-	one_dmn_rec_var_t one_dmn_rec_var ;
-	tpt_t tpt ;
-	rec_var_dbl_mss_val_dbl_upk_t rec_var_dbl_mss_val_dbl_upk ;
-	rec_var_dbl_mss_val_dbl_pck_t rec_var_dbl_mss_val_dbl_pck ;
-	rec_var_flt_mss_val_flt_t rec_var_flt_mss_val_flt ;
-	rec_var_flt_pck_t rec_var_flt_pck ;
-	rec_var_dbl_pck_t rec_var_dbl_pck ;
-	rec_var_flt_mss_val_dbl_t rec_var_flt_mss_val_dbl ;
-	rec_var_flt_mss_val_int_t rec_var_flt_mss_val_int ;
-	rec_var_int_mss_val_int_t rec_var_int_mss_val_int ;
-	rec_var_int_mss_val_flt_t rec_var_int_mss_val_flt ;
-	rec_var_int_mss_val_dbl_t rec_var_int_mss_val_dbl ;
-	rec_var_dbl_mss_val_dbl_pck_lng_t rec_var_dbl_mss_val_dbl_pck_lng ;
-	one_dmn_rec_var_sng_t one_dmn_rec_var_sng ;
-	time_lon_t time_lon ;
-	two_dmn_rec_var_sng_t two_dmn_rec_var_sng ;
-	two_dmn_rec_var_t two_dmn_rec_var ;
-	three_dmn_rec_var_t three_dmn_rec_var ;
-	three_dmn_var_dbl_t three_dmn_var_dbl ;
-	three_dmn_var_int_t three_dmn_var_int ;
-	three_dmn_var_sht_t three_dmn_var_sht ;
-	float td(time, dgn) ;
-		string td:long_name = "two dimensional record variable stored in td (time,dgn) order (dgn means degenerate, i.e., of size 1)" ;
-	tx_t tx ;
-	ty_t ty ;
-	tz_t tz ;
-	txyz_t txyz ;
-	four_dmn_rec_var_t four_dmn_rec_var ;
-	double time_udunits(time_udunits) ;
-		string time_udunits:units = "hours since 1900-01-01 00:00:0.0" ;
-		string time_udunits:delta_t = "0000-00-00 06:00:0.0" ;
-	u_t u ;
-	v_t v ;
-
-// global attributes:
-		string :Conventions = "NCAR-CSM" ;
-		string :history = "History global attribute.\\012" ;
-		:julian_day = 200000.04 ;
-data:
-
- lat = -90, 90 ;
-
- lat_var = {{1, 2}, {-90, 90}} ;
-
- lat_wgt = {{1, 2}, {-90, 90}} ;
-
- lon_T42 = 0, 2.8125, 5.625, 8.4375, 11.25, 14.0625, 16.875, 19.6875, 22.5, 
-    25.3125, 28.125, 30.9375, 33.75, 36.5625, 39.375, 42.1875, 45, 47.8125, 
-    50.625, 53.4375, 56.25, 59.0625, 61.875, 64.6875, 67.5, 70.3125, 73.125, 
-    75.9375, 78.75, 81.5625, 84.375, 87.1875, 90, 92.8125, 95.625, 98.4375, 
-    101.25, 104.0625, 106.875, 109.6875, 112.5, 115.3125, 118.125, 120.9375, 
-    123.75, 126.5625, 129.375, 132.1875, 135, 137.8125, 140.625, 143.4375, 
-    146.25, 149.0625, 151.875, 154.6875, 157.5, 160.3125, 163.125, 165.9375, 
-    168.75, 171.5625, 174.375, 177.1875, 180, 182.8125, 185.625, 188.4375, 
-    191.25, 194.0625, 196.875, 199.6875, 202.5, 205.3125, 208.125, 210.9375, 
-    213.75, 216.5625, 219.375, 222.1875, 225, 227.8125, 230.625, 233.4375, 
-    236.25, 239.0625, 241.875, 244.6875, 247.5, 250.3125, 253.125, 255.9375, 
-    258.75, 261.5625, 264.375, 267.1875, 270, 272.8125, 275.625, 278.4375, 
-    281.25, 284.0625, 286.875, 289.6875, 292.5, 295.3125, 298.125, 300.9375, 
-    303.75, 306.5625, 309.375, 312.1875, 315, 317.8125, 320.625, 323.4375, 
-    326.25, 329.0625, 331.875, 334.6875, 337.5, 340.3125, 343.125, 345.9375, 
-    348.75, 351.5625, 354.375, 357.1875 ;
-
- lat_T42 = -88.24009, -85.09245, -82.31198, -79.52525, -76.73673, -73.94742, 
-    -71.1577, -68.36772, -65.57758, -62.78733, -59.99701, -57.20662, 
-    -54.41619, -51.62573, -48.83524, -46.04472, -43.25419, -40.46365, 
-    -37.67309, -34.88252, -32.09194, -29.30136, -26.51077, -23.72017, 
-    -20.92957, -18.13897, -15.34836, -12.55776, -9.767145, -6.976533, 
-    -4.185921, -1.395307, 1.395307, 4.185921, 6.976533, 9.767145, 12.55776, 
-    15.34836, 18.13897, 20.92957, 23.72017, 26.51077, 29.30136, 32.09194, 
-    34.88252, 37.67309, 40.46365, 43.25419, 46.04472, 48.83524, 51.62573, 
-    54.41619, 57.20662, 59.99701, 62.78733, 65.57758, 68.36772, 71.1577, 
-    73.94742, 76.73673, 79.52525, 82.31198, 85.09245, 88.24009 ;
-
- lev = 100, 500, 1000 ;
-
- rlev = 1000, 500, 100 ;
-
- lon = 0, 90, 180, 270 ;
-
- time = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
-
- lsmlev = 0.05, 0.1, 0.2, 0.5, 1, 3 ;
-
- wvl = 5e-07, 1e-06 ;
-
- hyam = {{0.0802583, 0.0438226, 0}, {100, 500, 1000}} ;
-
- hybm = {{0.0187849, 0.457453, 0.992528}, {100, 500, 1000}} ;
-
- P0 = 100000 ;
-
- PS = 
-    {{101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325 [...]
-
- fl_dmn = "a", "b", "3" ;
-
- nbdate = 640312 ;
-
- date = 
-    {{640312, 640313, 640314, 640315, 640316, 640317, 640318, 640319, 640320, 640321}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- lon_wgt = {{0.347855, 0.652145, 0.652145, 0.347855}, {0, 90, 180, 270}} ;
-
- msk_prt_mss_prt = {{0.5, 1e+36, 1.5, 1e+36}, {0, 90, 180, 270}} ;
-
- mss_val = {{73, 1e+36, 73, 1e+36}, {0, 90, 180, 270}} ;
-
- mss_val_scl = 1e+36 ;
-
- mss_val_fst = {{-999, 73, -999, 73}, {0, 90, 180, 270}} ;
-
- fll_val = {{73, -999, 73, -999}, {0, 90, 180, 270}} ;
-
- no_mss_val = {{73, 1e+36, 73, 1e+36}, {0, 90, 180, 270}} ;
-
- val_one_mss = {{1, 1e+36}, {-90, 90}} ;
-
- pck = 1 ;
-
- pck_arr = {{-32767, 0, 1, 32767}, {0, 90, 180, 270}} ;
-
- upk = 3 ;
-
- upk_arr = {{-32767, 0, 1, 32767}, {0, 90, 180, 270}} ;
-
- val_one_int = 1 ;
-
- val_one_one_int = {{1, 1}, {-90, 90}} ;
-
- val_max_max_sht = {{17000, 17000}, {-90, 90}} ;
-
- val_one_mss_int = {{1, -99}, {-90, 90}} ;
-
- val_half = 0.5 ;
-
- val_half_half = {{0.5, 0.5}, {-90, 90}} ;
-
- wgt_one = {{1, 1}, {-90, 90}} ;
-
- mss_val_all = {{1e+36, 1e+36, 1e+36, 1e+36}, {0, 90, 180, 270}} ;
-
- scalar_var = 10 ;
-
- float_var = 10 ;
-
- double_var = 10 ;
-
- double_var2 = 10 ;
-
- int_var = 10 ;
-
- short_var = 10 ;
-
- char_var = "z" ;
-
- char_var_space = " " ;
-
- char_var_nul = _ ;
-
- char_var_multinul = {{"", "
-", ""}, {100, 500, 1000}} ;
-
- fl_nm = "/", "h", "o", "m", "e", "/", "z", "e", "n", "d", "e", "r", "/", 
-    "n", "c", "o", "/", "d", "a", "t", "a", "/", "i", "n", ".", "c", "d", 
-    "l", _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _ ;
-
- fl_nm_arr =
-  "/", "d", "a", "t", "a", "/", "z", "e", "n", "d", "e", "r", "/", "d", "s", 
-    "t", "c", "c", "m", "0", "4", "/", "d", "s", "t", "c", "c", "m", "0", 
-    "4", "_", "8", "5", "8", "9", "_", "0", "1", ".", "n", "c", _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _,
-  "/", "d", "a", "t", "a", "/", "z", "e", "n", "d", "e", "r", "/", "d", "s", 
-    "t", "c", "c", "m", "0", "4", "/", "d", "s", "t", "c", "c", "m", "0", 
-    "4", "_", "8", "5", "8", "9", "_", "0", "2", ".", "n", "c", _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _,
-  "/", "d", "a", "t", "a", "/", "z", "e", "n", "d", "e", "r", "/", "d", "s", 
-    "t", "c", "c", "m", "0", "4", "/", "d", "s", "t", "c", "c", "m", "0", 
-    "4", "_", "8", "5", "8", "9", "_", "0", "3", ".", "n", "c", _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _ ;
-
- non_nul_trm_char_one_dmn = "a", "b", _, _ ;
-
- non_nul_trm_char_two_dmn =
-  "a", "b", "c", "d",
-  "e", "f", "g", "h",
-  "i", "j", "k", "m" ;
-
- byte_var = 122 ;
-
- byte_var_neg = 134 ;
-
- zero = 0 ;
-
- one = 1 ;
-
- two = 2 ;
-
- e_dbl = 2.71828182846 ;
-
- e_flt = 2.718282 ;
-
- three = 3 ;
-
- four = 4 ;
-
- negative_one = -1 ;
-
- lev_var = {{100, 500, 1000}, {100, 500, 1000}} ;
-
- lev_wgt = {{10, 2, 1}, {100, 500, 1000}} ;
-
- g = 9.8 ;
-
- z = {{17000, 5000, 0}, {100, 500, 1000}} ;
-
- rz = {{0, 5000, 17000}, {1000, 500, 100}} ;
-
- one_dmn_var = 1, 10 ;
-
- one_dmn_int_val_one = {{1, 1}, {-90, 90}} ;
-
- one_dmn_int_val_two = {{2, 2}, {-90, 90}} ;
-
- att_var = 10 ;
-
- bnd_var =
-  1, 2,
-  3, 4,
-  5, 6 ;
-
- three_dmn_var = 
-    {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}, {-90, 90}, {100, 500, 1000}, {0, 90, 180, 270}} ;
-
- three_dmn_var_crd = 
-    {{0, 1, 2, 3, 12, 13, 14, 15, 4, 5, 6, 7, 16, 17, 18, 19, 8, 9, 10, 11, 20, 21, 22, 23}, {100, 500, 1000}, {-90, 90}, {0, 90, 180, 270}} ;
-
- prs_sfc = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- two_dmn_var = 
-    {{1.5, 5.5, 9.5, 13.5, 17.5, 21.5}, {-90, 90}, {100, 500, 1000}} ;
-
- mask = {{0, 1, 0, 0, 1, 1, 0, 2}, {-90, 90}, {0, 90, 180, 270}} ;
-
- ORO = {{1, 1, 1, 1, 1, 1, 1, 1}, {-90, 90}, {0, 90, 180, 270}} ;
-
- weight = {{10, 10}, {-90, 90}} ;
-
- gw = {{10, 10}, {-90, 90}} ;
-
- gw_T42 = 
-    {{-87.8638, -85.09653, -82.31291, -79.5256, -76.7369, -73.94752, -71.15775, -68.36776, -65.57761, -62.78735, -59.99702, -57.20663, -54.4162, -51.62573, -48.83524, -46.04473, -43.2542, -40.46365, -37.67309, -34.88252, -32.09195, -29.30136, -26.51077, -23.72017, -20.92957, -18.13897, -15.34836, -12.55776, -9.767146, -6.976534, -4.185921, -1.395307, 1.395307, 4.185921, 6.976534, 9.767146, 12.55776, 15.34836, 18.13897, 20.92957, 23.72017, 26.51077, 29.30136, 32.09195, 34.88252, 37.67309, [...]
-
- rec_var_flt = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- one_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- tpt = 
-    {{273.1, 273.2, 273.3, 273.4, 273.5, 273.6, 273.7, 273.8, 273.9, 274}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_mss_val_dbl_upk = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_mss_val_dbl_pck = 
-    {{-999, 32767, 21845, 10922, 0, -10922, -21845, -32767, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_mss_val_flt = 
-    {{1e+36, 2, 3, 4, 5, 6, 7, 8, 1e+36, 1e+36}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_pck = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_pck = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_mss_val_dbl = 
-    {{1e+36, 2, 3, 4, 5, 6, 7, 8, 1e+36, 1e+36}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_mss_val_int = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_int_mss_val_int = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_int_mss_val_flt = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_int_mss_val_dbl = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_mss_val_dbl_pck_lng = 
-    {{-999, 32767, 21845, 10922, 0, -10922, -21845, -32767, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- one_dmn_rec_var_sng = 
-    {{"H", "e", "l", "l", "o", " ", "W", "o", "r", ""}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- time_lon = 
-    {{0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {0, 90, 180, 270}} ;
-
- two_dmn_rec_var_sng = 
-    {{"a", "b", "c", "b", "c", "d", "c", "d", "e", "d", "e", "f", "e", "f", "g", "f", "g", "h", "g", "h", "i", "h", "i", "j", "j", "k", "l", "k", "l", "m"}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {100, 500, 1000}} ;
-
- two_dmn_rec_var = 
-    {{1, 2, 3, 1, 2.1, 3, 1, 2.2, 3, 1, 2.3, 3, 1, 2.4, 3, 1, 2.5, 3, 1, 2.6, 3, 1, 2.7, 3, 1, 2.8, 3, 1, 2.9, 3}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {100, 500, 1000}} ;
-
- three_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- three_dmn_var_dbl = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -99, -99, -99, -99, -99, -99, -99, -99, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, 74, 75, 76, 77, 78, 79, -99}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- three_dmn_var_int = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -99, -99, -99, -99, -99, -99, -99, -99, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -99, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, -99, 62, 63, 64, 65, -99, 67, 68, 69, 70, 71, 72, -99, 74, 75, -99, 77, 78, 79, 80}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- three_dmn_var_sht = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, -99, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -99, 34, 35, -99, 37, 38, 39, 40, 41, 42, 43, 44, -99, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, -99, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, -99, -99, -99, -99, -99, -99, -99}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- td =
-  1,
-  2,
-  3,
-  4,
-  5,
-  6,
-  7,
-  8,
-  9,
-  10 ;
-
- tx = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {0, 90, 180, 270}} ;
-
- ty = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}} ;
-
- tz = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {100, 500, 1000}} ;
-
- txyz = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, [...]
-
- four_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, [...]
-
- time_udunits = 876012, 876018, 876024 ;
-
- u = {{1, 0, 1, 0, 1, 0, 1, 0, 1, 0}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- v = {{0, 1, 0, 1, 0, 1, 0, 1, 0, 1}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-}
diff --git a/ncdap_test/expected4/in_2.nc.dmp b/ncdap_test/expected4/in_2.nc.dmp
deleted file mode 100644
index 49e5698..0000000
--- a/ncdap_test/expected4/in_2.nc.dmp
+++ /dev/null
@@ -1,770 +0,0 @@
-netcdf in_2 {
-types:
-  compound lat_var_t {
-    float lat_var(2) ;
-    float lat(2) ;
-  }; // lat_var_t
-  compound lat_wgt_t {
-    float lat_wgt(2) ;
-    float lat(2) ;
-  }; // lat_wgt_t
-  compound hyam_t {
-    float hyam(3) ;
-    float lev(3) ;
-  }; // hyam_t
-  compound hybm_t {
-    float hybm(3) ;
-    float lev(3) ;
-  }; // hybm_t
-  compound PS_t {
-    float PS(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // PS_t
-  compound date_t {
-    int date(10) ;
-    double time(10) ;
-  }; // date_t
-  compound lon_wgt_t {
-    float lon_wgt(4) ;
-    float lon(4) ;
-  }; // lon_wgt_t
-  compound msk_prt_mss_prt_t {
-    float msk_prt_mss_prt(4) ;
-    float lon(4) ;
-  }; // msk_prt_mss_prt_t
-  compound mss_val_t {
-    float mss_val(4) ;
-    float lon(4) ;
-  }; // mss_val_t
-  compound mss_val_fst_t {
-    float mss_val_fst(4) ;
-    float lon(4) ;
-  }; // mss_val_fst_t
-  compound fll_val_t {
-    float fll_val(4) ;
-    float lon(4) ;
-  }; // fll_val_t
-  compound no_mss_val_t {
-    float no_mss_val(4) ;
-    float lon(4) ;
-  }; // no_mss_val_t
-  compound val_one_mss_t {
-    float val_one_mss(2) ;
-    float lat(2) ;
-  }; // val_one_mss_t
-  compound pck_arr_t {
-    short pck_arr(4) ;
-    float lon(4) ;
-  }; // pck_arr_t
-  compound upk_arr_t {
-    double upk_arr(4) ;
-    float lon(4) ;
-  }; // upk_arr_t
-  compound val_one_one_int_t {
-    int val_one_one_int(2) ;
-    float lat(2) ;
-  }; // val_one_one_int_t
-  compound val_max_max_sht_t {
-    short val_max_max_sht(2) ;
-    float lat(2) ;
-  }; // val_max_max_sht_t
-  compound val_one_mss_int_t {
-    int val_one_mss_int(2) ;
-    float lat(2) ;
-  }; // val_one_mss_int_t
-  compound val_half_half_t {
-    float val_half_half(2) ;
-    float lat(2) ;
-  }; // val_half_half_t
-  compound wgt_one_t {
-    float wgt_one(2) ;
-    float lat(2) ;
-  }; // wgt_one_t
-  compound mss_val_all_t {
-    float mss_val_all(4) ;
-    float lon(4) ;
-  }; // mss_val_all_t
-  compound char_var_multinul_t {
-    string char_var_multinul(3) ;
-    float lev(3) ;
-  }; // char_var_multinul_t
-  compound lev_var_t {
-    float lev_var(3) ;
-    float lev(3) ;
-  }; // lev_var_t
-  compound lev_wgt_t {
-    float lev_wgt(3) ;
-    float lev(3) ;
-  }; // lev_wgt_t
-  compound z_t {
-    float z(3) ;
-    float lev(3) ;
-  }; // z_t
-  compound rz_t {
-    float rz(3) ;
-    float rlev(3) ;
-  }; // rz_t
-  compound three_dmn_var_t {
-    float three_dmn_var(2, 3, 4) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // three_dmn_var_t
-  compound three_dmn_var_crd_t {
-    float three_dmn_var_crd(3, 2, 4) ;
-    float lev(3) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_crd_t
-  compound prs_sfc_t {
-    float prs_sfc(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // prs_sfc_t
-  compound two_dmn_var_t {
-    float two_dmn_var(2, 3) ;
-    float lat(2) ;
-    float lev(3) ;
-  }; // two_dmn_var_t
-  compound mask_t {
-    float mask(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // mask_t
-  compound ORO_t {
-    float ORO(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // ORO_t
-  compound weight_t {
-    float weight(2) ;
-    float lat(2) ;
-  }; // weight_t
-  compound gw_t {
-    float gw(2) ;
-    float lat(2) ;
-  }; // gw_t
-  compound gw_T42_t {
-    float gw_T42(64) ;
-    float lat_T42(64) ;
-  }; // gw_T42_t
-  compound rec_var_flt_t {
-    float rec_var_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_t
-  compound rec_var_dbl_t {
-    double rec_var_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_t
-  compound one_dmn_rec_var_t {
-    int one_dmn_rec_var(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_t
-  compound tpt_t {
-    float tpt(10) ;
-    double time(10) ;
-  }; // tpt_t
-  compound rec_var_dbl_mss_val_dbl_upk_t {
-    double rec_var_dbl_mss_val_dbl_upk(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_upk_t
-  compound rec_var_dbl_mss_val_dbl_pck_t {
-    short rec_var_dbl_mss_val_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_t
-  compound rec_var_flt_mss_val_flt_t {
-    float rec_var_flt_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_flt_t
-  compound rec_var_flt_pck_t {
-    short rec_var_flt_pck(10) ;
-    double time(10) ;
-  }; // rec_var_flt_pck_t
-  compound rec_var_dbl_pck_t {
-    short rec_var_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_pck_t
-  compound rec_var_flt_mss_val_dbl_t {
-    float rec_var_flt_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_dbl_t
-  compound rec_var_flt_mss_val_int_t {
-    float rec_var_flt_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_int_t
-  compound rec_var_int_mss_val_int_t {
-    int rec_var_int_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_int_t
-  compound rec_var_int_mss_val_flt_t {
-    int rec_var_int_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_flt_t
-  compound rec_var_int_mss_val_dbl_t {
-    int rec_var_int_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_dbl_t
-  compound rec_var_dbl_mss_val_dbl_pck_lng_t {
-    int rec_var_dbl_mss_val_dbl_pck_lng(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_lng_t
-  compound one_dmn_rec_var_sng_t {
-    string one_dmn_rec_var_sng(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_sng_t
-  compound time_lon_t {
-    float time_lon(10, 4) ;
-    double time(10) ;
-    float lon(4) ;
-  }; // time_lon_t
-  compound two_dmn_rec_var_sng_t {
-    string two_dmn_rec_var_sng(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_sng_t
-  compound two_dmn_rec_var_t {
-    float two_dmn_rec_var(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_t
-  compound three_dmn_rec_var_t {
-    float three_dmn_rec_var(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_rec_var_t
-  compound three_dmn_var_dbl_t {
-    double three_dmn_var_dbl(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_dbl_t
-  compound three_dmn_var_int_t {
-    int three_dmn_var_int(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_int_t
-  compound three_dmn_var_sht_t {
-    short three_dmn_var_sht(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_sht_t
-  compound four_dmn_rec_var_t {
-    float four_dmn_rec_var(10, 2, 3, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // four_dmn_rec_var_t
-  compound three_double_dmn_t {
-    double three_double_dmn(10, 4, 4) ;
-    double time(10) ;
-    float lon(4) ;
-    float lon1(4) ;
-  }; // three_double_dmn_t
-  compound u_t {
-    float u(10) ;
-    double time(10) ;
-  }; // u_t
-  compound v_t {
-    float v(10) ;
-    double time(10) ;
-  }; // v_t
-dimensions:
-	bnd = 2 ;
-	char_dmn_lng = 80 ;
-	char_dmn_sml = 4 ;
-	fl_dmn = 3 ;
-	lat = 2 ;
-	lat_T42 = 64 ;
-	lev = 3 ;
-	lon = 4 ;
-	lon_T42 = 128 ;
-	lsmlev = 6 ;
-	rlev = 3 ;
-	time = 10 ;
-	time_udunits = 3 ;
-	wvl = 2 ;
-variables:
-	float lat(lat) ;
-	lat_var_t lat_var ;
-	lat_wgt_t lat_wgt ;
-	float lev(lev) ;
-		string lev:purpose = "Monotonically increasing coordinate pressure" ;
-		string lev:units = "hybrid_sigma_pressure" ;
-		string lev:positive = "down" ;
-		string lev:A_var = "hyam" ;
-		string lev:B_var = "hybm" ;
-		string lev:P0_var = "P0" ;
-		string lev:PS_var = "PS" ;
-		string lev:bounds = "ilev" ;
-	float lon_T42(lon_T42) ;
-	float lat_T42(lat_T42) ;
-	float rlev(rlev) ;
-		string rlev:purpose = "Monotonically decreasing coordinate pressure" ;
-	float lon(lon) ;
-	double time(time) ;
-	float lsmlev(lsmlev) ;
-		string lsmlev:purpose = "Homebrew level coordinate for LSM" ;
-		string lsmlev:long_name = "Soil depth" ;
-		string lsmlev:units = "meter" ;
-	float wvl(wvl) ;
-		string wvl:long_name = "Wavelength" ;
-		string wvl:units = "meter" ;
-	hyam_t hyam ;
-	hybm_t hybm ;
-	float P0 ;
-		string P0:long_name = "reference pressure" ;
-		string P0:units = "pascal" ;
-	PS_t PS ;
-	string fl_dmn(fl_dmn) ;
-		string fl_dmn:long_name = "Character coordinate" ;
-		string fl_dmn:units = "[chr]" ;
-	int nbdate ;
-		string nbdate:long_name = "base date as 6 or 8 digit integer (YYMMDD or YYYYMMDD)" ;
-	date_t date ;
-	lon_wgt_t lon_wgt ;
-	msk_prt_mss_prt_t msk_prt_mss_prt ;
-	mss_val_t mss_val ;
-	float mss_val_scl ;
-		string mss_val_scl:long_name = "scalar missing value" ;
-		mss_val_scl:missing_value = 1.e+36f ;
-	mss_val_fst_t mss_val_fst ;
-	fll_val_t fll_val ;
-	no_mss_val_t no_mss_val ;
-	val_one_mss_t val_one_mss ;
-	short pck ;
-		string pck:long_name = "Packed scalar variable" ;
-		string pck:note = "Original packed value was 1s with scale_factor = 2.0d and add_offset = 1.0d. Unpacked value should be 3.0 = 2.0d*1s + 1.0d. NCO algorithms would pack this variable as scale_factor = 0.0d and add_offset = 3.0d." ;
-		pck:scale_factor = 2. ;
-		pck:add_offset = 1. ;
-	pck_arr_t pck_arr ;
-	double upk ;
-		string upk:long_name = "Unpacked scalar variable" ;
-		string upk:note = "Unpacked value is 3.0d0, upk=unpack(pck)= 2.0d0*1s + 1.0d0 = 3.0d0. Packing this variable should create an NC_SHORT scalar = 0s with packing attribute add_offset=3.0d and either no scale_factor (ncap) or scale_factor = 0.0d (ncpdq)." ;
-	upk_arr_t upk_arr ;
-	int val_one_int ;
-		string val_one_int:long_name = "scalar equal to 1" ;
-		val_one_int:missing_value = -99 ;
-	val_one_one_int_t val_one_one_int ;
-	val_max_max_sht_t val_max_max_sht ;
-	val_one_mss_int_t val_one_mss_int ;
-	float val_half ;
-		string val_half:long_name = "Scalar with value 0.5" ;
-		val_half:missing_value = 1.e+36f ;
-	val_half_half_t val_half_half ;
-	wgt_one_t wgt_one ;
-	mss_val_all_t mss_val_all ;
-	float scalar_var ;
-		string scalar_var:long_name = "scalar variable" ;
-		string scalar_var:units = "Fraction" ;
-	float float_var ;
-		string float_var:long_name = "float" ;
-	double double_var ;
-		string double_var:long_name = "double" ;
-	double double_var2 ;
-		string double_var2:long_name = "double" ;
-		double_var2:missing_value = 1.e+36 ;
-	int int_var ;
-		string int_var:long_name = "int" ;
-	short short_var ;
-		string short_var:long_name = "short" ;
-	string char_var ;
-		string char_var:long_name = "char" ;
-	string char_var_space ;
-		string char_var_space:long_name = "Character variable with whitespace on ends" ;
-	string char_var_nul ;
-		string char_var_nul:long_name = "Character variable containing one NUL" ;
-	char_var_multinul_t char_var_multinul ;
-	string fl_nm(char_dmn_lng) ;
-		string fl_nm:long_name = "Variable contains a file name" ;
-	string fl_nm_arr(fl_dmn, char_dmn_lng) ;
-		string fl_nm_arr:long_name = "Variable that contains a short array of file names" ;
-		string fl_nm_arr:units = "[sng]" ;
-	string non_nul_trm_char_one_dmn(char_dmn_sml) ;
-		string non_nul_trm_char_one_dmn:long_name = "Variable contains a one-dimensional array of characters that is not NUL-terminated" ;
-		string non_nul_trm_char_one_dmn:units = "[chr]" ;
-	string non_nul_trm_char_two_dmn(fl_dmn, char_dmn_sml) ;
-		string non_nul_trm_char_two_dmn:long_name = "Variable contains a two-dimensional array of characters that are not NUL-terminated" ;
-		string non_nul_trm_char_two_dmn:units = "[chr]" ;
-	ubyte byte_var ;
-		string byte_var:long_name = "byte" ;
-	float zero ;
-		string zero:long_name = "zero" ;
-	float one ;
-		string one:long_name = "one" ;
-	float two ;
-		string two:long_name = "two" ;
-	double e_dbl ;
-		string e_dbl:long_name = "e, base of the natural logarithm" ;
-	float e_flt ;
-		string e_flt:long_name = "e, base of the natural logarithm" ;
-	float three ;
-		string three:long_name = "three" ;
-	float four ;
-		string four:long_name = "four" ;
-	float negative_one ;
-		string negative_one:long_name = "negative one" ;
-	lev_var_t lev_var ;
-	lev_wgt_t lev_wgt ;
-	float g ;
-		string g:long_name = "g" ;
-	z_t z ;
-	rz_t rz ;
-	float one_dmn_var(bnd) ;
-	float att_var ;
-		att_var:byte_att = 0UB ;
-		string att_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		att_var:short_att = 37s ;
-		att_var:int_att = 73 ;
-		att_var:float_att = 73.f, 72.f, 71.f ;
-		att_var:double_att = 73. ;
-	int bnd_var(lev, bnd) ;
-		bnd_var:byte_att = 0UB ;
-		string bnd_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		bnd_var:short_att = 37s ;
-		bnd_var:int_att = 73 ;
-		bnd_var:float_att = 73.f ;
-		bnd_var:double_att = 73. ;
-	three_dmn_var_t three_dmn_var ;
-	three_dmn_var_crd_t three_dmn_var_crd ;
-	prs_sfc_t prs_sfc ;
-	two_dmn_var_t two_dmn_var ;
-	mask_t mask ;
-	ORO_t ORO ;
-	weight_t weight ;
-	gw_t gw ;
-	gw_T42_t gw_T42 ;
-	rec_var_flt_t rec_var_flt ;
-	rec_var_dbl_t rec_var_dbl ;
-	one_dmn_rec_var_t one_dmn_rec_var ;
-	tpt_t tpt ;
-	rec_var_dbl_mss_val_dbl_upk_t rec_var_dbl_mss_val_dbl_upk ;
-	rec_var_dbl_mss_val_dbl_pck_t rec_var_dbl_mss_val_dbl_pck ;
-	rec_var_flt_mss_val_flt_t rec_var_flt_mss_val_flt ;
-	rec_var_flt_pck_t rec_var_flt_pck ;
-	rec_var_dbl_pck_t rec_var_dbl_pck ;
-	rec_var_flt_mss_val_dbl_t rec_var_flt_mss_val_dbl ;
-	rec_var_flt_mss_val_int_t rec_var_flt_mss_val_int ;
-	rec_var_int_mss_val_int_t rec_var_int_mss_val_int ;
-	rec_var_int_mss_val_flt_t rec_var_int_mss_val_flt ;
-	rec_var_int_mss_val_dbl_t rec_var_int_mss_val_dbl ;
-	rec_var_dbl_mss_val_dbl_pck_lng_t rec_var_dbl_mss_val_dbl_pck_lng ;
-	one_dmn_rec_var_sng_t one_dmn_rec_var_sng ;
-	time_lon_t time_lon ;
-	two_dmn_rec_var_sng_t two_dmn_rec_var_sng ;
-	two_dmn_rec_var_t two_dmn_rec_var ;
-	three_dmn_rec_var_t three_dmn_rec_var ;
-	three_dmn_var_dbl_t three_dmn_var_dbl ;
-	three_dmn_var_int_t three_dmn_var_int ;
-	three_dmn_var_sht_t three_dmn_var_sht ;
-	four_dmn_rec_var_t four_dmn_rec_var ;
-	three_double_dmn_t three_double_dmn ;
-	double time_udunits(time_udunits) ;
-		string time_udunits:units = "hours since 1900-01-01 00:00:0.0" ;
-		string time_udunits:delta_t = "0000-00-00 06:00:0.0" ;
-	u_t u ;
-	v_t v ;
-
-// global attributes:
-		string :Conventions = "NCAR-CSM" ;
-		string :history = "History global attribute.\\012" ;
-		:julian_day = 200000.04 ;
-data:
-
- lat = _, _ ;
-
- lat_var = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- lat_wgt = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- lev = _, _, _ ;
-
- lon_T42 = _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _ ;
-
- lat_T42 = _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ ;
-
- rlev = _, _, _ ;
-
- lon = _, _, _, _ ;
-
- time = _, _, _, _, _, _, _, _, _, _ ;
-
- lsmlev = _, _, _, _, _, _ ;
-
- wvl = _, _ ;
-
- hyam = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- hybm = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- P0 = _ ;
-
- PS = 
-    {{101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325 [...]
-
- fl_dmn = _, _, _ ;
-
- nbdate = _ ;
-
- date = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- lon_wgt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- msk_prt_mss_prt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- mss_val = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- mss_val_scl = _ ;
-
- mss_val_fst = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- fll_val = 
-    {{-999, -999, -999, -999}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- no_mss_val = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- val_one_mss = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- pck = _ ;
-
- pck_arr = 
-    {{-32767, -32767, -32767, -32767}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- upk = _ ;
-
- upk_arr = 
-    {{9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- val_one_int = _ ;
-
- val_one_one_int = {{-2147483647, -2147483647}, {9.96921e+36, 9.96921e+36}} ;
-
- val_max_max_sht = {{-32767, -32767}, {9.96921e+36, 9.96921e+36}} ;
-
- val_one_mss_int = {{-2147483647, -2147483647}, {9.96921e+36, 9.96921e+36}} ;
-
- val_half = _ ;
-
- val_half_half = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- wgt_one = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- mss_val_all = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- scalar_var = _ ;
-
- float_var = _ ;
-
- double_var = _ ;
-
- double_var2 = _ ;
-
- int_var = _ ;
-
- short_var = _ ;
-
- char_var = _ ;
-
- char_var_space = _ ;
-
- char_var_nul = _ ;
-
- char_var_multinul = {{"", "", ""}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- fl_nm = _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _ ;
-
- fl_nm_arr =
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _,
-  _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _ ;
-
- non_nul_trm_char_one_dmn = _, _, _, _ ;
-
- non_nul_trm_char_two_dmn =
-  _, _, _, _,
-  _, _, _, _,
-  _, _, _, _ ;
-
- byte_var = 129 ;
-
- zero = _ ;
-
- one = _ ;
-
- two = _ ;
-
- e_dbl = _ ;
-
- e_flt = _ ;
-
- three = _ ;
-
- four = _ ;
-
- negative_one = _ ;
-
- lev_var = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- lev_wgt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- g = _ ;
-
- z = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- rz = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- one_dmn_var = _, _ ;
-
- att_var = _ ;
-
- bnd_var =
-  _, _,
-  _, _,
-  _, _ ;
-
- three_dmn_var = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- three_dmn_var_crd = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- prs_sfc = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+3 [...]
-
- two_dmn_var = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- mask = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- ORO = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- weight = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- gw = {{9.96921e+36, 9.96921e+36}, {9.96921e+36, 9.96921e+36}} ;
-
- gw_T42 = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.969 [...]
-
- rec_var_flt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl = 
-    {{9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- one_dmn_rec_var = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- tpt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_mss_val_dbl_upk = 
-    {{9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_mss_val_dbl_pck = 
-    {{-32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_mss_val_flt = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_pck = 
-    {{-32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_pck = 
-    {{-32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_mss_val_dbl = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_flt_mss_val_int = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_int_mss_val_int = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_int_mss_val_flt = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_int_mss_val_dbl = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- rec_var_dbl_mss_val_dbl_pck_lng = 
-    {{-2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- one_dmn_rec_var_sng = 
-    {{"", "", "", "", "", "", "", "", "", ""}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- time_lon = 
-    {{0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- two_dmn_rec_var_sng = 
-    {{"a", "b", "c", "b", "c", "d", "c", "d", "e", "d", "e", "f", "e", "f", "g", "f", "g", "h", "g", "h", "i", "h", "i", "j", "j", "k", "l", "k", "l", "m"}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- two_dmn_rec_var = 
-    {{1, 2, 3, 1, 2.1, 3, 1, 2.2, 3, 1, 2.3, 3, 1, 2.4, 3, 1, 2.5, 3, 1, 2.6, 3, 1, 2.7, 3, 1, 2.8, 3, 1, 2.9, 3}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}, {9.96921e+36, 9.96921e+36, 9.96921e+36}} ;
-
- three_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+3 [...]
-
- three_dmn_var_dbl = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -99, -99, -99, -99, -99, -99, -99, -99, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, 74, 75, 76, 77, 78, 79, -99}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.969209 [...]
-
- three_dmn_var_int = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -99, -99, -99, -99, -99, -99, -99, -99, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -99, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, -99, 62, 63, 64, 65, -99, 67, 68, 69, 70, 71, 72, -99, 74, 75, -99, 77, 78, 79, 80}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.969 [...]
-
- three_dmn_var_sht = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, -99, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -99, 34, 35, -99, 37, 38, 39, 40, 41, 42, 43, 44, -99, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, -99, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, -99, -99, -99, -99, -99, -99, -99}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.969 [...]
-
- four_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, [...]
-
- three_double_dmn = 
-    {{9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9. [...]
-
- time_udunits = 876012, 876018, 876024 ;
-
- u = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-
- v = 
-    {{9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36, 9.96921e+36}, {9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36, 9.96920996838687e+36}} ;
-}
diff --git a/ncdap_test/expected4/in_no_three_double_dmn.nc.dmp b/ncdap_test/expected4/in_no_three_double_dmn.nc.dmp
deleted file mode 100644
index f2fce0c..0000000
--- a/ncdap_test/expected4/in_no_three_double_dmn.nc.dmp
+++ /dev/null
@@ -1,763 +0,0 @@
-netcdf in_no_three_double_dmn {
-types:
-  compound lat_var_t {
-    float lat_var(2) ;
-    float lat(2) ;
-  }; // lat_var_t
-  compound lat_wgt_t {
-    float lat_wgt(2) ;
-    float lat(2) ;
-  }; // lat_wgt_t
-  compound hyam_t {
-    float hyam(3) ;
-    float lev(3) ;
-  }; // hyam_t
-  compound hybm_t {
-    float hybm(3) ;
-    float lev(3) ;
-  }; // hybm_t
-  compound PS_t {
-    float PS(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // PS_t
-  compound date_t {
-    int date(10) ;
-    double time(10) ;
-  }; // date_t
-  compound lon_wgt_t {
-    float lon_wgt(4) ;
-    float lon(4) ;
-  }; // lon_wgt_t
-  compound msk_prt_mss_prt_t {
-    float msk_prt_mss_prt(4) ;
-    float lon(4) ;
-  }; // msk_prt_mss_prt_t
-  compound mss_val_t {
-    float mss_val(4) ;
-    float lon(4) ;
-  }; // mss_val_t
-  compound mss_val_fst_t {
-    float mss_val_fst(4) ;
-    float lon(4) ;
-  }; // mss_val_fst_t
-  compound fll_val_t {
-    float fll_val(4) ;
-    float lon(4) ;
-  }; // fll_val_t
-  compound no_mss_val_t {
-    float no_mss_val(4) ;
-    float lon(4) ;
-  }; // no_mss_val_t
-  compound val_one_mss_t {
-    float val_one_mss(2) ;
-    float lat(2) ;
-  }; // val_one_mss_t
-  compound pck_arr_t {
-    short pck_arr(4) ;
-    float lon(4) ;
-  }; // pck_arr_t
-  compound upk_arr_t {
-    double upk_arr(4) ;
-    float lon(4) ;
-  }; // upk_arr_t
-  compound val_one_one_int_t {
-    int val_one_one_int(2) ;
-    float lat(2) ;
-  }; // val_one_one_int_t
-  compound val_max_max_sht_t {
-    short val_max_max_sht(2) ;
-    float lat(2) ;
-  }; // val_max_max_sht_t
-  compound val_one_mss_int_t {
-    int val_one_mss_int(2) ;
-    float lat(2) ;
-  }; // val_one_mss_int_t
-  compound val_half_half_t {
-    float val_half_half(2) ;
-    float lat(2) ;
-  }; // val_half_half_t
-  compound wgt_one_t {
-    float wgt_one(2) ;
-    float lat(2) ;
-  }; // wgt_one_t
-  compound mss_val_all_t {
-    float mss_val_all(4) ;
-    float lon(4) ;
-  }; // mss_val_all_t
-  compound char_var_multinul_t {
-    string char_var_multinul(3) ;
-    float lev(3) ;
-  }; // char_var_multinul_t
-  compound lev_var_t {
-    float lev_var(3) ;
-    float lev(3) ;
-  }; // lev_var_t
-  compound lev_wgt_t {
-    float lev_wgt(3) ;
-    float lev(3) ;
-  }; // lev_wgt_t
-  compound z_t {
-    float z(3) ;
-    float lev(3) ;
-  }; // z_t
-  compound rz_t {
-    float rz(3) ;
-    float rlev(3) ;
-  }; // rz_t
-  compound three_dmn_var_t {
-    float three_dmn_var(2, 3, 4) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // three_dmn_var_t
-  compound three_dmn_var_crd_t {
-    float three_dmn_var_crd(3, 2, 4) ;
-    float lev(3) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_crd_t
-  compound prs_sfc_t {
-    float prs_sfc(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // prs_sfc_t
-  compound two_dmn_var_t {
-    float two_dmn_var(2, 3) ;
-    float lat(2) ;
-    float lev(3) ;
-  }; // two_dmn_var_t
-  compound mask_t {
-    float mask(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // mask_t
-  compound ORO_t {
-    float ORO(2, 4) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // ORO_t
-  compound weight_t {
-    float weight(2) ;
-    float lat(2) ;
-  }; // weight_t
-  compound gw_t {
-    float gw(2) ;
-    float lat(2) ;
-  }; // gw_t
-  compound gw_T42_t {
-    float gw_T42(64) ;
-    float lat_T42(64) ;
-  }; // gw_T42_t
-  compound rec_var_flt_t {
-    float rec_var_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_t
-  compound rec_var_dbl_t {
-    double rec_var_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_t
-  compound one_dmn_rec_var_t {
-    int one_dmn_rec_var(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_t
-  compound tpt_t {
-    float tpt(10) ;
-    double time(10) ;
-  }; // tpt_t
-  compound rec_var_dbl_mss_val_dbl_upk_t {
-    double rec_var_dbl_mss_val_dbl_upk(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_upk_t
-  compound rec_var_dbl_mss_val_dbl_pck_t {
-    short rec_var_dbl_mss_val_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_t
-  compound rec_var_flt_mss_val_flt_t {
-    float rec_var_flt_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_flt_t
-  compound rec_var_flt_pck_t {
-    short rec_var_flt_pck(10) ;
-    double time(10) ;
-  }; // rec_var_flt_pck_t
-  compound rec_var_dbl_pck_t {
-    short rec_var_dbl_pck(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_pck_t
-  compound rec_var_flt_mss_val_dbl_t {
-    float rec_var_flt_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_dbl_t
-  compound rec_var_flt_mss_val_int_t {
-    float rec_var_flt_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_flt_mss_val_int_t
-  compound rec_var_int_mss_val_int_t {
-    int rec_var_int_mss_val_int(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_int_t
-  compound rec_var_int_mss_val_flt_t {
-    int rec_var_int_mss_val_flt(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_flt_t
-  compound rec_var_int_mss_val_dbl_t {
-    int rec_var_int_mss_val_dbl(10) ;
-    double time(10) ;
-  }; // rec_var_int_mss_val_dbl_t
-  compound rec_var_dbl_mss_val_dbl_pck_lng_t {
-    int rec_var_dbl_mss_val_dbl_pck_lng(10) ;
-    double time(10) ;
-  }; // rec_var_dbl_mss_val_dbl_pck_lng_t
-  compound one_dmn_rec_var_sng_t {
-    string one_dmn_rec_var_sng(10) ;
-    double time(10) ;
-  }; // one_dmn_rec_var_sng_t
-  compound time_lon_t {
-    float time_lon(10, 4) ;
-    double time(10) ;
-    float lon(4) ;
-  }; // time_lon_t
-  compound two_dmn_rec_var_sng_t {
-    string two_dmn_rec_var_sng(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_sng_t
-  compound two_dmn_rec_var_t {
-    float two_dmn_rec_var(10, 3) ;
-    double time(10) ;
-    float lev(3) ;
-  }; // two_dmn_rec_var_t
-  compound three_dmn_rec_var_t {
-    float three_dmn_rec_var(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_rec_var_t
-  compound three_dmn_var_dbl_t {
-    double three_dmn_var_dbl(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_dbl_t
-  compound three_dmn_var_int_t {
-    int three_dmn_var_int(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_int_t
-  compound three_dmn_var_sht_t {
-    short three_dmn_var_sht(10, 2, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lon(4) ;
-  }; // three_dmn_var_sht_t
-  compound four_dmn_rec_var_t {
-    float four_dmn_rec_var(10, 2, 3, 4) ;
-    double time(10) ;
-    float lat(2) ;
-    float lev(3) ;
-    float lon(4) ;
-  }; // four_dmn_rec_var_t
-  compound u_t {
-    float u(10) ;
-    double time(10) ;
-  }; // u_t
-  compound v_t {
-    float v(10) ;
-    double time(10) ;
-  }; // v_t
-dimensions:
-	bnd = 2 ;
-	char_dmn_lng = 80 ;
-	char_dmn_sml = 4 ;
-	fl_dmn = 3 ;
-	lat = 2 ;
-	lat_T42 = 64 ;
-	lev = 3 ;
-	lon = 4 ;
-	lon_T42 = 128 ;
-	lsmlev = 6 ;
-	rlev = 3 ;
-	time = 10 ;
-	time_udunits = 3 ;
-	wvl = 2 ;
-variables:
-	float lat(lat) ;
-	lat_var_t lat_var ;
-	lat_wgt_t lat_wgt ;
-	float lev(lev) ;
-		string lev:purpose = "Monotonically increasing coordinate pressure" ;
-		string lev:units = "hybrid_sigma_pressure" ;
-		string lev:positive = "down" ;
-		string lev:A_var = "hyam" ;
-		string lev:B_var = "hybm" ;
-		string lev:P0_var = "P0" ;
-		string lev:PS_var = "PS" ;
-		string lev:bounds = "ilev" ;
-	float lon_T42(lon_T42) ;
-	float lat_T42(lat_T42) ;
-	float rlev(rlev) ;
-		string rlev:purpose = "Monotonically decreasing coordinate pressure" ;
-	float lon(lon) ;
-	double time(time) ;
-	float lsmlev(lsmlev) ;
-		string lsmlev:purpose = "Homebrew level coordinate for LSM" ;
-		string lsmlev:long_name = "Soil depth" ;
-		string lsmlev:units = "meter" ;
-	float wvl(wvl) ;
-		string wvl:long_name = "Wavelength" ;
-		string wvl:units = "meter" ;
-	hyam_t hyam ;
-	hybm_t hybm ;
-	float P0 ;
-		string P0:long_name = "reference pressure" ;
-		string P0:units = "pascal" ;
-	PS_t PS ;
-	string fl_dmn(fl_dmn) ;
-		string fl_dmn:long_name = "Character coordinate" ;
-		string fl_dmn:units = "[chr]" ;
-	int nbdate ;
-		string nbdate:long_name = "base date as 6 or 8 digit integer (YYMMDD or YYYYMMDD)" ;
-	date_t date ;
-	lon_wgt_t lon_wgt ;
-	msk_prt_mss_prt_t msk_prt_mss_prt ;
-	mss_val_t mss_val ;
-	float mss_val_scl ;
-		string mss_val_scl:long_name = "scalar missing value" ;
-		mss_val_scl:missing_value = 1.e+36f ;
-	mss_val_fst_t mss_val_fst ;
-	fll_val_t fll_val ;
-	no_mss_val_t no_mss_val ;
-	val_one_mss_t val_one_mss ;
-	short pck ;
-		string pck:long_name = "Packed scalar variable" ;
-		string pck:note = "Original packed value was 1s with scale_factor = 2.0d and add_offset = 1.0d. Unpacked value should be 3.0 = 2.0d*1s + 1.0d. NCO algorithms would pack this variable as scale_factor = 0.0d and add_offset = 3.0d." ;
-		pck:scale_factor = 2. ;
-		pck:add_offset = 1. ;
-	pck_arr_t pck_arr ;
-	double upk ;
-		string upk:long_name = "Unpacked scalar variable" ;
-		string upk:note = "Unpacked value is 3.0d0, upk=unpack(pck)= 2.0d0*1s + 1.0d0 = 3.0d0. Packing this variable should create an NC_SHORT scalar = 0s with packing attribute add_offset=3.0d and either no scale_factor (ncap) or scale_factor = 0.0d (ncpdq)." ;
-	upk_arr_t upk_arr ;
-	int val_one_int ;
-		string val_one_int:long_name = "scalar equal to 1" ;
-		val_one_int:missing_value = -99 ;
-	val_one_one_int_t val_one_one_int ;
-	val_max_max_sht_t val_max_max_sht ;
-	val_one_mss_int_t val_one_mss_int ;
-	float val_half ;
-		string val_half:long_name = "Scalar with value 0.5" ;
-		val_half:missing_value = 1.e+36f ;
-	val_half_half_t val_half_half ;
-	wgt_one_t wgt_one ;
-	mss_val_all_t mss_val_all ;
-	float scalar_var ;
-		string scalar_var:long_name = "scalar variable" ;
-		string scalar_var:units = "Fraction" ;
-	float float_var ;
-		string float_var:long_name = "float" ;
-	double double_var ;
-		string double_var:long_name = "double" ;
-	double double_var2 ;
-		string double_var2:long_name = "double" ;
-		double_var2:missing_value = 1.e+36 ;
-	int int_var ;
-		string int_var:long_name = "int" ;
-	short short_var ;
-		string short_var:long_name = "short" ;
-	string char_var ;
-		string char_var:long_name = "char" ;
-	string char_var_space ;
-		string char_var_space:long_name = "Character variable with whitespace on ends" ;
-	string char_var_nul ;
-		string char_var_nul:long_name = "Character variable containing one NUL" ;
-	char_var_multinul_t char_var_multinul ;
-	string fl_nm(char_dmn_lng) ;
-		string fl_nm:long_name = "Variable contains a file name" ;
-	string fl_nm_arr(fl_dmn, char_dmn_lng) ;
-		string fl_nm_arr:long_name = "Variable that contains a short array of file names" ;
-		string fl_nm_arr:units = "[sng]" ;
-	string non_nul_trm_char_one_dmn(char_dmn_sml) ;
-		string non_nul_trm_char_one_dmn:long_name = "Variable contains a one-dimensional array of characters that is not NUL-terminated" ;
-		string non_nul_trm_char_one_dmn:units = "[chr]" ;
-	string non_nul_trm_char_two_dmn(fl_dmn, char_dmn_sml) ;
-		string non_nul_trm_char_two_dmn:long_name = "Variable contains a two-dimensional array of characters that are not NUL-terminated" ;
-		string non_nul_trm_char_two_dmn:units = "[chr]" ;
-	ubyte byte_var ;
-		string byte_var:long_name = "byte" ;
-	float zero ;
-		string zero:long_name = "zero" ;
-	float one ;
-		string one:long_name = "one" ;
-	float two ;
-		string two:long_name = "two" ;
-	double e_dbl ;
-		string e_dbl:long_name = "e, base of the natural logarithm" ;
-	float e_flt ;
-		string e_flt:long_name = "e, base of the natural logarithm" ;
-	float three ;
-		string three:long_name = "three" ;
-	float four ;
-		string four:long_name = "four" ;
-	float negative_one ;
-		string negative_one:long_name = "negative one" ;
-	lev_var_t lev_var ;
-	lev_wgt_t lev_wgt ;
-	float g ;
-		string g:long_name = "g" ;
-	z_t z ;
-	rz_t rz ;
-	float one_dmn_var(bnd) ;
-	float att_var ;
-		att_var:byte_att = 0UB ;
-		string att_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		att_var:short_att = 37s ;
-		att_var:int_att = 73 ;
-		att_var:float_att = 73.f, 72.f, 71.f ;
-		att_var:double_att = 73. ;
-	int bnd_var(lev, bnd) ;
-		bnd_var:byte_att = 0UB ;
-		string bnd_var:char_att = "Sentence one.\\012Sentence two.\\012" ;
-		bnd_var:short_att = 37s ;
-		bnd_var:int_att = 73 ;
-		bnd_var:float_att = 73.f ;
-		bnd_var:double_att = 73. ;
-	three_dmn_var_t three_dmn_var ;
-	three_dmn_var_crd_t three_dmn_var_crd ;
-	prs_sfc_t prs_sfc ;
-	two_dmn_var_t two_dmn_var ;
-	mask_t mask ;
-	ORO_t ORO ;
-	weight_t weight ;
-	gw_t gw ;
-	gw_T42_t gw_T42 ;
-	rec_var_flt_t rec_var_flt ;
-	rec_var_dbl_t rec_var_dbl ;
-	one_dmn_rec_var_t one_dmn_rec_var ;
-	tpt_t tpt ;
-	rec_var_dbl_mss_val_dbl_upk_t rec_var_dbl_mss_val_dbl_upk ;
-	rec_var_dbl_mss_val_dbl_pck_t rec_var_dbl_mss_val_dbl_pck ;
-	rec_var_flt_mss_val_flt_t rec_var_flt_mss_val_flt ;
-	rec_var_flt_pck_t rec_var_flt_pck ;
-	rec_var_dbl_pck_t rec_var_dbl_pck ;
-	rec_var_flt_mss_val_dbl_t rec_var_flt_mss_val_dbl ;
-	rec_var_flt_mss_val_int_t rec_var_flt_mss_val_int ;
-	rec_var_int_mss_val_int_t rec_var_int_mss_val_int ;
-	rec_var_int_mss_val_flt_t rec_var_int_mss_val_flt ;
-	rec_var_int_mss_val_dbl_t rec_var_int_mss_val_dbl ;
-	rec_var_dbl_mss_val_dbl_pck_lng_t rec_var_dbl_mss_val_dbl_pck_lng ;
-	one_dmn_rec_var_sng_t one_dmn_rec_var_sng ;
-	time_lon_t time_lon ;
-	two_dmn_rec_var_sng_t two_dmn_rec_var_sng ;
-	two_dmn_rec_var_t two_dmn_rec_var ;
-	three_dmn_rec_var_t three_dmn_rec_var ;
-	three_dmn_var_dbl_t three_dmn_var_dbl ;
-	three_dmn_var_int_t three_dmn_var_int ;
-	three_dmn_var_sht_t three_dmn_var_sht ;
-	four_dmn_rec_var_t four_dmn_rec_var ;
-	double time_udunits(time_udunits) ;
-		string time_udunits:units = "hours since 1900-01-01 00:00:0.0" ;
-		string time_udunits:delta_t = "0000-00-00 06:00:0.0" ;
-	u_t u ;
-	v_t v ;
-
-// global attributes:
-		string :Conventions = "NCAR-CSM" ;
-		string :history = "History global attribute.\\012" ;
-		:julian_day = 200000.04 ;
-data:
-
- lat = -90, 90 ;
-
- lat_var = {{1, 2}, {-90, 90}} ;
-
- lat_wgt = {{1, 2}, {-90, 90}} ;
-
- lev = 100, 500, 1000 ;
-
- lon_T42 = 0, 2.8125, 5.625, 8.4375, 11.25, 14.0625, 16.875, 19.6875, 22.5, 
-    25.3125, 28.125, 30.9375, 33.75, 36.5625, 39.375, 42.1875, 45, 47.8125, 
-    50.625, 53.4375, 56.25, 59.0625, 61.875, 64.6875, 67.5, 70.3125, 73.125, 
-    75.9375, 78.75, 81.5625, 84.375, 87.1875, 90, 92.8125, 95.625, 98.4375, 
-    101.25, 104.0625, 106.875, 109.6875, 112.5, 115.3125, 118.125, 120.9375, 
-    123.75, 126.5625, 129.375, 132.1875, 135, 137.8125, 140.625, 143.4375, 
-    146.25, 149.0625, 151.875, 154.6875, 157.5, 160.3125, 163.125, 165.9375, 
-    168.75, 171.5625, 174.375, 177.1875, 180, 182.8125, 185.625, 188.4375, 
-    191.25, 194.0625, 196.875, 199.6875, 202.5, 205.3125, 208.125, 210.9375, 
-    213.75, 216.5625, 219.375, 222.1875, 225, 227.8125, 230.625, 233.4375, 
-    236.25, 239.0625, 241.875, 244.6875, 247.5, 250.3125, 253.125, 255.9375, 
-    258.75, 261.5625, 264.375, 267.1875, 270, 272.8125, 275.625, 278.4375, 
-    281.25, 284.0625, 286.875, 289.6875, 292.5, 295.3125, 298.125, 300.9375, 
-    303.75, 306.5625, 309.375, 312.1875, 315, 317.8125, 320.625, 323.4375, 
-    326.25, 329.0625, 331.875, 334.6875, 337.5, 340.3125, 343.125, 345.9375, 
-    348.75, 351.5625, 354.375, 357.1875 ;
-
- lat_T42 = -88.24009, -85.09245, -82.31198, -79.52525, -76.73673, -73.94742, 
-    -71.1577, -68.36772, -65.57758, -62.78733, -59.99701, -57.20662, 
-    -54.41619, -51.62573, -48.83524, -46.04472, -43.25419, -40.46365, 
-    -37.67309, -34.88252, -32.09194, -29.30136, -26.51077, -23.72017, 
-    -20.92957, -18.13897, -15.34836, -12.55776, -9.767145, -6.976533, 
-    -4.185921, -1.395307, 1.395307, 4.185921, 6.976533, 9.767145, 12.55776, 
-    15.34836, 18.13897, 20.92957, 23.72017, 26.51077, 29.30136, 32.09194, 
-    34.88252, 37.67309, 40.46365, 43.25419, 46.04472, 48.83524, 51.62573, 
-    54.41619, 57.20662, 59.99701, 62.78733, 65.57758, 68.36772, 71.1577, 
-    73.94742, 76.73673, 79.52525, 82.31198, 85.09245, 88.24009 ;
-
- rlev = 1000, 500, 100 ;
-
- lon = 0, 90, 180, 270 ;
-
- time = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
-
- lsmlev = 0.05, 0.1, 0.2, 0.5, 1, 3 ;
-
- wvl = 5e-07, 1e-06 ;
-
- hyam = {{0.0802583, 0.0438226, 0}, {100, 500, 1000}} ;
-
- hybm = {{0.0187849, 0.457453, 0.992528}, {100, 500, 1000}} ;
-
- P0 = 100000 ;
-
- PS = 
-    {{101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325, 101325 [...]
-
- fl_dmn = "a", "b", "3" ;
-
- nbdate = 640312 ;
-
- date = 
-    {{640312, 640313, 640314, 640315, 640316, 640317, 640318, 640319, 640320, 640321}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- lon_wgt = {{0.347855, 0.652145, 0.652145, 0.347855}, {0, 90, 180, 270}} ;
-
- msk_prt_mss_prt = {{0.5, 1e+36, 1.5, 1e+36}, {0, 90, 180, 270}} ;
-
- mss_val = {{73, 1e+36, 73, 1e+36}, {0, 90, 180, 270}} ;
-
- mss_val_scl = 1e+36 ;
-
- mss_val_fst = {{-999, 73, -999, 73}, {0, 90, 180, 270}} ;
-
- fll_val = {{73, -999, 73, -999}, {0, 90, 180, 270}} ;
-
- no_mss_val = {{73, 1e+36, 73, 1e+36}, {0, 90, 180, 270}} ;
-
- val_one_mss = {{1, 1e+36}, {-90, 90}} ;
-
- pck = 1 ;
-
- pck_arr = {{-32767, 0, 1, 32767}, {0, 90, 180, 270}} ;
-
- upk = 3 ;
-
- upk_arr = {{-32767, 0, 1, 32767}, {0, 90, 180, 270}} ;
-
- val_one_int = 1 ;
-
- val_one_one_int = {{1, 1}, {-90, 90}} ;
-
- val_max_max_sht = {{17000, 17000}, {-90, 90}} ;
-
- val_one_mss_int = {{1, -99}, {-90, 90}} ;
-
- val_half = 0.5 ;
-
- val_half_half = {{0.5, 0.5}, {-90, 90}} ;
-
- wgt_one = {{1, 1}, {-90, 90}} ;
-
- mss_val_all = {{1e+36, 1e+36, 1e+36, 1e+36}, {0, 90, 180, 270}} ;
-
- scalar_var = 10 ;
-
- float_var = 10 ;
-
- double_var = 10 ;
-
- double_var2 = 10 ;
-
- int_var = 10 ;
-
- short_var = 10 ;
-
- char_var = "z" ;
-
- char_var_space = " " ;
-
- char_var_nul = _ ;
-
- char_var_multinul = {{"", "
-", ""}, {100, 500, 1000}} ;
-
- fl_nm = "/", "h", "o", "m", "e", "/", "z", "e", "n", "d", "e", "r", "/", 
-    "n", "c", "o", "/", "d", "a", "t", "a", "/", "i", "n", ".", "c", "d", 
-    "l", _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _ ;
-
- fl_nm_arr =
-  "/", "d", "a", "t", "a", "/", "z", "e", "n", "d", "e", "r", "/", "d", "s", 
-    "t", "c", "c", "m", "0", "4", "/", "d", "s", "t", "c", "c", "m", "0", 
-    "4", "_", "8", "5", "8", "9", "_", "0", "1", ".", "n", "c", _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _,
-  "/", "d", "a", "t", "a", "/", "z", "e", "n", "d", "e", "r", "/", "d", "s", 
-    "t", "c", "c", "m", "0", "4", "/", "d", "s", "t", "c", "c", "m", "0", 
-    "4", "_", "8", "5", "8", "9", "_", "0", "2", ".", "n", "c", _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _,
-  "/", "d", "a", "t", "a", "/", "z", "e", "n", "d", "e", "r", "/", "d", "s", 
-    "t", "c", "c", "m", "0", "4", "/", "d", "s", "t", "c", "c", "m", "0", 
-    "4", "_", "8", "5", "8", "9", "_", "0", "3", ".", "n", "c", _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 
-    _, _, _, _, _, _, _, _, _, _, _ ;
-
- non_nul_trm_char_one_dmn = "a", "b", _, _ ;
-
- non_nul_trm_char_two_dmn =
-  "a", "b", "c", "d",
-  "e", "f", "g", "h",
-  "i", "j", "k", "m" ;
-
- byte_var = 122 ;
-
- zero = 0 ;
-
- one = 1 ;
-
- two = 2 ;
-
- e_dbl = 2.71828182846 ;
-
- e_flt = 2.718282 ;
-
- three = 3 ;
-
- four = 4 ;
-
- negative_one = -1 ;
-
- lev_var = {{100, 500, 1000}, {100, 500, 1000}} ;
-
- lev_wgt = {{10, 2, 1}, {100, 500, 1000}} ;
-
- g = 9.8 ;
-
- z = {{17000, 5000, 0}, {100, 500, 1000}} ;
-
- rz = {{0, 5000, 17000}, {1000, 500, 100}} ;
-
- one_dmn_var = 1, 10 ;
-
- att_var = 10 ;
-
- bnd_var =
-  1, 2,
-  3, 4,
-  5, 6 ;
-
- three_dmn_var = 
-    {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}, {-90, 90}, {100, 500, 1000}, {0, 90, 180, 270}} ;
-
- three_dmn_var_crd = 
-    {{0, 1, 2, 3, 12, 13, 14, 15, 4, 5, 6, 7, 16, 17, 18, 19, 8, 9, 10, 11, 20, 21, 22, 23}, {100, 500, 1000}, {-90, 90}, {0, 90, 180, 270}} ;
-
- prs_sfc = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- two_dmn_var = 
-    {{1.5, 5.5, 9.5, 13.5, 17.5, 21.5}, {-90, 90}, {100, 500, 1000}} ;
-
- mask = {{0, 1, 0, 0, 1, 1, 0, 2}, {-90, 90}, {0, 90, 180, 270}} ;
-
- ORO = {{1, 1, 1, 1, 1, 1, 1, 1}, {-90, 90}, {0, 90, 180, 270}} ;
-
- weight = {{10, 10}, {-90, 90}} ;
-
- gw = {{10, 10}, {-90, 90}} ;
-
- gw_T42 = 
-    {{-87.8638, -85.09653, -82.31291, -79.5256, -76.7369, -73.94752, -71.15775, -68.36776, -65.57761, -62.78735, -59.99702, -57.20663, -54.4162, -51.62573, -48.83524, -46.04473, -43.2542, -40.46365, -37.67309, -34.88252, -32.09195, -29.30136, -26.51077, -23.72017, -20.92957, -18.13897, -15.34836, -12.55776, -9.767146, -6.976534, -4.185921, -1.395307, 1.395307, 4.185921, 6.976534, 9.767146, 12.55776, 15.34836, 18.13897, 20.92957, 23.72017, 26.51077, 29.30136, 32.09195, 34.88252, 37.67309, [...]
-
- rec_var_flt = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- one_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- tpt = 
-    {{273.1, 273.2, 273.3, 273.4, 273.5, 273.6, 273.7, 273.8, 273.9, 273.1}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_mss_val_dbl_upk = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_mss_val_dbl_pck = 
-    {{-999, 32767, 21845, 10922, 0, -10922, -21845, -32767, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_mss_val_flt = 
-    {{1e+36, 2, 3, 4, 5, 6, 7, 8, 1e+36, 1e+36}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_pck = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_pck = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_mss_val_dbl = 
-    {{1e+36, 2, 3, 4, 5, 6, 7, 8, 1e+36, 1e+36}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_flt_mss_val_int = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_int_mss_val_int = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_int_mss_val_flt = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_int_mss_val_dbl = 
-    {{-999, 2, 3, 4, 5, 6, 7, 8, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- rec_var_dbl_mss_val_dbl_pck_lng = 
-    {{-999, 32767, 21845, 10922, 0, -10922, -21845, -32767, -999, -999}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- one_dmn_rec_var_sng = 
-    {{"H", "e", "l", "l", "o", " ", "W", "o", "r", ""}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- time_lon = 
-    {{0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {0, 90, 180, 270}} ;
-
- two_dmn_rec_var_sng = 
-    {{"a", "b", "c", "b", "c", "d", "c", "d", "e", "d", "e", "f", "e", "f", "g", "f", "g", "h", "g", "h", "i", "h", "i", "j", "j", "k", "l", "k", "l", "m"}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {100, 500, 1000}} ;
-
- two_dmn_rec_var = 
-    {{1, 2, 3, 1, 2.1, 3, 1, 2.2, 3, 1, 2.3, 3, 1, 2.4, 3, 1, 2.5, 3, 1, 2.6, 3, 1, 2.7, 3, 1, 2.8, 3, 1, 2.9, 3}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {100, 500, 1000}} ;
-
- three_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- three_dmn_var_dbl = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -99, -99, -99, -99, -99, -99, -99, -99, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, 74, 75, 76, 77, 78, 79, -99}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- three_dmn_var_int = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -99, -99, -99, -99, -99, -99, -99, -99, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -99, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -99, 58, 59, 60, -99, 62, 63, 64, 65, -99, 67, 68, 69, 70, 71, 72, -99, 74, 75, -99, 77, 78, 79, 80}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- three_dmn_var_sht = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, -99, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -99, 34, 35, -99, 37, 38, 39, 40, 41, 42, 43, 44, -99, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, -99, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -99, -99, -99, -99, -99, -99, -99, -99}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {-90, 90}, {0, 90, 180, 270}} ;
-
- four_dmn_rec_var = 
-    {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, [...]
-
- time_udunits = 876012, 876018, 876024 ;
-
- u = {{1, 0, 1, 0, 1, 0, 1, 0, 1, 0}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-
- v = {{0, 1, 0, 1, 0, 1, 0, 1, 0, 1}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} ;
-}
diff --git a/ncdap_test/expected4/in_v.nc.dmp b/ncdap_test/expected4/in_v.nc.dmp
deleted file mode 100644
index d606286..0000000
--- a/ncdap_test/expected4/in_v.nc.dmp
+++ /dev/null
@@ -1,16 +0,0 @@
-netcdf in_v {
-dimensions:
-	time = 10 ;
-variables:
-	float v(time) ;
-		string v:long_name = "Meridional wind speed" ;
-		string v:units = "meter second-1" ;
-
-// global attributes:
-		string :Conventions = "NCAR-CSM" ;
-		string :history = "History global attribute.\\012" ;
-		:julian_day = 200000.04 ;
-data:
-
- v = 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ;
-}
diff --git a/ncdap_test/expected4/ingrid.dmp b/ncdap_test/expected4/ingrid.dmp
deleted file mode 100644
index 51351d8..0000000
--- a/ncdap_test/expected4/ingrid.dmp
+++ /dev/null
@@ -1,33 +0,0 @@
-netcdf ingrid {
-types:
-  compound v3H_t {
-    float V3H(35, 44) ;
-    int ISTA(35) ;
-    float IZ(44) ;
-  }; // v3H_t
-dimensions:
-	ISTA = 35 ;
-	IZ = 44 ;
-variables:
-	int ISTA(ISTA) ;
-	float IZ(IZ) ;
-	v3H_t v3H ;
-data:
-
- ISTA = 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 
-    22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 
-    43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 61440, 
-    63488, 65536, 67584, 69632 ;
-
- IZ = 0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 
-    0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 
-    0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 
-    0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 
-    0.2377026, 0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 
-    0.2955202, 0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 
-    0.3522742, 0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 
-    0.4077604, 0.4168708 ;
-
- v3H = 
-    {{0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 0.2377026, 0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 0.2955202, 0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 0.3522742, 0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 0.4077604, 0.4168708, 0.425 [...]
-}
diff --git a/ncdap_test/expected4/nestedDAS.dmp b/ncdap_test/expected4/nestedDAS.dmp
deleted file mode 100644
index 8681434..0000000
--- a/ncdap_test/expected4/nestedDAS.dmp
+++ /dev/null
@@ -1,12 +0,0 @@
-netcdf nestedDAS {
-variables:
-	ubyte b31 ;
-	string b32 ;
-		string b32:billy = "Bob is my real name" ;
-		string b32:Robert = "Really wants to be called Billy" ;
-data:
-
- b31 = 0 ;
-
- b32 = "This is a data test string (pass 0)." ;
-}
diff --git a/ncdap_test/expected4/pbug0001b.dmp b/ncdap_test/expected4/pbug0001b.dmp
deleted file mode 100644
index c0f9837..0000000
--- a/ncdap_test/expected4/pbug0001b.dmp
+++ /dev/null
@@ -1,38 +0,0 @@
-netcdf pbug0001b {
-types:
-  compound \3H_t {
-    float \3H(35, 44) ;
-    int ISTA(35) ;
-    float IZ(44) ;
-  }; // \3H_t
-dimensions:
-	ISTA = 35 ;
-	IZ = 44 ;
-variables:
-	int ISTA(ISTA) ;
-	float IZ(IZ) ;
-	\3H_t \3H ;
-
-// global attributes:
-		string :bs5 = "foo\\foo\\" ;
-		string :dsp_ing_tiros_ourid = "NO11****C\\224\\2705>B\\217\\" ;
-		:bung = 0.f, 1.f, 2.3f, -2.23456f ;
-data:
-
- ISTA = 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 
-    22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 
-    43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 61440, 
-    63488, 65536, 67584, 69632 ;
-
- IZ = 0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 
-    0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 
-    0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 
-    0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 
-    0.2377026, 0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 
-    0.2955202, 0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 
-    0.3522742, 0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 
-    0.4077604, 0.4168708 ;
-
- \3H = 
-    {{0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 0.2377026, 0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 0.2955202, 0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 0.3522742, 0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 0.4077604, 0.4168708, 0.425 [...]
-}
diff --git a/ncdap_test/expected4/saco1.nc.dmp b/ncdap_test/expected4/saco1.nc.dmp
deleted file mode 100644
index e6be73a..0000000
--- a/ncdap_test/expected4/saco1.nc.dmp
+++ /dev/null
@@ -1,122 +0,0 @@
-netcdf saco1 {
-types:
-  compound time_t {
-    double time(805) ;
-    double height(805) ;
-  }; // time_t
-  compound river_discharge_t {
-    double river_discharge(805) ;
-    double height(805) ;
-  }; // river_discharge_t
-dimensions:
-	height = 805 ;
-	lat = 1 ;
-	lon = 1 ;
-variables:
-	double lat(lat) ;
-		string lat:longname = "latitude" ;
-		string lat:units = "degrees_north" ;
-	double lon(lon) ;
-		string lon:longname = "longitude" ;
-		lon:modulo = 360.f ;
-		string lon:units = "degrees_east" ;
-	double height(height) ;
-		string height:longname = "gage height" ;
-		string height:units = "meters" ;
-		string height:positive = "up" ;
-		string height:C_format = "%.2f" ;
-		height:minimum = 2.41 ;
-		height:maximum = 3.74 ;
-	time_t time ;
-	river_discharge_t river_discharge ;
-
-// global attributes:
-		string :Conventions = "GDT 1.3" ;
-		string :history = "Created Thu Aug 17 11:10:11 2000 by jevans" ;
-		string :institution = "School of Marine Sciences, University of Maine" ;
-		string :production = "gage height observation" ;
-		:starting_julian_day_number = 2451762.67708333 ;
-		string :starting_julian_day_str = "Sun Aug  6 04:15:00 2000" ;
-		:ending_julian_day_number = 2451771.05208333 ;
-		string :ending_julian_day_str = "Mon Aug 14 13:15:00 2000" ;
-		string :time_zone = "UTC" ;
-data:
-
- lat = 43.8081 ;
-
- lon = -70.7814 ;
-
- height = 3.09, 3.09, 3.09, 3.09, 3.09, 3.09, 3.09, 3.09, 3.08, 3.08, 3.08, 
-    3.07, 3.07, 3.06, 3.06, 3.05, 3.05, 3.04, 3.04, 3.04, 3.03, 3.03, 3.02, 
-    3.02, 3.02, 3.01, 3.01, 3, 3, 2.99, 2.99, 2.98, 2.97, 2.97, 2.95, 2.94, 
-    2.93, 2.92, 2.91, 2.91, 2.9, 2.9, 2.89, 2.89, 2.88, 2.88, 2.87, 2.86, 
-    2.84, 2.82, 2.81, 2.8, 2.79, 2.8, 2.8, 2.8, 2.81, 2.81, 2.82, 2.82, 2.83, 
-    2.83, 2.83, 2.83, 2.83, 2.83, 2.83, 2.84, 2.83, 2.83, 2.84, 2.84, 2.84, 
-    2.83, 2.84, 2.83, 2.84, 2.84, 2.88, 2.97, 3.1, 3.24, 3.36, 3.47, 3.54, 
-    3.6, 3.65, 3.68, 3.71, 3.73, 3.69, 3.61, 3.52, 3.42, 3.33, 3.26, 3.19, 
-    3.13, 3.08, 3.04, 3.02, 2.99, 2.97, 2.95, 2.94, 2.93, 2.92, 2.91, 2.9, 
-    2.9, 2.9, 2.89, 2.89, 2.89, 2.89, 2.89, 2.89, 2.88, 2.88, 2.88, 2.88, 
-    2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 
-    2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 2.88, 
-    2.88, 2.88, 2.88, 2.88, 2.88, 2.87, 2.86, 2.86, 2.85, 2.84, 2.86, 2.95, 
-    3.06, 3.18, 3.29, 3.38, 3.45, 3.5, 3.55, 3.57, 3.59, 3.61, 3.62, 3.63, 
-    3.64, 3.64, 3.65, 3.65, 3.65, 3.66, 3.66, 3.66, 3.66, 3.65, 3.61, 3.53, 
-    3.45, 3.36, 3.29, 3.22, 3.16, 3.11, 3.08, 3.04, 3.02, 3, 2.98, 2.97, 
-    2.96, 2.94, 2.94, 2.93, 2.93, 2.92, 2.92, 2.92, 2.92, 2.92, 2.91, 2.92, 
-    2.91, 2.92, 2.92, 2.91, 2.92, 2.92, 2.92, 2.91, 2.92, 2.92, 2.92, 2.92, 
-    2.92, 2.92, 2.92, 2.92, 2.92, 2.92, 2.92, 2.91, 2.9, 2.89, 2.88, 2.87, 
-    2.86, 2.84, 2.82, 2.81, 2.79, 2.78, 2.76, 2.75, 2.75, 2.74, 2.72, 2.72, 
-    2.71, 2.7, 2.7, 2.69, 2.7, 2.7, 2.7, 2.71, 2.71, 2.73, 2.81, 2.95, 3.09, 
-    3.22, 3.32, 3.4, 3.47, 3.51, 3.55, 3.58, 3.6, 3.62, 3.64, 3.67, 3.69, 
-    3.68, 3.61, 3.51, 3.41, 3.31, 3.21, 3.13, 3.06, 3.01, 2.97, 2.94, 2.93, 
-    2.92, 2.91, 2.9, 2.89, 2.89, 2.89, 2.89, 2.88, 2.87, 2.85, 2.82, 2.8, 
-    2.78, 2.76, 2.74, 2.72, 2.69, 2.66, 2.63, 2.6, 2.57, 2.55, 2.53, 2.52, 
-    2.5, 2.48, 2.48, 2.47, 2.46, 2.46, 2.45, 2.45, 2.44, 2.44, 2.44, 2.44, 
-    2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.42, 2.42, 
-    2.42, 2.42, 2.42, 2.42, 2.43, 2.42, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 
-    2.44, 2.46, 2.49, 2.53, 2.58, 2.62, 2.65, 2.69, 2.73, 2.82, 2.96, 3.11, 
-    3.25, 3.38, 3.48, 3.55, 3.6, 3.65, 3.67, 3.7, 3.72, 3.73, 3.74, 3.73, 
-    3.67, 3.58, 3.48, 3.38, 3.29, 3.21, 3.14, 3.08, 3.03, 2.99, 2.96, 2.93, 
-    2.91, 2.89, 2.87, 2.86, 2.85, 2.84, 2.83, 2.81, 2.8, 2.79, 2.77, 2.76, 
-    2.75, 2.74, 2.73, 2.73, 2.72, 2.72, 2.72, 2.71, 2.71, 2.71, 2.7, 2.7, 
-    2.7, 2.7, 2.7, 2.7, 2.7, 2.7, 2.7, 2.7, 2.7, 2.69, 2.67, 2.65, 2.63, 
-    2.61, 2.59, 2.58, 2.56, 2.55, 2.55, 2.55, 2.55, 2.55, 2.54, 2.54, 2.56, 
-    2.59, 2.62, 2.65, 2.68, 2.71, 2.73, 2.74, 2.76, 2.77, 2.78, 2.79, 2.8, 
-    2.8, 2.8, 2.8, 2.82, 2.88, 2.98, 3.1, 3.22, 3.3, 3.38, 3.44, 3.49, 3.52, 
-    3.54, 3.56, 3.58, 3.59, 3.59, 3.6, 3.61, 3.61, 3.61, 3.61, 3.58, 3.52, 
-    3.44, 3.36, 3.29, 3.22, 3.15, 3.08, 3.02, 2.97, 2.92, 2.89, 2.86, 2.83, 
-    2.81, 2.79, 2.77, 2.76, 2.75, 2.74, 2.74, 2.73, 2.73, 2.72, 2.72, 2.7, 
-    2.68, 2.65, 2.62, 2.6, 2.57, 2.54, 2.53, 2.5, 2.49, 2.48, 2.46, 2.45, 
-    2.45, 2.44, 2.44, 2.43, 2.43, 2.42, 2.42, 2.42, 2.42, 2.42, 2.42, 2.41, 
-    2.41, 2.41, 2.41, 2.42, 2.43, 2.45, 2.47, 2.5, 2.52, 2.53, 2.55, 2.56, 
-    2.57, 2.58, 2.59, 2.59, 2.6, 2.6, 2.6, 2.61, 2.61, 2.61, 2.63, 2.71, 
-    2.85, 3.01, 3.16, 3.28, 3.37, 3.44, 3.5, 3.54, 3.57, 3.59, 3.61, 3.62, 
-    3.63, 3.64, 3.64, 3.64, 3.64, 3.64, 3.63, 3.63, 3.62, 3.61, 3.55, 3.46, 
-    3.35, 3.25, 3.16, 3.08, 3.01, 2.95, 2.9, 2.85, 2.82, 2.78, 2.76, 2.73, 
-    2.71, 2.69, 2.68, 2.67, 2.66, 2.65, 2.64, 2.64, 2.63, 2.63, 2.63, 2.62, 
-    2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.61, 2.61, 2.61, 2.62, 2.61, 
-    2.61, 2.61, 2.61, 2.62, 2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 
-    2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 2.61, 2.64, 2.73, 
-    2.86, 3.01, 3.14, 3.26, 3.34, 3.41, 3.45, 3.49, 3.52, 3.53, 3.55, 3.51, 
-    3.44, 3.35, 3.25, 3.17, 3.08, 3.01, 2.96, 2.9, 2.86, 2.83, 2.8, 2.78, 
-    2.76, 2.74, 2.73, 2.72, 2.71, 2.7, 2.7, 2.69, 2.69, 2.69, 2.68, 2.68, 
-    2.68, 2.68, 2.67, 2.66, 2.64, 2.63, 2.61, 2.6, 2.59, 2.58, 2.57, 2.56, 
-    2.56, 2.55, 2.55, 2.55, 2.54, 2.54, 2.54, 2.54, 2.54, 2.54, 2.54, 2.53, 
-    2.54, 2.54, 2.55, 2.56, 2.56, 2.57, 2.57, 2.58, 2.58, 2.59, 2.59, 2.59, 
-    2.59, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 
-    2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 
-    2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 
-    2.6, 2.6, 2.61, 2.62, 2.63, 2.63, 2.64, 2.64, 2.64, 2.64, 2.65, 2.65, 
-    2.64, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 2.65, 
-    2.65, 2.65, 2.65, 2.65, 2.64, 2.64, 2.63, 2.62, 2.62, 2.62, 2.61, 2.61, 
-    2.61, 2.61, 2.61, 2.61, 2.61, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 2.6, 
-    2.6, 2.6, 2.6, 2.6, 2.6, 2.61, 2.61, 2.61, 2.61, 2.62, 2.62, 2.62, 2.62, 
-    2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.62, 2.63, 
-    2.63 ;
-
- time = 
-    {{0, 0.0104166669771075, 0.0208333334885538, 0.03125, 0.0416666669771075, 0.0520833334885538, 0.0625, 0.0729166669771075, 0.0833333334885538, 0.09375, 0.104166666977108, 0.114583333488554, 0.125, 0.135416666977108, 0.145833333488554, 0.15625, 0.166666666977108, 0.177083333488554, 0.1875, 0.197916666977108, 0.208333333488554, 0.21875, 0.229166666977108, 0.239583333488554, 0.25, 0.260416666977108, 0.270833333488554, 0.28125, 0.291666666977108, 0.302083333488554, 0.3125, 0.3229166669771 [...]
-
- river_discharge = 
-    {{1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1190, 1190, 1180, 1180, 1170, 1170, 1170, 1170, 1170, 1160, 1160, 1150, 1150, 1150, 1150, 1150, 1140, 1140, 1130, 1130, 1130, 1120, 1120, 1100, 1100, 1090, 1080, 1080, 1080, 1070, 1070, 1060, 1060, 1060, 1060, 1050, 1050, 1030, 1020, 1010, 1010, 1000, 1010, 1010, 1010, 1010, 1010, 1020, 1020, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1060, 1120, 1210,  [...]
-}
diff --git a/ncdap_test/expected4/synth1.dmp b/ncdap_test/expected4/synth1.dmp
deleted file mode 100644
index d890935..0000000
--- a/ncdap_test/expected4/synth1.dmp
+++ /dev/null
@@ -1,11 +0,0 @@
-netcdf synth1 {
-types:
-  compound S1_t {
-    int v1(3) ;
-  }; // S1_t
-variables:
-	S1_t S1 ;
-data:
-
- S1 = {{132, 232, 332}} ;
-}
diff --git a/ncdap_test/expected4/synth2.dmp b/ncdap_test/expected4/synth2.dmp
deleted file mode 100644
index c1a49ef..0000000
--- a/ncdap_test/expected4/synth2.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf synth2 {
-types:
-  compound Q1_record_t {
-    short v2(4) ;
-    float v4(2) ;
-  }; // Q1_record_t
-  Q1_record_t(*) Q1_t ;
-variables:
-	Q1_t Q1 ;
-data:
-
- Q1 = 
-    {{{116, 216, 316, 416}, {1320, 2320}}, {{516, 616, 716, 816}, {3320, 4320}}, {{916, 1016, 1116, 1216}, {5320, 6320}}, {{1316, 1416, 1516, 1616}, {7320, 8320}}, {{1716, 1816, 1916, 2016}, {9320, 10320}}, {{2116, 2216, 2316, 2416}, {11320, 12320}}, {{2516, 2616, 2716, 2816}, {13320, 14320}}, {{2916, 3016, 3116, 3216}, {15320, 16320}}} ;
-}
diff --git a/ncdap_test/expected4/synth3.dmp b/ncdap_test/expected4/synth3.dmp
deleted file mode 100644
index af0632a..0000000
--- a/ncdap_test/expected4/synth3.dmp
+++ /dev/null
@@ -1,13 +0,0 @@
-netcdf synth3 {
-types:
-  compound S1_t {
-    int v1(3) ;
-  }; // S1_t
-dimensions:
-	S1_0 = 2 ;
-variables:
-	S1_t S1(S1_0) ;
-data:
-
- S1 = {{132, 232, 332}}, {{432, 532, 632}} ;
-}
diff --git a/ncdap_test/expected4/synth4.dmp b/ncdap_test/expected4/synth4.dmp
deleted file mode 100644
index 965274e..0000000
--- a/ncdap_test/expected4/synth4.dmp
+++ /dev/null
@@ -1,23 +0,0 @@
-netcdf synth4 {
-types:
-  compound S1_t {
-    ubyte v1(4) ;
-    short v2(4) ;
-    int v3(2) ;
-    float v4(2) ;
-    double v5(2) ;
-  }; // S1_t
-dimensions:
-	S1_0 = 2 ;
-variables:
-	S1_t S1(S1_0) ;
-
-// global attributes:
-		:g1 = 3, 8, 16, 32 ;
-		string :s1 = "gvalue1" ;
-data:
-
- S1 = 
-    {{97, 98, 99, 100}, {116, 216, 316, 416}, {132, 232}, {1320, 2320}, {1640, 2640}}, 
-    {{101, 102, 103, 104}, {516, 616, 716, 816}, {332, 432}, {3320, 4320}, {3640, 4640}} ;
-}
diff --git a/ncdap_test/expected4/synth5.dmp b/ncdap_test/expected4/synth5.dmp
deleted file mode 100644
index bad3fc8..0000000
--- a/ncdap_test/expected4/synth5.dmp
+++ /dev/null
@@ -1,13 +0,0 @@
-netcdf synth5 {
-types:
-  compound G1_t {
-    float temp(2, 2) ;
-    int lat(2) ;
-    int long(2) ;
-  }; // G1_t
-variables:
-	G1_t G1 ;
-data:
-
- G1 = {{1320, 2320, 3320, 4320}, {132, 232}, {332, 432}} ;
-}
diff --git a/ncdap_test/expected4/synth6.dmp b/ncdap_test/expected4/synth6.dmp
deleted file mode 100644
index f199969..0000000
--- a/ncdap_test/expected4/synth6.dmp
+++ /dev/null
@@ -1,25 +0,0 @@
-netcdf synth6 {
-types:
-  compound S1_t {
-    ubyte v1(4) ;
-    int v3(2) ;
-    double v5(2) ;
-  }; // S1_t
-  compound Q1_record_t {
-    short v2(4) ;
-    float v4(2) ;
-  }; // Q1_record_t
-  Q1_record_t(*) Q1_t ;
-dimensions:
-	S1_0 = 2 ;
-variables:
-	S1_t S1(S1_0) ;
-	Q1_t Q1 ;
-data:
-
- S1 = {{97, 98, 99, 100}, {132, 232}, {1640, 2640}}, 
-    {{101, 102, 103, 104}, {332, 432}, {3640, 4640}} ;
-
- Q1 = 
-    {{{116, 216, 316, 416}, {1320, 2320}}, {{516, 616, 716, 816}, {3320, 4320}}} ;
-}
diff --git a/ncdap_test/expected4/synth7.dmp b/ncdap_test/expected4/synth7.dmp
deleted file mode 100644
index 028c07b..0000000
--- a/ncdap_test/expected4/synth7.dmp
+++ /dev/null
@@ -1,9 +0,0 @@
-netcdf synth7 {
-types:
-  float(*) Q1_t ;
-variables:
-	Q1_t Q1 ;
-data:
-
- Q1 = {1320, 2320, 3320, 4320, 5320, 6320, 7320, 8320} ;
-}
diff --git a/ncdap_test/expected4/synth8.dmp b/ncdap_test/expected4/synth8.dmp
deleted file mode 100644
index 2ed9482..0000000
--- a/ncdap_test/expected4/synth8.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf synth8 {
-types:
-  float(*) Q2_t ;
-  compound Q1_record_t {
-    Q2_t Q2 ;
-  }; // Q1_record_t
-  Q1_record_t(*) Q1_t ;
-variables:
-	Q1_t Q1 ;
-data:
-
- Q1 = 
-    {{{1320, 2320, 3320, 4320}}, {{5320, 6320, 7320, 8320}}, {{9320, 10320, 11320, 12320}}, {{13320, 14320, 15320, 16320}}} ;
-}
diff --git a/ncdap_test/expected4/test.01.dmp b/ncdap_test/expected4/test.01.dmp
deleted file mode 100644
index cadbce6..0000000
--- a/ncdap_test/expected4/test.01.dmp
+++ /dev/null
@@ -1,35 +0,0 @@
-netcdf test {
-variables:
-	ubyte b ;
-		string b:Description = "A test byte" ;
-		string b:units = "unknown" ;
-	int i32 ;
-		string i32:Description = "A 32 bit test server int" ;
-		string i32:units = "unknown" ;
-	uint ui32 ;
-	short i16 ;
-	ushort ui16 ;
-	float f32 ;
-	double f64 ;
-	string s ;
-	string u ;
-data:
-
- b = 0 ;
-
- i32 = 1 ;
-
- ui32 = 0 ;
-
- i16 = 0 ;
-
- ui16 = 0 ;
-
- f32 = 0 ;
-
- f64 = 1000 ;
-
- s = "This is a data test string (pass 0)." ;
-
- u = "http://www.dods.org" ;
-}
diff --git a/ncdap_test/expected4/test.02.dmp b/ncdap_test/expected4/test.02.dmp
deleted file mode 100644
index 7ab613f..0000000
--- a/ncdap_test/expected4/test.02.dmp
+++ /dev/null
@@ -1,93 +0,0 @@
-netcdf test {
-dimensions:
-	b_0 = 25 ;
-	f32_0 = 25 ;
-	f64_0 = 25 ;
-	i16_0 = 25 ;
-	i32_0 = 25 ;
-	s_0 = 25 ;
-	u_0 = 25 ;
-	ui16_0 = 25 ;
-	ui32_0 = 25 ;
-variables:
-	ubyte b(b_0) ;
-	int i32(i32_0) ;
-	uint ui32(ui32_0) ;
-	short i16(i16_0) ;
-	ushort ui16(ui16_0) ;
-	float f32(f32_0) ;
-	double f64(f64_0) ;
-	string s(s_0) ;
-	string u(u_0) ;
-data:
-
- b = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
-    20, 21, 22, 23, 24 ;
-
- i32 = 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 
-    22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 
-    43008, 45056, 47104, 49152 ;
-
- ui32 = 0, 4096, 8192, 12288, 16384, 20480, 24576, 28672, 32768, 36864, 
-    40960, 45056, 49152, 53248, 57344, 61440, 65536, 69632, 73728, 77824, 
-    81920, 86016, 90112, 94208, 98304 ;
-
- i16 = 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 
-    3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 
-    6144 ;
-
- ui16 = 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 
-    11264, 12288, 13312, 14336, 15360, 16384, 17408, 18432, 19456, 20480, 
-    21504, 22528, 23552, 24576 ;
-
- f32 = 0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 
-    0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 
-    0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 
-    0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 
-    0.2377026 ;
-
- f64 = 1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204, 
-    0.99755100025328, 0.996801706302619, 0.995952733011994, 
-    0.995004165278026, 0.993956097956697, 0.992808635853866, 
-    0.991561893714788, 0.990215996212637, 0.988771077936042, 
-    0.987227283375627, 0.985584766909561, 0.983843692788121, 
-    0.98200423511727, 0.980066577841242, 0.978030914724148, 
-    0.975897449330606, 0.973666395005375, 0.97133797485203 ;
-
- s = "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).", 
-    "This is a data test string (pass 10).", 
-    "This is a data test string (pass 11).", 
-    "This is a data test string (pass 12).", 
-    "This is a data test string (pass 13).", 
-    "This is a data test string (pass 14).", 
-    "This is a data test string (pass 15).", 
-    "This is a data test string (pass 16).", 
-    "This is a data test string (pass 17).", 
-    "This is a data test string (pass 18).", 
-    "This is a data test string (pass 19).", 
-    "This is a data test string (pass 20).", 
-    "This is a data test string (pass 21).", 
-    "This is a data test string (pass 22).", 
-    "This is a data test string (pass 23).", 
-    "This is a data test string (pass 24)." ;
-
- u = "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org" ;
-}
diff --git a/ncdap_test/expected4/test.03.dmp b/ncdap_test/expected4/test.03.dmp
deleted file mode 100644
index b02194f..0000000
--- a/ncdap_test/expected4/test.03.dmp
+++ /dev/null
@@ -1,1694 +0,0 @@
-netcdf test {
-dimensions:
-	b2_0 = 2 ;
-	b2_1 = 3 ;
-	b_0 = 2 ;
-	b_1 = 3 ;
-	b_2 = 4 ;
-	f32_0 = 2 ;
-	f32_1 = 2 ;
-	f32_2 = 2 ;
-	f64_0 = 2 ;
-	f64_1 = 2 ;
-	f64_2 = 2 ;
-	i16_0 = 2 ;
-	i16_1 = 2 ;
-	i16_2 = 2 ;
-	i32_0 = 2 ;
-	i32_1 = 3 ;
-	i32_2 = 4 ;
-	s0_0 = 4 ;
-	s0_1 = 5 ;
-	s0_2 = 6 ;
-	s1_0 = 10 ;
-	s1_1 = 10 ;
-	s1_2 = 10 ;
-	u_0 = 10 ;
-	u_1 = 10 ;
-	u_2 = 10 ;
-	ui16_0 = 2 ;
-	ui16_1 = 2 ;
-	ui16_2 = 2 ;
-	ui32_0 = 2 ;
-	ui32_1 = 3 ;
-	ui32_2 = 4 ;
-	ui32_3 = 3 ;
-	ui32_4 = 2 ;
-variables:
-	ubyte b(b_0, b_1, b_2) ;
-	ubyte b2(b2_0, b2_1) ;
-	int i32(i32_0, i32_1, i32_2) ;
-	uint ui32(ui32_0, ui32_1, ui32_2, ui32_3, ui32_4) ;
-	short i16(i16_0, i16_1, i16_2) ;
-	ushort ui16(ui16_0, ui16_1, ui16_2) ;
-	float f32(f32_0, f32_1, f32_2) ;
-	double f64(f64_0, f64_1, f64_2) ;
-	string s0(s0_0, s0_1, s0_2) ;
-	string s1(s1_0, s1_1, s1_2) ;
-	string u(u_0, u_1, u_2) ;
-data:
-
- b =
-  0, 1, 2, 3,
-  4, 5, 6, 7,
-  8, 9, 10, 11,
-  12, 13, 14, 15,
-  16, 17, 18, 19,
-  20, 21, 22, 23 ;
-
- b2 =
-  0, 1, 2,
-  3, 4, 5 ;
-
- i32 =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104 ;
-
- ui32 =
-  0, 4096,
-  8192, 12288,
-  16384, 20480,
-  24576, 28672,
-  32768, 36864,
-  40960, 45056,
-  49152, 53248,
-  57344, 61440,
-  65536, 69632,
-  73728, 77824,
-  81920, 86016,
-  90112, 94208,
-  98304, 102400,
-  106496, 110592,
-  114688, 118784,
-  122880, 126976,
-  131072, 135168,
-  139264, 143360,
-  147456, 151552,
-  155648, 159744,
-  163840, 167936,
-  172032, 176128,
-  180224, 184320,
-  188416, 192512,
-  196608, 200704,
-  204800, 208896,
-  212992, 217088,
-  221184, 225280,
-  229376, 233472,
-  237568, 241664,
-  245760, 249856,
-  253952, 258048,
-  262144, 266240,
-  270336, 274432,
-  278528, 282624,
-  286720, 290816,
-  294912, 299008,
-  303104, 307200,
-  311296, 315392,
-  319488, 323584,
-  327680, 331776,
-  335872, 339968,
-  344064, 348160,
-  352256, 356352,
-  360448, 364544,
-  368640, 372736,
-  376832, 380928,
-  385024, 389120,
-  393216, 397312,
-  401408, 405504,
-  409600, 413696,
-  417792, 421888,
-  425984, 430080,
-  434176, 438272,
-  442368, 446464,
-  450560, 454656,
-  458752, 462848,
-  466944, 471040,
-  475136, 479232,
-  483328, 487424,
-  491520, 495616,
-  499712, 503808,
-  507904, 512000,
-  516096, 520192,
-  524288, 528384,
-  532480, 536576,
-  540672, 544768,
-  548864, 552960,
-  557056, 561152,
-  565248, 569344,
-  573440, 577536,
-  581632, 585728 ;
-
- i16 =
-  0, 256,
-  512, 768,
-  1024, 1280,
-  1536, 1792 ;
-
- ui16 =
-  0, 1024,
-  2048, 3072,
-  4096, 5120,
-  6144, 7168 ;
-
- f32 =
-  0, 0.009999833,
-  0.01999867, 0.0299955,
-  0.03998933, 0.04997917,
-  0.059964, 0.06994285 ;
-
- f64 =
-  1, 0.999950000416665,
-  0.999800006666578, 0.999550033748988,
-  0.999200106660978, 0.998750260394966,
-  0.998200539935204, 0.99755100025328 ;
-
- s0 =
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).",
-  "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).", 
-    "This is a data test string (pass 10).", 
-    "This is a data test string (pass 11).",
-  "This is a data test string (pass 12).", 
-    "This is a data test string (pass 13).", 
-    "This is a data test string (pass 14).", 
-    "This is a data test string (pass 15).", 
-    "This is a data test string (pass 16).", 
-    "This is a data test string (pass 17).",
-  "This is a data test string (pass 18).", 
-    "This is a data test string (pass 19).", 
-    "This is a data test string (pass 20).", 
-    "This is a data test string (pass 21).", 
-    "This is a data test string (pass 22).", 
-    "This is a data test string (pass 23).",
-  "This is a data test string (pass 24).", 
-    "This is a data test string (pass 25).", 
-    "This is a data test string (pass 26).", 
-    "This is a data test string (pass 27).", 
-    "This is a data test string (pass 28).", 
-    "This is a data test string (pass 29).",
-  "This is a data test string (pass 30).", 
-    "This is a data test string (pass 31).", 
-    "This is a data test string (pass 32).", 
-    "This is a data test string (pass 33).", 
-    "This is a data test string (pass 34).", 
-    "This is a data test string (pass 35).",
-  "This is a data test string (pass 36).", 
-    "This is a data test string (pass 37).", 
-    "This is a data test string (pass 38).", 
-    "This is a data test string (pass 39).", 
-    "This is a data test string (pass 40).", 
-    "This is a data test string (pass 41).",
-  "This is a data test string (pass 42).", 
-    "This is a data test string (pass 43).", 
-    "This is a data test string (pass 44).", 
-    "This is a data test string (pass 45).", 
-    "This is a data test string (pass 46).", 
-    "This is a data test string (pass 47).",
-  "This is a data test string (pass 48).", 
-    "This is a data test string (pass 49).", 
-    "This is a data test string (pass 50).", 
-    "This is a data test string (pass 51).", 
-    "This is a data test string (pass 52).", 
-    "This is a data test string (pass 53).",
-  "This is a data test string (pass 54).", 
-    "This is a data test string (pass 55).", 
-    "This is a data test string (pass 56).", 
-    "This is a data test string (pass 57).", 
-    "This is a data test string (pass 58).", 
-    "This is a data test string (pass 59).",
-  "This is a data test string (pass 60).", 
-    "This is a data test string (pass 61).", 
-    "This is a data test string (pass 62).", 
-    "This is a data test string (pass 63).", 
-    "This is a data test string (pass 64).", 
-    "This is a data test string (pass 65).",
-  "This is a data test string (pass 66).", 
-    "This is a data test string (pass 67).", 
-    "This is a data test string (pass 68).", 
-    "This is a data test string (pass 69).", 
-    "This is a data test string (pass 70).", 
-    "This is a data test string (pass 71).",
-  "This is a data test string (pass 72).", 
-    "This is a data test string (pass 73).", 
-    "This is a data test string (pass 74).", 
-    "This is a data test string (pass 75).", 
-    "This is a data test string (pass 76).", 
-    "This is a data test string (pass 77).",
-  "This is a data test string (pass 78).", 
-    "This is a data test string (pass 79).", 
-    "This is a data test string (pass 80).", 
-    "This is a data test string (pass 81).", 
-    "This is a data test string (pass 82).", 
-    "This is a data test string (pass 83).",
-  "This is a data test string (pass 84).", 
-    "This is a data test string (pass 85).", 
-    "This is a data test string (pass 86).", 
-    "This is a data test string (pass 87).", 
-    "This is a data test string (pass 88).", 
-    "This is a data test string (pass 89).",
-  "This is a data test string (pass 90).", 
-    "This is a data test string (pass 91).", 
-    "This is a data test string (pass 92).", 
-    "This is a data test string (pass 93).", 
-    "This is a data test string (pass 94).", 
-    "This is a data test string (pass 95).",
-  "This is a data test string (pass 96).", 
-    "This is a data test string (pass 97).", 
-    "This is a data test string (pass 98).", 
-    "This is a data test string (pass 99).", 
-    "This is a data test string (pass 100).", 
-    "This is a data test string (pass 101).",
-  "This is a data test string (pass 102).", 
-    "This is a data test string (pass 103).", 
-    "This is a data test string (pass 104).", 
-    "This is a data test string (pass 105).", 
-    "This is a data test string (pass 106).", 
-    "This is a data test string (pass 107).",
-  "This is a data test string (pass 108).", 
-    "This is a data test string (pass 109).", 
-    "This is a data test string (pass 110).", 
-    "This is a data test string (pass 111).", 
-    "This is a data test string (pass 112).", 
-    "This is a data test string (pass 113).",
-  "This is a data test string (pass 114).", 
-    "This is a data test string (pass 115).", 
-    "This is a data test string (pass 116).", 
-    "This is a data test string (pass 117).", 
-    "This is a data test string (pass 118).", 
-    "This is a data test string (pass 119)." ;
-
- s1 =
-  "This is a data test string (pass 120).", 
-    "This is a data test string (pass 121).", 
-    "This is a data test string (pass 122).", 
-    "This is a data test string (pass 123).", 
-    "This is a data test string (pass 124).", 
-    "This is a data test string (pass 125).", 
-    "This is a data test string (pass 126).", 
-    "This is a data test string (pass 127).", 
-    "This is a data test string (pass 128).", 
-    "This is a data test string (pass 129).",
-  "This is a data test string (pass 130).", 
-    "This is a data test string (pass 131).", 
-    "This is a data test string (pass 132).", 
-    "This is a data test string (pass 133).", 
-    "This is a data test string (pass 134).", 
-    "This is a data test string (pass 135).", 
-    "This is a data test string (pass 136).", 
-    "This is a data test string (pass 137).", 
-    "This is a data test string (pass 138).", 
-    "This is a data test string (pass 139).",
-  "This is a data test string (pass 140).", 
-    "This is a data test string (pass 141).", 
-    "This is a data test string (pass 142).", 
-    "This is a data test string (pass 143).", 
-    "This is a data test string (pass 144).", 
-    "This is a data test string (pass 145).", 
-    "This is a data test string (pass 146).", 
-    "This is a data test string (pass 147).", 
-    "This is a data test string (pass 148).", 
-    "This is a data test string (pass 149).",
-  "This is a data test string (pass 150).", 
-    "This is a data test string (pass 151).", 
-    "This is a data test string (pass 152).", 
-    "This is a data test string (pass 153).", 
-    "This is a data test string (pass 154).", 
-    "This is a data test string (pass 155).", 
-    "This is a data test string (pass 156).", 
-    "This is a data test string (pass 157).", 
-    "This is a data test string (pass 158).", 
-    "This is a data test string (pass 159).",
-  "This is a data test string (pass 160).", 
-    "This is a data test string (pass 161).", 
-    "This is a data test string (pass 162).", 
-    "This is a data test string (pass 163).", 
-    "This is a data test string (pass 164).", 
-    "This is a data test string (pass 165).", 
-    "This is a data test string (pass 166).", 
-    "This is a data test string (pass 167).", 
-    "This is a data test string (pass 168).", 
-    "This is a data test string (pass 169).",
-  "This is a data test string (pass 170).", 
-    "This is a data test string (pass 171).", 
-    "This is a data test string (pass 172).", 
-    "This is a data test string (pass 173).", 
-    "This is a data test string (pass 174).", 
-    "This is a data test string (pass 175).", 
-    "This is a data test string (pass 176).", 
-    "This is a data test string (pass 177).", 
-    "This is a data test string (pass 178).", 
-    "This is a data test string (pass 179).",
-  "This is a data test string (pass 180).", 
-    "This is a data test string (pass 181).", 
-    "This is a data test string (pass 182).", 
-    "This is a data test string (pass 183).", 
-    "This is a data test string (pass 184).", 
-    "This is a data test string (pass 185).", 
-    "This is a data test string (pass 186).", 
-    "This is a data test string (pass 187).", 
-    "This is a data test string (pass 188).", 
-    "This is a data test string (pass 189).",
-  "This is a data test string (pass 190).", 
-    "This is a data test string (pass 191).", 
-    "This is a data test string (pass 192).", 
-    "This is a data test string (pass 193).", 
-    "This is a data test string (pass 194).", 
-    "This is a data test string (pass 195).", 
-    "This is a data test string (pass 196).", 
-    "This is a data test string (pass 197).", 
-    "This is a data test string (pass 198).", 
-    "This is a data test string (pass 199).",
-  "This is a data test string (pass 200).", 
-    "This is a data test string (pass 201).", 
-    "This is a data test string (pass 202).", 
-    "This is a data test string (pass 203).", 
-    "This is a data test string (pass 204).", 
-    "This is a data test string (pass 205).", 
-    "This is a data test string (pass 206).", 
-    "This is a data test string (pass 207).", 
-    "This is a data test string (pass 208).", 
-    "This is a data test string (pass 209).",
-  "This is a data test string (pass 210).", 
-    "This is a data test string (pass 211).", 
-    "This is a data test string (pass 212).", 
-    "This is a data test string (pass 213).", 
-    "This is a data test string (pass 214).", 
-    "This is a data test string (pass 215).", 
-    "This is a data test string (pass 216).", 
-    "This is a data test string (pass 217).", 
-    "This is a data test string (pass 218).", 
-    "This is a data test string (pass 219).",
-  "This is a data test string (pass 220).", 
-    "This is a data test string (pass 221).", 
-    "This is a data test string (pass 222).", 
-    "This is a data test string (pass 223).", 
-    "This is a data test string (pass 224).", 
-    "This is a data test string (pass 225).", 
-    "This is a data test string (pass 226).", 
-    "This is a data test string (pass 227).", 
-    "This is a data test string (pass 228).", 
-    "This is a data test string (pass 229).",
-  "This is a data test string (pass 230).", 
-    "This is a data test string (pass 231).", 
-    "This is a data test string (pass 232).", 
-    "This is a data test string (pass 233).", 
-    "This is a data test string (pass 234).", 
-    "This is a data test string (pass 235).", 
-    "This is a data test string (pass 236).", 
-    "This is a data test string (pass 237).", 
-    "This is a data test string (pass 238).", 
-    "This is a data test string (pass 239).",
-  "This is a data test string (pass 240).", 
-    "This is a data test string (pass 241).", 
-    "This is a data test string (pass 242).", 
-    "This is a data test string (pass 243).", 
-    "This is a data test string (pass 244).", 
-    "This is a data test string (pass 245).", 
-    "This is a data test string (pass 246).", 
-    "This is a data test string (pass 247).", 
-    "This is a data test string (pass 248).", 
-    "This is a data test string (pass 249).",
-  "This is a data test string (pass 250).", 
-    "This is a data test string (pass 251).", 
-    "This is a data test string (pass 252).", 
-    "This is a data test string (pass 253).", 
-    "This is a data test string (pass 254).", 
-    "This is a data test string (pass 255).", 
-    "This is a data test string (pass 256).", 
-    "This is a data test string (pass 257).", 
-    "This is a data test string (pass 258).", 
-    "This is a data test string (pass 259).",
-  "This is a data test string (pass 260).", 
-    "This is a data test string (pass 261).", 
-    "This is a data test string (pass 262).", 
-    "This is a data test string (pass 263).", 
-    "This is a data test string (pass 264).", 
-    "This is a data test string (pass 265).", 
-    "This is a data test string (pass 266).", 
-    "This is a data test string (pass 267).", 
-    "This is a data test string (pass 268).", 
-    "This is a data test string (pass 269).",
-  "This is a data test string (pass 270).", 
-    "This is a data test string (pass 271).", 
-    "This is a data test string (pass 272).", 
-    "This is a data test string (pass 273).", 
-    "This is a data test string (pass 274).", 
-    "This is a data test string (pass 275).", 
-    "This is a data test string (pass 276).", 
-    "This is a data test string (pass 277).", 
-    "This is a data test string (pass 278).", 
-    "This is a data test string (pass 279).",
-  "This is a data test string (pass 280).", 
-    "This is a data test string (pass 281).", 
-    "This is a data test string (pass 282).", 
-    "This is a data test string (pass 283).", 
-    "This is a data test string (pass 284).", 
-    "This is a data test string (pass 285).", 
-    "This is a data test string (pass 286).", 
-    "This is a data test string (pass 287).", 
-    "This is a data test string (pass 288).", 
-    "This is a data test string (pass 289).",
-  "This is a data test string (pass 290).", 
-    "This is a data test string (pass 291).", 
-    "This is a data test string (pass 292).", 
-    "This is a data test string (pass 293).", 
-    "This is a data test string (pass 294).", 
-    "This is a data test string (pass 295).", 
-    "This is a data test string (pass 296).", 
-    "This is a data test string (pass 297).", 
-    "This is a data test string (pass 298).", 
-    "This is a data test string (pass 299).",
-  "This is a data test string (pass 300).", 
-    "This is a data test string (pass 301).", 
-    "This is a data test string (pass 302).", 
-    "This is a data test string (pass 303).", 
-    "This is a data test string (pass 304).", 
-    "This is a data test string (pass 305).", 
-    "This is a data test string (pass 306).", 
-    "This is a data test string (pass 307).", 
-    "This is a data test string (pass 308).", 
-    "This is a data test string (pass 309).",
-  "This is a data test string (pass 310).", 
-    "This is a data test string (pass 311).", 
-    "This is a data test string (pass 312).", 
-    "This is a data test string (pass 313).", 
-    "This is a data test string (pass 314).", 
-    "This is a data test string (pass 315).", 
-    "This is a data test string (pass 316).", 
-    "This is a data test string (pass 317).", 
-    "This is a data test string (pass 318).", 
-    "This is a data test string (pass 319).",
-  "This is a data test string (pass 320).", 
-    "This is a data test string (pass 321).", 
-    "This is a data test string (pass 322).", 
-    "This is a data test string (pass 323).", 
-    "This is a data test string (pass 324).", 
-    "This is a data test string (pass 325).", 
-    "This is a data test string (pass 326).", 
-    "This is a data test string (pass 327).", 
-    "This is a data test string (pass 328).", 
-    "This is a data test string (pass 329).",
-  "This is a data test string (pass 330).", 
-    "This is a data test string (pass 331).", 
-    "This is a data test string (pass 332).", 
-    "This is a data test string (pass 333).", 
-    "This is a data test string (pass 334).", 
-    "This is a data test string (pass 335).", 
-    "This is a data test string (pass 336).", 
-    "This is a data test string (pass 337).", 
-    "This is a data test string (pass 338).", 
-    "This is a data test string (pass 339).",
-  "This is a data test string (pass 340).", 
-    "This is a data test string (pass 341).", 
-    "This is a data test string (pass 342).", 
-    "This is a data test string (pass 343).", 
-    "This is a data test string (pass 344).", 
-    "This is a data test string (pass 345).", 
-    "This is a data test string (pass 346).", 
-    "This is a data test string (pass 347).", 
-    "This is a data test string (pass 348).", 
-    "This is a data test string (pass 349).",
-  "This is a data test string (pass 350).", 
-    "This is a data test string (pass 351).", 
-    "This is a data test string (pass 352).", 
-    "This is a data test string (pass 353).", 
-    "This is a data test string (pass 354).", 
-    "This is a data test string (pass 355).", 
-    "This is a data test string (pass 356).", 
-    "This is a data test string (pass 357).", 
-    "This is a data test string (pass 358).", 
-    "This is a data test string (pass 359).",
-  "This is a data test string (pass 360).", 
-    "This is a data test string (pass 361).", 
-    "This is a data test string (pass 362).", 
-    "This is a data test string (pass 363).", 
-    "This is a data test string (pass 364).", 
-    "This is a data test string (pass 365).", 
-    "This is a data test string (pass 366).", 
-    "This is a data test string (pass 367).", 
-    "This is a data test string (pass 368).", 
-    "This is a data test string (pass 369).",
-  "This is a data test string (pass 370).", 
-    "This is a data test string (pass 371).", 
-    "This is a data test string (pass 372).", 
-    "This is a data test string (pass 373).", 
-    "This is a data test string (pass 374).", 
-    "This is a data test string (pass 375).", 
-    "This is a data test string (pass 376).", 
-    "This is a data test string (pass 377).", 
-    "This is a data test string (pass 378).", 
-    "This is a data test string (pass 379).",
-  "This is a data test string (pass 380).", 
-    "This is a data test string (pass 381).", 
-    "This is a data test string (pass 382).", 
-    "This is a data test string (pass 383).", 
-    "This is a data test string (pass 384).", 
-    "This is a data test string (pass 385).", 
-    "This is a data test string (pass 386).", 
-    "This is a data test string (pass 387).", 
-    "This is a data test string (pass 388).", 
-    "This is a data test string (pass 389).",
-  "This is a data test string (pass 390).", 
-    "This is a data test string (pass 391).", 
-    "This is a data test string (pass 392).", 
-    "This is a data test string (pass 393).", 
-    "This is a data test string (pass 394).", 
-    "This is a data test string (pass 395).", 
-    "This is a data test string (pass 396).", 
-    "This is a data test string (pass 397).", 
-    "This is a data test string (pass 398).", 
-    "This is a data test string (pass 399).",
-  "This is a data test string (pass 400).", 
-    "This is a data test string (pass 401).", 
-    "This is a data test string (pass 402).", 
-    "This is a data test string (pass 403).", 
-    "This is a data test string (pass 404).", 
-    "This is a data test string (pass 405).", 
-    "This is a data test string (pass 406).", 
-    "This is a data test string (pass 407).", 
-    "This is a data test string (pass 408).", 
-    "This is a data test string (pass 409).",
-  "This is a data test string (pass 410).", 
-    "This is a data test string (pass 411).", 
-    "This is a data test string (pass 412).", 
-    "This is a data test string (pass 413).", 
-    "This is a data test string (pass 414).", 
-    "This is a data test string (pass 415).", 
-    "This is a data test string (pass 416).", 
-    "This is a data test string (pass 417).", 
-    "This is a data test string (pass 418).", 
-    "This is a data test string (pass 419).",
-  "This is a data test string (pass 420).", 
-    "This is a data test string (pass 421).", 
-    "This is a data test string (pass 422).", 
-    "This is a data test string (pass 423).", 
-    "This is a data test string (pass 424).", 
-    "This is a data test string (pass 425).", 
-    "This is a data test string (pass 426).", 
-    "This is a data test string (pass 427).", 
-    "This is a data test string (pass 428).", 
-    "This is a data test string (pass 429).",
-  "This is a data test string (pass 430).", 
-    "This is a data test string (pass 431).", 
-    "This is a data test string (pass 432).", 
-    "This is a data test string (pass 433).", 
-    "This is a data test string (pass 434).", 
-    "This is a data test string (pass 435).", 
-    "This is a data test string (pass 436).", 
-    "This is a data test string (pass 437).", 
-    "This is a data test string (pass 438).", 
-    "This is a data test string (pass 439).",
-  "This is a data test string (pass 440).", 
-    "This is a data test string (pass 441).", 
-    "This is a data test string (pass 442).", 
-    "This is a data test string (pass 443).", 
-    "This is a data test string (pass 444).", 
-    "This is a data test string (pass 445).", 
-    "This is a data test string (pass 446).", 
-    "This is a data test string (pass 447).", 
-    "This is a data test string (pass 448).", 
-    "This is a data test string (pass 449).",
-  "This is a data test string (pass 450).", 
-    "This is a data test string (pass 451).", 
-    "This is a data test string (pass 452).", 
-    "This is a data test string (pass 453).", 
-    "This is a data test string (pass 454).", 
-    "This is a data test string (pass 455).", 
-    "This is a data test string (pass 456).", 
-    "This is a data test string (pass 457).", 
-    "This is a data test string (pass 458).", 
-    "This is a data test string (pass 459).",
-  "This is a data test string (pass 460).", 
-    "This is a data test string (pass 461).", 
-    "This is a data test string (pass 462).", 
-    "This is a data test string (pass 463).", 
-    "This is a data test string (pass 464).", 
-    "This is a data test string (pass 465).", 
-    "This is a data test string (pass 466).", 
-    "This is a data test string (pass 467).", 
-    "This is a data test string (pass 468).", 
-    "This is a data test string (pass 469).",
-  "This is a data test string (pass 470).", 
-    "This is a data test string (pass 471).", 
-    "This is a data test string (pass 472).", 
-    "This is a data test string (pass 473).", 
-    "This is a data test string (pass 474).", 
-    "This is a data test string (pass 475).", 
-    "This is a data test string (pass 476).", 
-    "This is a data test string (pass 477).", 
-    "This is a data test string (pass 478).", 
-    "This is a data test string (pass 479).",
-  "This is a data test string (pass 480).", 
-    "This is a data test string (pass 481).", 
-    "This is a data test string (pass 482).", 
-    "This is a data test string (pass 483).", 
-    "This is a data test string (pass 484).", 
-    "This is a data test string (pass 485).", 
-    "This is a data test string (pass 486).", 
-    "This is a data test string (pass 487).", 
-    "This is a data test string (pass 488).", 
-    "This is a data test string (pass 489).",
-  "This is a data test string (pass 490).", 
-    "This is a data test string (pass 491).", 
-    "This is a data test string (pass 492).", 
-    "This is a data test string (pass 493).", 
-    "This is a data test string (pass 494).", 
-    "This is a data test string (pass 495).", 
-    "This is a data test string (pass 496).", 
-    "This is a data test string (pass 497).", 
-    "This is a data test string (pass 498).", 
-    "This is a data test string (pass 499).",
-  "This is a data test string (pass 500).", 
-    "This is a data test string (pass 501).", 
-    "This is a data test string (pass 502).", 
-    "This is a data test string (pass 503).", 
-    "This is a data test string (pass 504).", 
-    "This is a data test string (pass 505).", 
-    "This is a data test string (pass 506).", 
-    "This is a data test string (pass 507).", 
-    "This is a data test string (pass 508).", 
-    "This is a data test string (pass 509).",
-  "This is a data test string (pass 510).", 
-    "This is a data test string (pass 511).", 
-    "This is a data test string (pass 512).", 
-    "This is a data test string (pass 513).", 
-    "This is a data test string (pass 514).", 
-    "This is a data test string (pass 515).", 
-    "This is a data test string (pass 516).", 
-    "This is a data test string (pass 517).", 
-    "This is a data test string (pass 518).", 
-    "This is a data test string (pass 519).",
-  "This is a data test string (pass 520).", 
-    "This is a data test string (pass 521).", 
-    "This is a data test string (pass 522).", 
-    "This is a data test string (pass 523).", 
-    "This is a data test string (pass 524).", 
-    "This is a data test string (pass 525).", 
-    "This is a data test string (pass 526).", 
-    "This is a data test string (pass 527).", 
-    "This is a data test string (pass 528).", 
-    "This is a data test string (pass 529).",
-  "This is a data test string (pass 530).", 
-    "This is a data test string (pass 531).", 
-    "This is a data test string (pass 532).", 
-    "This is a data test string (pass 533).", 
-    "This is a data test string (pass 534).", 
-    "This is a data test string (pass 535).", 
-    "This is a data test string (pass 536).", 
-    "This is a data test string (pass 537).", 
-    "This is a data test string (pass 538).", 
-    "This is a data test string (pass 539).",
-  "This is a data test string (pass 540).", 
-    "This is a data test string (pass 541).", 
-    "This is a data test string (pass 542).", 
-    "This is a data test string (pass 543).", 
-    "This is a data test string (pass 544).", 
-    "This is a data test string (pass 545).", 
-    "This is a data test string (pass 546).", 
-    "This is a data test string (pass 547).", 
-    "This is a data test string (pass 548).", 
-    "This is a data test string (pass 549).",
-  "This is a data test string (pass 550).", 
-    "This is a data test string (pass 551).", 
-    "This is a data test string (pass 552).", 
-    "This is a data test string (pass 553).", 
-    "This is a data test string (pass 554).", 
-    "This is a data test string (pass 555).", 
-    "This is a data test string (pass 556).", 
-    "This is a data test string (pass 557).", 
-    "This is a data test string (pass 558).", 
-    "This is a data test string (pass 559).",
-  "This is a data test string (pass 560).", 
-    "This is a data test string (pass 561).", 
-    "This is a data test string (pass 562).", 
-    "This is a data test string (pass 563).", 
-    "This is a data test string (pass 564).", 
-    "This is a data test string (pass 565).", 
-    "This is a data test string (pass 566).", 
-    "This is a data test string (pass 567).", 
-    "This is a data test string (pass 568).", 
-    "This is a data test string (pass 569).",
-  "This is a data test string (pass 570).", 
-    "This is a data test string (pass 571).", 
-    "This is a data test string (pass 572).", 
-    "This is a data test string (pass 573).", 
-    "This is a data test string (pass 574).", 
-    "This is a data test string (pass 575).", 
-    "This is a data test string (pass 576).", 
-    "This is a data test string (pass 577).", 
-    "This is a data test string (pass 578).", 
-    "This is a data test string (pass 579).",
-  "This is a data test string (pass 580).", 
-    "This is a data test string (pass 581).", 
-    "This is a data test string (pass 582).", 
-    "This is a data test string (pass 583).", 
-    "This is a data test string (pass 584).", 
-    "This is a data test string (pass 585).", 
-    "This is a data test string (pass 586).", 
-    "This is a data test string (pass 587).", 
-    "This is a data test string (pass 588).", 
-    "This is a data test string (pass 589).",
-  "This is a data test string (pass 590).", 
-    "This is a data test string (pass 591).", 
-    "This is a data test string (pass 592).", 
-    "This is a data test string (pass 593).", 
-    "This is a data test string (pass 594).", 
-    "This is a data test string (pass 595).", 
-    "This is a data test string (pass 596).", 
-    "This is a data test string (pass 597).", 
-    "This is a data test string (pass 598).", 
-    "This is a data test string (pass 599).",
-  "This is a data test string (pass 600).", 
-    "This is a data test string (pass 601).", 
-    "This is a data test string (pass 602).", 
-    "This is a data test string (pass 603).", 
-    "This is a data test string (pass 604).", 
-    "This is a data test string (pass 605).", 
-    "This is a data test string (pass 606).", 
-    "This is a data test string (pass 607).", 
-    "This is a data test string (pass 608).", 
-    "This is a data test string (pass 609).",
-  "This is a data test string (pass 610).", 
-    "This is a data test string (pass 611).", 
-    "This is a data test string (pass 612).", 
-    "This is a data test string (pass 613).", 
-    "This is a data test string (pass 614).", 
-    "This is a data test string (pass 615).", 
-    "This is a data test string (pass 616).", 
-    "This is a data test string (pass 617).", 
-    "This is a data test string (pass 618).", 
-    "This is a data test string (pass 619).",
-  "This is a data test string (pass 620).", 
-    "This is a data test string (pass 621).", 
-    "This is a data test string (pass 622).", 
-    "This is a data test string (pass 623).", 
-    "This is a data test string (pass 624).", 
-    "This is a data test string (pass 625).", 
-    "This is a data test string (pass 626).", 
-    "This is a data test string (pass 627).", 
-    "This is a data test string (pass 628).", 
-    "This is a data test string (pass 629).",
-  "This is a data test string (pass 630).", 
-    "This is a data test string (pass 631).", 
-    "This is a data test string (pass 632).", 
-    "This is a data test string (pass 633).", 
-    "This is a data test string (pass 634).", 
-    "This is a data test string (pass 635).", 
-    "This is a data test string (pass 636).", 
-    "This is a data test string (pass 637).", 
-    "This is a data test string (pass 638).", 
-    "This is a data test string (pass 639).",
-  "This is a data test string (pass 640).", 
-    "This is a data test string (pass 641).", 
-    "This is a data test string (pass 642).", 
-    "This is a data test string (pass 643).", 
-    "This is a data test string (pass 644).", 
-    "This is a data test string (pass 645).", 
-    "This is a data test string (pass 646).", 
-    "This is a data test string (pass 647).", 
-    "This is a data test string (pass 648).", 
-    "This is a data test string (pass 649).",
-  "This is a data test string (pass 650).", 
-    "This is a data test string (pass 651).", 
-    "This is a data test string (pass 652).", 
-    "This is a data test string (pass 653).", 
-    "This is a data test string (pass 654).", 
-    "This is a data test string (pass 655).", 
-    "This is a data test string (pass 656).", 
-    "This is a data test string (pass 657).", 
-    "This is a data test string (pass 658).", 
-    "This is a data test string (pass 659).",
-  "This is a data test string (pass 660).", 
-    "This is a data test string (pass 661).", 
-    "This is a data test string (pass 662).", 
-    "This is a data test string (pass 663).", 
-    "This is a data test string (pass 664).", 
-    "This is a data test string (pass 665).", 
-    "This is a data test string (pass 666).", 
-    "This is a data test string (pass 667).", 
-    "This is a data test string (pass 668).", 
-    "This is a data test string (pass 669).",
-  "This is a data test string (pass 670).", 
-    "This is a data test string (pass 671).", 
-    "This is a data test string (pass 672).", 
-    "This is a data test string (pass 673).", 
-    "This is a data test string (pass 674).", 
-    "This is a data test string (pass 675).", 
-    "This is a data test string (pass 676).", 
-    "This is a data test string (pass 677).", 
-    "This is a data test string (pass 678).", 
-    "This is a data test string (pass 679).",
-  "This is a data test string (pass 680).", 
-    "This is a data test string (pass 681).", 
-    "This is a data test string (pass 682).", 
-    "This is a data test string (pass 683).", 
-    "This is a data test string (pass 684).", 
-    "This is a data test string (pass 685).", 
-    "This is a data test string (pass 686).", 
-    "This is a data test string (pass 687).", 
-    "This is a data test string (pass 688).", 
-    "This is a data test string (pass 689).",
-  "This is a data test string (pass 690).", 
-    "This is a data test string (pass 691).", 
-    "This is a data test string (pass 692).", 
-    "This is a data test string (pass 693).", 
-    "This is a data test string (pass 694).", 
-    "This is a data test string (pass 695).", 
-    "This is a data test string (pass 696).", 
-    "This is a data test string (pass 697).", 
-    "This is a data test string (pass 698).", 
-    "This is a data test string (pass 699).",
-  "This is a data test string (pass 700).", 
-    "This is a data test string (pass 701).", 
-    "This is a data test string (pass 702).", 
-    "This is a data test string (pass 703).", 
-    "This is a data test string (pass 704).", 
-    "This is a data test string (pass 705).", 
-    "This is a data test string (pass 706).", 
-    "This is a data test string (pass 707).", 
-    "This is a data test string (pass 708).", 
-    "This is a data test string (pass 709).",
-  "This is a data test string (pass 710).", 
-    "This is a data test string (pass 711).", 
-    "This is a data test string (pass 712).", 
-    "This is a data test string (pass 713).", 
-    "This is a data test string (pass 714).", 
-    "This is a data test string (pass 715).", 
-    "This is a data test string (pass 716).", 
-    "This is a data test string (pass 717).", 
-    "This is a data test string (pass 718).", 
-    "This is a data test string (pass 719).",
-  "This is a data test string (pass 720).", 
-    "This is a data test string (pass 721).", 
-    "This is a data test string (pass 722).", 
-    "This is a data test string (pass 723).", 
-    "This is a data test string (pass 724).", 
-    "This is a data test string (pass 725).", 
-    "This is a data test string (pass 726).", 
-    "This is a data test string (pass 727).", 
-    "This is a data test string (pass 728).", 
-    "This is a data test string (pass 729).",
-  "This is a data test string (pass 730).", 
-    "This is a data test string (pass 731).", 
-    "This is a data test string (pass 732).", 
-    "This is a data test string (pass 733).", 
-    "This is a data test string (pass 734).", 
-    "This is a data test string (pass 735).", 
-    "This is a data test string (pass 736).", 
-    "This is a data test string (pass 737).", 
-    "This is a data test string (pass 738).", 
-    "This is a data test string (pass 739).",
-  "This is a data test string (pass 740).", 
-    "This is a data test string (pass 741).", 
-    "This is a data test string (pass 742).", 
-    "This is a data test string (pass 743).", 
-    "This is a data test string (pass 744).", 
-    "This is a data test string (pass 745).", 
-    "This is a data test string (pass 746).", 
-    "This is a data test string (pass 747).", 
-    "This is a data test string (pass 748).", 
-    "This is a data test string (pass 749).",
-  "This is a data test string (pass 750).", 
-    "This is a data test string (pass 751).", 
-    "This is a data test string (pass 752).", 
-    "This is a data test string (pass 753).", 
-    "This is a data test string (pass 754).", 
-    "This is a data test string (pass 755).", 
-    "This is a data test string (pass 756).", 
-    "This is a data test string (pass 757).", 
-    "This is a data test string (pass 758).", 
-    "This is a data test string (pass 759).",
-  "This is a data test string (pass 760).", 
-    "This is a data test string (pass 761).", 
-    "This is a data test string (pass 762).", 
-    "This is a data test string (pass 763).", 
-    "This is a data test string (pass 764).", 
-    "This is a data test string (pass 765).", 
-    "This is a data test string (pass 766).", 
-    "This is a data test string (pass 767).", 
-    "This is a data test string (pass 768).", 
-    "This is a data test string (pass 769).",
-  "This is a data test string (pass 770).", 
-    "This is a data test string (pass 771).", 
-    "This is a data test string (pass 772).", 
-    "This is a data test string (pass 773).", 
-    "This is a data test string (pass 774).", 
-    "This is a data test string (pass 775).", 
-    "This is a data test string (pass 776).", 
-    "This is a data test string (pass 777).", 
-    "This is a data test string (pass 778).", 
-    "This is a data test string (pass 779).",
-  "This is a data test string (pass 780).", 
-    "This is a data test string (pass 781).", 
-    "This is a data test string (pass 782).", 
-    "This is a data test string (pass 783).", 
-    "This is a data test string (pass 784).", 
-    "This is a data test string (pass 785).", 
-    "This is a data test string (pass 786).", 
-    "This is a data test string (pass 787).", 
-    "This is a data test string (pass 788).", 
-    "This is a data test string (pass 789).",
-  "This is a data test string (pass 790).", 
-    "This is a data test string (pass 791).", 
-    "This is a data test string (pass 792).", 
-    "This is a data test string (pass 793).", 
-    "This is a data test string (pass 794).", 
-    "This is a data test string (pass 795).", 
-    "This is a data test string (pass 796).", 
-    "This is a data test string (pass 797).", 
-    "This is a data test string (pass 798).", 
-    "This is a data test string (pass 799).",
-  "This is a data test string (pass 800).", 
-    "This is a data test string (pass 801).", 
-    "This is a data test string (pass 802).", 
-    "This is a data test string (pass 803).", 
-    "This is a data test string (pass 804).", 
-    "This is a data test string (pass 805).", 
-    "This is a data test string (pass 806).", 
-    "This is a data test string (pass 807).", 
-    "This is a data test string (pass 808).", 
-    "This is a data test string (pass 809).",
-  "This is a data test string (pass 810).", 
-    "This is a data test string (pass 811).", 
-    "This is a data test string (pass 812).", 
-    "This is a data test string (pass 813).", 
-    "This is a data test string (pass 814).", 
-    "This is a data test string (pass 815).", 
-    "This is a data test string (pass 816).", 
-    "This is a data test string (pass 817).", 
-    "This is a data test string (pass 818).", 
-    "This is a data test string (pass 819).",
-  "This is a data test string (pass 820).", 
-    "This is a data test string (pass 821).", 
-    "This is a data test string (pass 822).", 
-    "This is a data test string (pass 823).", 
-    "This is a data test string (pass 824).", 
-    "This is a data test string (pass 825).", 
-    "This is a data test string (pass 826).", 
-    "This is a data test string (pass 827).", 
-    "This is a data test string (pass 828).", 
-    "This is a data test string (pass 829).",
-  "This is a data test string (pass 830).", 
-    "This is a data test string (pass 831).", 
-    "This is a data test string (pass 832).", 
-    "This is a data test string (pass 833).", 
-    "This is a data test string (pass 834).", 
-    "This is a data test string (pass 835).", 
-    "This is a data test string (pass 836).", 
-    "This is a data test string (pass 837).", 
-    "This is a data test string (pass 838).", 
-    "This is a data test string (pass 839).",
-  "This is a data test string (pass 840).", 
-    "This is a data test string (pass 841).", 
-    "This is a data test string (pass 842).", 
-    "This is a data test string (pass 843).", 
-    "This is a data test string (pass 844).", 
-    "This is a data test string (pass 845).", 
-    "This is a data test string (pass 846).", 
-    "This is a data test string (pass 847).", 
-    "This is a data test string (pass 848).", 
-    "This is a data test string (pass 849).",
-  "This is a data test string (pass 850).", 
-    "This is a data test string (pass 851).", 
-    "This is a data test string (pass 852).", 
-    "This is a data test string (pass 853).", 
-    "This is a data test string (pass 854).", 
-    "This is a data test string (pass 855).", 
-    "This is a data test string (pass 856).", 
-    "This is a data test string (pass 857).", 
-    "This is a data test string (pass 858).", 
-    "This is a data test string (pass 859).",
-  "This is a data test string (pass 860).", 
-    "This is a data test string (pass 861).", 
-    "This is a data test string (pass 862).", 
-    "This is a data test string (pass 863).", 
-    "This is a data test string (pass 864).", 
-    "This is a data test string (pass 865).", 
-    "This is a data test string (pass 866).", 
-    "This is a data test string (pass 867).", 
-    "This is a data test string (pass 868).", 
-    "This is a data test string (pass 869).",
-  "This is a data test string (pass 870).", 
-    "This is a data test string (pass 871).", 
-    "This is a data test string (pass 872).", 
-    "This is a data test string (pass 873).", 
-    "This is a data test string (pass 874).", 
-    "This is a data test string (pass 875).", 
-    "This is a data test string (pass 876).", 
-    "This is a data test string (pass 877).", 
-    "This is a data test string (pass 878).", 
-    "This is a data test string (pass 879).",
-  "This is a data test string (pass 880).", 
-    "This is a data test string (pass 881).", 
-    "This is a data test string (pass 882).", 
-    "This is a data test string (pass 883).", 
-    "This is a data test string (pass 884).", 
-    "This is a data test string (pass 885).", 
-    "This is a data test string (pass 886).", 
-    "This is a data test string (pass 887).", 
-    "This is a data test string (pass 888).", 
-    "This is a data test string (pass 889).",
-  "This is a data test string (pass 890).", 
-    "This is a data test string (pass 891).", 
-    "This is a data test string (pass 892).", 
-    "This is a data test string (pass 893).", 
-    "This is a data test string (pass 894).", 
-    "This is a data test string (pass 895).", 
-    "This is a data test string (pass 896).", 
-    "This is a data test string (pass 897).", 
-    "This is a data test string (pass 898).", 
-    "This is a data test string (pass 899).",
-  "This is a data test string (pass 900).", 
-    "This is a data test string (pass 901).", 
-    "This is a data test string (pass 902).", 
-    "This is a data test string (pass 903).", 
-    "This is a data test string (pass 904).", 
-    "This is a data test string (pass 905).", 
-    "This is a data test string (pass 906).", 
-    "This is a data test string (pass 907).", 
-    "This is a data test string (pass 908).", 
-    "This is a data test string (pass 909).",
-  "This is a data test string (pass 910).", 
-    "This is a data test string (pass 911).", 
-    "This is a data test string (pass 912).", 
-    "This is a data test string (pass 913).", 
-    "This is a data test string (pass 914).", 
-    "This is a data test string (pass 915).", 
-    "This is a data test string (pass 916).", 
-    "This is a data test string (pass 917).", 
-    "This is a data test string (pass 918).", 
-    "This is a data test string (pass 919).",
-  "This is a data test string (pass 920).", 
-    "This is a data test string (pass 921).", 
-    "This is a data test string (pass 922).", 
-    "This is a data test string (pass 923).", 
-    "This is a data test string (pass 924).", 
-    "This is a data test string (pass 925).", 
-    "This is a data test string (pass 926).", 
-    "This is a data test string (pass 927).", 
-    "This is a data test string (pass 928).", 
-    "This is a data test string (pass 929).",
-  "This is a data test string (pass 930).", 
-    "This is a data test string (pass 931).", 
-    "This is a data test string (pass 932).", 
-    "This is a data test string (pass 933).", 
-    "This is a data test string (pass 934).", 
-    "This is a data test string (pass 935).", 
-    "This is a data test string (pass 936).", 
-    "This is a data test string (pass 937).", 
-    "This is a data test string (pass 938).", 
-    "This is a data test string (pass 939).",
-  "This is a data test string (pass 940).", 
-    "This is a data test string (pass 941).", 
-    "This is a data test string (pass 942).", 
-    "This is a data test string (pass 943).", 
-    "This is a data test string (pass 944).", 
-    "This is a data test string (pass 945).", 
-    "This is a data test string (pass 946).", 
-    "This is a data test string (pass 947).", 
-    "This is a data test string (pass 948).", 
-    "This is a data test string (pass 949).",
-  "This is a data test string (pass 950).", 
-    "This is a data test string (pass 951).", 
-    "This is a data test string (pass 952).", 
-    "This is a data test string (pass 953).", 
-    "This is a data test string (pass 954).", 
-    "This is a data test string (pass 955).", 
-    "This is a data test string (pass 956).", 
-    "This is a data test string (pass 957).", 
-    "This is a data test string (pass 958).", 
-    "This is a data test string (pass 959).",
-  "This is a data test string (pass 960).", 
-    "This is a data test string (pass 961).", 
-    "This is a data test string (pass 962).", 
-    "This is a data test string (pass 963).", 
-    "This is a data test string (pass 964).", 
-    "This is a data test string (pass 965).", 
-    "This is a data test string (pass 966).", 
-    "This is a data test string (pass 967).", 
-    "This is a data test string (pass 968).", 
-    "This is a data test string (pass 969).",
-  "This is a data test string (pass 970).", 
-    "This is a data test string (pass 971).", 
-    "This is a data test string (pass 972).", 
-    "This is a data test string (pass 973).", 
-    "This is a data test string (pass 974).", 
-    "This is a data test string (pass 975).", 
-    "This is a data test string (pass 976).", 
-    "This is a data test string (pass 977).", 
-    "This is a data test string (pass 978).", 
-    "This is a data test string (pass 979).",
-  "This is a data test string (pass 980).", 
-    "This is a data test string (pass 981).", 
-    "This is a data test string (pass 982).", 
-    "This is a data test string (pass 983).", 
-    "This is a data test string (pass 984).", 
-    "This is a data test string (pass 985).", 
-    "This is a data test string (pass 986).", 
-    "This is a data test string (pass 987).", 
-    "This is a data test string (pass 988).", 
-    "This is a data test string (pass 989).",
-  "This is a data test string (pass 990).", 
-    "This is a data test string (pass 991).", 
-    "This is a data test string (pass 992).", 
-    "This is a data test string (pass 993).", 
-    "This is a data test string (pass 994).", 
-    "This is a data test string (pass 995).", 
-    "This is a data test string (pass 996).", 
-    "This is a data test string (pass 997).", 
-    "This is a data test string (pass 998).", 
-    "This is a data test string (pass 999).",
-  "This is a data test string (pass 1000).", 
-    "This is a data test string (pass 1001).", 
-    "This is a data test string (pass 1002).", 
-    "This is a data test string (pass 1003).", 
-    "This is a data test string (pass 1004).", 
-    "This is a data test string (pass 1005).", 
-    "This is a data test string (pass 1006).", 
-    "This is a data test string (pass 1007).", 
-    "This is a data test string (pass 1008).", 
-    "This is a data test string (pass 1009).",
-  "This is a data test string (pass 1010).", 
-    "This is a data test string (pass 1011).", 
-    "This is a data test string (pass 1012).", 
-    "This is a data test string (pass 1013).", 
-    "This is a data test string (pass 1014).", 
-    "This is a data test string (pass 1015).", 
-    "This is a data test string (pass 1016).", 
-    "This is a data test string (pass 1017).", 
-    "This is a data test string (pass 1018).", 
-    "This is a data test string (pass 1019).",
-  "This is a data test string (pass 1020).", 
-    "This is a data test string (pass 1021).", 
-    "This is a data test string (pass 1022).", 
-    "This is a data test string (pass 1023).", 
-    "This is a data test string (pass 1024).", 
-    "This is a data test string (pass 1025).", 
-    "This is a data test string (pass 1026).", 
-    "This is a data test string (pass 1027).", 
-    "This is a data test string (pass 1028).", 
-    "This is a data test string (pass 1029).",
-  "This is a data test string (pass 1030).", 
-    "This is a data test string (pass 1031).", 
-    "This is a data test string (pass 1032).", 
-    "This is a data test string (pass 1033).", 
-    "This is a data test string (pass 1034).", 
-    "This is a data test string (pass 1035).", 
-    "This is a data test string (pass 1036).", 
-    "This is a data test string (pass 1037).", 
-    "This is a data test string (pass 1038).", 
-    "This is a data test string (pass 1039).",
-  "This is a data test string (pass 1040).", 
-    "This is a data test string (pass 1041).", 
-    "This is a data test string (pass 1042).", 
-    "This is a data test string (pass 1043).", 
-    "This is a data test string (pass 1044).", 
-    "This is a data test string (pass 1045).", 
-    "This is a data test string (pass 1046).", 
-    "This is a data test string (pass 1047).", 
-    "This is a data test string (pass 1048).", 
-    "This is a data test string (pass 1049).",
-  "This is a data test string (pass 1050).", 
-    "This is a data test string (pass 1051).", 
-    "This is a data test string (pass 1052).", 
-    "This is a data test string (pass 1053).", 
-    "This is a data test string (pass 1054).", 
-    "This is a data test string (pass 1055).", 
-    "This is a data test string (pass 1056).", 
-    "This is a data test string (pass 1057).", 
-    "This is a data test string (pass 1058).", 
-    "This is a data test string (pass 1059).",
-  "This is a data test string (pass 1060).", 
-    "This is a data test string (pass 1061).", 
-    "This is a data test string (pass 1062).", 
-    "This is a data test string (pass 1063).", 
-    "This is a data test string (pass 1064).", 
-    "This is a data test string (pass 1065).", 
-    "This is a data test string (pass 1066).", 
-    "This is a data test string (pass 1067).", 
-    "This is a data test string (pass 1068).", 
-    "This is a data test string (pass 1069).",
-  "This is a data test string (pass 1070).", 
-    "This is a data test string (pass 1071).", 
-    "This is a data test string (pass 1072).", 
-    "This is a data test string (pass 1073).", 
-    "This is a data test string (pass 1074).", 
-    "This is a data test string (pass 1075).", 
-    "This is a data test string (pass 1076).", 
-    "This is a data test string (pass 1077).", 
-    "This is a data test string (pass 1078).", 
-    "This is a data test string (pass 1079).",
-  "This is a data test string (pass 1080).", 
-    "This is a data test string (pass 1081).", 
-    "This is a data test string (pass 1082).", 
-    "This is a data test string (pass 1083).", 
-    "This is a data test string (pass 1084).", 
-    "This is a data test string (pass 1085).", 
-    "This is a data test string (pass 1086).", 
-    "This is a data test string (pass 1087).", 
-    "This is a data test string (pass 1088).", 
-    "This is a data test string (pass 1089).",
-  "This is a data test string (pass 1090).", 
-    "This is a data test string (pass 1091).", 
-    "This is a data test string (pass 1092).", 
-    "This is a data test string (pass 1093).", 
-    "This is a data test string (pass 1094).", 
-    "This is a data test string (pass 1095).", 
-    "This is a data test string (pass 1096).", 
-    "This is a data test string (pass 1097).", 
-    "This is a data test string (pass 1098).", 
-    "This is a data test string (pass 1099).",
-  "This is a data test string (pass 1100).", 
-    "This is a data test string (pass 1101).", 
-    "This is a data test string (pass 1102).", 
-    "This is a data test string (pass 1103).", 
-    "This is a data test string (pass 1104).", 
-    "This is a data test string (pass 1105).", 
-    "This is a data test string (pass 1106).", 
-    "This is a data test string (pass 1107).", 
-    "This is a data test string (pass 1108).", 
-    "This is a data test string (pass 1109).",
-  "This is a data test string (pass 1110).", 
-    "This is a data test string (pass 1111).", 
-    "This is a data test string (pass 1112).", 
-    "This is a data test string (pass 1113).", 
-    "This is a data test string (pass 1114).", 
-    "This is a data test string (pass 1115).", 
-    "This is a data test string (pass 1116).", 
-    "This is a data test string (pass 1117).", 
-    "This is a data test string (pass 1118).", 
-    "This is a data test string (pass 1119)." ;
-
- u =
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org" ;
-}
diff --git a/ncdap_test/expected4/test.04.dmp b/ncdap_test/expected4/test.04.dmp
deleted file mode 100644
index c5d9c9c..0000000
--- a/ncdap_test/expected4/test.04.dmp
+++ /dev/null
@@ -1,20 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = 
-    {0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"} ;
-}
diff --git a/ncdap_test/expected4/test.05.dmp b/ncdap_test/expected4/test.05.dmp
deleted file mode 100644
index 5449e8e..0000000
--- a/ncdap_test/expected4/test.05.dmp
+++ /dev/null
@@ -1,29 +0,0 @@
-netcdf test {
-types:
-  compound integers_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-  }; // integers_t
-  compound floats_t {
-    float f32 ;
-    double f64 ;
-  }; // floats_t
-  compound strings_t {
-    string s ;
-    string u ;
-  }; // strings_t
-  compound types_t {
-    integers_t integers ;
-    floats_t floats ;
-    strings_t strings ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = 
-    {{0, 1, 0, 0, 0}, {0, 1000}, {"This is a data test string (pass 0).", "http://www.dods.org"}} ;
-}
diff --git a/ncdap_test/expected4/test.06a.dmp b/ncdap_test/expected4/test.06a.dmp
deleted file mode 100644
index a5177b3..0000000
--- a/ncdap_test/expected4/test.06a.dmp
+++ /dev/null
@@ -1,13 +0,0 @@
-netcdf test {
-types:
-  compound OneD_t {
-    double amp(10) ;
-    double x(10) ;
-  }; // OneD_t
-variables:
-	OneD_t OneD ;
-data:
-
- OneD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}} ;
-}
diff --git a/ncdap_test/expected4/test.07.dmp b/ncdap_test/expected4/test.07.dmp
deleted file mode 100644
index 5771649..0000000
--- a/ncdap_test/expected4/test.07.dmp
+++ /dev/null
@@ -1,36 +0,0 @@
-netcdf test {
-types:
-  compound person_record_t {
-    string name ;
-    int age ;
-  }; // person_record_t
-  person_record_t(*) person_t ;
-  compound types_record_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_record_t
-  types_record_t(*) types_t ;
-variables:
-	person_t person ;
-	types_t types ;
-
-// global attributes:
-		:Facility.PrincipleInvestigator = "Mark Abbott\n",
-			"Ph.D" ;
-		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
-		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-data:
-
- person = 
-    {{"This is a data test string (pass 0).", 1}, {"This is a data test string (pass 1).", 2}, {"This is a data test string (pass 2).", 3}, {"This is a data test string (pass 3).", 5}, {"This is a data test string (pass 4).", 8}} ;
-
- types = 
-    {{0, 13, 0, 0, 0, 0, 1000, "This is a data test string (pass 5).", "http://www.dods.org"}, {1, 21, 2, 16, 65520, 0.9999833, 999.950000416665, "This is a data test string (pass 6).", "http://www.dods.org"}, {2, 34, 6, 32, 65504, 1.999867, 999.800006666578, "This is a data test string (pass 7).", "http://www.dods.org"}, {3, 55, 12, 48, 65488, 2.99955, 999.550033748988, "This is a data test string (pass 8).", "http://www.dods.org"}, {4, 89, 20, 64, 65472, 3.998933, 999.200106660978, "Th [...]
-}
diff --git a/ncdap_test/expected4/test.07a.dmp b/ncdap_test/expected4/test.07a.dmp
deleted file mode 100644
index ccfd6c9..0000000
--- a/ncdap_test/expected4/test.07a.dmp
+++ /dev/null
@@ -1,19 +0,0 @@
-netcdf test {
-types:
-  compound person1_t {
-    string name ;
-    int age ;
-  }; // person1_t
-  compound person2_t {
-    string name ;
-    int age ;
-  }; // person2_t
-variables:
-	person1_t person1 ;
-	person2_t person2 ;
-data:
-
- person1 = {"This is a data test string (pass 0).", 1} ;
-
- person2 = {"This is a data test string (pass 1).", 2} ;
-}
diff --git a/ncdap_test/expected4/test.21.dmp b/ncdap_test/expected4/test.21.dmp
deleted file mode 100644
index 876df50..0000000
--- a/ncdap_test/expected4/test.21.dmp
+++ /dev/null
@@ -1,21 +0,0 @@
-netcdf test {
-types:
-  compound exp_t {
-    int j ;
-    int i ;
-    short g(3, 3, 3) ;
-    short f(2, 2) ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-
-// global attributes:
-		:Facility.PrincipleInvestigator = "Mark Abbott\n",
-			"Ph.D" ;
-		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
-		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-data:
-
- exp = 
-    {1, 2, {0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656}, {0, 256, 512, 768}} ;
-}
diff --git a/ncdap_test/expected4/test.22.dmp b/ncdap_test/expected4/test.22.dmp
deleted file mode 100644
index 87e35fc..0000000
--- a/ncdap_test/expected4/test.22.dmp
+++ /dev/null
@@ -1,25 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042 [...]
-}
diff --git a/ncdap_test/expected4/test.23.dmp b/ncdap_test/expected4/test.23.dmp
deleted file mode 100644
index 19740d6..0000000
--- a/ncdap_test/expected4/test.23.dmp
+++ /dev/null
@@ -1,36 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound profile_t {
-    double fluor(10) ;
-    double depth(10) ;
-  }; // profile_t
-  compound ComplexSequence_record_t {
-    data_t data ;
-    float lat ;
-    float lng ;
-    profile_t profile ;
-  }; // ComplexSequence_record_t
-  ComplexSequence_record_t(*) ComplexSequence_t ;
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    ComplexSequence_t ComplexSequence ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {{{2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, 0, 0.9999833, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.9987502603949 [...]
-}
diff --git a/ncdap_test/expected4/test.31.dmp b/ncdap_test/expected4/test.31.dmp
deleted file mode 100644
index 77c20d3..0000000
--- a/ncdap_test/expected4/test.31.dmp
+++ /dev/null
@@ -1,24 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(2, 5) ;
-  }; // data_t
-  compound profile_t {
-    double fluor(10) ;
-    double depth(10) ;
-  }; // profile_t
-  compound CS01_record_t {
-    data_t data ;
-    float lat ;
-    float lng ;
-    profile_t profile ;
-  }; // CS01_record_t
-  CS01_record_t(*) CS01_t ;
-variables:
-	CS01_t CS01 ;
-data:
-
- CS01 = 
-    {{{1, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, 0, 0.9999833, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 [...]
-}
diff --git a/ncdap_test/expected4/test.50.dmp b/ncdap_test/expected4/test.50.dmp
deleted file mode 100644
index 80e7cc6..0000000
--- a/ncdap_test/expected4/test.50.dmp
+++ /dev/null
@@ -1,31 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_t
-dimensions:
-	types_0 = 10 ;
-variables:
-	types_t types(types_0) ;
-data:
-
- types = 
-    {0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"}, 
-    {1, 2, 2, 16, 65520, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", "http://www.dods.org"}, 
-    {2, 3, 6, 32, 65504, 1.999867, 999.800006666578, "This is a data test string (pass 2).", "http://www.dods.org"}, 
-    {3, 5, 12, 48, 65488, 2.99955, 999.550033748988, "This is a data test string (pass 3).", "http://www.dods.org"}, 
-    {4, 8, 20, 64, 65472, 3.998933, 999.200106660978, "This is a data test string (pass 4).", "http://www.dods.org"}, 
-    {5, 13, 30, 80, 65456, 4.997917, 998.750260394966, "This is a data test string (pass 5).", "http://www.dods.org"}, 
-    {6, 21, 42, 96, 65440, 5.996401, 998.200539935204, "This is a data test string (pass 6).", "http://www.dods.org"}, 
-    {7, 34, 56, 112, 65424, 6.994285, 997.55100025328, "This is a data test string (pass 7).", "http://www.dods.org"}, 
-    {8, 55, 72, 128, 65408, 7.991469, 996.801706302619, "This is a data test string (pass 8).", "http://www.dods.org"}, 
-    {9, 89, 90, 144, 65392, 8.987855, 995.952733011994, "This is a data test string (pass 9).", "http://www.dods.org"} ;
-}
diff --git a/ncdap_test/expected4/test.53.dmp b/ncdap_test/expected4/test.53.dmp
deleted file mode 100644
index cc0c9be..0000000
--- a/ncdap_test/expected4/test.53.dmp
+++ /dev/null
@@ -1,34 +0,0 @@
-netcdf test {
-types:
-  compound ss_t {
-    ushort ui16(10) ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u(5) ;
-  }; // ss_t
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ss_t ss ;
-  }; // types_t
-dimensions:
-	types_0 = 10 ;
-variables:
-	types_t types(types_0) ;
-data:
-
- types = 
-    {0, 1, 0, 0, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 0, 1000, "This is a data test string (pass 0).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {1, 2, 2, 16, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {2, 3, 6, 32, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 1.999867, 999.800006666578, "This is a data test string (pass 2).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {3, 5, 12, 48, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 2.99955, 999.550033748988, "This is a data test string (pass 3).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {4, 8, 20, 64, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 3.998933, 999.200106660978, "This is a data test string (pass 4).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {5, 13, 30, 80, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 4.997917, 998.750260394966, "This is a data test string (pass 5).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {6, 21, 42, 96, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 5.996401, 998.200539935204, "This is a data test string (pass 6).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {7, 34, 56, 112, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 6.994285, 997.55100025328, "This is a data test string (pass 7).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {8, 55, 72, 128, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 7.991469, 996.801706302619, "This is a data test string (pass 8).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {9, 89, 90, 144, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 8.987855, 995.952733011994, "This is a data test string (pass 9).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}} ;
-}
diff --git a/ncdap_test/expected4/test.55.dmp b/ncdap_test/expected4/test.55.dmp
deleted file mode 100644
index 72fb308..0000000
--- a/ncdap_test/expected4/test.55.dmp
+++ /dev/null
@@ -1,23 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound foo_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-  }; // foo_t
-  compound ralph_record_t {
-    ubyte b ;
-    foo_t foo ;
-  }; // ralph_record_t
-  ralph_record_t(*) ralph_t ;
-variables:
-	ralph_t ralph ;
-data:
-
- ralph = 
-    {{0, {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}}}, {1, {3, {0, 2048, 4096}, {5, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}}}, {2, {8, {0, 2048, 4096}, {13, {1, 0.999950000416665, 0.999800006666578, 0 [...]
-}
diff --git a/ncdap_test/expected4/test.56.dmp b/ncdap_test/expected4/test.56.dmp
deleted file mode 100644
index c674e11..0000000
--- a/ncdap_test/expected4/test.56.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound foo_record_t {
-    ubyte b(10) ;
-    int i(10) ;
-  }; // foo_record_t
-  foo_record_t(*) foo_t ;
-variables:
-	foo_t foo ;
-data:
-
- foo = 
-    {{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}} ;
-}
diff --git a/ncdap_test/expected4/test.57.dmp b/ncdap_test/expected4/test.57.dmp
deleted file mode 100644
index c674e11..0000000
--- a/ncdap_test/expected4/test.57.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound foo_record_t {
-    ubyte b(10) ;
-    int i(10) ;
-  }; // foo_record_t
-  foo_record_t(*) foo_t ;
-variables:
-	foo_t foo ;
-data:
-
- foo = 
-    {{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}} ;
-}
diff --git a/ncdap_test/expected4/test.66.dmp b/ncdap_test/expected4/test.66.dmp
deleted file mode 100644
index 39073a7..0000000
--- a/ncdap_test/expected4/test.66.dmp
+++ /dev/null
@@ -1,42 +0,0 @@
-netcdf test {
-types:
-  compound long_names_one_t {
-    int long_one ;
-    int long_two ;
-    int long_three ;
-    int long_four ;
-    int long_five ;
-    int long_six ;
-    double long_one_float ;
-    double long_two_float ;
-    double long_three_float ;
-  }; // long_names_one_t
-  compound long_names_one_and_a_half_t {
-    int long_one_float1 ;
-    int long_two_float1 ;
-    int long_three_float3 ;
-    int long_four ;
-    int long_five ;
-    int long_six ;
-    double long_one_float ;
-    double long_two_float ;
-    double long_three_float ;
-  }; // long_names_one_and_a_half_t
-  compound long_names_two_t {
-    int a_very_long_name_given_what_it_accomplishes ;
-    int another_name_nearly_as_pointless ;
-  }; // long_names_two_t
-variables:
-	long_names_one_t long_names_one ;
-	long_names_one_and_a_half_t long_names_one_and_a_half ;
-	long_names_two_t long_names_two ;
-data:
-
- long_names_one = 
-    {1, 2, 3, 5, 8, 13, 1000, 999.950000416665, 999.800006666578} ;
-
- long_names_one_and_a_half = 
-    {21, 34, 55, 89, 144, 233, 999.550033748988, 999.200106660978, 998.750260394966} ;
-
- long_names_two = {377, 610} ;
-}
diff --git a/ncdap_test/expected4/test.67.dmp b/ncdap_test/expected4/test.67.dmp
deleted file mode 100644
index 04f0fc4..0000000
--- a/ncdap_test/expected4/test.67.dmp
+++ /dev/null
@@ -1,78 +0,0 @@
-netcdf test {
-dimensions:
-	latitude = 20 ;
-	longitude = 10 ;
-variables:
-	int i ;
-	double f(latitude, longitude) ;
-data:
-
- i = 1 ;
-
- f =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204, 
-    0.99755100025328, 0.996801706302619, 0.995952733011994,
-  0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 
-    0.990215996212637, 0.988771077936042, 0.987227283375627, 
-    0.985584766909561, 0.983843692788121, 0.98200423511727,
-  0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 
-    0.97133797485203, 0.968912421710645, 0.966389978134513, 
-    0.963770896365891, 0.961055438310771, 0.958243875512697,
-  0.955336489125606, 0.952333569885713, 0.949235418082441, 0.946042343528387, 
-    0.942754665528346, 0.939372712847379, 0.935896823677935, 
-    0.932327345606034, 0.92866463557651, 0.924909059857313,
-  0.921060994002885, 0.917120822816605, 0.913088940312308, 0.908965749674885, 
-    0.904751663219963, 0.900447102352677, 0.896052497525525, 
-    0.891568288195329, 0.886994922779284, 0.882332858610121,
-  0.877582561890373, 0.872744507645751, 0.86781917967765, 0.862807070514761, 
-    0.857708681363824, 0.852524522059506, 0.847255111013416, 
-    0.841900975162269, 0.836462649915187, 0.830940679100164,
-  0.825335614909678, 0.819648017845479, 0.813878456662534, 0.808027508312152, 
-    0.802095757884293, 0.796083798549056, 0.789992231497365, 
-    0.783821665880849, 0.777572718750928, 0.771246014997107,
-  0.764842187284488, 0.758361875990508, 0.751805729140895, 0.74517440234487, 
-    0.738468558729588, 0.731688868873821, 0.724836010740905, 
-    0.717910669610943, 0.710913538012277, 0.703845315652236,
-  0.696706709347165, 0.689498432951747, 0.682221207287614, 0.674875760071267, 
-    0.667462825841308, 0.659983145884982, 0.652437468164052, 
-    0.644826547240001, 0.63715114419858, 0.629412026573697,
-  0.621609968270664, 0.613745749488812, 0.605820156643463, 0.597833982287298, 
-    0.589788025031098, 0.581683089463883, 0.573519986072457, 
-    0.565299531160354, 0.557022546766217, 0.548689860581588,
-  0.54030230586814, 0.531860721374355, 0.52336595125165, 0.514818844969955, 
-    0.506220257232778, 0.497571047891727, 0.488872081860527, 
-    0.480124229028534, 0.47132836417374, 0.462485366875301,
-  0.453596121425577, 0.444661516741707, 0.435682446276712, 0.426659807930157, 
-    0.417594503958358, 0.408487440884157, 0.399339529406273, 
-    0.39015168430823, 0.380924824366882, 0.371659872260533,
-  0.362357754476674, 0.35301940121933, 0.343645746316047, 0.334237727124503, 
-    0.324796284438776, 0.315322362395269, 0.305816908378289, 
-    0.296280872925319, 0.286715209631956, 0.277120875056558,
-  0.267498828624587, 0.25785003253267, 0.248175451652373, 0.238476053433723, 
-    0.228752807808459, 0.219006687093041, 0.209238665891419, 
-    0.199449720997573, 0.189640831297834, 0.179812977673,
-  0.169967142900241, 0.160104311554831, 0.150225469911686, 0.140331605846737, 
-    0.130423708738146, 0.120502769367367, 0.11056977982007, 
-    0.100625733386932, 0.0906716244643097, 0.0807084484548006,
-  0.0707372016677029, 0.0607588812193859, 0.0507744849335792, 
-    0.040785011241591, 0.0307914590824661, 0.0207948278030924, 
-    0.0107961170582674, 0.000796326710733263, -0.00920354326880834, 
-    -0.0192024929016926,
-  -0.0291995223012888, -0.0391936317729877, -0.0491838219141706, 
-    -0.0591690937141481, -0.0691484486540619, -0.0791208888067339, 
-    -0.089085416936459, -0.099041036598728, -0.108986752239871, 
-    -0.118921569296612,
-  -0.128844494295525, -0.138754534952378, -0.148650700271364, 
-    -0.158532000644198, -0.168397447949077, -0.178246055649492, 
-    -0.18807683889288, -0.197888814609109, -0.207681001608784, 
-    -0.217452420681365,
-  -0.227202094693087, -0.236929048684675, -0.246632309968834, 
-    -0.256310908227523, -0.26596387560898, -0.275590246824513, 
-    -0.285189059245021, -0.294759352997261, -0.304300171059833, 
-    -0.313810559358882,
-  -0.323289566863503, -0.332736245680845, -0.342149651150898, 
-    -0.35152884194096, -0.360872880139767, -0.370180831351287, 
-    -0.379451764788155, -0.388684753364752, -0.397878873789916, 
-    -0.407033206659266 ;
-}
diff --git a/ncdap_test/expected4/test.68.dmp b/ncdap_test/expected4/test.68.dmp
deleted file mode 100644
index a6e0536..0000000
--- a/ncdap_test/expected4/test.68.dmp
+++ /dev/null
@@ -1,2 +0,0 @@
-netcdf test {
-}
diff --git a/ncdap_test/expected4/test.69.dmp b/ncdap_test/expected4/test.69.dmp
deleted file mode 100644
index 3b61d54..0000000
--- a/ncdap_test/expected4/test.69.dmp
+++ /dev/null
@@ -1,401 +0,0 @@
-netcdf test {
-types:
-  compound exp_t {
-    int j ;
-    int i ;
-  }; // exp_t
-dimensions:
-	f_0 = 17 ;
-	f_1 = 121 ;
-	i_0 = 10 ;
-	i_1 = 20 ;
-variables:
-	int i(i_0, i_1) ;
-	float f(f_0, f_1) ;
-	exp_t exp ;
-data:
-
- i =
-  0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 
-    24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 
-    61440, 63488, 65536, 67584, 69632, 71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112, 92160, 94208, 96256, 98304, 100352, 
-    102400, 104448, 106496, 108544, 110592, 112640, 114688, 116736, 118784, 
-    120832,
-  122880, 124928, 126976, 129024, 131072, 133120, 135168, 137216, 139264, 
-    141312, 143360, 145408, 147456, 149504, 151552, 153600, 155648, 157696, 
-    159744, 161792,
-  163840, 165888, 167936, 169984, 172032, 174080, 176128, 178176, 180224, 
-    182272, 184320, 186368, 188416, 190464, 192512, 194560, 196608, 198656, 
-    200704, 202752,
-  204800, 206848, 208896, 210944, 212992, 215040, 217088, 219136, 221184, 
-    223232, 225280, 227328, 229376, 231424, 233472, 235520, 237568, 239616, 
-    241664, 243712,
-  245760, 247808, 249856, 251904, 253952, 256000, 258048, 260096, 262144, 
-    264192, 266240, 268288, 270336, 272384, 274432, 276480, 278528, 280576, 
-    282624, 284672,
-  286720, 288768, 290816, 292864, 294912, 296960, 299008, 301056, 303104, 
-    305152, 307200, 309248, 311296, 313344, 315392, 317440, 319488, 321536, 
-    323584, 325632,
-  327680, 329728, 331776, 333824, 335872, 337920, 339968, 342016, 344064, 
-    346112, 348160, 350208, 352256, 354304, 356352, 358400, 360448, 362496, 
-    364544, 366592,
-  368640, 370688, 372736, 374784, 376832, 378880, 380928, 382976, 385024, 
-    387072, 389120, 391168, 393216, 395264, 397312, 399360, 401408, 403456, 
-    405504, 407552 ;
-
- f =
-  0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 0.059964, 
-    0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 0.1197122, 
-    0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 0.1790296, 
-    0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 0.2377026, 
-    0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 0.2955202, 
-    0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 0.3522742, 
-    0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 0.4077604, 
-    0.4168708, 0.4259395, 0.4349655, 0.4439481, 0.4528863, 0.4617792, 
-    0.4706259, 0.4794255, 0.4881772, 0.4968801, 0.5055333, 0.514136, 
-    0.5226873, 0.5311862, 0.539632, 0.5480239, 0.556361, 0.5646425, 
-    0.5728675, 0.5810351, 0.5891448, 0.5971954, 0.6051864, 0.6131169, 
-    0.620986, 0.628793, 0.6365372, 0.6442177, 0.6518338, 0.6593847, 
-    0.6668696, 0.6742879, 0.6816388, 0.6889215, 0.6961352, 0.7032794, 
-    0.7103533, 0.7173561, 0.7242872, 0.7311459, 0.7379314, 0.7446431, 
-    0.7512804, 0.7578425, 0.764329, 0.7707389, 0.7770718, 0.7833269, 
-    0.7895038, 0.7956016, 0.8016199, 0.8075581, 0.8134155, 0.8191916, 
-    0.8248857, 0.8304974, 0.836026, 0.841471, 0.8468319, 0.852108, 0.857299, 
-    0.8624042, 0.8674232, 0.8723555, 0.8772005, 0.8819578, 0.8866269, 
-    0.8912073, 0.8956987, 0.9001005, 0.9044122, 0.9086335, 0.912764, 
-    0.9168031, 0.9207506, 0.924606, 0.928369, 0.9320391,
-  0.935616, 0.9390994, 0.9424888, 0.945784, 0.9489846, 0.9520903, 0.9551008, 
-    0.9580159, 0.960835, 0.9635582, 0.966185, 0.9687151, 0.9711484, 
-    0.9734845, 0.9757234, 0.9778646, 0.979908, 0.9818535, 0.9837008, 
-    0.9854497, 0.9871001, 0.9886518, 0.9901046, 0.9914584, 0.992713, 
-    0.9938684, 0.9949244, 0.9958808, 0.9967378, 0.997495, 0.9981525, 
-    0.9987102, 0.9991679, 0.9995258, 0.9997838, 0.9999417, 0.9999997, 
-    0.9999576, 0.9998156, 0.9995736, 0.9992316, 0.9987897, 0.998248, 
-    0.9976064, 0.996865, 0.996024, 0.9950833, 0.9940432, 0.9929036, 
-    0.9916648, 0.9903268, 0.9888898, 0.9873539, 0.9857192, 0.983986, 
-    0.9821543, 0.9802245, 0.9781966, 0.9760709, 0.9738476, 0.971527, 
-    0.9691091, 0.9665944, 0.963983, 0.9612752, 0.9584713, 0.9555715, 
-    0.9525762, 0.9494856, 0.9463001, 0.9430199, 0.9396455, 0.9361771, 
-    0.932615, 0.9289597, 0.9252115, 0.9213708, 0.917438, 0.9134133, 
-    0.9092974, 0.9050906, 0.9007932, 0.8964058, 0.8919287, 0.8873624, 
-    0.8827074, 0.8779641, 0.873133, 0.8682146, 0.8632094, 0.8581178, 
-    0.8529405, 0.8476778, 0.8423305, 0.8368988, 0.8313835, 0.825785, 
-    0.8201039, 0.8143409, 0.8084964, 0.8025711, 0.7965655, 0.7904802, 
-    0.7843159, 0.7780732, 0.7717527, 0.7653549, 0.7588807, 0.7523306, 
-    0.7457052, 0.7390053, 0.7322314, 0.7253844, 0.7184648, 0.7114733, 
-    0.7044108, 0.6972777, 0.690075, 0.6828032, 0.6754632, 0.6680556,
-  0.6605812, 0.6530408, 0.645435, 0.6377647, 0.6300306, 0.6222336, 0.6143743, 
-    0.6064535, 0.5984721, 0.5904309, 0.5823306, 0.5741721, 0.5659562, 
-    0.5576837, 0.5493554, 0.5409722, 0.5325349, 0.5240443, 0.5155014, 
-    0.5069069, 0.4982616, 0.4895666, 0.4808226, 0.4720306, 0.4631913, 
-    0.4543057, 0.4453746, 0.4363991, 0.4273799, 0.4183179, 0.4092142, 
-    0.4000695, 0.3908848, 0.381661, 0.372399, 0.3630998, 0.3537644, 
-    0.3443935, 0.3349881, 0.3255493, 0.316078, 0.306575, 0.2970414, 0.287478, 
-    0.2778859, 0.2682661, 0.2586193, 0.2489468, 0.2392493, 0.229528, 
-    0.2197836, 0.2100173, 0.20023, 0.1904227, 0.1805963, 0.1707518, 
-    0.1608903, 0.1510127, 0.14112, 0.1312132, 0.1212933, 0.1113612, 0.101418, 
-    0.09146464, 0.08150215, 0.07153151, 0.06155372, 0.05156977, 0.04158066, 
-    0.0315874, 0.02159098, 0.01159239, 0.001592653, -0.008407247, 
-    -0.01840631, -0.02840353, -0.0383979, -0.04838844, -0.05837414, 
-    -0.068354, -0.07832703, -0.08829223, -0.09824859, -0.1081951, -0.1181309, 
-    -0.1280548, -0.1379659, -0.1478632, -0.1577457, -0.1676124, -0.1774624, 
-    -0.1872947, -0.1971082, -0.206902, -0.2166751, -0.2264265, -0.2361553, 
-    -0.2458605, -0.2555411, -0.2651961, -0.2748247, -0.2844257, -0.2939983, 
-    -0.3035415, -0.3130544, -0.3225359, -0.3319852, -0.3414013, -0.3507832, 
-    -0.3601301, -0.369441, -0.3787149, -0.3879509, -0.3971482, -0.4063057, 
-    -0.4154226, -0.424498, -0.4335309, -0.4425204, -0.4514658, -0.4603659,
-  -0.46922, -0.4780273, -0.4867867, -0.4954974, -0.5041586, -0.5127693, 
-    -0.5213288, -0.5298361, -0.5382905, -0.5466911, -0.5550369, -0.5633273, 
-    -0.5715613, -0.5797382, -0.5878571, -0.5959172, -0.6039178, -0.6118579, 
-    -0.6197369, -0.6275538, -0.635308, -0.6429988, -0.6506251, -0.6581865, 
-    -0.665682, -0.673111, -0.6804726, -0.6877661, -0.694991, -0.7021463, 
-    -0.7092314, -0.7162456, -0.7231881, -0.7300584, -0.7368556, -0.7435791, 
-    -0.7502283, -0.7568025, -0.763301, -0.7697231, -0.7760683, -0.7823359, 
-    -0.7885253, -0.7946358, -0.8006668, -0.8066177, -0.8124881, -0.8182771, 
-    -0.8239843, -0.8296092, -0.835151, -0.8406094, -0.8459837, -0.8512734, 
-    -0.856478, -0.8615969, -0.8666297, -0.8715758, -0.8764347, -0.881206, 
-    -0.8858892, -0.8904838, -0.8949894, -0.8994054, -0.9037315, -0.9079673, 
-    -0.9121122, -0.9161659, -0.920128, -0.9239982, -0.9277759, -0.9314608, 
-    -0.9350526, -0.9385508, -0.9419553, -0.9452655, -0.9484812, -0.9516021, 
-    -0.9546278, -0.957558, -0.9603925, -0.963131, -0.965773, -0.9683186, 
-    -0.9707673, -0.973119, -0.9753733, -0.9775301, -0.9795892, -0.9815503, 
-    -0.9834132, -0.9851778, -0.9868439, -0.9884112, -0.9898798, -0.9912494, 
-    -0.9925198, -0.993691, -0.9947628, -0.9957352, -0.996608, -0.9973811, 
-    -0.9980544, -0.998628, -0.9991017, -0.9994755, -0.9997494, -0.9999232, 
-    -0.9999971, -0.999971, -0.9998449, -0.9996188, -0.9992928, -0.9988668, 
-    -0.998341, -0.9977152, -0.9969898, -0.9961646, -0.9952399, -0.9942155, 
-    -0.9930918,
-  -0.9918687, -0.9905465, -0.9891253, -0.9876051, -0.9859861, -0.9842686, 
-    -0.9824526, -0.9805384, -0.9785261, -0.976416, -0.9742082, -0.9719031, 
-    -0.9695007, -0.9670014, -0.9644054, -0.9617129, -0.9589243, -0.9560397, 
-    -0.9530596, -0.9499842, -0.9468138, -0.9435487, -0.9401892, -0.9367357, 
-    -0.9331886, -0.9295481, -0.9258147, -0.9219887, -0.9180705, -0.9140605, 
-    -0.9099591, -0.9057667, -0.9014837, -0.8971105, -0.8926477, -0.8880956, 
-    -0.8834547, -0.8787254, -0.8739083, -0.8690037, -0.8640123, -0.8589345, 
-    -0.8537708, -0.8485217, -0.8431877, -0.8377695, -0.8322675, -0.8266822, 
-    -0.8210142, -0.8152642, -0.8094327, -0.8035201, -0.7975273, -0.7914547, 
-    -0.7853029, -0.7790727, -0.7727645, -0.766379, -0.7599169, -0.7533789, 
-    -0.7467654, -0.7400773, -0.7333152, -0.7264798, -0.7195717, -0.7125916, 
-    -0.7055403, -0.6984185, -0.6912268, -0.683966, -0.6766368, -0.6692399, 
-    -0.6617761, -0.6542461, -0.6466507, -0.6389906, -0.6312667, -0.6234795, 
-    -0.6156301, -0.6077191, -0.5997473, -0.5917156, -0.5836247, -0.5754754, 
-    -0.5672686, -0.559005, -0.5506855, -0.542311, -0.5338823, -0.5254001, 
-    -0.5168654, -0.5082791, -0.4996419, -0.4909547, -0.4822185, -0.473434, 
-    -0.4646022, -0.4557239, -0.4468001, -0.4378315, -0.4288192, -0.419764, 
-    -0.4106669, -0.4015286, -0.3923502, -0.3831326, -0.3738767, -0.3645833, 
-    -0.3552535, -0.3458883, -0.3364884, -0.3270548, -0.3175886, -0.3080906, 
-    -0.2985618, -0.2890031, -0.2794155, -0.2698, -0.2601575, -0.250489, 
-    -0.2407954,
-  -0.2310778, -0.2213371, -0.2115742, -0.2017901, -0.1919859, -0.1821625, 
-    -0.1723209, -0.162462, -0.1525869, -0.1426965, -0.1327919, -0.122874, 
-    -0.1129438, -0.1030023, -0.0930505, -0.0830894, -0.07311999, -0.06314328, 
-    -0.05316024, -0.04317189, -0.03317922, -0.02318323, -0.01318493, 
-    -0.003185302, 0.00681464, 0.0168139, 0.02681148, 0.03680638, 0.0467976, 
-    0.05678413, 0.06676499, 0.07673918, 0.08670568, 0.09666352, 0.1066117, 
-    0.1165492, 0.1264751, 0.1363883, 0.1462878, 0.1561728, 0.1660421, 
-    0.1758948, 0.18573, 0.1955465, 0.2053435, 0.21512, 0.2248749, 0.2346074, 
-    0.2443164, 0.254001, 0.2636602, 0.273293, 0.2828985, 0.2924757, 
-    0.3020236, 0.3115413, 0.321028, 0.3304825, 0.3399039, 0.3492913, 
-    0.3586439, 0.3679605, 0.3772404, 0.3864825, 0.395686, 0.4048499, 
-    0.4139734, 0.4230554, 0.4320951, 0.4410917, 0.4500441, 0.4589515, 
-    0.467813, 0.4766277, 0.4853948, 0.4941134, 0.5027825, 0.5114013, 
-    0.519969, 0.5284848, 0.5369476, 0.5453568, 0.5537114, 0.5620106, 
-    0.5702537, 0.5784398, 0.5865679, 0.5946375, 0.6026475, 0.6105974, 
-    0.6184861, 0.626313, 0.6340773, 0.6417782, 0.6494148, 0.6569866, 
-    0.6644927, 0.6719322, 0.6793047, 0.6866091, 0.693845, 0.7010114, 
-    0.7081077, 0.7151332, 0.7220873, 0.728969, 0.735778, 0.7425133, 
-    0.7491744, 0.7557605, 0.7622711, 0.7687054, 0.7750629, 0.7813429, 
-    0.7875448, 0.7936679, 0.7997116, 0.8056753, 0.8115585, 0.8173606, 
-    0.8230809,
-  0.8287189, 0.834274, 0.8397457, 0.8451334, 0.8504366, 0.8556548, 0.8607874, 
-    0.8658339, 0.8707939, 0.8756667, 0.880452, 0.8851492, 0.889758, 
-    0.8942778, 0.8987081, 0.9030486, 0.9072987, 0.9114581, 0.9155264, 
-    0.9195032, 0.9233879, 0.9271804, 0.9308801, 0.9344868, 0.938, 0.9414194, 
-    0.9447446, 0.9479754, 0.9511114, 0.9541523, 0.9570977, 0.9599475, 
-    0.9627013, 0.9653587, 0.9679196, 0.9703838, 0.972751, 0.9750208, 
-    0.9771932, 0.9792678, 0.9812445, 0.9831231, 0.9849033, 0.9865851, 
-    0.9881682, 0.9896525, 0.9910379, 0.9923241, 0.9935111, 0.9945988, 
-    0.995587, 0.9964756, 0.9972646, 0.9979539, 0.9985433, 0.999033, 
-    0.9994227, 0.9997125, 0.9999022, 0.9999921, 0.9999819, 0.9998717, 
-    0.9996616, 0.9993514, 0.9989414, 0.9984314, 0.9978216, 0.997112, 
-    0.9963027, 0.9953938, 0.9943853, 0.9932774, 0.9920702, 0.9907638, 
-    0.9893582, 0.9878538, 0.9862506, 0.9845487, 0.9827484, 0.9808499, 
-    0.9788532, 0.9767586, 0.9745664, 0.9722767, 0.9698898, 0.9674059, 
-    0.9648253, 0.9621482, 0.9593748, 0.9565055, 0.9535406, 0.9504804, 
-    0.9473251, 0.944075, 0.9407306, 0.937292, 0.9337597, 0.9301341, 
-    0.9264155, 0.9226042, 0.9187007, 0.9147053, 0.9106184, 0.9064404, 
-    0.9021719, 0.897813, 0.8933644, 0.8888265, 0.8841997, 0.8794845, 
-    0.8746814, 0.8697907, 0.8648131, 0.859749, 0.8545989, 0.8493634, 
-    0.8440429, 0.8386381, 0.8331493, 0.8275773, 0.8219225,
-  0.8161855, 0.8103669, 0.8044672, 0.7984871, 0.7924272, 0.786288, 0.7800702, 
-    0.7737743, 0.7674012, 0.7609512, 0.7544252, 0.7478237, 0.7411475, 
-    0.7343971, 0.7275733, 0.7206767, 0.7137081, 0.7066681, 0.6995574, 
-    0.6923768, 0.685127, 0.6778086, 0.6704224, 0.6629692, 0.6554497, 
-    0.6478647, 0.6402149, 0.6325011, 0.624724, 0.6168844, 0.6089832, 
-    0.601021, 0.5929987, 0.5849172, 0.5767772, 0.5685794, 0.5603248, 
-    0.5520142, 0.5436484, 0.5352283, 0.5267546, 0.5182282, 0.50965, 
-    0.5010208, 0.4923416, 0.4836131, 0.4748363, 0.4660119, 0.457141, 
-    0.4482243, 0.4392629, 0.4302575, 0.421209, 0.4121185, 0.4029867, 
-    0.3938147, 0.3846032, 0.3753533, 0.3660659, 0.3567419, 0.3473822, 
-    0.3379877, 0.3285595, 0.3190984, 0.3096054, 0.3000814, 0.2905274, 
-    0.2809443, 0.2713332, 0.261695, 0.2520306, 0.2423409, 0.232627, 
-    0.2228899, 0.2131305, 0.2033498, 0.1935487, 0.1837283, 0.1738895, 
-    0.1640333, 0.1541607, 0.1442727, 0.1343703, 0.1244544, 0.1145261, 
-    0.1045863, 0.09463613, 0.08467644, 0.07470829, 0.06473266, 0.05475057, 
-    0.044763, 0.03477095, 0.02477542, 0.01477742, 0.004777943, -0.005222016, 
-    -0.01522145, -0.02521937, -0.03521476, -0.04520663, -0.05519398, 
-    -0.06517581, -0.07515112, -0.08511892, -0.09507821, -0.105028, 
-    -0.1149673, -0.124895, -0.1348103, -0.1447121, -0.1545995, -0.1644713, 
-    -0.1743268, -0.1841648, -0.1939844, -0.2037845, -0.2135644, -0.2233228, 
-    -0.2330589, -0.2427717,
-  -0.2524603, -0.2621236, -0.2717606, -0.2813705, -0.2909523, -0.300505, 
-    -0.3100276, -0.3195192, -0.3289789, -0.3384056, -0.3477986, -0.3571567, 
-    -0.3664791, -0.3757649, -0.3850131, -0.3942228, -0.4033931, -0.4125231, 
-    -0.4216118, -0.4306583, -0.4396617, -0.4486212, -0.4575359, -0.4664048, 
-    -0.475227, -0.4840018, -0.4927281, -0.5014051, -0.5100321, -0.518608, 
-    -0.527132, -0.5356033, -0.5440211, -0.5523845, -0.5606926, -0.5689447, 
-    -0.5771399, -0.5852773, -0.5933563, -0.6013759, -0.6093353, -0.6172339, 
-    -0.6250706, -0.6328449, -0.640556, -0.6482029, -0.6557851, -0.6633016, 
-    -0.6707519, -0.678135, -0.6854504, -0.6926972, -0.6998747, -0.7069823, 
-    -0.7140191, -0.7209845, -0.7278779, -0.7346984, -0.7414455, -0.7481185, 
-    -0.7547166, -0.7612393, -0.7676858, -0.7740556, -0.7803479, -0.7865623, 
-    -0.792698, -0.7987544, -0.8047309, -0.810627, -0.816442, -0.8221753, 
-    -0.8278264, -0.8333948, -0.8388798, -0.844281, -0.8495977, -0.8548294, 
-    -0.8599757, -0.865036, -0.8700097, -0.8748965, -0.8796958, -0.884407, 
-    -0.8890299, -0.8935639, -0.8980085, -0.9023633, -0.9066279, -0.9108018, 
-    -0.9148846, -0.918876, -0.9227754, -0.9265826, -0.9302971, -0.9339186, 
-    -0.9374467, -0.9408811, -0.9442213, -0.9474672, -0.9506183, -0.9536743, 
-    -0.956635, -0.9595, -0.9622691, -0.9649419, -0.9675183, -0.9699979, 
-    -0.9723805, -0.9746658, -0.9768537, -0.9789439, -0.9809362, -0.9828305, 
-    -0.9846264, -0.9863239, -0.9879227, -0.9894227, -0.9908239, -0.9921259, 
-    -0.9933288,
-  -0.9944322, -0.9954363, -0.9963408, -0.9971456, -0.9978508, -0.9984561, 
-    -0.9989617, -0.9993673, -0.999673, -0.9998787, -0.9999844, -0.9999902, 
-    -0.9998959, -0.9997017, -0.9994075, -0.9990134, -0.9985193, -0.9979254, 
-    -0.9972317, -0.9964383, -0.9955452, -0.9945526, -0.9934605, -0.9922691, 
-    -0.9909785, -0.9895887, -0.9881001, -0.9865125, -0.9848264, -0.9830417, 
-    -0.9811588, -0.9791777, -0.9770988, -0.9749221, -0.9726479, -0.9702765, 
-    -0.967808, -0.9652427, -0.962581, -0.959823, -0.956969, -0.9540192, 
-    -0.9509742, -0.947834, -0.944599, -0.9412695, -0.9378459, -0.9343286, 
-    -0.9307178, -0.9270139, -0.9232174, -0.9193285, -0.9153477, -0.9112754, 
-    -0.9071119, -0.9028577, -0.8985133, -0.894079, -0.8895552, -0.8849425, 
-    -0.8802414, -0.8754522, -0.8705754, -0.8656116, -0.8605613, -0.8554249, 
-    -0.8502029, -0.844896, -0.8395045, -0.8340291, -0.8284702, -0.8228286, 
-    -0.8171046, -0.811299, -0.8054122, -0.7994449, -0.7933976, -0.787271, 
-    -0.7810657, -0.7747822, -0.7684214, -0.7619836, -0.7554696, -0.7488801, 
-    -0.7422158, -0.7354771, -0.728665, -0.7217799, -0.7148228, -0.7077941, 
-    -0.7006946, -0.6935251, -0.6862862, -0.6789787, -0.6716033, -0.6641607, 
-    -0.6566517, -0.6490771, -0.6414375, -0.6337339, -0.6259668, -0.6181371, 
-    -0.6102456, -0.6022931, -0.5942804, -0.5862082, -0.5780774, -0.5698889, 
-    -0.5616433, -0.5533416, -0.5449845, -0.5365729, -0.5281077, -0.5195897, 
-    -0.5110196, -0.5023986, -0.4937272, -0.4850065, -0.4762373, -0.4674205, 
-    -0.4585569,
-  -0.4496475, -0.4406931, -0.4316946, -0.422653, -0.4135691, -0.4044438, 
-    -0.3952781, -0.3860729, -0.3768291, -0.3675475, -0.3582293, -0.3488752, 
-    -0.3394862, -0.3300633, -0.3206073, -0.3111193, -0.3016002, -0.292051, 
-    -0.2824725, -0.2728658, -0.2632318, -0.2535715, -0.2438858, -0.2341757, 
-    -0.2244422, -0.2146863, -0.2049089, -0.195111, -0.1852936, -0.1754577, 
-    -0.1656042, -0.1557341, -0.1458485, -0.1359483, -0.1260345, -0.1161081, 
-    -0.1061701, -0.09622151, -0.08626327, -0.0762964, -0.06632189, 
-    -0.05634077, -0.046354, -0.0363626, -0.02636756, -0.01636988, 
-    -0.006370571, 0.003629378, 0.01362896, 0.02362719, 0.03362305, 
-    0.04361555, 0.05360368, 0.06358646, 0.07356288, 0.08353194, 0.09349265, 
-    0.103444, 0.113385, 0.1233147, 0.133232, 0.1431361, 0.1530258, 0.1629002, 
-    0.1727583, 0.1825991, 0.1924217, 0.2022251, 0.2120082, 0.2217701, 
-    0.2315098, 0.2412264, 0.2509189, 0.2605863, 0.2702276, 0.2798419, 
-    0.2894282, 0.2989855, 0.308513, 0.3180096, 0.3274744, 0.3369065, 
-    0.3463049, 0.3556686, 0.3649968, 0.3742885, 0.3835427, 0.3927587, 
-    0.4019353, 0.4110717, 0.420167, 0.4292203, 0.4382307, 0.4471973, 
-    0.4561191, 0.4649954, 0.4738251, 0.4826075, 0.4913416, 0.5000265, 
-    0.5086614, 0.5172455, 0.5257779, 0.5342577, 0.5426841, 0.5510561, 
-    0.5593731, 0.5676342, 0.5758385, 0.5839852, 0.5920735, 0.6001026, 
-    0.6080717, 0.61598, 0.6238267, 0.631611, 0.6393321, 0.6469893, 0.6545818, 
-    0.6621089, 0.6695698,
-  0.6769636, 0.6842899, 0.6915476, 0.6987363, 0.705855, 0.7129031, 0.71988, 
-    0.7267848, 0.7336171, 0.7403759, 0.7470607, 0.7536708, 0.7602055, 
-    0.7666642, 0.7730463, 0.779351, 0.7855778, 0.7917261, 0.7977951, 
-    0.8037844, 0.8096933, 0.8155213, 0.8212677, 0.826932, 0.8325136, 
-    0.8380119, 0.8434264, 0.8487566, 0.8540019, 0.8591618, 0.8642358, 
-    0.8692234, 0.8741241, 0.8789373, 0.8836626, 0.8882996, 0.8928478, 
-    0.8973066, 0.9016758, 0.9059547, 0.9101431, 0.9142405, 0.9182464, 
-    0.9221606, 0.9259824, 0.9297118, 0.9333481, 0.9368911, 0.9403404, 
-    0.9436957, 0.9469566, 0.9501228, 0.953194, 0.9561699, 0.9590501, 
-    0.9618345, 0.9645227, 0.9671144, 0.9696094, 0.9720075, 0.9743084, 
-    0.9765118, 0.9786175, 0.9806255, 0.9825354, 0.9843469, 0.9860601, 
-    0.9876747, 0.9891905, 0.9906074, 0.9919252, 0.9931438, 0.9942631, 
-    0.995283, 0.9962034, 0.9970241, 0.9977452, 0.9983664, 0.9988878, 
-    0.9993094, 0.999631, 0.9998527, 0.9999743, 0.999996, 0.9999177, 
-    0.9997393, 0.9994611, 0.9990828, 0.9986047, 0.9980267, 0.9973488, 
-    0.9965713, 0.9956941, 0.9947174, 0.9936411, 0.9924655, 0.9911907, 
-    0.9898167, 0.9883437, 0.9867719, 0.9851015, 0.9833325, 0.9814652, 
-    0.9794998, 0.9774364, 0.9752753, 0.9730166, 0.9706606, 0.9682076, 
-    0.9656578, 0.9630114, 0.9602687, 0.9574299, 0.9544954, 0.9514655, 
-    0.9483404, 0.9451205, 0.9418061, 0.9383975, 0.934895, 0.9312991,
-  0.9276101, 0.9238282, 0.9199541, 0.9159878, 0.9119301, 0.9077811, 
-    0.9035413, 0.8992112, 0.8947912, 0.8902817, 0.8856831, 0.880996, 
-    0.8762208, 0.871358, 0.866408, 0.8613714, 0.8562487, 0.8510403, 
-    0.8457468, 0.8403688, 0.8349067, 0.8293611, 0.8237326, 0.8180218, 
-    0.8122291, 0.8063552, 0.8004007, 0.7943661, 0.7882521, 0.7820593, 
-    0.7757882, 0.7694396, 0.763014, 0.7565122, 0.7499346, 0.7432821, 
-    0.7365553, 0.7297548, 0.7228814, 0.7159356, 0.7089183, 0.70183, 
-    0.6946716, 0.6874437, 0.6801471, 0.6727825, 0.6653506, 0.6578521, 
-    0.6502879, 0.6426586, 0.6349651, 0.627208, 0.6193883, 0.6115066, 
-    0.6035637, 0.5955606, 0.5874978, 0.5793763, 0.5711969, 0.5629603, 
-    0.5546675, 0.5463191, 0.5379162, 0.5294595, 0.5209498, 0.512388, 
-    0.503775, 0.4951116, 0.4863987, 0.4776371, 0.4688278, 0.4599716, 
-    0.4510695, 0.4421222, 0.4331307, 0.4240958, 0.4150186, 0.4058999, 
-    0.3967406, 0.3875416, 0.3783038, 0.3690283, 0.3597158, 0.3503673, 
-    0.3409838, 0.3315663, 0.3221155, 0.3126326, 0.3031183, 0.2935738, 
-    0.2839999, 0.2743977, 0.2647679, 0.2551118, 0.24543, 0.2357238, 0.225994, 
-    0.2162415, 0.2064675, 0.1966728, 0.1868584, 0.1770254, 0.1671746, 
-    0.1573072, 0.147424, 0.137526, 0.1276143, 0.1176899, 0.1077536, 
-    0.09780665, 0.08784988, 0.07788431, 0.06791096, 0.05793082, 0.04794488, 
-    0.03795415, 0.02795962, 0.0179623, 0.007963183, -0.002036731, -0.01203644,
-  -0.02203495, -0.03203125, -0.04202435, -0.05201325, -0.06199695, 
-    -0.07197444, -0.08194474, -0.09190685, -0.1018598, -0.1118025, -0.121734, 
-    -0.1316534, -0.1415596, -0.1514517, -0.1613286, -0.1711894, -0.181033, 
-    -0.1908586, -0.2006651, -0.2104515, -0.2202168, -0.2299601, -0.2396805, 
-    -0.2493769, -0.2590483, -0.2686938, -0.2783125, -0.2879033, -0.2974654, 
-    -0.3069977, -0.3164992, -0.3259692, -0.3354065, -0.3448103, -0.3541797, 
-    -0.3635136, -0.3728111, -0.3820714, -0.3912935, -0.4004764, -0.4096193, 
-    -0.4187213, -0.4277813, -0.4367986, -0.4457722, -0.4547012, -0.4635848, 
-    -0.472422, -0.4812119, -0.4899538, -0.4986466, -0.5072896, -0.5158818, 
-    -0.5244225, -0.5329107, -0.5413457, -0.5497264, -0.5580522, -0.5663223, 
-    -0.5745357, -0.5826916, -0.5907893, -0.5988278, -0.6068066, -0.6147246, 
-    -0.6225811, -0.6303754, -0.6381067, -0.6457741, -0.653377, -0.6609145, 
-    -0.668386, -0.6757905, -0.6831276, -0.6903963, -0.697596, -0.7047259, 
-    -0.7117853, -0.7187736, -0.72569, -0.7325338, -0.7393044, -0.746001, 
-    -0.7526231, -0.7591698, -0.7656407, -0.772035, -0.7783521, -0.7845913, 
-    -0.7907521, -0.7968339, -0.8028359, -0.8087577, -0.8145986, -0.820358, 
-    -0.8260354, -0.8316302, -0.8371418, -0.8425697, -0.8479133, -0.8531722, 
-    -0.8583457, -0.8634335, -0.8684348, -0.8733494, -0.8781766, -0.882916, 
-    -0.887567, -0.8921294, -0.8966025, -0.900986, -0.9052793, -0.9094821, 
-    -0.913594, -0.9176146, -0.9215433, -0.9253799, -0.929124, -0.9327752, 
-    -0.9363331, -0.9397973,
-  -0.9431676, -0.9464436, -0.9496249, -0.9527112, -0.9557023, -0.9585978, 
-    -0.9613975, -0.964101, -0.9667081, -0.9692186, -0.9716321, -0.9739484, 
-    -0.9761674, -0.9782887, -0.9803122, -0.9822378, -0.984065, -0.9857939, 
-    -0.9874241, -0.9889557, -0.9903883, -0.9917219, -0.9929563, -0.9940915, 
-    -0.9951273, -0.9960635, -0.9969001, -0.997637, -0.9982741, -0.9988115, 
-    -0.9992489, -0.9995865, -0.999824, -0.9999616, -0.9999992, -0.9999368, 
-    -0.9997745, -0.9995121, -0.9991497, -0.9986875, -0.9981254, -0.9974635, 
-    -0.9967018, -0.9958405, -0.9948795, -0.9938192, -0.9926594, -0.9914004, 
-    -0.9900422, -0.9885849, -0.9870289, -0.9853742, -0.9836209, -0.9817692, 
-    -0.9798194, -0.9777716, -0.975626, -0.9733829, -0.9710424, -0.9686048, 
-    -0.9660704, -0.9634393, -0.9607119, -0.9578884, -0.9549692, -0.9519544, 
-    -0.9488445, -0.9456397, -0.9423403, -0.9389467, -0.9354591, -0.9318781, 
-    -0.9282038, -0.9244367, -0.9205772, -0.9166257, -0.9125825, -0.908448, 
-    -0.9042226, -0.8999069, -0.8955011, -0.8910058, -0.8864214, -0.8817484, 
-    -0.8769872, -0.8721383, -0.8672022, -0.8621793, -0.8570703, -0.8518755, 
-    -0.8465956, -0.841231, -0.8357822, -0.8302499, -0.8246346, -0.8189368, 
-    -0.8131571, -0.8072961, -0.8013543, -0.7953325, -0.7892311, -0.7830508, 
-    -0.7767922, -0.7704558, -0.7640425, -0.7575527, -0.7509872, -0.7443466, 
-    -0.7376316, -0.7308428, -0.7239809, -0.7170466, -0.7100406, -0.7029637, 
-    -0.6958163, -0.6885995, -0.6813138, -0.6739599, -0.6665387, -0.6590508, 
-    -0.6514969,
-  -0.643878, -0.6361946, -0.6284477, -0.6206378, -0.612766, -0.6048328, 
-    -0.5968392, -0.5887859, -0.5806737, -0.5725034, -0.5642759, -0.5559919, 
-    -0.5476524, -0.5392581, -0.5308099, -0.5223086, -0.513755, -0.5051501, 
-    -0.4964947, -0.4877896, -0.4790358, -0.470234, -0.4613852, -0.4524903, 
-    -0.4435501, -0.4345656, -0.4255376, -0.4164671, -0.4073549, -0.398202, 
-    -0.3890093, -0.3797776, -0.370508, -0.3612014, -0.3518586, -0.3424806, 
-    -0.3330684, -0.3236229, -0.314145, -0.3046357, -0.2950959, -0.2855267, 
-    -0.2759288, -0.2663034, -0.2566514, -0.2469737, -0.2372712, -0.2275451, 
-    -0.2177962, -0.2080256, -0.1982341, -0.1884228, -0.1785927, -0.1687447, 
-    -0.1588798, -0.148999, -0.1391034, -0.1291938, -0.1192713, -0.1093369, 
-    -0.09939155, -0.08943626, -0.07947203, -0.06949985, -0.05952072, 
-    -0.04953564, -0.03954561, -0.02955162, -0.01955467, -0.009555776, 
-    0.0004440784, 0.01044389, 0.02044265, 0.03043937, 0.04043305, 0.05042269, 
-    0.06040728, 0.07038583, 0.08035734, 0.09032082, 0.1002753, 0.1102197, 
-    0.1201531, 0.1300745, 0.1399828, 0.1498772, 0.1597566, 0.16962, 
-    0.1794665, 0.189295, 0.1991045, 0.2088942, 0.218663, 0.2284099, 0.238134, 
-    0.2478342, 0.2575097, 0.2671594, 0.2767824, 0.2863777, 0.2959444, 
-    0.3054815, 0.3149881, 0.3244631, 0.3339057, 0.3433149, 0.3526898, 
-    0.3620294, 0.3713328, 0.3805991, 0.3898273, 0.3990166, 0.4081659, 
-    0.4172744, 0.4263412, 0.4353653, 0.444346, 0.4532822, 0.462173, 
-    0.4710177, 0.4798152,
-  0.4885648, 0.4972655, 0.5059164, 0.5145168, 0.5230657, 0.5315624, 
-    0.5400059, 0.5483953, 0.55673, 0.5650089, 0.5732314, 0.5813965, 
-    0.5895035, 0.5975516, 0.6055399, 0.6134676, 0.621334, 0.6291383, 
-    0.6368796, 0.6445573, 0.6521705, 0.6597185, 0.6672005, 0.6746158, 
-    0.6819636, 0.6892433, 0.696454, 0.703595, 0.7106658, 0.7176654, 
-    0.7245933, 0.7314487, 0.738231, 0.7449394, 0.7515734, 0.7581322, 
-    0.7646152, 0.7710217, 0.7773512, 0.7836029, 0.7897762, 0.7958706, 
-    0.8018854, 0.80782, 0.8136737, 0.8194461, 0.8251367, 0.8307446, 
-    0.8362696, 0.8417109, 0.847068, 0.8523403, 0.8575276, 0.8626289, 
-    0.8676441, 0.8725725, 0.8774136, 0.882167, 0.8868322, 0.8914087, 
-    0.8958961, 0.9002938, 0.9046016, 0.9088188, 0.9129453, 0.9169804, 
-    0.9209238, 0.9247751, 0.9285339, 0.9321999, 0.9357727, 0.9392518, 
-    0.9426371, 0.9459282, 0.9491246, 0.952226, 0.9552323, 0.9581431, 
-    0.960958, 0.9636769, 0.9662994, 0.9688252, 0.9712542, 0.973586, 
-    0.9758205, 0.9779574, 0.9799966, 0.9819376, 0.9837806, 0.9855251, 
-    0.9871711, 0.9887184, 0.9901668, 0.9915162, 0.9927664, 0.9939173, 
-    0.994969, 0.995921, 0.9967735, 0.9975263, 0.9981794, 0.9987326, 0.999186, 
-    0.9995394, 0.9997929, 0.9999464, 0.9999999, 0.9999534, 0.999807, 
-    0.9995605, 0.9992141, 0.9987678, 0.9982216, 0.9975756, 0.9968298, 
-    0.9959843, 0.9950393, 0.9939947, 0.9928507, 0.9916075, 0.9902651 ;
-
- exp = {1, 2} ;
-}
diff --git a/ncdap_test/expected4/test.PointFile.dmp b/ncdap_test/expected4/test.PointFile.dmp
deleted file mode 100644
index abe655b..0000000
--- a/ncdap_test/expected4/test.PointFile.dmp
+++ /dev/null
@@ -1,67 +0,0 @@
-netcdf test {
-types:
-  compound Simple%20Point.LevelWritten.LevelWritten_t {
-    ubyte LevelWritten__0 ;
-  }; // Simple%20Point.LevelWritten.LevelWritten_t
-  compound Simple%20Point.LevelWritten_record_t {
-    Simple%20Point.LevelWritten.LevelWritten_t LevelWritten ;
-  }; // Simple%20Point.LevelWritten_record_t
-  Simple%20Point.LevelWritten_record_t(*) Simple%20Point.LevelWritten_t ;
-  compound Time_t {
-    double Time__0 ;
-  }; // Time_t
-  compound Concentration_t {
-    double Concentration__0 ;
-    double Concentration__1 ;
-    double Concentration__2 ;
-    double Concentration__3 ;
-  }; // Concentration_t
-  compound Species_t {
-    string Species__0 ;
-  }; // Species_t
-  compound Sensor_record_t {
-    Time_t Time ;
-    Concentration_t Concentration ;
-    Species_t Species ;
-  }; // Sensor_record_t
-  Sensor_record_t(*) Sensor_t ;
-  compound Data%20Vgroup_t {
-    Sensor_t Sensor ;
-  }; // Data%20Vgroup_t
-  compound Simple%20Point_t {
-    Simple%20Point.LevelWritten_t LevelWritten ;
-    Data%20Vgroup_t Data%20Vgroup ;
-  }; // Simple%20Point_t
-  compound FixedBuoy%20Point.LevelWritten.LevelWritten_t {
-    ubyte LevelWritten__0 ;
-  }; // FixedBuoy%20Point.LevelWritten.LevelWritten_t
-  compound FixedBuoy%20Point.LevelWritten_record_t {
-    FixedBuoy%20Point.LevelWritten.LevelWritten_t LevelWritten ;
-  }; // FixedBuoy%20Point.LevelWritten_record_t
-  FixedBuoy%20Point.LevelWritten_record_t(*) FixedBuoy%20Point.LevelWritten_t ;
-  compound FixedBuoy%20Point_t {
-    FixedBuoy%20Point.LevelWritten_t LevelWritten ;
-  }; // FixedBuoy%20Point_t
-  compound LevelWritten.LevelWritten_t {
-    ubyte LevelWritten__0 ;
-  }; // LevelWritten.LevelWritten_t
-  compound LevelWritten_record_t {
-    LevelWritten.LevelWritten_t LevelWritten ;
-  }; // LevelWritten_record_t
-  LevelWritten_record_t(*) LevelWritten_t ;
-  compound FloatBuoy%20Point_t {
-    LevelWritten_t LevelWritten ;
-  }; // FloatBuoy%20Point_t
-variables:
-	Simple%20Point_t Simple%20Point ;
-	FixedBuoy%20Point_t FixedBuoy%20Point ;
-	FloatBuoy%20Point_t FloatBuoy%20Point ;
-data:
-
- Simple%20Point = 
-    {{{{0}}, {{1}}, {{2}}, {{3}}, {{4}}}, {{{{1000}, {999.950000416665, 999.800006666578, 999.550033748988, 999.200106660978}, {"This is a data test string (pass 0)."}}, {{998.750260394966}, {998.200539935204, 997.55100025328, 996.801706302619, 995.952733011994}, {"This is a data test string (pass 1)."}}, {{995.004165278026}, {993.956097956697, 992.808635853866, 991.561893714788, 990.215996212637}, {"This is a data test string (pass 2)."}}, {{988.771077936042}, {987.227283375627, 985.584 [...]
-
- FixedBuoy%20Point = {{{{5}}, {{6}}, {{7}}, {{8}}, {{9}}}} ;
-
- FloatBuoy%20Point = {{{{10}}, {{11}}, {{12}}, {{13}}, {{14}}}} ;
-}
diff --git a/ncdap_test/expected4/test.an1.dmp b/ncdap_test/expected4/test.an1.dmp
deleted file mode 100644
index a6e0536..0000000
--- a/ncdap_test/expected4/test.an1.dmp
+++ /dev/null
@@ -1,2 +0,0 @@
-netcdf test {
-}
diff --git a/ncdap_test/expected4/test.dfp1.dmp b/ncdap_test/expected4/test.dfp1.dmp
deleted file mode 100644
index a6e0536..0000000
--- a/ncdap_test/expected4/test.dfp1.dmp
+++ /dev/null
@@ -1,2 +0,0 @@
-netcdf test {
-}
diff --git a/ncdap_test/expected4/test.dfr1.dmp b/ncdap_test/expected4/test.dfr1.dmp
deleted file mode 100644
index 5867186..0000000
--- a/ncdap_test/expected4/test.dfr1.dmp
+++ /dev/null
@@ -1,40 +0,0 @@
-netcdf test {
-dimensions:
-	Raster%20Image%20%230__X = 5 ;
-	Raster%20Image%20%230__Y = 6 ;
-	Raster%20Image%20%231__X = 5 ;
-	Raster%20Image%20%231__Y = 6 ;
-	Raster%20Image%20%231__comps = 3 ;
-variables:
-	ubyte Raster%20Image%20%230(Raster%20Image%20%230__Y, Raster%20Image%20%230__X) ;
-	ubyte Raster%20Image%20%231(Raster%20Image%20%231__comps, Raster%20Image%20%231__Y, Raster%20Image%20%231__X) ;
-data:
-
- Raster%20Image%20%230 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29 ;
-
- Raster%20Image%20%231 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29,
-  30, 31, 32, 33, 34,
-  35, 36, 37, 38, 39,
-  40, 41, 42, 43, 44,
-  45, 46, 47, 48, 49,
-  50, 51, 52, 53, 54,
-  55, 56, 57, 58, 59,
-  60, 61, 62, 63, 64,
-  65, 66, 67, 68, 69,
-  70, 71, 72, 73, 74,
-  75, 76, 77, 78, 79,
-  80, 81, 82, 83, 84,
-  85, 86, 87, 88, 89 ;
-}
diff --git a/ncdap_test/expected4/test.dfr2.dmp b/ncdap_test/expected4/test.dfr2.dmp
deleted file mode 100644
index a8fe8ec..0000000
--- a/ncdap_test/expected4/test.dfr2.dmp
+++ /dev/null
@@ -1,38 +0,0 @@
-netcdf test {
-dimensions:
-	Raster%20Image%20%230__X = 5 ;
-	Raster%20Image%20%230__Y = 6 ;
-	Raster%20Image%20%231__X = 5 ;
-	Raster%20Image%20%231__Y = 6 ;
-	Raster%20Image%20%232__X = 5 ;
-	Raster%20Image%20%232__Y = 6 ;
-variables:
-	ubyte Raster%20Image%20%230(Raster%20Image%20%230__Y, Raster%20Image%20%230__X) ;
-	ubyte Raster%20Image%20%231(Raster%20Image%20%231__Y, Raster%20Image%20%231__X) ;
-	ubyte Raster%20Image%20%232(Raster%20Image%20%232__Y, Raster%20Image%20%232__X) ;
-data:
-
- Raster%20Image%20%230 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29 ;
-
- Raster%20Image%20%231 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29 ;
-
- Raster%20Image%20%232 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29 ;
-}
diff --git a/ncdap_test/expected4/test.dfr3.dmp b/ncdap_test/expected4/test.dfr3.dmp
deleted file mode 100644
index e57884b..0000000
--- a/ncdap_test/expected4/test.dfr3.dmp
+++ /dev/null
@@ -1,29 +0,0 @@
-netcdf test {
-dimensions:
-	Raster%20Image%20%230__X = 5 ;
-	Raster%20Image%20%230__Y = 6 ;
-	Raster%20Image%20%230__comps = 3 ;
-variables:
-	ubyte Raster%20Image%20%230(Raster%20Image%20%230__comps, Raster%20Image%20%230__Y, Raster%20Image%20%230__X) ;
-data:
-
- Raster%20Image%20%230 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29,
-  30, 31, 32, 33, 34,
-  35, 36, 37, 38, 39,
-  40, 41, 42, 43, 44,
-  45, 46, 47, 48, 49,
-  50, 51, 52, 53, 54,
-  55, 56, 57, 58, 59,
-  60, 61, 62, 63, 64,
-  65, 66, 67, 68, 69,
-  70, 71, 72, 73, 74,
-  75, 76, 77, 78, 79,
-  80, 81, 82, 83, 84,
-  85, 86, 87, 88, 89 ;
-}
diff --git a/ncdap_test/expected4/test.gr1.dmp b/ncdap_test/expected4/test.gr1.dmp
deleted file mode 100644
index b08f5fb..0000000
--- a/ncdap_test/expected4/test.gr1.dmp
+++ /dev/null
@@ -1,177 +0,0 @@
-netcdf test {
-dimensions:
-	GR_DFNT_CHAR8__X = 5 ;
-	GR_DFNT_CHAR8__Y = 5 ;
-	GR_DFNT_CHAR8__comps = 3 ;
-	GR_DFNT_FLOAT32__X = 7 ;
-	GR_DFNT_FLOAT32__Y = 4 ;
-	GR_DFNT_FLOAT32__comps = 3 ;
-	GR_DFNT_FLOAT64__X = 7 ;
-	GR_DFNT_FLOAT64__Y = 4 ;
-	GR_DFNT_INT16__X = 5 ;
-	GR_DFNT_INT16__Y = 5 ;
-	GR_DFNT_INT16__comps = 2 ;
-	GR_DFNT_INT32__X = 5 ;
-	GR_DFNT_INT32__Y = 5 ;
-	GR_DFNT_INT8__X = 5 ;
-	GR_DFNT_INT8__Y = 5 ;
-	GR_DFNT_INT8__comps = 2 ;
-	GR_DFNT_UCHAR8__X = 3 ;
-	GR_DFNT_UCHAR8__Y = 5 ;
-	GR_DFNT_UCHAR8__comps = 3 ;
-	GR_DFNT_UINT16__X = 3 ;
-	GR_DFNT_UINT16__Y = 3 ;
-	GR_DFNT_UINT16__comps = 3 ;
-	GR_DFNT_UINT32__X = 3 ;
-	GR_DFNT_UINT32__Y = 3 ;
-	GR_DFNT_UINT32__comps = 3 ;
-	GR_DFNT_UINT8__X = 3 ;
-	GR_DFNT_UINT8__Y = 3 ;
-	GR_DFNT_UINT8__comps = 3 ;
-variables:
-	int GR_DFNT_INT32(GR_DFNT_INT32__Y, GR_DFNT_INT32__X) ;
-	uint GR_DFNT_UINT32(GR_DFNT_UINT32__comps, GR_DFNT_UINT32__Y, GR_DFNT_UINT32__X) ;
-	int GR_DFNT_INT16(GR_DFNT_INT16__comps, GR_DFNT_INT16__Y, GR_DFNT_INT16__X) ;
-	uint GR_DFNT_UINT16(GR_DFNT_UINT16__comps, GR_DFNT_UINT16__Y, GR_DFNT_UINT16__X) ;
-	int GR_DFNT_INT8(GR_DFNT_INT8__comps, GR_DFNT_INT8__Y, GR_DFNT_INT8__X) ;
-	ubyte GR_DFNT_UINT8(GR_DFNT_UINT8__comps, GR_DFNT_UINT8__Y, GR_DFNT_UINT8__X) ;
-	double GR_DFNT_FLOAT32(GR_DFNT_FLOAT32__comps, GR_DFNT_FLOAT32__Y, GR_DFNT_FLOAT32__X) ;
-	double GR_DFNT_FLOAT64(GR_DFNT_FLOAT64__Y, GR_DFNT_FLOAT64__X) ;
-	ubyte GR_DFNT_CHAR8(GR_DFNT_CHAR8__comps, GR_DFNT_CHAR8__Y, GR_DFNT_CHAR8__X) ;
-	ubyte GR_DFNT_UCHAR8(GR_DFNT_UCHAR8__comps, GR_DFNT_UCHAR8__Y, GR_DFNT_UCHAR8__X) ;
-data:
-
- GR_DFNT_INT32 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152 ;
-
- GR_DFNT_UINT32 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT16 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT16 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT8 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26 ;
-
- GR_DFNT_FLOAT32 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891,
-  0.961055438310771, 0.958243875512697, 0.955336489125606, 0.952333569885713, 
-    0.949235418082441, 0.946042343528387, 0.942754665528346,
-  0.939372712847379, 0.935896823677935, 0.932327345606034, 0.92866463557651, 
-    0.924909059857313, 0.921060994002885, 0.917120822816605,
-  0.913088940312308, 0.908965749674885, 0.904751663219963, 0.900447102352677, 
-    0.896052497525525, 0.891568288195329, 0.886994922779284,
-  0.882332858610121, 0.877582561890373, 0.872744507645751, 0.86781917967765, 
-    0.862807070514761, 0.857708681363824, 0.852524522059506,
-  0.847255111013416, 0.841900975162269, 0.836462649915187, 0.830940679100164, 
-    0.825335614909678, 0.819648017845479, 0.813878456662534,
-  0.808027508312152, 0.802095757884293, 0.796083798549056, 0.789992231497365, 
-    0.783821665880849, 0.777572718750928, 0.771246014997107,
-  0.764842187284488, 0.758361875990508, 0.751805729140895, 0.74517440234487, 
-    0.738468558729588, 0.731688868873821, 0.724836010740905,
-  0.717910669610943, 0.710913538012277, 0.703845315652236, 0.696706709347165, 
-    0.689498432951747, 0.682221207287614, 0.674875760071267 ;
-
- GR_DFNT_FLOAT64 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891 ;
-
- GR_DFNT_CHAR8 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29,
-  30, 31, 32, 33, 34,
-  35, 36, 37, 38, 39,
-  40, 41, 42, 43, 44,
-  45, 46, 47, 48, 49,
-  50, 51, 52, 53, 54,
-  55, 56, 57, 58, 59,
-  60, 61, 62, 63, 64,
-  65, 66, 67, 68, 69,
-  70, 71, 72, 73, 74 ;
-
- GR_DFNT_UCHAR8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26,
-  27, 28, 29,
-  30, 31, 32,
-  33, 34, 35,
-  36, 37, 38,
-  39, 40, 41,
-  42, 43, 44 ;
-}
diff --git a/ncdap_test/expected4/test.gr2.dmp b/ncdap_test/expected4/test.gr2.dmp
deleted file mode 100644
index 025acf7..0000000
--- a/ncdap_test/expected4/test.gr2.dmp
+++ /dev/null
@@ -1,355 +0,0 @@
-netcdf test {
-dimensions:
-	GR_16__X = 5 ;
-	GR_16__Y = 5 ;
-	GR_16__comps = 16 ;
-	GR_1__X = 5 ;
-	GR_1__Y = 5 ;
-	GR_2__X = 5 ;
-	GR_2__Y = 5 ;
-	GR_2__comps = 2 ;
-	GR_32__X = 5 ;
-	GR_32__Y = 5 ;
-	GR_32__comps = 32 ;
-	GR_4__X = 5 ;
-	GR_4__Y = 5 ;
-	GR_4__comps = 4 ;
-	GR_8__X = 5 ;
-	GR_8__Y = 5 ;
-	GR_8__comps = 8 ;
-variables:
-	int GR_1(GR_1__Y, GR_1__X) ;
-	int GR_2(GR_2__comps, GR_2__Y, GR_2__X) ;
-	int GR_4(GR_4__comps, GR_4__Y, GR_4__X) ;
-	int GR_8(GR_8__comps, GR_8__Y, GR_8__X) ;
-	int GR_16(GR_16__comps, GR_16__Y, GR_16__X) ;
-	int GR_32(GR_32__comps, GR_32__Y, GR_32__X) ;
-data:
-
- GR_1 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152 ;
-
- GR_2 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_4 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752 ;
-
- GR_8 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752,
-  204800, 206848, 208896, 210944, 212992,
-  215040, 217088, 219136, 221184, 223232,
-  225280, 227328, 229376, 231424, 233472,
-  235520, 237568, 239616, 241664, 243712,
-  245760, 247808, 249856, 251904, 253952,
-  256000, 258048, 260096, 262144, 264192,
-  266240, 268288, 270336, 272384, 274432,
-  276480, 278528, 280576, 282624, 284672,
-  286720, 288768, 290816, 292864, 294912,
-  296960, 299008, 301056, 303104, 305152,
-  307200, 309248, 311296, 313344, 315392,
-  317440, 319488, 321536, 323584, 325632,
-  327680, 329728, 331776, 333824, 335872,
-  337920, 339968, 342016, 344064, 346112,
-  348160, 350208, 352256, 354304, 356352,
-  358400, 360448, 362496, 364544, 366592,
-  368640, 370688, 372736, 374784, 376832,
-  378880, 380928, 382976, 385024, 387072,
-  389120, 391168, 393216, 395264, 397312,
-  399360, 401408, 403456, 405504, 407552 ;
-
- GR_16 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752,
-  204800, 206848, 208896, 210944, 212992,
-  215040, 217088, 219136, 221184, 223232,
-  225280, 227328, 229376, 231424, 233472,
-  235520, 237568, 239616, 241664, 243712,
-  245760, 247808, 249856, 251904, 253952,
-  256000, 258048, 260096, 262144, 264192,
-  266240, 268288, 270336, 272384, 274432,
-  276480, 278528, 280576, 282624, 284672,
-  286720, 288768, 290816, 292864, 294912,
-  296960, 299008, 301056, 303104, 305152,
-  307200, 309248, 311296, 313344, 315392,
-  317440, 319488, 321536, 323584, 325632,
-  327680, 329728, 331776, 333824, 335872,
-  337920, 339968, 342016, 344064, 346112,
-  348160, 350208, 352256, 354304, 356352,
-  358400, 360448, 362496, 364544, 366592,
-  368640, 370688, 372736, 374784, 376832,
-  378880, 380928, 382976, 385024, 387072,
-  389120, 391168, 393216, 395264, 397312,
-  399360, 401408, 403456, 405504, 407552,
-  409600, 411648, 413696, 415744, 417792,
-  419840, 421888, 423936, 425984, 428032,
-  430080, 432128, 434176, 436224, 438272,
-  440320, 442368, 444416, 446464, 448512,
-  450560, 452608, 454656, 456704, 458752,
-  460800, 462848, 464896, 466944, 468992,
-  471040, 473088, 475136, 477184, 479232,
-  481280, 483328, 485376, 487424, 489472,
-  491520, 493568, 495616, 497664, 499712,
-  501760, 503808, 505856, 507904, 509952,
-  512000, 514048, 516096, 518144, 520192,
-  522240, 524288, 526336, 528384, 530432,
-  532480, 534528, 536576, 538624, 540672,
-  542720, 544768, 546816, 548864, 550912,
-  552960, 555008, 557056, 559104, 561152,
-  563200, 565248, 567296, 569344, 571392,
-  573440, 575488, 577536, 579584, 581632,
-  583680, 585728, 587776, 589824, 591872,
-  593920, 595968, 598016, 600064, 602112,
-  604160, 606208, 608256, 610304, 612352,
-  614400, 616448, 618496, 620544, 622592,
-  624640, 626688, 628736, 630784, 632832,
-  634880, 636928, 638976, 641024, 643072,
-  645120, 647168, 649216, 651264, 653312,
-  655360, 657408, 659456, 661504, 663552,
-  665600, 667648, 669696, 671744, 673792,
-  675840, 677888, 679936, 681984, 684032,
-  686080, 688128, 690176, 692224, 694272,
-  696320, 698368, 700416, 702464, 704512,
-  706560, 708608, 710656, 712704, 714752,
-  716800, 718848, 720896, 722944, 724992,
-  727040, 729088, 731136, 733184, 735232,
-  737280, 739328, 741376, 743424, 745472,
-  747520, 749568, 751616, 753664, 755712,
-  757760, 759808, 761856, 763904, 765952,
-  768000, 770048, 772096, 774144, 776192,
-  778240, 780288, 782336, 784384, 786432,
-  788480, 790528, 792576, 794624, 796672,
-  798720, 800768, 802816, 804864, 806912,
-  808960, 811008, 813056, 815104, 817152 ;
-
- GR_32 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752,
-  204800, 206848, 208896, 210944, 212992,
-  215040, 217088, 219136, 221184, 223232,
-  225280, 227328, 229376, 231424, 233472,
-  235520, 237568, 239616, 241664, 243712,
-  245760, 247808, 249856, 251904, 253952,
-  256000, 258048, 260096, 262144, 264192,
-  266240, 268288, 270336, 272384, 274432,
-  276480, 278528, 280576, 282624, 284672,
-  286720, 288768, 290816, 292864, 294912,
-  296960, 299008, 301056, 303104, 305152,
-  307200, 309248, 311296, 313344, 315392,
-  317440, 319488, 321536, 323584, 325632,
-  327680, 329728, 331776, 333824, 335872,
-  337920, 339968, 342016, 344064, 346112,
-  348160, 350208, 352256, 354304, 356352,
-  358400, 360448, 362496, 364544, 366592,
-  368640, 370688, 372736, 374784, 376832,
-  378880, 380928, 382976, 385024, 387072,
-  389120, 391168, 393216, 395264, 397312,
-  399360, 401408, 403456, 405504, 407552,
-  409600, 411648, 413696, 415744, 417792,
-  419840, 421888, 423936, 425984, 428032,
-  430080, 432128, 434176, 436224, 438272,
-  440320, 442368, 444416, 446464, 448512,
-  450560, 452608, 454656, 456704, 458752,
-  460800, 462848, 464896, 466944, 468992,
-  471040, 473088, 475136, 477184, 479232,
-  481280, 483328, 485376, 487424, 489472,
-  491520, 493568, 495616, 497664, 499712,
-  501760, 503808, 505856, 507904, 509952,
-  512000, 514048, 516096, 518144, 520192,
-  522240, 524288, 526336, 528384, 530432,
-  532480, 534528, 536576, 538624, 540672,
-  542720, 544768, 546816, 548864, 550912,
-  552960, 555008, 557056, 559104, 561152,
-  563200, 565248, 567296, 569344, 571392,
-  573440, 575488, 577536, 579584, 581632,
-  583680, 585728, 587776, 589824, 591872,
-  593920, 595968, 598016, 600064, 602112,
-  604160, 606208, 608256, 610304, 612352,
-  614400, 616448, 618496, 620544, 622592,
-  624640, 626688, 628736, 630784, 632832,
-  634880, 636928, 638976, 641024, 643072,
-  645120, 647168, 649216, 651264, 653312,
-  655360, 657408, 659456, 661504, 663552,
-  665600, 667648, 669696, 671744, 673792,
-  675840, 677888, 679936, 681984, 684032,
-  686080, 688128, 690176, 692224, 694272,
-  696320, 698368, 700416, 702464, 704512,
-  706560, 708608, 710656, 712704, 714752,
-  716800, 718848, 720896, 722944, 724992,
-  727040, 729088, 731136, 733184, 735232,
-  737280, 739328, 741376, 743424, 745472,
-  747520, 749568, 751616, 753664, 755712,
-  757760, 759808, 761856, 763904, 765952,
-  768000, 770048, 772096, 774144, 776192,
-  778240, 780288, 782336, 784384, 786432,
-  788480, 790528, 792576, 794624, 796672,
-  798720, 800768, 802816, 804864, 806912,
-  808960, 811008, 813056, 815104, 817152,
-  819200, 821248, 823296, 825344, 827392,
-  829440, 831488, 833536, 835584, 837632,
-  839680, 841728, 843776, 845824, 847872,
-  849920, 851968, 854016, 856064, 858112,
-  860160, 862208, 864256, 866304, 868352,
-  870400, 872448, 874496, 876544, 878592,
-  880640, 882688, 884736, 886784, 888832,
-  890880, 892928, 894976, 897024, 899072,
-  901120, 903168, 905216, 907264, 909312,
-  911360, 913408, 915456, 917504, 919552,
-  921600, 923648, 925696, 927744, 929792,
-  931840, 933888, 935936, 937984, 940032,
-  942080, 944128, 946176, 948224, 950272,
-  952320, 954368, 956416, 958464, 960512,
-  962560, 964608, 966656, 968704, 970752,
-  972800, 974848, 976896, 978944, 980992,
-  983040, 985088, 987136, 989184, 991232,
-  993280, 995328, 997376, 999424, 1001472,
-  1003520, 1005568, 1007616, 1009664, 1011712,
-  1013760, 1015808, 1017856, 1019904, 1021952,
-  1024000, 1026048, 1028096, 1030144, 1032192,
-  1034240, 1036288, 1038336, 1040384, 1042432,
-  1044480, 1046528, 1048576, 1050624, 1052672,
-  1054720, 1056768, 1058816, 1060864, 1062912,
-  1064960, 1067008, 1069056, 1071104, 1073152,
-  1075200, 1077248, 1079296, 1081344, 1083392,
-  1085440, 1087488, 1089536, 1091584, 1093632,
-  1095680, 1097728, 1099776, 1101824, 1103872,
-  1105920, 1107968, 1110016, 1112064, 1114112,
-  1116160, 1118208, 1120256, 1122304, 1124352,
-  1126400, 1128448, 1130496, 1132544, 1134592,
-  1136640, 1138688, 1140736, 1142784, 1144832,
-  1146880, 1148928, 1150976, 1153024, 1155072,
-  1157120, 1159168, 1161216, 1163264, 1165312,
-  1167360, 1169408, 1171456, 1173504, 1175552,
-  1177600, 1179648, 1181696, 1183744, 1185792,
-  1187840, 1189888, 1191936, 1193984, 1196032,
-  1198080, 1200128, 1202176, 1204224, 1206272,
-  1208320, 1210368, 1212416, 1214464, 1216512,
-  1218560, 1220608, 1222656, 1224704, 1226752,
-  1228800, 1230848, 1232896, 1234944, 1236992,
-  1239040, 1241088, 1243136, 1245184, 1247232,
-  1249280, 1251328, 1253376, 1255424, 1257472,
-  1259520, 1261568, 1263616, 1265664, 1267712,
-  1269760, 1271808, 1273856, 1275904, 1277952,
-  1280000, 1282048, 1284096, 1286144, 1288192,
-  1290240, 1292288, 1294336, 1296384, 1298432,
-  1300480, 1302528, 1304576, 1306624, 1308672,
-  1310720, 1312768, 1314816, 1316864, 1318912,
-  1320960, 1323008, 1325056, 1327104, 1329152,
-  1331200, 1333248, 1335296, 1337344, 1339392,
-  1341440, 1343488, 1345536, 1347584, 1349632,
-  1351680, 1353728, 1355776, 1357824, 1359872,
-  1361920, 1363968, 1366016, 1368064, 1370112,
-  1372160, 1374208, 1376256, 1378304, 1380352,
-  1382400, 1384448, 1386496, 1388544, 1390592,
-  1392640, 1394688, 1396736, 1398784, 1400832,
-  1402880, 1404928, 1406976, 1409024, 1411072,
-  1413120, 1415168, 1417216, 1419264, 1421312,
-  1423360, 1425408, 1427456, 1429504, 1431552,
-  1433600, 1435648, 1437696, 1439744, 1441792,
-  1443840, 1445888, 1447936, 1449984, 1452032,
-  1454080, 1456128, 1458176, 1460224, 1462272,
-  1464320, 1466368, 1468416, 1470464, 1472512,
-  1474560, 1476608, 1478656, 1480704, 1482752,
-  1484800, 1486848, 1488896, 1490944, 1492992,
-  1495040, 1497088, 1499136, 1501184, 1503232,
-  1505280, 1507328, 1509376, 1511424, 1513472,
-  1515520, 1517568, 1519616, 1521664, 1523712,
-  1525760, 1527808, 1529856, 1531904, 1533952,
-  1536000, 1538048, 1540096, 1542144, 1544192,
-  1546240, 1548288, 1550336, 1552384, 1554432,
-  1556480, 1558528, 1560576, 1562624, 1564672,
-  1566720, 1568768, 1570816, 1572864, 1574912,
-  1576960, 1579008, 1581056, 1583104, 1585152,
-  1587200, 1589248, 1591296, 1593344, 1595392,
-  1597440, 1599488, 1601536, 1603584, 1605632,
-  1607680, 1609728, 1611776, 1613824, 1615872,
-  1617920, 1619968, 1622016, 1624064, 1626112,
-  1628160, 1630208, 1632256, 1634304, 1636352 ;
-}
diff --git a/ncdap_test/expected4/test.gr3.dmp b/ncdap_test/expected4/test.gr3.dmp
deleted file mode 100644
index d2e0705..0000000
--- a/ncdap_test/expected4/test.gr3.dmp
+++ /dev/null
@@ -1,68 +0,0 @@
-netcdf test {
-dimensions:
-	GR_Component__X = 5 ;
-	GR_Component__Y = 5 ;
-	GR_Component__comps = 3 ;
-	GR_Line__X = 5 ;
-	GR_Line__Y = 5 ;
-	GR_Line__comps = 3 ;
-	GR_Pixel__X = 5 ;
-	GR_Pixel__Y = 5 ;
-	GR_Pixel__comps = 3 ;
-variables:
-	int GR_Pixel(GR_Pixel__comps, GR_Pixel__Y, GR_Pixel__X) ;
-	int GR_Line(GR_Line__comps, GR_Line__Y, GR_Line__X) ;
-	int GR_Component(GR_Component__comps, GR_Component__Y, GR_Component__X) ;
-data:
-
- GR_Pixel =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-
- GR_Line =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-
- GR_Component =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-}
diff --git a/ncdap_test/expected4/test.gr4.dmp b/ncdap_test/expected4/test.gr4.dmp
deleted file mode 100644
index d86942b..0000000
--- a/ncdap_test/expected4/test.gr4.dmp
+++ /dev/null
@@ -1,26 +0,0 @@
-netcdf test {
-dimensions:
-	GR_Palette__X = 5 ;
-	GR_Palette__Y = 5 ;
-	GR_Palette__comps = 3 ;
-variables:
-	int GR_Palette(GR_Palette__comps, GR_Palette__Y, GR_Palette__X) ;
-data:
-
- GR_Palette =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-}
diff --git a/ncdap_test/expected4/test.gr5.dmp b/ncdap_test/expected4/test.gr5.dmp
deleted file mode 100644
index b08f5fb..0000000
--- a/ncdap_test/expected4/test.gr5.dmp
+++ /dev/null
@@ -1,177 +0,0 @@
-netcdf test {
-dimensions:
-	GR_DFNT_CHAR8__X = 5 ;
-	GR_DFNT_CHAR8__Y = 5 ;
-	GR_DFNT_CHAR8__comps = 3 ;
-	GR_DFNT_FLOAT32__X = 7 ;
-	GR_DFNT_FLOAT32__Y = 4 ;
-	GR_DFNT_FLOAT32__comps = 3 ;
-	GR_DFNT_FLOAT64__X = 7 ;
-	GR_DFNT_FLOAT64__Y = 4 ;
-	GR_DFNT_INT16__X = 5 ;
-	GR_DFNT_INT16__Y = 5 ;
-	GR_DFNT_INT16__comps = 2 ;
-	GR_DFNT_INT32__X = 5 ;
-	GR_DFNT_INT32__Y = 5 ;
-	GR_DFNT_INT8__X = 5 ;
-	GR_DFNT_INT8__Y = 5 ;
-	GR_DFNT_INT8__comps = 2 ;
-	GR_DFNT_UCHAR8__X = 3 ;
-	GR_DFNT_UCHAR8__Y = 5 ;
-	GR_DFNT_UCHAR8__comps = 3 ;
-	GR_DFNT_UINT16__X = 3 ;
-	GR_DFNT_UINT16__Y = 3 ;
-	GR_DFNT_UINT16__comps = 3 ;
-	GR_DFNT_UINT32__X = 3 ;
-	GR_DFNT_UINT32__Y = 3 ;
-	GR_DFNT_UINT32__comps = 3 ;
-	GR_DFNT_UINT8__X = 3 ;
-	GR_DFNT_UINT8__Y = 3 ;
-	GR_DFNT_UINT8__comps = 3 ;
-variables:
-	int GR_DFNT_INT32(GR_DFNT_INT32__Y, GR_DFNT_INT32__X) ;
-	uint GR_DFNT_UINT32(GR_DFNT_UINT32__comps, GR_DFNT_UINT32__Y, GR_DFNT_UINT32__X) ;
-	int GR_DFNT_INT16(GR_DFNT_INT16__comps, GR_DFNT_INT16__Y, GR_DFNT_INT16__X) ;
-	uint GR_DFNT_UINT16(GR_DFNT_UINT16__comps, GR_DFNT_UINT16__Y, GR_DFNT_UINT16__X) ;
-	int GR_DFNT_INT8(GR_DFNT_INT8__comps, GR_DFNT_INT8__Y, GR_DFNT_INT8__X) ;
-	ubyte GR_DFNT_UINT8(GR_DFNT_UINT8__comps, GR_DFNT_UINT8__Y, GR_DFNT_UINT8__X) ;
-	double GR_DFNT_FLOAT32(GR_DFNT_FLOAT32__comps, GR_DFNT_FLOAT32__Y, GR_DFNT_FLOAT32__X) ;
-	double GR_DFNT_FLOAT64(GR_DFNT_FLOAT64__Y, GR_DFNT_FLOAT64__X) ;
-	ubyte GR_DFNT_CHAR8(GR_DFNT_CHAR8__comps, GR_DFNT_CHAR8__Y, GR_DFNT_CHAR8__X) ;
-	ubyte GR_DFNT_UCHAR8(GR_DFNT_UCHAR8__comps, GR_DFNT_UCHAR8__Y, GR_DFNT_UCHAR8__X) ;
-data:
-
- GR_DFNT_INT32 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152 ;
-
- GR_DFNT_UINT32 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT16 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT16 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT8 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26 ;
-
- GR_DFNT_FLOAT32 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891,
-  0.961055438310771, 0.958243875512697, 0.955336489125606, 0.952333569885713, 
-    0.949235418082441, 0.946042343528387, 0.942754665528346,
-  0.939372712847379, 0.935896823677935, 0.932327345606034, 0.92866463557651, 
-    0.924909059857313, 0.921060994002885, 0.917120822816605,
-  0.913088940312308, 0.908965749674885, 0.904751663219963, 0.900447102352677, 
-    0.896052497525525, 0.891568288195329, 0.886994922779284,
-  0.882332858610121, 0.877582561890373, 0.872744507645751, 0.86781917967765, 
-    0.862807070514761, 0.857708681363824, 0.852524522059506,
-  0.847255111013416, 0.841900975162269, 0.836462649915187, 0.830940679100164, 
-    0.825335614909678, 0.819648017845479, 0.813878456662534,
-  0.808027508312152, 0.802095757884293, 0.796083798549056, 0.789992231497365, 
-    0.783821665880849, 0.777572718750928, 0.771246014997107,
-  0.764842187284488, 0.758361875990508, 0.751805729140895, 0.74517440234487, 
-    0.738468558729588, 0.731688868873821, 0.724836010740905,
-  0.717910669610943, 0.710913538012277, 0.703845315652236, 0.696706709347165, 
-    0.689498432951747, 0.682221207287614, 0.674875760071267 ;
-
- GR_DFNT_FLOAT64 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891 ;
-
- GR_DFNT_CHAR8 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29,
-  30, 31, 32, 33, 34,
-  35, 36, 37, 38, 39,
-  40, 41, 42, 43, 44,
-  45, 46, 47, 48, 49,
-  50, 51, 52, 53, 54,
-  55, 56, 57, 58, 59,
-  60, 61, 62, 63, 64,
-  65, 66, 67, 68, 69,
-  70, 71, 72, 73, 74 ;
-
- GR_DFNT_UCHAR8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26,
-  27, 28, 29,
-  30, 31, 32,
-  33, 34, 35,
-  36, 37, 38,
-  39, 40, 41,
-  42, 43, 44 ;
-}
diff --git a/ncdap_test/expected4/test.nc.dmp b/ncdap_test/expected4/test.nc.dmp
deleted file mode 100644
index b0d1f5a..0000000
--- a/ncdap_test/expected4/test.nc.dmp
+++ /dev/null
@@ -1,961 +0,0 @@
-netcdf test {
-dimensions:
-	D1 = 1 ;
-	D2 = 2 ;
-	D3 = 3 ;
-	D4 = 4 ;
-	Dr = 2 ;
-variables:
-	string c ;
-	ubyte b ;
-		string b:c = "" ;
-	short s ;
-		s:b = 128UB ;
-		s:s = -32768s, 32767s ;
-	int i ;
-		i:i = -2147483648, 2147483647, -2147483648 ;
-		i:f = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f ;
-		i:d = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660. ;
-	float f ;
-	double d ;
-		string d:c = "\\200\\177AZ$&" ;
-	string cr(Dr) ;
-	ubyte br(Dr) ;
-	short sr(Dr) ;
-	int ir(Dr) ;
-	float fr(Dr) ;
-	double dr(Dr) ;
-	string c1(D1) ;
-	ubyte b1(D1) ;
-	short s1(D1) ;
-	int i1(D1) ;
-	float f1(D1) ;
-	double d1(D1) ;
-	string c2(D2) ;
-	ubyte b2(D2) ;
-	short s2(D2) ;
-	int i2(D2) ;
-	float f2(D2) ;
-	double d2(D2) ;
-	string c3(D3) ;
-	ubyte b3(D3) ;
-	short s3(D3) ;
-	int i3(D3) ;
-	float f3(D3) ;
-	double d3(D3) ;
-	string c4(D4) ;
-	ubyte b4(D4) ;
-	short s4(D4) ;
-	int i4(D4) ;
-	float f4(D4) ;
-	double d4(D4) ;
-	string cr1(Dr, D1) ;
-	ubyte br2(Dr, D2) ;
-	short sr3(Dr, D3) ;
-	int ir4(Dr, D4) ;
-	float f11(D1, D1) ;
-	double d12(D1, D2) ;
-	string c13(D1, D3) ;
-	ubyte b14(D1, D4) ;
-	short s21(D2, D1) ;
-	int i22(D2, D2) ;
-	float f23(D2, D3) ;
-	double d24(D2, D4) ;
-	string c31(D3, D1) ;
-	ubyte b32(D3, D2) ;
-	short s33(D3, D3) ;
-	int i34(D3, D4) ;
-	float f41(D4, D1) ;
-	double d42(D4, D2) ;
-	string c43(D4, D3) ;
-	ubyte b44(D4, D4) ;
-	short sr11(Dr, D1, D1) ;
-	int ir12(Dr, D1, D2) ;
-	float fr13(Dr, D1, D3) ;
-	double dr14(Dr, D1, D4) ;
-	string cr21(Dr, D2, D1) ;
-	ubyte br22(Dr, D2, D2) ;
-	short sr23(Dr, D2, D3) ;
-	int ir24(Dr, D2, D4) ;
-	float fr31(Dr, D3, D1) ;
-	double dr32(Dr, D3, D2) ;
-	string cr33(Dr, D3, D3) ;
-	ubyte br34(Dr, D3, D4) ;
-	short sr41(Dr, D4, D1) ;
-	int ir42(Dr, D4, D2) ;
-	float fr43(Dr, D4, D3) ;
-	double dr44(Dr, D4, D4) ;
-	string c111(D1, D1, D1) ;
-	ubyte b112(D1, D1, D2) ;
-	short s113(D1, D1, D3) ;
-	int i114(D1, D1, D4) ;
-	float f121(D1, D2, D1) ;
-	double d122(D1, D2, D2) ;
-	string c123(D1, D2, D3) ;
-	ubyte b124(D1, D2, D4) ;
-	short s131(D1, D3, D1) ;
-	int i132(D1, D3, D2) ;
-	float f133(D1, D3, D3) ;
-	double d134(D1, D3, D4) ;
-	string c141(D1, D4, D1) ;
-	ubyte b142(D1, D4, D2) ;
-	short s143(D1, D4, D3) ;
-	int i144(D1, D4, D4) ;
-	float f211(D2, D1, D1) ;
-	double d212(D2, D1, D2) ;
-	string c213(D2, D1, D3) ;
-	ubyte b214(D2, D1, D4) ;
-	short s221(D2, D2, D1) ;
-	int i222(D2, D2, D2) ;
-	float f223(D2, D2, D3) ;
-	double d224(D2, D2, D4) ;
-	string c231(D2, D3, D1) ;
-	ubyte b232(D2, D3, D2) ;
-	short s233(D2, D3, D3) ;
-	int i234(D2, D3, D4) ;
-	float f241(D2, D4, D1) ;
-	double d242(D2, D4, D2) ;
-	string c243(D2, D4, D3) ;
-	ubyte b244(D2, D4, D4) ;
-	short s311(D3, D1, D1) ;
-	int i312(D3, D1, D2) ;
-	float f313(D3, D1, D3) ;
-	double d314(D3, D1, D4) ;
-	string c321(D3, D2, D1) ;
-	ubyte b322(D3, D2, D2) ;
-	short s323(D3, D2, D3) ;
-	int i324(D3, D2, D4) ;
-	float f331(D3, D3, D1) ;
-	double d332(D3, D3, D2) ;
-	string c333(D3, D3, D3) ;
-	ubyte b334(D3, D3, D4) ;
-	short s341(D3, D4, D1) ;
-	int i342(D3, D4, D2) ;
-	float f343(D3, D4, D3) ;
-	double d344(D3, D4, D4) ;
-	string c411(D4, D1, D1) ;
-	ubyte b412(D4, D1, D2) ;
-	short s413(D4, D1, D3) ;
-	int i414(D4, D1, D4) ;
-	float f421(D4, D2, D1) ;
-	double d422(D4, D2, D2) ;
-	string c423(D4, D2, D3) ;
-	ubyte b424(D4, D2, D4) ;
-	short s431(D4, D3, D1) ;
-	int i432(D4, D3, D2) ;
-	float f433(D4, D3, D3) ;
-	double d434(D4, D3, D4) ;
-	string c441(D4, D4, D1) ;
-	ubyte b442(D4, D4, D2) ;
-	short s443(D4, D4, D3) ;
-	int i444(D4, D4, D4) ;
-
-// global attributes:
-		string :Gc = "\\200" ;
-		:Gb = 128UB, 127UB ;
-		:Gs = -32768s, 32767s, 32767s ;
-		:Gi = -2147483648, 2147483647, -2147483648, 2147483647 ;
-		:Gf = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f, 531.f ;
-		:Gd = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660., 650. ;
-data:
-
- c = "" ;
-
- b = 254 ;
-
- s = -5 ;
-
- i = -20 ;
-
- f = -9 ;
-
- d = -10 ;
-
- cr = "�", "" ;
-
- br = 128, 127 ;
-
- sr = -32768, 32767 ;
-
- ir = -2147483648, 2147483647 ;
-
- fr = -3.402823e+38, 3.402823e+38 ;
-
- dr = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- c1 = "�" ;
-
- b1 = 128 ;
-
- s1 = -32768 ;
-
- i1 = -2147483648 ;
-
- f1 = -3.402823e+38 ;
-
- d1 = -1.79769313486232e+308 ;
-
- c2 = "�", "" ;
-
- b2 = 128, 127 ;
-
- s2 = -32768, 32767 ;
-
- i2 = -2147483648, 2147483647 ;
-
- f2 = -3.402823e+38, 3.402823e+38 ;
-
- d2 = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- c3 = "�", "", "A" ;
-
- b3 = 128, 127, 127 ;
-
- s3 = -32768, 32767, 32767 ;
-
- i3 = -2147483648, 2147483647, -2147483648 ;
-
- f3 = -3.402823e+38, 3.402823e+38, -3.402823e+38 ;
-
- d3 = -1.79769313486232e+308, 1.79769313486232e+308, -1 ;
-
- c4 = "�", "", "A", "Z" ;
-
- b4 = 128, 127, 127, 128 ;
-
- s4 = -32768, 32767, 32767, -32768 ;
-
- i4 = -2147483648, 2147483647, -2147483648, 2147483647 ;
-
- f4 = -3.402823e+38, 3.402823e+38, -3.402823e+38, 3.402823e+38 ;
-
- d4 = -1.79769313486232e+308, 1.79769313486232e+308, -1, 1 ;
-
- cr1 =
-  "",
-  "
" ;
-
- br2 =
-  232, 230,
-  236, 234 ;
-
- sr3 =
-  -375, -380, -385,
-  -350, -355, -360 ;
-
- ir4 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660 ;
-
- f11 =
-  -2187 ;
-
- d12 =
-  -3000, -3010 ;
-
- c13 =
-  "", "", "
" ;
-
- b14 =
-  232, 230, 228, 226 ;
-
- s21 =
-  -375,
-  -350 ;
-
- i22 =
-  -24000, -24020,
-  -23600, -23620 ;
-
- f23 =
-  -2187, -2196, -2205,
-  -2106, -2115, -2124 ;
-
- d24 =
-  -3000, -3010, -3020, -3030,
-  -2900, -2910, -2920, -2930 ;
-
- c31 =
-  "",
-  "
",
-  " " ;
-
- b32 =
-  232, 230,
-  236, 234,
-  240, 238 ;
-
- s33 =
-  -375, -380, -385,
-  -350, -355, -360,
-  -325, -330, -335 ;
-
- i34 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660,
-  -23200, -23220, -23240, -23260 ;
-
- f41 =
-  -2187,
-  -2106,
-  -2025,
-  -1944 ;
-
- d42 =
-  -3000, -3010,
-  -2900, -2910,
-  -2800, -2810,
-  -2700, -2710 ;
-
- c43 =
-  "", "", "
",
-  "
", "
", " ",
-  " ", """, "$",
-  "$", "&", "(" ;
-
- b44 =
-  232, 230, 228, 226,
-  236, 234, 232, 230,
-  240, 238, 236, 234,
-  244, 242, 240, 238 ;
-
- sr11 =
-  2500,
-  2375 ;
-
- ir12 =
-  640000, 639980,
-  632000, 631980 ;
-
- fr13 =
-  26244, 26235, 26226,
-  25515, 25506, 25497 ;
-
- dr14 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970 ;
-
- cr21 =
-  "@",
-  "D",
-  "H",
-  "L" ;
-
- br22 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58 ;
-
- sr23 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390 ;
-
- ir24 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340 ;
-
- fr31 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677 ;
-
- dr32 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190 ;
-
- cr33 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T" ;
-
- br34 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58 ;
-
- sr41 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450 ;
-
- ir42 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180 ;
-
- fr43 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740 ;
-
- dr44 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270 ;
-
- c111 =
-  "@" ;
-
- b112 =
-  64, 62 ;
-
- s113 =
-  2500, 2495, 2490 ;
-
- i114 =
-  640000, 639980, 639960, 639940 ;
-
- f121 =
-  26244,
-  26325 ;
-
- d122 =
-  40000, 39990,
-  40100, 40090 ;
-
- c123 =
-  "@", "B", "D",
-  "D", "F", "H" ;
-
- b124 =
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s131 =
-  2500,
-  2525,
-  2550 ;
-
- i132 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780 ;
-
- f133 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388 ;
-
- d134 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170 ;
-
- c141 =
-  "@",
-  "D",
-  "H",
-  "L" ;
-
- b142 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74 ;
-
- s143 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565 ;
-
- i144 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140 ;
-
- f211 =
-  26244,
-  25515 ;
-
- d212 =
-  40000, 39990,
-  39000, 38990 ;
-
- c213 =
-  "@", "B", "D",
-  "H", "J", "L" ;
-
- b214 =
-  64, 62, 60, 58,
-  56, 54, 52, 50 ;
-
- s221 =
-  2500,
-  2525,
-  2375,
-  2400 ;
-
- i222 =
-  640000, 639980,
-  640400, 640380,
-  632000, 631980,
-  632400, 632380 ;
-
- f223 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  25515, 25506, 25497,
-  25596, 25587, 25578 ;
-
- d224 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070 ;
-
- c231 =
-  "@",
-  "D",
-  "H",
-  "H",
-  "L",
-  "P" ;
-
- b232 =
-  64, 62,
-  68, 66,
-  72, 70,
-  56, 54,
-  60, 58,
-  64, 62 ;
-
- s233 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415 ;
-
- i234 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740 ;
-
- f241 =
-  26244,
-  26325,
-  26406,
-  26487,
-  25515,
-  25596,
-  25677,
-  25758 ;
-
- d242 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  40300, 40290,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  39300, 39290 ;
-
- c243 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "L", "N", "P",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T",
-  "T", "V", "X" ;
-
- b244 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  76, 74, 72, 70,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s311 =
-  2500,
-  2375,
-  2250 ;
-
- i312 =
-  640000, 639980,
-  632000, 631980,
-  624000, 623980 ;
-
- f313 =
-  26244, 26235, 26226,
-  25515, 25506, 25497,
-  24786, 24777, 24768 ;
-
- d314 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970,
-  38000, 37990, 37980, 37970 ;
-
- c321 =
-  "@",
-  "D",
-  "H",
-  "L",
-  "P",
-  "T" ;
-
- b322 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58,
-  48, 46,
-  52, 50 ;
-
- s323 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2250, 2245, 2240,
-  2275, 2270, 2265 ;
-
- i324 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340 ;
-
- f331 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677,
-  24786,
-  24867,
-  24948 ;
-
- d332 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  38000, 37990,
-  38100, 38090,
-  38200, 38190 ;
-
- c333 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T",
-  "P", "R", "T",
-  "T", "V", "X",
-  "X", "Z", "\" ;
-
- b334 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  56, 54, 52, 50 ;
-
- s341 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450,
-  2250,
-  2275,
-  2300,
-  2325 ;
-
- i342 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  625200, 625180 ;
-
- f343 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  25029, 25020, 25011 ;
-
- d344 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  38300, 38290, 38280, 38270 ;
-
- c411 =
-  "@",
-  "H",
-  "P",
-  "X" ;
-
- b412 =
-  64, 62,
-  56, 54,
-  48, 46,
-  40, 38 ;
-
- s413 =
-  2500, 2495, 2490,
-  2375, 2370, 2365,
-  2250, 2245, 2240,
-  2125, 2120, 2115 ;
-
- i414 =
-  640000, 639980, 639960, 639940,
-  632000, 631980, 631960, 631940,
-  624000, 623980, 623960, 623940,
-  616000, 615980, 615960, 615940 ;
-
- f421 =
-  26244,
-  26325,
-  25515,
-  25596,
-  24786,
-  24867,
-  24057,
-  24138 ;
-
- d422 =
-  40000, 39990,
-  40100, 40090,
-  39000, 38990,
-  39100, 39090,
-  38000, 37990,
-  38100, 38090,
-  37000, 36990,
-  37100, 37090 ;
-
- c423 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T",
-  "T", "V", "X",
-  "X", "Z", "\",
-  "\", "^", "`" ;
-
- b424 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  40, 38, 36, 34,
-  44, 42, 40, 38 ;
-
- s431 =
-  2500,
-  2525,
-  2550,
-  2375,
-  2400,
-  2425,
-  2250,
-  2275,
-  2300,
-  2125,
-  2150,
-  2175 ;
-
- i432 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  616000, 615980,
-  616400, 616380,
-  616800, 616780 ;
-
- f433 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  24057, 24048, 24039,
-  24138, 24129, 24120,
-  24219, 24210, 24201 ;
-
- d434 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  37000, 36990, 36980, 36970,
-  37100, 37090, 37080, 37070,
-  37200, 37190, 37180, 37170 ;
-
- c441 =
-  "@",
-  "D",
-  "H",
-  "L",
-  "H",
-  "L",
-  "P",
-  "T",
-  "P",
-  "T",
-  "X",
-  "\",
-  "X",
-  "\",
-  "`",
-  "d" ;
-
- b442 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74,
-  56, 54,
-  60, 58,
-  64, 62,
-  68, 66,
-  48, 46,
-  52, 50,
-  56, 54,
-  60, 58,
-  40, 38,
-  44, 42,
-  48, 46,
-  52, 50 ;
-
- s443 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415,
-  2450, 2445, 2440,
-  2250, 2245, 2240,
-  2275, 2270, 2265,
-  2300, 2295, 2290,
-  2325, 2320, 2315,
-  2125, 2120, 2115,
-  2150, 2145, 2140,
-  2175, 2170, 2165,
-  2200, 2195, 2190 ;
-
- i444 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740,
-  633200, 633180, 633160, 633140,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340,
-  624800, 624780, 624760, 624740,
-  625200, 625180, 625160, 625140,
-  616000, 615980, 615960, 615940,
-  616400, 616380, 616360, 616340,
-  616800, 616780, 616760, 616740,
-  617200, 617180, 617160, 617140 ;
-}
diff --git a/ncdap_test/expected4/test.sds1.dmp b/ncdap_test/expected4/test.sds1.dmp
deleted file mode 100644
index 75424f4..0000000
--- a/ncdap_test/expected4/test.sds1.dmp
+++ /dev/null
@@ -1,47 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 5 ;
-	fakeDim1 = 3 ;
-	fakeDim2 = 5 ;
-	fakeDim3 = 3 ;
-	fakeDim4 = 5 ;
-	fakeDim5 = 3 ;
-	fakeDim6 = 7 ;
-	fakeDim7 = 7 ;
-	fakeDim8 = 5 ;
-	fakeDim9 = 3 ;
-variables:
-	int SDS_DFNT_INT32(fakeDim0) ;
-	uint SDS_DFNT_UINT32(fakeDim1) ;
-	int SDS_DFNT_INT16(fakeDim2) ;
-	uint SDS_DFNT_UINT16(fakeDim3) ;
-	int SDS_DFNT_INT8(fakeDim4) ;
-	ubyte SDS_DFNT_UINT8(fakeDim5) ;
-	double SDS_DFNT_FLOAT32(fakeDim6) ;
-	double SDS_DFNT_FLOAT64(fakeDim7) ;
-	ubyte SDS_DFNT_CHAR8(fakeDim8) ;
-	ubyte SDS_DFNT_UCHAR8(fakeDim9) ;
-data:
-
- SDS_DFNT_INT32 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT32 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT16 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT16 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT8 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT8 = 0, 1, 2 ;
-
- SDS_DFNT_FLOAT32 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_FLOAT64 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_CHAR8 = 0, 1, 2, 3, 4 ;
-
- SDS_DFNT_UCHAR8 = 0, 1, 2 ;
-}
diff --git a/ncdap_test/expected4/test.sds2.dmp b/ncdap_test/expected4/test.sds2.dmp
deleted file mode 100644
index 75424f4..0000000
--- a/ncdap_test/expected4/test.sds2.dmp
+++ /dev/null
@@ -1,47 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 5 ;
-	fakeDim1 = 3 ;
-	fakeDim2 = 5 ;
-	fakeDim3 = 3 ;
-	fakeDim4 = 5 ;
-	fakeDim5 = 3 ;
-	fakeDim6 = 7 ;
-	fakeDim7 = 7 ;
-	fakeDim8 = 5 ;
-	fakeDim9 = 3 ;
-variables:
-	int SDS_DFNT_INT32(fakeDim0) ;
-	uint SDS_DFNT_UINT32(fakeDim1) ;
-	int SDS_DFNT_INT16(fakeDim2) ;
-	uint SDS_DFNT_UINT16(fakeDim3) ;
-	int SDS_DFNT_INT8(fakeDim4) ;
-	ubyte SDS_DFNT_UINT8(fakeDim5) ;
-	double SDS_DFNT_FLOAT32(fakeDim6) ;
-	double SDS_DFNT_FLOAT64(fakeDim7) ;
-	ubyte SDS_DFNT_CHAR8(fakeDim8) ;
-	ubyte SDS_DFNT_UCHAR8(fakeDim9) ;
-data:
-
- SDS_DFNT_INT32 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT32 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT16 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT16 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT8 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT8 = 0, 1, 2 ;
-
- SDS_DFNT_FLOAT32 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_FLOAT64 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_CHAR8 = 0, 1, 2, 3, 4 ;
-
- SDS_DFNT_UCHAR8 = 0, 1, 2 ;
-}
diff --git a/ncdap_test/expected4/test.sds3.dmp b/ncdap_test/expected4/test.sds3.dmp
deleted file mode 100644
index 75e294d..0000000
--- a/ncdap_test/expected4/test.sds3.dmp
+++ /dev/null
@@ -1,223 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 8 ;
-	fakeDim1 = 4 ;
-	fakeDim10 = 2 ;
-	fakeDim11 = 2 ;
-	fakeDim12 = 2 ;
-	fakeDim13 = 2 ;
-	fakeDim14 = 2 ;
-	fakeDim15 = 1 ;
-	fakeDim16 = 2 ;
-	fakeDim17 = 1 ;
-	fakeDim18 = 2 ;
-	fakeDim19 = 1 ;
-	fakeDim2 = 4 ;
-	fakeDim20 = 2 ;
-	fakeDim21 = 1 ;
-	fakeDim22 = 2 ;
-	fakeDim23 = 1 ;
-	fakeDim24 = 2 ;
-	fakeDim25 = 1 ;
-	fakeDim26 = 2 ;
-	fakeDim27 = 1 ;
-	fakeDim28 = 2 ;
-	fakeDim29 = 1 ;
-	fakeDim3 = 4 ;
-	fakeDim30 = 2 ;
-	fakeDim31 = 1 ;
-	fakeDim32 = 2 ;
-	fakeDim33 = 1 ;
-	fakeDim34 = 2 ;
-	fakeDim35 = 2 ;
-	fakeDim36 = 1 ;
-	fakeDim37 = 1 ;
-	fakeDim38 = 1 ;
-	fakeDim39 = 2 ;
-	fakeDim4 = 2 ;
-	fakeDim40 = 1 ;
-	fakeDim41 = 1 ;
-	fakeDim42 = 1 ;
-	fakeDim43 = 2 ;
-	fakeDim44 = 1 ;
-	fakeDim45 = 1 ;
-	fakeDim46 = 1 ;
-	fakeDim47 = 2 ;
-	fakeDim48 = 1 ;
-	fakeDim49 = 1 ;
-	fakeDim5 = 2 ;
-	fakeDim50 = 1 ;
-	fakeDim51 = 2 ;
-	fakeDim52 = 1 ;
-	fakeDim53 = 1 ;
-	fakeDim54 = 1 ;
-	fakeDim55 = 2 ;
-	fakeDim56 = 1 ;
-	fakeDim57 = 1 ;
-	fakeDim58 = 1 ;
-	fakeDim59 = 2 ;
-	fakeDim6 = 2 ;
-	fakeDim60 = 1 ;
-	fakeDim61 = 1 ;
-	fakeDim62 = 1 ;
-	fakeDim63 = 2 ;
-	fakeDim64 = 1 ;
-	fakeDim65 = 1 ;
-	fakeDim66 = 1 ;
-	fakeDim67 = 2 ;
-	fakeDim68 = 1 ;
-	fakeDim69 = 1 ;
-	fakeDim7 = 2 ;
-	fakeDim70 = 1 ;
-	fakeDim8 = 2 ;
-	fakeDim9 = 2 ;
-variables:
-	int SDS_2(fakeDim0, fakeDim1) ;
-	int SDS_3(fakeDim2, fakeDim3, fakeDim4) ;
-	int SDS_4(fakeDim5, fakeDim6, fakeDim7, fakeDim8) ;
-	int SDS_5(fakeDim9, fakeDim10, fakeDim11, fakeDim12, fakeDim13) ;
-	int SDS_6(fakeDim14, fakeDim15, fakeDim16, fakeDim17, fakeDim18, fakeDim19) ;
-	int SDS_7(fakeDim20, fakeDim21, fakeDim22, fakeDim23, fakeDim24, fakeDim25, fakeDim26) ;
-	int SDS_8(fakeDim27, fakeDim28, fakeDim29, fakeDim30, fakeDim31, fakeDim32, fakeDim33, fakeDim34) ;
-	int SDS_16(fakeDim35, fakeDim36, fakeDim37, fakeDim38, fakeDim39, fakeDim40, fakeDim41, fakeDim42, fakeDim43, fakeDim44, fakeDim45, fakeDim46, fakeDim47, fakeDim48, fakeDim49, fakeDim50) ;
-	int SDS_20(fakeDim51, fakeDim52, fakeDim53, fakeDim54, fakeDim55, fakeDim56, fakeDim57, fakeDim58, fakeDim59, fakeDim60, fakeDim61, fakeDim62, fakeDim63, fakeDim64, fakeDim65, fakeDim66, fakeDim67, fakeDim68, fakeDim69, fakeDim70) ;
-data:
-
- SDS_2 =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104,
-  49152, 51200, 53248, 55296,
-  57344, 59392, 61440, 63488 ;
-
- SDS_3 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720,
-  32768, 34816,
-  36864, 38912,
-  40960, 43008,
-  45056, 47104,
-  49152, 51200,
-  53248, 55296,
-  57344, 59392,
-  61440, 63488 ;
-
- SDS_4 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720 ;
-
- SDS_5 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720,
-  32768, 34816,
-  36864, 38912,
-  40960, 43008,
-  45056, 47104,
-  49152, 51200,
-  53248, 55296,
-  57344, 59392,
-  61440, 63488 ;
-
- SDS_6 =
-  0,
-  2048,
-  4096,
-  6144,
-  8192,
-  10240,
-  12288,
-  14336 ;
-
- SDS_7 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720 ;
-
- SDS_8 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720 ;
-
- SDS_16 =
-  0,
-  2048,
-  4096,
-  6144,
-  8192,
-  10240,
-  12288,
-  14336,
-  16384,
-  18432,
-  20480,
-  22528,
-  24576,
-  26624,
-  28672,
-  30720 ;
-
- SDS_20 =
-  0,
-  2048,
-  4096,
-  6144,
-  8192,
-  10240,
-  12288,
-  14336,
-  16384,
-  18432,
-  20480,
-  22528,
-  24576,
-  26624,
-  28672,
-  30720,
-  32768,
-  34816,
-  36864,
-  38912,
-  40960,
-  43008,
-  45056,
-  47104,
-  49152,
-  51200,
-  53248,
-  55296,
-  57344,
-  59392,
-  61440,
-  63488 ;
-}
diff --git a/ncdap_test/expected4/test.sds4.dmp b/ncdap_test/expected4/test.sds4.dmp
deleted file mode 100644
index 04b1523..0000000
--- a/ncdap_test/expected4/test.sds4.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound SDS_1_t {
-    int SDS_1(16, 5) ;
-    double Y_Axis(16) ;
-    int X_Axis(5) ;
-  }; // SDS_1_t
-variables:
-	SDS_1_t SDS_1 ;
-data:
-
- SDS_1 = 
-    {{0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 61440, 63488, 65536, 67584, 69632, 71680, 73728, 75776, 77824, 79872, 81920, 83968, 86016, 88064, 90112, 92160, 94208, 96256, 98304, 100352, 102400, 104448, 106496, 108544, 110592, 112640, 114688, 116736, 118784, 120832, 122880, 124928, 126976, 129024, 131072, 133120, 135168, 137216, [...]
-}
diff --git a/ncdap_test/expected4/test.sds5.dmp b/ncdap_test/expected4/test.sds5.dmp
deleted file mode 100644
index 9091f7e..0000000
--- a/ncdap_test/expected4/test.sds5.dmp
+++ /dev/null
@@ -1,77 +0,0 @@
-netcdf test {
-types:
-  compound SDS_DFNT_INT32_t {
-    int SDS_DFNT_INT32(5) ;
-    int Axis_DFNT_INT32(5) ;
-  }; // SDS_DFNT_INT32_t
-  compound SDS_DFNT_UINT32_t {
-    uint SDS_DFNT_UINT32(3) ;
-    int Axis_DFNT_UINT32(3) ;
-  }; // SDS_DFNT_UINT32_t
-  compound SDS_DFNT_INT16_t {
-    int SDS_DFNT_INT16(5) ;
-    int Axis_DFNT_INT16(5) ;
-  }; // SDS_DFNT_INT16_t
-  compound SDS_DFNT_UINT16_t {
-    uint SDS_DFNT_UINT16(3) ;
-    int Axis_DFNT_UINT16(3) ;
-  }; // SDS_DFNT_UINT16_t
-  compound SDS_DFNT_INT8_t {
-    int SDS_DFNT_INT8(5) ;
-    int Axis_DFNT_INT8(5) ;
-  }; // SDS_DFNT_INT8_t
-  compound SDS_DFNT_UINT8_t {
-    ubyte SDS_DFNT_UINT8(3) ;
-    int Axis_DFNT_UINT8(3) ;
-  }; // SDS_DFNT_UINT8_t
-  compound SDS_DFNT_FLOAT32_t {
-    double SDS_DFNT_FLOAT32(7) ;
-    double Axis_DFNT_FLOAT32(7) ;
-  }; // SDS_DFNT_FLOAT32_t
-  compound SDS_DFNT_FLOAT64_t {
-    double SDS_DFNT_FLOAT64(7) ;
-    double Axis_DFNT_FLOAT64(7) ;
-  }; // SDS_DFNT_FLOAT64_t
-  compound SDS_DFNT_CHAR8_t {
-    ubyte SDS_DFNT_CHAR8(5) ;
-    ubyte Axis_DFNT_CHAR8(5) ;
-  }; // SDS_DFNT_CHAR8_t
-  compound SDS_DFNT_UCHAR8_t {
-    ubyte SDS_DFNT_UCHAR8(3) ;
-    ubyte Axis_DFNT_UCHAR8(3) ;
-  }; // SDS_DFNT_UCHAR8_t
-variables:
-	SDS_DFNT_INT32_t SDS_DFNT_INT32 ;
-	SDS_DFNT_UINT32_t SDS_DFNT_UINT32 ;
-	SDS_DFNT_INT16_t SDS_DFNT_INT16 ;
-	SDS_DFNT_UINT16_t SDS_DFNT_UINT16 ;
-	SDS_DFNT_INT8_t SDS_DFNT_INT8 ;
-	SDS_DFNT_UINT8_t SDS_DFNT_UINT8 ;
-	SDS_DFNT_FLOAT32_t SDS_DFNT_FLOAT32 ;
-	SDS_DFNT_FLOAT64_t SDS_DFNT_FLOAT64 ;
-	SDS_DFNT_CHAR8_t SDS_DFNT_CHAR8 ;
-	SDS_DFNT_UCHAR8_t SDS_DFNT_UCHAR8 ;
-data:
-
- SDS_DFNT_INT32 = {{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}} ;
-
- SDS_DFNT_UINT32 = {{0, 4096, 8192}, {0, 2048, 4096}} ;
-
- SDS_DFNT_INT16 = {{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}} ;
-
- SDS_DFNT_UINT16 = {{0, 4096, 8192}, {0, 2048, 4096}} ;
-
- SDS_DFNT_INT8 = {{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}} ;
-
- SDS_DFNT_UINT8 = {{0, 1, 2}, {0, 2048, 4096}} ;
-
- SDS_DFNT_FLOAT32 = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}} ;
-
- SDS_DFNT_FLOAT64 = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}} ;
-
- SDS_DFNT_CHAR8 = {{0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}} ;
-
- SDS_DFNT_UCHAR8 = {{0, 1, 2}, {0, 1, 2}} ;
-}
diff --git a/ncdap_test/expected4/test.sds6.dmp b/ncdap_test/expected4/test.sds6.dmp
deleted file mode 100644
index 80a53af..0000000
--- a/ncdap_test/expected4/test.sds6.dmp
+++ /dev/null
@@ -1,89 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 16 ;
-	fakeDim1 = 5 ;
-	fakeDim2 = 16 ;
-	fakeDim3 = 5 ;
-	fakeDim4 = 16 ;
-	fakeDim5 = 5 ;
-	fakeDim6 = 16 ;
-	fakeDim7 = 5 ;
-variables:
-	int SDS_RLE(fakeDim0, fakeDim1) ;
-	int SDS_N%2dbit(fakeDim2, fakeDim3) ;
-	int SDS_Skip_Huffman(fakeDim4, fakeDim5) ;
-	int SDS_Deflate(fakeDim6, fakeDim7) ;
-data:
-
- SDS_RLE =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792 ;
-
- SDS_N%2dbit =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792 ;
-
- SDS_Skip_Huffman =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792 ;
-
- SDS_Deflate =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792 ;
-}
diff --git a/ncdap_test/expected4/test.sds7.dmp b/ncdap_test/expected4/test.sds7.dmp
deleted file mode 100644
index 42baa81..0000000
--- a/ncdap_test/expected4/test.sds7.dmp
+++ /dev/null
@@ -1,75 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 9 ;
-	fakeDim1 = 4 ;
-	fakeDim2 = 9 ;
-	fakeDim3 = 4 ;
-	fakeDim4 = 9 ;
-	fakeDim5 = 4 ;
-	fakeDim6 = 9 ;
-	fakeDim7 = 4 ;
-	fakeDim8 = 9 ;
-	fakeDim9 = 4 ;
-variables:
-	int SDS_None(fakeDim0, fakeDim1) ;
-	int SDS_RLE(fakeDim2, fakeDim3) ;
-	int SDS_N%2dbit(fakeDim4, fakeDim5) ;
-	int SDS_Skip_Huffman(fakeDim6, fakeDim7) ;
-	int SDS_Deflate(fakeDim8, fakeDim9) ;
-data:
-
- SDS_None =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104,
-  49152, 51200, 53248, 55296,
-  57344, 59392, 61440, 63488,
-  65536, 67584, 69632, 71680 ;
-
- SDS_RLE =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104,
-  49152, 51200, 53248, 55296,
-  57344, 59392, 61440, 63488,
-  65536, 67584, 69632, 71680 ;
-
- SDS_N%2dbit =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104,
-  49152, 51200, 53248, 55296,
-  57344, 59392, 61440, 63488,
-  65536, 67584, 69632, 71680 ;
-
- SDS_Skip_Huffman =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104,
-  49152, 51200, 53248, 55296,
-  57344, 59392, 61440, 63488,
-  65536, 67584, 69632, 71680 ;
-
- SDS_Deflate =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104,
-  49152, 51200, 53248, 55296,
-  57344, 59392, 61440, 63488,
-  65536, 67584, 69632, 71680 ;
-}
diff --git a/ncdap_test/expected4/test.vs1.dmp b/ncdap_test/expected4/test.vs1.dmp
deleted file mode 100644
index 0bf2b9e..0000000
--- a/ncdap_test/expected4/test.vs1.dmp
+++ /dev/null
@@ -1,109 +0,0 @@
-netcdf test {
-types:
-  compound Field_DFNT_INT32_t {
-    int Field_DFNT_INT32__0 ;
-  }; // Field_DFNT_INT32_t
-  compound Vdata_DFNT_INT32_record_t {
-    Field_DFNT_INT32_t Field_DFNT_INT32 ;
-  }; // Vdata_DFNT_INT32_record_t
-  Vdata_DFNT_INT32_record_t(*) Vdata_DFNT_INT32_t ;
-  compound Field_DFNT_UINT32_t {
-    uint Field_DFNT_UINT32__0 ;
-  }; // Field_DFNT_UINT32_t
-  compound Vdata_DFNT_UINT32_record_t {
-    Field_DFNT_UINT32_t Field_DFNT_UINT32 ;
-  }; // Vdata_DFNT_UINT32_record_t
-  Vdata_DFNT_UINT32_record_t(*) Vdata_DFNT_UINT32_t ;
-  compound Field_DFNT_INT16_t {
-    int Field_DFNT_INT16__0 ;
-  }; // Field_DFNT_INT16_t
-  compound Vdata_DFNT_INT16_record_t {
-    Field_DFNT_INT16_t Field_DFNT_INT16 ;
-  }; // Vdata_DFNT_INT16_record_t
-  Vdata_DFNT_INT16_record_t(*) Vdata_DFNT_INT16_t ;
-  compound Field_DFNT_UINT16_t {
-    uint Field_DFNT_UINT16__0 ;
-  }; // Field_DFNT_UINT16_t
-  compound Vdata_DFNT_UINT16_record_t {
-    Field_DFNT_UINT16_t Field_DFNT_UINT16 ;
-  }; // Vdata_DFNT_UINT16_record_t
-  Vdata_DFNT_UINT16_record_t(*) Vdata_DFNT_UINT16_t ;
-  compound Field_DFNT_INT8_t {
-    int Field_DFNT_INT8__0 ;
-  }; // Field_DFNT_INT8_t
-  compound Vdata_DFNT_INT8_record_t {
-    Field_DFNT_INT8_t Field_DFNT_INT8 ;
-  }; // Vdata_DFNT_INT8_record_t
-  Vdata_DFNT_INT8_record_t(*) Vdata_DFNT_INT8_t ;
-  compound Field_DFNT_UINT8_t {
-    ubyte Field_DFNT_UINT8__0 ;
-  }; // Field_DFNT_UINT8_t
-  compound Vdata_DFNT_UINT8_record_t {
-    Field_DFNT_UINT8_t Field_DFNT_UINT8 ;
-  }; // Vdata_DFNT_UINT8_record_t
-  Vdata_DFNT_UINT8_record_t(*) Vdata_DFNT_UINT8_t ;
-  compound Field_DFNT_FLOAT32_t {
-    double Field_DFNT_FLOAT32__0 ;
-  }; // Field_DFNT_FLOAT32_t
-  compound Vdata_DFNT_FLOAT32_record_t {
-    Field_DFNT_FLOAT32_t Field_DFNT_FLOAT32 ;
-  }; // Vdata_DFNT_FLOAT32_record_t
-  Vdata_DFNT_FLOAT32_record_t(*) Vdata_DFNT_FLOAT32_t ;
-  compound Field_DFNT_FLOAT64_t {
-    double Field_DFNT_FLOAT64__0 ;
-  }; // Field_DFNT_FLOAT64_t
-  compound Vdata_DFNT_FLOAT64_record_t {
-    Field_DFNT_FLOAT64_t Field_DFNT_FLOAT64 ;
-  }; // Vdata_DFNT_FLOAT64_record_t
-  Vdata_DFNT_FLOAT64_record_t(*) Vdata_DFNT_FLOAT64_t ;
-  compound Field_DFNT_CHAR8_t {
-    string Field_DFNT_CHAR8__0 ;
-  }; // Field_DFNT_CHAR8_t
-  compound Vdata_DFNT_CHAR8_record_t {
-    Field_DFNT_CHAR8_t Field_DFNT_CHAR8 ;
-  }; // Vdata_DFNT_CHAR8_record_t
-  Vdata_DFNT_CHAR8_record_t(*) Vdata_DFNT_CHAR8_t ;
-  compound Field_DFNT_UCHAR8_t {
-    string Field_DFNT_UCHAR8__0 ;
-  }; // Field_DFNT_UCHAR8_t
-  compound Vdata_DFNT_UCHAR8_record_t {
-    Field_DFNT_UCHAR8_t Field_DFNT_UCHAR8 ;
-  }; // Vdata_DFNT_UCHAR8_record_t
-  Vdata_DFNT_UCHAR8_record_t(*) Vdata_DFNT_UCHAR8_t ;
-variables:
-	Vdata_DFNT_INT32_t Vdata_DFNT_INT32 ;
-	Vdata_DFNT_UINT32_t Vdata_DFNT_UINT32 ;
-	Vdata_DFNT_INT16_t Vdata_DFNT_INT16 ;
-	Vdata_DFNT_UINT16_t Vdata_DFNT_UINT16 ;
-	Vdata_DFNT_INT8_t Vdata_DFNT_INT8 ;
-	Vdata_DFNT_UINT8_t Vdata_DFNT_UINT8 ;
-	Vdata_DFNT_FLOAT32_t Vdata_DFNT_FLOAT32 ;
-	Vdata_DFNT_FLOAT64_t Vdata_DFNT_FLOAT64 ;
-	Vdata_DFNT_CHAR8_t Vdata_DFNT_CHAR8 ;
-	Vdata_DFNT_UCHAR8_t Vdata_DFNT_UCHAR8 ;
-data:
-
- Vdata_DFNT_INT32 = {{{1}}, {{2}}, {{3}}, {{5}}, {{8}}} ;
-
- Vdata_DFNT_UINT32 = {{{0}}, {{2}}, {{6}}, {{12}}, {{20}}} ;
-
- Vdata_DFNT_INT16 = {{{13}}, {{21}}, {{34}}, {{55}}, {{89}}} ;
-
- Vdata_DFNT_UINT16 = {{{30}}, {{42}}, {{56}}, {{72}}, {{90}}} ;
-
- Vdata_DFNT_INT8 = {{{144}}, {{233}}, {{377}}, {{610}}, {{987}}} ;
-
- Vdata_DFNT_UINT8 = {{{0}}, {{1}}, {{2}}, {{3}}, {{4}}} ;
-
- Vdata_DFNT_FLOAT32 = 
-    {{{1000}}, {{999.950000416665}}, {{999.800006666578}}, {{999.550033748988}}, {{999.200106660978}}} ;
-
- Vdata_DFNT_FLOAT64 = 
-    {{{998.750260394966}}, {{998.200539935204}}, {{997.55100025328}}, {{996.801706302619}}, {{995.952733011994}}} ;
-
- Vdata_DFNT_CHAR8 = 
-    {{{"This is a data test string (pass 0)."}}, {{"This is a data test string (pass 1)."}}, {{"This is a data test string (pass 2)."}}, {{"This is a data test string (pass 3)."}}, {{"This is a data test string (pass 4)."}}} ;
-
- Vdata_DFNT_UCHAR8 = 
-    {{{"This is a data test string (pass 5)."}}, {{"This is a data test string (pass 6)."}}, {{"This is a data test string (pass 7)."}}, {{"This is a data test string (pass 8)."}}, {{"This is a data test string (pass 9)."}}} ;
-}
diff --git a/ncdap_test/expected4/test.vs2.dmp b/ncdap_test/expected4/test.vs2.dmp
deleted file mode 100644
index 2be6870..0000000
--- a/ncdap_test/expected4/test.vs2.dmp
+++ /dev/null
@@ -1,145 +0,0 @@
-netcdf test {
-types:
-  compound Field_DFNT_INT32_t {
-    int Field_DFNT_INT32__0 ;
-    int Field_DFNT_INT32__1 ;
-    int Field_DFNT_INT32__2 ;
-    int Field_DFNT_INT32__3 ;
-    int Field_DFNT_INT32__4 ;
-  }; // Field_DFNT_INT32_t
-  compound Vdata_DFNT_INT32_record_t {
-    Field_DFNT_INT32_t Field_DFNT_INT32 ;
-  }; // Vdata_DFNT_INT32_record_t
-  Vdata_DFNT_INT32_record_t(*) Vdata_DFNT_INT32_t ;
-  compound Field_DFNT_UINT32_t {
-    uint Field_DFNT_UINT32__0 ;
-    uint Field_DFNT_UINT32__1 ;
-    uint Field_DFNT_UINT32__2 ;
-  }; // Field_DFNT_UINT32_t
-  compound Vdata_DFNT_UINT32_record_t {
-    Field_DFNT_UINT32_t Field_DFNT_UINT32 ;
-  }; // Vdata_DFNT_UINT32_record_t
-  Vdata_DFNT_UINT32_record_t(*) Vdata_DFNT_UINT32_t ;
-  compound Field_DFNT_INT16_t {
-    int Field_DFNT_INT16__0 ;
-    int Field_DFNT_INT16__1 ;
-    int Field_DFNT_INT16__2 ;
-    int Field_DFNT_INT16__3 ;
-    int Field_DFNT_INT16__4 ;
-  }; // Field_DFNT_INT16_t
-  compound Vdata_DFNT_INT16_record_t {
-    Field_DFNT_INT16_t Field_DFNT_INT16 ;
-  }; // Vdata_DFNT_INT16_record_t
-  Vdata_DFNT_INT16_record_t(*) Vdata_DFNT_INT16_t ;
-  compound Field_DFNT_UINT16_t {
-    uint Field_DFNT_UINT16__0 ;
-    uint Field_DFNT_UINT16__1 ;
-    uint Field_DFNT_UINT16__2 ;
-  }; // Field_DFNT_UINT16_t
-  compound Vdata_DFNT_UINT16_record_t {
-    Field_DFNT_UINT16_t Field_DFNT_UINT16 ;
-  }; // Vdata_DFNT_UINT16_record_t
-  Vdata_DFNT_UINT16_record_t(*) Vdata_DFNT_UINT16_t ;
-  compound Field_DFNT_INT8_t {
-    int Field_DFNT_INT8__0 ;
-    int Field_DFNT_INT8__1 ;
-    int Field_DFNT_INT8__2 ;
-    int Field_DFNT_INT8__3 ;
-    int Field_DFNT_INT8__4 ;
-  }; // Field_DFNT_INT8_t
-  compound Vdata_DFNT_INT8_record_t {
-    Field_DFNT_INT8_t Field_DFNT_INT8 ;
-  }; // Vdata_DFNT_INT8_record_t
-  Vdata_DFNT_INT8_record_t(*) Vdata_DFNT_INT8_t ;
-  compound Field_DFNT_UINT8_t {
-    ubyte Field_DFNT_UINT8__0 ;
-    ubyte Field_DFNT_UINT8__1 ;
-    ubyte Field_DFNT_UINT8__2 ;
-  }; // Field_DFNT_UINT8_t
-  compound Vdata_DFNT_UINT8_record_t {
-    Field_DFNT_UINT8_t Field_DFNT_UINT8 ;
-  }; // Vdata_DFNT_UINT8_record_t
-  Vdata_DFNT_UINT8_record_t(*) Vdata_DFNT_UINT8_t ;
-  compound Field_DFNT_FLOAT32_t {
-    double Field_DFNT_FLOAT32__0 ;
-    double Field_DFNT_FLOAT32__1 ;
-    double Field_DFNT_FLOAT32__2 ;
-    double Field_DFNT_FLOAT32__3 ;
-    double Field_DFNT_FLOAT32__4 ;
-    double Field_DFNT_FLOAT32__5 ;
-    double Field_DFNT_FLOAT32__6 ;
-  }; // Field_DFNT_FLOAT32_t
-  compound Vdata_DFNT_FLOAT32_record_t {
-    Field_DFNT_FLOAT32_t Field_DFNT_FLOAT32 ;
-  }; // Vdata_DFNT_FLOAT32_record_t
-  Vdata_DFNT_FLOAT32_record_t(*) Vdata_DFNT_FLOAT32_t ;
-  compound Field_DFNT_FLOAT64_t {
-    double Field_DFNT_FLOAT64__0 ;
-    double Field_DFNT_FLOAT64__1 ;
-    double Field_DFNT_FLOAT64__2 ;
-    double Field_DFNT_FLOAT64__3 ;
-    double Field_DFNT_FLOAT64__4 ;
-    double Field_DFNT_FLOAT64__5 ;
-    double Field_DFNT_FLOAT64__6 ;
-  }; // Field_DFNT_FLOAT64_t
-  compound Vdata_DFNT_FLOAT64_record_t {
-    Field_DFNT_FLOAT64_t Field_DFNT_FLOAT64 ;
-  }; // Vdata_DFNT_FLOAT64_record_t
-  Vdata_DFNT_FLOAT64_record_t(*) Vdata_DFNT_FLOAT64_t ;
-  compound Field_DFNT_CHAR8_t {
-    string Field_DFNT_CHAR8__0 ;
-  }; // Field_DFNT_CHAR8_t
-  compound Vdata_DFNT_CHAR8_record_t {
-    Field_DFNT_CHAR8_t Field_DFNT_CHAR8 ;
-  }; // Vdata_DFNT_CHAR8_record_t
-  Vdata_DFNT_CHAR8_record_t(*) Vdata_DFNT_CHAR8_t ;
-  compound Field_DFNT_UCHAR8_t {
-    string Field_DFNT_UCHAR8__0 ;
-  }; // Field_DFNT_UCHAR8_t
-  compound Vdata_DFNT_UCHAR8_record_t {
-    Field_DFNT_UCHAR8_t Field_DFNT_UCHAR8 ;
-  }; // Vdata_DFNT_UCHAR8_record_t
-  Vdata_DFNT_UCHAR8_record_t(*) Vdata_DFNT_UCHAR8_t ;
-variables:
-	Vdata_DFNT_INT32_t Vdata_DFNT_INT32 ;
-	Vdata_DFNT_UINT32_t Vdata_DFNT_UINT32 ;
-	Vdata_DFNT_INT16_t Vdata_DFNT_INT16 ;
-	Vdata_DFNT_UINT16_t Vdata_DFNT_UINT16 ;
-	Vdata_DFNT_INT8_t Vdata_DFNT_INT8 ;
-	Vdata_DFNT_UINT8_t Vdata_DFNT_UINT8 ;
-	Vdata_DFNT_FLOAT32_t Vdata_DFNT_FLOAT32 ;
-	Vdata_DFNT_FLOAT64_t Vdata_DFNT_FLOAT64 ;
-	Vdata_DFNT_CHAR8_t Vdata_DFNT_CHAR8 ;
-	Vdata_DFNT_UCHAR8_t Vdata_DFNT_UCHAR8 ;
-data:
-
- Vdata_DFNT_INT32 = 
-    {{{1, 2, 3, 5, 8}}, {{13, 21, 34, 55, 89}}, {{144, 233, 377, 610, 987}}, {{1597, 2584, 4181, 6765, 10946}}, {{17711, 28657, 46368, 75025, 121393}}} ;
-
- Vdata_DFNT_UINT32 = 
-    {{{0, 2, 6}}, {{12, 20, 30}}, {{42, 56, 72}}, {{90, 110, 132}}, {{156, 182, 210}}} ;
-
- Vdata_DFNT_INT16 = 
-    {{{196418, 317811, 514229, 832040, 1346269}}, {{2178309, 3524578, 5702887, 9227465, 14930352}}, {{24157817, 39088169, 63245986, 102334155, 165580141}}, {{267914296, 433494437, 701408733, 1134903170, 1836311903}}, {{-1323752223, 512559680, -811192543, -298632863, -1109825406}}} ;
-
- Vdata_DFNT_UINT16 = 
-    {{{240, 272, 306}}, {{342, 380, 420}}, {{462, 506, 552}}, {{600, 650, 702}}, {{756, 812, 870}}} ;
-
- Vdata_DFNT_INT8 = 
-    {{{-1408458269, 1776683621, 368225352, 2144908973, -1781832971}}, {{363076002, -1418756969, -1055680967, 1820529360, 764848393}}, {{-1709589543, -944741150, 1640636603, 695895453, -1958435240}}, {{-1262539787, 1073992269, -188547518, 885444751, 696897233}}, {{1582341984, -2015728079, -433386095, 1845853122, 1412467027}}} ;
-
- Vdata_DFNT_UINT8 = 
-    {{{0, 1, 2}}, {{3, 4, 5}}, {{6, 7, 8}}, {{9, 10, 11}}, {{12, 13, 14}}} ;
-
- Vdata_DFNT_FLOAT32 = 
-    {{{1000, 999.950000416665, 999.800006666578, 999.550033748988, 999.200106660978, 998.750260394966, 998.200539935204}}, {{997.55100025328, 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697, 992.808635853866, 991.561893714788}}, {{990.215996212637, 988.771077936042, 987.227283375627, 985.584766909561, 983.843692788121, 982.00423511727, 980.066577841242}}, {{978.030914724148, 975.897449330605, 973.666395005375, 971.33797485203, 968.912421710645, 966.389978134513, 96 [...]
-
- Vdata_DFNT_FLOAT64 = 
-    {{{939.372712847379, 935.896823677935, 932.327345606034, 928.66463557651, 924.909059857313, 921.060994002885, 917.120822816605}}, {{913.088940312308, 908.965749674885, 904.751663219963, 900.447102352677, 896.052497525525, 891.568288195329, 886.994922779284}}, {{882.332858610121, 877.582561890373, 872.744507645751, 867.81917967765, 862.807070514761, 857.708681363824, 852.524522059506}}, {{847.255111013416, 841.900975162269, 836.462649915187, 830.940679100163, 825.335614909678, 819.648 [...]
-
- Vdata_DFNT_CHAR8 = 
-    {{{"This is a data test string (pass 0)."}}, {{"This is a data test string (pass 1)."}}, {{"This is a data test string (pass 2)."}}, {{"This is a data test string (pass 3)."}}, {{"This is a data test string (pass 4)."}}} ;
-
- Vdata_DFNT_UCHAR8 = 
-    {{{"This is a data test string (pass 5)."}}, {{"This is a data test string (pass 6)."}}, {{"This is a data test string (pass 7)."}}, {{"This is a data test string (pass 8)."}}, {{"This is a data test string (pass 9)."}}} ;
-}
diff --git a/ncdap_test/expected4/test.vs3.dmp b/ncdap_test/expected4/test.vs3.dmp
deleted file mode 100644
index 12bf119..0000000
--- a/ncdap_test/expected4/test.vs3.dmp
+++ /dev/null
@@ -1,52 +0,0 @@
-netcdf test {
-types:
-  compound dINT32_t {
-    int dINT32__0 ;
-  }; // dINT32_t
-  compound dUINT32_t {
-    uint dUINT32__0 ;
-  }; // dUINT32_t
-  compound dINT16_t {
-    int dINT16__0 ;
-  }; // dINT16_t
-  compound dUINT16_t {
-    uint dUINT16__0 ;
-  }; // dUINT16_t
-  compound dINT8_t {
-    int dINT8__0 ;
-  }; // dINT8_t
-  compound dUINT8_t {
-    ubyte dUINT8__0 ;
-  }; // dUINT8_t
-  compound dFLOAT32_t {
-    double dFLOAT32__0 ;
-  }; // dFLOAT32_t
-  compound dFLOAT64_t {
-    double dFLOAT64__0 ;
-  }; // dFLOAT64_t
-  compound dCHAR8_t {
-    string dCHAR8__0 ;
-  }; // dCHAR8_t
-  compound dUCHAR8_t {
-    string dUCHAR8__0 ;
-  }; // dUCHAR8_t
-  compound Vdata_record_t {
-    dINT32_t dINT32 ;
-    dUINT32_t dUINT32 ;
-    dINT16_t dINT16 ;
-    dUINT16_t dUINT16 ;
-    dINT8_t dINT8 ;
-    dUINT8_t dUINT8 ;
-    dFLOAT32_t dFLOAT32 ;
-    dFLOAT64_t dFLOAT64 ;
-    dCHAR8_t dCHAR8 ;
-    dUCHAR8_t dUCHAR8 ;
-  }; // Vdata_record_t
-  Vdata_record_t(*) Vdata_t ;
-variables:
-	Vdata_t Vdata ;
-data:
-
- Vdata = 
-    {{{1}, {0}, {2}, {2}, {3}, {0}, {1000}, {999.950000416665}, {"This is a data test string (pass 0)."}, {"This is a data test string (pass 1)."}}, {{5}, {6}, {8}, {12}, {13}, {1}, {999.800006666578}, {999.550033748988}, {"This is a data test string (pass 2)."}, {"This is a data test string (pass 3)."}}, {{21}, {20}, {34}, {30}, {55}, {2}, {999.200106660978}, {998.750260394966}, {"This is a data test string (pass 4)."}, {"This is a data test string (pass 5)."}}, {{89}, {42}, {144}, {56} [...]
-}
diff --git a/ncdap_test/expected4/test.vs4.dmp b/ncdap_test/expected4/test.vs4.dmp
deleted file mode 100644
index 0bf2b9e..0000000
--- a/ncdap_test/expected4/test.vs4.dmp
+++ /dev/null
@@ -1,109 +0,0 @@
-netcdf test {
-types:
-  compound Field_DFNT_INT32_t {
-    int Field_DFNT_INT32__0 ;
-  }; // Field_DFNT_INT32_t
-  compound Vdata_DFNT_INT32_record_t {
-    Field_DFNT_INT32_t Field_DFNT_INT32 ;
-  }; // Vdata_DFNT_INT32_record_t
-  Vdata_DFNT_INT32_record_t(*) Vdata_DFNT_INT32_t ;
-  compound Field_DFNT_UINT32_t {
-    uint Field_DFNT_UINT32__0 ;
-  }; // Field_DFNT_UINT32_t
-  compound Vdata_DFNT_UINT32_record_t {
-    Field_DFNT_UINT32_t Field_DFNT_UINT32 ;
-  }; // Vdata_DFNT_UINT32_record_t
-  Vdata_DFNT_UINT32_record_t(*) Vdata_DFNT_UINT32_t ;
-  compound Field_DFNT_INT16_t {
-    int Field_DFNT_INT16__0 ;
-  }; // Field_DFNT_INT16_t
-  compound Vdata_DFNT_INT16_record_t {
-    Field_DFNT_INT16_t Field_DFNT_INT16 ;
-  }; // Vdata_DFNT_INT16_record_t
-  Vdata_DFNT_INT16_record_t(*) Vdata_DFNT_INT16_t ;
-  compound Field_DFNT_UINT16_t {
-    uint Field_DFNT_UINT16__0 ;
-  }; // Field_DFNT_UINT16_t
-  compound Vdata_DFNT_UINT16_record_t {
-    Field_DFNT_UINT16_t Field_DFNT_UINT16 ;
-  }; // Vdata_DFNT_UINT16_record_t
-  Vdata_DFNT_UINT16_record_t(*) Vdata_DFNT_UINT16_t ;
-  compound Field_DFNT_INT8_t {
-    int Field_DFNT_INT8__0 ;
-  }; // Field_DFNT_INT8_t
-  compound Vdata_DFNT_INT8_record_t {
-    Field_DFNT_INT8_t Field_DFNT_INT8 ;
-  }; // Vdata_DFNT_INT8_record_t
-  Vdata_DFNT_INT8_record_t(*) Vdata_DFNT_INT8_t ;
-  compound Field_DFNT_UINT8_t {
-    ubyte Field_DFNT_UINT8__0 ;
-  }; // Field_DFNT_UINT8_t
-  compound Vdata_DFNT_UINT8_record_t {
-    Field_DFNT_UINT8_t Field_DFNT_UINT8 ;
-  }; // Vdata_DFNT_UINT8_record_t
-  Vdata_DFNT_UINT8_record_t(*) Vdata_DFNT_UINT8_t ;
-  compound Field_DFNT_FLOAT32_t {
-    double Field_DFNT_FLOAT32__0 ;
-  }; // Field_DFNT_FLOAT32_t
-  compound Vdata_DFNT_FLOAT32_record_t {
-    Field_DFNT_FLOAT32_t Field_DFNT_FLOAT32 ;
-  }; // Vdata_DFNT_FLOAT32_record_t
-  Vdata_DFNT_FLOAT32_record_t(*) Vdata_DFNT_FLOAT32_t ;
-  compound Field_DFNT_FLOAT64_t {
-    double Field_DFNT_FLOAT64__0 ;
-  }; // Field_DFNT_FLOAT64_t
-  compound Vdata_DFNT_FLOAT64_record_t {
-    Field_DFNT_FLOAT64_t Field_DFNT_FLOAT64 ;
-  }; // Vdata_DFNT_FLOAT64_record_t
-  Vdata_DFNT_FLOAT64_record_t(*) Vdata_DFNT_FLOAT64_t ;
-  compound Field_DFNT_CHAR8_t {
-    string Field_DFNT_CHAR8__0 ;
-  }; // Field_DFNT_CHAR8_t
-  compound Vdata_DFNT_CHAR8_record_t {
-    Field_DFNT_CHAR8_t Field_DFNT_CHAR8 ;
-  }; // Vdata_DFNT_CHAR8_record_t
-  Vdata_DFNT_CHAR8_record_t(*) Vdata_DFNT_CHAR8_t ;
-  compound Field_DFNT_UCHAR8_t {
-    string Field_DFNT_UCHAR8__0 ;
-  }; // Field_DFNT_UCHAR8_t
-  compound Vdata_DFNT_UCHAR8_record_t {
-    Field_DFNT_UCHAR8_t Field_DFNT_UCHAR8 ;
-  }; // Vdata_DFNT_UCHAR8_record_t
-  Vdata_DFNT_UCHAR8_record_t(*) Vdata_DFNT_UCHAR8_t ;
-variables:
-	Vdata_DFNT_INT32_t Vdata_DFNT_INT32 ;
-	Vdata_DFNT_UINT32_t Vdata_DFNT_UINT32 ;
-	Vdata_DFNT_INT16_t Vdata_DFNT_INT16 ;
-	Vdata_DFNT_UINT16_t Vdata_DFNT_UINT16 ;
-	Vdata_DFNT_INT8_t Vdata_DFNT_INT8 ;
-	Vdata_DFNT_UINT8_t Vdata_DFNT_UINT8 ;
-	Vdata_DFNT_FLOAT32_t Vdata_DFNT_FLOAT32 ;
-	Vdata_DFNT_FLOAT64_t Vdata_DFNT_FLOAT64 ;
-	Vdata_DFNT_CHAR8_t Vdata_DFNT_CHAR8 ;
-	Vdata_DFNT_UCHAR8_t Vdata_DFNT_UCHAR8 ;
-data:
-
- Vdata_DFNT_INT32 = {{{1}}, {{2}}, {{3}}, {{5}}, {{8}}} ;
-
- Vdata_DFNT_UINT32 = {{{0}}, {{2}}, {{6}}, {{12}}, {{20}}} ;
-
- Vdata_DFNT_INT16 = {{{13}}, {{21}}, {{34}}, {{55}}, {{89}}} ;
-
- Vdata_DFNT_UINT16 = {{{30}}, {{42}}, {{56}}, {{72}}, {{90}}} ;
-
- Vdata_DFNT_INT8 = {{{144}}, {{233}}, {{377}}, {{610}}, {{987}}} ;
-
- Vdata_DFNT_UINT8 = {{{0}}, {{1}}, {{2}}, {{3}}, {{4}}} ;
-
- Vdata_DFNT_FLOAT32 = 
-    {{{1000}}, {{999.950000416665}}, {{999.800006666578}}, {{999.550033748988}}, {{999.200106660978}}} ;
-
- Vdata_DFNT_FLOAT64 = 
-    {{{998.750260394966}}, {{998.200539935204}}, {{997.55100025328}}, {{996.801706302619}}, {{995.952733011994}}} ;
-
- Vdata_DFNT_CHAR8 = 
-    {{{"This is a data test string (pass 0)."}}, {{"This is a data test string (pass 1)."}}, {{"This is a data test string (pass 2)."}}, {{"This is a data test string (pass 3)."}}, {{"This is a data test string (pass 4)."}}} ;
-
- Vdata_DFNT_UCHAR8 = 
-    {{{"This is a data test string (pass 5)."}}, {{"This is a data test string (pass 6)."}}, {{"This is a data test string (pass 7)."}}, {{"This is a data test string (pass 8)."}}, {{"This is a data test string (pass 9)."}}} ;
-}
diff --git a/ncdap_test/expected4/test.vs5.dmp b/ncdap_test/expected4/test.vs5.dmp
deleted file mode 100644
index 6fb24c4..0000000
--- a/ncdap_test/expected4/test.vs5.dmp
+++ /dev/null
@@ -1,38 +0,0 @@
-netcdf test {
-types:
-  compound Array_Vgroup_t {
-    int SDS_Array(5) ;
-  }; // Array_Vgroup_t
-  compound SDS_Grid_t {
-    int SDS_Grid(5) ;
-    int fakeDim1(5) ;
-  }; // SDS_Grid_t
-  compound Grid_Vgroup_t {
-    SDS_Grid_t SDS_Grid ;
-  }; // Grid_Vgroup_t
-  compound GR_Vgroup_t {
-    int GRaster(5, 5) ;
-  }; // GR_Vgroup_t
-  compound Field_t {
-    int Field__0 ;
-  }; // Field_t
-  compound Vdata_record_t {
-    Field_t Field ;
-  }; // Vdata_record_t
-  Vdata_record_t(*) Vdata_t ;
-  compound Vdata_Vgroup_t {
-    Vdata_t Vdata ;
-  }; // Vdata_Vgroup_t
-  compound Main_Vgroup_t {
-    Array_Vgroup_t Array_Vgroup ;
-    Grid_Vgroup_t Grid_Vgroup ;
-    GR_Vgroup_t GR_Vgroup ;
-    Vdata_Vgroup_t Vdata_Vgroup ;
-  }; // Main_Vgroup_t
-variables:
-	Main_Vgroup_t Main_Vgroup ;
-data:
-
- Main_Vgroup = 
-    {{{0, 2048, 4096, 6144, 8192}}, {{{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}}}, {{0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 43008, 45056, 47104, 49152}}, {{{{1}}, {{2}}, {{3}}, {{5}}, {{8}}}}} ;
-}
diff --git a/ncdap_test/expected4/text.nc.dmp b/ncdap_test/expected4/text.nc.dmp
deleted file mode 100644
index 6214898..0000000
--- a/ncdap_test/expected4/text.nc.dmp
+++ /dev/null
@@ -1,961 +0,0 @@
-netcdf text {
-dimensions:
-	D1 = 1 ;
-	D2 = 2 ;
-	D3 = 3 ;
-	D4 = 4 ;
-	Dr = 2 ;
-variables:
-	string c ;
-	ubyte b ;
-		string b:c = "" ;
-	short s ;
-		s:b = 128UB ;
-		s:s = -32768s, 32767s ;
-	int i ;
-		i:i = -2147483648, 2147483647, -2147483648 ;
-		i:f = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f ;
-		i:d = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660. ;
-	float f ;
-	double d ;
-		string d:c = "\\200\\177AZ$&" ;
-	string cr(Dr) ;
-	ubyte br(Dr) ;
-	short sr(Dr) ;
-	int ir(Dr) ;
-	float fr(Dr) ;
-	double dr(Dr) ;
-	string c1(D1) ;
-	ubyte b1(D1) ;
-	short s1(D1) ;
-	int i1(D1) ;
-	float f1(D1) ;
-	double d1(D1) ;
-	string c2(D2) ;
-	ubyte b2(D2) ;
-	short s2(D2) ;
-	int i2(D2) ;
-	float f2(D2) ;
-	double d2(D2) ;
-	string c3(D3) ;
-	ubyte b3(D3) ;
-	short s3(D3) ;
-	int i3(D3) ;
-	float f3(D3) ;
-	double d3(D3) ;
-	string c4(D4) ;
-	ubyte b4(D4) ;
-	short s4(D4) ;
-	int i4(D4) ;
-	float f4(D4) ;
-	double d4(D4) ;
-	string cr1(Dr, D1) ;
-	ubyte br2(Dr, D2) ;
-	short sr3(Dr, D3) ;
-	int ir4(Dr, D4) ;
-	float f11(D1, D1) ;
-	double d12(D1, D2) ;
-	string c13(D1, D3) ;
-	ubyte b14(D1, D4) ;
-	short s21(D2, D1) ;
-	int i22(D2, D2) ;
-	float f23(D2, D3) ;
-	double d24(D2, D4) ;
-	string c31(D3, D1) ;
-	ubyte b32(D3, D2) ;
-	short s33(D3, D3) ;
-	int i34(D3, D4) ;
-	float f41(D4, D1) ;
-	double d42(D4, D2) ;
-	string c43(D4, D3) ;
-	ubyte b44(D4, D4) ;
-	short sr11(Dr, D1, D1) ;
-	int ir12(Dr, D1, D2) ;
-	float fr13(Dr, D1, D3) ;
-	double dr14(Dr, D1, D4) ;
-	string cr21(Dr, D2, D1) ;
-	ubyte br22(Dr, D2, D2) ;
-	short sr23(Dr, D2, D3) ;
-	int ir24(Dr, D2, D4) ;
-	float fr31(Dr, D3, D1) ;
-	double dr32(Dr, D3, D2) ;
-	string cr33(Dr, D3, D3) ;
-	ubyte br34(Dr, D3, D4) ;
-	short sr41(Dr, D4, D1) ;
-	int ir42(Dr, D4, D2) ;
-	float fr43(Dr, D4, D3) ;
-	double dr44(Dr, D4, D4) ;
-	string c111(D1, D1, D1) ;
-	ubyte b112(D1, D1, D2) ;
-	short s113(D1, D1, D3) ;
-	int i114(D1, D1, D4) ;
-	float f121(D1, D2, D1) ;
-	double d122(D1, D2, D2) ;
-	string c123(D1, D2, D3) ;
-	ubyte b124(D1, D2, D4) ;
-	short s131(D1, D3, D1) ;
-	int i132(D1, D3, D2) ;
-	float f133(D1, D3, D3) ;
-	double d134(D1, D3, D4) ;
-	string c141(D1, D4, D1) ;
-	ubyte b142(D1, D4, D2) ;
-	short s143(D1, D4, D3) ;
-	int i144(D1, D4, D4) ;
-	float f211(D2, D1, D1) ;
-	double d212(D2, D1, D2) ;
-	string c213(D2, D1, D3) ;
-	ubyte b214(D2, D1, D4) ;
-	short s221(D2, D2, D1) ;
-	int i222(D2, D2, D2) ;
-	float f223(D2, D2, D3) ;
-	double d224(D2, D2, D4) ;
-	string c231(D2, D3, D1) ;
-	ubyte b232(D2, D3, D2) ;
-	short s233(D2, D3, D3) ;
-	int i234(D2, D3, D4) ;
-	float f241(D2, D4, D1) ;
-	double d242(D2, D4, D2) ;
-	string c243(D2, D4, D3) ;
-	ubyte b244(D2, D4, D4) ;
-	short s311(D3, D1, D1) ;
-	int i312(D3, D1, D2) ;
-	float f313(D3, D1, D3) ;
-	double d314(D3, D1, D4) ;
-	string c321(D3, D2, D1) ;
-	ubyte b322(D3, D2, D2) ;
-	short s323(D3, D2, D3) ;
-	int i324(D3, D2, D4) ;
-	float f331(D3, D3, D1) ;
-	double d332(D3, D3, D2) ;
-	string c333(D3, D3, D3) ;
-	ubyte b334(D3, D3, D4) ;
-	short s341(D3, D4, D1) ;
-	int i342(D3, D4, D2) ;
-	float f343(D3, D4, D3) ;
-	double d344(D3, D4, D4) ;
-	string c411(D4, D1, D1) ;
-	ubyte b412(D4, D1, D2) ;
-	short s413(D4, D1, D3) ;
-	int i414(D4, D1, D4) ;
-	float f421(D4, D2, D1) ;
-	double d422(D4, D2, D2) ;
-	string c423(D4, D2, D3) ;
-	ubyte b424(D4, D2, D4) ;
-	short s431(D4, D3, D1) ;
-	int i432(D4, D3, D2) ;
-	float f433(D4, D3, D3) ;
-	double d434(D4, D3, D4) ;
-	string c441(D4, D4, D1) ;
-	ubyte b442(D4, D4, D2) ;
-	short s443(D4, D4, D3) ;
-	int i444(D4, D4, D4) ;
-
-// global attributes:
-		string :Gc = "\\200" ;
-		:Gb = 128UB, 127UB ;
-		:Gs = -32768s, 32767s, 32767s ;
-		:Gi = -2147483648, 2147483647, -2147483648, 2147483647 ;
-		:Gf = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f, 531.f ;
-		:Gd = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660., 650. ;
-data:
-
- c = "" ;
-
- b = 254 ;
-
- s = -5 ;
-
- i = -20 ;
-
- f = -9 ;
-
- d = -10 ;
-
- cr = "�", "" ;
-
- br = 128, 127 ;
-
- sr = -32768, 32767 ;
-
- ir = -2147483648, 2147483647 ;
-
- fr = -3.402823e+38, 3.402823e+38 ;
-
- dr = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- c1 = "�" ;
-
- b1 = 128 ;
-
- s1 = -32768 ;
-
- i1 = -2147483648 ;
-
- f1 = -3.402823e+38 ;
-
- d1 = -1.79769313486232e+308 ;
-
- c2 = "�", "" ;
-
- b2 = 128, 127 ;
-
- s2 = -32768, 32767 ;
-
- i2 = -2147483648, 2147483647 ;
-
- f2 = -3.402823e+38, 3.402823e+38 ;
-
- d2 = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- c3 = "�", "", "A" ;
-
- b3 = 128, 127, 127 ;
-
- s3 = -32768, 32767, 32767 ;
-
- i3 = -2147483648, 2147483647, -2147483648 ;
-
- f3 = -3.402823e+38, 3.402823e+38, -3.402823e+38 ;
-
- d3 = -1.79769313486232e+308, 1.79769313486232e+308, -1 ;
-
- c4 = "�", "", "A", "Z" ;
-
- b4 = 128, 127, 127, 128 ;
-
- s4 = -32768, 32767, 32767, -32768 ;
-
- i4 = -2147483648, 2147483647, -2147483648, 2147483647 ;
-
- f4 = -3.402823e+38, 3.402823e+38, -3.402823e+38, 3.402823e+38 ;
-
- d4 = -1.79769313486232e+308, 1.79769313486232e+308, -1, 1 ;
-
- cr1 =
-  "",
-  "
" ;
-
- br2 =
-  232, 230,
-  236, 234 ;
-
- sr3 =
-  -375, -380, -385,
-  -350, -355, -360 ;
-
- ir4 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660 ;
-
- f11 =
-  -2187 ;
-
- d12 =
-  -3000, -3010 ;
-
- c13 =
-  "", "", "
" ;
-
- b14 =
-  232, 230, 228, 226 ;
-
- s21 =
-  -375,
-  -350 ;
-
- i22 =
-  -24000, -24020,
-  -23600, -23620 ;
-
- f23 =
-  -2187, -2196, -2205,
-  -2106, -2115, -2124 ;
-
- d24 =
-  -3000, -3010, -3020, -3030,
-  -2900, -2910, -2920, -2930 ;
-
- c31 =
-  "",
-  "
",
-  " " ;
-
- b32 =
-  232, 230,
-  236, 234,
-  240, 238 ;
-
- s33 =
-  -375, -380, -385,
-  -350, -355, -360,
-  -325, -330, -335 ;
-
- i34 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660,
-  -23200, -23220, -23240, -23260 ;
-
- f41 =
-  -2187,
-  -2106,
-  -2025,
-  -1944 ;
-
- d42 =
-  -3000, -3010,
-  -2900, -2910,
-  -2800, -2810,
-  -2700, -2710 ;
-
- c43 =
-  "", "", "
",
-  "
", "
", " ",
-  " ", """, "$",
-  "$", "&", "(" ;
-
- b44 =
-  232, 230, 228, 226,
-  236, 234, 232, 230,
-  240, 238, 236, 234,
-  244, 242, 240, 238 ;
-
- sr11 =
-  2500,
-  2375 ;
-
- ir12 =
-  640000, 639980,
-  632000, 631980 ;
-
- fr13 =
-  26244, 26235, 26226,
-  25515, 25506, 25497 ;
-
- dr14 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970 ;
-
- cr21 =
-  "@",
-  "D",
-  "H",
-  "L" ;
-
- br22 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58 ;
-
- sr23 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390 ;
-
- ir24 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340 ;
-
- fr31 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677 ;
-
- dr32 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190 ;
-
- cr33 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T" ;
-
- br34 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58 ;
-
- sr41 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450 ;
-
- ir42 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180 ;
-
- fr43 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740 ;
-
- dr44 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270 ;
-
- c111 =
-  "@" ;
-
- b112 =
-  64, 62 ;
-
- s113 =
-  2500, 2495, 2490 ;
-
- i114 =
-  640000, 639980, 639960, 639940 ;
-
- f121 =
-  26244,
-  26325 ;
-
- d122 =
-  40000, 39990,
-  40100, 40090 ;
-
- c123 =
-  "@", "B", "D",
-  "D", "F", "H" ;
-
- b124 =
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s131 =
-  2500,
-  2525,
-  2550 ;
-
- i132 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780 ;
-
- f133 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388 ;
-
- d134 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170 ;
-
- c141 =
-  "@",
-  "D",
-  "H",
-  "L" ;
-
- b142 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74 ;
-
- s143 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565 ;
-
- i144 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140 ;
-
- f211 =
-  26244,
-  25515 ;
-
- d212 =
-  40000, 39990,
-  39000, 38990 ;
-
- c213 =
-  "@", "B", "D",
-  "H", "J", "L" ;
-
- b214 =
-  64, 62, 60, 58,
-  56, 54, 52, 50 ;
-
- s221 =
-  2500,
-  2525,
-  2375,
-  2400 ;
-
- i222 =
-  640000, 639980,
-  640400, 640380,
-  632000, 631980,
-  632400, 632380 ;
-
- f223 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  25515, 25506, 25497,
-  25596, 25587, 25578 ;
-
- d224 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070 ;
-
- c231 =
-  "@",
-  "D",
-  "H",
-  "H",
-  "L",
-  "P" ;
-
- b232 =
-  64, 62,
-  68, 66,
-  72, 70,
-  56, 54,
-  60, 58,
-  64, 62 ;
-
- s233 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415 ;
-
- i234 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740 ;
-
- f241 =
-  26244,
-  26325,
-  26406,
-  26487,
-  25515,
-  25596,
-  25677,
-  25758 ;
-
- d242 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  40300, 40290,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  39300, 39290 ;
-
- c243 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "L", "N", "P",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T",
-  "T", "V", "X" ;
-
- b244 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  76, 74, 72, 70,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s311 =
-  2500,
-  2375,
-  2250 ;
-
- i312 =
-  640000, 639980,
-  632000, 631980,
-  624000, 623980 ;
-
- f313 =
-  26244, 26235, 26226,
-  25515, 25506, 25497,
-  24786, 24777, 24768 ;
-
- d314 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970,
-  38000, 37990, 37980, 37970 ;
-
- c321 =
-  "@",
-  "D",
-  "H",
-  "L",
-  "P",
-  "T" ;
-
- b322 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58,
-  48, 46,
-  52, 50 ;
-
- s323 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2250, 2245, 2240,
-  2275, 2270, 2265 ;
-
- i324 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340 ;
-
- f331 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677,
-  24786,
-  24867,
-  24948 ;
-
- d332 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  38000, 37990,
-  38100, 38090,
-  38200, 38190 ;
-
- c333 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T",
-  "P", "R", "T",
-  "T", "V", "X",
-  "X", "Z", "\" ;
-
- b334 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  56, 54, 52, 50 ;
-
- s341 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450,
-  2250,
-  2275,
-  2300,
-  2325 ;
-
- i342 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  625200, 625180 ;
-
- f343 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  25029, 25020, 25011 ;
-
- d344 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  38300, 38290, 38280, 38270 ;
-
- c411 =
-  "@",
-  "H",
-  "P",
-  "X" ;
-
- b412 =
-  64, 62,
-  56, 54,
-  48, 46,
-  40, 38 ;
-
- s413 =
-  2500, 2495, 2490,
-  2375, 2370, 2365,
-  2250, 2245, 2240,
-  2125, 2120, 2115 ;
-
- i414 =
-  640000, 639980, 639960, 639940,
-  632000, 631980, 631960, 631940,
-  624000, 623980, 623960, 623940,
-  616000, 615980, 615960, 615940 ;
-
- f421 =
-  26244,
-  26325,
-  25515,
-  25596,
-  24786,
-  24867,
-  24057,
-  24138 ;
-
- d422 =
-  40000, 39990,
-  40100, 40090,
-  39000, 38990,
-  39100, 39090,
-  38000, 37990,
-  38100, 38090,
-  37000, 36990,
-  37100, 37090 ;
-
- c423 =
-  "@", "B", "D",
-  "D", "F", "H",
-  "H", "J", "L",
-  "L", "N", "P",
-  "P", "R", "T",
-  "T", "V", "X",
-  "X", "Z", "\",
-  "\", "^", "`" ;
-
- b424 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  40, 38, 36, 34,
-  44, 42, 40, 38 ;
-
- s431 =
-  2500,
-  2525,
-  2550,
-  2375,
-  2400,
-  2425,
-  2250,
-  2275,
-  2300,
-  2125,
-  2150,
-  2175 ;
-
- i432 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  616000, 615980,
-  616400, 616380,
-  616800, 616780 ;
-
- f433 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  24057, 24048, 24039,
-  24138, 24129, 24120,
-  24219, 24210, 24201 ;
-
- d434 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  37000, 36990, 36980, 36970,
-  37100, 37090, 37080, 37070,
-  37200, 37190, 37180, 37170 ;
-
- c441 =
-  "@",
-  "D",
-  "H",
-  "L",
-  "H",
-  "L",
-  "P",
-  "T",
-  "P",
-  "T",
-  "X",
-  "\",
-  "X",
-  "\",
-  "`",
-  "d" ;
-
- b442 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74,
-  56, 54,
-  60, 58,
-  64, 62,
-  68, 66,
-  48, 46,
-  52, 50,
-  56, 54,
-  60, 58,
-  40, 38,
-  44, 42,
-  48, 46,
-  52, 50 ;
-
- s443 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415,
-  2450, 2445, 2440,
-  2250, 2245, 2240,
-  2275, 2270, 2265,
-  2300, 2295, 2290,
-  2325, 2320, 2315,
-  2125, 2120, 2115,
-  2150, 2145, 2140,
-  2175, 2170, 2165,
-  2200, 2195, 2190 ;
-
- i444 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740,
-  633200, 633180, 633160, 633140,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340,
-  624800, 624780, 624760, 624740,
-  625200, 625180, 625160, 625140,
-  616000, 615980, 615960, 615940,
-  616400, 616380, 616360, 616340,
-  616800, 616780, 616760, 616740,
-  617200, 617180, 617160, 617140 ;
-}
diff --git a/ncdap_test/expected4/whoi.dmp b/ncdap_test/expected4/whoi.dmp
deleted file mode 100644
index baa3977..0000000
--- a/ncdap_test/expected4/whoi.dmp
+++ /dev/null
@@ -1,20 +0,0 @@
-netcdf whoi {
-types:
-  compound emolt_sensor_record_t {
-    string SITE ;
-    short SERIAL_NUM ;
-    short PROBE_SETTING ;
-    string TIME_LOCAL ;
-    double YRDAY0_LOCAL ;
-    double TEMP ;
-    double SALT ;
-    double DEPTH_I ;
-  }; // emolt_sensor_record_t
-  emolt_sensor_record_t(*) emolt_sensor_t ;
-variables:
-	emolt_sensor_t emolt_sensor ;
-data:
-
- emolt_sensor = 
-    {{"This is a data test string (pass 0).", 0, 16, "This is a data test string (pass 1).", 1000, 999.950000416665, 999.800006666578, 999.550033748988}, {"This is a data test string (pass 2).", 32, 48, "This is a data test string (pass 3).", 999.200106660978, 998.750260394966, 998.200539935204, 997.55100025328}, {"This is a data test string (pass 4).", 64, 80, "This is a data test string (pass 5).", 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697}, {"This is a dat [...]
-}
diff --git a/ncdap_test/expectremote3/Makefile.in b/ncdap_test/expectremote3/Makefile.in
index 08382c0..0c9e869 100644
--- a/ncdap_test/expectremote3/Makefile.in
+++ b/ncdap_test/expectremote3/Makefile.in
@@ -170,6 +170,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -197,12 +198,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -237,6 +240,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/ncdap_test/expectremote3/test.01.1.dmp b/ncdap_test/expectremote3/test.01.1.dmp
index 9caf965..ba0c876 100644
--- a/ncdap_test/expectremote3/test.01.1.dmp
+++ b/ncdap_test/expectremote3/test.01.1.dmp
@@ -7,10 +7,6 @@ variables:
 			"Ph.D" ;
 		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
 		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-		:b.Description = "A test byte" ;
-		:b.units = "unknown" ;
-		:i32.Description = "A 32 bit test server int" ;
-		:i32.units = "unknown" ;
 data:
 
  f64 = 1000 ;
diff --git a/ncdap_test/expectremote3/test.07.1.dmp b/ncdap_test/expectremote3/test.07.1.dmp
index eabeeb5..57799f0 100644
--- a/ncdap_test/expectremote3/test.07.1.dmp
+++ b/ncdap_test/expectremote3/test.07.1.dmp
@@ -9,10 +9,6 @@ variables:
 			"Ph.D" ;
 		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
 		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-		:b.Description = "A test byte" ;
-		:b.units = "unknown" ;
-		:i32.Description = "A 32 bit test server int" ;
-		:i32.units = "unknown" ;
 data:
 
  person.age = 1, 2, 3, 5, 8 ;
diff --git a/ncdap_test/expectremote3/test.07.3.dmp b/ncdap_test/expectremote3/test.07.3.dmp
index df91e0f..5c97de2 100644
--- a/ncdap_test/expectremote3/test.07.3.dmp
+++ b/ncdap_test/expectremote3/test.07.3.dmp
@@ -11,10 +11,6 @@ variables:
 			"Ph.D" ;
 		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
 		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-		:b.Description = "A test byte" ;
-		:b.units = "unknown" ;
-		:i32.Description = "A 32 bit test server int" ;
-		:i32.units = "unknown" ;
 data:
 
  person.name =
diff --git a/ncdap_test/expectremote3/test.07.4.dmp b/ncdap_test/expectremote3/test.07.4.dmp
index 6b8ba5b..3077252 100644
--- a/ncdap_test/expectremote3/test.07.4.dmp
+++ b/ncdap_test/expectremote3/test.07.4.dmp
@@ -9,10 +9,6 @@ variables:
 			"Ph.D" ;
 		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
 		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-		:b.Description = "A test byte" ;
-		:b.units = "unknown" ;
-		:i32.Description = "A 32 bit test server int" ;
-		:i32.units = "unknown" ;
 data:
 
  types.f32 = 0, 0.9999833, 1.999867, 2.99955, 3.998933 ;
diff --git a/ncdap_test/expectremote4/D1.dmp b/ncdap_test/expectremote4/D1.dmp
deleted file mode 100644
index 22e9891..0000000
--- a/ncdap_test/expectremote4/D1.dmp
+++ /dev/null
@@ -1,16 +0,0 @@
-netcdf D1 {
-types:
-  compound Drifters_record_t {
-    string instrument_id ;
-    string location ;
-    double latitude ;
-    double longitude ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-variables:
-	Drifters_t Drifters ;
-data:
-
- Drifters = 
-    {{"This is a data test string (pass 0).", "This is a data test string (pass 1).", 1000, 999.950000416665}, {"This is a data test string (pass 2).", "This is a data test string (pass 3).", 999.800006666578, 999.550033748988}, {"This is a data test string (pass 4).", "This is a data test string (pass 5).", 999.200106660978, 998.750260394966}, {"This is a data test string (pass 6).", "This is a data test string (pass 7).", 998.200539935204, 997.55100025328}, {"This is a data test string [...]
-}
diff --git a/ncdap_test/expectremote4/Drifters.dmp b/ncdap_test/expectremote4/Drifters.dmp
deleted file mode 100644
index 7ccbd18..0000000
--- a/ncdap_test/expectremote4/Drifters.dmp
+++ /dev/null
@@ -1,31 +0,0 @@
-netcdf Drifters {
-types:
-  compound Drifters_record_t {
-    string Drifter_ID ;
-    string Date_Sampled ;
-    double Latitude ;
-    double Longitude ;
-    double SST ;
-    double Ed_490 ;
-    double Lu_412 ;
-    double Lu_443 ;
-    double Lu_490 ;
-    double Lu_510 ;
-    double Lu_555 ;
-    double Lu_670 ;
-    double Lu_683 ;
-    double CHL ;
-    double FLH ;
-    string Region ;
-    double Decimal_Day ;
-    string Calibration_File ;
-    string Drifter_Type ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-variables:
-	Drifters_t Drifters ;
-data:
-
- Drifters = 
-    {{"This is a data test string (pass 0).", "This is a data test string (pass 1).", 1000, 999.950000416665, 999.800006666578, 999.550033748988, 999.200106660978, 998.750260394966, 998.200539935204, 997.55100025328, 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697, 992.808635853866, "This is a data test string (pass 2).", 991.561893714788, "This is a data test string (pass 3).", "This is a data test string (pass 4)."}, {"This is a data test string (pass 5).", "This [...]
-}
diff --git a/ncdap_test/expectremote4/EOSDB.dmp b/ncdap_test/expectremote4/EOSDB.dmp
deleted file mode 100644
index 613414e..0000000
--- a/ncdap_test/expectremote4/EOSDB.dmp
+++ /dev/null
@@ -1,129 +0,0 @@
-netcdf EOSDB {
-types:
-  compound Abbott_Image_Data_record_t {
-    string Image_Name ;
-    string Date_Sampled ;
-    double North_Latitude ;
-    double South_Latitude ;
-    double West_Longitude ;
-    double East_Longitude ;
-    string Version ;
-    int Julian_Date ;
-    string PI ;
-    string Algorithm_Code ;
-    string Project ;
-    string Comments ;
-  }; // Abbott_Image_Data_record_t
-  Abbott_Image_Data_record_t(*) Abbott_Image_Data_t ;
-  compound Sat_Images_record_t {
-    string Image_Name ;
-    string Date_Sampled ;
-    double North_Latitude ;
-    double South_Latitude ;
-    double West_Longitude ;
-    double East_Longintude ;
-    string Version ;
-    string Satellite ;
-    string Instrument ;
-    string Channel ;
-    string Resolution ;
-    int Image_Size ;
-    string Image_Type ;
-    int Image_Bits_Per_Pixel ;
-    int Image_Width ;
-    int Image_Height ;
-    ubyte Image(1000) ;
-    int Raw_Image_Size ;
-    ubyte Raw_Image_Data(1000) ;
-    int Year ;
-    string Month ;
-    int Day ;
-    int Hour ;
-  }; // Sat_Images_record_t
-  Sat_Images_record_t(*) Sat_Images_t ;
-  compound Drifters_record_t {
-    string Instrument_ID ;
-    double Battery ;
-    double Checksum ;
-    double Date_Age ;
-    double Ed490 ;
-    double Ed490_stdev ;
-    double Latitude ;
-    double Longitude ;
-    double Lu412 ;
-    double Lu412_stdev ;
-    double Lu443 ;
-    double Lu443_stdev ;
-    double Lu490 ;
-    double Lu490_stdev ;
-    double Lu510 ;
-    double Lu510_stdev ;
-    double Lu555 ;
-    double Lu555_stdev ;
-    double Lu670 ;
-    double Lu670_stdev ;
-    double Lu683 ;
-    double Lu683_stdev ;
-    double Max_Depth ;
-    double Night_Len ;
-    double Number_Samples ;
-    double Num_Aves ;
-    double Press_Volts ;
-    double Sea_Surface_Temperature ;
-    double Sub_Wait ;
-    double Surf_Volts ;
-    double Surface_Average ;
-    double Surface_Percent ;
-    double Julian_Greenwich ;
-    double Sun_Angle ;
-    int Optical_Flag ;
-    int Sampling_Flag ;
-    int Tracking_Flag ;
-    int Hand_Checked_Flag ;
-    double Julian_Local_Time ;
-    string Date_Greenwich ;
-    string Date_Local_Time ;
-    string DateStamp ;
-    string algo_code ;
-    int GPS_hour ;
-    double GPS_lat ;
-    double GPS_lon ;
-    double rel1_lat ;
-    double rel1_lon ;
-    double rel2_lat ;
-    double rel2_lon ;
-    int time_to_1st_fix ;
-    int message_ID ;
-    int max_GPS_volt ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-  compound Instrument_record_t {
-    string Instrument_ID ;
-    string Instrument_Type ;
-    string Sensor_Platform_ID ;
-    string Comment ;
-  }; // Instrument_record_t
-  Instrument_record_t(*) Instrument_t ;
-variables:
-	Abbott_Image_Data_t Abbott_Image_Data ;
-	Sat_Images_t Sat_Images ;
-	Drifters_t Drifters ;
-	Instrument_t Instrument ;
-
-// global attributes:
-		string :history = "FERRET V4.11 (debug/no GUI) 19-Nov-95FERRET V4.20 (debug/no GUI) 12-Mar-96" ;
-		string :title = "COADS Surface Marine Observations (1854-1993)" ;
-data:
-
- Abbott_Image_Data = 
-    {{"This is a data test string (pass 0).", "This is a data test string (pass 1).", 1000, 999.950000416665, 999.800006666578, 999.550033748988, "This is a data test string (pass 2).", 1, "This is a data test string (pass 3).", "This is a data test string (pass 4).", "This is a data test string (pass 5).", "This is a data test string (pass 6)."}, {"This is a data test string (pass 7).", "This is a data test string (pass 8).", 999.200106660978, 998.750260394966, 998.200539935204, 997.551 [...]
-
- Sat_Images = 
-    {{"This is a data test string (pass 35).", "This is a data test string (pass 36).", 980.066577841242, 978.030914724148, 975.897449330605, 973.666395005375, "This is a data test string (pass 37).", "This is a data test string (pass 38).", "This is a data test string (pass 39).", "This is a data test string (pass 40).", "This is a data test string (pass 41).", 13, "This is a data test string (pass 42).", 21, 34, 55, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, [...]
-
- Drifters = 
-    {{"This is a data test string (pass 80).", 921.060994002885, 917.120822816605, 913.088940312308, 908.965749674885, 904.751663219963, 900.447102352677, 896.052497525525, 891.568288195329, 886.994922779284, 882.332858610121, 877.582561890373, 872.744507645751, 867.81917967765, 862.807070514761, 857.708681363824, 852.524522059506, 847.255111013416, 841.900975162269, 836.462649915187, 830.940679100163, 825.335614909678, 819.648017845479, 813.878456662534, 808.027508312152, 802.0957578842 [...]
-
- Instrument = 
-    {{"This is a data test string (pass 105).", "This is a data test string (pass 106).", "This is a data test string (pass 107).", "This is a data test string (pass 108)."}, {"This is a data test string (pass 109).", "This is a data test string (pass 110).", "This is a data test string (pass 111).", "This is a data test string (pass 112)."}, {"This is a data test string (pass 113).", "This is a data test string (pass 114).", "This is a data test string (pass 115).", "This is a data test [...]
-}
diff --git a/ncdap_test/expectremote4/GLOBEC_cetaceans.1.dmp b/ncdap_test/expectremote4/GLOBEC_cetaceans.1.dmp
deleted file mode 100644
index ea5a69b..0000000
--- a/ncdap_test/expectremote4/GLOBEC_cetaceans.1.dmp
+++ /dev/null
@@ -1,10 +0,0 @@
-netcdf GLOBEC_cetaceans {
-types:
-  short(*) cetaceans_t ;
-variables:
-	cetaceans_t cetaceans ;
-data:
-
- cetaceans = 
-    {8, 7, 8, 12, 13, 8, 8, 12, 40, 20, 8, 22, 27, 45, 10, 25, 7, 127, 10, 127, 13, 10, 8, 7, 8, 12, 13, 8, 8, 12, 40, 20, 8, 22, 27, 45, 10, 25, 7, 127, 10, 127, 13, 10, 20, 120, 30, 7, 9, 8, 10, 8, 7, 8, 7, 20, 15, 8, 7} ;
-}
diff --git a/ncdap_test/expectremote4/GLOBEC_cetaceans.2.dmp b/ncdap_test/expectremote4/GLOBEC_cetaceans.2.dmp
deleted file mode 100644
index 0ba0e9c..0000000
--- a/ncdap_test/expectremote4/GLOBEC_cetaceans.2.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf GLOBEC_cetaceans {
-types:
-  compound cetaceans_record_t {
-    float lat ;
-    float lon ;
-  }; // cetaceans_record_t
-  cetaceans_record_t(*) cetaceans_t ;
-variables:
-	cetaceans_t cetaceans ;
-data:
-
- cetaceans = 
-    {{42.4997, -125.015}, {42.4886, -124.953}, {42.0876, -124.805}, {42.0412, -124.87}, {42.0658, -124.866}, {42.0434, -124.828}, {42.0633, -124.851}, {42.0525, -124.843}, {42.052, -124.863}, {42.0557, -124.883}, {42.0673, -125.057}, {42.0491, -125.072}, {42.2066, -124.98}, {42.1955, -124.903}, {42.2088, -124.852}, {42.1998, -124.843}, {42.2048, -124.817}, {42.4997, -125.015}, {42.4886, -124.953}, {42.0876, -124.805}, {42.0412, -124.87}, {42.0658, -124.866}, {42.0434, -124.828}, {42.0633 [...]
-}
diff --git a/ncdap_test/expectremote4/Makefile.am b/ncdap_test/expectremote4/Makefile.am
deleted file mode 100644
index 2053ff5..0000000
--- a/ncdap_test/expectremote4/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-## This is a automake file, part of Unidata's netCDF package.
-# Copyright 2007, see the COPYRIGHT file for more information.
-
-# This is to include the libnc-dap test comparison files
-
-# $Id: Makefile.am,v 1.7 2009/11/22 06:17:54 dmh Exp $
-
-EXTRA_DIST=\
-b31a.dmp b31.dmp D1.dmp \
-Drifters.dmp EOSDB.dmp ingrid.dmp \
-nestedDAS.dmp NestedSeq2.dmp NestedSeq.dmp \
-OverideExample.dmp SimpleDrdsExample.dmp \
-test.01.1.dmp test.01.dmp test.02.1.dmp \
-test.02.dmp test.03.1.dmp test.03.2.dmp \
-test.03.dmp test.04.1.dmp test.04.dmp \
-test.05.1.dmp test.05.dmp test.06.1.dmp \
-test.06a.dmp test.07.1.dmp test.07.3.dmp \
-test.07.4.dmp test.07a.dmp test.07.dmp \
-test.21.dmp test.22.dmp test.23.dmp \
-test.31.dmp test.50.dmp test.53.dmp \
-test.55.dmp test.56.dmp test.57.dmp \
-test.66.dmp test.67.dmp test.68.dmp \
-test.69.dmp test.an1.dmp test.dfp1.dmp \
-test.gr1.dmp test.gr2.dmp test.gr3.dmp \
-test.gr4.dmp test.gr5.dmp test.sds1.dmp \
-test.sds2.dmp test.sds3.dmp test.sds4.dmp \
-test.sds5.dmp test.vs1.dmp test.vs2.dmp \
-test.vs3.dmp test.vs4.dmp test.vs5.dmp \
-whoi.dmp \
-GLOBEC_cetaceans.1.dmp GLOBEC_cetaceans.2.dmp \
-CMakeLists.txt
diff --git a/ncdap_test/expectremote4/Makefile.in b/ncdap_test/expectremote4/Makefile.in
deleted file mode 100644
index 9952db3..0000000
--- a/ncdap_test/expectremote4/Makefile.in
+++ /dev/null
@@ -1,523 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright 2007, see the COPYRIGHT file for more information.
-
-# This is to include the libnc-dap test comparison files
-
-# $Id: Makefile.am,v 1.7 2009/11/22 06:17:54 dmh Exp $
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-subdir = ncdap_test/expectremote4
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_ at AM_V@)
-am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_ at AM_V@)
-am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_ at AM_V@)
-am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_CFLAGS = @AM_CFLAGS@
-AM_CPPFLAGS = @AM_CPPFLAGS@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_LDFLAGS = @AM_LDFLAGS@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BINFILE_NAME = @BINFILE_NAME@
-BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-CFLAGS = @CFLAGS@
-CONFIG_DATE = @CONFIG_DATE@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DOT = @DOT@
-DOXYGEN = @DOXYGEN@
-DOXYGEN_CSS_FILE = @DOXYGEN_CSS_FILE@
-DOXYGEN_HEADER_FILE = @DOXYGEN_HEADER_FILE@
-DOXYGEN_SEARCHENGINE = @DOXYGEN_SEARCHENGINE@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-HAS_DAP = @HAS_DAP@
-HAS_DISKLESS = @HAS_DISKLESS@
-HAS_HDF4 = @HAS_HDF4@
-HAS_HDF5 = @HAS_HDF5@
-HAS_JNA = @HAS_JNA@
-HAS_LOGGING = @HAS_LOGGING@
-HAS_MMAP = @HAS_MMAP@
-HAS_NC2 = @HAS_NC2@
-HAS_NC4 = @HAS_NC4@
-HAS_PARALLEL = @HAS_PARALLEL@
-HAS_PARALLEL4 = @HAS_PARALLEL4@
-HAS_PNETCDF = @HAS_PNETCDF@
-HAS_SZLIB = @HAS_SZLIB@
-HAVE_DOT = @HAVE_DOT@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
-NC_HAS_DAP = @NC_HAS_DAP@
-NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
-NC_HAS_HDF4 = @NC_HAS_HDF4@
-NC_HAS_HDF5 = @NC_HAS_HDF5@
-NC_HAS_JNA = @NC_HAS_JNA@
-NC_HAS_MMAP = @NC_HAS_MMAP@
-NC_HAS_NC2 = @NC_HAS_NC2@
-NC_HAS_NC4 = @NC_HAS_NC4@
-NC_HAS_PARALLEL = @NC_HAS_PARALLEL@
-NC_HAS_PARALLEL4 = @NC_HAS_PARALLEL4@
-NC_HAS_PNETCDF = @NC_HAS_PNETCDF@
-NC_HAS_SZIP = @NC_HAS_SZIP@
-NC_LIBS = @NC_LIBS@
-NC_M4 = @NC_M4@
-NC_VERSION = @NC_VERSION@
-NC_VERSION_MAJOR = @NC_VERSION_MAJOR@
-NC_VERSION_MINOR = @NC_VERSION_MINOR@
-NC_VERSION_NOTE = @NC_VERSION_NOTE@
-NC_VERSION_PATCH = @NC_VERSION_PATCH@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NOUNDEFINED = @NOUNDEFINED@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SHOW_DOXYGEN_TAG_LIST = @SHOW_DOXYGEN_TAG_LIST@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-enable_shared = @enable_shared@
-enable_static = @enable_static@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = \
-b31a.dmp b31.dmp D1.dmp \
-Drifters.dmp EOSDB.dmp ingrid.dmp \
-nestedDAS.dmp NestedSeq2.dmp NestedSeq.dmp \
-OverideExample.dmp SimpleDrdsExample.dmp \
-test.01.1.dmp test.01.dmp test.02.1.dmp \
-test.02.dmp test.03.1.dmp test.03.2.dmp \
-test.03.dmp test.04.1.dmp test.04.dmp \
-test.05.1.dmp test.05.dmp test.06.1.dmp \
-test.06a.dmp test.07.1.dmp test.07.3.dmp \
-test.07.4.dmp test.07a.dmp test.07.dmp \
-test.21.dmp test.22.dmp test.23.dmp \
-test.31.dmp test.50.dmp test.53.dmp \
-test.55.dmp test.56.dmp test.57.dmp \
-test.66.dmp test.67.dmp test.68.dmp \
-test.69.dmp test.an1.dmp test.dfp1.dmp \
-test.gr1.dmp test.gr2.dmp test.gr3.dmp \
-test.gr4.dmp test.gr5.dmp test.sds1.dmp \
-test.sds2.dmp test.sds3.dmp test.sds4.dmp \
-test.sds5.dmp test.vs1.dmp test.vs2.dmp \
-test.vs3.dmp test.vs4.dmp test.vs5.dmp \
-whoi.dmp \
-GLOBEC_cetaceans.1.dmp GLOBEC_cetaceans.2.dmp \
-CMakeLists.txt
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ncdap_test/expectremote4/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign ncdap_test/expectremote4/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	cscopelist-am ctags-am distclean distclean-generic \
-	distclean-libtool distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/ncdap_test/expectremote4/NestedSeq.dmp b/ncdap_test/expectremote4/NestedSeq.dmp
deleted file mode 100644
index 0c8b0ae..0000000
--- a/ncdap_test/expectremote4/NestedSeq.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf NestedSeq {
-types:
-  short(*) stuff_t ;
-  compound person1_record_t {
-    int age ;
-    stuff_t stuff ;
-  }; // person1_record_t
-  person1_record_t(*) person1_t ;
-variables:
-	person1_t person1 ;
-data:
-
- person1 = 
-    {{1, {0, 16, 32, 48, 64}}, {2, {80, 96, 112, 128, 144}}, {3, {160, 176, 192, 208, 224}}, {5, {240, 256, 272, 288, 304}}, {8, {320, 336, 352, 368, 384}}} ;
-}
diff --git a/ncdap_test/expectremote4/NestedSeq2.dmp b/ncdap_test/expectremote4/NestedSeq2.dmp
deleted file mode 100644
index 313984f..0000000
--- a/ncdap_test/expectremote4/NestedSeq2.dmp
+++ /dev/null
@@ -1,35 +0,0 @@
-netcdf NestedSeq2 {
-types:
-  compound person1.stuff_record_t {
-    short foo ;
-    short bar ;
-  }; // person1.stuff_record_t
-  person1.stuff_record_t(*) person1.stuff_t ;
-  compound person1_record_t {
-    int age ;
-    int size ;
-    person1.stuff_t stuff ;
-  }; // person1_record_t
-  person1_record_t(*) person1_t ;
-  compound stuff_record_t {
-    short foo ;
-    short bar ;
-  }; // stuff_record_t
-  stuff_record_t(*) stuff_t ;
-  compound person2_record_t {
-    int age ;
-    stuff_t stuff ;
-    int size ;
-  }; // person2_record_t
-  person2_record_t(*) person2_t ;
-variables:
-	person1_t person1 ;
-	person2_t person2 ;
-data:
-
- person1 = 
-    {{1, 2, {{0, 16}, {32, 48}, {64, 80}, {96, 112}, {128, 144}}}, {3, 5, {{160, 176}, {192, 208}, {224, 240}, {256, 272}, {288, 304}}}, {8, 13, {{320, 336}, {352, 368}, {384, 400}, {416, 432}, {448, 464}}}, {21, 34, {{480, 496}, {512, 528}, {544, 560}, {576, 592}, {608, 624}}}, {55, 89, {{640, 656}, {672, 688}, {704, 720}, {736, 752}, {768, 784}}}} ;
-
- person2 = 
-    {{144, {{800, 816}, {832, 848}, {864, 880}, {896, 912}, {928, 944}}, 233}, {377, {{960, 976}, {992, 1008}, {1024, 1040}, {1056, 1072}, {1088, 1104}}, 610}, {987, {{1120, 1136}, {1152, 1168}, {1184, 1200}, {1216, 1232}, {1248, 1264}}, 1597}, {2584, {{1280, 1296}, {1312, 1328}, {1344, 1360}, {1376, 1392}, {1408, 1424}}, 4181}, {6765, {{1440, 1456}, {1472, 1488}, {1504, 1520}, {1536, 1552}, {1568, 1584}}, 10946}} ;
-}
diff --git a/ncdap_test/expectremote4/OverideExample.dmp b/ncdap_test/expectremote4/OverideExample.dmp
deleted file mode 100644
index 988374b..0000000
--- a/ncdap_test/expectremote4/OverideExample.dmp
+++ /dev/null
@@ -1,25 +0,0 @@
-netcdf OverideExample {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042 [...]
-}
diff --git a/ncdap_test/expectremote4/SimpleDrdsExample.dmp b/ncdap_test/expectremote4/SimpleDrdsExample.dmp
deleted file mode 100644
index b5d3686..0000000
--- a/ncdap_test/expectremote4/SimpleDrdsExample.dmp
+++ /dev/null
@@ -1,62 +0,0 @@
-netcdf SimpleDrdsExample {
-types:
-  compound Drifters_record_t {
-    double battery ;
-    double checksum ;
-    double data_age ;
-    double ed490 ;
-    double ed490_stdev ;
-    string instrument_id ;
-    double flag_argos ;
-    double flag_gps ;
-    double flag_optical ;
-    double flag_sampling ;
-    double flag_tracking ;
-    double gpshour ;
-    double gpslat ;
-    double gpslon ;
-    double latitude ;
-    string location ;
-    double longitude ;
-    double lu412 ;
-    double lu412_stdev ;
-    double lu443 ;
-    double lu443_stdev ;
-    double lu490 ;
-    double lu490_stdev ;
-    double lu510 ;
-    double lu510_stdev ;
-    double lu555 ;
-    double lu555_stdev ;
-    double lu670 ;
-    double lu670_stdev ;
-    double lu683 ;
-    double lu683_stdev ;
-    double max_depth ;
-    double night_len ;
-    double nsamp ;
-    double numaves ;
-    double press_volts ;
-    double rellat1hr ;
-    double rellat2hr ;
-    double rellon1hr ;
-    double rellon2hr ;
-    double sst ;
-    double sub_wait ;
-    double surf_volts ;
-    double surface_average ;
-    double surface_percent ;
-    double time ;
-    double ttff ;
-    double maxgps ;
-    double rellat3hr ;
-    double rellon3hr ;
-  }; // Drifters_record_t
-  Drifters_record_t(*) Drifters_t ;
-variables:
-	Drifters_t Drifters ;
-data:
-
- Drifters = 
-    {{1000, 999.950000416665, 999.800006666578, 999.550033748988, 999.200106660978, "This is a data test string (pass 0).", 998.750260394966, 998.200539935204, 997.55100025328, 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697, 992.808635853866, 991.561893714788, "This is a data test string (pass 1).", 990.215996212637, 988.771077936042, 987.227283375627, 985.584766909561, 983.843692788121, 982.00423511727, 980.066577841242, 978.030914724148, 975.897449330605, 973.66 [...]
-}
diff --git a/ncdap_test/expectremote4/b31.dmp b/ncdap_test/expectremote4/b31.dmp
deleted file mode 100644
index 1d5f1aa..0000000
--- a/ncdap_test/expectremote4/b31.dmp
+++ /dev/null
@@ -1,20 +0,0 @@
-netcdf b31 {
-types:
-  compound b31_record_t {
-    double id ;
-    string class ;
-    string text ;
-  }; // b31_record_t
-  b31_record_t(*) b31_t ;
-variables:
-	b31_t b31 ;
-	int b32 ;
-		string b32:billy = "Bob is my real name" ;
-		string b32:Robert = "Really wants to be called Billy" ;
-data:
-
- b31 = 
-    {{1000, "This is a data test string (pass 0).", "This is a data test string (pass 1)."}, {999.950000416665, "This is a data test string (pass 2).", "This is a data test string (pass 3)."}, {999.800006666578, "This is a data test string (pass 4).", "This is a data test string (pass 5)."}, {999.550033748988, "This is a data test string (pass 6).", "This is a data test string (pass 7)."}, {999.200106660978, "This is a data test string (pass 8).", "This is a data test string (pass 9)."}} ;
-
- b32 = 1 ;
-}
diff --git a/ncdap_test/expectremote4/b31a.dmp b/ncdap_test/expectremote4/b31a.dmp
deleted file mode 100644
index 5e5a5fc..0000000
--- a/ncdap_test/expectremote4/b31a.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf b31a {
-types:
-  compound b31_record_t {
-    double id ;
-    string class ;
-    string text ;
-  }; // b31_record_t
-  b31_record_t(*) b31_t ;
-variables:
-	b31_t b31 ;
-data:
-
- b31 = 
-    {{1000, "This is a data test string (pass 0).", "This is a data test string (pass 1)."}, {999.950000416665, "This is a data test string (pass 2).", "This is a data test string (pass 3)."}, {999.800006666578, "This is a data test string (pass 4).", "This is a data test string (pass 5)."}, {999.550033748988, "This is a data test string (pass 6).", "This is a data test string (pass 7)."}, {999.200106660978, "This is a data test string (pass 8).", "This is a data test string (pass 9)."}} ;
-}
diff --git a/ncdap_test/expectremote4/ingrid.dmp b/ncdap_test/expectremote4/ingrid.dmp
deleted file mode 100644
index 6f09333..0000000
--- a/ncdap_test/expectremote4/ingrid.dmp
+++ /dev/null
@@ -1,33 +0,0 @@
-netcdf ingrid {
-types:
-  compound v3H_t {
-    float v3H(35, 44) ;
-    int ISTA(35) ;
-    float IZ(44) ;
-  }; // v3H_t
-dimensions:
-	ISTA = 35 ;
-	IZ = 44 ;
-variables:
-	int ISTA(ISTA) ;
-	float IZ(IZ) ;
-	v3H_t v3H ;
-data:
-
- ISTA = 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 
-    22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 
-    43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 61440, 
-    63488, 65536, 67584, 69632 ;
-
- IZ = 0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 
-    0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 
-    0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 
-    0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 
-    0.2377026, 0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 
-    0.2955202, 0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 
-    0.3522742, 0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 
-    0.4077604, 0.4168708 ;
-
- v3H = 
-    {{0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 0.2377026, 0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 0.2955202, 0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 0.3522742, 0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 0.4077604, 0.4168708, 0.425 [...]
-}
diff --git a/ncdap_test/expectremote4/nestedDAS.dmp b/ncdap_test/expectremote4/nestedDAS.dmp
deleted file mode 100644
index 8681434..0000000
--- a/ncdap_test/expectremote4/nestedDAS.dmp
+++ /dev/null
@@ -1,12 +0,0 @@
-netcdf nestedDAS {
-variables:
-	ubyte b31 ;
-	string b32 ;
-		string b32:billy = "Bob is my real name" ;
-		string b32:Robert = "Really wants to be called Billy" ;
-data:
-
- b31 = 0 ;
-
- b32 = "This is a data test string (pass 0)." ;
-}
diff --git a/ncdap_test/expectremote4/test.01.1.dmp b/ncdap_test/expectremote4/test.01.1.dmp
deleted file mode 100644
index 9caf965..0000000
--- a/ncdap_test/expectremote4/test.01.1.dmp
+++ /dev/null
@@ -1,17 +0,0 @@
-netcdf test {
-variables:
-	double f64 ;
-
-// global attributes:
-		:Facility.PrincipleInvestigator = "Mark Abbott\n",
-			"Ph.D" ;
-		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
-		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-		:b.Description = "A test byte" ;
-		:b.units = "unknown" ;
-		:i32.Description = "A 32 bit test server int" ;
-		:i32.units = "unknown" ;
-data:
-
- f64 = 1000 ;
-}
diff --git a/ncdap_test/expectremote4/test.01.dmp b/ncdap_test/expectremote4/test.01.dmp
deleted file mode 100644
index 8154eae..0000000
--- a/ncdap_test/expectremote4/test.01.dmp
+++ /dev/null
@@ -1,41 +0,0 @@
-netcdf test {
-variables:
-	ubyte b ;
-		string b:Description = "A test byte" ;
-		string b:units = "unknown" ;
-	int i32 ;
-		string i32:Description = "A 32 bit test server int" ;
-		string i32:units = "unknown" ;
-	uint ui32 ;
-	short i16 ;
-	ushort ui16 ;
-	float f32 ;
-	double f64 ;
-	string s ;
-	string u ;
-
-// global attributes:
-		:Facility.PrincipleInvestigator = "Mark Abbott\n",
-			"Ph.D" ;
-		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
-		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-data:
-
- b = 0 ;
-
- i32 = 1 ;
-
- ui32 = 0 ;
-
- i16 = 0 ;
-
- ui16 = 0 ;
-
- f32 = 0 ;
-
- f64 = 1000 ;
-
- s = "This is a data test string (pass 0)." ;
-
- u = "http://www.dods.org" ;
-}
diff --git a/ncdap_test/expectremote4/test.02.1.dmp b/ncdap_test/expectremote4/test.02.1.dmp
deleted file mode 100644
index 37c38fe..0000000
--- a/ncdap_test/expectremote4/test.02.1.dmp
+++ /dev/null
@@ -1,9 +0,0 @@
-netcdf test {
-dimensions:
-	b_0 = 5 ;
-variables:
-	ubyte b(b_0) ;
-data:
-
- b = 1, 3, 5, 7, 9 ;
-}
diff --git a/ncdap_test/expectremote4/test.02.dmp b/ncdap_test/expectremote4/test.02.dmp
deleted file mode 100644
index 7ab613f..0000000
--- a/ncdap_test/expectremote4/test.02.dmp
+++ /dev/null
@@ -1,93 +0,0 @@
-netcdf test {
-dimensions:
-	b_0 = 25 ;
-	f32_0 = 25 ;
-	f64_0 = 25 ;
-	i16_0 = 25 ;
-	i32_0 = 25 ;
-	s_0 = 25 ;
-	u_0 = 25 ;
-	ui16_0 = 25 ;
-	ui32_0 = 25 ;
-variables:
-	ubyte b(b_0) ;
-	int i32(i32_0) ;
-	uint ui32(ui32_0) ;
-	short i16(i16_0) ;
-	ushort ui16(ui16_0) ;
-	float f32(f32_0) ;
-	double f64(f64_0) ;
-	string s(s_0) ;
-	string u(u_0) ;
-data:
-
- b = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
-    20, 21, 22, 23, 24 ;
-
- i32 = 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 
-    22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 
-    43008, 45056, 47104, 49152 ;
-
- ui32 = 0, 4096, 8192, 12288, 16384, 20480, 24576, 28672, 32768, 36864, 
-    40960, 45056, 49152, 53248, 57344, 61440, 65536, 69632, 73728, 77824, 
-    81920, 86016, 90112, 94208, 98304 ;
-
- i16 = 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 
-    3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 
-    6144 ;
-
- ui16 = 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 
-    11264, 12288, 13312, 14336, 15360, 16384, 17408, 18432, 19456, 20480, 
-    21504, 22528, 23552, 24576 ;
-
- f32 = 0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 
-    0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 
-    0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 
-    0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 
-    0.2377026 ;
-
- f64 = 1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204, 
-    0.99755100025328, 0.996801706302619, 0.995952733011994, 
-    0.995004165278026, 0.993956097956697, 0.992808635853866, 
-    0.991561893714788, 0.990215996212637, 0.988771077936042, 
-    0.987227283375627, 0.985584766909561, 0.983843692788121, 
-    0.98200423511727, 0.980066577841242, 0.978030914724148, 
-    0.975897449330606, 0.973666395005375, 0.97133797485203 ;
-
- s = "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).", 
-    "This is a data test string (pass 10).", 
-    "This is a data test string (pass 11).", 
-    "This is a data test string (pass 12).", 
-    "This is a data test string (pass 13).", 
-    "This is a data test string (pass 14).", 
-    "This is a data test string (pass 15).", 
-    "This is a data test string (pass 16).", 
-    "This is a data test string (pass 17).", 
-    "This is a data test string (pass 18).", 
-    "This is a data test string (pass 19).", 
-    "This is a data test string (pass 20).", 
-    "This is a data test string (pass 21).", 
-    "This is a data test string (pass 22).", 
-    "This is a data test string (pass 23).", 
-    "This is a data test string (pass 24)." ;
-
- u = "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org" ;
-}
diff --git a/ncdap_test/expectremote4/test.03.1.dmp b/ncdap_test/expectremote4/test.03.1.dmp
deleted file mode 100644
index b0eb41b..0000000
--- a/ncdap_test/expectremote4/test.03.1.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf test {
-dimensions:
-	i32_0 = 2 ;
-	i32_1 = 2 ;
-	i32_2 = 3 ;
-variables:
-	int i32(i32_0, i32_1, i32_2) ;
-data:
-
- i32 =
-  8192, 10240, 12288,
-  16384, 18432, 20480,
-  32768, 34816, 36864,
-  40960, 43008, 45056 ;
-}
diff --git a/ncdap_test/expectremote4/test.03.2.dmp b/ncdap_test/expectremote4/test.03.2.dmp
deleted file mode 100644
index b43837d..0000000
--- a/ncdap_test/expectremote4/test.03.2.dmp
+++ /dev/null
@@ -1,1011 +0,0 @@
-netcdf test {
-dimensions:
-	s1_0 = 10 ;
-	s1_1 = 10 ;
-	s1_2 = 10 ;
-variables:
-	string s1(s1_0, s1_1, s1_2) ;
-data:
-
- s1 =
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 10).", 
-    "This is a data test string (pass 11).", 
-    "This is a data test string (pass 12).", 
-    "This is a data test string (pass 13).", 
-    "This is a data test string (pass 14).", 
-    "This is a data test string (pass 15).", 
-    "This is a data test string (pass 16).", 
-    "This is a data test string (pass 17).", 
-    "This is a data test string (pass 18).", 
-    "This is a data test string (pass 19).",
-  "This is a data test string (pass 20).", 
-    "This is a data test string (pass 21).", 
-    "This is a data test string (pass 22).", 
-    "This is a data test string (pass 23).", 
-    "This is a data test string (pass 24).", 
-    "This is a data test string (pass 25).", 
-    "This is a data test string (pass 26).", 
-    "This is a data test string (pass 27).", 
-    "This is a data test string (pass 28).", 
-    "This is a data test string (pass 29).",
-  "This is a data test string (pass 30).", 
-    "This is a data test string (pass 31).", 
-    "This is a data test string (pass 32).", 
-    "This is a data test string (pass 33).", 
-    "This is a data test string (pass 34).", 
-    "This is a data test string (pass 35).", 
-    "This is a data test string (pass 36).", 
-    "This is a data test string (pass 37).", 
-    "This is a data test string (pass 38).", 
-    "This is a data test string (pass 39).",
-  "This is a data test string (pass 40).", 
-    "This is a data test string (pass 41).", 
-    "This is a data test string (pass 42).", 
-    "This is a data test string (pass 43).", 
-    "This is a data test string (pass 44).", 
-    "This is a data test string (pass 45).", 
-    "This is a data test string (pass 46).", 
-    "This is a data test string (pass 47).", 
-    "This is a data test string (pass 48).", 
-    "This is a data test string (pass 49).",
-  "This is a data test string (pass 50).", 
-    "This is a data test string (pass 51).", 
-    "This is a data test string (pass 52).", 
-    "This is a data test string (pass 53).", 
-    "This is a data test string (pass 54).", 
-    "This is a data test string (pass 55).", 
-    "This is a data test string (pass 56).", 
-    "This is a data test string (pass 57).", 
-    "This is a data test string (pass 58).", 
-    "This is a data test string (pass 59).",
-  "This is a data test string (pass 60).", 
-    "This is a data test string (pass 61).", 
-    "This is a data test string (pass 62).", 
-    "This is a data test string (pass 63).", 
-    "This is a data test string (pass 64).", 
-    "This is a data test string (pass 65).", 
-    "This is a data test string (pass 66).", 
-    "This is a data test string (pass 67).", 
-    "This is a data test string (pass 68).", 
-    "This is a data test string (pass 69).",
-  "This is a data test string (pass 70).", 
-    "This is a data test string (pass 71).", 
-    "This is a data test string (pass 72).", 
-    "This is a data test string (pass 73).", 
-    "This is a data test string (pass 74).", 
-    "This is a data test string (pass 75).", 
-    "This is a data test string (pass 76).", 
-    "This is a data test string (pass 77).", 
-    "This is a data test string (pass 78).", 
-    "This is a data test string (pass 79).",
-  "This is a data test string (pass 80).", 
-    "This is a data test string (pass 81).", 
-    "This is a data test string (pass 82).", 
-    "This is a data test string (pass 83).", 
-    "This is a data test string (pass 84).", 
-    "This is a data test string (pass 85).", 
-    "This is a data test string (pass 86).", 
-    "This is a data test string (pass 87).", 
-    "This is a data test string (pass 88).", 
-    "This is a data test string (pass 89).",
-  "This is a data test string (pass 90).", 
-    "This is a data test string (pass 91).", 
-    "This is a data test string (pass 92).", 
-    "This is a data test string (pass 93).", 
-    "This is a data test string (pass 94).", 
-    "This is a data test string (pass 95).", 
-    "This is a data test string (pass 96).", 
-    "This is a data test string (pass 97).", 
-    "This is a data test string (pass 98).", 
-    "This is a data test string (pass 99).",
-  "This is a data test string (pass 100).", 
-    "This is a data test string (pass 101).", 
-    "This is a data test string (pass 102).", 
-    "This is a data test string (pass 103).", 
-    "This is a data test string (pass 104).", 
-    "This is a data test string (pass 105).", 
-    "This is a data test string (pass 106).", 
-    "This is a data test string (pass 107).", 
-    "This is a data test string (pass 108).", 
-    "This is a data test string (pass 109).",
-  "This is a data test string (pass 110).", 
-    "This is a data test string (pass 111).", 
-    "This is a data test string (pass 112).", 
-    "This is a data test string (pass 113).", 
-    "This is a data test string (pass 114).", 
-    "This is a data test string (pass 115).", 
-    "This is a data test string (pass 116).", 
-    "This is a data test string (pass 117).", 
-    "This is a data test string (pass 118).", 
-    "This is a data test string (pass 119).",
-  "This is a data test string (pass 120).", 
-    "This is a data test string (pass 121).", 
-    "This is a data test string (pass 122).", 
-    "This is a data test string (pass 123).", 
-    "This is a data test string (pass 124).", 
-    "This is a data test string (pass 125).", 
-    "This is a data test string (pass 126).", 
-    "This is a data test string (pass 127).", 
-    "This is a data test string (pass 128).", 
-    "This is a data test string (pass 129).",
-  "This is a data test string (pass 130).", 
-    "This is a data test string (pass 131).", 
-    "This is a data test string (pass 132).", 
-    "This is a data test string (pass 133).", 
-    "This is a data test string (pass 134).", 
-    "This is a data test string (pass 135).", 
-    "This is a data test string (pass 136).", 
-    "This is a data test string (pass 137).", 
-    "This is a data test string (pass 138).", 
-    "This is a data test string (pass 139).",
-  "This is a data test string (pass 140).", 
-    "This is a data test string (pass 141).", 
-    "This is a data test string (pass 142).", 
-    "This is a data test string (pass 143).", 
-    "This is a data test string (pass 144).", 
-    "This is a data test string (pass 145).", 
-    "This is a data test string (pass 146).", 
-    "This is a data test string (pass 147).", 
-    "This is a data test string (pass 148).", 
-    "This is a data test string (pass 149).",
-  "This is a data test string (pass 150).", 
-    "This is a data test string (pass 151).", 
-    "This is a data test string (pass 152).", 
-    "This is a data test string (pass 153).", 
-    "This is a data test string (pass 154).", 
-    "This is a data test string (pass 155).", 
-    "This is a data test string (pass 156).", 
-    "This is a data test string (pass 157).", 
-    "This is a data test string (pass 158).", 
-    "This is a data test string (pass 159).",
-  "This is a data test string (pass 160).", 
-    "This is a data test string (pass 161).", 
-    "This is a data test string (pass 162).", 
-    "This is a data test string (pass 163).", 
-    "This is a data test string (pass 164).", 
-    "This is a data test string (pass 165).", 
-    "This is a data test string (pass 166).", 
-    "This is a data test string (pass 167).", 
-    "This is a data test string (pass 168).", 
-    "This is a data test string (pass 169).",
-  "This is a data test string (pass 170).", 
-    "This is a data test string (pass 171).", 
-    "This is a data test string (pass 172).", 
-    "This is a data test string (pass 173).", 
-    "This is a data test string (pass 174).", 
-    "This is a data test string (pass 175).", 
-    "This is a data test string (pass 176).", 
-    "This is a data test string (pass 177).", 
-    "This is a data test string (pass 178).", 
-    "This is a data test string (pass 179).",
-  "This is a data test string (pass 180).", 
-    "This is a data test string (pass 181).", 
-    "This is a data test string (pass 182).", 
-    "This is a data test string (pass 183).", 
-    "This is a data test string (pass 184).", 
-    "This is a data test string (pass 185).", 
-    "This is a data test string (pass 186).", 
-    "This is a data test string (pass 187).", 
-    "This is a data test string (pass 188).", 
-    "This is a data test string (pass 189).",
-  "This is a data test string (pass 190).", 
-    "This is a data test string (pass 191).", 
-    "This is a data test string (pass 192).", 
-    "This is a data test string (pass 193).", 
-    "This is a data test string (pass 194).", 
-    "This is a data test string (pass 195).", 
-    "This is a data test string (pass 196).", 
-    "This is a data test string (pass 197).", 
-    "This is a data test string (pass 198).", 
-    "This is a data test string (pass 199).",
-  "This is a data test string (pass 200).", 
-    "This is a data test string (pass 201).", 
-    "This is a data test string (pass 202).", 
-    "This is a data test string (pass 203).", 
-    "This is a data test string (pass 204).", 
-    "This is a data test string (pass 205).", 
-    "This is a data test string (pass 206).", 
-    "This is a data test string (pass 207).", 
-    "This is a data test string (pass 208).", 
-    "This is a data test string (pass 209).",
-  "This is a data test string (pass 210).", 
-    "This is a data test string (pass 211).", 
-    "This is a data test string (pass 212).", 
-    "This is a data test string (pass 213).", 
-    "This is a data test string (pass 214).", 
-    "This is a data test string (pass 215).", 
-    "This is a data test string (pass 216).", 
-    "This is a data test string (pass 217).", 
-    "This is a data test string (pass 218).", 
-    "This is a data test string (pass 219).",
-  "This is a data test string (pass 220).", 
-    "This is a data test string (pass 221).", 
-    "This is a data test string (pass 222).", 
-    "This is a data test string (pass 223).", 
-    "This is a data test string (pass 224).", 
-    "This is a data test string (pass 225).", 
-    "This is a data test string (pass 226).", 
-    "This is a data test string (pass 227).", 
-    "This is a data test string (pass 228).", 
-    "This is a data test string (pass 229).",
-  "This is a data test string (pass 230).", 
-    "This is a data test string (pass 231).", 
-    "This is a data test string (pass 232).", 
-    "This is a data test string (pass 233).", 
-    "This is a data test string (pass 234).", 
-    "This is a data test string (pass 235).", 
-    "This is a data test string (pass 236).", 
-    "This is a data test string (pass 237).", 
-    "This is a data test string (pass 238).", 
-    "This is a data test string (pass 239).",
-  "This is a data test string (pass 240).", 
-    "This is a data test string (pass 241).", 
-    "This is a data test string (pass 242).", 
-    "This is a data test string (pass 243).", 
-    "This is a data test string (pass 244).", 
-    "This is a data test string (pass 245).", 
-    "This is a data test string (pass 246).", 
-    "This is a data test string (pass 247).", 
-    "This is a data test string (pass 248).", 
-    "This is a data test string (pass 249).",
-  "This is a data test string (pass 250).", 
-    "This is a data test string (pass 251).", 
-    "This is a data test string (pass 252).", 
-    "This is a data test string (pass 253).", 
-    "This is a data test string (pass 254).", 
-    "This is a data test string (pass 255).", 
-    "This is a data test string (pass 256).", 
-    "This is a data test string (pass 257).", 
-    "This is a data test string (pass 258).", 
-    "This is a data test string (pass 259).",
-  "This is a data test string (pass 260).", 
-    "This is a data test string (pass 261).", 
-    "This is a data test string (pass 262).", 
-    "This is a data test string (pass 263).", 
-    "This is a data test string (pass 264).", 
-    "This is a data test string (pass 265).", 
-    "This is a data test string (pass 266).", 
-    "This is a data test string (pass 267).", 
-    "This is a data test string (pass 268).", 
-    "This is a data test string (pass 269).",
-  "This is a data test string (pass 270).", 
-    "This is a data test string (pass 271).", 
-    "This is a data test string (pass 272).", 
-    "This is a data test string (pass 273).", 
-    "This is a data test string (pass 274).", 
-    "This is a data test string (pass 275).", 
-    "This is a data test string (pass 276).", 
-    "This is a data test string (pass 277).", 
-    "This is a data test string (pass 278).", 
-    "This is a data test string (pass 279).",
-  "This is a data test string (pass 280).", 
-    "This is a data test string (pass 281).", 
-    "This is a data test string (pass 282).", 
-    "This is a data test string (pass 283).", 
-    "This is a data test string (pass 284).", 
-    "This is a data test string (pass 285).", 
-    "This is a data test string (pass 286).", 
-    "This is a data test string (pass 287).", 
-    "This is a data test string (pass 288).", 
-    "This is a data test string (pass 289).",
-  "This is a data test string (pass 290).", 
-    "This is a data test string (pass 291).", 
-    "This is a data test string (pass 292).", 
-    "This is a data test string (pass 293).", 
-    "This is a data test string (pass 294).", 
-    "This is a data test string (pass 295).", 
-    "This is a data test string (pass 296).", 
-    "This is a data test string (pass 297).", 
-    "This is a data test string (pass 298).", 
-    "This is a data test string (pass 299).",
-  "This is a data test string (pass 300).", 
-    "This is a data test string (pass 301).", 
-    "This is a data test string (pass 302).", 
-    "This is a data test string (pass 303).", 
-    "This is a data test string (pass 304).", 
-    "This is a data test string (pass 305).", 
-    "This is a data test string (pass 306).", 
-    "This is a data test string (pass 307).", 
-    "This is a data test string (pass 308).", 
-    "This is a data test string (pass 309).",
-  "This is a data test string (pass 310).", 
-    "This is a data test string (pass 311).", 
-    "This is a data test string (pass 312).", 
-    "This is a data test string (pass 313).", 
-    "This is a data test string (pass 314).", 
-    "This is a data test string (pass 315).", 
-    "This is a data test string (pass 316).", 
-    "This is a data test string (pass 317).", 
-    "This is a data test string (pass 318).", 
-    "This is a data test string (pass 319).",
-  "This is a data test string (pass 320).", 
-    "This is a data test string (pass 321).", 
-    "This is a data test string (pass 322).", 
-    "This is a data test string (pass 323).", 
-    "This is a data test string (pass 324).", 
-    "This is a data test string (pass 325).", 
-    "This is a data test string (pass 326).", 
-    "This is a data test string (pass 327).", 
-    "This is a data test string (pass 328).", 
-    "This is a data test string (pass 329).",
-  "This is a data test string (pass 330).", 
-    "This is a data test string (pass 331).", 
-    "This is a data test string (pass 332).", 
-    "This is a data test string (pass 333).", 
-    "This is a data test string (pass 334).", 
-    "This is a data test string (pass 335).", 
-    "This is a data test string (pass 336).", 
-    "This is a data test string (pass 337).", 
-    "This is a data test string (pass 338).", 
-    "This is a data test string (pass 339).",
-  "This is a data test string (pass 340).", 
-    "This is a data test string (pass 341).", 
-    "This is a data test string (pass 342).", 
-    "This is a data test string (pass 343).", 
-    "This is a data test string (pass 344).", 
-    "This is a data test string (pass 345).", 
-    "This is a data test string (pass 346).", 
-    "This is a data test string (pass 347).", 
-    "This is a data test string (pass 348).", 
-    "This is a data test string (pass 349).",
-  "This is a data test string (pass 350).", 
-    "This is a data test string (pass 351).", 
-    "This is a data test string (pass 352).", 
-    "This is a data test string (pass 353).", 
-    "This is a data test string (pass 354).", 
-    "This is a data test string (pass 355).", 
-    "This is a data test string (pass 356).", 
-    "This is a data test string (pass 357).", 
-    "This is a data test string (pass 358).", 
-    "This is a data test string (pass 359).",
-  "This is a data test string (pass 360).", 
-    "This is a data test string (pass 361).", 
-    "This is a data test string (pass 362).", 
-    "This is a data test string (pass 363).", 
-    "This is a data test string (pass 364).", 
-    "This is a data test string (pass 365).", 
-    "This is a data test string (pass 366).", 
-    "This is a data test string (pass 367).", 
-    "This is a data test string (pass 368).", 
-    "This is a data test string (pass 369).",
-  "This is a data test string (pass 370).", 
-    "This is a data test string (pass 371).", 
-    "This is a data test string (pass 372).", 
-    "This is a data test string (pass 373).", 
-    "This is a data test string (pass 374).", 
-    "This is a data test string (pass 375).", 
-    "This is a data test string (pass 376).", 
-    "This is a data test string (pass 377).", 
-    "This is a data test string (pass 378).", 
-    "This is a data test string (pass 379).",
-  "This is a data test string (pass 380).", 
-    "This is a data test string (pass 381).", 
-    "This is a data test string (pass 382).", 
-    "This is a data test string (pass 383).", 
-    "This is a data test string (pass 384).", 
-    "This is a data test string (pass 385).", 
-    "This is a data test string (pass 386).", 
-    "This is a data test string (pass 387).", 
-    "This is a data test string (pass 388).", 
-    "This is a data test string (pass 389).",
-  "This is a data test string (pass 390).", 
-    "This is a data test string (pass 391).", 
-    "This is a data test string (pass 392).", 
-    "This is a data test string (pass 393).", 
-    "This is a data test string (pass 394).", 
-    "This is a data test string (pass 395).", 
-    "This is a data test string (pass 396).", 
-    "This is a data test string (pass 397).", 
-    "This is a data test string (pass 398).", 
-    "This is a data test string (pass 399).",
-  "This is a data test string (pass 400).", 
-    "This is a data test string (pass 401).", 
-    "This is a data test string (pass 402).", 
-    "This is a data test string (pass 403).", 
-    "This is a data test string (pass 404).", 
-    "This is a data test string (pass 405).", 
-    "This is a data test string (pass 406).", 
-    "This is a data test string (pass 407).", 
-    "This is a data test string (pass 408).", 
-    "This is a data test string (pass 409).",
-  "This is a data test string (pass 410).", 
-    "This is a data test string (pass 411).", 
-    "This is a data test string (pass 412).", 
-    "This is a data test string (pass 413).", 
-    "This is a data test string (pass 414).", 
-    "This is a data test string (pass 415).", 
-    "This is a data test string (pass 416).", 
-    "This is a data test string (pass 417).", 
-    "This is a data test string (pass 418).", 
-    "This is a data test string (pass 419).",
-  "This is a data test string (pass 420).", 
-    "This is a data test string (pass 421).", 
-    "This is a data test string (pass 422).", 
-    "This is a data test string (pass 423).", 
-    "This is a data test string (pass 424).", 
-    "This is a data test string (pass 425).", 
-    "This is a data test string (pass 426).", 
-    "This is a data test string (pass 427).", 
-    "This is a data test string (pass 428).", 
-    "This is a data test string (pass 429).",
-  "This is a data test string (pass 430).", 
-    "This is a data test string (pass 431).", 
-    "This is a data test string (pass 432).", 
-    "This is a data test string (pass 433).", 
-    "This is a data test string (pass 434).", 
-    "This is a data test string (pass 435).", 
-    "This is a data test string (pass 436).", 
-    "This is a data test string (pass 437).", 
-    "This is a data test string (pass 438).", 
-    "This is a data test string (pass 439).",
-  "This is a data test string (pass 440).", 
-    "This is a data test string (pass 441).", 
-    "This is a data test string (pass 442).", 
-    "This is a data test string (pass 443).", 
-    "This is a data test string (pass 444).", 
-    "This is a data test string (pass 445).", 
-    "This is a data test string (pass 446).", 
-    "This is a data test string (pass 447).", 
-    "This is a data test string (pass 448).", 
-    "This is a data test string (pass 449).",
-  "This is a data test string (pass 450).", 
-    "This is a data test string (pass 451).", 
-    "This is a data test string (pass 452).", 
-    "This is a data test string (pass 453).", 
-    "This is a data test string (pass 454).", 
-    "This is a data test string (pass 455).", 
-    "This is a data test string (pass 456).", 
-    "This is a data test string (pass 457).", 
-    "This is a data test string (pass 458).", 
-    "This is a data test string (pass 459).",
-  "This is a data test string (pass 460).", 
-    "This is a data test string (pass 461).", 
-    "This is a data test string (pass 462).", 
-    "This is a data test string (pass 463).", 
-    "This is a data test string (pass 464).", 
-    "This is a data test string (pass 465).", 
-    "This is a data test string (pass 466).", 
-    "This is a data test string (pass 467).", 
-    "This is a data test string (pass 468).", 
-    "This is a data test string (pass 469).",
-  "This is a data test string (pass 470).", 
-    "This is a data test string (pass 471).", 
-    "This is a data test string (pass 472).", 
-    "This is a data test string (pass 473).", 
-    "This is a data test string (pass 474).", 
-    "This is a data test string (pass 475).", 
-    "This is a data test string (pass 476).", 
-    "This is a data test string (pass 477).", 
-    "This is a data test string (pass 478).", 
-    "This is a data test string (pass 479).",
-  "This is a data test string (pass 480).", 
-    "This is a data test string (pass 481).", 
-    "This is a data test string (pass 482).", 
-    "This is a data test string (pass 483).", 
-    "This is a data test string (pass 484).", 
-    "This is a data test string (pass 485).", 
-    "This is a data test string (pass 486).", 
-    "This is a data test string (pass 487).", 
-    "This is a data test string (pass 488).", 
-    "This is a data test string (pass 489).",
-  "This is a data test string (pass 490).", 
-    "This is a data test string (pass 491).", 
-    "This is a data test string (pass 492).", 
-    "This is a data test string (pass 493).", 
-    "This is a data test string (pass 494).", 
-    "This is a data test string (pass 495).", 
-    "This is a data test string (pass 496).", 
-    "This is a data test string (pass 497).", 
-    "This is a data test string (pass 498).", 
-    "This is a data test string (pass 499).",
-  "This is a data test string (pass 500).", 
-    "This is a data test string (pass 501).", 
-    "This is a data test string (pass 502).", 
-    "This is a data test string (pass 503).", 
-    "This is a data test string (pass 504).", 
-    "This is a data test string (pass 505).", 
-    "This is a data test string (pass 506).", 
-    "This is a data test string (pass 507).", 
-    "This is a data test string (pass 508).", 
-    "This is a data test string (pass 509).",
-  "This is a data test string (pass 510).", 
-    "This is a data test string (pass 511).", 
-    "This is a data test string (pass 512).", 
-    "This is a data test string (pass 513).", 
-    "This is a data test string (pass 514).", 
-    "This is a data test string (pass 515).", 
-    "This is a data test string (pass 516).", 
-    "This is a data test string (pass 517).", 
-    "This is a data test string (pass 518).", 
-    "This is a data test string (pass 519).",
-  "This is a data test string (pass 520).", 
-    "This is a data test string (pass 521).", 
-    "This is a data test string (pass 522).", 
-    "This is a data test string (pass 523).", 
-    "This is a data test string (pass 524).", 
-    "This is a data test string (pass 525).", 
-    "This is a data test string (pass 526).", 
-    "This is a data test string (pass 527).", 
-    "This is a data test string (pass 528).", 
-    "This is a data test string (pass 529).",
-  "This is a data test string (pass 530).", 
-    "This is a data test string (pass 531).", 
-    "This is a data test string (pass 532).", 
-    "This is a data test string (pass 533).", 
-    "This is a data test string (pass 534).", 
-    "This is a data test string (pass 535).", 
-    "This is a data test string (pass 536).", 
-    "This is a data test string (pass 537).", 
-    "This is a data test string (pass 538).", 
-    "This is a data test string (pass 539).",
-  "This is a data test string (pass 540).", 
-    "This is a data test string (pass 541).", 
-    "This is a data test string (pass 542).", 
-    "This is a data test string (pass 543).", 
-    "This is a data test string (pass 544).", 
-    "This is a data test string (pass 545).", 
-    "This is a data test string (pass 546).", 
-    "This is a data test string (pass 547).", 
-    "This is a data test string (pass 548).", 
-    "This is a data test string (pass 549).",
-  "This is a data test string (pass 550).", 
-    "This is a data test string (pass 551).", 
-    "This is a data test string (pass 552).", 
-    "This is a data test string (pass 553).", 
-    "This is a data test string (pass 554).", 
-    "This is a data test string (pass 555).", 
-    "This is a data test string (pass 556).", 
-    "This is a data test string (pass 557).", 
-    "This is a data test string (pass 558).", 
-    "This is a data test string (pass 559).",
-  "This is a data test string (pass 560).", 
-    "This is a data test string (pass 561).", 
-    "This is a data test string (pass 562).", 
-    "This is a data test string (pass 563).", 
-    "This is a data test string (pass 564).", 
-    "This is a data test string (pass 565).", 
-    "This is a data test string (pass 566).", 
-    "This is a data test string (pass 567).", 
-    "This is a data test string (pass 568).", 
-    "This is a data test string (pass 569).",
-  "This is a data test string (pass 570).", 
-    "This is a data test string (pass 571).", 
-    "This is a data test string (pass 572).", 
-    "This is a data test string (pass 573).", 
-    "This is a data test string (pass 574).", 
-    "This is a data test string (pass 575).", 
-    "This is a data test string (pass 576).", 
-    "This is a data test string (pass 577).", 
-    "This is a data test string (pass 578).", 
-    "This is a data test string (pass 579).",
-  "This is a data test string (pass 580).", 
-    "This is a data test string (pass 581).", 
-    "This is a data test string (pass 582).", 
-    "This is a data test string (pass 583).", 
-    "This is a data test string (pass 584).", 
-    "This is a data test string (pass 585).", 
-    "This is a data test string (pass 586).", 
-    "This is a data test string (pass 587).", 
-    "This is a data test string (pass 588).", 
-    "This is a data test string (pass 589).",
-  "This is a data test string (pass 590).", 
-    "This is a data test string (pass 591).", 
-    "This is a data test string (pass 592).", 
-    "This is a data test string (pass 593).", 
-    "This is a data test string (pass 594).", 
-    "This is a data test string (pass 595).", 
-    "This is a data test string (pass 596).", 
-    "This is a data test string (pass 597).", 
-    "This is a data test string (pass 598).", 
-    "This is a data test string (pass 599).",
-  "This is a data test string (pass 600).", 
-    "This is a data test string (pass 601).", 
-    "This is a data test string (pass 602).", 
-    "This is a data test string (pass 603).", 
-    "This is a data test string (pass 604).", 
-    "This is a data test string (pass 605).", 
-    "This is a data test string (pass 606).", 
-    "This is a data test string (pass 607).", 
-    "This is a data test string (pass 608).", 
-    "This is a data test string (pass 609).",
-  "This is a data test string (pass 610).", 
-    "This is a data test string (pass 611).", 
-    "This is a data test string (pass 612).", 
-    "This is a data test string (pass 613).", 
-    "This is a data test string (pass 614).", 
-    "This is a data test string (pass 615).", 
-    "This is a data test string (pass 616).", 
-    "This is a data test string (pass 617).", 
-    "This is a data test string (pass 618).", 
-    "This is a data test string (pass 619).",
-  "This is a data test string (pass 620).", 
-    "This is a data test string (pass 621).", 
-    "This is a data test string (pass 622).", 
-    "This is a data test string (pass 623).", 
-    "This is a data test string (pass 624).", 
-    "This is a data test string (pass 625).", 
-    "This is a data test string (pass 626).", 
-    "This is a data test string (pass 627).", 
-    "This is a data test string (pass 628).", 
-    "This is a data test string (pass 629).",
-  "This is a data test string (pass 630).", 
-    "This is a data test string (pass 631).", 
-    "This is a data test string (pass 632).", 
-    "This is a data test string (pass 633).", 
-    "This is a data test string (pass 634).", 
-    "This is a data test string (pass 635).", 
-    "This is a data test string (pass 636).", 
-    "This is a data test string (pass 637).", 
-    "This is a data test string (pass 638).", 
-    "This is a data test string (pass 639).",
-  "This is a data test string (pass 640).", 
-    "This is a data test string (pass 641).", 
-    "This is a data test string (pass 642).", 
-    "This is a data test string (pass 643).", 
-    "This is a data test string (pass 644).", 
-    "This is a data test string (pass 645).", 
-    "This is a data test string (pass 646).", 
-    "This is a data test string (pass 647).", 
-    "This is a data test string (pass 648).", 
-    "This is a data test string (pass 649).",
-  "This is a data test string (pass 650).", 
-    "This is a data test string (pass 651).", 
-    "This is a data test string (pass 652).", 
-    "This is a data test string (pass 653).", 
-    "This is a data test string (pass 654).", 
-    "This is a data test string (pass 655).", 
-    "This is a data test string (pass 656).", 
-    "This is a data test string (pass 657).", 
-    "This is a data test string (pass 658).", 
-    "This is a data test string (pass 659).",
-  "This is a data test string (pass 660).", 
-    "This is a data test string (pass 661).", 
-    "This is a data test string (pass 662).", 
-    "This is a data test string (pass 663).", 
-    "This is a data test string (pass 664).", 
-    "This is a data test string (pass 665).", 
-    "This is a data test string (pass 666).", 
-    "This is a data test string (pass 667).", 
-    "This is a data test string (pass 668).", 
-    "This is a data test string (pass 669).",
-  "This is a data test string (pass 670).", 
-    "This is a data test string (pass 671).", 
-    "This is a data test string (pass 672).", 
-    "This is a data test string (pass 673).", 
-    "This is a data test string (pass 674).", 
-    "This is a data test string (pass 675).", 
-    "This is a data test string (pass 676).", 
-    "This is a data test string (pass 677).", 
-    "This is a data test string (pass 678).", 
-    "This is a data test string (pass 679).",
-  "This is a data test string (pass 680).", 
-    "This is a data test string (pass 681).", 
-    "This is a data test string (pass 682).", 
-    "This is a data test string (pass 683).", 
-    "This is a data test string (pass 684).", 
-    "This is a data test string (pass 685).", 
-    "This is a data test string (pass 686).", 
-    "This is a data test string (pass 687).", 
-    "This is a data test string (pass 688).", 
-    "This is a data test string (pass 689).",
-  "This is a data test string (pass 690).", 
-    "This is a data test string (pass 691).", 
-    "This is a data test string (pass 692).", 
-    "This is a data test string (pass 693).", 
-    "This is a data test string (pass 694).", 
-    "This is a data test string (pass 695).", 
-    "This is a data test string (pass 696).", 
-    "This is a data test string (pass 697).", 
-    "This is a data test string (pass 698).", 
-    "This is a data test string (pass 699).",
-  "This is a data test string (pass 700).", 
-    "This is a data test string (pass 701).", 
-    "This is a data test string (pass 702).", 
-    "This is a data test string (pass 703).", 
-    "This is a data test string (pass 704).", 
-    "This is a data test string (pass 705).", 
-    "This is a data test string (pass 706).", 
-    "This is a data test string (pass 707).", 
-    "This is a data test string (pass 708).", 
-    "This is a data test string (pass 709).",
-  "This is a data test string (pass 710).", 
-    "This is a data test string (pass 711).", 
-    "This is a data test string (pass 712).", 
-    "This is a data test string (pass 713).", 
-    "This is a data test string (pass 714).", 
-    "This is a data test string (pass 715).", 
-    "This is a data test string (pass 716).", 
-    "This is a data test string (pass 717).", 
-    "This is a data test string (pass 718).", 
-    "This is a data test string (pass 719).",
-  "This is a data test string (pass 720).", 
-    "This is a data test string (pass 721).", 
-    "This is a data test string (pass 722).", 
-    "This is a data test string (pass 723).", 
-    "This is a data test string (pass 724).", 
-    "This is a data test string (pass 725).", 
-    "This is a data test string (pass 726).", 
-    "This is a data test string (pass 727).", 
-    "This is a data test string (pass 728).", 
-    "This is a data test string (pass 729).",
-  "This is a data test string (pass 730).", 
-    "This is a data test string (pass 731).", 
-    "This is a data test string (pass 732).", 
-    "This is a data test string (pass 733).", 
-    "This is a data test string (pass 734).", 
-    "This is a data test string (pass 735).", 
-    "This is a data test string (pass 736).", 
-    "This is a data test string (pass 737).", 
-    "This is a data test string (pass 738).", 
-    "This is a data test string (pass 739).",
-  "This is a data test string (pass 740).", 
-    "This is a data test string (pass 741).", 
-    "This is a data test string (pass 742).", 
-    "This is a data test string (pass 743).", 
-    "This is a data test string (pass 744).", 
-    "This is a data test string (pass 745).", 
-    "This is a data test string (pass 746).", 
-    "This is a data test string (pass 747).", 
-    "This is a data test string (pass 748).", 
-    "This is a data test string (pass 749).",
-  "This is a data test string (pass 750).", 
-    "This is a data test string (pass 751).", 
-    "This is a data test string (pass 752).", 
-    "This is a data test string (pass 753).", 
-    "This is a data test string (pass 754).", 
-    "This is a data test string (pass 755).", 
-    "This is a data test string (pass 756).", 
-    "This is a data test string (pass 757).", 
-    "This is a data test string (pass 758).", 
-    "This is a data test string (pass 759).",
-  "This is a data test string (pass 760).", 
-    "This is a data test string (pass 761).", 
-    "This is a data test string (pass 762).", 
-    "This is a data test string (pass 763).", 
-    "This is a data test string (pass 764).", 
-    "This is a data test string (pass 765).", 
-    "This is a data test string (pass 766).", 
-    "This is a data test string (pass 767).", 
-    "This is a data test string (pass 768).", 
-    "This is a data test string (pass 769).",
-  "This is a data test string (pass 770).", 
-    "This is a data test string (pass 771).", 
-    "This is a data test string (pass 772).", 
-    "This is a data test string (pass 773).", 
-    "This is a data test string (pass 774).", 
-    "This is a data test string (pass 775).", 
-    "This is a data test string (pass 776).", 
-    "This is a data test string (pass 777).", 
-    "This is a data test string (pass 778).", 
-    "This is a data test string (pass 779).",
-  "This is a data test string (pass 780).", 
-    "This is a data test string (pass 781).", 
-    "This is a data test string (pass 782).", 
-    "This is a data test string (pass 783).", 
-    "This is a data test string (pass 784).", 
-    "This is a data test string (pass 785).", 
-    "This is a data test string (pass 786).", 
-    "This is a data test string (pass 787).", 
-    "This is a data test string (pass 788).", 
-    "This is a data test string (pass 789).",
-  "This is a data test string (pass 790).", 
-    "This is a data test string (pass 791).", 
-    "This is a data test string (pass 792).", 
-    "This is a data test string (pass 793).", 
-    "This is a data test string (pass 794).", 
-    "This is a data test string (pass 795).", 
-    "This is a data test string (pass 796).", 
-    "This is a data test string (pass 797).", 
-    "This is a data test string (pass 798).", 
-    "This is a data test string (pass 799).",
-  "This is a data test string (pass 800).", 
-    "This is a data test string (pass 801).", 
-    "This is a data test string (pass 802).", 
-    "This is a data test string (pass 803).", 
-    "This is a data test string (pass 804).", 
-    "This is a data test string (pass 805).", 
-    "This is a data test string (pass 806).", 
-    "This is a data test string (pass 807).", 
-    "This is a data test string (pass 808).", 
-    "This is a data test string (pass 809).",
-  "This is a data test string (pass 810).", 
-    "This is a data test string (pass 811).", 
-    "This is a data test string (pass 812).", 
-    "This is a data test string (pass 813).", 
-    "This is a data test string (pass 814).", 
-    "This is a data test string (pass 815).", 
-    "This is a data test string (pass 816).", 
-    "This is a data test string (pass 817).", 
-    "This is a data test string (pass 818).", 
-    "This is a data test string (pass 819).",
-  "This is a data test string (pass 820).", 
-    "This is a data test string (pass 821).", 
-    "This is a data test string (pass 822).", 
-    "This is a data test string (pass 823).", 
-    "This is a data test string (pass 824).", 
-    "This is a data test string (pass 825).", 
-    "This is a data test string (pass 826).", 
-    "This is a data test string (pass 827).", 
-    "This is a data test string (pass 828).", 
-    "This is a data test string (pass 829).",
-  "This is a data test string (pass 830).", 
-    "This is a data test string (pass 831).", 
-    "This is a data test string (pass 832).", 
-    "This is a data test string (pass 833).", 
-    "This is a data test string (pass 834).", 
-    "This is a data test string (pass 835).", 
-    "This is a data test string (pass 836).", 
-    "This is a data test string (pass 837).", 
-    "This is a data test string (pass 838).", 
-    "This is a data test string (pass 839).",
-  "This is a data test string (pass 840).", 
-    "This is a data test string (pass 841).", 
-    "This is a data test string (pass 842).", 
-    "This is a data test string (pass 843).", 
-    "This is a data test string (pass 844).", 
-    "This is a data test string (pass 845).", 
-    "This is a data test string (pass 846).", 
-    "This is a data test string (pass 847).", 
-    "This is a data test string (pass 848).", 
-    "This is a data test string (pass 849).",
-  "This is a data test string (pass 850).", 
-    "This is a data test string (pass 851).", 
-    "This is a data test string (pass 852).", 
-    "This is a data test string (pass 853).", 
-    "This is a data test string (pass 854).", 
-    "This is a data test string (pass 855).", 
-    "This is a data test string (pass 856).", 
-    "This is a data test string (pass 857).", 
-    "This is a data test string (pass 858).", 
-    "This is a data test string (pass 859).",
-  "This is a data test string (pass 860).", 
-    "This is a data test string (pass 861).", 
-    "This is a data test string (pass 862).", 
-    "This is a data test string (pass 863).", 
-    "This is a data test string (pass 864).", 
-    "This is a data test string (pass 865).", 
-    "This is a data test string (pass 866).", 
-    "This is a data test string (pass 867).", 
-    "This is a data test string (pass 868).", 
-    "This is a data test string (pass 869).",
-  "This is a data test string (pass 870).", 
-    "This is a data test string (pass 871).", 
-    "This is a data test string (pass 872).", 
-    "This is a data test string (pass 873).", 
-    "This is a data test string (pass 874).", 
-    "This is a data test string (pass 875).", 
-    "This is a data test string (pass 876).", 
-    "This is a data test string (pass 877).", 
-    "This is a data test string (pass 878).", 
-    "This is a data test string (pass 879).",
-  "This is a data test string (pass 880).", 
-    "This is a data test string (pass 881).", 
-    "This is a data test string (pass 882).", 
-    "This is a data test string (pass 883).", 
-    "This is a data test string (pass 884).", 
-    "This is a data test string (pass 885).", 
-    "This is a data test string (pass 886).", 
-    "This is a data test string (pass 887).", 
-    "This is a data test string (pass 888).", 
-    "This is a data test string (pass 889).",
-  "This is a data test string (pass 890).", 
-    "This is a data test string (pass 891).", 
-    "This is a data test string (pass 892).", 
-    "This is a data test string (pass 893).", 
-    "This is a data test string (pass 894).", 
-    "This is a data test string (pass 895).", 
-    "This is a data test string (pass 896).", 
-    "This is a data test string (pass 897).", 
-    "This is a data test string (pass 898).", 
-    "This is a data test string (pass 899).",
-  "This is a data test string (pass 900).", 
-    "This is a data test string (pass 901).", 
-    "This is a data test string (pass 902).", 
-    "This is a data test string (pass 903).", 
-    "This is a data test string (pass 904).", 
-    "This is a data test string (pass 905).", 
-    "This is a data test string (pass 906).", 
-    "This is a data test string (pass 907).", 
-    "This is a data test string (pass 908).", 
-    "This is a data test string (pass 909).",
-  "This is a data test string (pass 910).", 
-    "This is a data test string (pass 911).", 
-    "This is a data test string (pass 912).", 
-    "This is a data test string (pass 913).", 
-    "This is a data test string (pass 914).", 
-    "This is a data test string (pass 915).", 
-    "This is a data test string (pass 916).", 
-    "This is a data test string (pass 917).", 
-    "This is a data test string (pass 918).", 
-    "This is a data test string (pass 919).",
-  "This is a data test string (pass 920).", 
-    "This is a data test string (pass 921).", 
-    "This is a data test string (pass 922).", 
-    "This is a data test string (pass 923).", 
-    "This is a data test string (pass 924).", 
-    "This is a data test string (pass 925).", 
-    "This is a data test string (pass 926).", 
-    "This is a data test string (pass 927).", 
-    "This is a data test string (pass 928).", 
-    "This is a data test string (pass 929).",
-  "This is a data test string (pass 930).", 
-    "This is a data test string (pass 931).", 
-    "This is a data test string (pass 932).", 
-    "This is a data test string (pass 933).", 
-    "This is a data test string (pass 934).", 
-    "This is a data test string (pass 935).", 
-    "This is a data test string (pass 936).", 
-    "This is a data test string (pass 937).", 
-    "This is a data test string (pass 938).", 
-    "This is a data test string (pass 939).",
-  "This is a data test string (pass 940).", 
-    "This is a data test string (pass 941).", 
-    "This is a data test string (pass 942).", 
-    "This is a data test string (pass 943).", 
-    "This is a data test string (pass 944).", 
-    "This is a data test string (pass 945).", 
-    "This is a data test string (pass 946).", 
-    "This is a data test string (pass 947).", 
-    "This is a data test string (pass 948).", 
-    "This is a data test string (pass 949).",
-  "This is a data test string (pass 950).", 
-    "This is a data test string (pass 951).", 
-    "This is a data test string (pass 952).", 
-    "This is a data test string (pass 953).", 
-    "This is a data test string (pass 954).", 
-    "This is a data test string (pass 955).", 
-    "This is a data test string (pass 956).", 
-    "This is a data test string (pass 957).", 
-    "This is a data test string (pass 958).", 
-    "This is a data test string (pass 959).",
-  "This is a data test string (pass 960).", 
-    "This is a data test string (pass 961).", 
-    "This is a data test string (pass 962).", 
-    "This is a data test string (pass 963).", 
-    "This is a data test string (pass 964).", 
-    "This is a data test string (pass 965).", 
-    "This is a data test string (pass 966).", 
-    "This is a data test string (pass 967).", 
-    "This is a data test string (pass 968).", 
-    "This is a data test string (pass 969).",
-  "This is a data test string (pass 970).", 
-    "This is a data test string (pass 971).", 
-    "This is a data test string (pass 972).", 
-    "This is a data test string (pass 973).", 
-    "This is a data test string (pass 974).", 
-    "This is a data test string (pass 975).", 
-    "This is a data test string (pass 976).", 
-    "This is a data test string (pass 977).", 
-    "This is a data test string (pass 978).", 
-    "This is a data test string (pass 979).",
-  "This is a data test string (pass 980).", 
-    "This is a data test string (pass 981).", 
-    "This is a data test string (pass 982).", 
-    "This is a data test string (pass 983).", 
-    "This is a data test string (pass 984).", 
-    "This is a data test string (pass 985).", 
-    "This is a data test string (pass 986).", 
-    "This is a data test string (pass 987).", 
-    "This is a data test string (pass 988).", 
-    "This is a data test string (pass 989).",
-  "This is a data test string (pass 990).", 
-    "This is a data test string (pass 991).", 
-    "This is a data test string (pass 992).", 
-    "This is a data test string (pass 993).", 
-    "This is a data test string (pass 994).", 
-    "This is a data test string (pass 995).", 
-    "This is a data test string (pass 996).", 
-    "This is a data test string (pass 997).", 
-    "This is a data test string (pass 998).", 
-    "This is a data test string (pass 999)." ;
-}
diff --git a/ncdap_test/expectremote4/test.03.dmp b/ncdap_test/expectremote4/test.03.dmp
deleted file mode 100644
index b02194f..0000000
--- a/ncdap_test/expectremote4/test.03.dmp
+++ /dev/null
@@ -1,1694 +0,0 @@
-netcdf test {
-dimensions:
-	b2_0 = 2 ;
-	b2_1 = 3 ;
-	b_0 = 2 ;
-	b_1 = 3 ;
-	b_2 = 4 ;
-	f32_0 = 2 ;
-	f32_1 = 2 ;
-	f32_2 = 2 ;
-	f64_0 = 2 ;
-	f64_1 = 2 ;
-	f64_2 = 2 ;
-	i16_0 = 2 ;
-	i16_1 = 2 ;
-	i16_2 = 2 ;
-	i32_0 = 2 ;
-	i32_1 = 3 ;
-	i32_2 = 4 ;
-	s0_0 = 4 ;
-	s0_1 = 5 ;
-	s0_2 = 6 ;
-	s1_0 = 10 ;
-	s1_1 = 10 ;
-	s1_2 = 10 ;
-	u_0 = 10 ;
-	u_1 = 10 ;
-	u_2 = 10 ;
-	ui16_0 = 2 ;
-	ui16_1 = 2 ;
-	ui16_2 = 2 ;
-	ui32_0 = 2 ;
-	ui32_1 = 3 ;
-	ui32_2 = 4 ;
-	ui32_3 = 3 ;
-	ui32_4 = 2 ;
-variables:
-	ubyte b(b_0, b_1, b_2) ;
-	ubyte b2(b2_0, b2_1) ;
-	int i32(i32_0, i32_1, i32_2) ;
-	uint ui32(ui32_0, ui32_1, ui32_2, ui32_3, ui32_4) ;
-	short i16(i16_0, i16_1, i16_2) ;
-	ushort ui16(ui16_0, ui16_1, ui16_2) ;
-	float f32(f32_0, f32_1, f32_2) ;
-	double f64(f64_0, f64_1, f64_2) ;
-	string s0(s0_0, s0_1, s0_2) ;
-	string s1(s1_0, s1_1, s1_2) ;
-	string u(u_0, u_1, u_2) ;
-data:
-
- b =
-  0, 1, 2, 3,
-  4, 5, 6, 7,
-  8, 9, 10, 11,
-  12, 13, 14, 15,
-  16, 17, 18, 19,
-  20, 21, 22, 23 ;
-
- b2 =
-  0, 1, 2,
-  3, 4, 5 ;
-
- i32 =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104 ;
-
- ui32 =
-  0, 4096,
-  8192, 12288,
-  16384, 20480,
-  24576, 28672,
-  32768, 36864,
-  40960, 45056,
-  49152, 53248,
-  57344, 61440,
-  65536, 69632,
-  73728, 77824,
-  81920, 86016,
-  90112, 94208,
-  98304, 102400,
-  106496, 110592,
-  114688, 118784,
-  122880, 126976,
-  131072, 135168,
-  139264, 143360,
-  147456, 151552,
-  155648, 159744,
-  163840, 167936,
-  172032, 176128,
-  180224, 184320,
-  188416, 192512,
-  196608, 200704,
-  204800, 208896,
-  212992, 217088,
-  221184, 225280,
-  229376, 233472,
-  237568, 241664,
-  245760, 249856,
-  253952, 258048,
-  262144, 266240,
-  270336, 274432,
-  278528, 282624,
-  286720, 290816,
-  294912, 299008,
-  303104, 307200,
-  311296, 315392,
-  319488, 323584,
-  327680, 331776,
-  335872, 339968,
-  344064, 348160,
-  352256, 356352,
-  360448, 364544,
-  368640, 372736,
-  376832, 380928,
-  385024, 389120,
-  393216, 397312,
-  401408, 405504,
-  409600, 413696,
-  417792, 421888,
-  425984, 430080,
-  434176, 438272,
-  442368, 446464,
-  450560, 454656,
-  458752, 462848,
-  466944, 471040,
-  475136, 479232,
-  483328, 487424,
-  491520, 495616,
-  499712, 503808,
-  507904, 512000,
-  516096, 520192,
-  524288, 528384,
-  532480, 536576,
-  540672, 544768,
-  548864, 552960,
-  557056, 561152,
-  565248, 569344,
-  573440, 577536,
-  581632, 585728 ;
-
- i16 =
-  0, 256,
-  512, 768,
-  1024, 1280,
-  1536, 1792 ;
-
- ui16 =
-  0, 1024,
-  2048, 3072,
-  4096, 5120,
-  6144, 7168 ;
-
- f32 =
-  0, 0.009999833,
-  0.01999867, 0.0299955,
-  0.03998933, 0.04997917,
-  0.059964, 0.06994285 ;
-
- f64 =
-  1, 0.999950000416665,
-  0.999800006666578, 0.999550033748988,
-  0.999200106660978, 0.998750260394966,
-  0.998200539935204, 0.99755100025328 ;
-
- s0 =
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).",
-  "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).", 
-    "This is a data test string (pass 10).", 
-    "This is a data test string (pass 11).",
-  "This is a data test string (pass 12).", 
-    "This is a data test string (pass 13).", 
-    "This is a data test string (pass 14).", 
-    "This is a data test string (pass 15).", 
-    "This is a data test string (pass 16).", 
-    "This is a data test string (pass 17).",
-  "This is a data test string (pass 18).", 
-    "This is a data test string (pass 19).", 
-    "This is a data test string (pass 20).", 
-    "This is a data test string (pass 21).", 
-    "This is a data test string (pass 22).", 
-    "This is a data test string (pass 23).",
-  "This is a data test string (pass 24).", 
-    "This is a data test string (pass 25).", 
-    "This is a data test string (pass 26).", 
-    "This is a data test string (pass 27).", 
-    "This is a data test string (pass 28).", 
-    "This is a data test string (pass 29).",
-  "This is a data test string (pass 30).", 
-    "This is a data test string (pass 31).", 
-    "This is a data test string (pass 32).", 
-    "This is a data test string (pass 33).", 
-    "This is a data test string (pass 34).", 
-    "This is a data test string (pass 35).",
-  "This is a data test string (pass 36).", 
-    "This is a data test string (pass 37).", 
-    "This is a data test string (pass 38).", 
-    "This is a data test string (pass 39).", 
-    "This is a data test string (pass 40).", 
-    "This is a data test string (pass 41).",
-  "This is a data test string (pass 42).", 
-    "This is a data test string (pass 43).", 
-    "This is a data test string (pass 44).", 
-    "This is a data test string (pass 45).", 
-    "This is a data test string (pass 46).", 
-    "This is a data test string (pass 47).",
-  "This is a data test string (pass 48).", 
-    "This is a data test string (pass 49).", 
-    "This is a data test string (pass 50).", 
-    "This is a data test string (pass 51).", 
-    "This is a data test string (pass 52).", 
-    "This is a data test string (pass 53).",
-  "This is a data test string (pass 54).", 
-    "This is a data test string (pass 55).", 
-    "This is a data test string (pass 56).", 
-    "This is a data test string (pass 57).", 
-    "This is a data test string (pass 58).", 
-    "This is a data test string (pass 59).",
-  "This is a data test string (pass 60).", 
-    "This is a data test string (pass 61).", 
-    "This is a data test string (pass 62).", 
-    "This is a data test string (pass 63).", 
-    "This is a data test string (pass 64).", 
-    "This is a data test string (pass 65).",
-  "This is a data test string (pass 66).", 
-    "This is a data test string (pass 67).", 
-    "This is a data test string (pass 68).", 
-    "This is a data test string (pass 69).", 
-    "This is a data test string (pass 70).", 
-    "This is a data test string (pass 71).",
-  "This is a data test string (pass 72).", 
-    "This is a data test string (pass 73).", 
-    "This is a data test string (pass 74).", 
-    "This is a data test string (pass 75).", 
-    "This is a data test string (pass 76).", 
-    "This is a data test string (pass 77).",
-  "This is a data test string (pass 78).", 
-    "This is a data test string (pass 79).", 
-    "This is a data test string (pass 80).", 
-    "This is a data test string (pass 81).", 
-    "This is a data test string (pass 82).", 
-    "This is a data test string (pass 83).",
-  "This is a data test string (pass 84).", 
-    "This is a data test string (pass 85).", 
-    "This is a data test string (pass 86).", 
-    "This is a data test string (pass 87).", 
-    "This is a data test string (pass 88).", 
-    "This is a data test string (pass 89).",
-  "This is a data test string (pass 90).", 
-    "This is a data test string (pass 91).", 
-    "This is a data test string (pass 92).", 
-    "This is a data test string (pass 93).", 
-    "This is a data test string (pass 94).", 
-    "This is a data test string (pass 95).",
-  "This is a data test string (pass 96).", 
-    "This is a data test string (pass 97).", 
-    "This is a data test string (pass 98).", 
-    "This is a data test string (pass 99).", 
-    "This is a data test string (pass 100).", 
-    "This is a data test string (pass 101).",
-  "This is a data test string (pass 102).", 
-    "This is a data test string (pass 103).", 
-    "This is a data test string (pass 104).", 
-    "This is a data test string (pass 105).", 
-    "This is a data test string (pass 106).", 
-    "This is a data test string (pass 107).",
-  "This is a data test string (pass 108).", 
-    "This is a data test string (pass 109).", 
-    "This is a data test string (pass 110).", 
-    "This is a data test string (pass 111).", 
-    "This is a data test string (pass 112).", 
-    "This is a data test string (pass 113).",
-  "This is a data test string (pass 114).", 
-    "This is a data test string (pass 115).", 
-    "This is a data test string (pass 116).", 
-    "This is a data test string (pass 117).", 
-    "This is a data test string (pass 118).", 
-    "This is a data test string (pass 119)." ;
-
- s1 =
-  "This is a data test string (pass 120).", 
-    "This is a data test string (pass 121).", 
-    "This is a data test string (pass 122).", 
-    "This is a data test string (pass 123).", 
-    "This is a data test string (pass 124).", 
-    "This is a data test string (pass 125).", 
-    "This is a data test string (pass 126).", 
-    "This is a data test string (pass 127).", 
-    "This is a data test string (pass 128).", 
-    "This is a data test string (pass 129).",
-  "This is a data test string (pass 130).", 
-    "This is a data test string (pass 131).", 
-    "This is a data test string (pass 132).", 
-    "This is a data test string (pass 133).", 
-    "This is a data test string (pass 134).", 
-    "This is a data test string (pass 135).", 
-    "This is a data test string (pass 136).", 
-    "This is a data test string (pass 137).", 
-    "This is a data test string (pass 138).", 
-    "This is a data test string (pass 139).",
-  "This is a data test string (pass 140).", 
-    "This is a data test string (pass 141).", 
-    "This is a data test string (pass 142).", 
-    "This is a data test string (pass 143).", 
-    "This is a data test string (pass 144).", 
-    "This is a data test string (pass 145).", 
-    "This is a data test string (pass 146).", 
-    "This is a data test string (pass 147).", 
-    "This is a data test string (pass 148).", 
-    "This is a data test string (pass 149).",
-  "This is a data test string (pass 150).", 
-    "This is a data test string (pass 151).", 
-    "This is a data test string (pass 152).", 
-    "This is a data test string (pass 153).", 
-    "This is a data test string (pass 154).", 
-    "This is a data test string (pass 155).", 
-    "This is a data test string (pass 156).", 
-    "This is a data test string (pass 157).", 
-    "This is a data test string (pass 158).", 
-    "This is a data test string (pass 159).",
-  "This is a data test string (pass 160).", 
-    "This is a data test string (pass 161).", 
-    "This is a data test string (pass 162).", 
-    "This is a data test string (pass 163).", 
-    "This is a data test string (pass 164).", 
-    "This is a data test string (pass 165).", 
-    "This is a data test string (pass 166).", 
-    "This is a data test string (pass 167).", 
-    "This is a data test string (pass 168).", 
-    "This is a data test string (pass 169).",
-  "This is a data test string (pass 170).", 
-    "This is a data test string (pass 171).", 
-    "This is a data test string (pass 172).", 
-    "This is a data test string (pass 173).", 
-    "This is a data test string (pass 174).", 
-    "This is a data test string (pass 175).", 
-    "This is a data test string (pass 176).", 
-    "This is a data test string (pass 177).", 
-    "This is a data test string (pass 178).", 
-    "This is a data test string (pass 179).",
-  "This is a data test string (pass 180).", 
-    "This is a data test string (pass 181).", 
-    "This is a data test string (pass 182).", 
-    "This is a data test string (pass 183).", 
-    "This is a data test string (pass 184).", 
-    "This is a data test string (pass 185).", 
-    "This is a data test string (pass 186).", 
-    "This is a data test string (pass 187).", 
-    "This is a data test string (pass 188).", 
-    "This is a data test string (pass 189).",
-  "This is a data test string (pass 190).", 
-    "This is a data test string (pass 191).", 
-    "This is a data test string (pass 192).", 
-    "This is a data test string (pass 193).", 
-    "This is a data test string (pass 194).", 
-    "This is a data test string (pass 195).", 
-    "This is a data test string (pass 196).", 
-    "This is a data test string (pass 197).", 
-    "This is a data test string (pass 198).", 
-    "This is a data test string (pass 199).",
-  "This is a data test string (pass 200).", 
-    "This is a data test string (pass 201).", 
-    "This is a data test string (pass 202).", 
-    "This is a data test string (pass 203).", 
-    "This is a data test string (pass 204).", 
-    "This is a data test string (pass 205).", 
-    "This is a data test string (pass 206).", 
-    "This is a data test string (pass 207).", 
-    "This is a data test string (pass 208).", 
-    "This is a data test string (pass 209).",
-  "This is a data test string (pass 210).", 
-    "This is a data test string (pass 211).", 
-    "This is a data test string (pass 212).", 
-    "This is a data test string (pass 213).", 
-    "This is a data test string (pass 214).", 
-    "This is a data test string (pass 215).", 
-    "This is a data test string (pass 216).", 
-    "This is a data test string (pass 217).", 
-    "This is a data test string (pass 218).", 
-    "This is a data test string (pass 219).",
-  "This is a data test string (pass 220).", 
-    "This is a data test string (pass 221).", 
-    "This is a data test string (pass 222).", 
-    "This is a data test string (pass 223).", 
-    "This is a data test string (pass 224).", 
-    "This is a data test string (pass 225).", 
-    "This is a data test string (pass 226).", 
-    "This is a data test string (pass 227).", 
-    "This is a data test string (pass 228).", 
-    "This is a data test string (pass 229).",
-  "This is a data test string (pass 230).", 
-    "This is a data test string (pass 231).", 
-    "This is a data test string (pass 232).", 
-    "This is a data test string (pass 233).", 
-    "This is a data test string (pass 234).", 
-    "This is a data test string (pass 235).", 
-    "This is a data test string (pass 236).", 
-    "This is a data test string (pass 237).", 
-    "This is a data test string (pass 238).", 
-    "This is a data test string (pass 239).",
-  "This is a data test string (pass 240).", 
-    "This is a data test string (pass 241).", 
-    "This is a data test string (pass 242).", 
-    "This is a data test string (pass 243).", 
-    "This is a data test string (pass 244).", 
-    "This is a data test string (pass 245).", 
-    "This is a data test string (pass 246).", 
-    "This is a data test string (pass 247).", 
-    "This is a data test string (pass 248).", 
-    "This is a data test string (pass 249).",
-  "This is a data test string (pass 250).", 
-    "This is a data test string (pass 251).", 
-    "This is a data test string (pass 252).", 
-    "This is a data test string (pass 253).", 
-    "This is a data test string (pass 254).", 
-    "This is a data test string (pass 255).", 
-    "This is a data test string (pass 256).", 
-    "This is a data test string (pass 257).", 
-    "This is a data test string (pass 258).", 
-    "This is a data test string (pass 259).",
-  "This is a data test string (pass 260).", 
-    "This is a data test string (pass 261).", 
-    "This is a data test string (pass 262).", 
-    "This is a data test string (pass 263).", 
-    "This is a data test string (pass 264).", 
-    "This is a data test string (pass 265).", 
-    "This is a data test string (pass 266).", 
-    "This is a data test string (pass 267).", 
-    "This is a data test string (pass 268).", 
-    "This is a data test string (pass 269).",
-  "This is a data test string (pass 270).", 
-    "This is a data test string (pass 271).", 
-    "This is a data test string (pass 272).", 
-    "This is a data test string (pass 273).", 
-    "This is a data test string (pass 274).", 
-    "This is a data test string (pass 275).", 
-    "This is a data test string (pass 276).", 
-    "This is a data test string (pass 277).", 
-    "This is a data test string (pass 278).", 
-    "This is a data test string (pass 279).",
-  "This is a data test string (pass 280).", 
-    "This is a data test string (pass 281).", 
-    "This is a data test string (pass 282).", 
-    "This is a data test string (pass 283).", 
-    "This is a data test string (pass 284).", 
-    "This is a data test string (pass 285).", 
-    "This is a data test string (pass 286).", 
-    "This is a data test string (pass 287).", 
-    "This is a data test string (pass 288).", 
-    "This is a data test string (pass 289).",
-  "This is a data test string (pass 290).", 
-    "This is a data test string (pass 291).", 
-    "This is a data test string (pass 292).", 
-    "This is a data test string (pass 293).", 
-    "This is a data test string (pass 294).", 
-    "This is a data test string (pass 295).", 
-    "This is a data test string (pass 296).", 
-    "This is a data test string (pass 297).", 
-    "This is a data test string (pass 298).", 
-    "This is a data test string (pass 299).",
-  "This is a data test string (pass 300).", 
-    "This is a data test string (pass 301).", 
-    "This is a data test string (pass 302).", 
-    "This is a data test string (pass 303).", 
-    "This is a data test string (pass 304).", 
-    "This is a data test string (pass 305).", 
-    "This is a data test string (pass 306).", 
-    "This is a data test string (pass 307).", 
-    "This is a data test string (pass 308).", 
-    "This is a data test string (pass 309).",
-  "This is a data test string (pass 310).", 
-    "This is a data test string (pass 311).", 
-    "This is a data test string (pass 312).", 
-    "This is a data test string (pass 313).", 
-    "This is a data test string (pass 314).", 
-    "This is a data test string (pass 315).", 
-    "This is a data test string (pass 316).", 
-    "This is a data test string (pass 317).", 
-    "This is a data test string (pass 318).", 
-    "This is a data test string (pass 319).",
-  "This is a data test string (pass 320).", 
-    "This is a data test string (pass 321).", 
-    "This is a data test string (pass 322).", 
-    "This is a data test string (pass 323).", 
-    "This is a data test string (pass 324).", 
-    "This is a data test string (pass 325).", 
-    "This is a data test string (pass 326).", 
-    "This is a data test string (pass 327).", 
-    "This is a data test string (pass 328).", 
-    "This is a data test string (pass 329).",
-  "This is a data test string (pass 330).", 
-    "This is a data test string (pass 331).", 
-    "This is a data test string (pass 332).", 
-    "This is a data test string (pass 333).", 
-    "This is a data test string (pass 334).", 
-    "This is a data test string (pass 335).", 
-    "This is a data test string (pass 336).", 
-    "This is a data test string (pass 337).", 
-    "This is a data test string (pass 338).", 
-    "This is a data test string (pass 339).",
-  "This is a data test string (pass 340).", 
-    "This is a data test string (pass 341).", 
-    "This is a data test string (pass 342).", 
-    "This is a data test string (pass 343).", 
-    "This is a data test string (pass 344).", 
-    "This is a data test string (pass 345).", 
-    "This is a data test string (pass 346).", 
-    "This is a data test string (pass 347).", 
-    "This is a data test string (pass 348).", 
-    "This is a data test string (pass 349).",
-  "This is a data test string (pass 350).", 
-    "This is a data test string (pass 351).", 
-    "This is a data test string (pass 352).", 
-    "This is a data test string (pass 353).", 
-    "This is a data test string (pass 354).", 
-    "This is a data test string (pass 355).", 
-    "This is a data test string (pass 356).", 
-    "This is a data test string (pass 357).", 
-    "This is a data test string (pass 358).", 
-    "This is a data test string (pass 359).",
-  "This is a data test string (pass 360).", 
-    "This is a data test string (pass 361).", 
-    "This is a data test string (pass 362).", 
-    "This is a data test string (pass 363).", 
-    "This is a data test string (pass 364).", 
-    "This is a data test string (pass 365).", 
-    "This is a data test string (pass 366).", 
-    "This is a data test string (pass 367).", 
-    "This is a data test string (pass 368).", 
-    "This is a data test string (pass 369).",
-  "This is a data test string (pass 370).", 
-    "This is a data test string (pass 371).", 
-    "This is a data test string (pass 372).", 
-    "This is a data test string (pass 373).", 
-    "This is a data test string (pass 374).", 
-    "This is a data test string (pass 375).", 
-    "This is a data test string (pass 376).", 
-    "This is a data test string (pass 377).", 
-    "This is a data test string (pass 378).", 
-    "This is a data test string (pass 379).",
-  "This is a data test string (pass 380).", 
-    "This is a data test string (pass 381).", 
-    "This is a data test string (pass 382).", 
-    "This is a data test string (pass 383).", 
-    "This is a data test string (pass 384).", 
-    "This is a data test string (pass 385).", 
-    "This is a data test string (pass 386).", 
-    "This is a data test string (pass 387).", 
-    "This is a data test string (pass 388).", 
-    "This is a data test string (pass 389).",
-  "This is a data test string (pass 390).", 
-    "This is a data test string (pass 391).", 
-    "This is a data test string (pass 392).", 
-    "This is a data test string (pass 393).", 
-    "This is a data test string (pass 394).", 
-    "This is a data test string (pass 395).", 
-    "This is a data test string (pass 396).", 
-    "This is a data test string (pass 397).", 
-    "This is a data test string (pass 398).", 
-    "This is a data test string (pass 399).",
-  "This is a data test string (pass 400).", 
-    "This is a data test string (pass 401).", 
-    "This is a data test string (pass 402).", 
-    "This is a data test string (pass 403).", 
-    "This is a data test string (pass 404).", 
-    "This is a data test string (pass 405).", 
-    "This is a data test string (pass 406).", 
-    "This is a data test string (pass 407).", 
-    "This is a data test string (pass 408).", 
-    "This is a data test string (pass 409).",
-  "This is a data test string (pass 410).", 
-    "This is a data test string (pass 411).", 
-    "This is a data test string (pass 412).", 
-    "This is a data test string (pass 413).", 
-    "This is a data test string (pass 414).", 
-    "This is a data test string (pass 415).", 
-    "This is a data test string (pass 416).", 
-    "This is a data test string (pass 417).", 
-    "This is a data test string (pass 418).", 
-    "This is a data test string (pass 419).",
-  "This is a data test string (pass 420).", 
-    "This is a data test string (pass 421).", 
-    "This is a data test string (pass 422).", 
-    "This is a data test string (pass 423).", 
-    "This is a data test string (pass 424).", 
-    "This is a data test string (pass 425).", 
-    "This is a data test string (pass 426).", 
-    "This is a data test string (pass 427).", 
-    "This is a data test string (pass 428).", 
-    "This is a data test string (pass 429).",
-  "This is a data test string (pass 430).", 
-    "This is a data test string (pass 431).", 
-    "This is a data test string (pass 432).", 
-    "This is a data test string (pass 433).", 
-    "This is a data test string (pass 434).", 
-    "This is a data test string (pass 435).", 
-    "This is a data test string (pass 436).", 
-    "This is a data test string (pass 437).", 
-    "This is a data test string (pass 438).", 
-    "This is a data test string (pass 439).",
-  "This is a data test string (pass 440).", 
-    "This is a data test string (pass 441).", 
-    "This is a data test string (pass 442).", 
-    "This is a data test string (pass 443).", 
-    "This is a data test string (pass 444).", 
-    "This is a data test string (pass 445).", 
-    "This is a data test string (pass 446).", 
-    "This is a data test string (pass 447).", 
-    "This is a data test string (pass 448).", 
-    "This is a data test string (pass 449).",
-  "This is a data test string (pass 450).", 
-    "This is a data test string (pass 451).", 
-    "This is a data test string (pass 452).", 
-    "This is a data test string (pass 453).", 
-    "This is a data test string (pass 454).", 
-    "This is a data test string (pass 455).", 
-    "This is a data test string (pass 456).", 
-    "This is a data test string (pass 457).", 
-    "This is a data test string (pass 458).", 
-    "This is a data test string (pass 459).",
-  "This is a data test string (pass 460).", 
-    "This is a data test string (pass 461).", 
-    "This is a data test string (pass 462).", 
-    "This is a data test string (pass 463).", 
-    "This is a data test string (pass 464).", 
-    "This is a data test string (pass 465).", 
-    "This is a data test string (pass 466).", 
-    "This is a data test string (pass 467).", 
-    "This is a data test string (pass 468).", 
-    "This is a data test string (pass 469).",
-  "This is a data test string (pass 470).", 
-    "This is a data test string (pass 471).", 
-    "This is a data test string (pass 472).", 
-    "This is a data test string (pass 473).", 
-    "This is a data test string (pass 474).", 
-    "This is a data test string (pass 475).", 
-    "This is a data test string (pass 476).", 
-    "This is a data test string (pass 477).", 
-    "This is a data test string (pass 478).", 
-    "This is a data test string (pass 479).",
-  "This is a data test string (pass 480).", 
-    "This is a data test string (pass 481).", 
-    "This is a data test string (pass 482).", 
-    "This is a data test string (pass 483).", 
-    "This is a data test string (pass 484).", 
-    "This is a data test string (pass 485).", 
-    "This is a data test string (pass 486).", 
-    "This is a data test string (pass 487).", 
-    "This is a data test string (pass 488).", 
-    "This is a data test string (pass 489).",
-  "This is a data test string (pass 490).", 
-    "This is a data test string (pass 491).", 
-    "This is a data test string (pass 492).", 
-    "This is a data test string (pass 493).", 
-    "This is a data test string (pass 494).", 
-    "This is a data test string (pass 495).", 
-    "This is a data test string (pass 496).", 
-    "This is a data test string (pass 497).", 
-    "This is a data test string (pass 498).", 
-    "This is a data test string (pass 499).",
-  "This is a data test string (pass 500).", 
-    "This is a data test string (pass 501).", 
-    "This is a data test string (pass 502).", 
-    "This is a data test string (pass 503).", 
-    "This is a data test string (pass 504).", 
-    "This is a data test string (pass 505).", 
-    "This is a data test string (pass 506).", 
-    "This is a data test string (pass 507).", 
-    "This is a data test string (pass 508).", 
-    "This is a data test string (pass 509).",
-  "This is a data test string (pass 510).", 
-    "This is a data test string (pass 511).", 
-    "This is a data test string (pass 512).", 
-    "This is a data test string (pass 513).", 
-    "This is a data test string (pass 514).", 
-    "This is a data test string (pass 515).", 
-    "This is a data test string (pass 516).", 
-    "This is a data test string (pass 517).", 
-    "This is a data test string (pass 518).", 
-    "This is a data test string (pass 519).",
-  "This is a data test string (pass 520).", 
-    "This is a data test string (pass 521).", 
-    "This is a data test string (pass 522).", 
-    "This is a data test string (pass 523).", 
-    "This is a data test string (pass 524).", 
-    "This is a data test string (pass 525).", 
-    "This is a data test string (pass 526).", 
-    "This is a data test string (pass 527).", 
-    "This is a data test string (pass 528).", 
-    "This is a data test string (pass 529).",
-  "This is a data test string (pass 530).", 
-    "This is a data test string (pass 531).", 
-    "This is a data test string (pass 532).", 
-    "This is a data test string (pass 533).", 
-    "This is a data test string (pass 534).", 
-    "This is a data test string (pass 535).", 
-    "This is a data test string (pass 536).", 
-    "This is a data test string (pass 537).", 
-    "This is a data test string (pass 538).", 
-    "This is a data test string (pass 539).",
-  "This is a data test string (pass 540).", 
-    "This is a data test string (pass 541).", 
-    "This is a data test string (pass 542).", 
-    "This is a data test string (pass 543).", 
-    "This is a data test string (pass 544).", 
-    "This is a data test string (pass 545).", 
-    "This is a data test string (pass 546).", 
-    "This is a data test string (pass 547).", 
-    "This is a data test string (pass 548).", 
-    "This is a data test string (pass 549).",
-  "This is a data test string (pass 550).", 
-    "This is a data test string (pass 551).", 
-    "This is a data test string (pass 552).", 
-    "This is a data test string (pass 553).", 
-    "This is a data test string (pass 554).", 
-    "This is a data test string (pass 555).", 
-    "This is a data test string (pass 556).", 
-    "This is a data test string (pass 557).", 
-    "This is a data test string (pass 558).", 
-    "This is a data test string (pass 559).",
-  "This is a data test string (pass 560).", 
-    "This is a data test string (pass 561).", 
-    "This is a data test string (pass 562).", 
-    "This is a data test string (pass 563).", 
-    "This is a data test string (pass 564).", 
-    "This is a data test string (pass 565).", 
-    "This is a data test string (pass 566).", 
-    "This is a data test string (pass 567).", 
-    "This is a data test string (pass 568).", 
-    "This is a data test string (pass 569).",
-  "This is a data test string (pass 570).", 
-    "This is a data test string (pass 571).", 
-    "This is a data test string (pass 572).", 
-    "This is a data test string (pass 573).", 
-    "This is a data test string (pass 574).", 
-    "This is a data test string (pass 575).", 
-    "This is a data test string (pass 576).", 
-    "This is a data test string (pass 577).", 
-    "This is a data test string (pass 578).", 
-    "This is a data test string (pass 579).",
-  "This is a data test string (pass 580).", 
-    "This is a data test string (pass 581).", 
-    "This is a data test string (pass 582).", 
-    "This is a data test string (pass 583).", 
-    "This is a data test string (pass 584).", 
-    "This is a data test string (pass 585).", 
-    "This is a data test string (pass 586).", 
-    "This is a data test string (pass 587).", 
-    "This is a data test string (pass 588).", 
-    "This is a data test string (pass 589).",
-  "This is a data test string (pass 590).", 
-    "This is a data test string (pass 591).", 
-    "This is a data test string (pass 592).", 
-    "This is a data test string (pass 593).", 
-    "This is a data test string (pass 594).", 
-    "This is a data test string (pass 595).", 
-    "This is a data test string (pass 596).", 
-    "This is a data test string (pass 597).", 
-    "This is a data test string (pass 598).", 
-    "This is a data test string (pass 599).",
-  "This is a data test string (pass 600).", 
-    "This is a data test string (pass 601).", 
-    "This is a data test string (pass 602).", 
-    "This is a data test string (pass 603).", 
-    "This is a data test string (pass 604).", 
-    "This is a data test string (pass 605).", 
-    "This is a data test string (pass 606).", 
-    "This is a data test string (pass 607).", 
-    "This is a data test string (pass 608).", 
-    "This is a data test string (pass 609).",
-  "This is a data test string (pass 610).", 
-    "This is a data test string (pass 611).", 
-    "This is a data test string (pass 612).", 
-    "This is a data test string (pass 613).", 
-    "This is a data test string (pass 614).", 
-    "This is a data test string (pass 615).", 
-    "This is a data test string (pass 616).", 
-    "This is a data test string (pass 617).", 
-    "This is a data test string (pass 618).", 
-    "This is a data test string (pass 619).",
-  "This is a data test string (pass 620).", 
-    "This is a data test string (pass 621).", 
-    "This is a data test string (pass 622).", 
-    "This is a data test string (pass 623).", 
-    "This is a data test string (pass 624).", 
-    "This is a data test string (pass 625).", 
-    "This is a data test string (pass 626).", 
-    "This is a data test string (pass 627).", 
-    "This is a data test string (pass 628).", 
-    "This is a data test string (pass 629).",
-  "This is a data test string (pass 630).", 
-    "This is a data test string (pass 631).", 
-    "This is a data test string (pass 632).", 
-    "This is a data test string (pass 633).", 
-    "This is a data test string (pass 634).", 
-    "This is a data test string (pass 635).", 
-    "This is a data test string (pass 636).", 
-    "This is a data test string (pass 637).", 
-    "This is a data test string (pass 638).", 
-    "This is a data test string (pass 639).",
-  "This is a data test string (pass 640).", 
-    "This is a data test string (pass 641).", 
-    "This is a data test string (pass 642).", 
-    "This is a data test string (pass 643).", 
-    "This is a data test string (pass 644).", 
-    "This is a data test string (pass 645).", 
-    "This is a data test string (pass 646).", 
-    "This is a data test string (pass 647).", 
-    "This is a data test string (pass 648).", 
-    "This is a data test string (pass 649).",
-  "This is a data test string (pass 650).", 
-    "This is a data test string (pass 651).", 
-    "This is a data test string (pass 652).", 
-    "This is a data test string (pass 653).", 
-    "This is a data test string (pass 654).", 
-    "This is a data test string (pass 655).", 
-    "This is a data test string (pass 656).", 
-    "This is a data test string (pass 657).", 
-    "This is a data test string (pass 658).", 
-    "This is a data test string (pass 659).",
-  "This is a data test string (pass 660).", 
-    "This is a data test string (pass 661).", 
-    "This is a data test string (pass 662).", 
-    "This is a data test string (pass 663).", 
-    "This is a data test string (pass 664).", 
-    "This is a data test string (pass 665).", 
-    "This is a data test string (pass 666).", 
-    "This is a data test string (pass 667).", 
-    "This is a data test string (pass 668).", 
-    "This is a data test string (pass 669).",
-  "This is a data test string (pass 670).", 
-    "This is a data test string (pass 671).", 
-    "This is a data test string (pass 672).", 
-    "This is a data test string (pass 673).", 
-    "This is a data test string (pass 674).", 
-    "This is a data test string (pass 675).", 
-    "This is a data test string (pass 676).", 
-    "This is a data test string (pass 677).", 
-    "This is a data test string (pass 678).", 
-    "This is a data test string (pass 679).",
-  "This is a data test string (pass 680).", 
-    "This is a data test string (pass 681).", 
-    "This is a data test string (pass 682).", 
-    "This is a data test string (pass 683).", 
-    "This is a data test string (pass 684).", 
-    "This is a data test string (pass 685).", 
-    "This is a data test string (pass 686).", 
-    "This is a data test string (pass 687).", 
-    "This is a data test string (pass 688).", 
-    "This is a data test string (pass 689).",
-  "This is a data test string (pass 690).", 
-    "This is a data test string (pass 691).", 
-    "This is a data test string (pass 692).", 
-    "This is a data test string (pass 693).", 
-    "This is a data test string (pass 694).", 
-    "This is a data test string (pass 695).", 
-    "This is a data test string (pass 696).", 
-    "This is a data test string (pass 697).", 
-    "This is a data test string (pass 698).", 
-    "This is a data test string (pass 699).",
-  "This is a data test string (pass 700).", 
-    "This is a data test string (pass 701).", 
-    "This is a data test string (pass 702).", 
-    "This is a data test string (pass 703).", 
-    "This is a data test string (pass 704).", 
-    "This is a data test string (pass 705).", 
-    "This is a data test string (pass 706).", 
-    "This is a data test string (pass 707).", 
-    "This is a data test string (pass 708).", 
-    "This is a data test string (pass 709).",
-  "This is a data test string (pass 710).", 
-    "This is a data test string (pass 711).", 
-    "This is a data test string (pass 712).", 
-    "This is a data test string (pass 713).", 
-    "This is a data test string (pass 714).", 
-    "This is a data test string (pass 715).", 
-    "This is a data test string (pass 716).", 
-    "This is a data test string (pass 717).", 
-    "This is a data test string (pass 718).", 
-    "This is a data test string (pass 719).",
-  "This is a data test string (pass 720).", 
-    "This is a data test string (pass 721).", 
-    "This is a data test string (pass 722).", 
-    "This is a data test string (pass 723).", 
-    "This is a data test string (pass 724).", 
-    "This is a data test string (pass 725).", 
-    "This is a data test string (pass 726).", 
-    "This is a data test string (pass 727).", 
-    "This is a data test string (pass 728).", 
-    "This is a data test string (pass 729).",
-  "This is a data test string (pass 730).", 
-    "This is a data test string (pass 731).", 
-    "This is a data test string (pass 732).", 
-    "This is a data test string (pass 733).", 
-    "This is a data test string (pass 734).", 
-    "This is a data test string (pass 735).", 
-    "This is a data test string (pass 736).", 
-    "This is a data test string (pass 737).", 
-    "This is a data test string (pass 738).", 
-    "This is a data test string (pass 739).",
-  "This is a data test string (pass 740).", 
-    "This is a data test string (pass 741).", 
-    "This is a data test string (pass 742).", 
-    "This is a data test string (pass 743).", 
-    "This is a data test string (pass 744).", 
-    "This is a data test string (pass 745).", 
-    "This is a data test string (pass 746).", 
-    "This is a data test string (pass 747).", 
-    "This is a data test string (pass 748).", 
-    "This is a data test string (pass 749).",
-  "This is a data test string (pass 750).", 
-    "This is a data test string (pass 751).", 
-    "This is a data test string (pass 752).", 
-    "This is a data test string (pass 753).", 
-    "This is a data test string (pass 754).", 
-    "This is a data test string (pass 755).", 
-    "This is a data test string (pass 756).", 
-    "This is a data test string (pass 757).", 
-    "This is a data test string (pass 758).", 
-    "This is a data test string (pass 759).",
-  "This is a data test string (pass 760).", 
-    "This is a data test string (pass 761).", 
-    "This is a data test string (pass 762).", 
-    "This is a data test string (pass 763).", 
-    "This is a data test string (pass 764).", 
-    "This is a data test string (pass 765).", 
-    "This is a data test string (pass 766).", 
-    "This is a data test string (pass 767).", 
-    "This is a data test string (pass 768).", 
-    "This is a data test string (pass 769).",
-  "This is a data test string (pass 770).", 
-    "This is a data test string (pass 771).", 
-    "This is a data test string (pass 772).", 
-    "This is a data test string (pass 773).", 
-    "This is a data test string (pass 774).", 
-    "This is a data test string (pass 775).", 
-    "This is a data test string (pass 776).", 
-    "This is a data test string (pass 777).", 
-    "This is a data test string (pass 778).", 
-    "This is a data test string (pass 779).",
-  "This is a data test string (pass 780).", 
-    "This is a data test string (pass 781).", 
-    "This is a data test string (pass 782).", 
-    "This is a data test string (pass 783).", 
-    "This is a data test string (pass 784).", 
-    "This is a data test string (pass 785).", 
-    "This is a data test string (pass 786).", 
-    "This is a data test string (pass 787).", 
-    "This is a data test string (pass 788).", 
-    "This is a data test string (pass 789).",
-  "This is a data test string (pass 790).", 
-    "This is a data test string (pass 791).", 
-    "This is a data test string (pass 792).", 
-    "This is a data test string (pass 793).", 
-    "This is a data test string (pass 794).", 
-    "This is a data test string (pass 795).", 
-    "This is a data test string (pass 796).", 
-    "This is a data test string (pass 797).", 
-    "This is a data test string (pass 798).", 
-    "This is a data test string (pass 799).",
-  "This is a data test string (pass 800).", 
-    "This is a data test string (pass 801).", 
-    "This is a data test string (pass 802).", 
-    "This is a data test string (pass 803).", 
-    "This is a data test string (pass 804).", 
-    "This is a data test string (pass 805).", 
-    "This is a data test string (pass 806).", 
-    "This is a data test string (pass 807).", 
-    "This is a data test string (pass 808).", 
-    "This is a data test string (pass 809).",
-  "This is a data test string (pass 810).", 
-    "This is a data test string (pass 811).", 
-    "This is a data test string (pass 812).", 
-    "This is a data test string (pass 813).", 
-    "This is a data test string (pass 814).", 
-    "This is a data test string (pass 815).", 
-    "This is a data test string (pass 816).", 
-    "This is a data test string (pass 817).", 
-    "This is a data test string (pass 818).", 
-    "This is a data test string (pass 819).",
-  "This is a data test string (pass 820).", 
-    "This is a data test string (pass 821).", 
-    "This is a data test string (pass 822).", 
-    "This is a data test string (pass 823).", 
-    "This is a data test string (pass 824).", 
-    "This is a data test string (pass 825).", 
-    "This is a data test string (pass 826).", 
-    "This is a data test string (pass 827).", 
-    "This is a data test string (pass 828).", 
-    "This is a data test string (pass 829).",
-  "This is a data test string (pass 830).", 
-    "This is a data test string (pass 831).", 
-    "This is a data test string (pass 832).", 
-    "This is a data test string (pass 833).", 
-    "This is a data test string (pass 834).", 
-    "This is a data test string (pass 835).", 
-    "This is a data test string (pass 836).", 
-    "This is a data test string (pass 837).", 
-    "This is a data test string (pass 838).", 
-    "This is a data test string (pass 839).",
-  "This is a data test string (pass 840).", 
-    "This is a data test string (pass 841).", 
-    "This is a data test string (pass 842).", 
-    "This is a data test string (pass 843).", 
-    "This is a data test string (pass 844).", 
-    "This is a data test string (pass 845).", 
-    "This is a data test string (pass 846).", 
-    "This is a data test string (pass 847).", 
-    "This is a data test string (pass 848).", 
-    "This is a data test string (pass 849).",
-  "This is a data test string (pass 850).", 
-    "This is a data test string (pass 851).", 
-    "This is a data test string (pass 852).", 
-    "This is a data test string (pass 853).", 
-    "This is a data test string (pass 854).", 
-    "This is a data test string (pass 855).", 
-    "This is a data test string (pass 856).", 
-    "This is a data test string (pass 857).", 
-    "This is a data test string (pass 858).", 
-    "This is a data test string (pass 859).",
-  "This is a data test string (pass 860).", 
-    "This is a data test string (pass 861).", 
-    "This is a data test string (pass 862).", 
-    "This is a data test string (pass 863).", 
-    "This is a data test string (pass 864).", 
-    "This is a data test string (pass 865).", 
-    "This is a data test string (pass 866).", 
-    "This is a data test string (pass 867).", 
-    "This is a data test string (pass 868).", 
-    "This is a data test string (pass 869).",
-  "This is a data test string (pass 870).", 
-    "This is a data test string (pass 871).", 
-    "This is a data test string (pass 872).", 
-    "This is a data test string (pass 873).", 
-    "This is a data test string (pass 874).", 
-    "This is a data test string (pass 875).", 
-    "This is a data test string (pass 876).", 
-    "This is a data test string (pass 877).", 
-    "This is a data test string (pass 878).", 
-    "This is a data test string (pass 879).",
-  "This is a data test string (pass 880).", 
-    "This is a data test string (pass 881).", 
-    "This is a data test string (pass 882).", 
-    "This is a data test string (pass 883).", 
-    "This is a data test string (pass 884).", 
-    "This is a data test string (pass 885).", 
-    "This is a data test string (pass 886).", 
-    "This is a data test string (pass 887).", 
-    "This is a data test string (pass 888).", 
-    "This is a data test string (pass 889).",
-  "This is a data test string (pass 890).", 
-    "This is a data test string (pass 891).", 
-    "This is a data test string (pass 892).", 
-    "This is a data test string (pass 893).", 
-    "This is a data test string (pass 894).", 
-    "This is a data test string (pass 895).", 
-    "This is a data test string (pass 896).", 
-    "This is a data test string (pass 897).", 
-    "This is a data test string (pass 898).", 
-    "This is a data test string (pass 899).",
-  "This is a data test string (pass 900).", 
-    "This is a data test string (pass 901).", 
-    "This is a data test string (pass 902).", 
-    "This is a data test string (pass 903).", 
-    "This is a data test string (pass 904).", 
-    "This is a data test string (pass 905).", 
-    "This is a data test string (pass 906).", 
-    "This is a data test string (pass 907).", 
-    "This is a data test string (pass 908).", 
-    "This is a data test string (pass 909).",
-  "This is a data test string (pass 910).", 
-    "This is a data test string (pass 911).", 
-    "This is a data test string (pass 912).", 
-    "This is a data test string (pass 913).", 
-    "This is a data test string (pass 914).", 
-    "This is a data test string (pass 915).", 
-    "This is a data test string (pass 916).", 
-    "This is a data test string (pass 917).", 
-    "This is a data test string (pass 918).", 
-    "This is a data test string (pass 919).",
-  "This is a data test string (pass 920).", 
-    "This is a data test string (pass 921).", 
-    "This is a data test string (pass 922).", 
-    "This is a data test string (pass 923).", 
-    "This is a data test string (pass 924).", 
-    "This is a data test string (pass 925).", 
-    "This is a data test string (pass 926).", 
-    "This is a data test string (pass 927).", 
-    "This is a data test string (pass 928).", 
-    "This is a data test string (pass 929).",
-  "This is a data test string (pass 930).", 
-    "This is a data test string (pass 931).", 
-    "This is a data test string (pass 932).", 
-    "This is a data test string (pass 933).", 
-    "This is a data test string (pass 934).", 
-    "This is a data test string (pass 935).", 
-    "This is a data test string (pass 936).", 
-    "This is a data test string (pass 937).", 
-    "This is a data test string (pass 938).", 
-    "This is a data test string (pass 939).",
-  "This is a data test string (pass 940).", 
-    "This is a data test string (pass 941).", 
-    "This is a data test string (pass 942).", 
-    "This is a data test string (pass 943).", 
-    "This is a data test string (pass 944).", 
-    "This is a data test string (pass 945).", 
-    "This is a data test string (pass 946).", 
-    "This is a data test string (pass 947).", 
-    "This is a data test string (pass 948).", 
-    "This is a data test string (pass 949).",
-  "This is a data test string (pass 950).", 
-    "This is a data test string (pass 951).", 
-    "This is a data test string (pass 952).", 
-    "This is a data test string (pass 953).", 
-    "This is a data test string (pass 954).", 
-    "This is a data test string (pass 955).", 
-    "This is a data test string (pass 956).", 
-    "This is a data test string (pass 957).", 
-    "This is a data test string (pass 958).", 
-    "This is a data test string (pass 959).",
-  "This is a data test string (pass 960).", 
-    "This is a data test string (pass 961).", 
-    "This is a data test string (pass 962).", 
-    "This is a data test string (pass 963).", 
-    "This is a data test string (pass 964).", 
-    "This is a data test string (pass 965).", 
-    "This is a data test string (pass 966).", 
-    "This is a data test string (pass 967).", 
-    "This is a data test string (pass 968).", 
-    "This is a data test string (pass 969).",
-  "This is a data test string (pass 970).", 
-    "This is a data test string (pass 971).", 
-    "This is a data test string (pass 972).", 
-    "This is a data test string (pass 973).", 
-    "This is a data test string (pass 974).", 
-    "This is a data test string (pass 975).", 
-    "This is a data test string (pass 976).", 
-    "This is a data test string (pass 977).", 
-    "This is a data test string (pass 978).", 
-    "This is a data test string (pass 979).",
-  "This is a data test string (pass 980).", 
-    "This is a data test string (pass 981).", 
-    "This is a data test string (pass 982).", 
-    "This is a data test string (pass 983).", 
-    "This is a data test string (pass 984).", 
-    "This is a data test string (pass 985).", 
-    "This is a data test string (pass 986).", 
-    "This is a data test string (pass 987).", 
-    "This is a data test string (pass 988).", 
-    "This is a data test string (pass 989).",
-  "This is a data test string (pass 990).", 
-    "This is a data test string (pass 991).", 
-    "This is a data test string (pass 992).", 
-    "This is a data test string (pass 993).", 
-    "This is a data test string (pass 994).", 
-    "This is a data test string (pass 995).", 
-    "This is a data test string (pass 996).", 
-    "This is a data test string (pass 997).", 
-    "This is a data test string (pass 998).", 
-    "This is a data test string (pass 999).",
-  "This is a data test string (pass 1000).", 
-    "This is a data test string (pass 1001).", 
-    "This is a data test string (pass 1002).", 
-    "This is a data test string (pass 1003).", 
-    "This is a data test string (pass 1004).", 
-    "This is a data test string (pass 1005).", 
-    "This is a data test string (pass 1006).", 
-    "This is a data test string (pass 1007).", 
-    "This is a data test string (pass 1008).", 
-    "This is a data test string (pass 1009).",
-  "This is a data test string (pass 1010).", 
-    "This is a data test string (pass 1011).", 
-    "This is a data test string (pass 1012).", 
-    "This is a data test string (pass 1013).", 
-    "This is a data test string (pass 1014).", 
-    "This is a data test string (pass 1015).", 
-    "This is a data test string (pass 1016).", 
-    "This is a data test string (pass 1017).", 
-    "This is a data test string (pass 1018).", 
-    "This is a data test string (pass 1019).",
-  "This is a data test string (pass 1020).", 
-    "This is a data test string (pass 1021).", 
-    "This is a data test string (pass 1022).", 
-    "This is a data test string (pass 1023).", 
-    "This is a data test string (pass 1024).", 
-    "This is a data test string (pass 1025).", 
-    "This is a data test string (pass 1026).", 
-    "This is a data test string (pass 1027).", 
-    "This is a data test string (pass 1028).", 
-    "This is a data test string (pass 1029).",
-  "This is a data test string (pass 1030).", 
-    "This is a data test string (pass 1031).", 
-    "This is a data test string (pass 1032).", 
-    "This is a data test string (pass 1033).", 
-    "This is a data test string (pass 1034).", 
-    "This is a data test string (pass 1035).", 
-    "This is a data test string (pass 1036).", 
-    "This is a data test string (pass 1037).", 
-    "This is a data test string (pass 1038).", 
-    "This is a data test string (pass 1039).",
-  "This is a data test string (pass 1040).", 
-    "This is a data test string (pass 1041).", 
-    "This is a data test string (pass 1042).", 
-    "This is a data test string (pass 1043).", 
-    "This is a data test string (pass 1044).", 
-    "This is a data test string (pass 1045).", 
-    "This is a data test string (pass 1046).", 
-    "This is a data test string (pass 1047).", 
-    "This is a data test string (pass 1048).", 
-    "This is a data test string (pass 1049).",
-  "This is a data test string (pass 1050).", 
-    "This is a data test string (pass 1051).", 
-    "This is a data test string (pass 1052).", 
-    "This is a data test string (pass 1053).", 
-    "This is a data test string (pass 1054).", 
-    "This is a data test string (pass 1055).", 
-    "This is a data test string (pass 1056).", 
-    "This is a data test string (pass 1057).", 
-    "This is a data test string (pass 1058).", 
-    "This is a data test string (pass 1059).",
-  "This is a data test string (pass 1060).", 
-    "This is a data test string (pass 1061).", 
-    "This is a data test string (pass 1062).", 
-    "This is a data test string (pass 1063).", 
-    "This is a data test string (pass 1064).", 
-    "This is a data test string (pass 1065).", 
-    "This is a data test string (pass 1066).", 
-    "This is a data test string (pass 1067).", 
-    "This is a data test string (pass 1068).", 
-    "This is a data test string (pass 1069).",
-  "This is a data test string (pass 1070).", 
-    "This is a data test string (pass 1071).", 
-    "This is a data test string (pass 1072).", 
-    "This is a data test string (pass 1073).", 
-    "This is a data test string (pass 1074).", 
-    "This is a data test string (pass 1075).", 
-    "This is a data test string (pass 1076).", 
-    "This is a data test string (pass 1077).", 
-    "This is a data test string (pass 1078).", 
-    "This is a data test string (pass 1079).",
-  "This is a data test string (pass 1080).", 
-    "This is a data test string (pass 1081).", 
-    "This is a data test string (pass 1082).", 
-    "This is a data test string (pass 1083).", 
-    "This is a data test string (pass 1084).", 
-    "This is a data test string (pass 1085).", 
-    "This is a data test string (pass 1086).", 
-    "This is a data test string (pass 1087).", 
-    "This is a data test string (pass 1088).", 
-    "This is a data test string (pass 1089).",
-  "This is a data test string (pass 1090).", 
-    "This is a data test string (pass 1091).", 
-    "This is a data test string (pass 1092).", 
-    "This is a data test string (pass 1093).", 
-    "This is a data test string (pass 1094).", 
-    "This is a data test string (pass 1095).", 
-    "This is a data test string (pass 1096).", 
-    "This is a data test string (pass 1097).", 
-    "This is a data test string (pass 1098).", 
-    "This is a data test string (pass 1099).",
-  "This is a data test string (pass 1100).", 
-    "This is a data test string (pass 1101).", 
-    "This is a data test string (pass 1102).", 
-    "This is a data test string (pass 1103).", 
-    "This is a data test string (pass 1104).", 
-    "This is a data test string (pass 1105).", 
-    "This is a data test string (pass 1106).", 
-    "This is a data test string (pass 1107).", 
-    "This is a data test string (pass 1108).", 
-    "This is a data test string (pass 1109).",
-  "This is a data test string (pass 1110).", 
-    "This is a data test string (pass 1111).", 
-    "This is a data test string (pass 1112).", 
-    "This is a data test string (pass 1113).", 
-    "This is a data test string (pass 1114).", 
-    "This is a data test string (pass 1115).", 
-    "This is a data test string (pass 1116).", 
-    "This is a data test string (pass 1117).", 
-    "This is a data test string (pass 1118).", 
-    "This is a data test string (pass 1119)." ;
-
- u =
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org" ;
-}
diff --git a/ncdap_test/expectremote4/test.04.1.dmp b/ncdap_test/expectremote4/test.04.1.dmp
deleted file mode 100644
index 81702b7..0000000
--- a/ncdap_test/expectremote4/test.04.1.dmp
+++ /dev/null
@@ -1,11 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    int i32 ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = {1} ;
-}
diff --git a/ncdap_test/expectremote4/test.04.dmp b/ncdap_test/expectremote4/test.04.dmp
deleted file mode 100644
index c5d9c9c..0000000
--- a/ncdap_test/expectremote4/test.04.dmp
+++ /dev/null
@@ -1,20 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = 
-    {0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"} ;
-}
diff --git a/ncdap_test/expectremote4/test.05.1.dmp b/ncdap_test/expectremote4/test.05.1.dmp
deleted file mode 100644
index 7fdb8df..0000000
--- a/ncdap_test/expectremote4/test.05.1.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound floats_t {
-    float f32 ;
-  }; // floats_t
-  compound types_t {
-    floats_t floats ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = {{0}} ;
-}
diff --git a/ncdap_test/expectremote4/test.05.dmp b/ncdap_test/expectremote4/test.05.dmp
deleted file mode 100644
index 5449e8e..0000000
--- a/ncdap_test/expectremote4/test.05.dmp
+++ /dev/null
@@ -1,29 +0,0 @@
-netcdf test {
-types:
-  compound integers_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-  }; // integers_t
-  compound floats_t {
-    float f32 ;
-    double f64 ;
-  }; // floats_t
-  compound strings_t {
-    string s ;
-    string u ;
-  }; // strings_t
-  compound types_t {
-    integers_t integers ;
-    floats_t floats ;
-    strings_t strings ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = 
-    {{0, 1, 0, 0, 0}, {0, 1000}, {"This is a data test string (pass 0).", "http://www.dods.org"}} ;
-}
diff --git a/ncdap_test/expectremote4/test.06.1.dmp b/ncdap_test/expectremote4/test.06.1.dmp
deleted file mode 100644
index ba5ac60..0000000
--- a/ncdap_test/expectremote4/test.06.1.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf test {
-types:
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-variables:
-	ThreeD_t ThreeD ;
-data:
-
- ThreeD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 0.983843692788121, 0.98200423511727, 0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 0.968912421710645, 0.966389978 [...]
-}
diff --git a/ncdap_test/expectremote4/test.06a.dmp b/ncdap_test/expectremote4/test.06a.dmp
deleted file mode 100644
index a5177b3..0000000
--- a/ncdap_test/expectremote4/test.06a.dmp
+++ /dev/null
@@ -1,13 +0,0 @@
-netcdf test {
-types:
-  compound OneD_t {
-    double amp(10) ;
-    double x(10) ;
-  }; // OneD_t
-variables:
-	OneD_t OneD ;
-data:
-
- OneD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}} ;
-}
diff --git a/ncdap_test/expectremote4/test.07.1.dmp b/ncdap_test/expectremote4/test.07.1.dmp
deleted file mode 100644
index f7ec167..0000000
--- a/ncdap_test/expectremote4/test.07.1.dmp
+++ /dev/null
@@ -1,19 +0,0 @@
-netcdf test {
-types:
-  int(*) person_t ;
-variables:
-	person_t person ;
-
-// global attributes:
-		:Facility.PrincipleInvestigator = "Mark Abbott\n",
-			"Ph.D" ;
-		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
-		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-		:b.Description = "A test byte" ;
-		:b.units = "unknown" ;
-		:i32.Description = "A 32 bit test server int" ;
-		:i32.units = "unknown" ;
-data:
-
- person = {1, 2, 3, 5, 8} ;
-}
diff --git a/ncdap_test/expectremote4/test.07.3.dmp b/ncdap_test/expectremote4/test.07.3.dmp
deleted file mode 100644
index 5511e57..0000000
--- a/ncdap_test/expectremote4/test.07.3.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound person_record_t {
-    string name ;
-    int age ;
-  }; // person_record_t
-  person_record_t(*) person_t ;
-variables:
-	person_t person ;
-data:
-
- person = 
-    {{"This is a data test string (pass 0).", 1}, {"This is a data test string (pass 1).", 2}, {"This is a data test string (pass 2).", 3}, {"This is a data test string (pass 3).", 5}, {"This is a data test string (pass 4).", 8}} ;
-}
diff --git a/ncdap_test/expectremote4/test.07.4.dmp b/ncdap_test/expectremote4/test.07.4.dmp
deleted file mode 100644
index 6b14958..0000000
--- a/ncdap_test/expectremote4/test.07.4.dmp
+++ /dev/null
@@ -1,9 +0,0 @@
-netcdf test {
-types:
-  float(*) types_t ;
-variables:
-	types_t types ;
-data:
-
- types = {0, 0.9999833, 1.999867, 2.99955, 3.998933} ;
-}
diff --git a/ncdap_test/expectremote4/test.07.dmp b/ncdap_test/expectremote4/test.07.dmp
deleted file mode 100644
index 97fe85f..0000000
--- a/ncdap_test/expectremote4/test.07.dmp
+++ /dev/null
@@ -1,36 +0,0 @@
-netcdf test {
-types:
-  compound person_record_t {
-    string name ;
-    int age ;
-  }; // person_record_t
-  person_record_t(*) person_t ;
-  compound types_record_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_record_t
-  types_record_t(*) types_t ;
-variables:
-	person_t person ;
-	types_t types ;
-
-// global attributes:
-		:Facility.PrincipleInvestigator = "Mark Abbott\n",
-			"Ph.D" ;
-		:Facility.DataCenter = "COAS Environmental Computer Facility" ;
-		:Facility.DrifterType = "MetOcean WOCE/OCM" ;
-data:
-
- person = 
-    {{"This is a data test string (pass 0).", 1}, {"This is a data test string (pass 1).", 2}, {"This is a data test string (pass 2).", 3}, {"This is a data test string (pass 3).", 5}, {"This is a data test string (pass 4).", 8}} ;
-
- types = 
-    {{0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"}, {1, 2, 2, 16, 65520, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", "http://www.dods.org"}, {2, 3, 6, 32, 65504, 1.999867, 999.800006666578, "This is a data test string (pass 2).", "http://www.dods.org"}, {3, 5, 12, 48, 65488, 2.99955, 999.550033748988, "This is a data test string (pass 3).", "http://www.dods.org"}, {4, 8, 20, 64, 65472, 3.998933, 999.200106660978, "This is [...]
-}
diff --git a/ncdap_test/expectremote4/test.07a.dmp b/ncdap_test/expectremote4/test.07a.dmp
deleted file mode 100644
index ccfd6c9..0000000
--- a/ncdap_test/expectremote4/test.07a.dmp
+++ /dev/null
@@ -1,19 +0,0 @@
-netcdf test {
-types:
-  compound person1_t {
-    string name ;
-    int age ;
-  }; // person1_t
-  compound person2_t {
-    string name ;
-    int age ;
-  }; // person2_t
-variables:
-	person1_t person1 ;
-	person2_t person2 ;
-data:
-
- person1 = {"This is a data test string (pass 0).", 1} ;
-
- person2 = {"This is a data test string (pass 1).", 2} ;
-}
diff --git a/ncdap_test/expectremote4/test.21.dmp b/ncdap_test/expectremote4/test.21.dmp
deleted file mode 100644
index ffa508d..0000000
--- a/ncdap_test/expectremote4/test.21.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf test {
-types:
-  compound exp_t {
-    int j ;
-    int i ;
-    short g(3, 3, 3) ;
-    short f(2, 2) ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, 2, {0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656}, {0, 256, 512, 768}} ;
-}
diff --git a/ncdap_test/expectremote4/test.22.dmp b/ncdap_test/expectremote4/test.22.dmp
deleted file mode 100644
index 87e35fc..0000000
--- a/ncdap_test/expectremote4/test.22.dmp
+++ /dev/null
@@ -1,25 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042 [...]
-}
diff --git a/ncdap_test/expectremote4/test.23.dmp b/ncdap_test/expectremote4/test.23.dmp
deleted file mode 100644
index 19740d6..0000000
--- a/ncdap_test/expectremote4/test.23.dmp
+++ /dev/null
@@ -1,36 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound profile_t {
-    double fluor(10) ;
-    double depth(10) ;
-  }; // profile_t
-  compound ComplexSequence_record_t {
-    data_t data ;
-    float lat ;
-    float lng ;
-    profile_t profile ;
-  }; // ComplexSequence_record_t
-  ComplexSequence_record_t(*) ComplexSequence_t ;
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    ComplexSequence_t ComplexSequence ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {{{2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, 0, 0.9999833, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.9987502603949 [...]
-}
diff --git a/ncdap_test/expectremote4/test.31.dmp b/ncdap_test/expectremote4/test.31.dmp
deleted file mode 100644
index 77c20d3..0000000
--- a/ncdap_test/expectremote4/test.31.dmp
+++ /dev/null
@@ -1,24 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(2, 5) ;
-  }; // data_t
-  compound profile_t {
-    double fluor(10) ;
-    double depth(10) ;
-  }; // profile_t
-  compound CS01_record_t {
-    data_t data ;
-    float lat ;
-    float lng ;
-    profile_t profile ;
-  }; // CS01_record_t
-  CS01_record_t(*) CS01_t ;
-variables:
-	CS01_t CS01 ;
-data:
-
- CS01 = 
-    {{{1, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, 0, 0.9999833, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 [...]
-}
diff --git a/ncdap_test/expectremote4/test.50.dmp b/ncdap_test/expectremote4/test.50.dmp
deleted file mode 100644
index 80e7cc6..0000000
--- a/ncdap_test/expectremote4/test.50.dmp
+++ /dev/null
@@ -1,31 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_t
-dimensions:
-	types_0 = 10 ;
-variables:
-	types_t types(types_0) ;
-data:
-
- types = 
-    {0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"}, 
-    {1, 2, 2, 16, 65520, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", "http://www.dods.org"}, 
-    {2, 3, 6, 32, 65504, 1.999867, 999.800006666578, "This is a data test string (pass 2).", "http://www.dods.org"}, 
-    {3, 5, 12, 48, 65488, 2.99955, 999.550033748988, "This is a data test string (pass 3).", "http://www.dods.org"}, 
-    {4, 8, 20, 64, 65472, 3.998933, 999.200106660978, "This is a data test string (pass 4).", "http://www.dods.org"}, 
-    {5, 13, 30, 80, 65456, 4.997917, 998.750260394966, "This is a data test string (pass 5).", "http://www.dods.org"}, 
-    {6, 21, 42, 96, 65440, 5.996401, 998.200539935204, "This is a data test string (pass 6).", "http://www.dods.org"}, 
-    {7, 34, 56, 112, 65424, 6.994285, 997.55100025328, "This is a data test string (pass 7).", "http://www.dods.org"}, 
-    {8, 55, 72, 128, 65408, 7.991469, 996.801706302619, "This is a data test string (pass 8).", "http://www.dods.org"}, 
-    {9, 89, 90, 144, 65392, 8.987855, 995.952733011994, "This is a data test string (pass 9).", "http://www.dods.org"} ;
-}
diff --git a/ncdap_test/expectremote4/test.53.dmp b/ncdap_test/expectremote4/test.53.dmp
deleted file mode 100644
index cc0c9be..0000000
--- a/ncdap_test/expectremote4/test.53.dmp
+++ /dev/null
@@ -1,34 +0,0 @@
-netcdf test {
-types:
-  compound ss_t {
-    ushort ui16(10) ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u(5) ;
-  }; // ss_t
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ss_t ss ;
-  }; // types_t
-dimensions:
-	types_0 = 10 ;
-variables:
-	types_t types(types_0) ;
-data:
-
- types = 
-    {0, 1, 0, 0, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 0, 1000, "This is a data test string (pass 0).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {1, 2, 2, 16, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {2, 3, 6, 32, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 1.999867, 999.800006666578, "This is a data test string (pass 2).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {3, 5, 12, 48, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 2.99955, 999.550033748988, "This is a data test string (pass 3).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {4, 8, 20, 64, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 3.998933, 999.200106660978, "This is a data test string (pass 4).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {5, 13, 30, 80, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 4.997917, 998.750260394966, "This is a data test string (pass 5).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {6, 21, 42, 96, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 5.996401, 998.200539935204, "This is a data test string (pass 6).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {7, 34, 56, 112, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 6.994285, 997.55100025328, "This is a data test string (pass 7).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {8, 55, 72, 128, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 7.991469, 996.801706302619, "This is a data test string (pass 8).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {9, 89, 90, 144, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 8.987855, 995.952733011994, "This is a data test string (pass 9).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}} ;
-}
diff --git a/ncdap_test/expectremote4/test.55.dmp b/ncdap_test/expectremote4/test.55.dmp
deleted file mode 100644
index 72fb308..0000000
--- a/ncdap_test/expectremote4/test.55.dmp
+++ /dev/null
@@ -1,23 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound foo_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-  }; // foo_t
-  compound ralph_record_t {
-    ubyte b ;
-    foo_t foo ;
-  }; // ralph_record_t
-  ralph_record_t(*) ralph_t ;
-variables:
-	ralph_t ralph ;
-data:
-
- ralph = 
-    {{0, {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}}}, {1, {3, {0, 2048, 4096}, {5, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}}}, {2, {8, {0, 2048, 4096}, {13, {1, 0.999950000416665, 0.999800006666578, 0 [...]
-}
diff --git a/ncdap_test/expectremote4/test.56.dmp b/ncdap_test/expectremote4/test.56.dmp
deleted file mode 100644
index c674e11..0000000
--- a/ncdap_test/expectremote4/test.56.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound foo_record_t {
-    ubyte b(10) ;
-    int i(10) ;
-  }; // foo_record_t
-  foo_record_t(*) foo_t ;
-variables:
-	foo_t foo ;
-data:
-
- foo = 
-    {{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}} ;
-}
diff --git a/ncdap_test/expectremote4/test.57.dmp b/ncdap_test/expectremote4/test.57.dmp
deleted file mode 100644
index c674e11..0000000
--- a/ncdap_test/expectremote4/test.57.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound foo_record_t {
-    ubyte b(10) ;
-    int i(10) ;
-  }; // foo_record_t
-  foo_record_t(*) foo_t ;
-variables:
-	foo_t foo ;
-data:
-
- foo = 
-    {{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}} ;
-}
diff --git a/ncdap_test/expectremote4/test.66.dmp b/ncdap_test/expectremote4/test.66.dmp
deleted file mode 100644
index 39073a7..0000000
--- a/ncdap_test/expectremote4/test.66.dmp
+++ /dev/null
@@ -1,42 +0,0 @@
-netcdf test {
-types:
-  compound long_names_one_t {
-    int long_one ;
-    int long_two ;
-    int long_three ;
-    int long_four ;
-    int long_five ;
-    int long_six ;
-    double long_one_float ;
-    double long_two_float ;
-    double long_three_float ;
-  }; // long_names_one_t
-  compound long_names_one_and_a_half_t {
-    int long_one_float1 ;
-    int long_two_float1 ;
-    int long_three_float3 ;
-    int long_four ;
-    int long_five ;
-    int long_six ;
-    double long_one_float ;
-    double long_two_float ;
-    double long_three_float ;
-  }; // long_names_one_and_a_half_t
-  compound long_names_two_t {
-    int a_very_long_name_given_what_it_accomplishes ;
-    int another_name_nearly_as_pointless ;
-  }; // long_names_two_t
-variables:
-	long_names_one_t long_names_one ;
-	long_names_one_and_a_half_t long_names_one_and_a_half ;
-	long_names_two_t long_names_two ;
-data:
-
- long_names_one = 
-    {1, 2, 3, 5, 8, 13, 1000, 999.950000416665, 999.800006666578} ;
-
- long_names_one_and_a_half = 
-    {21, 34, 55, 89, 144, 233, 999.550033748988, 999.200106660978, 998.750260394966} ;
-
- long_names_two = {377, 610} ;
-}
diff --git a/ncdap_test/expectremote4/test.67.dmp b/ncdap_test/expectremote4/test.67.dmp
deleted file mode 100644
index 04f0fc4..0000000
--- a/ncdap_test/expectremote4/test.67.dmp
+++ /dev/null
@@ -1,78 +0,0 @@
-netcdf test {
-dimensions:
-	latitude = 20 ;
-	longitude = 10 ;
-variables:
-	int i ;
-	double f(latitude, longitude) ;
-data:
-
- i = 1 ;
-
- f =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204, 
-    0.99755100025328, 0.996801706302619, 0.995952733011994,
-  0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 
-    0.990215996212637, 0.988771077936042, 0.987227283375627, 
-    0.985584766909561, 0.983843692788121, 0.98200423511727,
-  0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 
-    0.97133797485203, 0.968912421710645, 0.966389978134513, 
-    0.963770896365891, 0.961055438310771, 0.958243875512697,
-  0.955336489125606, 0.952333569885713, 0.949235418082441, 0.946042343528387, 
-    0.942754665528346, 0.939372712847379, 0.935896823677935, 
-    0.932327345606034, 0.92866463557651, 0.924909059857313,
-  0.921060994002885, 0.917120822816605, 0.913088940312308, 0.908965749674885, 
-    0.904751663219963, 0.900447102352677, 0.896052497525525, 
-    0.891568288195329, 0.886994922779284, 0.882332858610121,
-  0.877582561890373, 0.872744507645751, 0.86781917967765, 0.862807070514761, 
-    0.857708681363824, 0.852524522059506, 0.847255111013416, 
-    0.841900975162269, 0.836462649915187, 0.830940679100164,
-  0.825335614909678, 0.819648017845479, 0.813878456662534, 0.808027508312152, 
-    0.802095757884293, 0.796083798549056, 0.789992231497365, 
-    0.783821665880849, 0.777572718750928, 0.771246014997107,
-  0.764842187284488, 0.758361875990508, 0.751805729140895, 0.74517440234487, 
-    0.738468558729588, 0.731688868873821, 0.724836010740905, 
-    0.717910669610943, 0.710913538012277, 0.703845315652236,
-  0.696706709347165, 0.689498432951747, 0.682221207287614, 0.674875760071267, 
-    0.667462825841308, 0.659983145884982, 0.652437468164052, 
-    0.644826547240001, 0.63715114419858, 0.629412026573697,
-  0.621609968270664, 0.613745749488812, 0.605820156643463, 0.597833982287298, 
-    0.589788025031098, 0.581683089463883, 0.573519986072457, 
-    0.565299531160354, 0.557022546766217, 0.548689860581588,
-  0.54030230586814, 0.531860721374355, 0.52336595125165, 0.514818844969955, 
-    0.506220257232778, 0.497571047891727, 0.488872081860527, 
-    0.480124229028534, 0.47132836417374, 0.462485366875301,
-  0.453596121425577, 0.444661516741707, 0.435682446276712, 0.426659807930157, 
-    0.417594503958358, 0.408487440884157, 0.399339529406273, 
-    0.39015168430823, 0.380924824366882, 0.371659872260533,
-  0.362357754476674, 0.35301940121933, 0.343645746316047, 0.334237727124503, 
-    0.324796284438776, 0.315322362395269, 0.305816908378289, 
-    0.296280872925319, 0.286715209631956, 0.277120875056558,
-  0.267498828624587, 0.25785003253267, 0.248175451652373, 0.238476053433723, 
-    0.228752807808459, 0.219006687093041, 0.209238665891419, 
-    0.199449720997573, 0.189640831297834, 0.179812977673,
-  0.169967142900241, 0.160104311554831, 0.150225469911686, 0.140331605846737, 
-    0.130423708738146, 0.120502769367367, 0.11056977982007, 
-    0.100625733386932, 0.0906716244643097, 0.0807084484548006,
-  0.0707372016677029, 0.0607588812193859, 0.0507744849335792, 
-    0.040785011241591, 0.0307914590824661, 0.0207948278030924, 
-    0.0107961170582674, 0.000796326710733263, -0.00920354326880834, 
-    -0.0192024929016926,
-  -0.0291995223012888, -0.0391936317729877, -0.0491838219141706, 
-    -0.0591690937141481, -0.0691484486540619, -0.0791208888067339, 
-    -0.089085416936459, -0.099041036598728, -0.108986752239871, 
-    -0.118921569296612,
-  -0.128844494295525, -0.138754534952378, -0.148650700271364, 
-    -0.158532000644198, -0.168397447949077, -0.178246055649492, 
-    -0.18807683889288, -0.197888814609109, -0.207681001608784, 
-    -0.217452420681365,
-  -0.227202094693087, -0.236929048684675, -0.246632309968834, 
-    -0.256310908227523, -0.26596387560898, -0.275590246824513, 
-    -0.285189059245021, -0.294759352997261, -0.304300171059833, 
-    -0.313810559358882,
-  -0.323289566863503, -0.332736245680845, -0.342149651150898, 
-    -0.35152884194096, -0.360872880139767, -0.370180831351287, 
-    -0.379451764788155, -0.388684753364752, -0.397878873789916, 
-    -0.407033206659266 ;
-}
diff --git a/ncdap_test/expectremote4/test.68.dmp b/ncdap_test/expectremote4/test.68.dmp
deleted file mode 100644
index a6e0536..0000000
--- a/ncdap_test/expectremote4/test.68.dmp
+++ /dev/null
@@ -1,2 +0,0 @@
-netcdf test {
-}
diff --git a/ncdap_test/expectremote4/test.69.dmp b/ncdap_test/expectremote4/test.69.dmp
deleted file mode 100644
index 3b61d54..0000000
--- a/ncdap_test/expectremote4/test.69.dmp
+++ /dev/null
@@ -1,401 +0,0 @@
-netcdf test {
-types:
-  compound exp_t {
-    int j ;
-    int i ;
-  }; // exp_t
-dimensions:
-	f_0 = 17 ;
-	f_1 = 121 ;
-	i_0 = 10 ;
-	i_1 = 20 ;
-variables:
-	int i(i_0, i_1) ;
-	float f(f_0, f_1) ;
-	exp_t exp ;
-data:
-
- i =
-  0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 
-    24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 
-    61440, 63488, 65536, 67584, 69632, 71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112, 92160, 94208, 96256, 98304, 100352, 
-    102400, 104448, 106496, 108544, 110592, 112640, 114688, 116736, 118784, 
-    120832,
-  122880, 124928, 126976, 129024, 131072, 133120, 135168, 137216, 139264, 
-    141312, 143360, 145408, 147456, 149504, 151552, 153600, 155648, 157696, 
-    159744, 161792,
-  163840, 165888, 167936, 169984, 172032, 174080, 176128, 178176, 180224, 
-    182272, 184320, 186368, 188416, 190464, 192512, 194560, 196608, 198656, 
-    200704, 202752,
-  204800, 206848, 208896, 210944, 212992, 215040, 217088, 219136, 221184, 
-    223232, 225280, 227328, 229376, 231424, 233472, 235520, 237568, 239616, 
-    241664, 243712,
-  245760, 247808, 249856, 251904, 253952, 256000, 258048, 260096, 262144, 
-    264192, 266240, 268288, 270336, 272384, 274432, 276480, 278528, 280576, 
-    282624, 284672,
-  286720, 288768, 290816, 292864, 294912, 296960, 299008, 301056, 303104, 
-    305152, 307200, 309248, 311296, 313344, 315392, 317440, 319488, 321536, 
-    323584, 325632,
-  327680, 329728, 331776, 333824, 335872, 337920, 339968, 342016, 344064, 
-    346112, 348160, 350208, 352256, 354304, 356352, 358400, 360448, 362496, 
-    364544, 366592,
-  368640, 370688, 372736, 374784, 376832, 378880, 380928, 382976, 385024, 
-    387072, 389120, 391168, 393216, 395264, 397312, 399360, 401408, 403456, 
-    405504, 407552 ;
-
- f =
-  0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 0.059964, 
-    0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 0.1197122, 
-    0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 0.1790296, 
-    0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 0.2377026, 
-    0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 0.2955202, 
-    0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 0.3522742, 
-    0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 0.4077604, 
-    0.4168708, 0.4259395, 0.4349655, 0.4439481, 0.4528863, 0.4617792, 
-    0.4706259, 0.4794255, 0.4881772, 0.4968801, 0.5055333, 0.514136, 
-    0.5226873, 0.5311862, 0.539632, 0.5480239, 0.556361, 0.5646425, 
-    0.5728675, 0.5810351, 0.5891448, 0.5971954, 0.6051864, 0.6131169, 
-    0.620986, 0.628793, 0.6365372, 0.6442177, 0.6518338, 0.6593847, 
-    0.6668696, 0.6742879, 0.6816388, 0.6889215, 0.6961352, 0.7032794, 
-    0.7103533, 0.7173561, 0.7242872, 0.7311459, 0.7379314, 0.7446431, 
-    0.7512804, 0.7578425, 0.764329, 0.7707389, 0.7770718, 0.7833269, 
-    0.7895038, 0.7956016, 0.8016199, 0.8075581, 0.8134155, 0.8191916, 
-    0.8248857, 0.8304974, 0.836026, 0.841471, 0.8468319, 0.852108, 0.857299, 
-    0.8624042, 0.8674232, 0.8723555, 0.8772005, 0.8819578, 0.8866269, 
-    0.8912073, 0.8956987, 0.9001005, 0.9044122, 0.9086335, 0.912764, 
-    0.9168031, 0.9207506, 0.924606, 0.928369, 0.9320391,
-  0.935616, 0.9390994, 0.9424888, 0.945784, 0.9489846, 0.9520903, 0.9551008, 
-    0.9580159, 0.960835, 0.9635582, 0.966185, 0.9687151, 0.9711484, 
-    0.9734845, 0.9757234, 0.9778646, 0.979908, 0.9818535, 0.9837008, 
-    0.9854497, 0.9871001, 0.9886518, 0.9901046, 0.9914584, 0.992713, 
-    0.9938684, 0.9949244, 0.9958808, 0.9967378, 0.997495, 0.9981525, 
-    0.9987102, 0.9991679, 0.9995258, 0.9997838, 0.9999417, 0.9999997, 
-    0.9999576, 0.9998156, 0.9995736, 0.9992316, 0.9987897, 0.998248, 
-    0.9976064, 0.996865, 0.996024, 0.9950833, 0.9940432, 0.9929036, 
-    0.9916648, 0.9903268, 0.9888898, 0.9873539, 0.9857192, 0.983986, 
-    0.9821543, 0.9802245, 0.9781966, 0.9760709, 0.9738476, 0.971527, 
-    0.9691091, 0.9665944, 0.963983, 0.9612752, 0.9584713, 0.9555715, 
-    0.9525762, 0.9494856, 0.9463001, 0.9430199, 0.9396455, 0.9361771, 
-    0.932615, 0.9289597, 0.9252115, 0.9213708, 0.917438, 0.9134133, 
-    0.9092974, 0.9050906, 0.9007932, 0.8964058, 0.8919287, 0.8873624, 
-    0.8827074, 0.8779641, 0.873133, 0.8682146, 0.8632094, 0.8581178, 
-    0.8529405, 0.8476778, 0.8423305, 0.8368988, 0.8313835, 0.825785, 
-    0.8201039, 0.8143409, 0.8084964, 0.8025711, 0.7965655, 0.7904802, 
-    0.7843159, 0.7780732, 0.7717527, 0.7653549, 0.7588807, 0.7523306, 
-    0.7457052, 0.7390053, 0.7322314, 0.7253844, 0.7184648, 0.7114733, 
-    0.7044108, 0.6972777, 0.690075, 0.6828032, 0.6754632, 0.6680556,
-  0.6605812, 0.6530408, 0.645435, 0.6377647, 0.6300306, 0.6222336, 0.6143743, 
-    0.6064535, 0.5984721, 0.5904309, 0.5823306, 0.5741721, 0.5659562, 
-    0.5576837, 0.5493554, 0.5409722, 0.5325349, 0.5240443, 0.5155014, 
-    0.5069069, 0.4982616, 0.4895666, 0.4808226, 0.4720306, 0.4631913, 
-    0.4543057, 0.4453746, 0.4363991, 0.4273799, 0.4183179, 0.4092142, 
-    0.4000695, 0.3908848, 0.381661, 0.372399, 0.3630998, 0.3537644, 
-    0.3443935, 0.3349881, 0.3255493, 0.316078, 0.306575, 0.2970414, 0.287478, 
-    0.2778859, 0.2682661, 0.2586193, 0.2489468, 0.2392493, 0.229528, 
-    0.2197836, 0.2100173, 0.20023, 0.1904227, 0.1805963, 0.1707518, 
-    0.1608903, 0.1510127, 0.14112, 0.1312132, 0.1212933, 0.1113612, 0.101418, 
-    0.09146464, 0.08150215, 0.07153151, 0.06155372, 0.05156977, 0.04158066, 
-    0.0315874, 0.02159098, 0.01159239, 0.001592653, -0.008407247, 
-    -0.01840631, -0.02840353, -0.0383979, -0.04838844, -0.05837414, 
-    -0.068354, -0.07832703, -0.08829223, -0.09824859, -0.1081951, -0.1181309, 
-    -0.1280548, -0.1379659, -0.1478632, -0.1577457, -0.1676124, -0.1774624, 
-    -0.1872947, -0.1971082, -0.206902, -0.2166751, -0.2264265, -0.2361553, 
-    -0.2458605, -0.2555411, -0.2651961, -0.2748247, -0.2844257, -0.2939983, 
-    -0.3035415, -0.3130544, -0.3225359, -0.3319852, -0.3414013, -0.3507832, 
-    -0.3601301, -0.369441, -0.3787149, -0.3879509, -0.3971482, -0.4063057, 
-    -0.4154226, -0.424498, -0.4335309, -0.4425204, -0.4514658, -0.4603659,
-  -0.46922, -0.4780273, -0.4867867, -0.4954974, -0.5041586, -0.5127693, 
-    -0.5213288, -0.5298361, -0.5382905, -0.5466911, -0.5550369, -0.5633273, 
-    -0.5715613, -0.5797382, -0.5878571, -0.5959172, -0.6039178, -0.6118579, 
-    -0.6197369, -0.6275538, -0.635308, -0.6429988, -0.6506251, -0.6581865, 
-    -0.665682, -0.673111, -0.6804726, -0.6877661, -0.694991, -0.7021463, 
-    -0.7092314, -0.7162456, -0.7231881, -0.7300584, -0.7368556, -0.7435791, 
-    -0.7502283, -0.7568025, -0.763301, -0.7697231, -0.7760683, -0.7823359, 
-    -0.7885253, -0.7946358, -0.8006668, -0.8066177, -0.8124881, -0.8182771, 
-    -0.8239843, -0.8296092, -0.835151, -0.8406094, -0.8459837, -0.8512734, 
-    -0.856478, -0.8615969, -0.8666297, -0.8715758, -0.8764347, -0.881206, 
-    -0.8858892, -0.8904838, -0.8949894, -0.8994054, -0.9037315, -0.9079673, 
-    -0.9121122, -0.9161659, -0.920128, -0.9239982, -0.9277759, -0.9314608, 
-    -0.9350526, -0.9385508, -0.9419553, -0.9452655, -0.9484812, -0.9516021, 
-    -0.9546278, -0.957558, -0.9603925, -0.963131, -0.965773, -0.9683186, 
-    -0.9707673, -0.973119, -0.9753733, -0.9775301, -0.9795892, -0.9815503, 
-    -0.9834132, -0.9851778, -0.9868439, -0.9884112, -0.9898798, -0.9912494, 
-    -0.9925198, -0.993691, -0.9947628, -0.9957352, -0.996608, -0.9973811, 
-    -0.9980544, -0.998628, -0.9991017, -0.9994755, -0.9997494, -0.9999232, 
-    -0.9999971, -0.999971, -0.9998449, -0.9996188, -0.9992928, -0.9988668, 
-    -0.998341, -0.9977152, -0.9969898, -0.9961646, -0.9952399, -0.9942155, 
-    -0.9930918,
-  -0.9918687, -0.9905465, -0.9891253, -0.9876051, -0.9859861, -0.9842686, 
-    -0.9824526, -0.9805384, -0.9785261, -0.976416, -0.9742082, -0.9719031, 
-    -0.9695007, -0.9670014, -0.9644054, -0.9617129, -0.9589243, -0.9560397, 
-    -0.9530596, -0.9499842, -0.9468138, -0.9435487, -0.9401892, -0.9367357, 
-    -0.9331886, -0.9295481, -0.9258147, -0.9219887, -0.9180705, -0.9140605, 
-    -0.9099591, -0.9057667, -0.9014837, -0.8971105, -0.8926477, -0.8880956, 
-    -0.8834547, -0.8787254, -0.8739083, -0.8690037, -0.8640123, -0.8589345, 
-    -0.8537708, -0.8485217, -0.8431877, -0.8377695, -0.8322675, -0.8266822, 
-    -0.8210142, -0.8152642, -0.8094327, -0.8035201, -0.7975273, -0.7914547, 
-    -0.7853029, -0.7790727, -0.7727645, -0.766379, -0.7599169, -0.7533789, 
-    -0.7467654, -0.7400773, -0.7333152, -0.7264798, -0.7195717, -0.7125916, 
-    -0.7055403, -0.6984185, -0.6912268, -0.683966, -0.6766368, -0.6692399, 
-    -0.6617761, -0.6542461, -0.6466507, -0.6389906, -0.6312667, -0.6234795, 
-    -0.6156301, -0.6077191, -0.5997473, -0.5917156, -0.5836247, -0.5754754, 
-    -0.5672686, -0.559005, -0.5506855, -0.542311, -0.5338823, -0.5254001, 
-    -0.5168654, -0.5082791, -0.4996419, -0.4909547, -0.4822185, -0.473434, 
-    -0.4646022, -0.4557239, -0.4468001, -0.4378315, -0.4288192, -0.419764, 
-    -0.4106669, -0.4015286, -0.3923502, -0.3831326, -0.3738767, -0.3645833, 
-    -0.3552535, -0.3458883, -0.3364884, -0.3270548, -0.3175886, -0.3080906, 
-    -0.2985618, -0.2890031, -0.2794155, -0.2698, -0.2601575, -0.250489, 
-    -0.2407954,
-  -0.2310778, -0.2213371, -0.2115742, -0.2017901, -0.1919859, -0.1821625, 
-    -0.1723209, -0.162462, -0.1525869, -0.1426965, -0.1327919, -0.122874, 
-    -0.1129438, -0.1030023, -0.0930505, -0.0830894, -0.07311999, -0.06314328, 
-    -0.05316024, -0.04317189, -0.03317922, -0.02318323, -0.01318493, 
-    -0.003185302, 0.00681464, 0.0168139, 0.02681148, 0.03680638, 0.0467976, 
-    0.05678413, 0.06676499, 0.07673918, 0.08670568, 0.09666352, 0.1066117, 
-    0.1165492, 0.1264751, 0.1363883, 0.1462878, 0.1561728, 0.1660421, 
-    0.1758948, 0.18573, 0.1955465, 0.2053435, 0.21512, 0.2248749, 0.2346074, 
-    0.2443164, 0.254001, 0.2636602, 0.273293, 0.2828985, 0.2924757, 
-    0.3020236, 0.3115413, 0.321028, 0.3304825, 0.3399039, 0.3492913, 
-    0.3586439, 0.3679605, 0.3772404, 0.3864825, 0.395686, 0.4048499, 
-    0.4139734, 0.4230554, 0.4320951, 0.4410917, 0.4500441, 0.4589515, 
-    0.467813, 0.4766277, 0.4853948, 0.4941134, 0.5027825, 0.5114013, 
-    0.519969, 0.5284848, 0.5369476, 0.5453568, 0.5537114, 0.5620106, 
-    0.5702537, 0.5784398, 0.5865679, 0.5946375, 0.6026475, 0.6105974, 
-    0.6184861, 0.626313, 0.6340773, 0.6417782, 0.6494148, 0.6569866, 
-    0.6644927, 0.6719322, 0.6793047, 0.6866091, 0.693845, 0.7010114, 
-    0.7081077, 0.7151332, 0.7220873, 0.728969, 0.735778, 0.7425133, 
-    0.7491744, 0.7557605, 0.7622711, 0.7687054, 0.7750629, 0.7813429, 
-    0.7875448, 0.7936679, 0.7997116, 0.8056753, 0.8115585, 0.8173606, 
-    0.8230809,
-  0.8287189, 0.834274, 0.8397457, 0.8451334, 0.8504366, 0.8556548, 0.8607874, 
-    0.8658339, 0.8707939, 0.8756667, 0.880452, 0.8851492, 0.889758, 
-    0.8942778, 0.8987081, 0.9030486, 0.9072987, 0.9114581, 0.9155264, 
-    0.9195032, 0.9233879, 0.9271804, 0.9308801, 0.9344868, 0.938, 0.9414194, 
-    0.9447446, 0.9479754, 0.9511114, 0.9541523, 0.9570977, 0.9599475, 
-    0.9627013, 0.9653587, 0.9679196, 0.9703838, 0.972751, 0.9750208, 
-    0.9771932, 0.9792678, 0.9812445, 0.9831231, 0.9849033, 0.9865851, 
-    0.9881682, 0.9896525, 0.9910379, 0.9923241, 0.9935111, 0.9945988, 
-    0.995587, 0.9964756, 0.9972646, 0.9979539, 0.9985433, 0.999033, 
-    0.9994227, 0.9997125, 0.9999022, 0.9999921, 0.9999819, 0.9998717, 
-    0.9996616, 0.9993514, 0.9989414, 0.9984314, 0.9978216, 0.997112, 
-    0.9963027, 0.9953938, 0.9943853, 0.9932774, 0.9920702, 0.9907638, 
-    0.9893582, 0.9878538, 0.9862506, 0.9845487, 0.9827484, 0.9808499, 
-    0.9788532, 0.9767586, 0.9745664, 0.9722767, 0.9698898, 0.9674059, 
-    0.9648253, 0.9621482, 0.9593748, 0.9565055, 0.9535406, 0.9504804, 
-    0.9473251, 0.944075, 0.9407306, 0.937292, 0.9337597, 0.9301341, 
-    0.9264155, 0.9226042, 0.9187007, 0.9147053, 0.9106184, 0.9064404, 
-    0.9021719, 0.897813, 0.8933644, 0.8888265, 0.8841997, 0.8794845, 
-    0.8746814, 0.8697907, 0.8648131, 0.859749, 0.8545989, 0.8493634, 
-    0.8440429, 0.8386381, 0.8331493, 0.8275773, 0.8219225,
-  0.8161855, 0.8103669, 0.8044672, 0.7984871, 0.7924272, 0.786288, 0.7800702, 
-    0.7737743, 0.7674012, 0.7609512, 0.7544252, 0.7478237, 0.7411475, 
-    0.7343971, 0.7275733, 0.7206767, 0.7137081, 0.7066681, 0.6995574, 
-    0.6923768, 0.685127, 0.6778086, 0.6704224, 0.6629692, 0.6554497, 
-    0.6478647, 0.6402149, 0.6325011, 0.624724, 0.6168844, 0.6089832, 
-    0.601021, 0.5929987, 0.5849172, 0.5767772, 0.5685794, 0.5603248, 
-    0.5520142, 0.5436484, 0.5352283, 0.5267546, 0.5182282, 0.50965, 
-    0.5010208, 0.4923416, 0.4836131, 0.4748363, 0.4660119, 0.457141, 
-    0.4482243, 0.4392629, 0.4302575, 0.421209, 0.4121185, 0.4029867, 
-    0.3938147, 0.3846032, 0.3753533, 0.3660659, 0.3567419, 0.3473822, 
-    0.3379877, 0.3285595, 0.3190984, 0.3096054, 0.3000814, 0.2905274, 
-    0.2809443, 0.2713332, 0.261695, 0.2520306, 0.2423409, 0.232627, 
-    0.2228899, 0.2131305, 0.2033498, 0.1935487, 0.1837283, 0.1738895, 
-    0.1640333, 0.1541607, 0.1442727, 0.1343703, 0.1244544, 0.1145261, 
-    0.1045863, 0.09463613, 0.08467644, 0.07470829, 0.06473266, 0.05475057, 
-    0.044763, 0.03477095, 0.02477542, 0.01477742, 0.004777943, -0.005222016, 
-    -0.01522145, -0.02521937, -0.03521476, -0.04520663, -0.05519398, 
-    -0.06517581, -0.07515112, -0.08511892, -0.09507821, -0.105028, 
-    -0.1149673, -0.124895, -0.1348103, -0.1447121, -0.1545995, -0.1644713, 
-    -0.1743268, -0.1841648, -0.1939844, -0.2037845, -0.2135644, -0.2233228, 
-    -0.2330589, -0.2427717,
-  -0.2524603, -0.2621236, -0.2717606, -0.2813705, -0.2909523, -0.300505, 
-    -0.3100276, -0.3195192, -0.3289789, -0.3384056, -0.3477986, -0.3571567, 
-    -0.3664791, -0.3757649, -0.3850131, -0.3942228, -0.4033931, -0.4125231, 
-    -0.4216118, -0.4306583, -0.4396617, -0.4486212, -0.4575359, -0.4664048, 
-    -0.475227, -0.4840018, -0.4927281, -0.5014051, -0.5100321, -0.518608, 
-    -0.527132, -0.5356033, -0.5440211, -0.5523845, -0.5606926, -0.5689447, 
-    -0.5771399, -0.5852773, -0.5933563, -0.6013759, -0.6093353, -0.6172339, 
-    -0.6250706, -0.6328449, -0.640556, -0.6482029, -0.6557851, -0.6633016, 
-    -0.6707519, -0.678135, -0.6854504, -0.6926972, -0.6998747, -0.7069823, 
-    -0.7140191, -0.7209845, -0.7278779, -0.7346984, -0.7414455, -0.7481185, 
-    -0.7547166, -0.7612393, -0.7676858, -0.7740556, -0.7803479, -0.7865623, 
-    -0.792698, -0.7987544, -0.8047309, -0.810627, -0.816442, -0.8221753, 
-    -0.8278264, -0.8333948, -0.8388798, -0.844281, -0.8495977, -0.8548294, 
-    -0.8599757, -0.865036, -0.8700097, -0.8748965, -0.8796958, -0.884407, 
-    -0.8890299, -0.8935639, -0.8980085, -0.9023633, -0.9066279, -0.9108018, 
-    -0.9148846, -0.918876, -0.9227754, -0.9265826, -0.9302971, -0.9339186, 
-    -0.9374467, -0.9408811, -0.9442213, -0.9474672, -0.9506183, -0.9536743, 
-    -0.956635, -0.9595, -0.9622691, -0.9649419, -0.9675183, -0.9699979, 
-    -0.9723805, -0.9746658, -0.9768537, -0.9789439, -0.9809362, -0.9828305, 
-    -0.9846264, -0.9863239, -0.9879227, -0.9894227, -0.9908239, -0.9921259, 
-    -0.9933288,
-  -0.9944322, -0.9954363, -0.9963408, -0.9971456, -0.9978508, -0.9984561, 
-    -0.9989617, -0.9993673, -0.999673, -0.9998787, -0.9999844, -0.9999902, 
-    -0.9998959, -0.9997017, -0.9994075, -0.9990134, -0.9985193, -0.9979254, 
-    -0.9972317, -0.9964383, -0.9955452, -0.9945526, -0.9934605, -0.9922691, 
-    -0.9909785, -0.9895887, -0.9881001, -0.9865125, -0.9848264, -0.9830417, 
-    -0.9811588, -0.9791777, -0.9770988, -0.9749221, -0.9726479, -0.9702765, 
-    -0.967808, -0.9652427, -0.962581, -0.959823, -0.956969, -0.9540192, 
-    -0.9509742, -0.947834, -0.944599, -0.9412695, -0.9378459, -0.9343286, 
-    -0.9307178, -0.9270139, -0.9232174, -0.9193285, -0.9153477, -0.9112754, 
-    -0.9071119, -0.9028577, -0.8985133, -0.894079, -0.8895552, -0.8849425, 
-    -0.8802414, -0.8754522, -0.8705754, -0.8656116, -0.8605613, -0.8554249, 
-    -0.8502029, -0.844896, -0.8395045, -0.8340291, -0.8284702, -0.8228286, 
-    -0.8171046, -0.811299, -0.8054122, -0.7994449, -0.7933976, -0.787271, 
-    -0.7810657, -0.7747822, -0.7684214, -0.7619836, -0.7554696, -0.7488801, 
-    -0.7422158, -0.7354771, -0.728665, -0.7217799, -0.7148228, -0.7077941, 
-    -0.7006946, -0.6935251, -0.6862862, -0.6789787, -0.6716033, -0.6641607, 
-    -0.6566517, -0.6490771, -0.6414375, -0.6337339, -0.6259668, -0.6181371, 
-    -0.6102456, -0.6022931, -0.5942804, -0.5862082, -0.5780774, -0.5698889, 
-    -0.5616433, -0.5533416, -0.5449845, -0.5365729, -0.5281077, -0.5195897, 
-    -0.5110196, -0.5023986, -0.4937272, -0.4850065, -0.4762373, -0.4674205, 
-    -0.4585569,
-  -0.4496475, -0.4406931, -0.4316946, -0.422653, -0.4135691, -0.4044438, 
-    -0.3952781, -0.3860729, -0.3768291, -0.3675475, -0.3582293, -0.3488752, 
-    -0.3394862, -0.3300633, -0.3206073, -0.3111193, -0.3016002, -0.292051, 
-    -0.2824725, -0.2728658, -0.2632318, -0.2535715, -0.2438858, -0.2341757, 
-    -0.2244422, -0.2146863, -0.2049089, -0.195111, -0.1852936, -0.1754577, 
-    -0.1656042, -0.1557341, -0.1458485, -0.1359483, -0.1260345, -0.1161081, 
-    -0.1061701, -0.09622151, -0.08626327, -0.0762964, -0.06632189, 
-    -0.05634077, -0.046354, -0.0363626, -0.02636756, -0.01636988, 
-    -0.006370571, 0.003629378, 0.01362896, 0.02362719, 0.03362305, 
-    0.04361555, 0.05360368, 0.06358646, 0.07356288, 0.08353194, 0.09349265, 
-    0.103444, 0.113385, 0.1233147, 0.133232, 0.1431361, 0.1530258, 0.1629002, 
-    0.1727583, 0.1825991, 0.1924217, 0.2022251, 0.2120082, 0.2217701, 
-    0.2315098, 0.2412264, 0.2509189, 0.2605863, 0.2702276, 0.2798419, 
-    0.2894282, 0.2989855, 0.308513, 0.3180096, 0.3274744, 0.3369065, 
-    0.3463049, 0.3556686, 0.3649968, 0.3742885, 0.3835427, 0.3927587, 
-    0.4019353, 0.4110717, 0.420167, 0.4292203, 0.4382307, 0.4471973, 
-    0.4561191, 0.4649954, 0.4738251, 0.4826075, 0.4913416, 0.5000265, 
-    0.5086614, 0.5172455, 0.5257779, 0.5342577, 0.5426841, 0.5510561, 
-    0.5593731, 0.5676342, 0.5758385, 0.5839852, 0.5920735, 0.6001026, 
-    0.6080717, 0.61598, 0.6238267, 0.631611, 0.6393321, 0.6469893, 0.6545818, 
-    0.6621089, 0.6695698,
-  0.6769636, 0.6842899, 0.6915476, 0.6987363, 0.705855, 0.7129031, 0.71988, 
-    0.7267848, 0.7336171, 0.7403759, 0.7470607, 0.7536708, 0.7602055, 
-    0.7666642, 0.7730463, 0.779351, 0.7855778, 0.7917261, 0.7977951, 
-    0.8037844, 0.8096933, 0.8155213, 0.8212677, 0.826932, 0.8325136, 
-    0.8380119, 0.8434264, 0.8487566, 0.8540019, 0.8591618, 0.8642358, 
-    0.8692234, 0.8741241, 0.8789373, 0.8836626, 0.8882996, 0.8928478, 
-    0.8973066, 0.9016758, 0.9059547, 0.9101431, 0.9142405, 0.9182464, 
-    0.9221606, 0.9259824, 0.9297118, 0.9333481, 0.9368911, 0.9403404, 
-    0.9436957, 0.9469566, 0.9501228, 0.953194, 0.9561699, 0.9590501, 
-    0.9618345, 0.9645227, 0.9671144, 0.9696094, 0.9720075, 0.9743084, 
-    0.9765118, 0.9786175, 0.9806255, 0.9825354, 0.9843469, 0.9860601, 
-    0.9876747, 0.9891905, 0.9906074, 0.9919252, 0.9931438, 0.9942631, 
-    0.995283, 0.9962034, 0.9970241, 0.9977452, 0.9983664, 0.9988878, 
-    0.9993094, 0.999631, 0.9998527, 0.9999743, 0.999996, 0.9999177, 
-    0.9997393, 0.9994611, 0.9990828, 0.9986047, 0.9980267, 0.9973488, 
-    0.9965713, 0.9956941, 0.9947174, 0.9936411, 0.9924655, 0.9911907, 
-    0.9898167, 0.9883437, 0.9867719, 0.9851015, 0.9833325, 0.9814652, 
-    0.9794998, 0.9774364, 0.9752753, 0.9730166, 0.9706606, 0.9682076, 
-    0.9656578, 0.9630114, 0.9602687, 0.9574299, 0.9544954, 0.9514655, 
-    0.9483404, 0.9451205, 0.9418061, 0.9383975, 0.934895, 0.9312991,
-  0.9276101, 0.9238282, 0.9199541, 0.9159878, 0.9119301, 0.9077811, 
-    0.9035413, 0.8992112, 0.8947912, 0.8902817, 0.8856831, 0.880996, 
-    0.8762208, 0.871358, 0.866408, 0.8613714, 0.8562487, 0.8510403, 
-    0.8457468, 0.8403688, 0.8349067, 0.8293611, 0.8237326, 0.8180218, 
-    0.8122291, 0.8063552, 0.8004007, 0.7943661, 0.7882521, 0.7820593, 
-    0.7757882, 0.7694396, 0.763014, 0.7565122, 0.7499346, 0.7432821, 
-    0.7365553, 0.7297548, 0.7228814, 0.7159356, 0.7089183, 0.70183, 
-    0.6946716, 0.6874437, 0.6801471, 0.6727825, 0.6653506, 0.6578521, 
-    0.6502879, 0.6426586, 0.6349651, 0.627208, 0.6193883, 0.6115066, 
-    0.6035637, 0.5955606, 0.5874978, 0.5793763, 0.5711969, 0.5629603, 
-    0.5546675, 0.5463191, 0.5379162, 0.5294595, 0.5209498, 0.512388, 
-    0.503775, 0.4951116, 0.4863987, 0.4776371, 0.4688278, 0.4599716, 
-    0.4510695, 0.4421222, 0.4331307, 0.4240958, 0.4150186, 0.4058999, 
-    0.3967406, 0.3875416, 0.3783038, 0.3690283, 0.3597158, 0.3503673, 
-    0.3409838, 0.3315663, 0.3221155, 0.3126326, 0.3031183, 0.2935738, 
-    0.2839999, 0.2743977, 0.2647679, 0.2551118, 0.24543, 0.2357238, 0.225994, 
-    0.2162415, 0.2064675, 0.1966728, 0.1868584, 0.1770254, 0.1671746, 
-    0.1573072, 0.147424, 0.137526, 0.1276143, 0.1176899, 0.1077536, 
-    0.09780665, 0.08784988, 0.07788431, 0.06791096, 0.05793082, 0.04794488, 
-    0.03795415, 0.02795962, 0.0179623, 0.007963183, -0.002036731, -0.01203644,
-  -0.02203495, -0.03203125, -0.04202435, -0.05201325, -0.06199695, 
-    -0.07197444, -0.08194474, -0.09190685, -0.1018598, -0.1118025, -0.121734, 
-    -0.1316534, -0.1415596, -0.1514517, -0.1613286, -0.1711894, -0.181033, 
-    -0.1908586, -0.2006651, -0.2104515, -0.2202168, -0.2299601, -0.2396805, 
-    -0.2493769, -0.2590483, -0.2686938, -0.2783125, -0.2879033, -0.2974654, 
-    -0.3069977, -0.3164992, -0.3259692, -0.3354065, -0.3448103, -0.3541797, 
-    -0.3635136, -0.3728111, -0.3820714, -0.3912935, -0.4004764, -0.4096193, 
-    -0.4187213, -0.4277813, -0.4367986, -0.4457722, -0.4547012, -0.4635848, 
-    -0.472422, -0.4812119, -0.4899538, -0.4986466, -0.5072896, -0.5158818, 
-    -0.5244225, -0.5329107, -0.5413457, -0.5497264, -0.5580522, -0.5663223, 
-    -0.5745357, -0.5826916, -0.5907893, -0.5988278, -0.6068066, -0.6147246, 
-    -0.6225811, -0.6303754, -0.6381067, -0.6457741, -0.653377, -0.6609145, 
-    -0.668386, -0.6757905, -0.6831276, -0.6903963, -0.697596, -0.7047259, 
-    -0.7117853, -0.7187736, -0.72569, -0.7325338, -0.7393044, -0.746001, 
-    -0.7526231, -0.7591698, -0.7656407, -0.772035, -0.7783521, -0.7845913, 
-    -0.7907521, -0.7968339, -0.8028359, -0.8087577, -0.8145986, -0.820358, 
-    -0.8260354, -0.8316302, -0.8371418, -0.8425697, -0.8479133, -0.8531722, 
-    -0.8583457, -0.8634335, -0.8684348, -0.8733494, -0.8781766, -0.882916, 
-    -0.887567, -0.8921294, -0.8966025, -0.900986, -0.9052793, -0.9094821, 
-    -0.913594, -0.9176146, -0.9215433, -0.9253799, -0.929124, -0.9327752, 
-    -0.9363331, -0.9397973,
-  -0.9431676, -0.9464436, -0.9496249, -0.9527112, -0.9557023, -0.9585978, 
-    -0.9613975, -0.964101, -0.9667081, -0.9692186, -0.9716321, -0.9739484, 
-    -0.9761674, -0.9782887, -0.9803122, -0.9822378, -0.984065, -0.9857939, 
-    -0.9874241, -0.9889557, -0.9903883, -0.9917219, -0.9929563, -0.9940915, 
-    -0.9951273, -0.9960635, -0.9969001, -0.997637, -0.9982741, -0.9988115, 
-    -0.9992489, -0.9995865, -0.999824, -0.9999616, -0.9999992, -0.9999368, 
-    -0.9997745, -0.9995121, -0.9991497, -0.9986875, -0.9981254, -0.9974635, 
-    -0.9967018, -0.9958405, -0.9948795, -0.9938192, -0.9926594, -0.9914004, 
-    -0.9900422, -0.9885849, -0.9870289, -0.9853742, -0.9836209, -0.9817692, 
-    -0.9798194, -0.9777716, -0.975626, -0.9733829, -0.9710424, -0.9686048, 
-    -0.9660704, -0.9634393, -0.9607119, -0.9578884, -0.9549692, -0.9519544, 
-    -0.9488445, -0.9456397, -0.9423403, -0.9389467, -0.9354591, -0.9318781, 
-    -0.9282038, -0.9244367, -0.9205772, -0.9166257, -0.9125825, -0.908448, 
-    -0.9042226, -0.8999069, -0.8955011, -0.8910058, -0.8864214, -0.8817484, 
-    -0.8769872, -0.8721383, -0.8672022, -0.8621793, -0.8570703, -0.8518755, 
-    -0.8465956, -0.841231, -0.8357822, -0.8302499, -0.8246346, -0.8189368, 
-    -0.8131571, -0.8072961, -0.8013543, -0.7953325, -0.7892311, -0.7830508, 
-    -0.7767922, -0.7704558, -0.7640425, -0.7575527, -0.7509872, -0.7443466, 
-    -0.7376316, -0.7308428, -0.7239809, -0.7170466, -0.7100406, -0.7029637, 
-    -0.6958163, -0.6885995, -0.6813138, -0.6739599, -0.6665387, -0.6590508, 
-    -0.6514969,
-  -0.643878, -0.6361946, -0.6284477, -0.6206378, -0.612766, -0.6048328, 
-    -0.5968392, -0.5887859, -0.5806737, -0.5725034, -0.5642759, -0.5559919, 
-    -0.5476524, -0.5392581, -0.5308099, -0.5223086, -0.513755, -0.5051501, 
-    -0.4964947, -0.4877896, -0.4790358, -0.470234, -0.4613852, -0.4524903, 
-    -0.4435501, -0.4345656, -0.4255376, -0.4164671, -0.4073549, -0.398202, 
-    -0.3890093, -0.3797776, -0.370508, -0.3612014, -0.3518586, -0.3424806, 
-    -0.3330684, -0.3236229, -0.314145, -0.3046357, -0.2950959, -0.2855267, 
-    -0.2759288, -0.2663034, -0.2566514, -0.2469737, -0.2372712, -0.2275451, 
-    -0.2177962, -0.2080256, -0.1982341, -0.1884228, -0.1785927, -0.1687447, 
-    -0.1588798, -0.148999, -0.1391034, -0.1291938, -0.1192713, -0.1093369, 
-    -0.09939155, -0.08943626, -0.07947203, -0.06949985, -0.05952072, 
-    -0.04953564, -0.03954561, -0.02955162, -0.01955467, -0.009555776, 
-    0.0004440784, 0.01044389, 0.02044265, 0.03043937, 0.04043305, 0.05042269, 
-    0.06040728, 0.07038583, 0.08035734, 0.09032082, 0.1002753, 0.1102197, 
-    0.1201531, 0.1300745, 0.1399828, 0.1498772, 0.1597566, 0.16962, 
-    0.1794665, 0.189295, 0.1991045, 0.2088942, 0.218663, 0.2284099, 0.238134, 
-    0.2478342, 0.2575097, 0.2671594, 0.2767824, 0.2863777, 0.2959444, 
-    0.3054815, 0.3149881, 0.3244631, 0.3339057, 0.3433149, 0.3526898, 
-    0.3620294, 0.3713328, 0.3805991, 0.3898273, 0.3990166, 0.4081659, 
-    0.4172744, 0.4263412, 0.4353653, 0.444346, 0.4532822, 0.462173, 
-    0.4710177, 0.4798152,
-  0.4885648, 0.4972655, 0.5059164, 0.5145168, 0.5230657, 0.5315624, 
-    0.5400059, 0.5483953, 0.55673, 0.5650089, 0.5732314, 0.5813965, 
-    0.5895035, 0.5975516, 0.6055399, 0.6134676, 0.621334, 0.6291383, 
-    0.6368796, 0.6445573, 0.6521705, 0.6597185, 0.6672005, 0.6746158, 
-    0.6819636, 0.6892433, 0.696454, 0.703595, 0.7106658, 0.7176654, 
-    0.7245933, 0.7314487, 0.738231, 0.7449394, 0.7515734, 0.7581322, 
-    0.7646152, 0.7710217, 0.7773512, 0.7836029, 0.7897762, 0.7958706, 
-    0.8018854, 0.80782, 0.8136737, 0.8194461, 0.8251367, 0.8307446, 
-    0.8362696, 0.8417109, 0.847068, 0.8523403, 0.8575276, 0.8626289, 
-    0.8676441, 0.8725725, 0.8774136, 0.882167, 0.8868322, 0.8914087, 
-    0.8958961, 0.9002938, 0.9046016, 0.9088188, 0.9129453, 0.9169804, 
-    0.9209238, 0.9247751, 0.9285339, 0.9321999, 0.9357727, 0.9392518, 
-    0.9426371, 0.9459282, 0.9491246, 0.952226, 0.9552323, 0.9581431, 
-    0.960958, 0.9636769, 0.9662994, 0.9688252, 0.9712542, 0.973586, 
-    0.9758205, 0.9779574, 0.9799966, 0.9819376, 0.9837806, 0.9855251, 
-    0.9871711, 0.9887184, 0.9901668, 0.9915162, 0.9927664, 0.9939173, 
-    0.994969, 0.995921, 0.9967735, 0.9975263, 0.9981794, 0.9987326, 0.999186, 
-    0.9995394, 0.9997929, 0.9999464, 0.9999999, 0.9999534, 0.999807, 
-    0.9995605, 0.9992141, 0.9987678, 0.9982216, 0.9975756, 0.9968298, 
-    0.9959843, 0.9950393, 0.9939947, 0.9928507, 0.9916075, 0.9902651 ;
-
- exp = {1, 2} ;
-}
diff --git a/ncdap_test/expectremote4/test.an1.dmp b/ncdap_test/expectremote4/test.an1.dmp
deleted file mode 100644
index a6e0536..0000000
--- a/ncdap_test/expectremote4/test.an1.dmp
+++ /dev/null
@@ -1,2 +0,0 @@
-netcdf test {
-}
diff --git a/ncdap_test/expectremote4/test.dfp1.dmp b/ncdap_test/expectremote4/test.dfp1.dmp
deleted file mode 100644
index a6e0536..0000000
--- a/ncdap_test/expectremote4/test.dfp1.dmp
+++ /dev/null
@@ -1,2 +0,0 @@
-netcdf test {
-}
diff --git a/ncdap_test/expectremote4/test.gr1.dmp b/ncdap_test/expectremote4/test.gr1.dmp
deleted file mode 100644
index b08f5fb..0000000
--- a/ncdap_test/expectremote4/test.gr1.dmp
+++ /dev/null
@@ -1,177 +0,0 @@
-netcdf test {
-dimensions:
-	GR_DFNT_CHAR8__X = 5 ;
-	GR_DFNT_CHAR8__Y = 5 ;
-	GR_DFNT_CHAR8__comps = 3 ;
-	GR_DFNT_FLOAT32__X = 7 ;
-	GR_DFNT_FLOAT32__Y = 4 ;
-	GR_DFNT_FLOAT32__comps = 3 ;
-	GR_DFNT_FLOAT64__X = 7 ;
-	GR_DFNT_FLOAT64__Y = 4 ;
-	GR_DFNT_INT16__X = 5 ;
-	GR_DFNT_INT16__Y = 5 ;
-	GR_DFNT_INT16__comps = 2 ;
-	GR_DFNT_INT32__X = 5 ;
-	GR_DFNT_INT32__Y = 5 ;
-	GR_DFNT_INT8__X = 5 ;
-	GR_DFNT_INT8__Y = 5 ;
-	GR_DFNT_INT8__comps = 2 ;
-	GR_DFNT_UCHAR8__X = 3 ;
-	GR_DFNT_UCHAR8__Y = 5 ;
-	GR_DFNT_UCHAR8__comps = 3 ;
-	GR_DFNT_UINT16__X = 3 ;
-	GR_DFNT_UINT16__Y = 3 ;
-	GR_DFNT_UINT16__comps = 3 ;
-	GR_DFNT_UINT32__X = 3 ;
-	GR_DFNT_UINT32__Y = 3 ;
-	GR_DFNT_UINT32__comps = 3 ;
-	GR_DFNT_UINT8__X = 3 ;
-	GR_DFNT_UINT8__Y = 3 ;
-	GR_DFNT_UINT8__comps = 3 ;
-variables:
-	int GR_DFNT_INT32(GR_DFNT_INT32__Y, GR_DFNT_INT32__X) ;
-	uint GR_DFNT_UINT32(GR_DFNT_UINT32__comps, GR_DFNT_UINT32__Y, GR_DFNT_UINT32__X) ;
-	int GR_DFNT_INT16(GR_DFNT_INT16__comps, GR_DFNT_INT16__Y, GR_DFNT_INT16__X) ;
-	uint GR_DFNT_UINT16(GR_DFNT_UINT16__comps, GR_DFNT_UINT16__Y, GR_DFNT_UINT16__X) ;
-	int GR_DFNT_INT8(GR_DFNT_INT8__comps, GR_DFNT_INT8__Y, GR_DFNT_INT8__X) ;
-	ubyte GR_DFNT_UINT8(GR_DFNT_UINT8__comps, GR_DFNT_UINT8__Y, GR_DFNT_UINT8__X) ;
-	double GR_DFNT_FLOAT32(GR_DFNT_FLOAT32__comps, GR_DFNT_FLOAT32__Y, GR_DFNT_FLOAT32__X) ;
-	double GR_DFNT_FLOAT64(GR_DFNT_FLOAT64__Y, GR_DFNT_FLOAT64__X) ;
-	ubyte GR_DFNT_CHAR8(GR_DFNT_CHAR8__comps, GR_DFNT_CHAR8__Y, GR_DFNT_CHAR8__X) ;
-	ubyte GR_DFNT_UCHAR8(GR_DFNT_UCHAR8__comps, GR_DFNT_UCHAR8__Y, GR_DFNT_UCHAR8__X) ;
-data:
-
- GR_DFNT_INT32 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152 ;
-
- GR_DFNT_UINT32 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT16 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT16 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT8 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26 ;
-
- GR_DFNT_FLOAT32 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891,
-  0.961055438310771, 0.958243875512697, 0.955336489125606, 0.952333569885713, 
-    0.949235418082441, 0.946042343528387, 0.942754665528346,
-  0.939372712847379, 0.935896823677935, 0.932327345606034, 0.92866463557651, 
-    0.924909059857313, 0.921060994002885, 0.917120822816605,
-  0.913088940312308, 0.908965749674885, 0.904751663219963, 0.900447102352677, 
-    0.896052497525525, 0.891568288195329, 0.886994922779284,
-  0.882332858610121, 0.877582561890373, 0.872744507645751, 0.86781917967765, 
-    0.862807070514761, 0.857708681363824, 0.852524522059506,
-  0.847255111013416, 0.841900975162269, 0.836462649915187, 0.830940679100164, 
-    0.825335614909678, 0.819648017845479, 0.813878456662534,
-  0.808027508312152, 0.802095757884293, 0.796083798549056, 0.789992231497365, 
-    0.783821665880849, 0.777572718750928, 0.771246014997107,
-  0.764842187284488, 0.758361875990508, 0.751805729140895, 0.74517440234487, 
-    0.738468558729588, 0.731688868873821, 0.724836010740905,
-  0.717910669610943, 0.710913538012277, 0.703845315652236, 0.696706709347165, 
-    0.689498432951747, 0.682221207287614, 0.674875760071267 ;
-
- GR_DFNT_FLOAT64 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891 ;
-
- GR_DFNT_CHAR8 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29,
-  30, 31, 32, 33, 34,
-  35, 36, 37, 38, 39,
-  40, 41, 42, 43, 44,
-  45, 46, 47, 48, 49,
-  50, 51, 52, 53, 54,
-  55, 56, 57, 58, 59,
-  60, 61, 62, 63, 64,
-  65, 66, 67, 68, 69,
-  70, 71, 72, 73, 74 ;
-
- GR_DFNT_UCHAR8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26,
-  27, 28, 29,
-  30, 31, 32,
-  33, 34, 35,
-  36, 37, 38,
-  39, 40, 41,
-  42, 43, 44 ;
-}
diff --git a/ncdap_test/expectremote4/test.gr2.dmp b/ncdap_test/expectremote4/test.gr2.dmp
deleted file mode 100644
index 025acf7..0000000
--- a/ncdap_test/expectremote4/test.gr2.dmp
+++ /dev/null
@@ -1,355 +0,0 @@
-netcdf test {
-dimensions:
-	GR_16__X = 5 ;
-	GR_16__Y = 5 ;
-	GR_16__comps = 16 ;
-	GR_1__X = 5 ;
-	GR_1__Y = 5 ;
-	GR_2__X = 5 ;
-	GR_2__Y = 5 ;
-	GR_2__comps = 2 ;
-	GR_32__X = 5 ;
-	GR_32__Y = 5 ;
-	GR_32__comps = 32 ;
-	GR_4__X = 5 ;
-	GR_4__Y = 5 ;
-	GR_4__comps = 4 ;
-	GR_8__X = 5 ;
-	GR_8__Y = 5 ;
-	GR_8__comps = 8 ;
-variables:
-	int GR_1(GR_1__Y, GR_1__X) ;
-	int GR_2(GR_2__comps, GR_2__Y, GR_2__X) ;
-	int GR_4(GR_4__comps, GR_4__Y, GR_4__X) ;
-	int GR_8(GR_8__comps, GR_8__Y, GR_8__X) ;
-	int GR_16(GR_16__comps, GR_16__Y, GR_16__X) ;
-	int GR_32(GR_32__comps, GR_32__Y, GR_32__X) ;
-data:
-
- GR_1 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152 ;
-
- GR_2 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_4 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752 ;
-
- GR_8 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752,
-  204800, 206848, 208896, 210944, 212992,
-  215040, 217088, 219136, 221184, 223232,
-  225280, 227328, 229376, 231424, 233472,
-  235520, 237568, 239616, 241664, 243712,
-  245760, 247808, 249856, 251904, 253952,
-  256000, 258048, 260096, 262144, 264192,
-  266240, 268288, 270336, 272384, 274432,
-  276480, 278528, 280576, 282624, 284672,
-  286720, 288768, 290816, 292864, 294912,
-  296960, 299008, 301056, 303104, 305152,
-  307200, 309248, 311296, 313344, 315392,
-  317440, 319488, 321536, 323584, 325632,
-  327680, 329728, 331776, 333824, 335872,
-  337920, 339968, 342016, 344064, 346112,
-  348160, 350208, 352256, 354304, 356352,
-  358400, 360448, 362496, 364544, 366592,
-  368640, 370688, 372736, 374784, 376832,
-  378880, 380928, 382976, 385024, 387072,
-  389120, 391168, 393216, 395264, 397312,
-  399360, 401408, 403456, 405504, 407552 ;
-
- GR_16 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752,
-  204800, 206848, 208896, 210944, 212992,
-  215040, 217088, 219136, 221184, 223232,
-  225280, 227328, 229376, 231424, 233472,
-  235520, 237568, 239616, 241664, 243712,
-  245760, 247808, 249856, 251904, 253952,
-  256000, 258048, 260096, 262144, 264192,
-  266240, 268288, 270336, 272384, 274432,
-  276480, 278528, 280576, 282624, 284672,
-  286720, 288768, 290816, 292864, 294912,
-  296960, 299008, 301056, 303104, 305152,
-  307200, 309248, 311296, 313344, 315392,
-  317440, 319488, 321536, 323584, 325632,
-  327680, 329728, 331776, 333824, 335872,
-  337920, 339968, 342016, 344064, 346112,
-  348160, 350208, 352256, 354304, 356352,
-  358400, 360448, 362496, 364544, 366592,
-  368640, 370688, 372736, 374784, 376832,
-  378880, 380928, 382976, 385024, 387072,
-  389120, 391168, 393216, 395264, 397312,
-  399360, 401408, 403456, 405504, 407552,
-  409600, 411648, 413696, 415744, 417792,
-  419840, 421888, 423936, 425984, 428032,
-  430080, 432128, 434176, 436224, 438272,
-  440320, 442368, 444416, 446464, 448512,
-  450560, 452608, 454656, 456704, 458752,
-  460800, 462848, 464896, 466944, 468992,
-  471040, 473088, 475136, 477184, 479232,
-  481280, 483328, 485376, 487424, 489472,
-  491520, 493568, 495616, 497664, 499712,
-  501760, 503808, 505856, 507904, 509952,
-  512000, 514048, 516096, 518144, 520192,
-  522240, 524288, 526336, 528384, 530432,
-  532480, 534528, 536576, 538624, 540672,
-  542720, 544768, 546816, 548864, 550912,
-  552960, 555008, 557056, 559104, 561152,
-  563200, 565248, 567296, 569344, 571392,
-  573440, 575488, 577536, 579584, 581632,
-  583680, 585728, 587776, 589824, 591872,
-  593920, 595968, 598016, 600064, 602112,
-  604160, 606208, 608256, 610304, 612352,
-  614400, 616448, 618496, 620544, 622592,
-  624640, 626688, 628736, 630784, 632832,
-  634880, 636928, 638976, 641024, 643072,
-  645120, 647168, 649216, 651264, 653312,
-  655360, 657408, 659456, 661504, 663552,
-  665600, 667648, 669696, 671744, 673792,
-  675840, 677888, 679936, 681984, 684032,
-  686080, 688128, 690176, 692224, 694272,
-  696320, 698368, 700416, 702464, 704512,
-  706560, 708608, 710656, 712704, 714752,
-  716800, 718848, 720896, 722944, 724992,
-  727040, 729088, 731136, 733184, 735232,
-  737280, 739328, 741376, 743424, 745472,
-  747520, 749568, 751616, 753664, 755712,
-  757760, 759808, 761856, 763904, 765952,
-  768000, 770048, 772096, 774144, 776192,
-  778240, 780288, 782336, 784384, 786432,
-  788480, 790528, 792576, 794624, 796672,
-  798720, 800768, 802816, 804864, 806912,
-  808960, 811008, 813056, 815104, 817152 ;
-
- GR_32 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552,
-  153600, 155648, 157696, 159744, 161792,
-  163840, 165888, 167936, 169984, 172032,
-  174080, 176128, 178176, 180224, 182272,
-  184320, 186368, 188416, 190464, 192512,
-  194560, 196608, 198656, 200704, 202752,
-  204800, 206848, 208896, 210944, 212992,
-  215040, 217088, 219136, 221184, 223232,
-  225280, 227328, 229376, 231424, 233472,
-  235520, 237568, 239616, 241664, 243712,
-  245760, 247808, 249856, 251904, 253952,
-  256000, 258048, 260096, 262144, 264192,
-  266240, 268288, 270336, 272384, 274432,
-  276480, 278528, 280576, 282624, 284672,
-  286720, 288768, 290816, 292864, 294912,
-  296960, 299008, 301056, 303104, 305152,
-  307200, 309248, 311296, 313344, 315392,
-  317440, 319488, 321536, 323584, 325632,
-  327680, 329728, 331776, 333824, 335872,
-  337920, 339968, 342016, 344064, 346112,
-  348160, 350208, 352256, 354304, 356352,
-  358400, 360448, 362496, 364544, 366592,
-  368640, 370688, 372736, 374784, 376832,
-  378880, 380928, 382976, 385024, 387072,
-  389120, 391168, 393216, 395264, 397312,
-  399360, 401408, 403456, 405504, 407552,
-  409600, 411648, 413696, 415744, 417792,
-  419840, 421888, 423936, 425984, 428032,
-  430080, 432128, 434176, 436224, 438272,
-  440320, 442368, 444416, 446464, 448512,
-  450560, 452608, 454656, 456704, 458752,
-  460800, 462848, 464896, 466944, 468992,
-  471040, 473088, 475136, 477184, 479232,
-  481280, 483328, 485376, 487424, 489472,
-  491520, 493568, 495616, 497664, 499712,
-  501760, 503808, 505856, 507904, 509952,
-  512000, 514048, 516096, 518144, 520192,
-  522240, 524288, 526336, 528384, 530432,
-  532480, 534528, 536576, 538624, 540672,
-  542720, 544768, 546816, 548864, 550912,
-  552960, 555008, 557056, 559104, 561152,
-  563200, 565248, 567296, 569344, 571392,
-  573440, 575488, 577536, 579584, 581632,
-  583680, 585728, 587776, 589824, 591872,
-  593920, 595968, 598016, 600064, 602112,
-  604160, 606208, 608256, 610304, 612352,
-  614400, 616448, 618496, 620544, 622592,
-  624640, 626688, 628736, 630784, 632832,
-  634880, 636928, 638976, 641024, 643072,
-  645120, 647168, 649216, 651264, 653312,
-  655360, 657408, 659456, 661504, 663552,
-  665600, 667648, 669696, 671744, 673792,
-  675840, 677888, 679936, 681984, 684032,
-  686080, 688128, 690176, 692224, 694272,
-  696320, 698368, 700416, 702464, 704512,
-  706560, 708608, 710656, 712704, 714752,
-  716800, 718848, 720896, 722944, 724992,
-  727040, 729088, 731136, 733184, 735232,
-  737280, 739328, 741376, 743424, 745472,
-  747520, 749568, 751616, 753664, 755712,
-  757760, 759808, 761856, 763904, 765952,
-  768000, 770048, 772096, 774144, 776192,
-  778240, 780288, 782336, 784384, 786432,
-  788480, 790528, 792576, 794624, 796672,
-  798720, 800768, 802816, 804864, 806912,
-  808960, 811008, 813056, 815104, 817152,
-  819200, 821248, 823296, 825344, 827392,
-  829440, 831488, 833536, 835584, 837632,
-  839680, 841728, 843776, 845824, 847872,
-  849920, 851968, 854016, 856064, 858112,
-  860160, 862208, 864256, 866304, 868352,
-  870400, 872448, 874496, 876544, 878592,
-  880640, 882688, 884736, 886784, 888832,
-  890880, 892928, 894976, 897024, 899072,
-  901120, 903168, 905216, 907264, 909312,
-  911360, 913408, 915456, 917504, 919552,
-  921600, 923648, 925696, 927744, 929792,
-  931840, 933888, 935936, 937984, 940032,
-  942080, 944128, 946176, 948224, 950272,
-  952320, 954368, 956416, 958464, 960512,
-  962560, 964608, 966656, 968704, 970752,
-  972800, 974848, 976896, 978944, 980992,
-  983040, 985088, 987136, 989184, 991232,
-  993280, 995328, 997376, 999424, 1001472,
-  1003520, 1005568, 1007616, 1009664, 1011712,
-  1013760, 1015808, 1017856, 1019904, 1021952,
-  1024000, 1026048, 1028096, 1030144, 1032192,
-  1034240, 1036288, 1038336, 1040384, 1042432,
-  1044480, 1046528, 1048576, 1050624, 1052672,
-  1054720, 1056768, 1058816, 1060864, 1062912,
-  1064960, 1067008, 1069056, 1071104, 1073152,
-  1075200, 1077248, 1079296, 1081344, 1083392,
-  1085440, 1087488, 1089536, 1091584, 1093632,
-  1095680, 1097728, 1099776, 1101824, 1103872,
-  1105920, 1107968, 1110016, 1112064, 1114112,
-  1116160, 1118208, 1120256, 1122304, 1124352,
-  1126400, 1128448, 1130496, 1132544, 1134592,
-  1136640, 1138688, 1140736, 1142784, 1144832,
-  1146880, 1148928, 1150976, 1153024, 1155072,
-  1157120, 1159168, 1161216, 1163264, 1165312,
-  1167360, 1169408, 1171456, 1173504, 1175552,
-  1177600, 1179648, 1181696, 1183744, 1185792,
-  1187840, 1189888, 1191936, 1193984, 1196032,
-  1198080, 1200128, 1202176, 1204224, 1206272,
-  1208320, 1210368, 1212416, 1214464, 1216512,
-  1218560, 1220608, 1222656, 1224704, 1226752,
-  1228800, 1230848, 1232896, 1234944, 1236992,
-  1239040, 1241088, 1243136, 1245184, 1247232,
-  1249280, 1251328, 1253376, 1255424, 1257472,
-  1259520, 1261568, 1263616, 1265664, 1267712,
-  1269760, 1271808, 1273856, 1275904, 1277952,
-  1280000, 1282048, 1284096, 1286144, 1288192,
-  1290240, 1292288, 1294336, 1296384, 1298432,
-  1300480, 1302528, 1304576, 1306624, 1308672,
-  1310720, 1312768, 1314816, 1316864, 1318912,
-  1320960, 1323008, 1325056, 1327104, 1329152,
-  1331200, 1333248, 1335296, 1337344, 1339392,
-  1341440, 1343488, 1345536, 1347584, 1349632,
-  1351680, 1353728, 1355776, 1357824, 1359872,
-  1361920, 1363968, 1366016, 1368064, 1370112,
-  1372160, 1374208, 1376256, 1378304, 1380352,
-  1382400, 1384448, 1386496, 1388544, 1390592,
-  1392640, 1394688, 1396736, 1398784, 1400832,
-  1402880, 1404928, 1406976, 1409024, 1411072,
-  1413120, 1415168, 1417216, 1419264, 1421312,
-  1423360, 1425408, 1427456, 1429504, 1431552,
-  1433600, 1435648, 1437696, 1439744, 1441792,
-  1443840, 1445888, 1447936, 1449984, 1452032,
-  1454080, 1456128, 1458176, 1460224, 1462272,
-  1464320, 1466368, 1468416, 1470464, 1472512,
-  1474560, 1476608, 1478656, 1480704, 1482752,
-  1484800, 1486848, 1488896, 1490944, 1492992,
-  1495040, 1497088, 1499136, 1501184, 1503232,
-  1505280, 1507328, 1509376, 1511424, 1513472,
-  1515520, 1517568, 1519616, 1521664, 1523712,
-  1525760, 1527808, 1529856, 1531904, 1533952,
-  1536000, 1538048, 1540096, 1542144, 1544192,
-  1546240, 1548288, 1550336, 1552384, 1554432,
-  1556480, 1558528, 1560576, 1562624, 1564672,
-  1566720, 1568768, 1570816, 1572864, 1574912,
-  1576960, 1579008, 1581056, 1583104, 1585152,
-  1587200, 1589248, 1591296, 1593344, 1595392,
-  1597440, 1599488, 1601536, 1603584, 1605632,
-  1607680, 1609728, 1611776, 1613824, 1615872,
-  1617920, 1619968, 1622016, 1624064, 1626112,
-  1628160, 1630208, 1632256, 1634304, 1636352 ;
-}
diff --git a/ncdap_test/expectremote4/test.gr3.dmp b/ncdap_test/expectremote4/test.gr3.dmp
deleted file mode 100644
index d2e0705..0000000
--- a/ncdap_test/expectremote4/test.gr3.dmp
+++ /dev/null
@@ -1,68 +0,0 @@
-netcdf test {
-dimensions:
-	GR_Component__X = 5 ;
-	GR_Component__Y = 5 ;
-	GR_Component__comps = 3 ;
-	GR_Line__X = 5 ;
-	GR_Line__Y = 5 ;
-	GR_Line__comps = 3 ;
-	GR_Pixel__X = 5 ;
-	GR_Pixel__Y = 5 ;
-	GR_Pixel__comps = 3 ;
-variables:
-	int GR_Pixel(GR_Pixel__comps, GR_Pixel__Y, GR_Pixel__X) ;
-	int GR_Line(GR_Line__comps, GR_Line__Y, GR_Line__X) ;
-	int GR_Component(GR_Component__comps, GR_Component__Y, GR_Component__X) ;
-data:
-
- GR_Pixel =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-
- GR_Line =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-
- GR_Component =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-}
diff --git a/ncdap_test/expectremote4/test.gr4.dmp b/ncdap_test/expectremote4/test.gr4.dmp
deleted file mode 100644
index d86942b..0000000
--- a/ncdap_test/expectremote4/test.gr4.dmp
+++ /dev/null
@@ -1,26 +0,0 @@
-netcdf test {
-dimensions:
-	GR_Palette__X = 5 ;
-	GR_Palette__Y = 5 ;
-	GR_Palette__comps = 3 ;
-variables:
-	int GR_Palette(GR_Palette__comps, GR_Palette__Y, GR_Palette__X) ;
-data:
-
- GR_Palette =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352,
-  102400, 104448, 106496, 108544, 110592,
-  112640, 114688, 116736, 118784, 120832,
-  122880, 124928, 126976, 129024, 131072,
-  133120, 135168, 137216, 139264, 141312,
-  143360, 145408, 147456, 149504, 151552 ;
-}
diff --git a/ncdap_test/expectremote4/test.gr5.dmp b/ncdap_test/expectremote4/test.gr5.dmp
deleted file mode 100644
index b08f5fb..0000000
--- a/ncdap_test/expectremote4/test.gr5.dmp
+++ /dev/null
@@ -1,177 +0,0 @@
-netcdf test {
-dimensions:
-	GR_DFNT_CHAR8__X = 5 ;
-	GR_DFNT_CHAR8__Y = 5 ;
-	GR_DFNT_CHAR8__comps = 3 ;
-	GR_DFNT_FLOAT32__X = 7 ;
-	GR_DFNT_FLOAT32__Y = 4 ;
-	GR_DFNT_FLOAT32__comps = 3 ;
-	GR_DFNT_FLOAT64__X = 7 ;
-	GR_DFNT_FLOAT64__Y = 4 ;
-	GR_DFNT_INT16__X = 5 ;
-	GR_DFNT_INT16__Y = 5 ;
-	GR_DFNT_INT16__comps = 2 ;
-	GR_DFNT_INT32__X = 5 ;
-	GR_DFNT_INT32__Y = 5 ;
-	GR_DFNT_INT8__X = 5 ;
-	GR_DFNT_INT8__Y = 5 ;
-	GR_DFNT_INT8__comps = 2 ;
-	GR_DFNT_UCHAR8__X = 3 ;
-	GR_DFNT_UCHAR8__Y = 5 ;
-	GR_DFNT_UCHAR8__comps = 3 ;
-	GR_DFNT_UINT16__X = 3 ;
-	GR_DFNT_UINT16__Y = 3 ;
-	GR_DFNT_UINT16__comps = 3 ;
-	GR_DFNT_UINT32__X = 3 ;
-	GR_DFNT_UINT32__Y = 3 ;
-	GR_DFNT_UINT32__comps = 3 ;
-	GR_DFNT_UINT8__X = 3 ;
-	GR_DFNT_UINT8__Y = 3 ;
-	GR_DFNT_UINT8__comps = 3 ;
-variables:
-	int GR_DFNT_INT32(GR_DFNT_INT32__Y, GR_DFNT_INT32__X) ;
-	uint GR_DFNT_UINT32(GR_DFNT_UINT32__comps, GR_DFNT_UINT32__Y, GR_DFNT_UINT32__X) ;
-	int GR_DFNT_INT16(GR_DFNT_INT16__comps, GR_DFNT_INT16__Y, GR_DFNT_INT16__X) ;
-	uint GR_DFNT_UINT16(GR_DFNT_UINT16__comps, GR_DFNT_UINT16__Y, GR_DFNT_UINT16__X) ;
-	int GR_DFNT_INT8(GR_DFNT_INT8__comps, GR_DFNT_INT8__Y, GR_DFNT_INT8__X) ;
-	ubyte GR_DFNT_UINT8(GR_DFNT_UINT8__comps, GR_DFNT_UINT8__Y, GR_DFNT_UINT8__X) ;
-	double GR_DFNT_FLOAT32(GR_DFNT_FLOAT32__comps, GR_DFNT_FLOAT32__Y, GR_DFNT_FLOAT32__X) ;
-	double GR_DFNT_FLOAT64(GR_DFNT_FLOAT64__Y, GR_DFNT_FLOAT64__X) ;
-	ubyte GR_DFNT_CHAR8(GR_DFNT_CHAR8__comps, GR_DFNT_CHAR8__Y, GR_DFNT_CHAR8__X) ;
-	ubyte GR_DFNT_UCHAR8(GR_DFNT_UCHAR8__comps, GR_DFNT_UCHAR8__Y, GR_DFNT_UCHAR8__X) ;
-data:
-
- GR_DFNT_INT32 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152 ;
-
- GR_DFNT_UINT32 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT16 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT16 =
-  0, 4096, 8192,
-  12288, 16384, 20480,
-  24576, 28672, 32768,
-  36864, 40960, 45056,
-  49152, 53248, 57344,
-  61440, 65536, 69632,
-  73728, 77824, 81920,
-  86016, 90112, 94208,
-  98304, 102400, 106496 ;
-
- GR_DFNT_INT8 =
-  0, 2048, 4096, 6144, 8192,
-  10240, 12288, 14336, 16384, 18432,
-  20480, 22528, 24576, 26624, 28672,
-  30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152,
-  51200, 53248, 55296, 57344, 59392,
-  61440, 63488, 65536, 67584, 69632,
-  71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112,
-  92160, 94208, 96256, 98304, 100352 ;
-
- GR_DFNT_UINT8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26 ;
-
- GR_DFNT_FLOAT32 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891,
-  0.961055438310771, 0.958243875512697, 0.955336489125606, 0.952333569885713, 
-    0.949235418082441, 0.946042343528387, 0.942754665528346,
-  0.939372712847379, 0.935896823677935, 0.932327345606034, 0.92866463557651, 
-    0.924909059857313, 0.921060994002885, 0.917120822816605,
-  0.913088940312308, 0.908965749674885, 0.904751663219963, 0.900447102352677, 
-    0.896052497525525, 0.891568288195329, 0.886994922779284,
-  0.882332858610121, 0.877582561890373, 0.872744507645751, 0.86781917967765, 
-    0.862807070514761, 0.857708681363824, 0.852524522059506,
-  0.847255111013416, 0.841900975162269, 0.836462649915187, 0.830940679100164, 
-    0.825335614909678, 0.819648017845479, 0.813878456662534,
-  0.808027508312152, 0.802095757884293, 0.796083798549056, 0.789992231497365, 
-    0.783821665880849, 0.777572718750928, 0.771246014997107,
-  0.764842187284488, 0.758361875990508, 0.751805729140895, 0.74517440234487, 
-    0.738468558729588, 0.731688868873821, 0.724836010740905,
-  0.717910669610943, 0.710913538012277, 0.703845315652236, 0.696706709347165, 
-    0.689498432951747, 0.682221207287614, 0.674875760071267 ;
-
- GR_DFNT_FLOAT64 =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204,
-  0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 
-    0.993956097956697, 0.992808635853866, 0.991561893714788,
-  0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 
-    0.983843692788121, 0.98200423511727, 0.980066577841242,
-  0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 
-    0.968912421710645, 0.966389978134513, 0.963770896365891 ;
-
- GR_DFNT_CHAR8 =
-  0, 1, 2, 3, 4,
-  5, 6, 7, 8, 9,
-  10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19,
-  20, 21, 22, 23, 24,
-  25, 26, 27, 28, 29,
-  30, 31, 32, 33, 34,
-  35, 36, 37, 38, 39,
-  40, 41, 42, 43, 44,
-  45, 46, 47, 48, 49,
-  50, 51, 52, 53, 54,
-  55, 56, 57, 58, 59,
-  60, 61, 62, 63, 64,
-  65, 66, 67, 68, 69,
-  70, 71, 72, 73, 74 ;
-
- GR_DFNT_UCHAR8 =
-  0, 1, 2,
-  3, 4, 5,
-  6, 7, 8,
-  9, 10, 11,
-  12, 13, 14,
-  15, 16, 17,
-  18, 19, 20,
-  21, 22, 23,
-  24, 25, 26,
-  27, 28, 29,
-  30, 31, 32,
-  33, 34, 35,
-  36, 37, 38,
-  39, 40, 41,
-  42, 43, 44 ;
-}
diff --git a/ncdap_test/expectremote4/test.nc.dmp b/ncdap_test/expectremote4/test.nc.dmp
deleted file mode 100644
index 322bd89..0000000
--- a/ncdap_test/expectremote4/test.nc.dmp
+++ /dev/null
@@ -1,929 +0,0 @@
-netcdf test {
-dimensions:
-	D1 = 1 ;
-	D2 = 2 ;
-	D3 = 3 ;
-	D4 = 4 ;
-	Dr = 2 ;
-variables:
-	string c ;
-		c:string_length = 1 ;
-	ubyte b ;
-		string b:c = "" ;
-	short s ;
-		s:b = 128UB ;
-		s:s = -32768s, 32767s ;
-	int i ;
-		i:i = -2147483648, 2147483647, -2147483648 ;
-		i:f = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f ;
-		i:d = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660. ;
-	float f ;
-	double d ;
-		string d:c = "\\200\\177AZ$&" ;
-	string cr ;
-		cr:string_length = 2 ;
-	string c1 ;
-		c1:string_length = 1 ;
-	string c2 ;
-		c2:string_length = 2 ;
-	string c3 ;
-		c3:string_length = 3 ;
-	string c4 ;
-		c4:string_length = 4 ;
-	ubyte br(Dr) ;
-	short sr(Dr) ;
-	int ir(Dr) ;
-	float fr(Dr) ;
-	double dr(Dr) ;
-	ubyte b1(D1) ;
-	short s1(D1) ;
-	int i1(D1) ;
-	float f1(D1) ;
-	double d1(D1) ;
-	ubyte b2(D2) ;
-	short s2(D2) ;
-	int i2(D2) ;
-	float f2(D2) ;
-	double d2(D2) ;
-	ubyte b3(D3) ;
-	short s3(D3) ;
-	int i3(D3) ;
-	float f3(D3) ;
-	double d3(D3) ;
-	ubyte b4(D4) ;
-	short s4(D4) ;
-	int i4(D4) ;
-	float f4(D4) ;
-	double d4(D4) ;
-	string cr1(Dr) ;
-		cr1:string_length = 1 ;
-	ubyte br2(Dr, D2) ;
-	short sr3(Dr, D3) ;
-	int ir4(Dr, D4) ;
-	float f11(D1, D1) ;
-	double d12(D1, D2) ;
-	string c13(D1) ;
-		c13:string_length = 3 ;
-	ubyte b14(D1, D4) ;
-	short s21(D2, D1) ;
-	int i22(D2, D2) ;
-	float f23(D2, D3) ;
-	double d24(D2, D4) ;
-	string c31(D3) ;
-		c31:string_length = 1 ;
-	ubyte b32(D3, D2) ;
-	short s33(D3, D3) ;
-	int i34(D3, D4) ;
-	float f41(D4, D1) ;
-	double d42(D4, D2) ;
-	string c43(D4) ;
-		c43:string_length = 3 ;
-	ubyte b44(D4, D4) ;
-	short sr11(Dr, D1, D1) ;
-	int ir12(Dr, D1, D2) ;
-	float fr13(Dr, D1, D3) ;
-	double dr14(Dr, D1, D4) ;
-	string cr21(Dr, D2) ;
-		cr21:string_length = 1 ;
-	ubyte br22(Dr, D2, D2) ;
-	short sr23(Dr, D2, D3) ;
-	int ir24(Dr, D2, D4) ;
-	float fr31(Dr, D3, D1) ;
-	double dr32(Dr, D3, D2) ;
-	string cr33(Dr, D3) ;
-		cr33:string_length = 3 ;
-	ubyte br34(Dr, D3, D4) ;
-	short sr41(Dr, D4, D1) ;
-	int ir42(Dr, D4, D2) ;
-	float fr43(Dr, D4, D3) ;
-	double dr44(Dr, D4, D4) ;
-	string c111(D1, D1) ;
-		c111:string_length = 1 ;
-	ubyte b112(D1, D1, D2) ;
-	short s113(D1, D1, D3) ;
-	int i114(D1, D1, D4) ;
-	float f121(D1, D2, D1) ;
-	double d122(D1, D2, D2) ;
-	string c123(D1, D2) ;
-		c123:string_length = 3 ;
-	ubyte b124(D1, D2, D4) ;
-	short s131(D1, D3, D1) ;
-	int i132(D1, D3, D2) ;
-	float f133(D1, D3, D3) ;
-	double d134(D1, D3, D4) ;
-	string c141(D1, D4) ;
-		c141:string_length = 1 ;
-	ubyte b142(D1, D4, D2) ;
-	short s143(D1, D4, D3) ;
-	int i144(D1, D4, D4) ;
-	float f211(D2, D1, D1) ;
-	double d212(D2, D1, D2) ;
-	string c213(D2, D1) ;
-		c213:string_length = 3 ;
-	ubyte b214(D2, D1, D4) ;
-	short s221(D2, D2, D1) ;
-	int i222(D2, D2, D2) ;
-	float f223(D2, D2, D3) ;
-	double d224(D2, D2, D4) ;
-	string c231(D2, D3) ;
-		c231:string_length = 1 ;
-	ubyte b232(D2, D3, D2) ;
-	short s233(D2, D3, D3) ;
-	int i234(D2, D3, D4) ;
-	float f241(D2, D4, D1) ;
-	double d242(D2, D4, D2) ;
-	string c243(D2, D4) ;
-		c243:string_length = 3 ;
-	ubyte b244(D2, D4, D4) ;
-	short s311(D3, D1, D1) ;
-	int i312(D3, D1, D2) ;
-	float f313(D3, D1, D3) ;
-	double d314(D3, D1, D4) ;
-	string c321(D3, D2) ;
-		c321:string_length = 1 ;
-	ubyte b322(D3, D2, D2) ;
-	short s323(D3, D2, D3) ;
-	int i324(D3, D2, D4) ;
-	float f331(D3, D3, D1) ;
-	double d332(D3, D3, D2) ;
-	string c333(D3, D3) ;
-		c333:string_length = 3 ;
-	ubyte b334(D3, D3, D4) ;
-	short s341(D3, D4, D1) ;
-	int i342(D3, D4, D2) ;
-	float f343(D3, D4, D3) ;
-	double d344(D3, D4, D4) ;
-	string c411(D4, D1) ;
-		c411:string_length = 1 ;
-	ubyte b412(D4, D1, D2) ;
-	short s413(D4, D1, D3) ;
-	int i414(D4, D1, D4) ;
-	float f421(D4, D2, D1) ;
-	double d422(D4, D2, D2) ;
-	string c423(D4, D2) ;
-		c423:string_length = 3 ;
-	ubyte b424(D4, D2, D4) ;
-	short s431(D4, D3, D1) ;
-	int i432(D4, D3, D2) ;
-	float f433(D4, D3, D3) ;
-	double d434(D4, D3, D4) ;
-	string c441(D4, D4) ;
-		c441:string_length = 1 ;
-	ubyte b442(D4, D4, D2) ;
-	short s443(D4, D4, D3) ;
-	int i444(D4, D4, D4) ;
-
-// global attributes:
-		string :Gc = "\\200" ;
-		:Gb = 128UB, 127UB ;
-		:Gs = -32768s, 32767s, 32767s ;
-		:Gi = -2147483648, 2147483647, -2147483648, 2147483647 ;
-		:Gf = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f, 531.f ;
-		:Gd = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660., 650. ;
-data:
-
- c = "" ;
-
- b = 254 ;
-
- s = -5 ;
-
- i = -20 ;
-
- f = -9 ;
-
- d = -10 ;
-
- cr = "�" ;
-
- c1 = "�" ;
-
- c2 = "�" ;
-
- c3 = "�A" ;
-
- c4 = "�AZ" ;
-
- br = 128, 127 ;
-
- sr = -32768, 32767 ;
-
- ir = -2147483648, 2147483647 ;
-
- fr = -3.402823e+38, 3.402823e+38 ;
-
- dr = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- b1 = 128 ;
-
- s1 = -32768 ;
-
- i1 = -2147483648 ;
-
- f1 = -3.402823e+38 ;
-
- d1 = -1.79769313486232e+308 ;
-
- b2 = 128, 127 ;
-
- s2 = -32768, 32767 ;
-
- i2 = -2147483648, 2147483647 ;
-
- f2 = -3.402823e+38, 3.402823e+38 ;
-
- d2 = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- b3 = 128, 127, 127 ;
-
- s3 = -32768, 32767, 32767 ;
-
- i3 = -2147483648, 2147483647, -2147483648 ;
-
- f3 = -3.402823e+38, 3.402823e+38, -3.402823e+38 ;
-
- d3 = -1.79769313486232e+308, 1.79769313486232e+308, -1 ;
-
- b4 = 128, 127, 127, 128 ;
-
- s4 = -32768, 32767, 32767, -32768 ;
-
- i4 = -2147483648, 2147483647, -2147483648, 2147483647 ;
-
- f4 = -3.402823e+38, 3.402823e+38, -3.402823e+38, 3.402823e+38 ;
-
- d4 = -1.79769313486232e+308, 1.79769313486232e+308, -1, 1 ;
-
- cr1 = "", "
" ;
-
- br2 =
-  232, 230,
-  236, 234 ;
-
- sr3 =
-  -375, -380, -385,
-  -350, -355, -360 ;
-
- ir4 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660 ;
-
- f11 =
-  -2187 ;
-
- d12 =
-  -3000, -3010 ;
-
- c13 = "
" ;
-
- b14 =
-  232, 230, 228, 226 ;
-
- s21 =
-  -375,
-  -350 ;
-
- i22 =
-  -24000, -24020,
-  -23600, -23620 ;
-
- f23 =
-  -2187, -2196, -2205,
-  -2106, -2115, -2124 ;
-
- d24 =
-  -3000, -3010, -3020, -3030,
-  -2900, -2910, -2920, -2930 ;
-
- c31 = "", "
", " " ;
-
- b32 =
-  232, 230,
-  236, 234,
-  240, 238 ;
-
- s33 =
-  -375, -380, -385,
-  -350, -355, -360,
-  -325, -330, -335 ;
-
- i34 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660,
-  -23200, -23220, -23240, -23260 ;
-
- f41 =
-  -2187,
-  -2106,
-  -2025,
-  -1944 ;
-
- d42 =
-  -3000, -3010,
-  -2900, -2910,
-  -2800, -2810,
-  -2700, -2710 ;
-
- c43 = "
", "

 ", " "$", "$&(" ;
-
- b44 =
-  232, 230, 228, 226,
-  236, 234, 232, 230,
-  240, 238, 236, 234,
-  244, 242, 240, 238 ;
-
- sr11 =
-  2500,
-  2375 ;
-
- ir12 =
-  640000, 639980,
-  632000, 631980 ;
-
- fr13 =
-  26244, 26235, 26226,
-  25515, 25506, 25497 ;
-
- dr14 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970 ;
-
- cr21 =
-  "@", "D",
-  "H", "L" ;
-
- br22 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58 ;
-
- sr23 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390 ;
-
- ir24 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340 ;
-
- fr31 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677 ;
-
- dr32 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190 ;
-
- cr33 =
-  "@BD", "DFH", "HJL",
-  "HJL", "LNP", "PRT" ;
-
- br34 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58 ;
-
- sr41 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450 ;
-
- ir42 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180 ;
-
- fr43 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740 ;
-
- dr44 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270 ;
-
- c111 =
-  "@" ;
-
- b112 =
-  64, 62 ;
-
- s113 =
-  2500, 2495, 2490 ;
-
- i114 =
-  640000, 639980, 639960, 639940 ;
-
- f121 =
-  26244,
-  26325 ;
-
- d122 =
-  40000, 39990,
-  40100, 40090 ;
-
- c123 =
-  "@BD", "DFH" ;
-
- b124 =
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s131 =
-  2500,
-  2525,
-  2550 ;
-
- i132 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780 ;
-
- f133 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388 ;
-
- d134 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170 ;
-
- c141 =
-  "@", "D", "H", "L" ;
-
- b142 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74 ;
-
- s143 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565 ;
-
- i144 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140 ;
-
- f211 =
-  26244,
-  25515 ;
-
- d212 =
-  40000, 39990,
-  39000, 38990 ;
-
- c213 =
-  "@BD",
-  "HJL" ;
-
- b214 =
-  64, 62, 60, 58,
-  56, 54, 52, 50 ;
-
- s221 =
-  2500,
-  2525,
-  2375,
-  2400 ;
-
- i222 =
-  640000, 639980,
-  640400, 640380,
-  632000, 631980,
-  632400, 632380 ;
-
- f223 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  25515, 25506, 25497,
-  25596, 25587, 25578 ;
-
- d224 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070 ;
-
- c231 =
-  "@", "D", "H",
-  "H", "L", "P" ;
-
- b232 =
-  64, 62,
-  68, 66,
-  72, 70,
-  56, 54,
-  60, 58,
-  64, 62 ;
-
- s233 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415 ;
-
- i234 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740 ;
-
- f241 =
-  26244,
-  26325,
-  26406,
-  26487,
-  25515,
-  25596,
-  25677,
-  25758 ;
-
- d242 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  40300, 40290,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  39300, 39290 ;
-
- c243 =
-  "@BD", "DFH", "HJL", "LNP",
-  "HJL", "LNP", "PRT", "TVX" ;
-
- b244 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  76, 74, 72, 70,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s311 =
-  2500,
-  2375,
-  2250 ;
-
- i312 =
-  640000, 639980,
-  632000, 631980,
-  624000, 623980 ;
-
- f313 =
-  26244, 26235, 26226,
-  25515, 25506, 25497,
-  24786, 24777, 24768 ;
-
- d314 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970,
-  38000, 37990, 37980, 37970 ;
-
- c321 =
-  "@", "D",
-  "H", "L",
-  "P", "T" ;
-
- b322 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58,
-  48, 46,
-  52, 50 ;
-
- s323 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2250, 2245, 2240,
-  2275, 2270, 2265 ;
-
- i324 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340 ;
-
- f331 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677,
-  24786,
-  24867,
-  24948 ;
-
- d332 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  38000, 37990,
-  38100, 38090,
-  38200, 38190 ;
-
- c333 =
-  "@BD", "DFH", "HJL",
-  "HJL", "LNP", "PRT",
-  "PRT", "TVX", "XZ\" ;
-
- b334 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  56, 54, 52, 50 ;
-
- s341 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450,
-  2250,
-  2275,
-  2300,
-  2325 ;
-
- i342 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  625200, 625180 ;
-
- f343 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  25029, 25020, 25011 ;
-
- d344 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  38300, 38290, 38280, 38270 ;
-
- c411 =
-  "@",
-  "H",
-  "P",
-  "X" ;
-
- b412 =
-  64, 62,
-  56, 54,
-  48, 46,
-  40, 38 ;
-
- s413 =
-  2500, 2495, 2490,
-  2375, 2370, 2365,
-  2250, 2245, 2240,
-  2125, 2120, 2115 ;
-
- i414 =
-  640000, 639980, 639960, 639940,
-  632000, 631980, 631960, 631940,
-  624000, 623980, 623960, 623940,
-  616000, 615980, 615960, 615940 ;
-
- f421 =
-  26244,
-  26325,
-  25515,
-  25596,
-  24786,
-  24867,
-  24057,
-  24138 ;
-
- d422 =
-  40000, 39990,
-  40100, 40090,
-  39000, 38990,
-  39100, 39090,
-  38000, 37990,
-  38100, 38090,
-  37000, 36990,
-  37100, 37090 ;
-
- c423 =
-  "@BD", "DFH",
-  "HJL", "LNP",
-  "PRT", "TVX",
-  "XZ\", "\^`" ;
-
- b424 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  40, 38, 36, 34,
-  44, 42, 40, 38 ;
-
- s431 =
-  2500,
-  2525,
-  2550,
-  2375,
-  2400,
-  2425,
-  2250,
-  2275,
-  2300,
-  2125,
-  2150,
-  2175 ;
-
- i432 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  616000, 615980,
-  616400, 616380,
-  616800, 616780 ;
-
- f433 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  24057, 24048, 24039,
-  24138, 24129, 24120,
-  24219, 24210, 24201 ;
-
- d434 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  37000, 36990, 36980, 36970,
-  37100, 37090, 37080, 37070,
-  37200, 37190, 37180, 37170 ;
-
- c441 =
-  "@", "D", "H", "L",
-  "H", "L", "P", "T",
-  "P", "T", "X", "\",
-  "X", "\", "`", "d" ;
-
- b442 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74,
-  56, 54,
-  60, 58,
-  64, 62,
-  68, 66,
-  48, 46,
-  52, 50,
-  56, 54,
-  60, 58,
-  40, 38,
-  44, 42,
-  48, 46,
-  52, 50 ;
-
- s443 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415,
-  2450, 2445, 2440,
-  2250, 2245, 2240,
-  2275, 2270, 2265,
-  2300, 2295, 2290,
-  2325, 2320, 2315,
-  2125, 2120, 2115,
-  2150, 2145, 2140,
-  2175, 2170, 2165,
-  2200, 2195, 2190 ;
-
- i444 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740,
-  633200, 633180, 633160, 633140,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340,
-  624800, 624780, 624760, 624740,
-  625200, 625180, 625160, 625140,
-  616000, 615980, 615960, 615940,
-  616400, 616380, 616360, 616340,
-  616800, 616780, 616760, 616740,
-  617200, 617180, 617160, 617140 ;
-}
diff --git a/ncdap_test/expectremote4/test.sds1.dmp b/ncdap_test/expectremote4/test.sds1.dmp
deleted file mode 100644
index 75424f4..0000000
--- a/ncdap_test/expectremote4/test.sds1.dmp
+++ /dev/null
@@ -1,47 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 5 ;
-	fakeDim1 = 3 ;
-	fakeDim2 = 5 ;
-	fakeDim3 = 3 ;
-	fakeDim4 = 5 ;
-	fakeDim5 = 3 ;
-	fakeDim6 = 7 ;
-	fakeDim7 = 7 ;
-	fakeDim8 = 5 ;
-	fakeDim9 = 3 ;
-variables:
-	int SDS_DFNT_INT32(fakeDim0) ;
-	uint SDS_DFNT_UINT32(fakeDim1) ;
-	int SDS_DFNT_INT16(fakeDim2) ;
-	uint SDS_DFNT_UINT16(fakeDim3) ;
-	int SDS_DFNT_INT8(fakeDim4) ;
-	ubyte SDS_DFNT_UINT8(fakeDim5) ;
-	double SDS_DFNT_FLOAT32(fakeDim6) ;
-	double SDS_DFNT_FLOAT64(fakeDim7) ;
-	ubyte SDS_DFNT_CHAR8(fakeDim8) ;
-	ubyte SDS_DFNT_UCHAR8(fakeDim9) ;
-data:
-
- SDS_DFNT_INT32 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT32 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT16 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT16 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT8 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT8 = 0, 1, 2 ;
-
- SDS_DFNT_FLOAT32 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_FLOAT64 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_CHAR8 = 0, 1, 2, 3, 4 ;
-
- SDS_DFNT_UCHAR8 = 0, 1, 2 ;
-}
diff --git a/ncdap_test/expectremote4/test.sds2.dmp b/ncdap_test/expectremote4/test.sds2.dmp
deleted file mode 100644
index 75424f4..0000000
--- a/ncdap_test/expectremote4/test.sds2.dmp
+++ /dev/null
@@ -1,47 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 5 ;
-	fakeDim1 = 3 ;
-	fakeDim2 = 5 ;
-	fakeDim3 = 3 ;
-	fakeDim4 = 5 ;
-	fakeDim5 = 3 ;
-	fakeDim6 = 7 ;
-	fakeDim7 = 7 ;
-	fakeDim8 = 5 ;
-	fakeDim9 = 3 ;
-variables:
-	int SDS_DFNT_INT32(fakeDim0) ;
-	uint SDS_DFNT_UINT32(fakeDim1) ;
-	int SDS_DFNT_INT16(fakeDim2) ;
-	uint SDS_DFNT_UINT16(fakeDim3) ;
-	int SDS_DFNT_INT8(fakeDim4) ;
-	ubyte SDS_DFNT_UINT8(fakeDim5) ;
-	double SDS_DFNT_FLOAT32(fakeDim6) ;
-	double SDS_DFNT_FLOAT64(fakeDim7) ;
-	ubyte SDS_DFNT_CHAR8(fakeDim8) ;
-	ubyte SDS_DFNT_UCHAR8(fakeDim9) ;
-data:
-
- SDS_DFNT_INT32 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT32 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT16 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT16 = 0, 4096, 8192 ;
-
- SDS_DFNT_INT8 = 0, 2048, 4096, 6144, 8192 ;
-
- SDS_DFNT_UINT8 = 0, 1, 2 ;
-
- SDS_DFNT_FLOAT32 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_FLOAT64 = 1, 0.999950000416665, 0.999800006666578, 
-    0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 ;
-
- SDS_DFNT_CHAR8 = 0, 1, 2, 3, 4 ;
-
- SDS_DFNT_UCHAR8 = 0, 1, 2 ;
-}
diff --git a/ncdap_test/expectremote4/test.sds3.dmp b/ncdap_test/expectremote4/test.sds3.dmp
deleted file mode 100644
index 75e294d..0000000
--- a/ncdap_test/expectremote4/test.sds3.dmp
+++ /dev/null
@@ -1,223 +0,0 @@
-netcdf test {
-dimensions:
-	fakeDim0 = 8 ;
-	fakeDim1 = 4 ;
-	fakeDim10 = 2 ;
-	fakeDim11 = 2 ;
-	fakeDim12 = 2 ;
-	fakeDim13 = 2 ;
-	fakeDim14 = 2 ;
-	fakeDim15 = 1 ;
-	fakeDim16 = 2 ;
-	fakeDim17 = 1 ;
-	fakeDim18 = 2 ;
-	fakeDim19 = 1 ;
-	fakeDim2 = 4 ;
-	fakeDim20 = 2 ;
-	fakeDim21 = 1 ;
-	fakeDim22 = 2 ;
-	fakeDim23 = 1 ;
-	fakeDim24 = 2 ;
-	fakeDim25 = 1 ;
-	fakeDim26 = 2 ;
-	fakeDim27 = 1 ;
-	fakeDim28 = 2 ;
-	fakeDim29 = 1 ;
-	fakeDim3 = 4 ;
-	fakeDim30 = 2 ;
-	fakeDim31 = 1 ;
-	fakeDim32 = 2 ;
-	fakeDim33 = 1 ;
-	fakeDim34 = 2 ;
-	fakeDim35 = 2 ;
-	fakeDim36 = 1 ;
-	fakeDim37 = 1 ;
-	fakeDim38 = 1 ;
-	fakeDim39 = 2 ;
-	fakeDim4 = 2 ;
-	fakeDim40 = 1 ;
-	fakeDim41 = 1 ;
-	fakeDim42 = 1 ;
-	fakeDim43 = 2 ;
-	fakeDim44 = 1 ;
-	fakeDim45 = 1 ;
-	fakeDim46 = 1 ;
-	fakeDim47 = 2 ;
-	fakeDim48 = 1 ;
-	fakeDim49 = 1 ;
-	fakeDim5 = 2 ;
-	fakeDim50 = 1 ;
-	fakeDim51 = 2 ;
-	fakeDim52 = 1 ;
-	fakeDim53 = 1 ;
-	fakeDim54 = 1 ;
-	fakeDim55 = 2 ;
-	fakeDim56 = 1 ;
-	fakeDim57 = 1 ;
-	fakeDim58 = 1 ;
-	fakeDim59 = 2 ;
-	fakeDim6 = 2 ;
-	fakeDim60 = 1 ;
-	fakeDim61 = 1 ;
-	fakeDim62 = 1 ;
-	fakeDim63 = 2 ;
-	fakeDim64 = 1 ;
-	fakeDim65 = 1 ;
-	fakeDim66 = 1 ;
-	fakeDim67 = 2 ;
-	fakeDim68 = 1 ;
-	fakeDim69 = 1 ;
-	fakeDim7 = 2 ;
-	fakeDim70 = 1 ;
-	fakeDim8 = 2 ;
-	fakeDim9 = 2 ;
-variables:
-	int SDS_2(fakeDim0, fakeDim1) ;
-	int SDS_3(fakeDim2, fakeDim3, fakeDim4) ;
-	int SDS_4(fakeDim5, fakeDim6, fakeDim7, fakeDim8) ;
-	int SDS_5(fakeDim9, fakeDim10, fakeDim11, fakeDim12, fakeDim13) ;
-	int SDS_6(fakeDim14, fakeDim15, fakeDim16, fakeDim17, fakeDim18, fakeDim19) ;
-	int SDS_7(fakeDim20, fakeDim21, fakeDim22, fakeDim23, fakeDim24, fakeDim25, fakeDim26) ;
-	int SDS_8(fakeDim27, fakeDim28, fakeDim29, fakeDim30, fakeDim31, fakeDim32, fakeDim33, fakeDim34) ;
-	int SDS_16(fakeDim35, fakeDim36, fakeDim37, fakeDim38, fakeDim39, fakeDim40, fakeDim41, fakeDim42, fakeDim43, fakeDim44, fakeDim45, fakeDim46, fakeDim47, fakeDim48, fakeDim49, fakeDim50) ;
-	int SDS_20(fakeDim51, fakeDim52, fakeDim53, fakeDim54, fakeDim55, fakeDim56, fakeDim57, fakeDim58, fakeDim59, fakeDim60, fakeDim61, fakeDim62, fakeDim63, fakeDim64, fakeDim65, fakeDim66, fakeDim67, fakeDim68, fakeDim69, fakeDim70) ;
-data:
-
- SDS_2 =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104,
-  49152, 51200, 53248, 55296,
-  57344, 59392, 61440, 63488 ;
-
- SDS_3 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720,
-  32768, 34816,
-  36864, 38912,
-  40960, 43008,
-  45056, 47104,
-  49152, 51200,
-  53248, 55296,
-  57344, 59392,
-  61440, 63488 ;
-
- SDS_4 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720 ;
-
- SDS_5 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720,
-  32768, 34816,
-  36864, 38912,
-  40960, 43008,
-  45056, 47104,
-  49152, 51200,
-  53248, 55296,
-  57344, 59392,
-  61440, 63488 ;
-
- SDS_6 =
-  0,
-  2048,
-  4096,
-  6144,
-  8192,
-  10240,
-  12288,
-  14336 ;
-
- SDS_7 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720 ;
-
- SDS_8 =
-  0, 2048,
-  4096, 6144,
-  8192, 10240,
-  12288, 14336,
-  16384, 18432,
-  20480, 22528,
-  24576, 26624,
-  28672, 30720 ;
-
- SDS_16 =
-  0,
-  2048,
-  4096,
-  6144,
-  8192,
-  10240,
-  12288,
-  14336,
-  16384,
-  18432,
-  20480,
-  22528,
-  24576,
-  26624,
-  28672,
-  30720 ;
-
- SDS_20 =
-  0,
-  2048,
-  4096,
-  6144,
-  8192,
-  10240,
-  12288,
-  14336,
-  16384,
-  18432,
-  20480,
-  22528,
-  24576,
-  26624,
-  28672,
-  30720,
-  32768,
-  34816,
-  36864,
-  38912,
-  40960,
-  43008,
-  45056,
-  47104,
-  49152,
-  51200,
-  53248,
-  55296,
-  57344,
-  59392,
-  61440,
-  63488 ;
-}
diff --git a/ncdap_test/expectremote4/test.sds4.dmp b/ncdap_test/expectremote4/test.sds4.dmp
deleted file mode 100644
index 04b1523..0000000
--- a/ncdap_test/expectremote4/test.sds4.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound SDS_1_t {
-    int SDS_1(16, 5) ;
-    double Y_Axis(16) ;
-    int X_Axis(5) ;
-  }; // SDS_1_t
-variables:
-	SDS_1_t SDS_1 ;
-data:
-
- SDS_1 = 
-    {{0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 61440, 63488, 65536, 67584, 69632, 71680, 73728, 75776, 77824, 79872, 81920, 83968, 86016, 88064, 90112, 92160, 94208, 96256, 98304, 100352, 102400, 104448, 106496, 108544, 110592, 112640, 114688, 116736, 118784, 120832, 122880, 124928, 126976, 129024, 131072, 133120, 135168, 137216, [...]
-}
diff --git a/ncdap_test/expectremote4/test.sds5.dmp b/ncdap_test/expectremote4/test.sds5.dmp
deleted file mode 100644
index 9091f7e..0000000
--- a/ncdap_test/expectremote4/test.sds5.dmp
+++ /dev/null
@@ -1,77 +0,0 @@
-netcdf test {
-types:
-  compound SDS_DFNT_INT32_t {
-    int SDS_DFNT_INT32(5) ;
-    int Axis_DFNT_INT32(5) ;
-  }; // SDS_DFNT_INT32_t
-  compound SDS_DFNT_UINT32_t {
-    uint SDS_DFNT_UINT32(3) ;
-    int Axis_DFNT_UINT32(3) ;
-  }; // SDS_DFNT_UINT32_t
-  compound SDS_DFNT_INT16_t {
-    int SDS_DFNT_INT16(5) ;
-    int Axis_DFNT_INT16(5) ;
-  }; // SDS_DFNT_INT16_t
-  compound SDS_DFNT_UINT16_t {
-    uint SDS_DFNT_UINT16(3) ;
-    int Axis_DFNT_UINT16(3) ;
-  }; // SDS_DFNT_UINT16_t
-  compound SDS_DFNT_INT8_t {
-    int SDS_DFNT_INT8(5) ;
-    int Axis_DFNT_INT8(5) ;
-  }; // SDS_DFNT_INT8_t
-  compound SDS_DFNT_UINT8_t {
-    ubyte SDS_DFNT_UINT8(3) ;
-    int Axis_DFNT_UINT8(3) ;
-  }; // SDS_DFNT_UINT8_t
-  compound SDS_DFNT_FLOAT32_t {
-    double SDS_DFNT_FLOAT32(7) ;
-    double Axis_DFNT_FLOAT32(7) ;
-  }; // SDS_DFNT_FLOAT32_t
-  compound SDS_DFNT_FLOAT64_t {
-    double SDS_DFNT_FLOAT64(7) ;
-    double Axis_DFNT_FLOAT64(7) ;
-  }; // SDS_DFNT_FLOAT64_t
-  compound SDS_DFNT_CHAR8_t {
-    ubyte SDS_DFNT_CHAR8(5) ;
-    ubyte Axis_DFNT_CHAR8(5) ;
-  }; // SDS_DFNT_CHAR8_t
-  compound SDS_DFNT_UCHAR8_t {
-    ubyte SDS_DFNT_UCHAR8(3) ;
-    ubyte Axis_DFNT_UCHAR8(3) ;
-  }; // SDS_DFNT_UCHAR8_t
-variables:
-	SDS_DFNT_INT32_t SDS_DFNT_INT32 ;
-	SDS_DFNT_UINT32_t SDS_DFNT_UINT32 ;
-	SDS_DFNT_INT16_t SDS_DFNT_INT16 ;
-	SDS_DFNT_UINT16_t SDS_DFNT_UINT16 ;
-	SDS_DFNT_INT8_t SDS_DFNT_INT8 ;
-	SDS_DFNT_UINT8_t SDS_DFNT_UINT8 ;
-	SDS_DFNT_FLOAT32_t SDS_DFNT_FLOAT32 ;
-	SDS_DFNT_FLOAT64_t SDS_DFNT_FLOAT64 ;
-	SDS_DFNT_CHAR8_t SDS_DFNT_CHAR8 ;
-	SDS_DFNT_UCHAR8_t SDS_DFNT_UCHAR8 ;
-data:
-
- SDS_DFNT_INT32 = {{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}} ;
-
- SDS_DFNT_UINT32 = {{0, 4096, 8192}, {0, 2048, 4096}} ;
-
- SDS_DFNT_INT16 = {{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}} ;
-
- SDS_DFNT_UINT16 = {{0, 4096, 8192}, {0, 2048, 4096}} ;
-
- SDS_DFNT_INT8 = {{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}} ;
-
- SDS_DFNT_UINT8 = {{0, 1, 2}, {0, 2048, 4096}} ;
-
- SDS_DFNT_FLOAT32 = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}} ;
-
- SDS_DFNT_FLOAT64 = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204}} ;
-
- SDS_DFNT_CHAR8 = {{0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}} ;
-
- SDS_DFNT_UCHAR8 = {{0, 1, 2}, {0, 1, 2}} ;
-}
diff --git a/ncdap_test/expectremote4/test.vs1.dmp b/ncdap_test/expectremote4/test.vs1.dmp
deleted file mode 100644
index 0bf2b9e..0000000
--- a/ncdap_test/expectremote4/test.vs1.dmp
+++ /dev/null
@@ -1,109 +0,0 @@
-netcdf test {
-types:
-  compound Field_DFNT_INT32_t {
-    int Field_DFNT_INT32__0 ;
-  }; // Field_DFNT_INT32_t
-  compound Vdata_DFNT_INT32_record_t {
-    Field_DFNT_INT32_t Field_DFNT_INT32 ;
-  }; // Vdata_DFNT_INT32_record_t
-  Vdata_DFNT_INT32_record_t(*) Vdata_DFNT_INT32_t ;
-  compound Field_DFNT_UINT32_t {
-    uint Field_DFNT_UINT32__0 ;
-  }; // Field_DFNT_UINT32_t
-  compound Vdata_DFNT_UINT32_record_t {
-    Field_DFNT_UINT32_t Field_DFNT_UINT32 ;
-  }; // Vdata_DFNT_UINT32_record_t
-  Vdata_DFNT_UINT32_record_t(*) Vdata_DFNT_UINT32_t ;
-  compound Field_DFNT_INT16_t {
-    int Field_DFNT_INT16__0 ;
-  }; // Field_DFNT_INT16_t
-  compound Vdata_DFNT_INT16_record_t {
-    Field_DFNT_INT16_t Field_DFNT_INT16 ;
-  }; // Vdata_DFNT_INT16_record_t
-  Vdata_DFNT_INT16_record_t(*) Vdata_DFNT_INT16_t ;
-  compound Field_DFNT_UINT16_t {
-    uint Field_DFNT_UINT16__0 ;
-  }; // Field_DFNT_UINT16_t
-  compound Vdata_DFNT_UINT16_record_t {
-    Field_DFNT_UINT16_t Field_DFNT_UINT16 ;
-  }; // Vdata_DFNT_UINT16_record_t
-  Vdata_DFNT_UINT16_record_t(*) Vdata_DFNT_UINT16_t ;
-  compound Field_DFNT_INT8_t {
-    int Field_DFNT_INT8__0 ;
-  }; // Field_DFNT_INT8_t
-  compound Vdata_DFNT_INT8_record_t {
-    Field_DFNT_INT8_t Field_DFNT_INT8 ;
-  }; // Vdata_DFNT_INT8_record_t
-  Vdata_DFNT_INT8_record_t(*) Vdata_DFNT_INT8_t ;
-  compound Field_DFNT_UINT8_t {
-    ubyte Field_DFNT_UINT8__0 ;
-  }; // Field_DFNT_UINT8_t
-  compound Vdata_DFNT_UINT8_record_t {
-    Field_DFNT_UINT8_t Field_DFNT_UINT8 ;
-  }; // Vdata_DFNT_UINT8_record_t
-  Vdata_DFNT_UINT8_record_t(*) Vdata_DFNT_UINT8_t ;
-  compound Field_DFNT_FLOAT32_t {
-    double Field_DFNT_FLOAT32__0 ;
-  }; // Field_DFNT_FLOAT32_t
-  compound Vdata_DFNT_FLOAT32_record_t {
-    Field_DFNT_FLOAT32_t Field_DFNT_FLOAT32 ;
-  }; // Vdata_DFNT_FLOAT32_record_t
-  Vdata_DFNT_FLOAT32_record_t(*) Vdata_DFNT_FLOAT32_t ;
-  compound Field_DFNT_FLOAT64_t {
-    double Field_DFNT_FLOAT64__0 ;
-  }; // Field_DFNT_FLOAT64_t
-  compound Vdata_DFNT_FLOAT64_record_t {
-    Field_DFNT_FLOAT64_t Field_DFNT_FLOAT64 ;
-  }; // Vdata_DFNT_FLOAT64_record_t
-  Vdata_DFNT_FLOAT64_record_t(*) Vdata_DFNT_FLOAT64_t ;
-  compound Field_DFNT_CHAR8_t {
-    string Field_DFNT_CHAR8__0 ;
-  }; // Field_DFNT_CHAR8_t
-  compound Vdata_DFNT_CHAR8_record_t {
-    Field_DFNT_CHAR8_t Field_DFNT_CHAR8 ;
-  }; // Vdata_DFNT_CHAR8_record_t
-  Vdata_DFNT_CHAR8_record_t(*) Vdata_DFNT_CHAR8_t ;
-  compound Field_DFNT_UCHAR8_t {
-    string Field_DFNT_UCHAR8__0 ;
-  }; // Field_DFNT_UCHAR8_t
-  compound Vdata_DFNT_UCHAR8_record_t {
-    Field_DFNT_UCHAR8_t Field_DFNT_UCHAR8 ;
-  }; // Vdata_DFNT_UCHAR8_record_t
-  Vdata_DFNT_UCHAR8_record_t(*) Vdata_DFNT_UCHAR8_t ;
-variables:
-	Vdata_DFNT_INT32_t Vdata_DFNT_INT32 ;
-	Vdata_DFNT_UINT32_t Vdata_DFNT_UINT32 ;
-	Vdata_DFNT_INT16_t Vdata_DFNT_INT16 ;
-	Vdata_DFNT_UINT16_t Vdata_DFNT_UINT16 ;
-	Vdata_DFNT_INT8_t Vdata_DFNT_INT8 ;
-	Vdata_DFNT_UINT8_t Vdata_DFNT_UINT8 ;
-	Vdata_DFNT_FLOAT32_t Vdata_DFNT_FLOAT32 ;
-	Vdata_DFNT_FLOAT64_t Vdata_DFNT_FLOAT64 ;
-	Vdata_DFNT_CHAR8_t Vdata_DFNT_CHAR8 ;
-	Vdata_DFNT_UCHAR8_t Vdata_DFNT_UCHAR8 ;
-data:
-
- Vdata_DFNT_INT32 = {{{1}}, {{2}}, {{3}}, {{5}}, {{8}}} ;
-
- Vdata_DFNT_UINT32 = {{{0}}, {{2}}, {{6}}, {{12}}, {{20}}} ;
-
- Vdata_DFNT_INT16 = {{{13}}, {{21}}, {{34}}, {{55}}, {{89}}} ;
-
- Vdata_DFNT_UINT16 = {{{30}}, {{42}}, {{56}}, {{72}}, {{90}}} ;
-
- Vdata_DFNT_INT8 = {{{144}}, {{233}}, {{377}}, {{610}}, {{987}}} ;
-
- Vdata_DFNT_UINT8 = {{{0}}, {{1}}, {{2}}, {{3}}, {{4}}} ;
-
- Vdata_DFNT_FLOAT32 = 
-    {{{1000}}, {{999.950000416665}}, {{999.800006666578}}, {{999.550033748988}}, {{999.200106660978}}} ;
-
- Vdata_DFNT_FLOAT64 = 
-    {{{998.750260394966}}, {{998.200539935204}}, {{997.55100025328}}, {{996.801706302619}}, {{995.952733011994}}} ;
-
- Vdata_DFNT_CHAR8 = 
-    {{{"This is a data test string (pass 0)."}}, {{"This is a data test string (pass 1)."}}, {{"This is a data test string (pass 2)."}}, {{"This is a data test string (pass 3)."}}, {{"This is a data test string (pass 4)."}}} ;
-
- Vdata_DFNT_UCHAR8 = 
-    {{{"This is a data test string (pass 5)."}}, {{"This is a data test string (pass 6)."}}, {{"This is a data test string (pass 7)."}}, {{"This is a data test string (pass 8)."}}, {{"This is a data test string (pass 9)."}}} ;
-}
diff --git a/ncdap_test/expectremote4/test.vs2.dmp b/ncdap_test/expectremote4/test.vs2.dmp
deleted file mode 100644
index 2be6870..0000000
--- a/ncdap_test/expectremote4/test.vs2.dmp
+++ /dev/null
@@ -1,145 +0,0 @@
-netcdf test {
-types:
-  compound Field_DFNT_INT32_t {
-    int Field_DFNT_INT32__0 ;
-    int Field_DFNT_INT32__1 ;
-    int Field_DFNT_INT32__2 ;
-    int Field_DFNT_INT32__3 ;
-    int Field_DFNT_INT32__4 ;
-  }; // Field_DFNT_INT32_t
-  compound Vdata_DFNT_INT32_record_t {
-    Field_DFNT_INT32_t Field_DFNT_INT32 ;
-  }; // Vdata_DFNT_INT32_record_t
-  Vdata_DFNT_INT32_record_t(*) Vdata_DFNT_INT32_t ;
-  compound Field_DFNT_UINT32_t {
-    uint Field_DFNT_UINT32__0 ;
-    uint Field_DFNT_UINT32__1 ;
-    uint Field_DFNT_UINT32__2 ;
-  }; // Field_DFNT_UINT32_t
-  compound Vdata_DFNT_UINT32_record_t {
-    Field_DFNT_UINT32_t Field_DFNT_UINT32 ;
-  }; // Vdata_DFNT_UINT32_record_t
-  Vdata_DFNT_UINT32_record_t(*) Vdata_DFNT_UINT32_t ;
-  compound Field_DFNT_INT16_t {
-    int Field_DFNT_INT16__0 ;
-    int Field_DFNT_INT16__1 ;
-    int Field_DFNT_INT16__2 ;
-    int Field_DFNT_INT16__3 ;
-    int Field_DFNT_INT16__4 ;
-  }; // Field_DFNT_INT16_t
-  compound Vdata_DFNT_INT16_record_t {
-    Field_DFNT_INT16_t Field_DFNT_INT16 ;
-  }; // Vdata_DFNT_INT16_record_t
-  Vdata_DFNT_INT16_record_t(*) Vdata_DFNT_INT16_t ;
-  compound Field_DFNT_UINT16_t {
-    uint Field_DFNT_UINT16__0 ;
-    uint Field_DFNT_UINT16__1 ;
-    uint Field_DFNT_UINT16__2 ;
-  }; // Field_DFNT_UINT16_t
-  compound Vdata_DFNT_UINT16_record_t {
-    Field_DFNT_UINT16_t Field_DFNT_UINT16 ;
-  }; // Vdata_DFNT_UINT16_record_t
-  Vdata_DFNT_UINT16_record_t(*) Vdata_DFNT_UINT16_t ;
-  compound Field_DFNT_INT8_t {
-    int Field_DFNT_INT8__0 ;
-    int Field_DFNT_INT8__1 ;
-    int Field_DFNT_INT8__2 ;
-    int Field_DFNT_INT8__3 ;
-    int Field_DFNT_INT8__4 ;
-  }; // Field_DFNT_INT8_t
-  compound Vdata_DFNT_INT8_record_t {
-    Field_DFNT_INT8_t Field_DFNT_INT8 ;
-  }; // Vdata_DFNT_INT8_record_t
-  Vdata_DFNT_INT8_record_t(*) Vdata_DFNT_INT8_t ;
-  compound Field_DFNT_UINT8_t {
-    ubyte Field_DFNT_UINT8__0 ;
-    ubyte Field_DFNT_UINT8__1 ;
-    ubyte Field_DFNT_UINT8__2 ;
-  }; // Field_DFNT_UINT8_t
-  compound Vdata_DFNT_UINT8_record_t {
-    Field_DFNT_UINT8_t Field_DFNT_UINT8 ;
-  }; // Vdata_DFNT_UINT8_record_t
-  Vdata_DFNT_UINT8_record_t(*) Vdata_DFNT_UINT8_t ;
-  compound Field_DFNT_FLOAT32_t {
-    double Field_DFNT_FLOAT32__0 ;
-    double Field_DFNT_FLOAT32__1 ;
-    double Field_DFNT_FLOAT32__2 ;
-    double Field_DFNT_FLOAT32__3 ;
-    double Field_DFNT_FLOAT32__4 ;
-    double Field_DFNT_FLOAT32__5 ;
-    double Field_DFNT_FLOAT32__6 ;
-  }; // Field_DFNT_FLOAT32_t
-  compound Vdata_DFNT_FLOAT32_record_t {
-    Field_DFNT_FLOAT32_t Field_DFNT_FLOAT32 ;
-  }; // Vdata_DFNT_FLOAT32_record_t
-  Vdata_DFNT_FLOAT32_record_t(*) Vdata_DFNT_FLOAT32_t ;
-  compound Field_DFNT_FLOAT64_t {
-    double Field_DFNT_FLOAT64__0 ;
-    double Field_DFNT_FLOAT64__1 ;
-    double Field_DFNT_FLOAT64__2 ;
-    double Field_DFNT_FLOAT64__3 ;
-    double Field_DFNT_FLOAT64__4 ;
-    double Field_DFNT_FLOAT64__5 ;
-    double Field_DFNT_FLOAT64__6 ;
-  }; // Field_DFNT_FLOAT64_t
-  compound Vdata_DFNT_FLOAT64_record_t {
-    Field_DFNT_FLOAT64_t Field_DFNT_FLOAT64 ;
-  }; // Vdata_DFNT_FLOAT64_record_t
-  Vdata_DFNT_FLOAT64_record_t(*) Vdata_DFNT_FLOAT64_t ;
-  compound Field_DFNT_CHAR8_t {
-    string Field_DFNT_CHAR8__0 ;
-  }; // Field_DFNT_CHAR8_t
-  compound Vdata_DFNT_CHAR8_record_t {
-    Field_DFNT_CHAR8_t Field_DFNT_CHAR8 ;
-  }; // Vdata_DFNT_CHAR8_record_t
-  Vdata_DFNT_CHAR8_record_t(*) Vdata_DFNT_CHAR8_t ;
-  compound Field_DFNT_UCHAR8_t {
-    string Field_DFNT_UCHAR8__0 ;
-  }; // Field_DFNT_UCHAR8_t
-  compound Vdata_DFNT_UCHAR8_record_t {
-    Field_DFNT_UCHAR8_t Field_DFNT_UCHAR8 ;
-  }; // Vdata_DFNT_UCHAR8_record_t
-  Vdata_DFNT_UCHAR8_record_t(*) Vdata_DFNT_UCHAR8_t ;
-variables:
-	Vdata_DFNT_INT32_t Vdata_DFNT_INT32 ;
-	Vdata_DFNT_UINT32_t Vdata_DFNT_UINT32 ;
-	Vdata_DFNT_INT16_t Vdata_DFNT_INT16 ;
-	Vdata_DFNT_UINT16_t Vdata_DFNT_UINT16 ;
-	Vdata_DFNT_INT8_t Vdata_DFNT_INT8 ;
-	Vdata_DFNT_UINT8_t Vdata_DFNT_UINT8 ;
-	Vdata_DFNT_FLOAT32_t Vdata_DFNT_FLOAT32 ;
-	Vdata_DFNT_FLOAT64_t Vdata_DFNT_FLOAT64 ;
-	Vdata_DFNT_CHAR8_t Vdata_DFNT_CHAR8 ;
-	Vdata_DFNT_UCHAR8_t Vdata_DFNT_UCHAR8 ;
-data:
-
- Vdata_DFNT_INT32 = 
-    {{{1, 2, 3, 5, 8}}, {{13, 21, 34, 55, 89}}, {{144, 233, 377, 610, 987}}, {{1597, 2584, 4181, 6765, 10946}}, {{17711, 28657, 46368, 75025, 121393}}} ;
-
- Vdata_DFNT_UINT32 = 
-    {{{0, 2, 6}}, {{12, 20, 30}}, {{42, 56, 72}}, {{90, 110, 132}}, {{156, 182, 210}}} ;
-
- Vdata_DFNT_INT16 = 
-    {{{196418, 317811, 514229, 832040, 1346269}}, {{2178309, 3524578, 5702887, 9227465, 14930352}}, {{24157817, 39088169, 63245986, 102334155, 165580141}}, {{267914296, 433494437, 701408733, 1134903170, 1836311903}}, {{-1323752223, 512559680, -811192543, -298632863, -1109825406}}} ;
-
- Vdata_DFNT_UINT16 = 
-    {{{240, 272, 306}}, {{342, 380, 420}}, {{462, 506, 552}}, {{600, 650, 702}}, {{756, 812, 870}}} ;
-
- Vdata_DFNT_INT8 = 
-    {{{-1408458269, 1776683621, 368225352, 2144908973, -1781832971}}, {{363076002, -1418756969, -1055680967, 1820529360, 764848393}}, {{-1709589543, -944741150, 1640636603, 695895453, -1958435240}}, {{-1262539787, 1073992269, -188547518, 885444751, 696897233}}, {{1582341984, -2015728079, -433386095, 1845853122, 1412467027}}} ;
-
- Vdata_DFNT_UINT8 = 
-    {{{0, 1, 2}}, {{3, 4, 5}}, {{6, 7, 8}}, {{9, 10, 11}}, {{12, 13, 14}}} ;
-
- Vdata_DFNT_FLOAT32 = 
-    {{{1000, 999.950000416665, 999.800006666578, 999.550033748988, 999.200106660978, 998.750260394966, 998.200539935204}}, {{997.55100025328, 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697, 992.808635853866, 991.561893714788}}, {{990.215996212637, 988.771077936042, 987.227283375627, 985.584766909561, 983.843692788121, 982.00423511727, 980.066577841242}}, {{978.030914724148, 975.897449330605, 973.666395005375, 971.33797485203, 968.912421710645, 966.389978134513, 96 [...]
-
- Vdata_DFNT_FLOAT64 = 
-    {{{939.372712847379, 935.896823677935, 932.327345606034, 928.66463557651, 924.909059857313, 921.060994002885, 917.120822816605}}, {{913.088940312308, 908.965749674885, 904.751663219963, 900.447102352677, 896.052497525525, 891.568288195329, 886.994922779284}}, {{882.332858610121, 877.582561890373, 872.744507645751, 867.81917967765, 862.807070514761, 857.708681363824, 852.524522059506}}, {{847.255111013416, 841.900975162269, 836.462649915187, 830.940679100163, 825.335614909678, 819.648 [...]
-
- Vdata_DFNT_CHAR8 = 
-    {{{"This is a data test string (pass 0)."}}, {{"This is a data test string (pass 1)."}}, {{"This is a data test string (pass 2)."}}, {{"This is a data test string (pass 3)."}}, {{"This is a data test string (pass 4)."}}} ;
-
- Vdata_DFNT_UCHAR8 = 
-    {{{"This is a data test string (pass 5)."}}, {{"This is a data test string (pass 6)."}}, {{"This is a data test string (pass 7)."}}, {{"This is a data test string (pass 8)."}}, {{"This is a data test string (pass 9)."}}} ;
-}
diff --git a/ncdap_test/expectremote4/test.vs3.dmp b/ncdap_test/expectremote4/test.vs3.dmp
deleted file mode 100644
index 12bf119..0000000
--- a/ncdap_test/expectremote4/test.vs3.dmp
+++ /dev/null
@@ -1,52 +0,0 @@
-netcdf test {
-types:
-  compound dINT32_t {
-    int dINT32__0 ;
-  }; // dINT32_t
-  compound dUINT32_t {
-    uint dUINT32__0 ;
-  }; // dUINT32_t
-  compound dINT16_t {
-    int dINT16__0 ;
-  }; // dINT16_t
-  compound dUINT16_t {
-    uint dUINT16__0 ;
-  }; // dUINT16_t
-  compound dINT8_t {
-    int dINT8__0 ;
-  }; // dINT8_t
-  compound dUINT8_t {
-    ubyte dUINT8__0 ;
-  }; // dUINT8_t
-  compound dFLOAT32_t {
-    double dFLOAT32__0 ;
-  }; // dFLOAT32_t
-  compound dFLOAT64_t {
-    double dFLOAT64__0 ;
-  }; // dFLOAT64_t
-  compound dCHAR8_t {
-    string dCHAR8__0 ;
-  }; // dCHAR8_t
-  compound dUCHAR8_t {
-    string dUCHAR8__0 ;
-  }; // dUCHAR8_t
-  compound Vdata_record_t {
-    dINT32_t dINT32 ;
-    dUINT32_t dUINT32 ;
-    dINT16_t dINT16 ;
-    dUINT16_t dUINT16 ;
-    dINT8_t dINT8 ;
-    dUINT8_t dUINT8 ;
-    dFLOAT32_t dFLOAT32 ;
-    dFLOAT64_t dFLOAT64 ;
-    dCHAR8_t dCHAR8 ;
-    dUCHAR8_t dUCHAR8 ;
-  }; // Vdata_record_t
-  Vdata_record_t(*) Vdata_t ;
-variables:
-	Vdata_t Vdata ;
-data:
-
- Vdata = 
-    {{{1}, {0}, {2}, {2}, {3}, {0}, {1000}, {999.950000416665}, {"This is a data test string (pass 0)."}, {"This is a data test string (pass 1)."}}, {{5}, {6}, {8}, {12}, {13}, {1}, {999.800006666578}, {999.550033748988}, {"This is a data test string (pass 2)."}, {"This is a data test string (pass 3)."}}, {{21}, {20}, {34}, {30}, {55}, {2}, {999.200106660978}, {998.750260394966}, {"This is a data test string (pass 4)."}, {"This is a data test string (pass 5)."}}, {{89}, {42}, {144}, {56} [...]
-}
diff --git a/ncdap_test/expectremote4/test.vs4.dmp b/ncdap_test/expectremote4/test.vs4.dmp
deleted file mode 100644
index 0bf2b9e..0000000
--- a/ncdap_test/expectremote4/test.vs4.dmp
+++ /dev/null
@@ -1,109 +0,0 @@
-netcdf test {
-types:
-  compound Field_DFNT_INT32_t {
-    int Field_DFNT_INT32__0 ;
-  }; // Field_DFNT_INT32_t
-  compound Vdata_DFNT_INT32_record_t {
-    Field_DFNT_INT32_t Field_DFNT_INT32 ;
-  }; // Vdata_DFNT_INT32_record_t
-  Vdata_DFNT_INT32_record_t(*) Vdata_DFNT_INT32_t ;
-  compound Field_DFNT_UINT32_t {
-    uint Field_DFNT_UINT32__0 ;
-  }; // Field_DFNT_UINT32_t
-  compound Vdata_DFNT_UINT32_record_t {
-    Field_DFNT_UINT32_t Field_DFNT_UINT32 ;
-  }; // Vdata_DFNT_UINT32_record_t
-  Vdata_DFNT_UINT32_record_t(*) Vdata_DFNT_UINT32_t ;
-  compound Field_DFNT_INT16_t {
-    int Field_DFNT_INT16__0 ;
-  }; // Field_DFNT_INT16_t
-  compound Vdata_DFNT_INT16_record_t {
-    Field_DFNT_INT16_t Field_DFNT_INT16 ;
-  }; // Vdata_DFNT_INT16_record_t
-  Vdata_DFNT_INT16_record_t(*) Vdata_DFNT_INT16_t ;
-  compound Field_DFNT_UINT16_t {
-    uint Field_DFNT_UINT16__0 ;
-  }; // Field_DFNT_UINT16_t
-  compound Vdata_DFNT_UINT16_record_t {
-    Field_DFNT_UINT16_t Field_DFNT_UINT16 ;
-  }; // Vdata_DFNT_UINT16_record_t
-  Vdata_DFNT_UINT16_record_t(*) Vdata_DFNT_UINT16_t ;
-  compound Field_DFNT_INT8_t {
-    int Field_DFNT_INT8__0 ;
-  }; // Field_DFNT_INT8_t
-  compound Vdata_DFNT_INT8_record_t {
-    Field_DFNT_INT8_t Field_DFNT_INT8 ;
-  }; // Vdata_DFNT_INT8_record_t
-  Vdata_DFNT_INT8_record_t(*) Vdata_DFNT_INT8_t ;
-  compound Field_DFNT_UINT8_t {
-    ubyte Field_DFNT_UINT8__0 ;
-  }; // Field_DFNT_UINT8_t
-  compound Vdata_DFNT_UINT8_record_t {
-    Field_DFNT_UINT8_t Field_DFNT_UINT8 ;
-  }; // Vdata_DFNT_UINT8_record_t
-  Vdata_DFNT_UINT8_record_t(*) Vdata_DFNT_UINT8_t ;
-  compound Field_DFNT_FLOAT32_t {
-    double Field_DFNT_FLOAT32__0 ;
-  }; // Field_DFNT_FLOAT32_t
-  compound Vdata_DFNT_FLOAT32_record_t {
-    Field_DFNT_FLOAT32_t Field_DFNT_FLOAT32 ;
-  }; // Vdata_DFNT_FLOAT32_record_t
-  Vdata_DFNT_FLOAT32_record_t(*) Vdata_DFNT_FLOAT32_t ;
-  compound Field_DFNT_FLOAT64_t {
-    double Field_DFNT_FLOAT64__0 ;
-  }; // Field_DFNT_FLOAT64_t
-  compound Vdata_DFNT_FLOAT64_record_t {
-    Field_DFNT_FLOAT64_t Field_DFNT_FLOAT64 ;
-  }; // Vdata_DFNT_FLOAT64_record_t
-  Vdata_DFNT_FLOAT64_record_t(*) Vdata_DFNT_FLOAT64_t ;
-  compound Field_DFNT_CHAR8_t {
-    string Field_DFNT_CHAR8__0 ;
-  }; // Field_DFNT_CHAR8_t
-  compound Vdata_DFNT_CHAR8_record_t {
-    Field_DFNT_CHAR8_t Field_DFNT_CHAR8 ;
-  }; // Vdata_DFNT_CHAR8_record_t
-  Vdata_DFNT_CHAR8_record_t(*) Vdata_DFNT_CHAR8_t ;
-  compound Field_DFNT_UCHAR8_t {
-    string Field_DFNT_UCHAR8__0 ;
-  }; // Field_DFNT_UCHAR8_t
-  compound Vdata_DFNT_UCHAR8_record_t {
-    Field_DFNT_UCHAR8_t Field_DFNT_UCHAR8 ;
-  }; // Vdata_DFNT_UCHAR8_record_t
-  Vdata_DFNT_UCHAR8_record_t(*) Vdata_DFNT_UCHAR8_t ;
-variables:
-	Vdata_DFNT_INT32_t Vdata_DFNT_INT32 ;
-	Vdata_DFNT_UINT32_t Vdata_DFNT_UINT32 ;
-	Vdata_DFNT_INT16_t Vdata_DFNT_INT16 ;
-	Vdata_DFNT_UINT16_t Vdata_DFNT_UINT16 ;
-	Vdata_DFNT_INT8_t Vdata_DFNT_INT8 ;
-	Vdata_DFNT_UINT8_t Vdata_DFNT_UINT8 ;
-	Vdata_DFNT_FLOAT32_t Vdata_DFNT_FLOAT32 ;
-	Vdata_DFNT_FLOAT64_t Vdata_DFNT_FLOAT64 ;
-	Vdata_DFNT_CHAR8_t Vdata_DFNT_CHAR8 ;
-	Vdata_DFNT_UCHAR8_t Vdata_DFNT_UCHAR8 ;
-data:
-
- Vdata_DFNT_INT32 = {{{1}}, {{2}}, {{3}}, {{5}}, {{8}}} ;
-
- Vdata_DFNT_UINT32 = {{{0}}, {{2}}, {{6}}, {{12}}, {{20}}} ;
-
- Vdata_DFNT_INT16 = {{{13}}, {{21}}, {{34}}, {{55}}, {{89}}} ;
-
- Vdata_DFNT_UINT16 = {{{30}}, {{42}}, {{56}}, {{72}}, {{90}}} ;
-
- Vdata_DFNT_INT8 = {{{144}}, {{233}}, {{377}}, {{610}}, {{987}}} ;
-
- Vdata_DFNT_UINT8 = {{{0}}, {{1}}, {{2}}, {{3}}, {{4}}} ;
-
- Vdata_DFNT_FLOAT32 = 
-    {{{1000}}, {{999.950000416665}}, {{999.800006666578}}, {{999.550033748988}}, {{999.200106660978}}} ;
-
- Vdata_DFNT_FLOAT64 = 
-    {{{998.750260394966}}, {{998.200539935204}}, {{997.55100025328}}, {{996.801706302619}}, {{995.952733011994}}} ;
-
- Vdata_DFNT_CHAR8 = 
-    {{{"This is a data test string (pass 0)."}}, {{"This is a data test string (pass 1)."}}, {{"This is a data test string (pass 2)."}}, {{"This is a data test string (pass 3)."}}, {{"This is a data test string (pass 4)."}}} ;
-
- Vdata_DFNT_UCHAR8 = 
-    {{{"This is a data test string (pass 5)."}}, {{"This is a data test string (pass 6)."}}, {{"This is a data test string (pass 7)."}}, {{"This is a data test string (pass 8)."}}, {{"This is a data test string (pass 9)."}}} ;
-}
diff --git a/ncdap_test/expectremote4/test.vs5.dmp b/ncdap_test/expectremote4/test.vs5.dmp
deleted file mode 100644
index 6fb24c4..0000000
--- a/ncdap_test/expectremote4/test.vs5.dmp
+++ /dev/null
@@ -1,38 +0,0 @@
-netcdf test {
-types:
-  compound Array_Vgroup_t {
-    int SDS_Array(5) ;
-  }; // Array_Vgroup_t
-  compound SDS_Grid_t {
-    int SDS_Grid(5) ;
-    int fakeDim1(5) ;
-  }; // SDS_Grid_t
-  compound Grid_Vgroup_t {
-    SDS_Grid_t SDS_Grid ;
-  }; // Grid_Vgroup_t
-  compound GR_Vgroup_t {
-    int GRaster(5, 5) ;
-  }; // GR_Vgroup_t
-  compound Field_t {
-    int Field__0 ;
-  }; // Field_t
-  compound Vdata_record_t {
-    Field_t Field ;
-  }; // Vdata_record_t
-  Vdata_record_t(*) Vdata_t ;
-  compound Vdata_Vgroup_t {
-    Vdata_t Vdata ;
-  }; // Vdata_Vgroup_t
-  compound Main_Vgroup_t {
-    Array_Vgroup_t Array_Vgroup ;
-    Grid_Vgroup_t Grid_Vgroup ;
-    GR_Vgroup_t GR_Vgroup ;
-    Vdata_Vgroup_t Vdata_Vgroup ;
-  }; // Main_Vgroup_t
-variables:
-	Main_Vgroup_t Main_Vgroup ;
-data:
-
- Main_Vgroup = 
-    {{{0, 2048, 4096, 6144, 8192}}, {{{0, 2048, 4096, 6144, 8192}, {0, 2048, 4096, 6144, 8192}}}, {{0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 43008, 45056, 47104, 49152}}, {{{{1}}, {{2}}, {{3}}, {{5}}, {{8}}}}} ;
-}
diff --git a/ncdap_test/expectremote4/whoi.dmp b/ncdap_test/expectremote4/whoi.dmp
deleted file mode 100644
index baa3977..0000000
--- a/ncdap_test/expectremote4/whoi.dmp
+++ /dev/null
@@ -1,20 +0,0 @@
-netcdf whoi {
-types:
-  compound emolt_sensor_record_t {
-    string SITE ;
-    short SERIAL_NUM ;
-    short PROBE_SETTING ;
-    string TIME_LOCAL ;
-    double YRDAY0_LOCAL ;
-    double TEMP ;
-    double SALT ;
-    double DEPTH_I ;
-  }; // emolt_sensor_record_t
-  emolt_sensor_record_t(*) emolt_sensor_t ;
-variables:
-	emolt_sensor_t emolt_sensor ;
-data:
-
- emolt_sensor = 
-    {{"This is a data test string (pass 0).", 0, 16, "This is a data test string (pass 1).", 1000, 999.950000416665, 999.800006666578, 999.550033748988}, {"This is a data test string (pass 2).", 32, 48, "This is a data test string (pass 3).", 999.200106660978, 998.750260394966, 998.200539935204, 997.55100025328}, {"This is a data test string (pass 4).", 64, 80, "This is a data test string (pass 5).", 996.801706302619, 995.952733011994, 995.004165278026, 993.956097956697}, {"This is a dat [...]
-}
diff --git a/ncdap_test/findtestserver.c b/ncdap_test/findtestserver.c
new file mode 100644
index 0000000..69a324c
--- /dev/null
+++ b/ncdap_test/findtestserver.c
@@ -0,0 +1,78 @@
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "nctestserver.h"
+
+/* Support stringification of -D macros */
+#define XSTRINGIFY(s) #s
+#define STRINGIFY(s) XSTRINGIFY(s)
+
+/**
+usage: findtestserver dap2|dap4 suffix [serverlist]
+
+Given a partial suffix path, try to find a
+server for which a request to server + suffix
+returns some kind of result using the
+specified protocol.  This indicates that the
+server is up and running.  Return the complete
+url for the server plus the path.
+If serverlist is present, then is should be a comma
+separated list of servers (host+port) to try.
+It defaults to REMOTETESTSERVERS.
+*/
+
+static void
+usage()
+{
+    fprintf(stderr,"usage: findtestserver dap2|dap4 suffix [serverlist]\n");
+    exit(1);
+}
+
+
+int
+main(int argc, char** argv)
+{
+    const char* url = NULL;
+    const char* servlet = NULL;
+    const char* proto = NULL;
+    const char* serverlist = NULL;
+    int isdap4 = 0; /* 1 => dap4 */
+
+    argc--; argv++;
+    if(argc < 2)
+	usage();	
+    proto = strdup(argv[0]);
+    servlet = strdup(argv[1]);
+    if(argc >= 3)
+	serverlist = strdup(argv[2]);
+
+#ifdef ENABLE_DAP
+    if(strcasecmp(proto,"dap2")==0)
+	isdap4 = 0;
+    else
+#endif
+#ifdef ENABLE_DAP4
+    if(strcasecmp(proto,"dap4")==0)
+	isdap4 = 1;
+    else
+#endif
+	usage();
+
+    if(serverlist == NULL) {
+#ifdef REMOTETESTSERVERS
+	serverlist = strdup(REMOTETESTSERVERS);
+#endif
+    }
+    if(serverlist == NULL || strlen(serverlist) == 0)
+	fprintf(stderr,"Cannot determine a server list");
+
+    url = nc_findtestserver(servlet,isdap4,serverlist);
+    if(url == NULL) {
+       url = "";
+	fprintf(stderr,"not found: %s\n",servlet);
+    }
+    printf("%s",url);
+    fflush(stdout);
+    exit(0);
+}
diff --git a/ncdap_test/nctestserver.c b/ncdap_test/nctestserver.c
deleted file mode 100644
index e2f87df..0000000
--- a/ncdap_test/nctestserver.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "netcdf.h"
-#include "ncdispatch.h"
-
-/**
-Given a partial suffix path,
-try to find a server for which
-a request to that server + path
-returns some kind of result.
-This indicates that the server is up
-and running.
-Return the complete url for the server
-plus the path.
-*/
-
-int
-main(int argc, char** argv)
-{
-    const char* url = NULL;
-    const char* path = NULL;
-    char* serverlist[64];
-    int nservers = 0;
-
-    if(argc == 1)
-	path = "";
-    else if(argc >= 2)
-	path = argv[1];
-    if(argc >= 3) {
-	int i;
-	for(i=2;i<argc;i++,nservers++)
-	    serverlist[i-2] = argv[i];
-        serverlist[nservers] = NULL;
-    }
-    url = NC_findtestserver(path,(nservers==0?(const char**)NULL:(const char**)serverlist));
-    if(url == NULL)
-	url = "";
-    printf("%s",url);
-    fflush(stdout);
-    exit(0);
-}
diff --git a/ncdap_test/nocacheremote4/Makefile.am b/ncdap_test/nocacheremote4/Makefile.am
deleted file mode 100644
index a880735..0000000
--- a/ncdap_test/nocacheremote4/Makefile.am
+++ /dev/null
@@ -1,44 +0,0 @@
-## This is a automake file, part of Unidata's netCDF package.
-# Copyright 2007, see the COPYRIGHT file for more information.
-
-# This is to include the libnc-dap test comparison files
-
-# $Id: Makefile.am,v 1.1 2009/11/16 18:32:30 dmh Exp $
-
-EXTRA_DIST=\
-test.01.1.dmp \
-test.01.dmp \
-test.02.dmp \
-test.03.dmp \
-test.04.dmp \
-test.05.dmp \
-test.06a.dmp \
-test.06.dmp \
-test.07a.dmp \
-test.07.dmp \
-test.21.dmp \
-test.22.dmp \
-test.23.dmp \
-test.31.dmp \
-test.32.dmp \
-test.50.dmp \
-test.53.dmp \
-test.55.dmp \
-test.56.dmp \
-test.57.dmp \
-test.66.dmp \
-test.67.dmp \
-test.68.dmp \
-test.69.dmp \
-test.nc.dmp \
-test.02.1.dmp \
-test.03.1.dmp \
-test.03.2.dmp \
-test.04.1.dmp \
-test.05.1.dmp \
-test.06.1.dmp \
-test.07.1.dmp \
-test.07.2.dmp \
-test.07.3.dmp \
-test.07.4.dmp \
-CMakeLists.txt
diff --git a/ncdap_test/nocacheremote4/test.01.1.dmp b/ncdap_test/nocacheremote4/test.01.1.dmp
deleted file mode 100644
index 0422960..0000000
--- a/ncdap_test/nocacheremote4/test.01.1.dmp
+++ /dev/null
@@ -1,7 +0,0 @@
-netcdf test {
-variables:
-	double f64 ;
-data:
-
- f64 = 1000 ;
-}
diff --git a/ncdap_test/nocacheremote4/test.01.dmp b/ncdap_test/nocacheremote4/test.01.dmp
deleted file mode 100644
index cadbce6..0000000
--- a/ncdap_test/nocacheremote4/test.01.dmp
+++ /dev/null
@@ -1,35 +0,0 @@
-netcdf test {
-variables:
-	ubyte b ;
-		string b:Description = "A test byte" ;
-		string b:units = "unknown" ;
-	int i32 ;
-		string i32:Description = "A 32 bit test server int" ;
-		string i32:units = "unknown" ;
-	uint ui32 ;
-	short i16 ;
-	ushort ui16 ;
-	float f32 ;
-	double f64 ;
-	string s ;
-	string u ;
-data:
-
- b = 0 ;
-
- i32 = 1 ;
-
- ui32 = 0 ;
-
- i16 = 0 ;
-
- ui16 = 0 ;
-
- f32 = 0 ;
-
- f64 = 1000 ;
-
- s = "This is a data test string (pass 0)." ;
-
- u = "http://www.dods.org" ;
-}
diff --git a/ncdap_test/nocacheremote4/test.02.1.dmp b/ncdap_test/nocacheremote4/test.02.1.dmp
deleted file mode 100644
index 37c38fe..0000000
--- a/ncdap_test/nocacheremote4/test.02.1.dmp
+++ /dev/null
@@ -1,9 +0,0 @@
-netcdf test {
-dimensions:
-	b_0 = 5 ;
-variables:
-	ubyte b(b_0) ;
-data:
-
- b = 1, 3, 5, 7, 9 ;
-}
diff --git a/ncdap_test/nocacheremote4/test.02.dmp b/ncdap_test/nocacheremote4/test.02.dmp
deleted file mode 100644
index 7ab613f..0000000
--- a/ncdap_test/nocacheremote4/test.02.dmp
+++ /dev/null
@@ -1,93 +0,0 @@
-netcdf test {
-dimensions:
-	b_0 = 25 ;
-	f32_0 = 25 ;
-	f64_0 = 25 ;
-	i16_0 = 25 ;
-	i32_0 = 25 ;
-	s_0 = 25 ;
-	u_0 = 25 ;
-	ui16_0 = 25 ;
-	ui32_0 = 25 ;
-variables:
-	ubyte b(b_0) ;
-	int i32(i32_0) ;
-	uint ui32(ui32_0) ;
-	short i16(i16_0) ;
-	ushort ui16(ui16_0) ;
-	float f32(f32_0) ;
-	double f64(f64_0) ;
-	string s(s_0) ;
-	string u(u_0) ;
-data:
-
- b = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
-    20, 21, 22, 23, 24 ;
-
- i32 = 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 
-    22528, 24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912, 40960, 
-    43008, 45056, 47104, 49152 ;
-
- ui32 = 0, 4096, 8192, 12288, 16384, 20480, 24576, 28672, 32768, 36864, 
-    40960, 45056, 49152, 53248, 57344, 61440, 65536, 69632, 73728, 77824, 
-    81920, 86016, 90112, 94208, 98304 ;
-
- i16 = 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 
-    3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 
-    6144 ;
-
- ui16 = 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 
-    11264, 12288, 13312, 14336, 15360, 16384, 17408, 18432, 19456, 20480, 
-    21504, 22528, 23552, 24576 ;
-
- f32 = 0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 
-    0.059964, 0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 
-    0.1197122, 0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 
-    0.1790296, 0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 
-    0.2377026 ;
-
- f64 = 1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204, 
-    0.99755100025328, 0.996801706302619, 0.995952733011994, 
-    0.995004165278026, 0.993956097956697, 0.992808635853866, 
-    0.991561893714788, 0.990215996212637, 0.988771077936042, 
-    0.987227283375627, 0.985584766909561, 0.983843692788121, 
-    0.98200423511727, 0.980066577841242, 0.978030914724148, 
-    0.975897449330606, 0.973666395005375, 0.97133797485203 ;
-
- s = "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).", 
-    "This is a data test string (pass 10).", 
-    "This is a data test string (pass 11).", 
-    "This is a data test string (pass 12).", 
-    "This is a data test string (pass 13).", 
-    "This is a data test string (pass 14).", 
-    "This is a data test string (pass 15).", 
-    "This is a data test string (pass 16).", 
-    "This is a data test string (pass 17).", 
-    "This is a data test string (pass 18).", 
-    "This is a data test string (pass 19).", 
-    "This is a data test string (pass 20).", 
-    "This is a data test string (pass 21).", 
-    "This is a data test string (pass 22).", 
-    "This is a data test string (pass 23).", 
-    "This is a data test string (pass 24)." ;
-
- u = "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org" ;
-}
diff --git a/ncdap_test/nocacheremote4/test.03.1.dmp b/ncdap_test/nocacheremote4/test.03.1.dmp
deleted file mode 100644
index b0eb41b..0000000
--- a/ncdap_test/nocacheremote4/test.03.1.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf test {
-dimensions:
-	i32_0 = 2 ;
-	i32_1 = 2 ;
-	i32_2 = 3 ;
-variables:
-	int i32(i32_0, i32_1, i32_2) ;
-data:
-
- i32 =
-  8192, 10240, 12288,
-  16384, 18432, 20480,
-  32768, 34816, 36864,
-  40960, 43008, 45056 ;
-}
diff --git a/ncdap_test/nocacheremote4/test.03.2.dmp b/ncdap_test/nocacheremote4/test.03.2.dmp
deleted file mode 100644
index 2c4abdb..0000000
--- a/ncdap_test/nocacheremote4/test.03.2.dmp
+++ /dev/null
@@ -1,1011 +0,0 @@
-netcdf test {
-dimensions:
-	s1_0 = 10 ;
-	s1_1 = 10 ;
-	s1_2 = 10 ;
-variables:
-	string s1(s1_0, s1_1, s1_2) ;
-data:
-
- s1 =
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).",
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).", 
-    "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9)." ;
-}
diff --git a/ncdap_test/nocacheremote4/test.03.dmp b/ncdap_test/nocacheremote4/test.03.dmp
deleted file mode 100644
index e3ef016..0000000
--- a/ncdap_test/nocacheremote4/test.03.dmp
+++ /dev/null
@@ -1,1694 +0,0 @@
-netcdf test {
-dimensions:
-	b2_0 = 2 ;
-	b2_1 = 3 ;
-	b_0 = 2 ;
-	b_1 = 3 ;
-	b_2 = 4 ;
-	f32_0 = 2 ;
-	f32_1 = 2 ;
-	f32_2 = 2 ;
-	f64_0 = 2 ;
-	f64_1 = 2 ;
-	f64_2 = 2 ;
-	i16_0 = 2 ;
-	i16_1 = 2 ;
-	i16_2 = 2 ;
-	i32_0 = 2 ;
-	i32_1 = 3 ;
-	i32_2 = 4 ;
-	s0_0 = 4 ;
-	s0_1 = 5 ;
-	s0_2 = 6 ;
-	s1_0 = 10 ;
-	s1_1 = 10 ;
-	s1_2 = 10 ;
-	u_0 = 10 ;
-	u_1 = 10 ;
-	u_2 = 10 ;
-	ui16_0 = 2 ;
-	ui16_1 = 2 ;
-	ui16_2 = 2 ;
-	ui32_0 = 2 ;
-	ui32_1 = 3 ;
-	ui32_2 = 4 ;
-	ui32_3 = 3 ;
-	ui32_4 = 2 ;
-variables:
-	byte b(b_0, b_1, b_2) ;
-	byte b2(b2_0, b2_1) ;
-	int i32(i32_0, i32_1, i32_2) ;
-	uint ui32(ui32_0, ui32_1, ui32_2, ui32_3, ui32_4) ;
-	short i16(i16_0, i16_1, i16_2) ;
-	ushort ui16(ui16_0, ui16_1, ui16_2) ;
-	float f32(f32_0, f32_1, f32_2) ;
-	double f64(f64_0, f64_1, f64_2) ;
-	string s0(s0_0, s0_1, s0_2) ;
-	string s1(s1_0, s1_1, s1_2) ;
-	string u(u_0, u_1, u_2) ;
-data:
-
- b =
-  0, 1, 2, 3,
-  4, 5, 6, 7,
-  8, 9, 10, 11,
-  12, 13, 14, 15,
-  16, 17, 18, 19,
-  20, 21, 22, 23 ;
-
- b2 =
-  0, 1, 2,
-  3, 4, 5 ;
-
- i32 =
-  0, 2048, 4096, 6144,
-  8192, 10240, 12288, 14336,
-  16384, 18432, 20480, 22528,
-  24576, 26624, 28672, 30720,
-  32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104 ;
-
- ui32 =
-  0, 4096,
-  8192, 12288,
-  16384, 20480,
-  24576, 28672,
-  32768, 36864,
-  40960, 45056,
-  49152, 53248,
-  57344, 61440,
-  65536, 69632,
-  73728, 77824,
-  81920, 86016,
-  90112, 94208,
-  98304, 102400,
-  106496, 110592,
-  114688, 118784,
-  122880, 126976,
-  131072, 135168,
-  139264, 143360,
-  147456, 151552,
-  155648, 159744,
-  163840, 167936,
-  172032, 176128,
-  180224, 184320,
-  188416, 192512,
-  196608, 200704,
-  204800, 208896,
-  212992, 217088,
-  221184, 225280,
-  229376, 233472,
-  237568, 241664,
-  245760, 249856,
-  253952, 258048,
-  262144, 266240,
-  270336, 274432,
-  278528, 282624,
-  286720, 290816,
-  294912, 299008,
-  303104, 307200,
-  311296, 315392,
-  319488, 323584,
-  327680, 331776,
-  335872, 339968,
-  344064, 348160,
-  352256, 356352,
-  360448, 364544,
-  368640, 372736,
-  376832, 380928,
-  385024, 389120,
-  393216, 397312,
-  401408, 405504,
-  409600, 413696,
-  417792, 421888,
-  425984, 430080,
-  434176, 438272,
-  442368, 446464,
-  450560, 454656,
-  458752, 462848,
-  466944, 471040,
-  475136, 479232,
-  483328, 487424,
-  491520, 495616,
-  499712, 503808,
-  507904, 512000,
-  516096, 520192,
-  524288, 528384,
-  532480, 536576,
-  540672, 544768,
-  548864, 552960,
-  557056, 561152,
-  565248, 569344,
-  573440, 577536,
-  581632, 585728 ;
-
- i16 =
-  0, 256,
-  512, 768,
-  1024, 1280,
-  1536, 1792 ;
-
- ui16 =
-  0, 1024,
-  2048, 3072,
-  4096, 5120,
-  6144, 7168 ;
-
- f32 =
-  0, 0.009999833,
-  0.01999867, 0.0299955,
-  0.03998933, 0.04997917,
-  0.059964, 0.06994285 ;
-
- f64 =
-  1, 0.999950000416665,
-  0.999800006666578, 0.999550033748988,
-  0.999200106660978, 0.998750260394966,
-  0.998200539935204, 0.99755100025328 ;
-
- s0 =
-  "This is a data test string (pass 0).", 
-    "This is a data test string (pass 1).", 
-    "This is a data test string (pass 2).", 
-    "This is a data test string (pass 3).", 
-    "This is a data test string (pass 4).", 
-    "This is a data test string (pass 5).",
-  "This is a data test string (pass 6).", 
-    "This is a data test string (pass 7).", 
-    "This is a data test string (pass 8).", 
-    "This is a data test string (pass 9).", 
-    "This is a data test string (pass 10).", 
-    "This is a data test string (pass 11).",
-  "This is a data test string (pass 12).", 
-    "This is a data test string (pass 13).", 
-    "This is a data test string (pass 14).", 
-    "This is a data test string (pass 15).", 
-    "This is a data test string (pass 16).", 
-    "This is a data test string (pass 17).",
-  "This is a data test string (pass 18).", 
-    "This is a data test string (pass 19).", 
-    "This is a data test string (pass 20).", 
-    "This is a data test string (pass 21).", 
-    "This is a data test string (pass 22).", 
-    "This is a data test string (pass 23).",
-  "This is a data test string (pass 24).", 
-    "This is a data test string (pass 25).", 
-    "This is a data test string (pass 26).", 
-    "This is a data test string (pass 27).", 
-    "This is a data test string (pass 28).", 
-    "This is a data test string (pass 29).",
-  "This is a data test string (pass 30).", 
-    "This is a data test string (pass 31).", 
-    "This is a data test string (pass 32).", 
-    "This is a data test string (pass 33).", 
-    "This is a data test string (pass 34).", 
-    "This is a data test string (pass 35).",
-  "This is a data test string (pass 36).", 
-    "This is a data test string (pass 37).", 
-    "This is a data test string (pass 38).", 
-    "This is a data test string (pass 39).", 
-    "This is a data test string (pass 40).", 
-    "This is a data test string (pass 41).",
-  "This is a data test string (pass 42).", 
-    "This is a data test string (pass 43).", 
-    "This is a data test string (pass 44).", 
-    "This is a data test string (pass 45).", 
-    "This is a data test string (pass 46).", 
-    "This is a data test string (pass 47).",
-  "This is a data test string (pass 48).", 
-    "This is a data test string (pass 49).", 
-    "This is a data test string (pass 50).", 
-    "This is a data test string (pass 51).", 
-    "This is a data test string (pass 52).", 
-    "This is a data test string (pass 53).",
-  "This is a data test string (pass 54).", 
-    "This is a data test string (pass 55).", 
-    "This is a data test string (pass 56).", 
-    "This is a data test string (pass 57).", 
-    "This is a data test string (pass 58).", 
-    "This is a data test string (pass 59).",
-  "This is a data test string (pass 60).", 
-    "This is a data test string (pass 61).", 
-    "This is a data test string (pass 62).", 
-    "This is a data test string (pass 63).", 
-    "This is a data test string (pass 64).", 
-    "This is a data test string (pass 65).",
-  "This is a data test string (pass 66).", 
-    "This is a data test string (pass 67).", 
-    "This is a data test string (pass 68).", 
-    "This is a data test string (pass 69).", 
-    "This is a data test string (pass 70).", 
-    "This is a data test string (pass 71).",
-  "This is a data test string (pass 72).", 
-    "This is a data test string (pass 73).", 
-    "This is a data test string (pass 74).", 
-    "This is a data test string (pass 75).", 
-    "This is a data test string (pass 76).", 
-    "This is a data test string (pass 77).",
-  "This is a data test string (pass 78).", 
-    "This is a data test string (pass 79).", 
-    "This is a data test string (pass 80).", 
-    "This is a data test string (pass 81).", 
-    "This is a data test string (pass 82).", 
-    "This is a data test string (pass 83).",
-  "This is a data test string (pass 84).", 
-    "This is a data test string (pass 85).", 
-    "This is a data test string (pass 86).", 
-    "This is a data test string (pass 87).", 
-    "This is a data test string (pass 88).", 
-    "This is a data test string (pass 89).",
-  "This is a data test string (pass 90).", 
-    "This is a data test string (pass 91).", 
-    "This is a data test string (pass 92).", 
-    "This is a data test string (pass 93).", 
-    "This is a data test string (pass 94).", 
-    "This is a data test string (pass 95).",
-  "This is a data test string (pass 96).", 
-    "This is a data test string (pass 97).", 
-    "This is a data test string (pass 98).", 
-    "This is a data test string (pass 99).", 
-    "This is a data test string (pass 100).", 
-    "This is a data test string (pass 101).",
-  "This is a data test string (pass 102).", 
-    "This is a data test string (pass 103).", 
-    "This is a data test string (pass 104).", 
-    "This is a data test string (pass 105).", 
-    "This is a data test string (pass 106).", 
-    "This is a data test string (pass 107).",
-  "This is a data test string (pass 108).", 
-    "This is a data test string (pass 109).", 
-    "This is a data test string (pass 110).", 
-    "This is a data test string (pass 111).", 
-    "This is a data test string (pass 112).", 
-    "This is a data test string (pass 113).",
-  "This is a data test string (pass 114).", 
-    "This is a data test string (pass 115).", 
-    "This is a data test string (pass 116).", 
-    "This is a data test string (pass 117).", 
-    "This is a data test string (pass 118).", 
-    "This is a data test string (pass 119)." ;
-
- s1 =
-  "This is a data test string (pass 120).", 
-    "This is a data test string (pass 121).", 
-    "This is a data test string (pass 122).", 
-    "This is a data test string (pass 123).", 
-    "This is a data test string (pass 124).", 
-    "This is a data test string (pass 125).", 
-    "This is a data test string (pass 126).", 
-    "This is a data test string (pass 127).", 
-    "This is a data test string (pass 128).", 
-    "This is a data test string (pass 129).",
-  "This is a data test string (pass 130).", 
-    "This is a data test string (pass 131).", 
-    "This is a data test string (pass 132).", 
-    "This is a data test string (pass 133).", 
-    "This is a data test string (pass 134).", 
-    "This is a data test string (pass 135).", 
-    "This is a data test string (pass 136).", 
-    "This is a data test string (pass 137).", 
-    "This is a data test string (pass 138).", 
-    "This is a data test string (pass 139).",
-  "This is a data test string (pass 140).", 
-    "This is a data test string (pass 141).", 
-    "This is a data test string (pass 142).", 
-    "This is a data test string (pass 143).", 
-    "This is a data test string (pass 144).", 
-    "This is a data test string (pass 145).", 
-    "This is a data test string (pass 146).", 
-    "This is a data test string (pass 147).", 
-    "This is a data test string (pass 148).", 
-    "This is a data test string (pass 149).",
-  "This is a data test string (pass 150).", 
-    "This is a data test string (pass 151).", 
-    "This is a data test string (pass 152).", 
-    "This is a data test string (pass 153).", 
-    "This is a data test string (pass 154).", 
-    "This is a data test string (pass 155).", 
-    "This is a data test string (pass 156).", 
-    "This is a data test string (pass 157).", 
-    "This is a data test string (pass 158).", 
-    "This is a data test string (pass 159).",
-  "This is a data test string (pass 160).", 
-    "This is a data test string (pass 161).", 
-    "This is a data test string (pass 162).", 
-    "This is a data test string (pass 163).", 
-    "This is a data test string (pass 164).", 
-    "This is a data test string (pass 165).", 
-    "This is a data test string (pass 166).", 
-    "This is a data test string (pass 167).", 
-    "This is a data test string (pass 168).", 
-    "This is a data test string (pass 169).",
-  "This is a data test string (pass 170).", 
-    "This is a data test string (pass 171).", 
-    "This is a data test string (pass 172).", 
-    "This is a data test string (pass 173).", 
-    "This is a data test string (pass 174).", 
-    "This is a data test string (pass 175).", 
-    "This is a data test string (pass 176).", 
-    "This is a data test string (pass 177).", 
-    "This is a data test string (pass 178).", 
-    "This is a data test string (pass 179).",
-  "This is a data test string (pass 180).", 
-    "This is a data test string (pass 181).", 
-    "This is a data test string (pass 182).", 
-    "This is a data test string (pass 183).", 
-    "This is a data test string (pass 184).", 
-    "This is a data test string (pass 185).", 
-    "This is a data test string (pass 186).", 
-    "This is a data test string (pass 187).", 
-    "This is a data test string (pass 188).", 
-    "This is a data test string (pass 189).",
-  "This is a data test string (pass 190).", 
-    "This is a data test string (pass 191).", 
-    "This is a data test string (pass 192).", 
-    "This is a data test string (pass 193).", 
-    "This is a data test string (pass 194).", 
-    "This is a data test string (pass 195).", 
-    "This is a data test string (pass 196).", 
-    "This is a data test string (pass 197).", 
-    "This is a data test string (pass 198).", 
-    "This is a data test string (pass 199).",
-  "This is a data test string (pass 200).", 
-    "This is a data test string (pass 201).", 
-    "This is a data test string (pass 202).", 
-    "This is a data test string (pass 203).", 
-    "This is a data test string (pass 204).", 
-    "This is a data test string (pass 205).", 
-    "This is a data test string (pass 206).", 
-    "This is a data test string (pass 207).", 
-    "This is a data test string (pass 208).", 
-    "This is a data test string (pass 209).",
-  "This is a data test string (pass 210).", 
-    "This is a data test string (pass 211).", 
-    "This is a data test string (pass 212).", 
-    "This is a data test string (pass 213).", 
-    "This is a data test string (pass 214).", 
-    "This is a data test string (pass 215).", 
-    "This is a data test string (pass 216).", 
-    "This is a data test string (pass 217).", 
-    "This is a data test string (pass 218).", 
-    "This is a data test string (pass 219).",
-  "This is a data test string (pass 220).", 
-    "This is a data test string (pass 221).", 
-    "This is a data test string (pass 222).", 
-    "This is a data test string (pass 223).", 
-    "This is a data test string (pass 224).", 
-    "This is a data test string (pass 225).", 
-    "This is a data test string (pass 226).", 
-    "This is a data test string (pass 227).", 
-    "This is a data test string (pass 228).", 
-    "This is a data test string (pass 229).",
-  "This is a data test string (pass 230).", 
-    "This is a data test string (pass 231).", 
-    "This is a data test string (pass 232).", 
-    "This is a data test string (pass 233).", 
-    "This is a data test string (pass 234).", 
-    "This is a data test string (pass 235).", 
-    "This is a data test string (pass 236).", 
-    "This is a data test string (pass 237).", 
-    "This is a data test string (pass 238).", 
-    "This is a data test string (pass 239).",
-  "This is a data test string (pass 240).", 
-    "This is a data test string (pass 241).", 
-    "This is a data test string (pass 242).", 
-    "This is a data test string (pass 243).", 
-    "This is a data test string (pass 244).", 
-    "This is a data test string (pass 245).", 
-    "This is a data test string (pass 246).", 
-    "This is a data test string (pass 247).", 
-    "This is a data test string (pass 248).", 
-    "This is a data test string (pass 249).",
-  "This is a data test string (pass 250).", 
-    "This is a data test string (pass 251).", 
-    "This is a data test string (pass 252).", 
-    "This is a data test string (pass 253).", 
-    "This is a data test string (pass 254).", 
-    "This is a data test string (pass 255).", 
-    "This is a data test string (pass 256).", 
-    "This is a data test string (pass 257).", 
-    "This is a data test string (pass 258).", 
-    "This is a data test string (pass 259).",
-  "This is a data test string (pass 260).", 
-    "This is a data test string (pass 261).", 
-    "This is a data test string (pass 262).", 
-    "This is a data test string (pass 263).", 
-    "This is a data test string (pass 264).", 
-    "This is a data test string (pass 265).", 
-    "This is a data test string (pass 266).", 
-    "This is a data test string (pass 267).", 
-    "This is a data test string (pass 268).", 
-    "This is a data test string (pass 269).",
-  "This is a data test string (pass 270).", 
-    "This is a data test string (pass 271).", 
-    "This is a data test string (pass 272).", 
-    "This is a data test string (pass 273).", 
-    "This is a data test string (pass 274).", 
-    "This is a data test string (pass 275).", 
-    "This is a data test string (pass 276).", 
-    "This is a data test string (pass 277).", 
-    "This is a data test string (pass 278).", 
-    "This is a data test string (pass 279).",
-  "This is a data test string (pass 280).", 
-    "This is a data test string (pass 281).", 
-    "This is a data test string (pass 282).", 
-    "This is a data test string (pass 283).", 
-    "This is a data test string (pass 284).", 
-    "This is a data test string (pass 285).", 
-    "This is a data test string (pass 286).", 
-    "This is a data test string (pass 287).", 
-    "This is a data test string (pass 288).", 
-    "This is a data test string (pass 289).",
-  "This is a data test string (pass 290).", 
-    "This is a data test string (pass 291).", 
-    "This is a data test string (pass 292).", 
-    "This is a data test string (pass 293).", 
-    "This is a data test string (pass 294).", 
-    "This is a data test string (pass 295).", 
-    "This is a data test string (pass 296).", 
-    "This is a data test string (pass 297).", 
-    "This is a data test string (pass 298).", 
-    "This is a data test string (pass 299).",
-  "This is a data test string (pass 300).", 
-    "This is a data test string (pass 301).", 
-    "This is a data test string (pass 302).", 
-    "This is a data test string (pass 303).", 
-    "This is a data test string (pass 304).", 
-    "This is a data test string (pass 305).", 
-    "This is a data test string (pass 306).", 
-    "This is a data test string (pass 307).", 
-    "This is a data test string (pass 308).", 
-    "This is a data test string (pass 309).",
-  "This is a data test string (pass 310).", 
-    "This is a data test string (pass 311).", 
-    "This is a data test string (pass 312).", 
-    "This is a data test string (pass 313).", 
-    "This is a data test string (pass 314).", 
-    "This is a data test string (pass 315).", 
-    "This is a data test string (pass 316).", 
-    "This is a data test string (pass 317).", 
-    "This is a data test string (pass 318).", 
-    "This is a data test string (pass 319).",
-  "This is a data test string (pass 320).", 
-    "This is a data test string (pass 321).", 
-    "This is a data test string (pass 322).", 
-    "This is a data test string (pass 323).", 
-    "This is a data test string (pass 324).", 
-    "This is a data test string (pass 325).", 
-    "This is a data test string (pass 326).", 
-    "This is a data test string (pass 327).", 
-    "This is a data test string (pass 328).", 
-    "This is a data test string (pass 329).",
-  "This is a data test string (pass 330).", 
-    "This is a data test string (pass 331).", 
-    "This is a data test string (pass 332).", 
-    "This is a data test string (pass 333).", 
-    "This is a data test string (pass 334).", 
-    "This is a data test string (pass 335).", 
-    "This is a data test string (pass 336).", 
-    "This is a data test string (pass 337).", 
-    "This is a data test string (pass 338).", 
-    "This is a data test string (pass 339).",
-  "This is a data test string (pass 340).", 
-    "This is a data test string (pass 341).", 
-    "This is a data test string (pass 342).", 
-    "This is a data test string (pass 343).", 
-    "This is a data test string (pass 344).", 
-    "This is a data test string (pass 345).", 
-    "This is a data test string (pass 346).", 
-    "This is a data test string (pass 347).", 
-    "This is a data test string (pass 348).", 
-    "This is a data test string (pass 349).",
-  "This is a data test string (pass 350).", 
-    "This is a data test string (pass 351).", 
-    "This is a data test string (pass 352).", 
-    "This is a data test string (pass 353).", 
-    "This is a data test string (pass 354).", 
-    "This is a data test string (pass 355).", 
-    "This is a data test string (pass 356).", 
-    "This is a data test string (pass 357).", 
-    "This is a data test string (pass 358).", 
-    "This is a data test string (pass 359).",
-  "This is a data test string (pass 360).", 
-    "This is a data test string (pass 361).", 
-    "This is a data test string (pass 362).", 
-    "This is a data test string (pass 363).", 
-    "This is a data test string (pass 364).", 
-    "This is a data test string (pass 365).", 
-    "This is a data test string (pass 366).", 
-    "This is a data test string (pass 367).", 
-    "This is a data test string (pass 368).", 
-    "This is a data test string (pass 369).",
-  "This is a data test string (pass 370).", 
-    "This is a data test string (pass 371).", 
-    "This is a data test string (pass 372).", 
-    "This is a data test string (pass 373).", 
-    "This is a data test string (pass 374).", 
-    "This is a data test string (pass 375).", 
-    "This is a data test string (pass 376).", 
-    "This is a data test string (pass 377).", 
-    "This is a data test string (pass 378).", 
-    "This is a data test string (pass 379).",
-  "This is a data test string (pass 380).", 
-    "This is a data test string (pass 381).", 
-    "This is a data test string (pass 382).", 
-    "This is a data test string (pass 383).", 
-    "This is a data test string (pass 384).", 
-    "This is a data test string (pass 385).", 
-    "This is a data test string (pass 386).", 
-    "This is a data test string (pass 387).", 
-    "This is a data test string (pass 388).", 
-    "This is a data test string (pass 389).",
-  "This is a data test string (pass 390).", 
-    "This is a data test string (pass 391).", 
-    "This is a data test string (pass 392).", 
-    "This is a data test string (pass 393).", 
-    "This is a data test string (pass 394).", 
-    "This is a data test string (pass 395).", 
-    "This is a data test string (pass 396).", 
-    "This is a data test string (pass 397).", 
-    "This is a data test string (pass 398).", 
-    "This is a data test string (pass 399).",
-  "This is a data test string (pass 400).", 
-    "This is a data test string (pass 401).", 
-    "This is a data test string (pass 402).", 
-    "This is a data test string (pass 403).", 
-    "This is a data test string (pass 404).", 
-    "This is a data test string (pass 405).", 
-    "This is a data test string (pass 406).", 
-    "This is a data test string (pass 407).", 
-    "This is a data test string (pass 408).", 
-    "This is a data test string (pass 409).",
-  "This is a data test string (pass 410).", 
-    "This is a data test string (pass 411).", 
-    "This is a data test string (pass 412).", 
-    "This is a data test string (pass 413).", 
-    "This is a data test string (pass 414).", 
-    "This is a data test string (pass 415).", 
-    "This is a data test string (pass 416).", 
-    "This is a data test string (pass 417).", 
-    "This is a data test string (pass 418).", 
-    "This is a data test string (pass 419).",
-  "This is a data test string (pass 420).", 
-    "This is a data test string (pass 421).", 
-    "This is a data test string (pass 422).", 
-    "This is a data test string (pass 423).", 
-    "This is a data test string (pass 424).", 
-    "This is a data test string (pass 425).", 
-    "This is a data test string (pass 426).", 
-    "This is a data test string (pass 427).", 
-    "This is a data test string (pass 428).", 
-    "This is a data test string (pass 429).",
-  "This is a data test string (pass 430).", 
-    "This is a data test string (pass 431).", 
-    "This is a data test string (pass 432).", 
-    "This is a data test string (pass 433).", 
-    "This is a data test string (pass 434).", 
-    "This is a data test string (pass 435).", 
-    "This is a data test string (pass 436).", 
-    "This is a data test string (pass 437).", 
-    "This is a data test string (pass 438).", 
-    "This is a data test string (pass 439).",
-  "This is a data test string (pass 440).", 
-    "This is a data test string (pass 441).", 
-    "This is a data test string (pass 442).", 
-    "This is a data test string (pass 443).", 
-    "This is a data test string (pass 444).", 
-    "This is a data test string (pass 445).", 
-    "This is a data test string (pass 446).", 
-    "This is a data test string (pass 447).", 
-    "This is a data test string (pass 448).", 
-    "This is a data test string (pass 449).",
-  "This is a data test string (pass 450).", 
-    "This is a data test string (pass 451).", 
-    "This is a data test string (pass 452).", 
-    "This is a data test string (pass 453).", 
-    "This is a data test string (pass 454).", 
-    "This is a data test string (pass 455).", 
-    "This is a data test string (pass 456).", 
-    "This is a data test string (pass 457).", 
-    "This is a data test string (pass 458).", 
-    "This is a data test string (pass 459).",
-  "This is a data test string (pass 460).", 
-    "This is a data test string (pass 461).", 
-    "This is a data test string (pass 462).", 
-    "This is a data test string (pass 463).", 
-    "This is a data test string (pass 464).", 
-    "This is a data test string (pass 465).", 
-    "This is a data test string (pass 466).", 
-    "This is a data test string (pass 467).", 
-    "This is a data test string (pass 468).", 
-    "This is a data test string (pass 469).",
-  "This is a data test string (pass 470).", 
-    "This is a data test string (pass 471).", 
-    "This is a data test string (pass 472).", 
-    "This is a data test string (pass 473).", 
-    "This is a data test string (pass 474).", 
-    "This is a data test string (pass 475).", 
-    "This is a data test string (pass 476).", 
-    "This is a data test string (pass 477).", 
-    "This is a data test string (pass 478).", 
-    "This is a data test string (pass 479).",
-  "This is a data test string (pass 480).", 
-    "This is a data test string (pass 481).", 
-    "This is a data test string (pass 482).", 
-    "This is a data test string (pass 483).", 
-    "This is a data test string (pass 484).", 
-    "This is a data test string (pass 485).", 
-    "This is a data test string (pass 486).", 
-    "This is a data test string (pass 487).", 
-    "This is a data test string (pass 488).", 
-    "This is a data test string (pass 489).",
-  "This is a data test string (pass 490).", 
-    "This is a data test string (pass 491).", 
-    "This is a data test string (pass 492).", 
-    "This is a data test string (pass 493).", 
-    "This is a data test string (pass 494).", 
-    "This is a data test string (pass 495).", 
-    "This is a data test string (pass 496).", 
-    "This is a data test string (pass 497).", 
-    "This is a data test string (pass 498).", 
-    "This is a data test string (pass 499).",
-  "This is a data test string (pass 500).", 
-    "This is a data test string (pass 501).", 
-    "This is a data test string (pass 502).", 
-    "This is a data test string (pass 503).", 
-    "This is a data test string (pass 504).", 
-    "This is a data test string (pass 505).", 
-    "This is a data test string (pass 506).", 
-    "This is a data test string (pass 507).", 
-    "This is a data test string (pass 508).", 
-    "This is a data test string (pass 509).",
-  "This is a data test string (pass 510).", 
-    "This is a data test string (pass 511).", 
-    "This is a data test string (pass 512).", 
-    "This is a data test string (pass 513).", 
-    "This is a data test string (pass 514).", 
-    "This is a data test string (pass 515).", 
-    "This is a data test string (pass 516).", 
-    "This is a data test string (pass 517).", 
-    "This is a data test string (pass 518).", 
-    "This is a data test string (pass 519).",
-  "This is a data test string (pass 520).", 
-    "This is a data test string (pass 521).", 
-    "This is a data test string (pass 522).", 
-    "This is a data test string (pass 523).", 
-    "This is a data test string (pass 524).", 
-    "This is a data test string (pass 525).", 
-    "This is a data test string (pass 526).", 
-    "This is a data test string (pass 527).", 
-    "This is a data test string (pass 528).", 
-    "This is a data test string (pass 529).",
-  "This is a data test string (pass 530).", 
-    "This is a data test string (pass 531).", 
-    "This is a data test string (pass 532).", 
-    "This is a data test string (pass 533).", 
-    "This is a data test string (pass 534).", 
-    "This is a data test string (pass 535).", 
-    "This is a data test string (pass 536).", 
-    "This is a data test string (pass 537).", 
-    "This is a data test string (pass 538).", 
-    "This is a data test string (pass 539).",
-  "This is a data test string (pass 540).", 
-    "This is a data test string (pass 541).", 
-    "This is a data test string (pass 542).", 
-    "This is a data test string (pass 543).", 
-    "This is a data test string (pass 544).", 
-    "This is a data test string (pass 545).", 
-    "This is a data test string (pass 546).", 
-    "This is a data test string (pass 547).", 
-    "This is a data test string (pass 548).", 
-    "This is a data test string (pass 549).",
-  "This is a data test string (pass 550).", 
-    "This is a data test string (pass 551).", 
-    "This is a data test string (pass 552).", 
-    "This is a data test string (pass 553).", 
-    "This is a data test string (pass 554).", 
-    "This is a data test string (pass 555).", 
-    "This is a data test string (pass 556).", 
-    "This is a data test string (pass 557).", 
-    "This is a data test string (pass 558).", 
-    "This is a data test string (pass 559).",
-  "This is a data test string (pass 560).", 
-    "This is a data test string (pass 561).", 
-    "This is a data test string (pass 562).", 
-    "This is a data test string (pass 563).", 
-    "This is a data test string (pass 564).", 
-    "This is a data test string (pass 565).", 
-    "This is a data test string (pass 566).", 
-    "This is a data test string (pass 567).", 
-    "This is a data test string (pass 568).", 
-    "This is a data test string (pass 569).",
-  "This is a data test string (pass 570).", 
-    "This is a data test string (pass 571).", 
-    "This is a data test string (pass 572).", 
-    "This is a data test string (pass 573).", 
-    "This is a data test string (pass 574).", 
-    "This is a data test string (pass 575).", 
-    "This is a data test string (pass 576).", 
-    "This is a data test string (pass 577).", 
-    "This is a data test string (pass 578).", 
-    "This is a data test string (pass 579).",
-  "This is a data test string (pass 580).", 
-    "This is a data test string (pass 581).", 
-    "This is a data test string (pass 582).", 
-    "This is a data test string (pass 583).", 
-    "This is a data test string (pass 584).", 
-    "This is a data test string (pass 585).", 
-    "This is a data test string (pass 586).", 
-    "This is a data test string (pass 587).", 
-    "This is a data test string (pass 588).", 
-    "This is a data test string (pass 589).",
-  "This is a data test string (pass 590).", 
-    "This is a data test string (pass 591).", 
-    "This is a data test string (pass 592).", 
-    "This is a data test string (pass 593).", 
-    "This is a data test string (pass 594).", 
-    "This is a data test string (pass 595).", 
-    "This is a data test string (pass 596).", 
-    "This is a data test string (pass 597).", 
-    "This is a data test string (pass 598).", 
-    "This is a data test string (pass 599).",
-  "This is a data test string (pass 600).", 
-    "This is a data test string (pass 601).", 
-    "This is a data test string (pass 602).", 
-    "This is a data test string (pass 603).", 
-    "This is a data test string (pass 604).", 
-    "This is a data test string (pass 605).", 
-    "This is a data test string (pass 606).", 
-    "This is a data test string (pass 607).", 
-    "This is a data test string (pass 608).", 
-    "This is a data test string (pass 609).",
-  "This is a data test string (pass 610).", 
-    "This is a data test string (pass 611).", 
-    "This is a data test string (pass 612).", 
-    "This is a data test string (pass 613).", 
-    "This is a data test string (pass 614).", 
-    "This is a data test string (pass 615).", 
-    "This is a data test string (pass 616).", 
-    "This is a data test string (pass 617).", 
-    "This is a data test string (pass 618).", 
-    "This is a data test string (pass 619).",
-  "This is a data test string (pass 620).", 
-    "This is a data test string (pass 621).", 
-    "This is a data test string (pass 622).", 
-    "This is a data test string (pass 623).", 
-    "This is a data test string (pass 624).", 
-    "This is a data test string (pass 625).", 
-    "This is a data test string (pass 626).", 
-    "This is a data test string (pass 627).", 
-    "This is a data test string (pass 628).", 
-    "This is a data test string (pass 629).",
-  "This is a data test string (pass 630).", 
-    "This is a data test string (pass 631).", 
-    "This is a data test string (pass 632).", 
-    "This is a data test string (pass 633).", 
-    "This is a data test string (pass 634).", 
-    "This is a data test string (pass 635).", 
-    "This is a data test string (pass 636).", 
-    "This is a data test string (pass 637).", 
-    "This is a data test string (pass 638).", 
-    "This is a data test string (pass 639).",
-  "This is a data test string (pass 640).", 
-    "This is a data test string (pass 641).", 
-    "This is a data test string (pass 642).", 
-    "This is a data test string (pass 643).", 
-    "This is a data test string (pass 644).", 
-    "This is a data test string (pass 645).", 
-    "This is a data test string (pass 646).", 
-    "This is a data test string (pass 647).", 
-    "This is a data test string (pass 648).", 
-    "This is a data test string (pass 649).",
-  "This is a data test string (pass 650).", 
-    "This is a data test string (pass 651).", 
-    "This is a data test string (pass 652).", 
-    "This is a data test string (pass 653).", 
-    "This is a data test string (pass 654).", 
-    "This is a data test string (pass 655).", 
-    "This is a data test string (pass 656).", 
-    "This is a data test string (pass 657).", 
-    "This is a data test string (pass 658).", 
-    "This is a data test string (pass 659).",
-  "This is a data test string (pass 660).", 
-    "This is a data test string (pass 661).", 
-    "This is a data test string (pass 662).", 
-    "This is a data test string (pass 663).", 
-    "This is a data test string (pass 664).", 
-    "This is a data test string (pass 665).", 
-    "This is a data test string (pass 666).", 
-    "This is a data test string (pass 667).", 
-    "This is a data test string (pass 668).", 
-    "This is a data test string (pass 669).",
-  "This is a data test string (pass 670).", 
-    "This is a data test string (pass 671).", 
-    "This is a data test string (pass 672).", 
-    "This is a data test string (pass 673).", 
-    "This is a data test string (pass 674).", 
-    "This is a data test string (pass 675).", 
-    "This is a data test string (pass 676).", 
-    "This is a data test string (pass 677).", 
-    "This is a data test string (pass 678).", 
-    "This is a data test string (pass 679).",
-  "This is a data test string (pass 680).", 
-    "This is a data test string (pass 681).", 
-    "This is a data test string (pass 682).", 
-    "This is a data test string (pass 683).", 
-    "This is a data test string (pass 684).", 
-    "This is a data test string (pass 685).", 
-    "This is a data test string (pass 686).", 
-    "This is a data test string (pass 687).", 
-    "This is a data test string (pass 688).", 
-    "This is a data test string (pass 689).",
-  "This is a data test string (pass 690).", 
-    "This is a data test string (pass 691).", 
-    "This is a data test string (pass 692).", 
-    "This is a data test string (pass 693).", 
-    "This is a data test string (pass 694).", 
-    "This is a data test string (pass 695).", 
-    "This is a data test string (pass 696).", 
-    "This is a data test string (pass 697).", 
-    "This is a data test string (pass 698).", 
-    "This is a data test string (pass 699).",
-  "This is a data test string (pass 700).", 
-    "This is a data test string (pass 701).", 
-    "This is a data test string (pass 702).", 
-    "This is a data test string (pass 703).", 
-    "This is a data test string (pass 704).", 
-    "This is a data test string (pass 705).", 
-    "This is a data test string (pass 706).", 
-    "This is a data test string (pass 707).", 
-    "This is a data test string (pass 708).", 
-    "This is a data test string (pass 709).",
-  "This is a data test string (pass 710).", 
-    "This is a data test string (pass 711).", 
-    "This is a data test string (pass 712).", 
-    "This is a data test string (pass 713).", 
-    "This is a data test string (pass 714).", 
-    "This is a data test string (pass 715).", 
-    "This is a data test string (pass 716).", 
-    "This is a data test string (pass 717).", 
-    "This is a data test string (pass 718).", 
-    "This is a data test string (pass 719).",
-  "This is a data test string (pass 720).", 
-    "This is a data test string (pass 721).", 
-    "This is a data test string (pass 722).", 
-    "This is a data test string (pass 723).", 
-    "This is a data test string (pass 724).", 
-    "This is a data test string (pass 725).", 
-    "This is a data test string (pass 726).", 
-    "This is a data test string (pass 727).", 
-    "This is a data test string (pass 728).", 
-    "This is a data test string (pass 729).",
-  "This is a data test string (pass 730).", 
-    "This is a data test string (pass 731).", 
-    "This is a data test string (pass 732).", 
-    "This is a data test string (pass 733).", 
-    "This is a data test string (pass 734).", 
-    "This is a data test string (pass 735).", 
-    "This is a data test string (pass 736).", 
-    "This is a data test string (pass 737).", 
-    "This is a data test string (pass 738).", 
-    "This is a data test string (pass 739).",
-  "This is a data test string (pass 740).", 
-    "This is a data test string (pass 741).", 
-    "This is a data test string (pass 742).", 
-    "This is a data test string (pass 743).", 
-    "This is a data test string (pass 744).", 
-    "This is a data test string (pass 745).", 
-    "This is a data test string (pass 746).", 
-    "This is a data test string (pass 747).", 
-    "This is a data test string (pass 748).", 
-    "This is a data test string (pass 749).",
-  "This is a data test string (pass 750).", 
-    "This is a data test string (pass 751).", 
-    "This is a data test string (pass 752).", 
-    "This is a data test string (pass 753).", 
-    "This is a data test string (pass 754).", 
-    "This is a data test string (pass 755).", 
-    "This is a data test string (pass 756).", 
-    "This is a data test string (pass 757).", 
-    "This is a data test string (pass 758).", 
-    "This is a data test string (pass 759).",
-  "This is a data test string (pass 760).", 
-    "This is a data test string (pass 761).", 
-    "This is a data test string (pass 762).", 
-    "This is a data test string (pass 763).", 
-    "This is a data test string (pass 764).", 
-    "This is a data test string (pass 765).", 
-    "This is a data test string (pass 766).", 
-    "This is a data test string (pass 767).", 
-    "This is a data test string (pass 768).", 
-    "This is a data test string (pass 769).",
-  "This is a data test string (pass 770).", 
-    "This is a data test string (pass 771).", 
-    "This is a data test string (pass 772).", 
-    "This is a data test string (pass 773).", 
-    "This is a data test string (pass 774).", 
-    "This is a data test string (pass 775).", 
-    "This is a data test string (pass 776).", 
-    "This is a data test string (pass 777).", 
-    "This is a data test string (pass 778).", 
-    "This is a data test string (pass 779).",
-  "This is a data test string (pass 780).", 
-    "This is a data test string (pass 781).", 
-    "This is a data test string (pass 782).", 
-    "This is a data test string (pass 783).", 
-    "This is a data test string (pass 784).", 
-    "This is a data test string (pass 785).", 
-    "This is a data test string (pass 786).", 
-    "This is a data test string (pass 787).", 
-    "This is a data test string (pass 788).", 
-    "This is a data test string (pass 789).",
-  "This is a data test string (pass 790).", 
-    "This is a data test string (pass 791).", 
-    "This is a data test string (pass 792).", 
-    "This is a data test string (pass 793).", 
-    "This is a data test string (pass 794).", 
-    "This is a data test string (pass 795).", 
-    "This is a data test string (pass 796).", 
-    "This is a data test string (pass 797).", 
-    "This is a data test string (pass 798).", 
-    "This is a data test string (pass 799).",
-  "This is a data test string (pass 800).", 
-    "This is a data test string (pass 801).", 
-    "This is a data test string (pass 802).", 
-    "This is a data test string (pass 803).", 
-    "This is a data test string (pass 804).", 
-    "This is a data test string (pass 805).", 
-    "This is a data test string (pass 806).", 
-    "This is a data test string (pass 807).", 
-    "This is a data test string (pass 808).", 
-    "This is a data test string (pass 809).",
-  "This is a data test string (pass 810).", 
-    "This is a data test string (pass 811).", 
-    "This is a data test string (pass 812).", 
-    "This is a data test string (pass 813).", 
-    "This is a data test string (pass 814).", 
-    "This is a data test string (pass 815).", 
-    "This is a data test string (pass 816).", 
-    "This is a data test string (pass 817).", 
-    "This is a data test string (pass 818).", 
-    "This is a data test string (pass 819).",
-  "This is a data test string (pass 820).", 
-    "This is a data test string (pass 821).", 
-    "This is a data test string (pass 822).", 
-    "This is a data test string (pass 823).", 
-    "This is a data test string (pass 824).", 
-    "This is a data test string (pass 825).", 
-    "This is a data test string (pass 826).", 
-    "This is a data test string (pass 827).", 
-    "This is a data test string (pass 828).", 
-    "This is a data test string (pass 829).",
-  "This is a data test string (pass 830).", 
-    "This is a data test string (pass 831).", 
-    "This is a data test string (pass 832).", 
-    "This is a data test string (pass 833).", 
-    "This is a data test string (pass 834).", 
-    "This is a data test string (pass 835).", 
-    "This is a data test string (pass 836).", 
-    "This is a data test string (pass 837).", 
-    "This is a data test string (pass 838).", 
-    "This is a data test string (pass 839).",
-  "This is a data test string (pass 840).", 
-    "This is a data test string (pass 841).", 
-    "This is a data test string (pass 842).", 
-    "This is a data test string (pass 843).", 
-    "This is a data test string (pass 844).", 
-    "This is a data test string (pass 845).", 
-    "This is a data test string (pass 846).", 
-    "This is a data test string (pass 847).", 
-    "This is a data test string (pass 848).", 
-    "This is a data test string (pass 849).",
-  "This is a data test string (pass 850).", 
-    "This is a data test string (pass 851).", 
-    "This is a data test string (pass 852).", 
-    "This is a data test string (pass 853).", 
-    "This is a data test string (pass 854).", 
-    "This is a data test string (pass 855).", 
-    "This is a data test string (pass 856).", 
-    "This is a data test string (pass 857).", 
-    "This is a data test string (pass 858).", 
-    "This is a data test string (pass 859).",
-  "This is a data test string (pass 860).", 
-    "This is a data test string (pass 861).", 
-    "This is a data test string (pass 862).", 
-    "This is a data test string (pass 863).", 
-    "This is a data test string (pass 864).", 
-    "This is a data test string (pass 865).", 
-    "This is a data test string (pass 866).", 
-    "This is a data test string (pass 867).", 
-    "This is a data test string (pass 868).", 
-    "This is a data test string (pass 869).",
-  "This is a data test string (pass 870).", 
-    "This is a data test string (pass 871).", 
-    "This is a data test string (pass 872).", 
-    "This is a data test string (pass 873).", 
-    "This is a data test string (pass 874).", 
-    "This is a data test string (pass 875).", 
-    "This is a data test string (pass 876).", 
-    "This is a data test string (pass 877).", 
-    "This is a data test string (pass 878).", 
-    "This is a data test string (pass 879).",
-  "This is a data test string (pass 880).", 
-    "This is a data test string (pass 881).", 
-    "This is a data test string (pass 882).", 
-    "This is a data test string (pass 883).", 
-    "This is a data test string (pass 884).", 
-    "This is a data test string (pass 885).", 
-    "This is a data test string (pass 886).", 
-    "This is a data test string (pass 887).", 
-    "This is a data test string (pass 888).", 
-    "This is a data test string (pass 889).",
-  "This is a data test string (pass 890).", 
-    "This is a data test string (pass 891).", 
-    "This is a data test string (pass 892).", 
-    "This is a data test string (pass 893).", 
-    "This is a data test string (pass 894).", 
-    "This is a data test string (pass 895).", 
-    "This is a data test string (pass 896).", 
-    "This is a data test string (pass 897).", 
-    "This is a data test string (pass 898).", 
-    "This is a data test string (pass 899).",
-  "This is a data test string (pass 900).", 
-    "This is a data test string (pass 901).", 
-    "This is a data test string (pass 902).", 
-    "This is a data test string (pass 903).", 
-    "This is a data test string (pass 904).", 
-    "This is a data test string (pass 905).", 
-    "This is a data test string (pass 906).", 
-    "This is a data test string (pass 907).", 
-    "This is a data test string (pass 908).", 
-    "This is a data test string (pass 909).",
-  "This is a data test string (pass 910).", 
-    "This is a data test string (pass 911).", 
-    "This is a data test string (pass 912).", 
-    "This is a data test string (pass 913).", 
-    "This is a data test string (pass 914).", 
-    "This is a data test string (pass 915).", 
-    "This is a data test string (pass 916).", 
-    "This is a data test string (pass 917).", 
-    "This is a data test string (pass 918).", 
-    "This is a data test string (pass 919).",
-  "This is a data test string (pass 920).", 
-    "This is a data test string (pass 921).", 
-    "This is a data test string (pass 922).", 
-    "This is a data test string (pass 923).", 
-    "This is a data test string (pass 924).", 
-    "This is a data test string (pass 925).", 
-    "This is a data test string (pass 926).", 
-    "This is a data test string (pass 927).", 
-    "This is a data test string (pass 928).", 
-    "This is a data test string (pass 929).",
-  "This is a data test string (pass 930).", 
-    "This is a data test string (pass 931).", 
-    "This is a data test string (pass 932).", 
-    "This is a data test string (pass 933).", 
-    "This is a data test string (pass 934).", 
-    "This is a data test string (pass 935).", 
-    "This is a data test string (pass 936).", 
-    "This is a data test string (pass 937).", 
-    "This is a data test string (pass 938).", 
-    "This is a data test string (pass 939).",
-  "This is a data test string (pass 940).", 
-    "This is a data test string (pass 941).", 
-    "This is a data test string (pass 942).", 
-    "This is a data test string (pass 943).", 
-    "This is a data test string (pass 944).", 
-    "This is a data test string (pass 945).", 
-    "This is a data test string (pass 946).", 
-    "This is a data test string (pass 947).", 
-    "This is a data test string (pass 948).", 
-    "This is a data test string (pass 949).",
-  "This is a data test string (pass 950).", 
-    "This is a data test string (pass 951).", 
-    "This is a data test string (pass 952).", 
-    "This is a data test string (pass 953).", 
-    "This is a data test string (pass 954).", 
-    "This is a data test string (pass 955).", 
-    "This is a data test string (pass 956).", 
-    "This is a data test string (pass 957).", 
-    "This is a data test string (pass 958).", 
-    "This is a data test string (pass 959).",
-  "This is a data test string (pass 960).", 
-    "This is a data test string (pass 961).", 
-    "This is a data test string (pass 962).", 
-    "This is a data test string (pass 963).", 
-    "This is a data test string (pass 964).", 
-    "This is a data test string (pass 965).", 
-    "This is a data test string (pass 966).", 
-    "This is a data test string (pass 967).", 
-    "This is a data test string (pass 968).", 
-    "This is a data test string (pass 969).",
-  "This is a data test string (pass 970).", 
-    "This is a data test string (pass 971).", 
-    "This is a data test string (pass 972).", 
-    "This is a data test string (pass 973).", 
-    "This is a data test string (pass 974).", 
-    "This is a data test string (pass 975).", 
-    "This is a data test string (pass 976).", 
-    "This is a data test string (pass 977).", 
-    "This is a data test string (pass 978).", 
-    "This is a data test string (pass 979).",
-  "This is a data test string (pass 980).", 
-    "This is a data test string (pass 981).", 
-    "This is a data test string (pass 982).", 
-    "This is a data test string (pass 983).", 
-    "This is a data test string (pass 984).", 
-    "This is a data test string (pass 985).", 
-    "This is a data test string (pass 986).", 
-    "This is a data test string (pass 987).", 
-    "This is a data test string (pass 988).", 
-    "This is a data test string (pass 989).",
-  "This is a data test string (pass 990).", 
-    "This is a data test string (pass 991).", 
-    "This is a data test string (pass 992).", 
-    "This is a data test string (pass 993).", 
-    "This is a data test string (pass 994).", 
-    "This is a data test string (pass 995).", 
-    "This is a data test string (pass 996).", 
-    "This is a data test string (pass 997).", 
-    "This is a data test string (pass 998).", 
-    "This is a data test string (pass 999).",
-  "This is a data test string (pass 1000).", 
-    "This is a data test string (pass 1001).", 
-    "This is a data test string (pass 1002).", 
-    "This is a data test string (pass 1003).", 
-    "This is a data test string (pass 1004).", 
-    "This is a data test string (pass 1005).", 
-    "This is a data test string (pass 1006).", 
-    "This is a data test string (pass 1007).", 
-    "This is a data test string (pass 1008).", 
-    "This is a data test string (pass 1009).",
-  "This is a data test string (pass 1010).", 
-    "This is a data test string (pass 1011).", 
-    "This is a data test string (pass 1012).", 
-    "This is a data test string (pass 1013).", 
-    "This is a data test string (pass 1014).", 
-    "This is a data test string (pass 1015).", 
-    "This is a data test string (pass 1016).", 
-    "This is a data test string (pass 1017).", 
-    "This is a data test string (pass 1018).", 
-    "This is a data test string (pass 1019).",
-  "This is a data test string (pass 1020).", 
-    "This is a data test string (pass 1021).", 
-    "This is a data test string (pass 1022).", 
-    "This is a data test string (pass 1023).", 
-    "This is a data test string (pass 1024).", 
-    "This is a data test string (pass 1025).", 
-    "This is a data test string (pass 1026).", 
-    "This is a data test string (pass 1027).", 
-    "This is a data test string (pass 1028).", 
-    "This is a data test string (pass 1029).",
-  "This is a data test string (pass 1030).", 
-    "This is a data test string (pass 1031).", 
-    "This is a data test string (pass 1032).", 
-    "This is a data test string (pass 1033).", 
-    "This is a data test string (pass 1034).", 
-    "This is a data test string (pass 1035).", 
-    "This is a data test string (pass 1036).", 
-    "This is a data test string (pass 1037).", 
-    "This is a data test string (pass 1038).", 
-    "This is a data test string (pass 1039).",
-  "This is a data test string (pass 1040).", 
-    "This is a data test string (pass 1041).", 
-    "This is a data test string (pass 1042).", 
-    "This is a data test string (pass 1043).", 
-    "This is a data test string (pass 1044).", 
-    "This is a data test string (pass 1045).", 
-    "This is a data test string (pass 1046).", 
-    "This is a data test string (pass 1047).", 
-    "This is a data test string (pass 1048).", 
-    "This is a data test string (pass 1049).",
-  "This is a data test string (pass 1050).", 
-    "This is a data test string (pass 1051).", 
-    "This is a data test string (pass 1052).", 
-    "This is a data test string (pass 1053).", 
-    "This is a data test string (pass 1054).", 
-    "This is a data test string (pass 1055).", 
-    "This is a data test string (pass 1056).", 
-    "This is a data test string (pass 1057).", 
-    "This is a data test string (pass 1058).", 
-    "This is a data test string (pass 1059).",
-  "This is a data test string (pass 1060).", 
-    "This is a data test string (pass 1061).", 
-    "This is a data test string (pass 1062).", 
-    "This is a data test string (pass 1063).", 
-    "This is a data test string (pass 1064).", 
-    "This is a data test string (pass 1065).", 
-    "This is a data test string (pass 1066).", 
-    "This is a data test string (pass 1067).", 
-    "This is a data test string (pass 1068).", 
-    "This is a data test string (pass 1069).",
-  "This is a data test string (pass 1070).", 
-    "This is a data test string (pass 1071).", 
-    "This is a data test string (pass 1072).", 
-    "This is a data test string (pass 1073).", 
-    "This is a data test string (pass 1074).", 
-    "This is a data test string (pass 1075).", 
-    "This is a data test string (pass 1076).", 
-    "This is a data test string (pass 1077).", 
-    "This is a data test string (pass 1078).", 
-    "This is a data test string (pass 1079).",
-  "This is a data test string (pass 1080).", 
-    "This is a data test string (pass 1081).", 
-    "This is a data test string (pass 1082).", 
-    "This is a data test string (pass 1083).", 
-    "This is a data test string (pass 1084).", 
-    "This is a data test string (pass 1085).", 
-    "This is a data test string (pass 1086).", 
-    "This is a data test string (pass 1087).", 
-    "This is a data test string (pass 1088).", 
-    "This is a data test string (pass 1089).",
-  "This is a data test string (pass 1090).", 
-    "This is a data test string (pass 1091).", 
-    "This is a data test string (pass 1092).", 
-    "This is a data test string (pass 1093).", 
-    "This is a data test string (pass 1094).", 
-    "This is a data test string (pass 1095).", 
-    "This is a data test string (pass 1096).", 
-    "This is a data test string (pass 1097).", 
-    "This is a data test string (pass 1098).", 
-    "This is a data test string (pass 1099).",
-  "This is a data test string (pass 1100).", 
-    "This is a data test string (pass 1101).", 
-    "This is a data test string (pass 1102).", 
-    "This is a data test string (pass 1103).", 
-    "This is a data test string (pass 1104).", 
-    "This is a data test string (pass 1105).", 
-    "This is a data test string (pass 1106).", 
-    "This is a data test string (pass 1107).", 
-    "This is a data test string (pass 1108).", 
-    "This is a data test string (pass 1109).",
-  "This is a data test string (pass 1110).", 
-    "This is a data test string (pass 1111).", 
-    "This is a data test string (pass 1112).", 
-    "This is a data test string (pass 1113).", 
-    "This is a data test string (pass 1114).", 
-    "This is a data test string (pass 1115).", 
-    "This is a data test string (pass 1116).", 
-    "This is a data test string (pass 1117).", 
-    "This is a data test string (pass 1118).", 
-    "This is a data test string (pass 1119)." ;
-
- u =
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org",
-  "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", 
-    "http://www.dods.org" ;
-}
diff --git a/ncdap_test/nocacheremote4/test.04.1.dmp b/ncdap_test/nocacheremote4/test.04.1.dmp
deleted file mode 100644
index 81702b7..0000000
--- a/ncdap_test/nocacheremote4/test.04.1.dmp
+++ /dev/null
@@ -1,11 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    int i32 ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = {1} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.04.dmp b/ncdap_test/nocacheremote4/test.04.dmp
deleted file mode 100644
index c5d9c9c..0000000
--- a/ncdap_test/nocacheremote4/test.04.dmp
+++ /dev/null
@@ -1,20 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = 
-    {0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.05.1.dmp b/ncdap_test/nocacheremote4/test.05.1.dmp
deleted file mode 100644
index 7fdb8df..0000000
--- a/ncdap_test/nocacheremote4/test.05.1.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound floats_t {
-    float f32 ;
-  }; // floats_t
-  compound types_t {
-    floats_t floats ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = {{0}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.05.dmp b/ncdap_test/nocacheremote4/test.05.dmp
deleted file mode 100644
index 5449e8e..0000000
--- a/ncdap_test/nocacheremote4/test.05.dmp
+++ /dev/null
@@ -1,29 +0,0 @@
-netcdf test {
-types:
-  compound integers_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-  }; // integers_t
-  compound floats_t {
-    float f32 ;
-    double f64 ;
-  }; // floats_t
-  compound strings_t {
-    string s ;
-    string u ;
-  }; // strings_t
-  compound types_t {
-    integers_t integers ;
-    floats_t floats ;
-    strings_t strings ;
-  }; // types_t
-variables:
-	types_t types ;
-data:
-
- types = 
-    {{0, 1, 0, 0, 0}, {0, 1000}, {"This is a data test string (pass 0).", "http://www.dods.org"}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.06.1.dmp b/ncdap_test/nocacheremote4/test.06.1.dmp
deleted file mode 100644
index ba5ac60..0000000
--- a/ncdap_test/nocacheremote4/test.06.1.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf test {
-types:
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-variables:
-	ThreeD_t ThreeD ;
-data:
-
- ThreeD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 0.983843692788121, 0.98200423511727, 0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 0.968912421710645, 0.966389978 [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.06.dmp b/ncdap_test/nocacheremote4/test.06.dmp
deleted file mode 100644
index 4f5275a..0000000
--- a/ncdap_test/nocacheremote4/test.06.dmp
+++ /dev/null
@@ -1,43 +0,0 @@
-netcdf test {
-types:
-  compound OneD_t {
-    double amp(10) ;
-    double x(10) ;
-  }; // OneD_t
-  compound TwoD_t {
-    double amp(10, 10) ;
-    double x(10) ;
-    double y(10) ;
-  }; // TwoD_t
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound FourD_t {
-    double tamp(10, 10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-    double t(10) ;
-  }; // FourD_t
-variables:
-	OneD_t OneD ;
-	TwoD_t TwoD ;
-	ThreeD_t ThreeD ;
-	FourD_t FourD ;
-data:
-
- OneD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}} ;
-
- TwoD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 0.983843692788121, 0.98200423511727, 0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 0.968912421710645, 0.966389978 [...]
-
- ThreeD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 0.983843692788121, 0.98200423511727, 0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 0.968912421710645, 0.966389978 [...]
-
- FourD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042, 0.987227283375627, 0.985584766909561, 0.983843692788121, 0.98200423511727, 0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 0.97133797485203, 0.968912421710645, 0.966389978 [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.06a.dmp b/ncdap_test/nocacheremote4/test.06a.dmp
deleted file mode 100644
index a5177b3..0000000
--- a/ncdap_test/nocacheremote4/test.06a.dmp
+++ /dev/null
@@ -1,13 +0,0 @@
-netcdf test {
-types:
-  compound OneD_t {
-    double amp(10) ;
-    double x(10) ;
-  }; // OneD_t
-variables:
-	OneD_t OneD ;
-data:
-
- OneD = 
-    {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.07.1.dmp b/ncdap_test/nocacheremote4/test.07.1.dmp
deleted file mode 100644
index be5c4f2..0000000
--- a/ncdap_test/nocacheremote4/test.07.1.dmp
+++ /dev/null
@@ -1,9 +0,0 @@
-netcdf test {
-types:
-  int(*) person_t ;
-variables:
-	person_t person ;
-data:
-
- person = {1, 2, 3, 5, 8} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.07.2.dmp b/ncdap_test/nocacheremote4/test.07.2.dmp
deleted file mode 100644
index 08e56f9..0000000
--- a/ncdap_test/nocacheremote4/test.07.2.dmp
+++ /dev/null
@@ -1,29 +0,0 @@
-netcdf test {
-types:
-  compound person_record_t {
-    string name ;
-    int age ;
-  }; // person_record_t
-  person_record_t(*) person_t ;
-  compound types_record_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_record_t
-  types_record_t(*) types_t ;
-variables:
-	person_t person ;
-	types_t types ;
-data:
-
- person = 
-    {{"This is a data test string (pass 2).", 3}, {"This is a data test string (pass 3).", 5}, {"This is a data test string (pass 4).", 8}} ;
-
- types = {} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.07.3.dmp b/ncdap_test/nocacheremote4/test.07.3.dmp
deleted file mode 100644
index 5511e57..0000000
--- a/ncdap_test/nocacheremote4/test.07.3.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound person_record_t {
-    string name ;
-    int age ;
-  }; // person_record_t
-  person_record_t(*) person_t ;
-variables:
-	person_t person ;
-data:
-
- person = 
-    {{"This is a data test string (pass 0).", 1}, {"This is a data test string (pass 1).", 2}, {"This is a data test string (pass 2).", 3}, {"This is a data test string (pass 3).", 5}, {"This is a data test string (pass 4).", 8}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.07.4.dmp b/ncdap_test/nocacheremote4/test.07.4.dmp
deleted file mode 100644
index 6b14958..0000000
--- a/ncdap_test/nocacheremote4/test.07.4.dmp
+++ /dev/null
@@ -1,9 +0,0 @@
-netcdf test {
-types:
-  float(*) types_t ;
-variables:
-	types_t types ;
-data:
-
- types = {0, 0.9999833, 1.999867, 2.99955, 3.998933} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.07.dmp b/ncdap_test/nocacheremote4/test.07.dmp
deleted file mode 100644
index 92b4c4f..0000000
--- a/ncdap_test/nocacheremote4/test.07.dmp
+++ /dev/null
@@ -1,30 +0,0 @@
-netcdf test {
-types:
-  compound person_record_t {
-    string name ;
-    int age ;
-  }; // person_record_t
-  person_record_t(*) person_t ;
-  compound types_record_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_record_t
-  types_record_t(*) types_t ;
-variables:
-	person_t person ;
-	types_t types ;
-data:
-
- person = 
-    {{"This is a data test string (pass 0).", 1}, {"This is a data test string (pass 1).", 2}, {"This is a data test string (pass 2).", 3}, {"This is a data test string (pass 3).", 5}, {"This is a data test string (pass 4).", 8}} ;
-
- types = 
-    {{0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"}, {1, 2, 2, 16, 65520, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", "http://www.dods.org"}, {2, 3, 6, 32, 65504, 1.999867, 999.800006666578, "This is a data test string (pass 2).", "http://www.dods.org"}, {3, 5, 12, 48, 65488, 2.99955, 999.550033748988, "This is a data test string (pass 3).", "http://www.dods.org"}, {4, 8, 20, 64, 65472, 3.998933, 999.200106660978, "This is [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.07a.dmp b/ncdap_test/nocacheremote4/test.07a.dmp
deleted file mode 100644
index 5164819..0000000
--- a/ncdap_test/nocacheremote4/test.07a.dmp
+++ /dev/null
@@ -1,19 +0,0 @@
-netcdf test {
-types:
-  compound person1_t {
-    string name ;
-    int age ;
-  }; // person1_t
-  compound person2_t {
-    string name ;
-    int age ;
-  }; // person2_t
-variables:
-	person1_t person1 ;
-	person2_t person2 ;
-data:
-
- person1 = {"This is a data test string (pass 0).", 1} ;
-
- person2 = {"This is a data test string (pass 0).", 1} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.21.dmp b/ncdap_test/nocacheremote4/test.21.dmp
deleted file mode 100644
index ffa508d..0000000
--- a/ncdap_test/nocacheremote4/test.21.dmp
+++ /dev/null
@@ -1,15 +0,0 @@
-netcdf test {
-types:
-  compound exp_t {
-    int j ;
-    int i ;
-    short g(3, 3, 3) ;
-    short f(2, 2) ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, 2, {0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656}, {0, 256, 512, 768}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.22.dmp b/ncdap_test/nocacheremote4/test.22.dmp
deleted file mode 100644
index 87e35fc..0000000
--- a/ncdap_test/nocacheremote4/test.22.dmp
+++ /dev/null
@@ -1,25 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994, 0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 0.990215996212637, 0.988771077936042 [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.23.dmp b/ncdap_test/nocacheremote4/test.23.dmp
deleted file mode 100644
index 19740d6..0000000
--- a/ncdap_test/nocacheremote4/test.23.dmp
+++ /dev/null
@@ -1,36 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound profile_t {
-    double fluor(10) ;
-    double depth(10) ;
-  }; // profile_t
-  compound ComplexSequence_record_t {
-    data_t data ;
-    float lat ;
-    float lng ;
-    profile_t profile ;
-  }; // ComplexSequence_record_t
-  ComplexSequence_record_t(*) ComplexSequence_t ;
-  compound ThreeD_t {
-    double amp(10, 10, 10) ;
-    double x(10) ;
-    double y(10) ;
-    double z(10) ;
-  }; // ThreeD_t
-  compound exp_t {
-    int j ;
-    int i(3) ;
-    ComplexSequence_t ComplexSequence ;
-    ThreeD_t ThreeD ;
-  }; // exp_t
-variables:
-	exp_t exp ;
-data:
-
- exp = 
-    {1, {0, 2048, 4096}, {{{2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, 0, 0.9999833, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.9987502603949 [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.31.dmp b/ncdap_test/nocacheremote4/test.31.dmp
deleted file mode 100644
index 77c20d3..0000000
--- a/ncdap_test/nocacheremote4/test.31.dmp
+++ /dev/null
@@ -1,24 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(2, 5) ;
-  }; // data_t
-  compound profile_t {
-    double fluor(10) ;
-    double depth(10) ;
-  }; // profile_t
-  compound CS01_record_t {
-    data_t data ;
-    float lat ;
-    float lng ;
-    profile_t profile ;
-  }; // CS01_record_t
-  CS01_record_t(*) CS01_t ;
-variables:
-	CS01_t CS01 ;
-data:
-
- CS01 = 
-    {{{1, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}, 0, 0.9999833, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204 [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.32.dmp b/ncdap_test/nocacheremote4/test.32.dmp
deleted file mode 100644
index 062c20a..0000000
--- a/ncdap_test/nocacheremote4/test.32.dmp
+++ /dev/null
@@ -1,27 +0,0 @@
-netcdf test {
-types:
-  compound station_t {
-    double windW(10) ;
-    double windN(10) ;
-    string name ;
-  }; // station_t
-  compound profile_t {
-    double fluor(10, 10, 10) ;
-    double lat(10) ;
-    double lon(10) ;
-    double depth(10) ;
-  }; // profile_t
-  compound CS02_record_t {
-    station_t station ;
-    profile_t profile ;
-    float sst ;
-    float light ;
-  }; // CS02_record_t
-  CS02_record_t(*) CS02_t ;
-variables:
-	CS02_t CS02 ;
-data:
-
- CS02 = 
-    {{{{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}, "This is a data test string (pass 0)."}, {{1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.99875026039 [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.50.dmp b/ncdap_test/nocacheremote4/test.50.dmp
deleted file mode 100644
index 80e7cc6..0000000
--- a/ncdap_test/nocacheremote4/test.50.dmp
+++ /dev/null
@@ -1,31 +0,0 @@
-netcdf test {
-types:
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ushort ui16 ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u ;
-  }; // types_t
-dimensions:
-	types_0 = 10 ;
-variables:
-	types_t types(types_0) ;
-data:
-
- types = 
-    {0, 1, 0, 0, 0, 0, 1000, "This is a data test string (pass 0).", "http://www.dods.org"}, 
-    {1, 2, 2, 16, 65520, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", "http://www.dods.org"}, 
-    {2, 3, 6, 32, 65504, 1.999867, 999.800006666578, "This is a data test string (pass 2).", "http://www.dods.org"}, 
-    {3, 5, 12, 48, 65488, 2.99955, 999.550033748988, "This is a data test string (pass 3).", "http://www.dods.org"}, 
-    {4, 8, 20, 64, 65472, 3.998933, 999.200106660978, "This is a data test string (pass 4).", "http://www.dods.org"}, 
-    {5, 13, 30, 80, 65456, 4.997917, 998.750260394966, "This is a data test string (pass 5).", "http://www.dods.org"}, 
-    {6, 21, 42, 96, 65440, 5.996401, 998.200539935204, "This is a data test string (pass 6).", "http://www.dods.org"}, 
-    {7, 34, 56, 112, 65424, 6.994285, 997.55100025328, "This is a data test string (pass 7).", "http://www.dods.org"}, 
-    {8, 55, 72, 128, 65408, 7.991469, 996.801706302619, "This is a data test string (pass 8).", "http://www.dods.org"}, 
-    {9, 89, 90, 144, 65392, 8.987855, 995.952733011994, "This is a data test string (pass 9).", "http://www.dods.org"} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.53.dmp b/ncdap_test/nocacheremote4/test.53.dmp
deleted file mode 100644
index cc0c9be..0000000
--- a/ncdap_test/nocacheremote4/test.53.dmp
+++ /dev/null
@@ -1,34 +0,0 @@
-netcdf test {
-types:
-  compound ss_t {
-    ushort ui16(10) ;
-    float f32 ;
-    double f64 ;
-    string s ;
-    string u(5) ;
-  }; // ss_t
-  compound types_t {
-    ubyte b ;
-    int i32 ;
-    uint ui32 ;
-    short i16 ;
-    ss_t ss ;
-  }; // types_t
-dimensions:
-	types_0 = 10 ;
-variables:
-	types_t types(types_0) ;
-data:
-
- types = 
-    {0, 1, 0, 0, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 0, 1000, "This is a data test string (pass 0).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {1, 2, 2, 16, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 0.9999833, 999.950000416665, "This is a data test string (pass 1).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {2, 3, 6, 32, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 1.999867, 999.800006666578, "This is a data test string (pass 2).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {3, 5, 12, 48, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 2.99955, 999.550033748988, "This is a data test string (pass 3).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {4, 8, 20, 64, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 3.998933, 999.200106660978, "This is a data test string (pass 4).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {5, 13, 30, 80, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 4.997917, 998.750260394966, "This is a data test string (pass 5).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {6, 21, 42, 96, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 5.996401, 998.200539935204, "This is a data test string (pass 6).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {7, 34, 56, 112, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 6.994285, 997.55100025328, "This is a data test string (pass 7).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {8, 55, 72, 128, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 7.991469, 996.801706302619, "This is a data test string (pass 8).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}}, 
-    {9, 89, 90, 144, {{0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216}, 8.987855, 995.952733011994, "This is a data test string (pass 9).", {"http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org", "http://www.dods.org"}}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.55.dmp b/ncdap_test/nocacheremote4/test.55.dmp
deleted file mode 100644
index 72fb308..0000000
--- a/ncdap_test/nocacheremote4/test.55.dmp
+++ /dev/null
@@ -1,23 +0,0 @@
-netcdf test {
-types:
-  compound data_t {
-    int i ;
-    double f(10) ;
-  }; // data_t
-  compound foo_t {
-    int j ;
-    int i(3) ;
-    data_t data ;
-  }; // foo_t
-  compound ralph_record_t {
-    ubyte b ;
-    foo_t foo ;
-  }; // ralph_record_t
-  ralph_record_t(*) ralph_t ;
-variables:
-	ralph_t ralph ;
-data:
-
- ralph = 
-    {{0, {1, {0, 2048, 4096}, {2, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}}}, {1, {3, {0, 2048, 4096}, {5, {1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 0.999200106660978, 0.998750260394966, 0.998200539935204, 0.99755100025328, 0.996801706302619, 0.995952733011994}}}}, {2, {8, {0, 2048, 4096}, {13, {1, 0.999950000416665, 0.999800006666578, 0 [...]
-}
diff --git a/ncdap_test/nocacheremote4/test.56.dmp b/ncdap_test/nocacheremote4/test.56.dmp
deleted file mode 100644
index c674e11..0000000
--- a/ncdap_test/nocacheremote4/test.56.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound foo_record_t {
-    ubyte b(10) ;
-    int i(10) ;
-  }; // foo_record_t
-  foo_record_t(*) foo_t ;
-variables:
-	foo_t foo ;
-data:
-
- foo = 
-    {{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.57.dmp b/ncdap_test/nocacheremote4/test.57.dmp
deleted file mode 100644
index c674e11..0000000
--- a/ncdap_test/nocacheremote4/test.57.dmp
+++ /dev/null
@@ -1,14 +0,0 @@
-netcdf test {
-types:
-  compound foo_record_t {
-    ubyte b(10) ;
-    int i(10) ;
-  }; // foo_record_t
-  foo_record_t(*) foo_t ;
-variables:
-	foo_t foo ;
-data:
-
- foo = 
-    {{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}, {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432}}} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.66.dmp b/ncdap_test/nocacheremote4/test.66.dmp
deleted file mode 100644
index 21586ea..0000000
--- a/ncdap_test/nocacheremote4/test.66.dmp
+++ /dev/null
@@ -1,42 +0,0 @@
-netcdf test {
-types:
-  compound long_names_one_t {
-    int long_one ;
-    int long_two ;
-    int long_three ;
-    int long_four ;
-    int long_five ;
-    int long_six ;
-    double long_one_float ;
-    double long_two_float ;
-    double long_three_float ;
-  }; // long_names_one_t
-  compound long_names_one_and_a_half_t {
-    int long_one_float1 ;
-    int long_two_float1 ;
-    int long_three_float3 ;
-    int long_four ;
-    int long_five ;
-    int long_six ;
-    double long_one_float ;
-    double long_two_float ;
-    double long_three_float ;
-  }; // long_names_one_and_a_half_t
-  compound long_names_two_t {
-    int a_very_long_name_given_what_it_accomplishes ;
-    int another_name_nearly_as_pointless ;
-  }; // long_names_two_t
-variables:
-	long_names_one_t long_names_one ;
-	long_names_one_and_a_half_t long_names_one_and_a_half ;
-	long_names_two_t long_names_two ;
-data:
-
- long_names_one = 
-    {1, 2, 3, 5, 8, 13, 1000, 999.950000416665, 999.800006666578} ;
-
- long_names_one_and_a_half = 
-    {1, 2, 3, 5, 8, 13, 1000, 999.950000416665, 999.800006666578} ;
-
- long_names_two = {1, 2} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.67.dmp b/ncdap_test/nocacheremote4/test.67.dmp
deleted file mode 100644
index 04f0fc4..0000000
--- a/ncdap_test/nocacheremote4/test.67.dmp
+++ /dev/null
@@ -1,78 +0,0 @@
-netcdf test {
-dimensions:
-	latitude = 20 ;
-	longitude = 10 ;
-variables:
-	int i ;
-	double f(latitude, longitude) ;
-data:
-
- i = 1 ;
-
- f =
-  1, 0.999950000416665, 0.999800006666578, 0.999550033748988, 
-    0.999200106660978, 0.998750260394966, 0.998200539935204, 
-    0.99755100025328, 0.996801706302619, 0.995952733011994,
-  0.995004165278026, 0.993956097956697, 0.992808635853866, 0.991561893714788, 
-    0.990215996212637, 0.988771077936042, 0.987227283375627, 
-    0.985584766909561, 0.983843692788121, 0.98200423511727,
-  0.980066577841242, 0.978030914724148, 0.975897449330606, 0.973666395005375, 
-    0.97133797485203, 0.968912421710645, 0.966389978134513, 
-    0.963770896365891, 0.961055438310771, 0.958243875512697,
-  0.955336489125606, 0.952333569885713, 0.949235418082441, 0.946042343528387, 
-    0.942754665528346, 0.939372712847379, 0.935896823677935, 
-    0.932327345606034, 0.92866463557651, 0.924909059857313,
-  0.921060994002885, 0.917120822816605, 0.913088940312308, 0.908965749674885, 
-    0.904751663219963, 0.900447102352677, 0.896052497525525, 
-    0.891568288195329, 0.886994922779284, 0.882332858610121,
-  0.877582561890373, 0.872744507645751, 0.86781917967765, 0.862807070514761, 
-    0.857708681363824, 0.852524522059506, 0.847255111013416, 
-    0.841900975162269, 0.836462649915187, 0.830940679100164,
-  0.825335614909678, 0.819648017845479, 0.813878456662534, 0.808027508312152, 
-    0.802095757884293, 0.796083798549056, 0.789992231497365, 
-    0.783821665880849, 0.777572718750928, 0.771246014997107,
-  0.764842187284488, 0.758361875990508, 0.751805729140895, 0.74517440234487, 
-    0.738468558729588, 0.731688868873821, 0.724836010740905, 
-    0.717910669610943, 0.710913538012277, 0.703845315652236,
-  0.696706709347165, 0.689498432951747, 0.682221207287614, 0.674875760071267, 
-    0.667462825841308, 0.659983145884982, 0.652437468164052, 
-    0.644826547240001, 0.63715114419858, 0.629412026573697,
-  0.621609968270664, 0.613745749488812, 0.605820156643463, 0.597833982287298, 
-    0.589788025031098, 0.581683089463883, 0.573519986072457, 
-    0.565299531160354, 0.557022546766217, 0.548689860581588,
-  0.54030230586814, 0.531860721374355, 0.52336595125165, 0.514818844969955, 
-    0.506220257232778, 0.497571047891727, 0.488872081860527, 
-    0.480124229028534, 0.47132836417374, 0.462485366875301,
-  0.453596121425577, 0.444661516741707, 0.435682446276712, 0.426659807930157, 
-    0.417594503958358, 0.408487440884157, 0.399339529406273, 
-    0.39015168430823, 0.380924824366882, 0.371659872260533,
-  0.362357754476674, 0.35301940121933, 0.343645746316047, 0.334237727124503, 
-    0.324796284438776, 0.315322362395269, 0.305816908378289, 
-    0.296280872925319, 0.286715209631956, 0.277120875056558,
-  0.267498828624587, 0.25785003253267, 0.248175451652373, 0.238476053433723, 
-    0.228752807808459, 0.219006687093041, 0.209238665891419, 
-    0.199449720997573, 0.189640831297834, 0.179812977673,
-  0.169967142900241, 0.160104311554831, 0.150225469911686, 0.140331605846737, 
-    0.130423708738146, 0.120502769367367, 0.11056977982007, 
-    0.100625733386932, 0.0906716244643097, 0.0807084484548006,
-  0.0707372016677029, 0.0607588812193859, 0.0507744849335792, 
-    0.040785011241591, 0.0307914590824661, 0.0207948278030924, 
-    0.0107961170582674, 0.000796326710733263, -0.00920354326880834, 
-    -0.0192024929016926,
-  -0.0291995223012888, -0.0391936317729877, -0.0491838219141706, 
-    -0.0591690937141481, -0.0691484486540619, -0.0791208888067339, 
-    -0.089085416936459, -0.099041036598728, -0.108986752239871, 
-    -0.118921569296612,
-  -0.128844494295525, -0.138754534952378, -0.148650700271364, 
-    -0.158532000644198, -0.168397447949077, -0.178246055649492, 
-    -0.18807683889288, -0.197888814609109, -0.207681001608784, 
-    -0.217452420681365,
-  -0.227202094693087, -0.236929048684675, -0.246632309968834, 
-    -0.256310908227523, -0.26596387560898, -0.275590246824513, 
-    -0.285189059245021, -0.294759352997261, -0.304300171059833, 
-    -0.313810559358882,
-  -0.323289566863503, -0.332736245680845, -0.342149651150898, 
-    -0.35152884194096, -0.360872880139767, -0.370180831351287, 
-    -0.379451764788155, -0.388684753364752, -0.397878873789916, 
-    -0.407033206659266 ;
-}
diff --git a/ncdap_test/nocacheremote4/test.68.dmp b/ncdap_test/nocacheremote4/test.68.dmp
deleted file mode 100644
index a6e0536..0000000
--- a/ncdap_test/nocacheremote4/test.68.dmp
+++ /dev/null
@@ -1,2 +0,0 @@
-netcdf test {
-}
diff --git a/ncdap_test/nocacheremote4/test.69.dmp b/ncdap_test/nocacheremote4/test.69.dmp
deleted file mode 100644
index 3b61d54..0000000
--- a/ncdap_test/nocacheremote4/test.69.dmp
+++ /dev/null
@@ -1,401 +0,0 @@
-netcdf test {
-types:
-  compound exp_t {
-    int j ;
-    int i ;
-  }; // exp_t
-dimensions:
-	f_0 = 17 ;
-	f_1 = 121 ;
-	i_0 = 10 ;
-	i_1 = 20 ;
-variables:
-	int i(i_0, i_1) ;
-	float f(f_0, f_1) ;
-	exp_t exp ;
-data:
-
- i =
-  0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 
-    24576, 26624, 28672, 30720, 32768, 34816, 36864, 38912,
-  40960, 43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 
-    61440, 63488, 65536, 67584, 69632, 71680, 73728, 75776, 77824, 79872,
-  81920, 83968, 86016, 88064, 90112, 92160, 94208, 96256, 98304, 100352, 
-    102400, 104448, 106496, 108544, 110592, 112640, 114688, 116736, 118784, 
-    120832,
-  122880, 124928, 126976, 129024, 131072, 133120, 135168, 137216, 139264, 
-    141312, 143360, 145408, 147456, 149504, 151552, 153600, 155648, 157696, 
-    159744, 161792,
-  163840, 165888, 167936, 169984, 172032, 174080, 176128, 178176, 180224, 
-    182272, 184320, 186368, 188416, 190464, 192512, 194560, 196608, 198656, 
-    200704, 202752,
-  204800, 206848, 208896, 210944, 212992, 215040, 217088, 219136, 221184, 
-    223232, 225280, 227328, 229376, 231424, 233472, 235520, 237568, 239616, 
-    241664, 243712,
-  245760, 247808, 249856, 251904, 253952, 256000, 258048, 260096, 262144, 
-    264192, 266240, 268288, 270336, 272384, 274432, 276480, 278528, 280576, 
-    282624, 284672,
-  286720, 288768, 290816, 292864, 294912, 296960, 299008, 301056, 303104, 
-    305152, 307200, 309248, 311296, 313344, 315392, 317440, 319488, 321536, 
-    323584, 325632,
-  327680, 329728, 331776, 333824, 335872, 337920, 339968, 342016, 344064, 
-    346112, 348160, 350208, 352256, 354304, 356352, 358400, 360448, 362496, 
-    364544, 366592,
-  368640, 370688, 372736, 374784, 376832, 378880, 380928, 382976, 385024, 
-    387072, 389120, 391168, 393216, 395264, 397312, 399360, 401408, 403456, 
-    405504, 407552 ;
-
- f =
-  0, 0.009999833, 0.01999867, 0.0299955, 0.03998933, 0.04997917, 0.059964, 
-    0.06994285, 0.0799147, 0.08987855, 0.09983341, 0.1097783, 0.1197122, 
-    0.1296341, 0.1395431, 0.1494381, 0.1593182, 0.1691823, 0.1790296, 
-    0.1888589, 0.1986693, 0.2084599, 0.2182296, 0.2279775, 0.2377026, 
-    0.247404, 0.2570806, 0.2667314, 0.2763557, 0.2859522, 0.2955202, 
-    0.3050586, 0.3145666, 0.324043, 0.3334871, 0.3428978, 0.3522742, 
-    0.3616154, 0.3709205, 0.3801884, 0.3894183, 0.3986093, 0.4077604, 
-    0.4168708, 0.4259395, 0.4349655, 0.4439481, 0.4528863, 0.4617792, 
-    0.4706259, 0.4794255, 0.4881772, 0.4968801, 0.5055333, 0.514136, 
-    0.5226873, 0.5311862, 0.539632, 0.5480239, 0.556361, 0.5646425, 
-    0.5728675, 0.5810351, 0.5891448, 0.5971954, 0.6051864, 0.6131169, 
-    0.620986, 0.628793, 0.6365372, 0.6442177, 0.6518338, 0.6593847, 
-    0.6668696, 0.6742879, 0.6816388, 0.6889215, 0.6961352, 0.7032794, 
-    0.7103533, 0.7173561, 0.7242872, 0.7311459, 0.7379314, 0.7446431, 
-    0.7512804, 0.7578425, 0.764329, 0.7707389, 0.7770718, 0.7833269, 
-    0.7895038, 0.7956016, 0.8016199, 0.8075581, 0.8134155, 0.8191916, 
-    0.8248857, 0.8304974, 0.836026, 0.841471, 0.8468319, 0.852108, 0.857299, 
-    0.8624042, 0.8674232, 0.8723555, 0.8772005, 0.8819578, 0.8866269, 
-    0.8912073, 0.8956987, 0.9001005, 0.9044122, 0.9086335, 0.912764, 
-    0.9168031, 0.9207506, 0.924606, 0.928369, 0.9320391,
-  0.935616, 0.9390994, 0.9424888, 0.945784, 0.9489846, 0.9520903, 0.9551008, 
-    0.9580159, 0.960835, 0.9635582, 0.966185, 0.9687151, 0.9711484, 
-    0.9734845, 0.9757234, 0.9778646, 0.979908, 0.9818535, 0.9837008, 
-    0.9854497, 0.9871001, 0.9886518, 0.9901046, 0.9914584, 0.992713, 
-    0.9938684, 0.9949244, 0.9958808, 0.9967378, 0.997495, 0.9981525, 
-    0.9987102, 0.9991679, 0.9995258, 0.9997838, 0.9999417, 0.9999997, 
-    0.9999576, 0.9998156, 0.9995736, 0.9992316, 0.9987897, 0.998248, 
-    0.9976064, 0.996865, 0.996024, 0.9950833, 0.9940432, 0.9929036, 
-    0.9916648, 0.9903268, 0.9888898, 0.9873539, 0.9857192, 0.983986, 
-    0.9821543, 0.9802245, 0.9781966, 0.9760709, 0.9738476, 0.971527, 
-    0.9691091, 0.9665944, 0.963983, 0.9612752, 0.9584713, 0.9555715, 
-    0.9525762, 0.9494856, 0.9463001, 0.9430199, 0.9396455, 0.9361771, 
-    0.932615, 0.9289597, 0.9252115, 0.9213708, 0.917438, 0.9134133, 
-    0.9092974, 0.9050906, 0.9007932, 0.8964058, 0.8919287, 0.8873624, 
-    0.8827074, 0.8779641, 0.873133, 0.8682146, 0.8632094, 0.8581178, 
-    0.8529405, 0.8476778, 0.8423305, 0.8368988, 0.8313835, 0.825785, 
-    0.8201039, 0.8143409, 0.8084964, 0.8025711, 0.7965655, 0.7904802, 
-    0.7843159, 0.7780732, 0.7717527, 0.7653549, 0.7588807, 0.7523306, 
-    0.7457052, 0.7390053, 0.7322314, 0.7253844, 0.7184648, 0.7114733, 
-    0.7044108, 0.6972777, 0.690075, 0.6828032, 0.6754632, 0.6680556,
-  0.6605812, 0.6530408, 0.645435, 0.6377647, 0.6300306, 0.6222336, 0.6143743, 
-    0.6064535, 0.5984721, 0.5904309, 0.5823306, 0.5741721, 0.5659562, 
-    0.5576837, 0.5493554, 0.5409722, 0.5325349, 0.5240443, 0.5155014, 
-    0.5069069, 0.4982616, 0.4895666, 0.4808226, 0.4720306, 0.4631913, 
-    0.4543057, 0.4453746, 0.4363991, 0.4273799, 0.4183179, 0.4092142, 
-    0.4000695, 0.3908848, 0.381661, 0.372399, 0.3630998, 0.3537644, 
-    0.3443935, 0.3349881, 0.3255493, 0.316078, 0.306575, 0.2970414, 0.287478, 
-    0.2778859, 0.2682661, 0.2586193, 0.2489468, 0.2392493, 0.229528, 
-    0.2197836, 0.2100173, 0.20023, 0.1904227, 0.1805963, 0.1707518, 
-    0.1608903, 0.1510127, 0.14112, 0.1312132, 0.1212933, 0.1113612, 0.101418, 
-    0.09146464, 0.08150215, 0.07153151, 0.06155372, 0.05156977, 0.04158066, 
-    0.0315874, 0.02159098, 0.01159239, 0.001592653, -0.008407247, 
-    -0.01840631, -0.02840353, -0.0383979, -0.04838844, -0.05837414, 
-    -0.068354, -0.07832703, -0.08829223, -0.09824859, -0.1081951, -0.1181309, 
-    -0.1280548, -0.1379659, -0.1478632, -0.1577457, -0.1676124, -0.1774624, 
-    -0.1872947, -0.1971082, -0.206902, -0.2166751, -0.2264265, -0.2361553, 
-    -0.2458605, -0.2555411, -0.2651961, -0.2748247, -0.2844257, -0.2939983, 
-    -0.3035415, -0.3130544, -0.3225359, -0.3319852, -0.3414013, -0.3507832, 
-    -0.3601301, -0.369441, -0.3787149, -0.3879509, -0.3971482, -0.4063057, 
-    -0.4154226, -0.424498, -0.4335309, -0.4425204, -0.4514658, -0.4603659,
-  -0.46922, -0.4780273, -0.4867867, -0.4954974, -0.5041586, -0.5127693, 
-    -0.5213288, -0.5298361, -0.5382905, -0.5466911, -0.5550369, -0.5633273, 
-    -0.5715613, -0.5797382, -0.5878571, -0.5959172, -0.6039178, -0.6118579, 
-    -0.6197369, -0.6275538, -0.635308, -0.6429988, -0.6506251, -0.6581865, 
-    -0.665682, -0.673111, -0.6804726, -0.6877661, -0.694991, -0.7021463, 
-    -0.7092314, -0.7162456, -0.7231881, -0.7300584, -0.7368556, -0.7435791, 
-    -0.7502283, -0.7568025, -0.763301, -0.7697231, -0.7760683, -0.7823359, 
-    -0.7885253, -0.7946358, -0.8006668, -0.8066177, -0.8124881, -0.8182771, 
-    -0.8239843, -0.8296092, -0.835151, -0.8406094, -0.8459837, -0.8512734, 
-    -0.856478, -0.8615969, -0.8666297, -0.8715758, -0.8764347, -0.881206, 
-    -0.8858892, -0.8904838, -0.8949894, -0.8994054, -0.9037315, -0.9079673, 
-    -0.9121122, -0.9161659, -0.920128, -0.9239982, -0.9277759, -0.9314608, 
-    -0.9350526, -0.9385508, -0.9419553, -0.9452655, -0.9484812, -0.9516021, 
-    -0.9546278, -0.957558, -0.9603925, -0.963131, -0.965773, -0.9683186, 
-    -0.9707673, -0.973119, -0.9753733, -0.9775301, -0.9795892, -0.9815503, 
-    -0.9834132, -0.9851778, -0.9868439, -0.9884112, -0.9898798, -0.9912494, 
-    -0.9925198, -0.993691, -0.9947628, -0.9957352, -0.996608, -0.9973811, 
-    -0.9980544, -0.998628, -0.9991017, -0.9994755, -0.9997494, -0.9999232, 
-    -0.9999971, -0.999971, -0.9998449, -0.9996188, -0.9992928, -0.9988668, 
-    -0.998341, -0.9977152, -0.9969898, -0.9961646, -0.9952399, -0.9942155, 
-    -0.9930918,
-  -0.9918687, -0.9905465, -0.9891253, -0.9876051, -0.9859861, -0.9842686, 
-    -0.9824526, -0.9805384, -0.9785261, -0.976416, -0.9742082, -0.9719031, 
-    -0.9695007, -0.9670014, -0.9644054, -0.9617129, -0.9589243, -0.9560397, 
-    -0.9530596, -0.9499842, -0.9468138, -0.9435487, -0.9401892, -0.9367357, 
-    -0.9331886, -0.9295481, -0.9258147, -0.9219887, -0.9180705, -0.9140605, 
-    -0.9099591, -0.9057667, -0.9014837, -0.8971105, -0.8926477, -0.8880956, 
-    -0.8834547, -0.8787254, -0.8739083, -0.8690037, -0.8640123, -0.8589345, 
-    -0.8537708, -0.8485217, -0.8431877, -0.8377695, -0.8322675, -0.8266822, 
-    -0.8210142, -0.8152642, -0.8094327, -0.8035201, -0.7975273, -0.7914547, 
-    -0.7853029, -0.7790727, -0.7727645, -0.766379, -0.7599169, -0.7533789, 
-    -0.7467654, -0.7400773, -0.7333152, -0.7264798, -0.7195717, -0.7125916, 
-    -0.7055403, -0.6984185, -0.6912268, -0.683966, -0.6766368, -0.6692399, 
-    -0.6617761, -0.6542461, -0.6466507, -0.6389906, -0.6312667, -0.6234795, 
-    -0.6156301, -0.6077191, -0.5997473, -0.5917156, -0.5836247, -0.5754754, 
-    -0.5672686, -0.559005, -0.5506855, -0.542311, -0.5338823, -0.5254001, 
-    -0.5168654, -0.5082791, -0.4996419, -0.4909547, -0.4822185, -0.473434, 
-    -0.4646022, -0.4557239, -0.4468001, -0.4378315, -0.4288192, -0.419764, 
-    -0.4106669, -0.4015286, -0.3923502, -0.3831326, -0.3738767, -0.3645833, 
-    -0.3552535, -0.3458883, -0.3364884, -0.3270548, -0.3175886, -0.3080906, 
-    -0.2985618, -0.2890031, -0.2794155, -0.2698, -0.2601575, -0.250489, 
-    -0.2407954,
-  -0.2310778, -0.2213371, -0.2115742, -0.2017901, -0.1919859, -0.1821625, 
-    -0.1723209, -0.162462, -0.1525869, -0.1426965, -0.1327919, -0.122874, 
-    -0.1129438, -0.1030023, -0.0930505, -0.0830894, -0.07311999, -0.06314328, 
-    -0.05316024, -0.04317189, -0.03317922, -0.02318323, -0.01318493, 
-    -0.003185302, 0.00681464, 0.0168139, 0.02681148, 0.03680638, 0.0467976, 
-    0.05678413, 0.06676499, 0.07673918, 0.08670568, 0.09666352, 0.1066117, 
-    0.1165492, 0.1264751, 0.1363883, 0.1462878, 0.1561728, 0.1660421, 
-    0.1758948, 0.18573, 0.1955465, 0.2053435, 0.21512, 0.2248749, 0.2346074, 
-    0.2443164, 0.254001, 0.2636602, 0.273293, 0.2828985, 0.2924757, 
-    0.3020236, 0.3115413, 0.321028, 0.3304825, 0.3399039, 0.3492913, 
-    0.3586439, 0.3679605, 0.3772404, 0.3864825, 0.395686, 0.4048499, 
-    0.4139734, 0.4230554, 0.4320951, 0.4410917, 0.4500441, 0.4589515, 
-    0.467813, 0.4766277, 0.4853948, 0.4941134, 0.5027825, 0.5114013, 
-    0.519969, 0.5284848, 0.5369476, 0.5453568, 0.5537114, 0.5620106, 
-    0.5702537, 0.5784398, 0.5865679, 0.5946375, 0.6026475, 0.6105974, 
-    0.6184861, 0.626313, 0.6340773, 0.6417782, 0.6494148, 0.6569866, 
-    0.6644927, 0.6719322, 0.6793047, 0.6866091, 0.693845, 0.7010114, 
-    0.7081077, 0.7151332, 0.7220873, 0.728969, 0.735778, 0.7425133, 
-    0.7491744, 0.7557605, 0.7622711, 0.7687054, 0.7750629, 0.7813429, 
-    0.7875448, 0.7936679, 0.7997116, 0.8056753, 0.8115585, 0.8173606, 
-    0.8230809,
-  0.8287189, 0.834274, 0.8397457, 0.8451334, 0.8504366, 0.8556548, 0.8607874, 
-    0.8658339, 0.8707939, 0.8756667, 0.880452, 0.8851492, 0.889758, 
-    0.8942778, 0.8987081, 0.9030486, 0.9072987, 0.9114581, 0.9155264, 
-    0.9195032, 0.9233879, 0.9271804, 0.9308801, 0.9344868, 0.938, 0.9414194, 
-    0.9447446, 0.9479754, 0.9511114, 0.9541523, 0.9570977, 0.9599475, 
-    0.9627013, 0.9653587, 0.9679196, 0.9703838, 0.972751, 0.9750208, 
-    0.9771932, 0.9792678, 0.9812445, 0.9831231, 0.9849033, 0.9865851, 
-    0.9881682, 0.9896525, 0.9910379, 0.9923241, 0.9935111, 0.9945988, 
-    0.995587, 0.9964756, 0.9972646, 0.9979539, 0.9985433, 0.999033, 
-    0.9994227, 0.9997125, 0.9999022, 0.9999921, 0.9999819, 0.9998717, 
-    0.9996616, 0.9993514, 0.9989414, 0.9984314, 0.9978216, 0.997112, 
-    0.9963027, 0.9953938, 0.9943853, 0.9932774, 0.9920702, 0.9907638, 
-    0.9893582, 0.9878538, 0.9862506, 0.9845487, 0.9827484, 0.9808499, 
-    0.9788532, 0.9767586, 0.9745664, 0.9722767, 0.9698898, 0.9674059, 
-    0.9648253, 0.9621482, 0.9593748, 0.9565055, 0.9535406, 0.9504804, 
-    0.9473251, 0.944075, 0.9407306, 0.937292, 0.9337597, 0.9301341, 
-    0.9264155, 0.9226042, 0.9187007, 0.9147053, 0.9106184, 0.9064404, 
-    0.9021719, 0.897813, 0.8933644, 0.8888265, 0.8841997, 0.8794845, 
-    0.8746814, 0.8697907, 0.8648131, 0.859749, 0.8545989, 0.8493634, 
-    0.8440429, 0.8386381, 0.8331493, 0.8275773, 0.8219225,
-  0.8161855, 0.8103669, 0.8044672, 0.7984871, 0.7924272, 0.786288, 0.7800702, 
-    0.7737743, 0.7674012, 0.7609512, 0.7544252, 0.7478237, 0.7411475, 
-    0.7343971, 0.7275733, 0.7206767, 0.7137081, 0.7066681, 0.6995574, 
-    0.6923768, 0.685127, 0.6778086, 0.6704224, 0.6629692, 0.6554497, 
-    0.6478647, 0.6402149, 0.6325011, 0.624724, 0.6168844, 0.6089832, 
-    0.601021, 0.5929987, 0.5849172, 0.5767772, 0.5685794, 0.5603248, 
-    0.5520142, 0.5436484, 0.5352283, 0.5267546, 0.5182282, 0.50965, 
-    0.5010208, 0.4923416, 0.4836131, 0.4748363, 0.4660119, 0.457141, 
-    0.4482243, 0.4392629, 0.4302575, 0.421209, 0.4121185, 0.4029867, 
-    0.3938147, 0.3846032, 0.3753533, 0.3660659, 0.3567419, 0.3473822, 
-    0.3379877, 0.3285595, 0.3190984, 0.3096054, 0.3000814, 0.2905274, 
-    0.2809443, 0.2713332, 0.261695, 0.2520306, 0.2423409, 0.232627, 
-    0.2228899, 0.2131305, 0.2033498, 0.1935487, 0.1837283, 0.1738895, 
-    0.1640333, 0.1541607, 0.1442727, 0.1343703, 0.1244544, 0.1145261, 
-    0.1045863, 0.09463613, 0.08467644, 0.07470829, 0.06473266, 0.05475057, 
-    0.044763, 0.03477095, 0.02477542, 0.01477742, 0.004777943, -0.005222016, 
-    -0.01522145, -0.02521937, -0.03521476, -0.04520663, -0.05519398, 
-    -0.06517581, -0.07515112, -0.08511892, -0.09507821, -0.105028, 
-    -0.1149673, -0.124895, -0.1348103, -0.1447121, -0.1545995, -0.1644713, 
-    -0.1743268, -0.1841648, -0.1939844, -0.2037845, -0.2135644, -0.2233228, 
-    -0.2330589, -0.2427717,
-  -0.2524603, -0.2621236, -0.2717606, -0.2813705, -0.2909523, -0.300505, 
-    -0.3100276, -0.3195192, -0.3289789, -0.3384056, -0.3477986, -0.3571567, 
-    -0.3664791, -0.3757649, -0.3850131, -0.3942228, -0.4033931, -0.4125231, 
-    -0.4216118, -0.4306583, -0.4396617, -0.4486212, -0.4575359, -0.4664048, 
-    -0.475227, -0.4840018, -0.4927281, -0.5014051, -0.5100321, -0.518608, 
-    -0.527132, -0.5356033, -0.5440211, -0.5523845, -0.5606926, -0.5689447, 
-    -0.5771399, -0.5852773, -0.5933563, -0.6013759, -0.6093353, -0.6172339, 
-    -0.6250706, -0.6328449, -0.640556, -0.6482029, -0.6557851, -0.6633016, 
-    -0.6707519, -0.678135, -0.6854504, -0.6926972, -0.6998747, -0.7069823, 
-    -0.7140191, -0.7209845, -0.7278779, -0.7346984, -0.7414455, -0.7481185, 
-    -0.7547166, -0.7612393, -0.7676858, -0.7740556, -0.7803479, -0.7865623, 
-    -0.792698, -0.7987544, -0.8047309, -0.810627, -0.816442, -0.8221753, 
-    -0.8278264, -0.8333948, -0.8388798, -0.844281, -0.8495977, -0.8548294, 
-    -0.8599757, -0.865036, -0.8700097, -0.8748965, -0.8796958, -0.884407, 
-    -0.8890299, -0.8935639, -0.8980085, -0.9023633, -0.9066279, -0.9108018, 
-    -0.9148846, -0.918876, -0.9227754, -0.9265826, -0.9302971, -0.9339186, 
-    -0.9374467, -0.9408811, -0.9442213, -0.9474672, -0.9506183, -0.9536743, 
-    -0.956635, -0.9595, -0.9622691, -0.9649419, -0.9675183, -0.9699979, 
-    -0.9723805, -0.9746658, -0.9768537, -0.9789439, -0.9809362, -0.9828305, 
-    -0.9846264, -0.9863239, -0.9879227, -0.9894227, -0.9908239, -0.9921259, 
-    -0.9933288,
-  -0.9944322, -0.9954363, -0.9963408, -0.9971456, -0.9978508, -0.9984561, 
-    -0.9989617, -0.9993673, -0.999673, -0.9998787, -0.9999844, -0.9999902, 
-    -0.9998959, -0.9997017, -0.9994075, -0.9990134, -0.9985193, -0.9979254, 
-    -0.9972317, -0.9964383, -0.9955452, -0.9945526, -0.9934605, -0.9922691, 
-    -0.9909785, -0.9895887, -0.9881001, -0.9865125, -0.9848264, -0.9830417, 
-    -0.9811588, -0.9791777, -0.9770988, -0.9749221, -0.9726479, -0.9702765, 
-    -0.967808, -0.9652427, -0.962581, -0.959823, -0.956969, -0.9540192, 
-    -0.9509742, -0.947834, -0.944599, -0.9412695, -0.9378459, -0.9343286, 
-    -0.9307178, -0.9270139, -0.9232174, -0.9193285, -0.9153477, -0.9112754, 
-    -0.9071119, -0.9028577, -0.8985133, -0.894079, -0.8895552, -0.8849425, 
-    -0.8802414, -0.8754522, -0.8705754, -0.8656116, -0.8605613, -0.8554249, 
-    -0.8502029, -0.844896, -0.8395045, -0.8340291, -0.8284702, -0.8228286, 
-    -0.8171046, -0.811299, -0.8054122, -0.7994449, -0.7933976, -0.787271, 
-    -0.7810657, -0.7747822, -0.7684214, -0.7619836, -0.7554696, -0.7488801, 
-    -0.7422158, -0.7354771, -0.728665, -0.7217799, -0.7148228, -0.7077941, 
-    -0.7006946, -0.6935251, -0.6862862, -0.6789787, -0.6716033, -0.6641607, 
-    -0.6566517, -0.6490771, -0.6414375, -0.6337339, -0.6259668, -0.6181371, 
-    -0.6102456, -0.6022931, -0.5942804, -0.5862082, -0.5780774, -0.5698889, 
-    -0.5616433, -0.5533416, -0.5449845, -0.5365729, -0.5281077, -0.5195897, 
-    -0.5110196, -0.5023986, -0.4937272, -0.4850065, -0.4762373, -0.4674205, 
-    -0.4585569,
-  -0.4496475, -0.4406931, -0.4316946, -0.422653, -0.4135691, -0.4044438, 
-    -0.3952781, -0.3860729, -0.3768291, -0.3675475, -0.3582293, -0.3488752, 
-    -0.3394862, -0.3300633, -0.3206073, -0.3111193, -0.3016002, -0.292051, 
-    -0.2824725, -0.2728658, -0.2632318, -0.2535715, -0.2438858, -0.2341757, 
-    -0.2244422, -0.2146863, -0.2049089, -0.195111, -0.1852936, -0.1754577, 
-    -0.1656042, -0.1557341, -0.1458485, -0.1359483, -0.1260345, -0.1161081, 
-    -0.1061701, -0.09622151, -0.08626327, -0.0762964, -0.06632189, 
-    -0.05634077, -0.046354, -0.0363626, -0.02636756, -0.01636988, 
-    -0.006370571, 0.003629378, 0.01362896, 0.02362719, 0.03362305, 
-    0.04361555, 0.05360368, 0.06358646, 0.07356288, 0.08353194, 0.09349265, 
-    0.103444, 0.113385, 0.1233147, 0.133232, 0.1431361, 0.1530258, 0.1629002, 
-    0.1727583, 0.1825991, 0.1924217, 0.2022251, 0.2120082, 0.2217701, 
-    0.2315098, 0.2412264, 0.2509189, 0.2605863, 0.2702276, 0.2798419, 
-    0.2894282, 0.2989855, 0.308513, 0.3180096, 0.3274744, 0.3369065, 
-    0.3463049, 0.3556686, 0.3649968, 0.3742885, 0.3835427, 0.3927587, 
-    0.4019353, 0.4110717, 0.420167, 0.4292203, 0.4382307, 0.4471973, 
-    0.4561191, 0.4649954, 0.4738251, 0.4826075, 0.4913416, 0.5000265, 
-    0.5086614, 0.5172455, 0.5257779, 0.5342577, 0.5426841, 0.5510561, 
-    0.5593731, 0.5676342, 0.5758385, 0.5839852, 0.5920735, 0.6001026, 
-    0.6080717, 0.61598, 0.6238267, 0.631611, 0.6393321, 0.6469893, 0.6545818, 
-    0.6621089, 0.6695698,
-  0.6769636, 0.6842899, 0.6915476, 0.6987363, 0.705855, 0.7129031, 0.71988, 
-    0.7267848, 0.7336171, 0.7403759, 0.7470607, 0.7536708, 0.7602055, 
-    0.7666642, 0.7730463, 0.779351, 0.7855778, 0.7917261, 0.7977951, 
-    0.8037844, 0.8096933, 0.8155213, 0.8212677, 0.826932, 0.8325136, 
-    0.8380119, 0.8434264, 0.8487566, 0.8540019, 0.8591618, 0.8642358, 
-    0.8692234, 0.8741241, 0.8789373, 0.8836626, 0.8882996, 0.8928478, 
-    0.8973066, 0.9016758, 0.9059547, 0.9101431, 0.9142405, 0.9182464, 
-    0.9221606, 0.9259824, 0.9297118, 0.9333481, 0.9368911, 0.9403404, 
-    0.9436957, 0.9469566, 0.9501228, 0.953194, 0.9561699, 0.9590501, 
-    0.9618345, 0.9645227, 0.9671144, 0.9696094, 0.9720075, 0.9743084, 
-    0.9765118, 0.9786175, 0.9806255, 0.9825354, 0.9843469, 0.9860601, 
-    0.9876747, 0.9891905, 0.9906074, 0.9919252, 0.9931438, 0.9942631, 
-    0.995283, 0.9962034, 0.9970241, 0.9977452, 0.9983664, 0.9988878, 
-    0.9993094, 0.999631, 0.9998527, 0.9999743, 0.999996, 0.9999177, 
-    0.9997393, 0.9994611, 0.9990828, 0.9986047, 0.9980267, 0.9973488, 
-    0.9965713, 0.9956941, 0.9947174, 0.9936411, 0.9924655, 0.9911907, 
-    0.9898167, 0.9883437, 0.9867719, 0.9851015, 0.9833325, 0.9814652, 
-    0.9794998, 0.9774364, 0.9752753, 0.9730166, 0.9706606, 0.9682076, 
-    0.9656578, 0.9630114, 0.9602687, 0.9574299, 0.9544954, 0.9514655, 
-    0.9483404, 0.9451205, 0.9418061, 0.9383975, 0.934895, 0.9312991,
-  0.9276101, 0.9238282, 0.9199541, 0.9159878, 0.9119301, 0.9077811, 
-    0.9035413, 0.8992112, 0.8947912, 0.8902817, 0.8856831, 0.880996, 
-    0.8762208, 0.871358, 0.866408, 0.8613714, 0.8562487, 0.8510403, 
-    0.8457468, 0.8403688, 0.8349067, 0.8293611, 0.8237326, 0.8180218, 
-    0.8122291, 0.8063552, 0.8004007, 0.7943661, 0.7882521, 0.7820593, 
-    0.7757882, 0.7694396, 0.763014, 0.7565122, 0.7499346, 0.7432821, 
-    0.7365553, 0.7297548, 0.7228814, 0.7159356, 0.7089183, 0.70183, 
-    0.6946716, 0.6874437, 0.6801471, 0.6727825, 0.6653506, 0.6578521, 
-    0.6502879, 0.6426586, 0.6349651, 0.627208, 0.6193883, 0.6115066, 
-    0.6035637, 0.5955606, 0.5874978, 0.5793763, 0.5711969, 0.5629603, 
-    0.5546675, 0.5463191, 0.5379162, 0.5294595, 0.5209498, 0.512388, 
-    0.503775, 0.4951116, 0.4863987, 0.4776371, 0.4688278, 0.4599716, 
-    0.4510695, 0.4421222, 0.4331307, 0.4240958, 0.4150186, 0.4058999, 
-    0.3967406, 0.3875416, 0.3783038, 0.3690283, 0.3597158, 0.3503673, 
-    0.3409838, 0.3315663, 0.3221155, 0.3126326, 0.3031183, 0.2935738, 
-    0.2839999, 0.2743977, 0.2647679, 0.2551118, 0.24543, 0.2357238, 0.225994, 
-    0.2162415, 0.2064675, 0.1966728, 0.1868584, 0.1770254, 0.1671746, 
-    0.1573072, 0.147424, 0.137526, 0.1276143, 0.1176899, 0.1077536, 
-    0.09780665, 0.08784988, 0.07788431, 0.06791096, 0.05793082, 0.04794488, 
-    0.03795415, 0.02795962, 0.0179623, 0.007963183, -0.002036731, -0.01203644,
-  -0.02203495, -0.03203125, -0.04202435, -0.05201325, -0.06199695, 
-    -0.07197444, -0.08194474, -0.09190685, -0.1018598, -0.1118025, -0.121734, 
-    -0.1316534, -0.1415596, -0.1514517, -0.1613286, -0.1711894, -0.181033, 
-    -0.1908586, -0.2006651, -0.2104515, -0.2202168, -0.2299601, -0.2396805, 
-    -0.2493769, -0.2590483, -0.2686938, -0.2783125, -0.2879033, -0.2974654, 
-    -0.3069977, -0.3164992, -0.3259692, -0.3354065, -0.3448103, -0.3541797, 
-    -0.3635136, -0.3728111, -0.3820714, -0.3912935, -0.4004764, -0.4096193, 
-    -0.4187213, -0.4277813, -0.4367986, -0.4457722, -0.4547012, -0.4635848, 
-    -0.472422, -0.4812119, -0.4899538, -0.4986466, -0.5072896, -0.5158818, 
-    -0.5244225, -0.5329107, -0.5413457, -0.5497264, -0.5580522, -0.5663223, 
-    -0.5745357, -0.5826916, -0.5907893, -0.5988278, -0.6068066, -0.6147246, 
-    -0.6225811, -0.6303754, -0.6381067, -0.6457741, -0.653377, -0.6609145, 
-    -0.668386, -0.6757905, -0.6831276, -0.6903963, -0.697596, -0.7047259, 
-    -0.7117853, -0.7187736, -0.72569, -0.7325338, -0.7393044, -0.746001, 
-    -0.7526231, -0.7591698, -0.7656407, -0.772035, -0.7783521, -0.7845913, 
-    -0.7907521, -0.7968339, -0.8028359, -0.8087577, -0.8145986, -0.820358, 
-    -0.8260354, -0.8316302, -0.8371418, -0.8425697, -0.8479133, -0.8531722, 
-    -0.8583457, -0.8634335, -0.8684348, -0.8733494, -0.8781766, -0.882916, 
-    -0.887567, -0.8921294, -0.8966025, -0.900986, -0.9052793, -0.9094821, 
-    -0.913594, -0.9176146, -0.9215433, -0.9253799, -0.929124, -0.9327752, 
-    -0.9363331, -0.9397973,
-  -0.9431676, -0.9464436, -0.9496249, -0.9527112, -0.9557023, -0.9585978, 
-    -0.9613975, -0.964101, -0.9667081, -0.9692186, -0.9716321, -0.9739484, 
-    -0.9761674, -0.9782887, -0.9803122, -0.9822378, -0.984065, -0.9857939, 
-    -0.9874241, -0.9889557, -0.9903883, -0.9917219, -0.9929563, -0.9940915, 
-    -0.9951273, -0.9960635, -0.9969001, -0.997637, -0.9982741, -0.9988115, 
-    -0.9992489, -0.9995865, -0.999824, -0.9999616, -0.9999992, -0.9999368, 
-    -0.9997745, -0.9995121, -0.9991497, -0.9986875, -0.9981254, -0.9974635, 
-    -0.9967018, -0.9958405, -0.9948795, -0.9938192, -0.9926594, -0.9914004, 
-    -0.9900422, -0.9885849, -0.9870289, -0.9853742, -0.9836209, -0.9817692, 
-    -0.9798194, -0.9777716, -0.975626, -0.9733829, -0.9710424, -0.9686048, 
-    -0.9660704, -0.9634393, -0.9607119, -0.9578884, -0.9549692, -0.9519544, 
-    -0.9488445, -0.9456397, -0.9423403, -0.9389467, -0.9354591, -0.9318781, 
-    -0.9282038, -0.9244367, -0.9205772, -0.9166257, -0.9125825, -0.908448, 
-    -0.9042226, -0.8999069, -0.8955011, -0.8910058, -0.8864214, -0.8817484, 
-    -0.8769872, -0.8721383, -0.8672022, -0.8621793, -0.8570703, -0.8518755, 
-    -0.8465956, -0.841231, -0.8357822, -0.8302499, -0.8246346, -0.8189368, 
-    -0.8131571, -0.8072961, -0.8013543, -0.7953325, -0.7892311, -0.7830508, 
-    -0.7767922, -0.7704558, -0.7640425, -0.7575527, -0.7509872, -0.7443466, 
-    -0.7376316, -0.7308428, -0.7239809, -0.7170466, -0.7100406, -0.7029637, 
-    -0.6958163, -0.6885995, -0.6813138, -0.6739599, -0.6665387, -0.6590508, 
-    -0.6514969,
-  -0.643878, -0.6361946, -0.6284477, -0.6206378, -0.612766, -0.6048328, 
-    -0.5968392, -0.5887859, -0.5806737, -0.5725034, -0.5642759, -0.5559919, 
-    -0.5476524, -0.5392581, -0.5308099, -0.5223086, -0.513755, -0.5051501, 
-    -0.4964947, -0.4877896, -0.4790358, -0.470234, -0.4613852, -0.4524903, 
-    -0.4435501, -0.4345656, -0.4255376, -0.4164671, -0.4073549, -0.398202, 
-    -0.3890093, -0.3797776, -0.370508, -0.3612014, -0.3518586, -0.3424806, 
-    -0.3330684, -0.3236229, -0.314145, -0.3046357, -0.2950959, -0.2855267, 
-    -0.2759288, -0.2663034, -0.2566514, -0.2469737, -0.2372712, -0.2275451, 
-    -0.2177962, -0.2080256, -0.1982341, -0.1884228, -0.1785927, -0.1687447, 
-    -0.1588798, -0.148999, -0.1391034, -0.1291938, -0.1192713, -0.1093369, 
-    -0.09939155, -0.08943626, -0.07947203, -0.06949985, -0.05952072, 
-    -0.04953564, -0.03954561, -0.02955162, -0.01955467, -0.009555776, 
-    0.0004440784, 0.01044389, 0.02044265, 0.03043937, 0.04043305, 0.05042269, 
-    0.06040728, 0.07038583, 0.08035734, 0.09032082, 0.1002753, 0.1102197, 
-    0.1201531, 0.1300745, 0.1399828, 0.1498772, 0.1597566, 0.16962, 
-    0.1794665, 0.189295, 0.1991045, 0.2088942, 0.218663, 0.2284099, 0.238134, 
-    0.2478342, 0.2575097, 0.2671594, 0.2767824, 0.2863777, 0.2959444, 
-    0.3054815, 0.3149881, 0.3244631, 0.3339057, 0.3433149, 0.3526898, 
-    0.3620294, 0.3713328, 0.3805991, 0.3898273, 0.3990166, 0.4081659, 
-    0.4172744, 0.4263412, 0.4353653, 0.444346, 0.4532822, 0.462173, 
-    0.4710177, 0.4798152,
-  0.4885648, 0.4972655, 0.5059164, 0.5145168, 0.5230657, 0.5315624, 
-    0.5400059, 0.5483953, 0.55673, 0.5650089, 0.5732314, 0.5813965, 
-    0.5895035, 0.5975516, 0.6055399, 0.6134676, 0.621334, 0.6291383, 
-    0.6368796, 0.6445573, 0.6521705, 0.6597185, 0.6672005, 0.6746158, 
-    0.6819636, 0.6892433, 0.696454, 0.703595, 0.7106658, 0.7176654, 
-    0.7245933, 0.7314487, 0.738231, 0.7449394, 0.7515734, 0.7581322, 
-    0.7646152, 0.7710217, 0.7773512, 0.7836029, 0.7897762, 0.7958706, 
-    0.8018854, 0.80782, 0.8136737, 0.8194461, 0.8251367, 0.8307446, 
-    0.8362696, 0.8417109, 0.847068, 0.8523403, 0.8575276, 0.8626289, 
-    0.8676441, 0.8725725, 0.8774136, 0.882167, 0.8868322, 0.8914087, 
-    0.8958961, 0.9002938, 0.9046016, 0.9088188, 0.9129453, 0.9169804, 
-    0.9209238, 0.9247751, 0.9285339, 0.9321999, 0.9357727, 0.9392518, 
-    0.9426371, 0.9459282, 0.9491246, 0.952226, 0.9552323, 0.9581431, 
-    0.960958, 0.9636769, 0.9662994, 0.9688252, 0.9712542, 0.973586, 
-    0.9758205, 0.9779574, 0.9799966, 0.9819376, 0.9837806, 0.9855251, 
-    0.9871711, 0.9887184, 0.9901668, 0.9915162, 0.9927664, 0.9939173, 
-    0.994969, 0.995921, 0.9967735, 0.9975263, 0.9981794, 0.9987326, 0.999186, 
-    0.9995394, 0.9997929, 0.9999464, 0.9999999, 0.9999534, 0.999807, 
-    0.9995605, 0.9992141, 0.9987678, 0.9982216, 0.9975756, 0.9968298, 
-    0.9959843, 0.9950393, 0.9939947, 0.9928507, 0.9916075, 0.9902651 ;
-
- exp = {1, 2} ;
-}
diff --git a/ncdap_test/nocacheremote4/test.nc.dmp b/ncdap_test/nocacheremote4/test.nc.dmp
deleted file mode 100644
index 322bd89..0000000
--- a/ncdap_test/nocacheremote4/test.nc.dmp
+++ /dev/null
@@ -1,929 +0,0 @@
-netcdf test {
-dimensions:
-	D1 = 1 ;
-	D2 = 2 ;
-	D3 = 3 ;
-	D4 = 4 ;
-	Dr = 2 ;
-variables:
-	string c ;
-		c:string_length = 1 ;
-	ubyte b ;
-		string b:c = "" ;
-	short s ;
-		s:b = 128UB ;
-		s:s = -32768s, 32767s ;
-	int i ;
-		i:i = -2147483648, 2147483647, -2147483648 ;
-		i:f = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f ;
-		i:d = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660. ;
-	float f ;
-	double d ;
-		string d:c = "\\200\\177AZ$&" ;
-	string cr ;
-		cr:string_length = 2 ;
-	string c1 ;
-		c1:string_length = 1 ;
-	string c2 ;
-		c2:string_length = 2 ;
-	string c3 ;
-		c3:string_length = 3 ;
-	string c4 ;
-		c4:string_length = 4 ;
-	ubyte br(Dr) ;
-	short sr(Dr) ;
-	int ir(Dr) ;
-	float fr(Dr) ;
-	double dr(Dr) ;
-	ubyte b1(D1) ;
-	short s1(D1) ;
-	int i1(D1) ;
-	float f1(D1) ;
-	double d1(D1) ;
-	ubyte b2(D2) ;
-	short s2(D2) ;
-	int i2(D2) ;
-	float f2(D2) ;
-	double d2(D2) ;
-	ubyte b3(D3) ;
-	short s3(D3) ;
-	int i3(D3) ;
-	float f3(D3) ;
-	double d3(D3) ;
-	ubyte b4(D4) ;
-	short s4(D4) ;
-	int i4(D4) ;
-	float f4(D4) ;
-	double d4(D4) ;
-	string cr1(Dr) ;
-		cr1:string_length = 1 ;
-	ubyte br2(Dr, D2) ;
-	short sr3(Dr, D3) ;
-	int ir4(Dr, D4) ;
-	float f11(D1, D1) ;
-	double d12(D1, D2) ;
-	string c13(D1) ;
-		c13:string_length = 3 ;
-	ubyte b14(D1, D4) ;
-	short s21(D2, D1) ;
-	int i22(D2, D2) ;
-	float f23(D2, D3) ;
-	double d24(D2, D4) ;
-	string c31(D3) ;
-		c31:string_length = 1 ;
-	ubyte b32(D3, D2) ;
-	short s33(D3, D3) ;
-	int i34(D3, D4) ;
-	float f41(D4, D1) ;
-	double d42(D4, D2) ;
-	string c43(D4) ;
-		c43:string_length = 3 ;
-	ubyte b44(D4, D4) ;
-	short sr11(Dr, D1, D1) ;
-	int ir12(Dr, D1, D2) ;
-	float fr13(Dr, D1, D3) ;
-	double dr14(Dr, D1, D4) ;
-	string cr21(Dr, D2) ;
-		cr21:string_length = 1 ;
-	ubyte br22(Dr, D2, D2) ;
-	short sr23(Dr, D2, D3) ;
-	int ir24(Dr, D2, D4) ;
-	float fr31(Dr, D3, D1) ;
-	double dr32(Dr, D3, D2) ;
-	string cr33(Dr, D3) ;
-		cr33:string_length = 3 ;
-	ubyte br34(Dr, D3, D4) ;
-	short sr41(Dr, D4, D1) ;
-	int ir42(Dr, D4, D2) ;
-	float fr43(Dr, D4, D3) ;
-	double dr44(Dr, D4, D4) ;
-	string c111(D1, D1) ;
-		c111:string_length = 1 ;
-	ubyte b112(D1, D1, D2) ;
-	short s113(D1, D1, D3) ;
-	int i114(D1, D1, D4) ;
-	float f121(D1, D2, D1) ;
-	double d122(D1, D2, D2) ;
-	string c123(D1, D2) ;
-		c123:string_length = 3 ;
-	ubyte b124(D1, D2, D4) ;
-	short s131(D1, D3, D1) ;
-	int i132(D1, D3, D2) ;
-	float f133(D1, D3, D3) ;
-	double d134(D1, D3, D4) ;
-	string c141(D1, D4) ;
-		c141:string_length = 1 ;
-	ubyte b142(D1, D4, D2) ;
-	short s143(D1, D4, D3) ;
-	int i144(D1, D4, D4) ;
-	float f211(D2, D1, D1) ;
-	double d212(D2, D1, D2) ;
-	string c213(D2, D1) ;
-		c213:string_length = 3 ;
-	ubyte b214(D2, D1, D4) ;
-	short s221(D2, D2, D1) ;
-	int i222(D2, D2, D2) ;
-	float f223(D2, D2, D3) ;
-	double d224(D2, D2, D4) ;
-	string c231(D2, D3) ;
-		c231:string_length = 1 ;
-	ubyte b232(D2, D3, D2) ;
-	short s233(D2, D3, D3) ;
-	int i234(D2, D3, D4) ;
-	float f241(D2, D4, D1) ;
-	double d242(D2, D4, D2) ;
-	string c243(D2, D4) ;
-		c243:string_length = 3 ;
-	ubyte b244(D2, D4, D4) ;
-	short s311(D3, D1, D1) ;
-	int i312(D3, D1, D2) ;
-	float f313(D3, D1, D3) ;
-	double d314(D3, D1, D4) ;
-	string c321(D3, D2) ;
-		c321:string_length = 1 ;
-	ubyte b322(D3, D2, D2) ;
-	short s323(D3, D2, D3) ;
-	int i324(D3, D2, D4) ;
-	float f331(D3, D3, D1) ;
-	double d332(D3, D3, D2) ;
-	string c333(D3, D3) ;
-		c333:string_length = 3 ;
-	ubyte b334(D3, D3, D4) ;
-	short s341(D3, D4, D1) ;
-	int i342(D3, D4, D2) ;
-	float f343(D3, D4, D3) ;
-	double d344(D3, D4, D4) ;
-	string c411(D4, D1) ;
-		c411:string_length = 1 ;
-	ubyte b412(D4, D1, D2) ;
-	short s413(D4, D1, D3) ;
-	int i414(D4, D1, D4) ;
-	float f421(D4, D2, D1) ;
-	double d422(D4, D2, D2) ;
-	string c423(D4, D2) ;
-		c423:string_length = 3 ;
-	ubyte b424(D4, D2, D4) ;
-	short s431(D4, D3, D1) ;
-	int i432(D4, D3, D2) ;
-	float f433(D4, D3, D3) ;
-	double d434(D4, D3, D4) ;
-	string c441(D4, D4) ;
-		c441:string_length = 1 ;
-	ubyte b442(D4, D4, D2) ;
-	short s443(D4, D4, D3) ;
-	int i444(D4, D4, D4) ;
-
-// global attributes:
-		string :Gc = "\\200" ;
-		:Gb = 128UB, 127UB ;
-		:Gs = -32768s, 32767s, 32767s ;
-		:Gi = -2147483648, 2147483647, -2147483648, 2147483647 ;
-		:Gf = -3.402823e+38f, 3.402823e+38f, -3.402823e+38f, 3.402823e+38f, 531.f ;
-		:Gd = -1.79769313486232e+308, 1.79769313486232e+308, -1., 1., 660., 650. ;
-data:
-
- c = "" ;
-
- b = 254 ;
-
- s = -5 ;
-
- i = -20 ;
-
- f = -9 ;
-
- d = -10 ;
-
- cr = "�" ;
-
- c1 = "�" ;
-
- c2 = "�" ;
-
- c3 = "�A" ;
-
- c4 = "�AZ" ;
-
- br = 128, 127 ;
-
- sr = -32768, 32767 ;
-
- ir = -2147483648, 2147483647 ;
-
- fr = -3.402823e+38, 3.402823e+38 ;
-
- dr = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- b1 = 128 ;
-
- s1 = -32768 ;
-
- i1 = -2147483648 ;
-
- f1 = -3.402823e+38 ;
-
- d1 = -1.79769313486232e+308 ;
-
- b2 = 128, 127 ;
-
- s2 = -32768, 32767 ;
-
- i2 = -2147483648, 2147483647 ;
-
- f2 = -3.402823e+38, 3.402823e+38 ;
-
- d2 = -1.79769313486232e+308, 1.79769313486232e+308 ;
-
- b3 = 128, 127, 127 ;
-
- s3 = -32768, 32767, 32767 ;
-
- i3 = -2147483648, 2147483647, -2147483648 ;
-
- f3 = -3.402823e+38, 3.402823e+38, -3.402823e+38 ;
-
- d3 = -1.79769313486232e+308, 1.79769313486232e+308, -1 ;
-
- b4 = 128, 127, 127, 128 ;
-
- s4 = -32768, 32767, 32767, -32768 ;
-
- i4 = -2147483648, 2147483647, -2147483648, 2147483647 ;
-
- f4 = -3.402823e+38, 3.402823e+38, -3.402823e+38, 3.402823e+38 ;
-
- d4 = -1.79769313486232e+308, 1.79769313486232e+308, -1, 1 ;
-
- cr1 = "", "
" ;
-
- br2 =
-  232, 230,
-  236, 234 ;
-
- sr3 =
-  -375, -380, -385,
-  -350, -355, -360 ;
-
- ir4 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660 ;
-
- f11 =
-  -2187 ;
-
- d12 =
-  -3000, -3010 ;
-
- c13 = "
" ;
-
- b14 =
-  232, 230, 228, 226 ;
-
- s21 =
-  -375,
-  -350 ;
-
- i22 =
-  -24000, -24020,
-  -23600, -23620 ;
-
- f23 =
-  -2187, -2196, -2205,
-  -2106, -2115, -2124 ;
-
- d24 =
-  -3000, -3010, -3020, -3030,
-  -2900, -2910, -2920, -2930 ;
-
- c31 = "", "
", " " ;
-
- b32 =
-  232, 230,
-  236, 234,
-  240, 238 ;
-
- s33 =
-  -375, -380, -385,
-  -350, -355, -360,
-  -325, -330, -335 ;
-
- i34 =
-  -24000, -24020, -24040, -24060,
-  -23600, -23620, -23640, -23660,
-  -23200, -23220, -23240, -23260 ;
-
- f41 =
-  -2187,
-  -2106,
-  -2025,
-  -1944 ;
-
- d42 =
-  -3000, -3010,
-  -2900, -2910,
-  -2800, -2810,
-  -2700, -2710 ;
-
- c43 = "
", "

 ", " "$", "$&(" ;
-
- b44 =
-  232, 230, 228, 226,
-  236, 234, 232, 230,
-  240, 238, 236, 234,
-  244, 242, 240, 238 ;
-
- sr11 =
-  2500,
-  2375 ;
-
- ir12 =
-  640000, 639980,
-  632000, 631980 ;
-
- fr13 =
-  26244, 26235, 26226,
-  25515, 25506, 25497 ;
-
- dr14 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970 ;
-
- cr21 =
-  "@", "D",
-  "H", "L" ;
-
- br22 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58 ;
-
- sr23 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390 ;
-
- ir24 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340 ;
-
- fr31 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677 ;
-
- dr32 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190 ;
-
- cr33 =
-  "@BD", "DFH", "HJL",
-  "HJL", "LNP", "PRT" ;
-
- br34 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58 ;
-
- sr41 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450 ;
-
- ir42 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180 ;
-
- fr43 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740 ;
-
- dr44 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270 ;
-
- c111 =
-  "@" ;
-
- b112 =
-  64, 62 ;
-
- s113 =
-  2500, 2495, 2490 ;
-
- i114 =
-  640000, 639980, 639960, 639940 ;
-
- f121 =
-  26244,
-  26325 ;
-
- d122 =
-  40000, 39990,
-  40100, 40090 ;
-
- c123 =
-  "@BD", "DFH" ;
-
- b124 =
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s131 =
-  2500,
-  2525,
-  2550 ;
-
- i132 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780 ;
-
- f133 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388 ;
-
- d134 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170 ;
-
- c141 =
-  "@", "D", "H", "L" ;
-
- b142 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74 ;
-
- s143 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565 ;
-
- i144 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140 ;
-
- f211 =
-  26244,
-  25515 ;
-
- d212 =
-  40000, 39990,
-  39000, 38990 ;
-
- c213 =
-  "@BD",
-  "HJL" ;
-
- b214 =
-  64, 62, 60, 58,
-  56, 54, 52, 50 ;
-
- s221 =
-  2500,
-  2525,
-  2375,
-  2400 ;
-
- i222 =
-  640000, 639980,
-  640400, 640380,
-  632000, 631980,
-  632400, 632380 ;
-
- f223 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  25515, 25506, 25497,
-  25596, 25587, 25578 ;
-
- d224 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070 ;
-
- c231 =
-  "@", "D", "H",
-  "H", "L", "P" ;
-
- b232 =
-  64, 62,
-  68, 66,
-  72, 70,
-  56, 54,
-  60, 58,
-  64, 62 ;
-
- s233 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415 ;
-
- i234 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740 ;
-
- f241 =
-  26244,
-  26325,
-  26406,
-  26487,
-  25515,
-  25596,
-  25677,
-  25758 ;
-
- d242 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  40300, 40290,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  39300, 39290 ;
-
- c243 =
-  "@BD", "DFH", "HJL", "LNP",
-  "HJL", "LNP", "PRT", "TVX" ;
-
- b244 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  76, 74, 72, 70,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  68, 66, 64, 62 ;
-
- s311 =
-  2500,
-  2375,
-  2250 ;
-
- i312 =
-  640000, 639980,
-  632000, 631980,
-  624000, 623980 ;
-
- f313 =
-  26244, 26235, 26226,
-  25515, 25506, 25497,
-  24786, 24777, 24768 ;
-
- d314 =
-  40000, 39990, 39980, 39970,
-  39000, 38990, 38980, 38970,
-  38000, 37990, 37980, 37970 ;
-
- c321 =
-  "@", "D",
-  "H", "L",
-  "P", "T" ;
-
- b322 =
-  64, 62,
-  68, 66,
-  56, 54,
-  60, 58,
-  48, 46,
-  52, 50 ;
-
- s323 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2250, 2245, 2240,
-  2275, 2270, 2265 ;
-
- i324 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340 ;
-
- f331 =
-  26244,
-  26325,
-  26406,
-  25515,
-  25596,
-  25677,
-  24786,
-  24867,
-  24948 ;
-
- d332 =
-  40000, 39990,
-  40100, 40090,
-  40200, 40190,
-  39000, 38990,
-  39100, 39090,
-  39200, 39190,
-  38000, 37990,
-  38100, 38090,
-  38200, 38190 ;
-
- c333 =
-  "@BD", "DFH", "HJL",
-  "HJL", "LNP", "PRT",
-  "PRT", "TVX", "XZ\" ;
-
- b334 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  72, 70, 68, 66,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  64, 62, 60, 58,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  56, 54, 52, 50 ;
-
- s341 =
-  2500,
-  2525,
-  2550,
-  2575,
-  2375,
-  2400,
-  2425,
-  2450,
-  2250,
-  2275,
-  2300,
-  2325 ;
-
- i342 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  641200, 641180,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  633200, 633180,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  625200, 625180 ;
-
- f343 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  26487, 26478, 26469,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  25758, 25749, 25740,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  25029, 25020, 25011 ;
-
- d344 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  40300, 40290, 40280, 40270,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  39300, 39290, 39280, 39270,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  38300, 38290, 38280, 38270 ;
-
- c411 =
-  "@",
-  "H",
-  "P",
-  "X" ;
-
- b412 =
-  64, 62,
-  56, 54,
-  48, 46,
-  40, 38 ;
-
- s413 =
-  2500, 2495, 2490,
-  2375, 2370, 2365,
-  2250, 2245, 2240,
-  2125, 2120, 2115 ;
-
- i414 =
-  640000, 639980, 639960, 639940,
-  632000, 631980, 631960, 631940,
-  624000, 623980, 623960, 623940,
-  616000, 615980, 615960, 615940 ;
-
- f421 =
-  26244,
-  26325,
-  25515,
-  25596,
-  24786,
-  24867,
-  24057,
-  24138 ;
-
- d422 =
-  40000, 39990,
-  40100, 40090,
-  39000, 38990,
-  39100, 39090,
-  38000, 37990,
-  38100, 38090,
-  37000, 36990,
-  37100, 37090 ;
-
- c423 =
-  "@BD", "DFH",
-  "HJL", "LNP",
-  "PRT", "TVX",
-  "XZ\", "\^`" ;
-
- b424 =
-  64, 62, 60, 58,
-  68, 66, 64, 62,
-  56, 54, 52, 50,
-  60, 58, 56, 54,
-  48, 46, 44, 42,
-  52, 50, 48, 46,
-  40, 38, 36, 34,
-  44, 42, 40, 38 ;
-
- s431 =
-  2500,
-  2525,
-  2550,
-  2375,
-  2400,
-  2425,
-  2250,
-  2275,
-  2300,
-  2125,
-  2150,
-  2175 ;
-
- i432 =
-  640000, 639980,
-  640400, 640380,
-  640800, 640780,
-  632000, 631980,
-  632400, 632380,
-  632800, 632780,
-  624000, 623980,
-  624400, 624380,
-  624800, 624780,
-  616000, 615980,
-  616400, 616380,
-  616800, 616780 ;
-
- f433 =
-  26244, 26235, 26226,
-  26325, 26316, 26307,
-  26406, 26397, 26388,
-  25515, 25506, 25497,
-  25596, 25587, 25578,
-  25677, 25668, 25659,
-  24786, 24777, 24768,
-  24867, 24858, 24849,
-  24948, 24939, 24930,
-  24057, 24048, 24039,
-  24138, 24129, 24120,
-  24219, 24210, 24201 ;
-
- d434 =
-  40000, 39990, 39980, 39970,
-  40100, 40090, 40080, 40070,
-  40200, 40190, 40180, 40170,
-  39000, 38990, 38980, 38970,
-  39100, 39090, 39080, 39070,
-  39200, 39190, 39180, 39170,
-  38000, 37990, 37980, 37970,
-  38100, 38090, 38080, 38070,
-  38200, 38190, 38180, 38170,
-  37000, 36990, 36980, 36970,
-  37100, 37090, 37080, 37070,
-  37200, 37190, 37180, 37170 ;
-
- c441 =
-  "@", "D", "H", "L",
-  "H", "L", "P", "T",
-  "P", "T", "X", "\",
-  "X", "\", "`", "d" ;
-
- b442 =
-  64, 62,
-  68, 66,
-  72, 70,
-  76, 74,
-  56, 54,
-  60, 58,
-  64, 62,
-  68, 66,
-  48, 46,
-  52, 50,
-  56, 54,
-  60, 58,
-  40, 38,
-  44, 42,
-  48, 46,
-  52, 50 ;
-
- s443 =
-  2500, 2495, 2490,
-  2525, 2520, 2515,
-  2550, 2545, 2540,
-  2575, 2570, 2565,
-  2375, 2370, 2365,
-  2400, 2395, 2390,
-  2425, 2420, 2415,
-  2450, 2445, 2440,
-  2250, 2245, 2240,
-  2275, 2270, 2265,
-  2300, 2295, 2290,
-  2325, 2320, 2315,
-  2125, 2120, 2115,
-  2150, 2145, 2140,
-  2175, 2170, 2165,
-  2200, 2195, 2190 ;
-
- i444 =
-  640000, 639980, 639960, 639940,
-  640400, 640380, 640360, 640340,
-  640800, 640780, 640760, 640740,
-  641200, 641180, 641160, 641140,
-  632000, 631980, 631960, 631940,
-  632400, 632380, 632360, 632340,
-  632800, 632780, 632760, 632740,
-  633200, 633180, 633160, 633140,
-  624000, 623980, 623960, 623940,
-  624400, 624380, 624360, 624340,
-  624800, 624780, 624760, 624740,
-  625200, 625180, 625160, 625140,
-  616000, 615980, 615960, 615940,
-  616400, 616380, 616360, 616340,
-  616800, 616780, 616760, 616740,
-  617200, 617180, 617160, 617140 ;
-}
diff --git a/ncdap_test/run_ncdap_tests.sh b/ncdap_test/run_ncdap_tests.sh
index b17f0c4..9f53ad1 100755
--- a/ncdap_test/run_ncdap_tests.sh
+++ b/ncdap_test/run_ncdap_tests.sh
@@ -6,24 +6,9 @@
 # will be executed in a different directory
 # than the ontaining it; so capture the path to this script
 # as the location of the source directory.
-srcdir=`dirname $0`
-cd $srcdir
-srcdir=`pwd`
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir="$srcdir"/..
-fi
-tmp=`echo ${srcdir}|sed -e 's/^\\\\//g'`
-if test ${tmp} = ${srcdir} ; then
-  srcdir=`pwd`/${srcdir}
-  tmp=`echo ${srcdir}|sed -e 's/\\\\$//g'`
-  srcdir=${tmp}
-fi
-echo "srcdir=${srcdir}"
-# Also compute the build directory
-#builddir=`pwd`/..
-builddir=${srcdir}/..
-echo "builddir=${builddir}"
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
 # Locate the expected directory
 expected="${srcdir}/expected"
diff --git a/ncdap_test/t_auth.c b/ncdap_test/t_auth.c
index 62cb0b5..92c0fc8 100644
--- a/ncdap_test/t_auth.c
+++ b/ncdap_test/t_auth.c
@@ -9,6 +9,7 @@
 #define DEBUG
 
 #include "netcdf.h"
+#include "nctestserver.h"
 
 #undef NOEMBED
 #undef NOLOCAL
@@ -20,12 +21,11 @@
 #define RC ".ocrc"
 #define SPECRC "./ocrc"
 
-#define DEFAULTTESTSERVER "remotetest.unidata.ucar.edu"
 #define USERPWD "tiggeUser:tigge"
 #define COOKIEFILE "./cookies"
 
-#define URL1 "https://%s@%s/thredds/dodsC/restrict/testData.nc"
-#define URL2 "https://%s/thredds/dodsC/restrict/testData.nc"
+#define URL1 "https://%s@%s/dodsC/restrict/testData.nc"
+#define URL2 "https://%s/dodsC/restrict/testData.nc"
 #define URL3 "https://%s@thredds-test.ucar.edu/thredds/dodsC/restrict/testData.nc"
 
 /* Embedded user:pwd */
@@ -63,7 +63,7 @@ main(int argc, char** argv)
 
     fprintf(stderr,"Testing: Authorization\n");
 
-    dfaltsvc = DEFAULTTESTSERVER;
+    dfaltsvc = nc_findtestserver("thredds",0,REMOTETESTSERVERS);
     snprintf(url1,sizeof(url1),URL1,USERPWD,dfaltsvc); /* embedded */
     snprintf(url2,sizeof(url2),URL2,dfaltsvc); /* using rc file */
 
diff --git a/ncdap_test/t_dap.c b/ncdap_test/t_dap.c
index 26c597f..ae7160b 100644
--- a/ncdap_test/t_dap.c
+++ b/ncdap_test/t_dap.c
@@ -3,6 +3,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "netcdf.h"
+#include "t_srcdir.h"
 
 
 #undef GENERATE
@@ -110,7 +111,7 @@ int main()
     int ncid, varid;
     int ncstat = NC_NOERR;
     char* url;
-    char* topsrcdir;
+    const char* topsrcdir;
     size_t len;
 #ifndef USE_NETCDF4
     int i,j;
@@ -120,12 +121,8 @@ int main()
 	server downtime issues
      */
     
-    /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
-        exit(1);
-    }    
+    topsrcdir = gettopsrcdir();
+
     len = strlen("file://") + strlen(topsrcdir) + strlen("/ncdap_test/testdata3/test.02") + 1;
 #ifdef DEBUG
     len += strlen("[log][show=fetch]");
diff --git a/ncdap_test/t_dap3a.c b/ncdap_test/t_dap3a.c
index f4bbb08..64bcb1b 100644
--- a/ncdap_test/t_dap3a.c
+++ b/ncdap_test/t_dap3a.c
@@ -4,6 +4,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "netcdf.h"
+#include "t_srcdir.h"
 
 
 #undef GENERATE
@@ -111,7 +112,7 @@ int main()
     int ncid, varid;
     int ncstat = NC_NOERR;
     char* url;
-    char* topsrcdir;
+    const char* topsrcdir;
     size_t len;
 #ifndef USE_NETCDF4
     int i,j;
@@ -121,12 +122,8 @@ int main()
 	server downtime issues
      */
     
-    /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"$abs_top_srcdir not defined: using '../'");
-	topsrcdir = "..";
-    }    
+    topsrcdir = gettopsrcdir();
+
     len = strlen("file://") + strlen(topsrcdir) + strlen("/ncdap_test/testdata3/test.02") + 1;
 #ifdef DEBUG
     len += strlen("[log][show=fetch]");
@@ -146,6 +143,7 @@ int main()
 
     /* open file, get varid */
     CHECK(nc_open(url, NC_NOWRITE, &ncid));
+    
     /* extract the string case for netcdf-3*/
 #ifndef USE_NETCDF4
     CHECK(nc_inq_varid(ncid, "s", &varid));
diff --git a/ncdap_test/t_dap3c.c b/ncdap_test/t_dap3c.c
index 48ace4b..3ce713e 100644
--- a/ncdap_test/t_dap3c.c
+++ b/ncdap_test/t_dap3c.c
@@ -2,7 +2,8 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include <netcdf.h>
+#include "netcdf.h"
+#include "t_srcdir.h"
 
 #define VAR "i32"
 
@@ -20,15 +21,12 @@ main()
     size_t start[1];
     size_t count[1];
     int ok = 1;    
-    char* topsrcdir;
+    const char* topsrcdir;
     char url[4096];
 
-    /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
-        exit(1);
-    }    
+
+    topsrcdir = gettopsrcdir();
+
     strcpy(url,"file://");
     strcat(url,topsrcdir);
     strcat(url,"/ncdap_test/testdata3/test.02");
diff --git a/ncdap_test/t_dap4.c b/ncdap_test/t_dap4.c
index 27fb1b7..8144d2e 100644
--- a/ncdap_test/t_dap4.c
+++ b/ncdap_test/t_dap4.c
@@ -3,7 +3,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "netcdf.h"
-
+#include "t_srcdir.h"
 
 #undef GENERATE
 
@@ -110,7 +110,7 @@ int main()
     int ncid, varid;
     int ncstat = NC_NOERR;
     char* url;
-    char* topsrcdir;
+    const char* topsrcdir;
     size_t len;
 #ifndef USE_NETCDF4
     int i,j;
@@ -120,12 +120,8 @@ int main()
 	server downtime issues
      */
     
-    /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
-        exit(1);
-    }    
+    topsrcdir = gettopsrcdir();
+
     len = strlen("file://") + strlen(topsrcdir) + strlen("/ncdap_test/testdata3/test.02") + 1;
 #ifdef DEBUG
     len += strlen("[log][show=fetch]");
diff --git a/ncdap_test/t_dap4a.c b/ncdap_test/t_dap4a.c
index 65b5492..6c78bdb 100644
--- a/ncdap_test/t_dap4a.c
+++ b/ncdap_test/t_dap4a.c
@@ -3,7 +3,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "netcdf.h"
-
+#include "t_srcdir.h"
 
 #undef GENERATE
 
@@ -110,7 +110,7 @@ int main()
     int ncid, varid;
     int ncstat = NC_NOERR;
     char* url;
-    char* topsrcdir;
+    const char* topsrcdir;
     size_t len;
 #ifndef USE_NETCDF4
     int i,j;
@@ -121,11 +121,8 @@ int main()
      */
     
     /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
-        exit(1);
-    }    
+    topsrcdir = gettopsrcdir();
+
     len = strlen("file://") + strlen(topsrcdir) + strlen("/ncdap_test/testdata3/test.02") + 1;
 #ifdef DEBUG
     len += strlen("[log][show=fetch]");
diff --git a/ncdap_test/t_dap4c.c b/ncdap_test/t_dap4c.c
index 8f296a4..80dad48 100644
--- a/ncdap_test/t_dap4c.c
+++ b/ncdap_test/t_dap4c.c
@@ -2,7 +2,8 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include <netcdf.h>
+#include "netcdf.h"
+#include "t_srcdir.h"
 
 #define VAR "i32"
 
@@ -21,15 +22,11 @@ main()
     size_t count[1];
     int ok = 1;    
 
-    char* topsrcdir;
+    const char* topsrcdir;
     char url[4096];
 
-    /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
-        exit(1);
-    }    
+    topsrcdir = gettopsrcdir();
+
     strcpy(url,"file://");
     strcat(url,topsrcdir);
     strcat(url,"/ncdap_test/testdata3/test.02");
diff --git a/ncdap_test/t_srcdir.h b/ncdap_test/t_srcdir.h
new file mode 100644
index 0000000..406ebff
--- /dev/null
+++ b/ncdap_test/t_srcdir.h
@@ -0,0 +1,15 @@
+#define XSTRINGIFY(s) #s
+#define STRINGIFY(s) XSTRINGIFY(s)
+
+static const char*
+gettopsrcdir(void)
+{
+    const char* topsrcdir;
+    topsrcdir = STRINGIFY(TOPSRCDIR);
+    if(topsrcdir == NULL) {
+        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined\n");
+        exit(1);
+    }    
+    fprintf(stderr,"topsrcdir=%s\n",topsrcdir);
+    return topsrcdir;
+}
diff --git a/ncdap_test/test_cvt.c b/ncdap_test/test_cvt.c
index b9c8004..112b2b4 100644
--- a/ncdap_test/test_cvt.c
+++ b/ncdap_test/test_cvt.c
@@ -3,6 +3,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "netcdf.h"
+#include "t_srcdir.h"
 
 
 #undef GENERATE
@@ -110,7 +111,7 @@ int main()
     int ncid, varid;
     int ncstat = NC_NOERR;
     char* url;
-    char* topsrcdir;
+    const char* topsrcdir;
     size_t len;
 #ifndef USE_NETCDF4
     int i,j;
@@ -120,12 +121,8 @@ int main()
 	server downtime issues
      */
     
-    /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
-        exit(1);
-    }    
+    topsrcdir = gettopsrcdir();
+
     len = strlen("file://") + strlen(topsrcdir) + strlen("/ncdap_test/testdata3/test.02") + 1;
 #ifdef DEBUG
     len += strlen("[log][show=fetch]");
diff --git a/ncdap_test/test_environment.c b/ncdap_test/test_environment.c
new file mode 100644
index 0000000..6c2eeb9
--- /dev/null
+++ b/ncdap_test/test_environment.c
@@ -0,0 +1,47 @@
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Support stringification of -D macros */
+#define XSTRINGIFY(s) #s
+#define STRINGIFY(s) XSTRINGIFY(s)
+
+#ifdef _MSC_VER
+static const char* SEP = "\\";
+#else
+static const char* SEP = "/";
+#endif
+
+int
+main(int argc, char** argv)
+{
+    char arg[8192];
+    char* p;
+    const char* result = "";
+
+    if(argc < 2) goto done; /* return nothing */
+    strncpy(arg,argv[1],sizeof(arg));
+    for(p=arg;*p;p++) { /* convert to lower case */
+	int c = *p;
+        if(c >= 'A' && c <= 'Z') c = ((c - 'A') + 'a');
+	*p = (char)c;
+    }    
+    do {
+#ifdef TOPSRCDIR
+    if(strcmp(arg,"topsrcdir") == 0) {
+        result = STRINGIFY(TOPSRCDIR);
+	break;
+    }
+#endif
+#ifdef TOPBINDIR
+    if(strcmp(arg,"topbindir") == 0) {
+        result = STRINGIFY(TOPBINDIR);
+	break;
+    }
+#endif
+    } while(0);
+done:
+    printf("%s",result);
+    return 0;
+}
diff --git a/ncdap_test/test_nstride_cached.c b/ncdap_test/test_nstride_cached.c
index f98ce48..47fe01f 100644
--- a/ncdap_test/test_nstride_cached.c
+++ b/ncdap_test/test_nstride_cached.c
@@ -53,6 +53,7 @@ incorrect data return
 #include<string.h>
 #include "netcdf.h"
 #include "ncdispatch.h"
+#include "nctestserver.h"
 
 #define VERBOSE 1
 
@@ -93,14 +94,7 @@ main()
     char* svc;
 
     /* Find Test Server */
-    svc = getenv("THREDDSTESTSERVER");
-    if(svc != NULL) {
-        const char* testserver[2];
-	testserver[0] = svc;
-	testserver[1] = NULL;
-        svc = NC_findtestserver("thredds",testserver);
-    } else 	
-        svc = NC_findtestserver("thredds",NULL);
+    svc = nc_findtestserver("thredds",0,REMOTETESTSERVERS);
 
     if(svc == NULL) {
         fprintf(stderr,"Cannot locate test server\n");
diff --git a/ncdap_test/test_partvar.c b/ncdap_test/test_partvar.c
index d738150..7ccb4bd 100644
--- a/ncdap_test/test_partvar.c
+++ b/ncdap_test/test_partvar.c
@@ -5,8 +5,9 @@ Test part variable fetch code
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include <netcdf.h>
-#include <ncdispatch.h>
+#include "netcdf.h"
+#include "ncdispatch.h"
+#include "nctestserver.h"
 
 /* The DDS in netcdf classic form is as follows: 
 netcdf ingrid {
@@ -99,14 +100,7 @@ main()
     const char* svc = NULL;
 
     /* Find Test Server */
-    svc = getenv("DTSTESTSERVER");
-    if(svc != NULL) {
-        const char* dtstestserver[2];
-	dtstestserver[0] = svc;
-	dtstestserver[1] = NULL;
-        svc = NC_findtestserver("dts",dtstestserver);
-    } else 	
-        svc = NC_findtestserver("dts",NULL);
+    svc = nc_findtestserver("dts",0,REMOTETESTSERVERS);
 
     if(svc == NULL) {
 	fprintf(stderr,"Cannot locate test server\n");
diff --git a/ncdap_test/test_partvar2.c b/ncdap_test/test_partvar2.c
index 973a5e3..4ddfccb 100644
--- a/ncdap_test/test_partvar2.c
+++ b/ncdap_test/test_partvar2.c
@@ -5,8 +5,9 @@ Test part variable fetch code
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include <netcdf.h>
-#include <ncdispatch.h>
+#include "netcdf.h"
+#include "ncdispatch.h"
+#include "nctestserver.h"
 
 /* The DDS in netcdf classic form is as follows: 
 netcdf test {
@@ -88,14 +89,7 @@ main()
     char url[4096];
 
     /* Find Test Server */
-    svc = getenv("DTSTESTSERVER");
-    if(svc != NULL) {
-        const char* testserver[2];
-	testserver[0] = svc;
-	testserver[1] = NULL;
-        svc = NC_findtestserver("dts",testserver);
-    } else 	
-        svc = NC_findtestserver("dts",NULL);
+    svc = nc_findtestserver("dts",0, REMOTETESTSERVER);
 
     if(svc == NULL) {
 	fprintf(stderr,"Cannot locate test server\n");
diff --git a/ncdap_test/test_vara.c b/ncdap_test/test_vara.c
index d636d45..e3ae045 100644
--- a/ncdap_test/test_vara.c
+++ b/ncdap_test/test_vara.c
@@ -1,7 +1,8 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include <netcdf.h>
+#include "netcdf.h"
+#include "t_srcdir.h"
 
 /* The DDS in netcdf classic form is as follows: 
 netcdf test {
@@ -75,15 +76,11 @@ main()
     int retval;
     size_t start[RANK];
     size_t count[RANK];
-    char* topsrcdir;
+    const char* topsrcdir;
     char url[4096];
 
-    /* Assume that TESTS_ENVIRONMENT was set */
-    topsrcdir = getenv("TOPSRCDIR");
-    if(topsrcdir == NULL) {
-        fprintf(stderr,"*** FAIL: $abs_top_srcdir not defined: location= %s:%d\n",__FILE__,__LINE__);
-        exit(1);
-    }    
+    topsrcdir = gettopsrcdir();
+
     strcpy(url,"file://");
     strcat(url,topsrcdir);
     strcat(url,"/ncdap_test/testdata3/test.06");
diff --git a/ncdap_test/test_varm3.c b/ncdap_test/test_varm3.c
index 353f1eb..84bd767 100644
--- a/ncdap_test/test_varm3.c
+++ b/ncdap_test/test_varm3.c
@@ -21,6 +21,7 @@ netcdf-4.1-beta2-snapshot2009091100
 #include <string.h>
 #include "netcdf.h"
 #include "ncdispatch.h"
+#include "nctestserver.h"
 
 #undef STANDALONE
 
@@ -92,14 +93,7 @@ main()
 #endif
 
     /* Find Test Server */
-    svc = getenv("THREDDSTESTSERVER");
-    if(svc != NULL) {
-        const char* testserver[2];
-	testserver[0] = svc;
-	testserver[1] = NULL;
-        svc = NC_findtestserver("thredds",testserver);
-    } else 	
-        svc = NC_findtestserver("thredds",NULL);
+    svc = nc_findtestserver("thredds",0,REMOTETESTSERVERS);
 
     if(svc == NULL) {
         fprintf(stderr,"Cannot locate test server\n");
diff --git a/ncdap_test/testauth.old b/ncdap_test/testauth.old
old mode 100755
new mode 100644
diff --git a/ncdap_test/testauth.sh b/ncdap_test/testauth.sh
index 224de42..536a227 100755
--- a/ncdap_test/testauth.sh
+++ b/ncdap_test/testauth.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 RCEMBED=1
 RCLOCAL=1
 RCHOME=1
@@ -61,29 +64,6 @@ fi
 BASICUSER=`echo $BASICCOMBO | cut -d: -f1`
 BASICPWD=`echo $BASICCOMBO | cut -d: -f2`
 
-xf() { case $- in *[x]*) set +x; XP=1;; *) XP=0;; esac }
-xo() { case $XP in 1) set -x;; *) set +x;; esac }
-
-xf
-NCDUMP=
-for d in "$WD/../ncdump" "$WD" ; do
-  for o in $d/.libs/ncdump.exe $d/.libs/ncdump $d/ncdump.exe $d/ncdump ; do
-    if test -f $o ; then
-    NCDUMP=$o
-    break;
-    fi
-  done
-  if test "x$NCDUMP" != x; then break; fi
-done
-xo
-
-if test "x$NCDUMP" = x ; then
-echo "no ncdump"
-exit 1
-else
-echo "NCDUMP=$NCDUMP"
-fi
-
 OUTPUT="./.output"
 
 if test "x$TEMP" = x ; then
@@ -97,15 +77,7 @@ HOMERC=`echo "$HOMERC" | sed -e "s|//|/|g"`
 SPECRC="$TEMP/temprc"
 ENVRC="$WD/envrc"
 
-cd `pwd`
-builddir=`pwd`
-# Hack for CYGWIN
-cd $srcdir
-srcdir=`pwd`
-cd ${builddir}
-
 createrc() {
-  xf
   RCP="$1" ; shift
   unset NOPWD
   unset BADPWD
@@ -117,7 +89,6 @@ createrc() {
     esac
     shift
   done
-  xo
   if test "x$RCP" != x ; then
     rm -f $RCP
     echo "Creating rc file $RCP"
@@ -144,7 +115,6 @@ createrc() {
 }
 
 createnetrc() {
-  xf
   NCP="$1" ; shift
   unset NOPWD
   unset BADPWD
@@ -156,7 +126,6 @@ createnetrc() {
     esac
     shift
   done
-  xo
   if test "x$NCP" != x ; then
     rm -f $NCP
     echo "Creating netrc file $NCP"
@@ -228,17 +197,15 @@ NCDUMP="valgrind --leak-check=full $NCDUMP"
 fi
 
 # Initialize
-xf
 save
 reset
-xo
 
 if test "x$RCEMBED" = x1 ; then
   echo "***Testing rc file with embedded user:pwd"
   URL="${PROTO}://${BASICCOMBO}@${URLSERVER}/$URLPATH"
   unset NETRC
   # Invoke ncdump to extract a file the URL
-  echo "command: ${NCDUMP} -h $URL > $OUTPUT"
+  echo "command: ${NCDUMP} -h ${URL} > $OUTPUT"
   ${NCDUMP} -h "$URL" > $OUTPUT
   show
 fi
@@ -250,12 +217,12 @@ NETRC=$NETRCFILE
 if test "x$RCLOCAL" = x1 ; then
   echo "***Testing rc file in local directory"
   # Create the rc file and (optional) netrc fil in ./
-  xf; reset; xo
+  reset
   createnetrc $NETRC
   createrc $LOCALRC
 
   # Invoke ncdump to extract a file using the URL
-  echo "command: ${NCDUMP} -h $URL > $OUTPUT"
+  echo "command: ${NCDUMP} -h ${URL} > $OUTPUT"
   ${NCDUMP} -h "$URL" > $OUTPUT
   show
 fi
@@ -263,12 +230,12 @@ fi
 if test "x$RCHOME" = x1 ; then
   echo "***Testing rc file in home directory"
   # Create the rc file and (optional) netrc file in ./
-  xf; reset; xo
+  reset
   createnetrc $NETRC
   createrc $HOMERC
 
   # Invoke ncdump to extract a file the URL
-  echo "command: ${NCDUMP} -h $URL > $OUTPUT"
+  echo "command: ${NCDUMP} -h ${URL} > $OUTPUT"
   ${NCDUMP} -h "$URL" > $OUTPUT
   show
 fi
@@ -276,12 +243,12 @@ fi
 if test "x$RCSPEC" == x1 ; then
   echo "*** Testing rc file in specified directory"
   # Create the rc file and (optional) netrc file
-  xf; reset; xo
+  reset
   createnetrc $NETRC
   createrc $SPECRC
 
   # Invoke ncdump to extract a file the URL
-  echo "command: ${NCDUMP} -h $URL > $OUTPUT"
+  echo "command: ${NCDUMP} -h ${URL} > $OUTPUT"
   ${NCDUMP} -h "$URL" > $OUTPUT
   show
 fi
@@ -289,14 +256,14 @@ fi
 if test "x$RCENV" = x1 ; then
   echo "*** Testing rc file using env variable"
   # Create the rc file and (optional) netrc file
-  xf; reset; xo
+  reset
   createnetrc $NETRC
   echo "ENV: export DAPRCFILE=$ENVRC"
   export DAPRCFILE=$ENVRC
   createrc $DAPRCFILE
 
   # Invoke ncdump to extract a file the URL
-  echo "command: ${NCDUMP} -h $URL > $OUTPUT"
+  echo "command: ${NCDUMP} -h ${URL} > $OUTPUT"
   ${NCDUMP} -h "$URL" > $OUTPUT
   show
   export DAPRCFILE=
@@ -308,20 +275,19 @@ NETRC=$NETRCFILE
 if test "x$RCPREC" = x1 ; then
   echo "***Testing rc vs netrc file precedence"
   # Create the rc file and (optional) netrc file in ./
-  xf; reset; xo
+  reset
   createnetrc $NETRC badpwd
   createrc $LOCALRC
 
   # Invoke ncdump to extract a file using the URL
-  echo "command: ${NCDUMP} -h $URL > $OUTPUT"
+  echo "command: ${NCDUMP} -h ${URL} > $OUTPUT"
   ${NCDUMP} -h "$URL" > $OUTPUT
+  ${NCDUMP} -h "$URL"
   show
 fi
 
-xf
 reset
 restore
-xo
 
 exit
 
diff --git a/ncdap_test/testauth.sh.old b/ncdap_test/testauth.sh.old
old mode 100755
new mode 100644
diff --git a/ncdap_test/testdata3/Makefile.am b/ncdap_test/testdata3/Makefile.am
old mode 100755
new mode 100644
diff --git a/ncdap_test/testdata3/Makefile.in b/ncdap_test/testdata3/Makefile.in
index c7b6d04..60a2434 100644
--- a/ncdap_test/testdata3/Makefile.in
+++ b/ncdap_test/testdata3/Makefile.in
@@ -170,6 +170,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -197,12 +198,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -237,6 +240,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/ncdap_test/testurl.sh b/ncdap_test/testurl.sh
index c9f88f7..4f10caf 100755
--- a/ncdap_test/testurl.sh
+++ b/ncdap_test/testurl.sh
@@ -1,5 +1,4 @@
 #!/bin/sh
-#set -x
 
 #NOP=1
 #NOS=1
@@ -16,30 +15,15 @@
 
 # capture the build directory
 # Do a hack to remove e.g. c: for CYGWIN
-builddir=`pwd`/..
-if test "x$TOPSRCDIR" != x ; then
-srcdir="$TOPSRCDIR/ncdap_test"
-else
-srcdir=`dirname $0`
-fi
-# canonical
-cd $srcdir
-srcdir=`pwd`
-
-# Hack for CYGWIN
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`echo $srcdir | sed 's/\/c\//c:\//g'`
-    builddir=`echo $builddir | sed 's/\/c\//c:\//g'`
-fi
-cd ${builddir}/ncdap_test
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
 OCLOGFILE=stderr
 if test "x$DBG" = x1 ; then
 SHOW=1
 fi
 
-NCDUMP=$builddir/ncdump/ncdump
-
 URL="http://remotetest.unidata.ucar.edu/dts/test.03"
 
 PREFIX="[log][show=fetch]"
diff --git a/ncdap_test/tst_formatx.sh b/ncdap_test/tst_formatx.sh
index 1e26047..a87594f 100755
--- a/ncdap_test/tst_formatx.sh
+++ b/ncdap_test/tst_formatx.sh
@@ -2,13 +2,15 @@
 # This shell script tests the output several previous tests.
 # $Id: tst_output.sh,v 1.17 2010/05/14 16:21:15 ed Exp $
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
 echo ""
 echo "*** Testing extended file format output."
 set -e
 
 # Figure our dst server
-DTS=`./nctestserver dts ${DTSTESTSERVER}` 
+DTS=`./findtestserver dap2 dts`
 if test "x$DTS" = "x" ; then
 echo "cannot locate test server for dts"
 exit
@@ -18,7 +20,7 @@ URL="$DTS/test.03"
 ECODE=0
 echo "Test extended format output for a DAP2  file"
 rm -f tmp
-../ncdump/ncdump -K $URL >tmp
+${NCDUMP} -K "${URL}" >tmp
 if ! grep 'DAP2 mode=00000000' <tmp ; then
 echo "*** Fail: extended format for a DAP2 file"
 ECODE=1
diff --git a/ncdap_test/tst_longremote3.sh b/ncdap_test/tst_longremote3.sh
index 706f2c7..01f2cbe 100755
--- a/ncdap_test/tst_longremote3.sh
+++ b/ncdap_test/tst_longremote3.sh
@@ -4,18 +4,26 @@
 # will be executed in a different directory
 # than the one containing it; so capture the path to this script
 # as the location of the source directory.
-srcdir=`dirname $0`
+
+topsrcdir=`./test_environment topsrcdir`
+if test "x$topsrcdir" != x ; then
+  srcdir="$topsrcdir/ncdap_test"
+else
+  srcdir=`dirname $0`
+fi
+
 cd $srcdir
 srcdir=`pwd`
 
-# compute the build directory
-builddir=`pwd`/..
 # Hack for CYGWIN
 cd $srcdir
 if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
     srcdir=`pwd | sed 's/\/c\//c:\//g'`
     builddir="$srcdir"/..
 fi
+
+# compute the build directory
+builddir=`pwd`/..
 cd ${builddir}/ncdap_test
 
 sh ${srcdir}/tst_remote.sh "$srcdir" "$builddir" "3" "" "long"
diff --git a/ncdap_test/tst_longremote4.sh b/ncdap_test/tst_longremote4.sh
deleted file mode 100755
index 8692567..0000000
--- a/ncdap_test/tst_longremote4.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-
-# if this is part of a distcheck action, then this script
-# will be executed in a different directory
-# than the one containing it; so capture the path to this script
-# as the location of the source directory.
-srcdir=`dirname $0`
-cd $srcdir
-srcdir=`pwd`
-# compute the build directory
-builddir=`pwd`/..
-# Hack for CYGWIN
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir="$srcdir"/..
-fi
-cd ${builddir}/ncdap_test
-
-sh ${srcdir}/tst_remote.sh "$srcdir" "$builddir" "4" "" "long"
-exit
diff --git a/ncdap_test/tst_ncdap.sh b/ncdap_test/tst_ncdap.sh
index 77cc32a..cc58538 100755
--- a/ncdap_test/tst_ncdap.sh
+++ b/ncdap_test/tst_ncdap.sh
@@ -59,8 +59,6 @@ RESULTSDIR="./results"
 NCDUMP="${builddir}/ncdump/ncdump $FLAGS"
 if test "x$leakcheck" = "x1" ; then
 VALGRIND="valgrind -q --error-exitcode=2 --leak-check=full"
-else
-VALGRIND=
 fi
 
 rm -fr ${RESULTSDIR}
diff --git a/ncdap_test/tst_ncdap3.sh b/ncdap_test/tst_ncdap3.sh
index 3b0f3b1..0f82ff7 100755
--- a/ncdap_test/tst_ncdap3.sh
+++ b/ncdap_test/tst_ncdap3.sh
@@ -1,38 +1,13 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 set -e
 
 #X="-x"
 #grind="checkleaks"
 
-# if this is part of a distcheck action, then this script
-# will be executed in a different directory
-# than the one containing it; so capture the path to this script
-# as the location of the source directory.
-
-srcdir=`dirname $0`
-#set -x
-# compute the build directory
-# Do a hack to remove e.g. c: for MSYS
-cd `pwd`
-builddir=`pwd`/..
-
-# Hack for MSYS
-cd $srcdir
-srcdir=`pwd`
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir=`echo $builddir | sed 's/\/c\//c:\//g'`
-
-    srcdir=`pwd | sed 's/\/g\//g:\//g'`
-    builddir=`echo $builddir | sed 's/\/g\//g:\//g'`
-fi
-
-
-
-cd ${builddir}/ncdap_test
-
-
 #exec sh $X ${srcdir}/tst_ncdap.sh "$srcdir" "$builddir" "file3" $grind
 exec sh $X ${srcdir}/tst_ncdap.sh "$srcdir" "$builddir" "dds3" $grind
 
diff --git a/ncdap_test/tst_ncdap4.sh b/ncdap_test/tst_ncdap4.sh
deleted file mode 100755
index c421e3a..0000000
--- a/ncdap_test/tst_ncdap4.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-
-set -e
-
-#X="-x"
-#grind="checkleaks"
-
-# if this is part of a distcheck action, then this script
-# will be executed in a different directory
-# than the one containing it; so capture the path to this script
-# as the location of the source directory.
-srcdir=`dirname $0`
-cd $srcdir
-srcdir=`pwd`
-
-# compute the build directory
-# Do a hack to remove e.g. c: for CYGWIN
-builddir=`pwd`/..
-# Hack for CYGWIN
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir="$srcdir"/..
-fi
-cd ${builddir}/ncdap_test
-
-exec $X ${srcdir}/tst_ncdap.sh "$srcdir" "$builddir" "file4" $grind
diff --git a/ncdap_test/tst_nocache3.sh b/ncdap_test/tst_nocache3.sh
index 238edeb..eb48804 100755
--- a/ncdap_test/tst_nocache3.sh
+++ b/ncdap_test/tst_nocache3.sh
@@ -6,7 +6,13 @@ set -e
 # will be executed in a different directory
 # than the one containing it; so capture the path to this script
 # as the location of the source directory.
-srcdir=`dirname $0`
+
+if test "x$topsrcdir" != x ; then
+  srcdir="$topsrcdir/ncdap_test"
+else
+  srcdir=`dirname $0`
+fi
+
 cd $srcdir
 srcdir=`pwd`
 # compute the build directory
diff --git a/ncdap_test/tst_nocache4.sh b/ncdap_test/tst_nocache4.sh
deleted file mode 100755
index 6d02f0f..0000000
--- a/ncdap_test/tst_nocache4.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-set -e
-
-# if this is part of a distcheck action, then this script
-# will be executed in a different directory
-# than the one containing it; so capture the path to this script
-# as the location of the source directory.
-srcdir=`dirname $0`
-cd $srcdir
-srcdir=`pwd`
-# compute the build directory
-# Do a hack to remove e.g. c: for CYGWIN
-builddir=`pwd`/..
-# Hack for CYGWIN
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir="$srcdir"/..
-fi
-cd ${builddir}/ncdap_test
-
-sh ${srcdir}/tst_remote.sh "$srcdir" "$builddir" "4" "nocache" ""
-exit
diff --git a/ncdap_test/tst_remote.sh b/ncdap_test/tst_remote.sh
index 3c240ce..f232f81 100755
--- a/ncdap_test/tst_remote.sh
+++ b/ncdap_test/tst_remote.sh
@@ -1,27 +1,28 @@
 #!/bin/sh
-set -x
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 set -e
 
 quiet=0
 leakcheck=0
 timing=0
 
-# Figure our dst server
-DTS=`./nctestserver dts ${DTSTESTSERVER}`
+# Figure our dst server; if none, then just stop
+DTS=`${execdir}/findtestserver dap2 dts`
 if test "x$DTS" = "x" ; then
-echo "cannot locate test server for dts"
+echo "WARNING: Cannot locate test server for dts"
 exit
 fi
 
 PARAMS="[log]"
 #PARAMS="${PARAMS}[show=fetch]"
 
-
 # Determine If we're on OSX or Linux
 
 myplatform=`uname -a | cut -d" " -f 1`
 
-
 #OCLOGFILE=/dev/null
 OCLOGFILE="" ; export OCLOGFILE
 
@@ -201,11 +202,8 @@ esac
 
 RESULTSDIR="./results"
 # Locate some tools
-NCDUMP="${builddir}/ncdump/ncdump"
 if test "x$leakcheck" = x1 ; then
 VALGRIND="valgrind -q --error-exitcode=2 --leak-check=full"
-else
-VALGRIND=
 fi
 if test "x$timing" = "x1" ; then TIMECMD="time"; else TIMECMD=""; fi
 
diff --git a/ncdap_test/tst_remote3.sh b/ncdap_test/tst_remote3.sh
index 2ad2693..a320be0 100755
--- a/ncdap_test/tst_remote3.sh
+++ b/ncdap_test/tst_remote3.sh
@@ -1,23 +1,9 @@
 #!/bin/sh
 
-set -e
-
-# if this is part of a distcheck action, then this script
-# will be executed in a different directory
-# than the one containing it; so capture the path to this script
-# as the location of the source directory.
-srcdir=`dirname $0`
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
-# compute the build directory
-builddir=`pwd`/..
-# Hack for CYGWIN
-cd $srcdir
-srcdir=`pwd`
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir="$srcdir"/..
-fi
-cd ${builddir}/ncdap_test
+set -e
 
 sh  ${srcdir}/tst_remote.sh "$srcdir" "$builddir" "3" "" ""
 exit
diff --git a/ncdap_test/tst_remote4.sh b/ncdap_test/tst_remote4.sh
deleted file mode 100755
index 6aba70b..0000000
--- a/ncdap_test/tst_remote4.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-set -e
-
-# if this is part of a distcheck action, then this script
-# will be executed in a different directory
-# than the one containing it; so capture the path to this script
-# as the location of the source directory.
-srcdir=`dirname $0`
-cd $srcdir
-srcdir=`pwd`
-# compute the build directory
-# Do a hack to remove e.g. c: for CYGWIN
-builddir=`pwd`/..
-# Hack for CYGWIN
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir="$srcdir"/..
-fi
-cd ${builddir}/ncdap_test
-
-sh ${srcdir}/tst_remote.sh "$srcdir" "$builddir" "4" "" ""
-exit
diff --git a/ncdap_test/tst_special.sh b/ncdap_test/tst_special.sh
index 0bd59e7..fd15c54 100755
--- a/ncdap_test/tst_special.sh
+++ b/ncdap_test/tst_special.sh
@@ -1,28 +1,13 @@
 #!/bin/sh
 
-set -e
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.shs
 
-# if this is part of a distcheck action, then this script
-# will be executed in a different directory
-# than the one containing it; so capture the path to this script
-# as the location of the source directory.
-srcdir=`dirname $0`
-cd $srcdir
-srcdir=`pwd`
-
-# compute the build directory
-builddir=`pwd`/..
-# Hack for CYGWIN
-if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then
-    srcdir=`pwd | sed 's/\/c\//c:\//g'`
-    builddir="$srcdir"/..
-fi
-cd ${builddir}/ncdap_test
+set -e
 
 #EXTSET="hdr dmp"
 EXTSET="dmp"
 
-#set -x
 quiet=0
 leakcheck=0
 
@@ -79,11 +64,8 @@ XFAILTESTS="qscat_high_wind totalAagg  world-unfilter-monthly.nc duacs_global_nr
 
 RESULTSDIR="./results"
 # Locate some tools
-NCDUMP="${builddir}/ncdump/ncdump"
 if test "x$leakcheck" = x1 ; then
 VALGRIND="valgrind -q --error-exitcode=2 --leak-check=full"
-else
-VALGRIND=
 fi
 
 rm -fr ${RESULTSDIR}
diff --git a/ncdap_test/tst_tds.sh b/ncdap_test/tst_tds.sh
index f83dc21..b098b53 100755
--- a/ncdap_test/tst_tds.sh
+++ b/ncdap_test/tst_tds.sh
@@ -6,7 +6,13 @@ set -e
 # will be executed in a different directory
 # than the one containing it; so capture the path to this script
 # as the location of the source directory.
-srcdir=`dirname $0`
+
+if test "x$topsrcdir" != x ; then
+  srcdir="$topsrcdir/ncdap_test"
+else
+  srcdir=`dirname $0`
+fi
+
 cd $srcdir
 srcdir=`pwd`
 
@@ -20,7 +26,6 @@ fi
 
 cd ${builddir}/ncdap_test
 
-#set -x
 quiet=0
 cache=1
 leakcheck=0
@@ -88,8 +93,6 @@ NCCOPY="${builddir}/ncdump/nccopy"
 
 if test "x$leakcheck" = x1 ; then
 VALGRIND="valgrind -q --error-exitcode=2 --leak-check=full"
-else
-VALGRIND=
 fi
 
 rm -fr ${RESULTSDIR}
diff --git a/ncdump/CMakeLists.txt b/ncdump/CMakeLists.txt
index 8d888a1..c9213ee 100644
--- a/ncdump/CMakeLists.txt
+++ b/ncdump/CMakeLists.txt
@@ -3,8 +3,13 @@ IF(BUILD_SHARED_LIBS AND WIN32)
   remove_definitions(-DDLL_NETCDF)
 ENDIF()
 
+# These generate some files used in ncdump testing
+# Specifically, they generate ctest0.nc ctest0_64.nc
+# Before, these .nc files were placed in the same place as the
+# .c file: namely build/ncdump.
+# This complicates the shell tests that use it.
 ADD_CUSTOM_COMMAND(
-  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ctest.c
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CONFIG_TYPE}/ctest.c
   COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/ref_ctest.c"
   "${CMAKE_CURRENT_BINARY_DIR}/ctest.c"
   )
@@ -55,39 +60,54 @@ IF(ENABLE_TESTS)
   ADD_EXECUTABLE(rewrite-scalar rewrite-scalar.c)
   ADD_EXECUTABLE(bom bom.c)
   ADD_EXECUTABLE(tst_dimsizes tst_dimsizes.c)
+  ADD_EXECUTABLE(nctrunc nctrunc.c)
   TARGET_LINK_LIBRARIES(rewrite-scalar netcdf)
   TARGET_LINK_LIBRARIES(bom netcdf)
   TARGET_LINK_LIBRARIES(tst_dimsizes netcdf)
 
-IF(USE_NETCDF4)
-  ADD_EXECUTABLE(tst_fileinfo tst_fileinfo.c)
-  TARGET_LINK_LIBRARIES(tst_fileinfo netcdf)
-  add_sh_test(ncdump tst_fileinfo)
-ENDIF()
+  IF(USE_NETCDF4)
+    ADD_EXECUTABLE(tst_fileinfo tst_fileinfo.c)
+    TARGET_LINK_LIBRARIES(tst_fileinfo netcdf)
+  ENDIF()
 
-IF(MSVC)
-  SET_TARGET_PROPERTIES(rewrite-scalar PROPERTIES RUNTIME_OUTPUT_DIRECTORY
-    ${CMAKE_CURRENT_BINARY_DIR})
-  SET_TARGET_PROPERTIES(rewrite-scalar PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
-    ${CMAKE_CURRENT_BINARY_DIR})
-  SET_TARGET_PROPERTIES(rewrite-scalar PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
-    ${CMAKE_CURRENT_BINARY_DIR})
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(rewrite-scalar PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(rewrite-scalar PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(rewrite-scalar PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+      ${CMAKE_CURRENT_BINARY_DIR})
+
+    SET_TARGET_PROPERTIES(bom PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(bom PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(bom PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+      ${CMAKE_CURRENT_BINARY_DIR})
+
+    SET_TARGET_PROPERTIES(tst_dimsizes PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(tst_dimsizes PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(tst_dimsizes PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+      ${CMAKE_CURRENT_BINARY_DIR})
+
+    SET_TARGET_PROPERTIES(nctrunc PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(nctrunc PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+      ${CMAKE_CURRENT_BINARY_DIR})
+    SET_TARGET_PROPERTIES(nctrunc PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+      ${CMAKE_CURRENT_BINARY_DIR})
 
-  SET_TARGET_PROPERTIES(bom PROPERTIES RUNTIME_OUTPUT_DIRECTORY
-    ${CMAKE_CURRENT_BINARY_DIR})
-  SET_TARGET_PROPERTIES(bom PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
-    ${CMAKE_CURRENT_BINARY_DIR})
-  SET_TARGET_PROPERTIES(bom PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
-    ${CMAKE_CURRENT_BINARY_DIR})
+    IF(USE_NETCDF4)
+      SET_TARGET_PROPERTIES(tst_fileinfo PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+        ${CMAKE_CURRENT_BINARY_DIR})
+      SET_TARGET_PROPERTIES(tst_fileinfo PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+        ${CMAKE_CURRENT_BINARY_DIR})
+      SET_TARGET_PROPERTIES(tst_fileinfo PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+        ${CMAKE_CURRENT_BINARY_DIR})
 
-  SET_TARGET_PROPERTIES(tst_dimsizes PROPERTIES RUNTIME_OUTPUT_DIRECTORY
-    ${CMAKE_CURRENT_BINARY_DIR})
-  SET_TARGET_PROPERTIES(tst_dimsizes PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
-    ${CMAKE_CURRENT_BINARY_DIR})
-  SET_TARGET_PROPERTIES(tst_dimsizes PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
-    ${CMAKE_CURRENT_BINARY_DIR})
-  SET_TARGET_PROPERTIES(tst_fileinfo PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
-    ${CMAKE_CURRENT_BINARY_DIR})
+  ENDIF(USE_NETCDF4)
 ENDIF()
 
   # Base tests
@@ -107,6 +127,7 @@ ENDIF()
   add_sh_test(ncdump run_utf8_tests)
   IF(USE_NETCDF4)
     add_sh_test(ncdump run_utf8_nc4_tests)
+    add_sh_test(ncdump tst_fileinfo)
   ENDIF(USE_NETCDF4)
 
   add_sh_test(ncdump tst_nccopy3)
@@ -176,7 +197,14 @@ ENDIF()
       add_sh_test(ncdump tst_netcdf4_4)
     ENDIF()
 
-
+    ###
+    # Some test reordering was required to ensure these tests
+    # only ran after ncdump was built.
+    ###
+    add_sh_test(ncdump run_ncgen_tests)
+    IF(USE_NETCDF4)
+      add_sh_test(ncdump run_ncgen_nc4_tests)
+    ENDIF()
 
     IF(NOT MSVC)
       add_sh_test(ncdump tst_nccopy4)
diff --git a/ncdump/Make0 b/ncdump/Make0
index 3e26c78..370e2b5 100644
--- a/ncdump/Make0
+++ b/ncdump/Make0
@@ -1,11 +1,17 @@
 # Test c output
 T=t
+#ARGS=./x.nc
+
+TF=test_atomic_array.cdl
+
 #CMD=valgrind --leak-check=full
 CMD=gdb --args
 
-HDF4=1
+#HDF4=1
 #PAR=1
 
+TD=/cygdrive/d/git/thredds/dap4/d4tests/src/test/data/resources/testfiles
+
 CFLAGS=-Wall -g -O0 -I.. -I../include
 
 ifdef PAR
@@ -15,7 +21,7 @@ LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz  -ldl
 else
 ifdef HDF4
 CC=gcc
-LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lmfhdf -ldf -lz  -ldl -lm -lcurl -ljpeg
+LDFLAGS=../liblib/.libs/libnetcdf.a -L/usr/local/lib -lhdf5_hl -lhdf5 -lz  -ldl -lm -lcurl
 else
 CC=gcc
 #LDFLAGS=../liblib/.libs/libnetcdf.a  -L/usr/local/lib -lhdf5_hl -lhdf5 -lz -lm -lcurl
@@ -27,13 +33,21 @@ endif
 
 LLP=/usr/local/lib:${LD_LIBRARY_PATH}
 
-all:: cmp
+all:: comp ./x.nc
 	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS; \
-	${CMD} ./t
+	${CMD} ./t ${ARGS}
 
-cmp::
+comp::
 	export LD_LIBRARY_PATH=${LLP}; export CFLAGS; export LDFLAGS; \
 	${CC} -o t ${CFLAGS} ${T}.c ${SRC} ${LDFLAGS}; \
 
+x.nc: x.cdl
+	ncgen -4 x.cdl
+
+x.cdl: ${TD}/${TF}
+	rm -f ./x.cdl
+	cat ${TD}/${TF} > ./x.cdl
+
+
 cpp::
 	${CC} -E ${CFLAGS} ${T}.c > ${T}.txt
diff --git a/ncdump/Makefile.am b/ncdump/Makefile.am
index b8bec73..991b3c6 100644
--- a/ncdump/Makefile.am
+++ b/ncdump/Makefile.am
@@ -22,22 +22,33 @@ bin_PROGRAMS += nccopy
 nccopy_SOURCES = nccopy.c nciter.c nciter.h chunkspec.h chunkspec.c \
 utils.h utils.c dimmap.h dimmap.c
 
+if USE_NETCDF4
+noinst_PROGRAMS = nc4print
+nc4print_SOURCES = nc4print.c
+endif
+
+# Conditionally build the ocprint program, but do not install
+if ENABLE_DAP
+bin_PROGRAMS += ocprint
+ocprint_SOURCES=ocprint.c
+endif
+
 # This is the man page.
 man_MANS = ncdump.1 nccopy.1
 
 if BUILD_TESTSETS
 #if !BUILD_DLL
 # These tests are run for both netCDF-4 and non-netCDF-4 builds.
-check_PROGRAMS = rewrite-scalar ctest ctest64 ncdump tst_utf8 bom tst_dimsizes
+check_PROGRAMS = rewrite-scalar ctest ctest64 ncdump tst_utf8 bom tst_dimsizes nctrunc
 
 TESTS = tst_inttags.sh run_tests.sh tst_64bit.sh ctest ctest64 tst_output.sh	\
 tst_lengths.sh tst_calendars.sh tst_utf8 run_utf8_tests.sh      \
 tst_nccopy3.sh tst_charfill.sh tst_iter.sh tst_formatx3.sh tst_bom.sh \
-tst_dimsizes.sh
+tst_dimsizes.sh run_ncgen_tests.sh
 
 if USE_NETCDF4
 check_PROGRAMS += tst_fileinfo
-TESTS += tst_fileinfo.sh
+TESTS += tst_fileinfo.sh run_ncgen_nc4_tests.sh
 endif
 
 if LARGE_FILE_TESTS
@@ -121,7 +132,10 @@ tst_ncf213.cdl tst_ncf213.nc tst_h_scalar.cdl tst_h_scalar.nc           \
 tst_mud4_chars.cdl tst_mud4_chars.nc                                    \
 inttags.nc inttags4.nc tst_inttags.cdl tst_inttags4.cdl                 \
 tst_dimsize_classic.nc tst_dimsize_64offset.nc tst_dimsize_64data.nc    \
-nc4_fileinfo.nc hdf5_fileinfo.hdf
+nc4_fileinfo.nc hdf5_fileinfo.hdf \
+ref_hdf5_compat1.nc ref_hdf5_compat2.nc ref_hdf5_compat3.nc \
+ref_tst_compounds.nc ref_tst_dims.nc ref_tst_interops4.nc \
+ref_tst_xplatform2_1.nc ref_tst_xplatform2_2.nc
 
 # These files all have to be included with the distribution.
 EXTRA_DIST = run_tests.sh tst_64bit.sh tst_output.sh test0.cdl		\
@@ -149,12 +163,23 @@ run_utf8_nc4_tests.sh							\
 tst_formatx3.sh tst_formatx4.sh ref_tst_utf8_4.cdl                      \
 tst_inttags.sh tst_inttags4.sh                                          \
 CMakeLists.txt XGetopt.c tst_bom.sh tst_inmemory_nc3.sh                 \
-tst_dimsizes.sh tst_inmemory_nc4.sh tst_fileinfo.sh
+tst_dimsizes.sh tst_inmemory_nc4.sh tst_fileinfo.sh run_ncgen_tests.sh  \
+run_ncgen_nc4_tests.sh
 
 # CDL files and Expected results
 SUBDIRS=cdl expected
 EXTRA_DIST += tst_ncgen_shared.sh tst_ncgen4.sh tst_ncgen4_classic.sh	\
 tst_ncgen4_diff.sh tst_ncgen4_cycle.sh ref_ctest.c ref_ctest64.c
 
-CLEANFILES += results/*.nc results/*.dmp results/*.dmp2 tmp*.cdl tst_bug324.nc
+CLEANFILES += results/*.nc results/*.dmp results/*.dmp2 tmp*.cdl \
+	c5.nc compound_datasize_test.nc compound_datasize_test2.nc \
+	ncf199.nc ref_camrun.c tst_c0.cdl tst_c0_4.cdl tst_c0_4c.cdl \
+	tst_c0_64.cdl tst_compound_datasize_test.cdl \
+	tst_compound_datasize_test2.cdl tst_gattenum.nc \
+	tst_ncf199.cdl tst_tst_gattenum.cdl tst_tst_usuffix.cdl \
+	tst_usuffix.nc tst_bug324.nc
+
 DISTCLEANFILES = results
+
+clean-local:
+	-rm -rf results
diff --git a/ncdump/Makefile.in b/ncdump/Makefile.in
index 578fb3d..5f2e373 100644
--- a/ncdump/Makefile.in
+++ b/ncdump/Makefile.in
@@ -106,12 +106,16 @@ target_triplet = @target@
 
 # This turns on declspec magic in netcdf.h for windows DLLs.
 @BUILD_DLL_TRUE at am__append_2 = -DDLL_NETCDF
-bin_PROGRAMS = ncdump$(EXEEXT) nccopy$(EXEEXT)
+bin_PROGRAMS = ncdump$(EXEEXT) nccopy$(EXEEXT) $(am__EXEEXT_1)
+ at USE_NETCDF4_TRUE@noinst_PROGRAMS = nc4print$(EXEEXT)
+
+# Conditionally build the ocprint program, but do not install
+ at ENABLE_DAP_TRUE@am__append_3 = ocprint
 @BUILD_TESTSETS_TRUE at check_PROGRAMS = rewrite-scalar$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@	ctest$(EXEEXT) ctest64$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@	ncdump$(EXEEXT) tst_utf8$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@	bom$(EXEEXT) tst_dimsizes$(EXEEXT) \
- at BUILD_TESTSETS_TRUE@	$(am__EXEEXT_1)
+ at BUILD_TESTSETS_TRUE@	nctrunc$(EXEEXT) $(am__EXEEXT_2)
 @BUILD_TESTSETS_TRUE at TESTS = tst_inttags.sh run_tests.sh tst_64bit.sh \
 @BUILD_TESTSETS_TRUE@	ctest$(EXEEXT) ctest64$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@	tst_output.sh tst_lengths.sh \
@@ -119,14 +123,14 @@ bin_PROGRAMS = ncdump$(EXEEXT) nccopy$(EXEEXT)
 @BUILD_TESTSETS_TRUE@	run_utf8_tests.sh tst_nccopy3.sh \
 @BUILD_TESTSETS_TRUE@	tst_charfill.sh tst_iter.sh \
 @BUILD_TESTSETS_TRUE@	tst_formatx3.sh tst_bom.sh \
- at BUILD_TESTSETS_TRUE@	tst_dimsizes.sh $(am__append_4) \
+ at BUILD_TESTSETS_TRUE@	tst_dimsizes.sh run_ncgen_tests.sh \
 @BUILD_TESTSETS_TRUE@	$(am__append_5) $(am__append_6) \
- at BUILD_TESTSETS_TRUE@	$(am__append_7) $(am__EXEEXT_2) \
- at BUILD_TESTSETS_TRUE@	$(am__append_9) tst_ncgen4_classic.sh \
- at BUILD_TESTSETS_TRUE@	$(am__append_10)
+ at BUILD_TESTSETS_TRUE@	$(am__append_7) $(am__append_8) \
+ at BUILD_TESTSETS_TRUE@	$(am__EXEEXT_3) $(am__append_10) \
+ at BUILD_TESTSETS_TRUE@	tst_ncgen4_classic.sh $(am__append_11)
 
 # NetCDF-4 has some extra tests.
- at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_3 = tst_fileinfo \
+ at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_4 = tst_fileinfo \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_create_files \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_h_rdc0 \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_group_data \
@@ -140,19 +144,19 @@ bin_PROGRAMS = ncdump$(EXEEXT) nccopy$(EXEEXT)
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_compress \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_chunking \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_h_scalar tst_bug324
- at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_4 = tst_fileinfo.sh
- at BUILD_TESTSETS_TRUE@@LARGE_FILE_TESTS_TRUE at am__append_5 = tst_iter.sh
- at BUILD_DISKLESS_TRUE@@BUILD_TESTSETS_TRUE at am__append_6 = tst_inmemory_nc3.sh
- at BUILD_DISKLESS_TRUE@@BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_7 = tst_inmemory_nc4.sh
- at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_8 = tst_inttags4.sh tst_create_files tst_group_data tst_enum_data tst_opaque_data	\
+ at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_5 = tst_fileinfo.sh run_ncgen_nc4_tests.sh
+ at BUILD_TESTSETS_TRUE@@LARGE_FILE_TESTS_TRUE at am__append_6 = tst_iter.sh
+ at BUILD_DISKLESS_TRUE@@BUILD_TESTSETS_TRUE at am__append_7 = tst_inmemory_nc3.sh
+ at BUILD_DISKLESS_TRUE@@BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_8 = tst_inmemory_nc4.sh
+ at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_9 = tst_inttags4.sh tst_create_files tst_group_data tst_enum_data tst_opaque_data	\
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at tst_string_data tst_vlen_data tst_comp tst_comp2 tst_nans		\
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at tst_special_atts tst_netcdf4.sh tst_h_rdc0 tst_unicode tst_fillbug	\
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at tst_fillbug.sh tst_netcdf4_4.sh tst_compress tst_nccopy4.sh             \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at tst_grp_spec.sh tst_mud.sh tst_h_scalar tst_h_scalar.sh tst_formatx4.sh \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at tst_bug324 run_utf8_nc4_tests.sh
 
- at BUILD_TESTSETS_TRUE@@EXTRA_TESTS_TRUE@@USE_NETCDF4_TRUE at am__append_9 = run_back_comp_tests.sh
- at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_10 = tst_ncgen4.sh
+ at BUILD_TESTSETS_TRUE@@EXTRA_TESTS_TRUE@@USE_NETCDF4_TRUE at am__append_10 = run_back_comp_tests.sh
+ at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__append_11 = tst_ncgen4.sh
 subdir = ncdump
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -166,8 +170,9 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
+ at ENABLE_DAP_TRUE@am__EXEEXT_1 = ocprint$(EXEEXT)
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
- at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_1 =  \
+ at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_2 =  \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_fileinfo$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_create_files$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_h_rdc0$(EXEEXT) \
@@ -186,7 +191,7 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_chunking$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_h_scalar$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_bug324$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
 bom_SOURCES = bom.c
 bom_OBJECTS = bom.$(OBJEXT)
 bom_LDADD = $(LDADD)
@@ -203,6 +208,11 @@ ctest64_SOURCES = ctest64.c
 ctest64_OBJECTS = ctest64.$(OBJEXT)
 ctest64_LDADD = $(LDADD)
 ctest64_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+am__nc4print_SOURCES_DIST = nc4print.c
+ at USE_NETCDF4_TRUE@am_nc4print_OBJECTS = nc4print.$(OBJEXT)
+nc4print_OBJECTS = $(am_nc4print_OBJECTS)
+nc4print_LDADD = $(LDADD)
+nc4print_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 am_nccopy_OBJECTS = nccopy.$(OBJEXT) nciter.$(OBJEXT) \
 	chunkspec.$(OBJEXT) utils.$(OBJEXT) dimmap.$(OBJEXT)
 nccopy_OBJECTS = $(am_nccopy_OBJECTS)
@@ -214,6 +224,15 @@ am_ncdump_OBJECTS = ncdump.$(OBJEXT) vardata.$(OBJEXT) \
 ncdump_OBJECTS = $(am_ncdump_OBJECTS)
 ncdump_LDADD = $(LDADD)
 ncdump_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+nctrunc_SOURCES = nctrunc.c
+nctrunc_OBJECTS = nctrunc.$(OBJEXT)
+nctrunc_LDADD = $(LDADD)
+nctrunc_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
+am__ocprint_SOURCES_DIST = ocprint.c
+ at ENABLE_DAP_TRUE@am_ocprint_OBJECTS = ocprint.$(OBJEXT)
+ocprint_OBJECTS = $(am_ocprint_OBJECTS)
+ocprint_LDADD = $(LDADD)
+ocprint_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
 rewrite_scalar_SOURCES = rewrite-scalar.c
 rewrite_scalar_OBJECTS = rewrite-scalar.$(OBJEXT)
 rewrite_scalar_LDADD = $(LDADD)
@@ -332,20 +351,22 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = bom.c ctest.c ctest64.c $(nccopy_SOURCES) $(ncdump_SOURCES) \
-	rewrite-scalar.c tst_bug324.c tst_chunking.c tst_comp.c \
-	tst_comp2.c tst_compress.c tst_create_files.c tst_dimsizes.c \
-	tst_enum_data.c tst_fileinfo.c tst_fillbug.c tst_group_data.c \
-	tst_h_rdc0.c tst_h_scalar.c tst_nans.c tst_opaque_data.c \
-	tst_special_atts.c tst_string_data.c tst_unicode.c tst_utf8.c \
-	tst_vlen_data.c
-DIST_SOURCES = bom.c ctest.c ctest64.c $(nccopy_SOURCES) \
-	$(ncdump_SOURCES) rewrite-scalar.c tst_bug324.c tst_chunking.c \
-	tst_comp.c tst_comp2.c tst_compress.c tst_create_files.c \
-	tst_dimsizes.c tst_enum_data.c tst_fileinfo.c tst_fillbug.c \
-	tst_group_data.c tst_h_rdc0.c tst_h_scalar.c tst_nans.c \
-	tst_opaque_data.c tst_special_atts.c tst_string_data.c \
-	tst_unicode.c tst_utf8.c tst_vlen_data.c
+SOURCES = bom.c ctest.c ctest64.c $(nc4print_SOURCES) \
+	$(nccopy_SOURCES) $(ncdump_SOURCES) nctrunc.c \
+	$(ocprint_SOURCES) rewrite-scalar.c tst_bug324.c \
+	tst_chunking.c tst_comp.c tst_comp2.c tst_compress.c \
+	tst_create_files.c tst_dimsizes.c tst_enum_data.c \
+	tst_fileinfo.c tst_fillbug.c tst_group_data.c tst_h_rdc0.c \
+	tst_h_scalar.c tst_nans.c tst_opaque_data.c tst_special_atts.c \
+	tst_string_data.c tst_unicode.c tst_utf8.c tst_vlen_data.c
+DIST_SOURCES = bom.c ctest.c ctest64.c $(am__nc4print_SOURCES_DIST) \
+	$(nccopy_SOURCES) $(ncdump_SOURCES) nctrunc.c \
+	$(am__ocprint_SOURCES_DIST) rewrite-scalar.c tst_bug324.c \
+	tst_chunking.c tst_comp.c tst_comp2.c tst_compress.c \
+	tst_create_files.c tst_dimsizes.c tst_enum_data.c \
+	tst_fileinfo.c tst_fillbug.c tst_group_data.c tst_h_rdc0.c \
+	tst_h_scalar.c tst_nans.c tst_opaque_data.c tst_special_atts.c \
+	tst_string_data.c tst_unicode.c tst_utf8.c tst_vlen_data.c
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
 	ctags-recursive dvi-recursive html-recursive info-recursive \
 	install-data-recursive install-dvi-recursive \
@@ -572,7 +593,7 @@ am__set_TESTS_bases = \
   bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
- at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_2 = tst_inttags4.sh \
+ at BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_3 = tst_inttags4.sh \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_create_files$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_group_data$(EXEEXT) \
 @BUILD_TESTSETS_TRUE@@USE_NETCDF4_TRUE@	tst_enum_data$(EXEEXT) \
@@ -688,6 +709,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -715,12 +737,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -755,6 +779,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -819,6 +844,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 LDADD = ${top_builddir}/liblib/libnetcdf.la
@@ -830,6 +856,8 @@ utils.h utils.c nciter.h nciter.c nccomps.h
 nccopy_SOURCES = nccopy.c nciter.c nciter.h chunkspec.h chunkspec.c \
 utils.h utils.c dimmap.h dimmap.c
 
+ at USE_NETCDF4_TRUE@nc4print_SOURCES = nc4print.c
+ at ENABLE_DAP_TRUE@ocprint_SOURCES = ocprint.c
 
 # This is the man page.
 man_MANS = ncdump.1 nccopy.1
@@ -864,8 +892,16 @@ CLEANFILES = test0.nc test1.cdl test1.nc test2.cdl ctest1.cdl \
 	tst_mud4_chars.cdl tst_mud4_chars.nc inttags.nc inttags4.nc \
 	tst_inttags.cdl tst_inttags4.cdl tst_dimsize_classic.nc \
 	tst_dimsize_64offset.nc tst_dimsize_64data.nc nc4_fileinfo.nc \
-	hdf5_fileinfo.hdf results/*.nc results/*.dmp results/*.dmp2 \
-	tmp*.cdl tst_bug324.nc
+	hdf5_fileinfo.hdf ref_hdf5_compat1.nc ref_hdf5_compat2.nc \
+	ref_hdf5_compat3.nc ref_tst_compounds.nc ref_tst_dims.nc \
+	ref_tst_interops4.nc ref_tst_xplatform2_1.nc \
+	ref_tst_xplatform2_2.nc results/*.nc results/*.dmp \
+	results/*.dmp2 tmp*.cdl c5.nc compound_datasize_test.nc \
+	compound_datasize_test2.nc ncf199.nc ref_camrun.c tst_c0.cdl \
+	tst_c0_4.cdl tst_c0_4c.cdl tst_c0_64.cdl \
+	tst_compound_datasize_test.cdl tst_compound_datasize_test2.cdl \
+	tst_gattenum.nc tst_ncf199.cdl tst_tst_gattenum.cdl \
+	tst_tst_usuffix.cdl tst_usuffix.nc tst_bug324.nc
 
 # These files all have to be included with the distribution.
 EXTRA_DIST = run_tests.sh tst_64bit.sh tst_output.sh test0.cdl \
@@ -895,9 +931,10 @@ EXTRA_DIST = run_tests.sh tst_64bit.sh tst_output.sh test0.cdl \
 	tst_formatx3.sh tst_formatx4.sh ref_tst_utf8_4.cdl \
 	tst_inttags.sh tst_inttags4.sh CMakeLists.txt XGetopt.c \
 	tst_bom.sh tst_inmemory_nc3.sh tst_dimsizes.sh \
-	tst_inmemory_nc4.sh tst_fileinfo.sh tst_ncgen_shared.sh \
-	tst_ncgen4.sh tst_ncgen4_classic.sh tst_ncgen4_diff.sh \
-	tst_ncgen4_cycle.sh ref_ctest.c ref_ctest64.c
+	tst_inmemory_nc4.sh tst_fileinfo.sh run_ncgen_tests.sh \
+	run_ncgen_nc4_tests.sh tst_ncgen_shared.sh tst_ncgen4.sh \
+	tst_ncgen4_classic.sh tst_ncgen4_diff.sh tst_ncgen4_cycle.sh \
+	ref_ctest.c ref_ctest64.c
 
 # CDL files and Expected results
 SUBDIRS = cdl expected
@@ -996,6 +1033,15 @@ clean-checkPROGRAMS:
 	echo " rm -f" $$list; \
 	rm -f $$list
 
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
 bom$(EXEEXT): $(bom_OBJECTS) $(bom_DEPENDENCIES) $(EXTRA_bom_DEPENDENCIES) 
 	@rm -f bom$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(bom_OBJECTS) $(bom_LDADD) $(LIBS)
@@ -1008,6 +1054,10 @@ ctest64$(EXEEXT): $(ctest64_OBJECTS) $(ctest64_DEPENDENCIES) $(EXTRA_ctest64_DEP
 	@rm -f ctest64$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ctest64_OBJECTS) $(ctest64_LDADD) $(LIBS)
 
+nc4print$(EXEEXT): $(nc4print_OBJECTS) $(nc4print_DEPENDENCIES) $(EXTRA_nc4print_DEPENDENCIES) 
+	@rm -f nc4print$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(nc4print_OBJECTS) $(nc4print_LDADD) $(LIBS)
+
 nccopy$(EXEEXT): $(nccopy_OBJECTS) $(nccopy_DEPENDENCIES) $(EXTRA_nccopy_DEPENDENCIES) 
 	@rm -f nccopy$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(nccopy_OBJECTS) $(nccopy_LDADD) $(LIBS)
@@ -1016,6 +1066,14 @@ ncdump$(EXEEXT): $(ncdump_OBJECTS) $(ncdump_DEPENDENCIES) $(EXTRA_ncdump_DEPENDE
 	@rm -f ncdump$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ncdump_OBJECTS) $(ncdump_LDADD) $(LIBS)
 
+nctrunc$(EXEEXT): $(nctrunc_OBJECTS) $(nctrunc_DEPENDENCIES) $(EXTRA_nctrunc_DEPENDENCIES) 
+	@rm -f nctrunc$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(nctrunc_OBJECTS) $(nctrunc_LDADD) $(LIBS)
+
+ocprint$(EXEEXT): $(ocprint_OBJECTS) $(ocprint_DEPENDENCIES) $(EXTRA_ocprint_DEPENDENCIES) 
+	@rm -f ocprint$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(ocprint_OBJECTS) $(ocprint_LDADD) $(LIBS)
+
 rewrite-scalar$(EXEEXT): $(rewrite_scalar_OBJECTS) $(rewrite_scalar_DEPENDENCIES) $(EXTRA_rewrite_scalar_DEPENDENCIES) 
 	@rm -f rewrite-scalar$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(rewrite_scalar_OBJECTS) $(rewrite_scalar_LDADD) $(LIBS)
@@ -1113,10 +1171,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dimmap.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dumplib.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/indent.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nc4print.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nccopy.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ncdump.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nciter.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nctime0.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nctrunc.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ocprint.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/rewrite-scalar.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_bug324.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tst_chunking.Po at am__quote@
@@ -1580,6 +1641,13 @@ tst_dimsizes.sh.log: tst_dimsizes.sh
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_ncgen_tests.sh.log: run_ncgen_tests.sh
+	@p='run_ncgen_tests.sh'; \
+	b='run_ncgen_tests.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 tst_fileinfo.sh.log: tst_fileinfo.sh
 	@p='tst_fileinfo.sh'; \
 	b='tst_fileinfo.sh'; \
@@ -1587,6 +1655,13 @@ tst_fileinfo.sh.log: tst_fileinfo.sh
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_ncgen_nc4_tests.sh.log: run_ncgen_nc4_tests.sh
+	@p='run_ncgen_nc4_tests.sh'; \
+	b='run_ncgen_nc4_tests.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 tst_inmemory_nc3.sh.log: tst_inmemory_nc3.sh
 	@p='tst_inmemory_nc3.sh'; \
 	b='tst_inmemory_nc3.sh'; \
@@ -1925,7 +2000,7 @@ maintainer-clean-generic:
 clean: clean-recursive
 
 clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
-	clean-libtool mostlyclean-am
+	clean-libtool clean-local clean-noinstPROGRAMS mostlyclean-am
 
 distclean: distclean-recursive
 	-rm -rf ./$(DEPDIR)
@@ -2000,19 +2075,20 @@ uninstall-man: uninstall-man1
 
 .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
 	check-TESTS check-am clean clean-binPROGRAMS \
-	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
-	ctags ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-binPROGRAMS \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-man1 \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
-	uninstall uninstall-am uninstall-binPROGRAMS uninstall-man \
+	clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-man1 install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am recheck tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-man \
 	uninstall-man1
 
 .PRECIOUS: Makefile
@@ -2028,6 +2104,9 @@ uninstall-man: uninstall-man1
 @BUILD_TESTSETS_TRUE@@EXTRA_TESTS_FALSE at ctest64.c:
 @BUILD_TESTSETS_TRUE@@EXTRA_TESTS_FALSE@	cp $(top_srcdir)/ncdump/ref_ctest64.c $(top_builddir)/ncdump/ctest64.c
 
+clean-local:
+	-rm -rf results
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/ncdump/bom.c b/ncdump/bom.c
index 8844bbe..b8f3ede 100644
--- a/ncdump/bom.c
+++ b/ncdump/bom.c
@@ -3,7 +3,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *********************************************************************/
 
-#include <config.h>
+#include "config.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/ncdump/cdl/Makefile.in b/ncdump/cdl/Makefile.in
index 3c81393..4ff0374 100644
--- a/ncdump/cdl/Makefile.in
+++ b/ncdump/cdl/Makefile.in
@@ -170,6 +170,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -197,12 +198,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -237,6 +240,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/ncdump/cdl/bigf1.cdl b/ncdump/cdl/bigf1.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/bigf2.cdl b/ncdump/cdl/bigf2.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/bigf3.cdl b/ncdump/cdl/bigf3.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/bigr1.cdl b/ncdump/cdl/bigr1.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/bigr2.cdl b/ncdump/cdl/bigr2.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/bigr3.cdl b/ncdump/cdl/bigr3.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/c0.cdl b/ncdump/cdl/c0.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/c0.jdl b/ncdump/cdl/c0.jdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/example_good.cdl b/ncdump/cdl/example_good.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/fills.cdl b/ncdump/cdl/fills.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/nc_enddef.cdl b/ncdump/cdl/nc_enddef.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/nc_sync.cdl b/ncdump/cdl/nc_sync.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/pres_temp_4D.cdl b/ncdump/cdl/pres_temp_4D.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_ctest1_nc4.cdl b/ncdump/cdl/ref_ctest1_nc4.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_ctest1_nc4.jdl b/ncdump/cdl/ref_ctest1_nc4.jdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_ctest1_nc4c.cdl b/ncdump/cdl/ref_ctest1_nc4c.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_nctst.cdl b/ncdump/cdl/ref_nctst.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_nctst_64bit_offset.cdl b/ncdump/cdl/ref_nctst_64bit_offset.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_nctst_netcdf4.cdl b/ncdump/cdl/ref_nctst_netcdf4.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_nctst_netcdf4_classic.cdl b/ncdump/cdl/ref_nctst_netcdf4_classic.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_solar.cdl b/ncdump/cdl/ref_solar.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_comp.cdl b/ncdump/cdl/ref_tst_comp.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_comp2.cdl b/ncdump/cdl/ref_tst_comp2.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_econst.cdl b/ncdump/cdl/ref_tst_econst.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_enum_data.cdl b/ncdump/cdl/ref_tst_enum_data.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_group_data.cdl b/ncdump/cdl/ref_tst_group_data.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_nans.cdl b/ncdump/cdl/ref_tst_nans.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_opaque_data.cdl b/ncdump/cdl/ref_tst_opaque_data.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_small.cdl b/ncdump/cdl/ref_tst_small.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_solar_1.cdl b/ncdump/cdl/ref_tst_solar_1.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_solar_2.cdl b/ncdump/cdl/ref_tst_solar_2.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_special_atts.cdl b/ncdump/cdl/ref_tst_special_atts.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_string_data.cdl b/ncdump/cdl/ref_tst_string_data.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_unicode.cdl b/ncdump/cdl/ref_tst_unicode.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_utf8.cdl b/ncdump/cdl/ref_tst_utf8.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/ref_tst_vlen_data.cdl b/ncdump/cdl/ref_tst_vlen_data.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/sfc_pres_temp.cdl b/ncdump/cdl/sfc_pres_temp.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/simple_xy.cdl b/ncdump/cdl/simple_xy.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/small.cdl b/ncdump/cdl/small.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/small2.cdl b/ncdump/cdl/small2.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/test0.cdl b/ncdump/cdl/test0.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/cdl/tst_ncml.cdl b/ncdump/cdl/tst_ncml.cdl
old mode 100755
new mode 100644
diff --git a/ncdump/ctest.c b/ncdump/ctest.c
index 8b9905e..d9b487c 100644
--- a/ncdump/ctest.c
+++ b/ncdump/ctest.c
@@ -1450,6 +1450,22 @@ main() {/* create ctest0.nc */
     }
 
 
+    {
+    size_t count = 0;
+    static double var_PLUS_name_PLUS_plusses_data[1] = {((double)9.969209968386869e+36)};
+    stat = nc_put_var1(ncid, var_PLUS_name_PLUS_plusses_id, &count, var_PLUS_name_PLUS_plusses_data);
+    check_err(stat,__LINE__,__FILE__);
+    }
+
+
+    {
+    size_t count = 0;
+    static double var_ATSIGN_name_ATSIGN_ats_data[1] = {((double)9.969209968386869e+36)};
+    stat = nc_put_var1(ncid, var_ATSIGN_name_ATSIGN_ats_id, &count, var_ATSIGN_name_ATSIGN_ats_data);
+    check_err(stat,__LINE__,__FILE__);
+    }
+
+
     stat = nc_close(ncid);
     check_err(stat,__LINE__,__FILE__);
     return 0;
diff --git a/ncdump/ctest64.c b/ncdump/ctest64.c
index a19838f..b5fb314 100644
--- a/ncdump/ctest64.c
+++ b/ncdump/ctest64.c
@@ -1450,6 +1450,22 @@ main() {/* create ctest0_64.nc */
     }
 
 
+    {
+    size_t count = 0;
+    static double var_PLUS_name_PLUS_plusses_data[1] = {((double)9.969209968386869e+36)};
+    stat = nc_put_var1(ncid, var_PLUS_name_PLUS_plusses_id, &count, var_PLUS_name_PLUS_plusses_data);
+    check_err(stat,__LINE__,__FILE__);
+    }
+
+
+    {
+    size_t count = 0;
+    static double var_ATSIGN_name_ATSIGN_ats_data[1] = {((double)9.969209968386869e+36)};
+    stat = nc_put_var1(ncid, var_ATSIGN_name_ATSIGN_ats_id, &count, var_ATSIGN_name_ATSIGN_ats_data);
+    check_err(stat,__LINE__,__FILE__);
+    }
+
+
     stat = nc_close(ncid);
     check_err(stat,__LINE__,__FILE__);
     return 0;
diff --git a/ncdump/ctests.sh b/ncdump/ctests.sh
index 809ce98..d19ead7 100755
--- a/ncdump/ctests.sh
+++ b/ncdump/ctests.sh
@@ -1,60 +1,40 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 #set -e
 echo "*** ctests.sh: testing ncgen4 -c"
 
 KFLAG=3
 
-thisdir=`pwd`
-
-if test "x$builddir" = "x"; then builddir=`pwd`/..; fi
-if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
-# Make srcdir point to the netcdf-3 level */
-srcdir="${srcdir}/.."
-
-# Make buildir absolute
-cd $builddir
-builddir=`pwd`
-# Return to home
-cd $thisdir
-
-# Make srcdir be absolute
-cd $srcdir
-srcdir=`pwd`
-cd $builddir
-# Return to home
-cd $thisdir
-
-
 # get some config.h parameters
-if test -f ${builddir}/config.h ; then
-  if fgrep -e '#define USE_NETCDF4 1' ${builddir}/config.h >/dev/null ; then
+if test -f ${top_builddir}/config.h ; then
+  if fgrep -e '#define USE_NETCDF4 1' ${top_builddir}/config.h >/dev/null ; then
     NETCDF4=1
   else
     NETCDF4=0
   fi    
-  if fgrep -e '#define USE_DAP 1' ${builddir}/config.h >/dev/null ; then
+  if fgrep -e '#define ENABLE_DAP 1' ${top_builddir}/config.h >/dev/null ; then
     DAP=1
   else
     DAP=0
   fi    
 
-
 else
   echo "Cannot locate config.h"
   exit 1
 fi
 
 # Locate the cdl and expected directories
-cdl="${srcdir}/ncdump/cdl4"
-expected="${srcdir}/ncdump/expected4"
+cdl="${srcdir}/cdl4"
+expected="${srcdir}/expected4"
 
 # Locate various libraries, programs, etc
 # The hard part is locating the HDF5 and Z libraries
 
-NCGEN4=${builddir}/ncgen4/ncgen4
-#NCGEN4=${builddir}/ncgen4/.libs/ncgen4
-NCDUMP=${builddir}/ncdump/ncdump
+NCGEN4=${NCGEN}
+NCDUMP=${NCDUMP}
 
 HDFPATH=""
 ZPATH=""
diff --git a/ncdump/dumplib.c b/ncdump/dumplib.c
index c3bc7e8..8ff8fa8 100644
--- a/ncdump/dumplib.c
+++ b/ncdump/dumplib.c
@@ -9,7 +9,7 @@
  * definition for va_list from the GNU C compiler.
  */
 
-#include <config.h>
+#include "config.h"
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/ncdump/expected/Makefile.in b/ncdump/expected/Makefile.in
index f582419..80dd2e8 100644
--- a/ncdump/expected/Makefile.in
+++ b/ncdump/expected/Makefile.in
@@ -168,6 +168,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -195,12 +196,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -235,6 +238,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
diff --git a/ncdump/inttags4.cdl b/ncdump/inttags4.cdl
index 806469c..27840d1 100644
--- a/ncdump/inttags4.cdl
+++ b/ncdump/inttags4.cdl
@@ -19,5 +19,5 @@ data:
 
  i64 = 9223372036854775807LL, 9223372036854775807ll, 9223372036854775807 ;
 
- ui64 = 18446744073709551615ULL, 18446744073709551615ull, 18446744073709551615u ;
+ ui64 = 18446744073709551615ULL, 18446744073709551615ull, 18446744073709551615uLL;
 }
diff --git a/ncdump/isnan.h b/ncdump/isnan.h
index 86053c2..3d7f50e 100644
--- a/ncdump/isnan.h
+++ b/ncdump/isnan.h
@@ -4,7 +4,7 @@
  *   $Id: isnan.h,v 1.3 2008/04/23 22:05:00 russ Exp $
  *********************************************************************/
 
-#include <config.h>
+#include "config.h"
 
 #ifndef NO_FLOAT_H
 #include <float.h>		/* for DBL_MAX */
diff --git a/ncdump/nc4print.c b/ncdump/nc4print.c
new file mode 100644
index 0000000..9fda8d7
--- /dev/null
+++ b/ncdump/nc4print.c
@@ -0,0 +1,53 @@
+/*********************************************************************
+ *   Copyright 2016, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+/**
+This provides a simple netcdf-4 metadata -> xml printer.
+Primarily for use in debugging, but could be adapted to
+create other tools.
+*/
+
+/**************************************************/
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "ncbytes.h"
+
+extern int NC4print(NCbytes* buf, int ncid);
+
+int
+main(int argc, char** argv)
+{
+    int i;
+    int ret = NC_NOERR;
+
+    if(argc == 1) {
+	fprintf(stderr,"usage: nc4printer <file> <file>...\n");
+	exit(1);
+    }
+    for(i=1;i<argc;i++) {
+	int ncid;
+	char* filename;
+        NCbytes* buf;
+
+	filename = argv[i];
+	buf = ncbytesnew();
+
+	if((ret = nc_open(filename,NC_NETCDF4,&ncid))) goto fail;
+		
+	ret = NC4print(buf,ncid);
+	ncbytesnull(buf);
+	fprintf(stderr,"========== %s ==========\n",filename);
+	fprintf(stderr,"%s\n",ncbytescontents(buf));
+	ncbytesfree(buf);
+    }
+    exit(0);
+
+fail:
+    fprintf(stderr,"***Fail: (%d) %s\n",ret,nc_strerror(ret));
+    exit(1);
+}
diff --git a/ncdump/ncdump.c b/ncdump/ncdump.c
index 374a883..bbaba37 100644
--- a/ncdump/ncdump.c
+++ b/ncdump/ncdump.c
@@ -3,7 +3,7 @@
 Copyright 2011 University Corporation for Atmospheric
 Research/Unidata. See \ref copyright file for more info.  */
 
-#include <config.h>
+#include "config.h"
 #include <stdio.h>
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
@@ -33,8 +33,9 @@ int optind;
 #ifdef HAVE_LOCALE_H
 #include <locale.h>
 #endif	/* HAVE_LOCALE_H */
-#include "netcdf.h"
+
 #include "netcdf_mem.h"
+#include "netcdf.h"
 #include "utils.h"
 #include "nccomps.h"
 #include "nctime0.h"		/* new iso time and calendar stuff */
@@ -44,6 +45,8 @@ int optind;
 #include "indent.h"
 #include "isnan.h"
 #include "cdl.h"
+#include "nclog.h"
+#include "ncwinpath.h"
 
 #ifdef USE_NETCDF4
 #include "nc4internal.h" /* to get name of the special properties file */
@@ -162,10 +165,7 @@ name_path(const char *path)
     /* See if this is a url */
     {
 	char* base;
-
         extern int nc__testurl(const char*,char**);
-
-
  	if(nc__testurl(path,&base)) {
  	    return base; /* Looks like a url */
 	}
@@ -340,7 +340,7 @@ fileopen(const char* path, void** memp, size_t* sizep)
 #ifdef vms
     fd = open(path, oflags, 0, "ctx=stm");
 #else
-    fd  = open(path, oflags);
+    fd  = NCopen2(path, oflags);
 #endif
     if(fd < 0) {
 	status = errno;
@@ -1261,6 +1261,7 @@ print_enum_type(int ncid, nc_type typeid) {
     char safe_buf[SAFE_BUF_LEN];
     char *delim;
     int64_t data;	    /* space for data of any primitive type */
+    void* raw;
     char *esc_btn;
     char *esc_tn;
     char *esc_mn;
@@ -1283,30 +1284,31 @@ print_enum_type(int ncid, nc_type typeid) {
 	if (f == type_nfields - 1)
 	    delim = "} ;\n";
 	NC_CHECK( nc_inq_enum_member(ncid, typeid, f, memname, &data) );
+	raw = (void*)&data;
 	switch (base_nc_type) {
 	case NC_BYTE:
-	    memval = *(char *)&data;
+	    memval = *(char *)raw;
 	    break;
 	case NC_SHORT:
-	    memval = *(short *)&data;
+	    memval = *(short *)raw;
 	    break;
 	case NC_INT:
-	    memval = *(int *)&data;
+	    memval = *(int *)raw;
 	    break;
 	case NC_UBYTE:
-	    memval = *(unsigned char *)&data;
+	    memval = *(unsigned char *)raw;
 	    break;
 	case NC_USHORT:
-	    memval = *(unsigned short *)&data;
+	    memval = *(unsigned short *)raw;
 	    break;
 	case NC_UINT:
-	    memval = *(unsigned int *)&data;
+	    memval = *(unsigned int *)raw;
 	    break;
 	case NC_INT64:
-	    memval = *(int64_t *)&data;
+	    memval = *(int64_t *)raw;
 	    break;
 	case NC_UINT64:
-	    memval = *(uint64_t *)&data;
+	    memval = *(uint64_t *)raw;
 	    break;
 	default:
 	    error("Bad base type for enum!");
@@ -2228,6 +2230,7 @@ main(int argc, char *argv[])
 	    nc_set_log_level(level);
 	  }
 #endif
+	  ncsetlogging(1);
 	  break;
         case '?':
 	  usage();
@@ -2299,9 +2302,9 @@ main(int argc, char *argv[])
                                              &formatting_specs.nc_extended,
                                              &formatting_specs.nc_mode) );
 	    if (kind_out) {
-		printf ("%s\n", kind_string(formatting_specs.nc_kind));
+		printf ("%s", kind_string(formatting_specs.nc_kind));
 	    } else if (kind_out_extended) {
-		printf ("%s\n", kind_string_extended(formatting_specs.nc_extended,formatting_specs.nc_mode));
+		printf ("%s", kind_string_extended(formatting_specs.nc_extended,formatting_specs.nc_mode));
 	    } else {
 		/* Initialize list of types. */
 		init_types(ncid);
diff --git a/ncdump/nctrunc.c b/ncdump/nctrunc.c
new file mode 100644
index 0000000..b47011a
--- /dev/null
+++ b/ncdump/nctrunc.c
@@ -0,0 +1,57 @@
+/*********************************************************************
+ *   Copyright 1993, UCAR/Unidata
+ *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ *********************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define BUFLEN 100000
+
+int
+main(int argc, char** argv)
+{
+    long pos = 0;
+    unsigned char buffer[BUFLEN];
+    size_t count, red, avail, trunc;
+    unsigned char* p = buffer;
+    long i;
+    FILE* input = stdin;
+
+    if(argc > 1) {
+	input = fopen(argv[1],"r");
+    }
+
+    /* Read the whole file */
+    p = buffer;
+    red = 0;
+    avail = BUFLEN;
+    for(;;) {
+	count = fread(p,1,avail,input);
+	p += count;
+	red += count;
+	avail -= count;
+	if(feof(input)) break;
+    }
+    trunc = red;
+    for(i=(red-1);i>=0;i--) {
+	if(buffer[i] != '\0') {
+	    trunc = i + 1;
+	    break;	    
+	}
+    }
+    p = buffer;
+    avail = trunc;
+    for(;;) {
+	count = fwrite(p,1,avail,stdout);
+	if(count == 0) break;
+	p += count;
+	avail -= count;
+	if(avail == 0) break;	
+    }
+    if(avail > 0)
+        exit(1);
+    else
+	exit(0);
+}
diff --git a/ncdump/ocprint.c b/ncdump/ocprint.c
new file mode 100644
index 0000000..abbb41e
--- /dev/null
+++ b/ncdump/ocprint.c
@@ -0,0 +1,1183 @@
+/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
+   See the COPYRIGHT file for more information. */
+
+#define VALIDATE
+
+#define ALLATONCE
+#undef TRACK
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <assert.h>
+#include <string.h>
+#include <strings.h>
+
+#include "oc.h"
+#include "ocx.h"
+
+/* Utilities */
+#include "netcdf.h"
+#include "ncuri.h"
+#include "ncbytes.h"
+#include "nclog.h"
+
+#ifdef WIN32
+/*#include <windows.h>*/
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+#ifndef nulldup
+#define nulldup(s) (s==NULL?NULL:strdup(s))
+#endif
+
+#define CHECK(x) check_err((ocstat=(x)),0)
+#define FAIL(x) check_err((x),1)
+
+/* Define some classifiers */
+#define iscontainer(t) ((t) == OC_Dataset || (t) == OC_Structure || (t) == OC_Sequence || (t) == OC_Grid)
+
+#define isatomic(t) ((t) == OC_Atomic)
+
+#define NORC "NONE"
+
+#define LBRACE "{"
+#define RBRACE "}"
+
+/*Mnemonic*/
+#define TOPLEVEL 1
+
+extern int ocdebug;
+
+static OCerror ocstat;
+static OClink glink;
+
+/* define a large stack of DUMPPATH datanodes */
+struct DUMPPATH {
+    OCdatanode datanode;
+    OCddsnode   node;
+    OCtype      octype;
+    size_t      rank;
+    size_t      dimsizes[OC_MAX_DIMENSIONS];
+    int         indexed; /* 1 => indices is valid */
+    size_t      indices[OC_MAX_DIMENSIONS];
+} stack[2048];
+
+static size_t stacknext;
+
+/* Define the debug options */
+struct OCD {
+    int debug;          /* -D<integer:1..> */
+    int debuglevel;
+    int dumpdds;        /* -DN */
+    int dumpdatadds;    /* -DX<level 0..> */
+    int dumpdatatree;   /* -DD */
+    int dumplevel;
+    int curl;           /* -DC - make curl be verbose */
+    int verbose;        /* -DV - produce more verbose output */
+} debug;
+
+/* Define the -X options; currently unused*/
+struct OCX {
+    int ignore;
+} x;
+
+/* Define the other options */
+static struct OCOPT {
+    char*   surl; /* full url string */
+    NCURI*  url;
+    struct OCD debug;
+    struct OCX x;
+    int     showattributes; /* -A */
+    int     logging;	    /* -L */
+    char*   netrc ;	    /* -N */
+    char*   rcfile ;	    /* -R */
+    int     selfsigned ;    /* -S */
+    int     octest; 	    /* -T */ /* match original octest output */
+    int     generate;	    /* -g|-G */
+    int     optdas;	    /* -p */
+    int     optdatadds;	    /* -p */
+    int     optdds;	    /* -p */
+    FILE*   output;         /* -o */
+    /* Deprecated */
+    char*   constraint;	    /* -C */
+    NCbytes* userparams;    /* -U */
+} ocopt;
+
+static char blanks[2048];
+#define BLANKSPERDENT 2
+
+/* Forward*/
+static void usage(char*);
+static int fail(char*);
+static void check_err(OCerror stat, int dofail);
+static void dumpflags(void);
+
+struct OCOPT;
+static OCerror processdata(int);
+static OCerror printdata(OClink, OCdatanode);
+
+static OCerror printdata_indices(OClink, OCdatanode, NCbytes*,int);
+static OCerror printdata_container(OClink, OCdatanode, NCbytes*,int);
+static OCerror printdata_leaf(OClink, OCdatanode, NCbytes*,int);
+
+static off_t odom_init(size_t rank, size_t* indices, size_t* dimsizes);
+static int odom_more(size_t rank, size_t* indices, size_t* dimsizes);
+static void odom_next(size_t rank, size_t* indices, size_t* dimsizes);
+
+static OCerror dumpdatanode(OClink, OCdatanode, size_t count, void* memory, NCbytes*);
+static OCerror generatedds(OClink, OCddsnode, NCbytes*, int depth);
+static char* generatedas(OClink,OCddsnode);
+static OCerror generatedasr(OClink, OCddsnode, NCbytes*, int depth);
+static OCerror generateddsattributes(OClink, OCddsnode node, NCbytes*, int);
+
+static OCerror printdims(OClink link, OCddsnode node, NCbytes* buffer);
+static char* stringescape(char*);
+static char* idescape(char*, char*, size_t);
+static int needsescapes(const char* s);
+static size_t totaldimsize(size_t,size_t*);
+static char* indent(int n);
+static void pushstack(OCdatanode datanode);
+static void popstack() {stacknext--;}
+#ifdef TRACK
+static void printstack(char* msg);
+#endif
+
+static char* optionmsg =
+" [-A]"
+" [-D <debugarg>]"
+" [-G]"
+" [-L]"
+" [-N <netrc file>]"
+" [-S]"
+" [-R <rcfile>]"
+" [-T]"
+" [-h]"
+" [-o <file|->]"
+" [-p das|dds|datadds]"
+" <url>";
+
+static OCflags ocflags;
+
+static void
+init()
+{
+    memset(&ocopt,0,sizeof(ocopt));
+    ocopt.generate = 1;             /* -G|-g */
+    ocopt.userparams = ncbytesnew(); /* -U */
+}
+
+int
+main(int argc, char **argv)
+{
+    int c;
+    char* suffix;
+
+#ifdef OCDEBUG
+    { int i;
+	fprintf(stderr,"argv =");
+	for(i=0;i<argc;i++) 
+	    fprintf(stderr," %s",argv[i]);
+	fprintf(stderr,"\n");
+    }
+#endif
+
+    init();
+
+    opterr = 1;
+
+    while ((c = getopt(argc, argv, "AC:D:GLN:R:STU:X:gho:u:f:p:")) != EOF) {
+        switch (c) {
+	case 'A': ocopt.showattributes = 1; break;
+	case 'C': ocopt.constraint = nulldup(optarg); break;
+        case 'G': case 'g': ocopt.generate = 1; break;
+        case 'L': ocopt.logging = 1; break;
+	case 'N': ocopt.netrc = nulldup(optarg); break;
+	case 'R': ocopt.rcfile = nulldup(optarg); break;
+        case 'S': ocopt.selfsigned = 1; break;
+        case 'T': ocopt.octest = 1; break;
+	case 'U':
+	    if(optarg != NULL) {
+		ncbytesappend(ocopt.userparams,';');
+		ncbytescat(ocopt.userparams,optarg);
+	    }
+	    break;
+        case 'D': {
+	    int c0;
+	    if(strlen(optarg) == 0) usage("missing -D argument");
+	    c0 = optarg[0];
+	    if(c0 >= '0' && c0 <= '9') {/* debug level */
+		ocopt.debug.debuglevel = atoi(optarg); break;
+	    } else switch (c0) {
+	           case 'C': ocopt.debug.curl = 1; break;
+	           case 'D': ocopt.debug.dumpdatatree = 1; break;
+	           case 'N': ocopt.debug.dumpdds = 1; break;
+	           case 'X': ocopt.debug.dumpdatadds = 1;
+			     ocopt.debug.dumplevel = atoi(optarg+1);
+			     break;
+	           case 'V': ocopt.debug.verbose = 1; break;
+		   default: usage("unknown -D option");
+		   }
+	    } break;
+        case 'X': {
+	    int c0;
+	    int so = (optarg == NULL ? 0 : strlen(optarg));
+	    if(so == 0) usage("missing -X argument");
+	    c0 = optarg[0];
+	    switch (c0) {
+	    default:
+		usage("unknown -X option");
+	    }
+	} break;
+
+	case 'o':
+            if(ocopt.output != NULL) fclose(ocopt.output);
+	    ocopt.output = fopen(optarg,"w");
+            if(ocopt.output == NULL)
+		usage("-o file not writeable");
+	    break;	    
+
+	case 'u': case 'f':
+	    ocopt.surl = optarg;
+	    break;	    
+
+	case 'p':
+	    if(strcasecmp(optarg,"das")==0) ocopt.optdas=1;
+	    else if(strcasecmp(optarg,"dds")==0) ocopt.optdds=1;
+	    else if(strcasecmp(optarg,"data")==0) ocopt.optdatadds=1;
+	    else if(strcasecmp(optarg,"datadds")==0) ocopt.optdatadds=1;
+	    else if(strcasecmp(optarg,"all")==0) {
+		ocopt.optdas = 1; ocopt.optdds = 1; ocopt.optdatadds = 1;
+	    } else usage("unknown -p option");
+	    break;
+
+	case 'h': usage(""); exit(0);
+
+        default: usage("unknown option");
+        }
+    }
+
+    if(ocopt.output == NULL)
+	ocopt.output = stdout;
+
+    if (ocopt.debug.debuglevel > 0) {
+        ocdebug = ocopt.debug.debuglevel;
+    }
+
+    if(ocopt.logging) {
+	ncloginit();
+	ncsetlogging(1);
+	nclogopen(NULL);
+    }
+
+    argc -= optind;
+    argv += optind;
+
+    if (argc > 0 && ocopt.surl== NULL) {
+        ocopt.surl = nulldup(argv[argc - 1]);
+    } else
+        usage("Multiple urls specified");
+
+    if (ocopt.surl == NULL)
+        ocopt.surl = getenv("URLSRC");
+
+    if (ocopt.surl == NULL) {
+        usage("no source url specified\n");
+    }
+
+    /* Compile the url */
+    if(ncuriparse(ocopt.surl,&ocopt.url) != NCU_OK) {
+	fprintf(stderr,"malformed source url: %s\n",ocopt.surl);
+	exit(1);
+    }
+
+    /* For convenience, see if the url has a trailing .dds, .das, or .dods
+       and if so, use it
+    */
+    suffix = strrchr(ocopt.url->path,'.');
+    if(suffix != NULL) {
+	int match = 0;
+	if(strcmp(suffix,".das")==0) {
+	    ocopt.optdas = 1;
+	    ocopt.optdds = 0;
+	    ocopt.optdatadds = 0;
+	    match = 1;
+	} else if(strcmp(suffix,".dds")==0) {
+	    ocopt.optdas = 0;
+	    ocopt.optdds = 1;
+	    ocopt.optdatadds = 0;
+	    match = 1;
+	} else if(strcmp(suffix,".dods")==0) {
+	    ocopt.optdas = 0;
+	    ocopt.optdds = 0;
+	    ocopt.optdatadds = 1;
+	    match = 1;
+	}
+	/* Remove the suffix */
+	if(match)
+	    *suffix = '\0';
+    }
+
+    /* If -C was specified, then it has precedence */
+    if(ocopt.constraint != NULL) {
+	ncurisetquery(ocopt.url,ocopt.constraint);
+	nullfree(ocopt.constraint);
+	ocopt.constraint = NULL;
+    }        
+    /* Rebuild the url string */
+    if(ocopt.surl != NULL) free(ocopt.surl);
+    ocopt.surl = ncuribuild(ocopt.url,NULL,NULL,NCURIALL);
+
+    /* Reparse */
+    if(ncuriparse(ocopt.surl,&ocopt.url) != NCU_OK) {
+	fprintf(stderr,"malformed source url: %s\n",ocopt.surl);
+	exit(1);
+    }
+
+    if(ocopt.rcfile != NULL) {
+        if(strlen(ocopt.rcfile) == 0 || strcmp(NORC,ocopt.rcfile)==0)
+	    {free(ocopt.rcfile); ocopt.rcfile = NULL;}
+	oc_set_rcfile(ocopt.rcfile);
+    }
+
+    if (ocopt.debug.verbose)
+        dumpflags();
+
+    processdata(ocflags);
+
+    return 0;
+}
+
+static void
+dumpflags(void)
+{
+    char* tmp;
+    if(ocopt.showattributes) fprintf(stderr," -A");
+    if(ocopt.debug.debug) fprintf(stderr," -D%d",ocopt.debug.debuglevel);
+    if(ocopt.debug.dumpdds) fprintf(stderr," -DN");
+    if(ocopt.debug.dumpdatatree) fprintf(stderr," -DD");
+    if(ocopt.debug.dumpdatadds) fprintf(stderr," -DX%d",ocopt.debug.dumplevel);
+    if(ocopt.debug.verbose) fprintf(stderr," -DV");
+    if(ocopt.generate) fprintf(stderr," -G");
+    if(ocopt.logging) fprintf(stderr," -L");
+    if(ocopt.logging) fprintf(stderr," -N %s",ocopt.netrc);
+    if(ocopt.logging) fprintf(stderr," -R %s",ocopt.rcfile);
+    if(ocopt.optdas || ocopt.optdds || ocopt.optdatadds) {
+	fprintf(stderr," -p");
+	if(ocopt.optdas) fprintf(stderr," das");
+	if(ocopt.optdds) fprintf(stderr," dds");
+	if(ocopt.optdatadds) fprintf(stderr," datadds");
+    }
+    tmp = ncuribuild(ocopt.url,NULL,NULL,NCURIALL);
+    fprintf(stderr,"%s\n",tmp);
+    free(tmp);
+}
+
+static void
+usage(char* msg)
+{
+    if(msg) fprintf(stderr,"error: %s\n",msg);
+    fprintf(stderr,"usage: ocprint %s\n",optionmsg);
+    fail(NULL);
+}
+
+static int
+fail(char* msg)
+{
+    if(msg) fprintf(stderr,"fatalerror: %s\n",msg);
+    fflush(ocopt.output); fflush(stderr);
+    exit(1);
+}
+
+/******************************************/
+static void
+check_err(OCerror ocstat, int dofail)
+{
+    if(ocstat == OC_NOERR) return;
+    fprintf(stderr,"error status returned: (%d) %s\n",ocstat,oc_errstring(ocstat));
+    if(dofail) fail(NULL);
+}
+
+static OCerror
+processdata(OCflags flags)
+{
+    char* totalurl;
+    OClink link;
+    OCddsnode dasroot, ddsroot, dataddsroot;
+    OCdatanode rootdatanode;
+
+    totalurl = ncuribuild(ocopt.url,NULL,NULL,NCURIALL);
+    FAIL(oc_open(totalurl,&link));
+    free(totalurl);
+    glink = link;
+
+    if(ocopt.debug.curl)
+	oc_trace_curl(link);
+
+    if(ocopt.netrc)
+	oc_set_netrc(link,ocopt.netrc);
+
+    if(ocopt.selfsigned)
+	oc_set_curlopt(link,"CURLOPT_VERIFYPEER", (void*)0L);
+
+    if(ocopt.optdas) {
+        ocstat = oc_fetch(link,ocopt.url->query,OCDAS,0,&dasroot);
+        if(ocstat != OC_NOERR) {
+            fprintf(stderr,"error status returned: (%d) %s\n",ocstat,oc_errstring(ocstat));
+            fprintf(stderr,"Could not read DAS; continuing.\n");
+            ocopt.optdas = 0;
+            ocopt.showattributes = 0;
+        } else if(ocopt.generate) {
+            char* das = generatedas(link,dasroot);
+            fprintf(ocopt.output,"%s",das);
+            free(das);
+        } else {
+	    const char* text = oc_tree_text(link,dasroot);
+            fprintf(ocopt.output,"%s",(text?text:"null"));
+        }
+    }
+    fflush(ocopt.output);
+
+    if(ocopt.optdds) {
+        ocstat = oc_fetch(link,ocopt.url->query,OCDDS,flags,&ddsroot);
+        if(ocstat != OC_NOERR) {
+            fprintf(stderr,"error status returned: (%d) %s\n",ocstat,oc_errstring(ocstat));
+            fprintf(stderr,"Could not read DDS; continuing.\n");
+            ocopt.optdds = 0;
+        } else {
+            if(ocopt.showattributes && !ocopt.optdas) {
+                FAIL(oc_fetch(link,ocopt.url->query,OCDAS,flags,&dasroot));
+            }
+            if(ocopt.showattributes || ocopt.optdas) {
+                FAIL(oc_merge_das(link,dasroot,ddsroot));
+            }
+            if(ocopt.generate) {
+	        NCbytes* buffer = ncbytesnew();
+                FAIL(generatedds(link,ddsroot,buffer,0));
+                fprintf(ocopt.output,"%s",ncbytescontents(buffer));
+		ncbytesfree(buffer);
+            } else {
+                const char* text = oc_tree_text(link,ddsroot);
+                fprintf(ocopt.output,"%s",(text?text:"null"));
+            }
+        }
+        if(ocopt.debug.dumpdds)
+            oc_dds_ddnode(link,ddsroot);
+    }
+    fflush(ocopt.output);
+
+    if(ocopt.optdatadds) {
+        ocstat = oc_fetch(link,ocopt.url->query,OCDATADDS,flags,&dataddsroot);
+        if(ocstat) {
+            if(ocopt.url->query)
+                fprintf(stderr,"Cannot read DATADDS: %s\n",ocopt.surl);
+            else
+                fprintf(stderr,"Cannot read DATADDS: %s\n",ocopt.surl);
+            exit(1);
+        }
+        if(ocopt.debug.dumpdds)
+            oc_dds_ddnode(link,dataddsroot);
+        if(ocopt.debug.dumpdatadds)
+            oc_dds_dd(link,dataddsroot,ocopt.debug.dumplevel);
+
+        FAIL(oc_dds_getdataroot(link,dataddsroot,&rootdatanode));
+        if(ocopt.debug.dumpdatatree)
+	    oc_data_ddtree(link,rootdatanode);
+        stacknext = 0;
+        printdata(link,rootdatanode);
+    }
+    fflush(ocopt.output);
+
+    oc_close(link);
+    return OC_NOERR;
+}
+
+/**
+This is the main procedure for
+printing a data tree.
+*/
+static OCerror
+printdata(OClink link, OCdatanode datanode)
+{
+    NCbytes* buffer;
+    OCtype octype;
+
+    buffer = ncbytesnew();
+
+    /* verify that datanode is a Dataset datanode */
+    FAIL(oc_data_octype(link,datanode,&octype));
+    assert(octype == OC_Dataset);
+
+    printdata_container(link,datanode,buffer,TOPLEVEL);
+
+    fprintf(ocopt.output,"%s",ncbytescontents(buffer));
+
+    ncbytesfree(buffer);
+    return OC_NOERR;
+}
+
+
+/* Print a single container datanode */
+static OCerror
+printdata_container(OClink link, OCdatanode datanode, NCbytes* buffer, int istoplevel)
+{
+    OCerror stat = OC_NOERR;
+    size_t i;
+    OCddsnode node;
+    OCtype octype;
+    size_t nsubnodes;
+
+    /* Obtain some information about the node */     
+    FAIL(oc_data_ddsnode(link,datanode,&node));
+    FAIL(oc_dds_nsubnodes(link,node,&nsubnodes));
+    FAIL(oc_data_octype(link,datanode,&octype));
+
+    /* If this is not a single instance container, then
+       defer to the appropriate function */
+    if(isatomic(octype))
+	return printdata_leaf(link,datanode,buffer,istoplevel);
+    if(oc_data_indexable(link,datanode))
+	return printdata_indices(link,datanode,buffer,!TOPLEVEL);
+
+    /* Must be a container instance or a record */
+    for(i=0;i<nsubnodes;i++) {
+        OCdatanode field;
+	FAIL(oc_data_ithfield(link,datanode,i,&field));
+	pushstack(field);
+        FAIL(printdata_indices(link,field,buffer,istoplevel));
+	popstack();
+	oc_data_free(link,field);
+	if(stat != OC_NOERR) break;
+    }
+    return stat;
+}
+
+static OCerror
+printdata_indices(OClink link, OCdatanode datanode, NCbytes* buffer, int istoplevel)
+{
+    OCerror stat = OC_NOERR;
+    size_t i;
+    OCddsnode node;
+    size_t rank;
+    OCtype octype;
+    size_t dimsizes[OC_MAX_DIMENSIONS];
+    size_t indices[OC_MAX_DIMENSIONS];
+
+    /* Obtain some information about the node */     
+    FAIL(oc_data_ddsnode(link,datanode,&node));
+    FAIL(oc_dds_octype(link,node,&octype));
+    FAIL(oc_dds_rank(link,node,&rank));
+
+    /* If this is not an indexed structure or a sequence then
+       defer to the appropriate function */
+    if(isatomic(octype))
+	return printdata_leaf(link,datanode,buffer,istoplevel);
+    if(iscontainer(octype) && !oc_data_indexable(link,datanode))
+	return printdata_container(link,datanode,buffer,istoplevel);
+
+    /* Iterate over the datanodes */
+    if(octype == OC_Structure) {
+	/* Get dimension sizes */
+        FAIL(oc_dds_dimensionsizes(link,node,dimsizes));
+        
+	/* init odometer and get cross-product */
+	odom_init(rank,indices,dimsizes);
+        while(odom_more(rank,indices,dimsizes)) {
+	    OCdatanode element;
+	    FAIL(oc_data_ithelement(link,datanode,indices,&element));
+            pushstack(element);
+	    /* walk the container */	
+            printdata_container(link,element,buffer,!TOPLEVEL);
+            popstack();
+	    oc_data_free(link,element);
+	    odom_next(rank,indices,dimsizes);
+        }
+    } else if(octype == OC_Sequence) {
+        /* Dump each element */
+        for(i=0;;i++) {
+	    OCdatanode record;
+	    stat = oc_data_ithrecord(link,datanode,i,&record);
+	    if(stat != OC_NOERR) {
+	        if(stat == OC_EINDEX) break;
+	        return stat;
+	    }
+            pushstack(record);
+            printdata_container(link,record,buffer,!TOPLEVEL); /* print current record */
+            popstack();
+	    oc_data_free(link,record);
+        }
+#ifdef VALIDATE
+	{
+	    size_t count;
+	    FAIL(oc_data_recordcount(link,datanode,&count));
+	    assert(count == i);
+        }
+#endif
+    } else
+        abort();
+
+    return OC_NOERR;
+}
+
+static OCerror
+printdata_leaf(OClink link, OCdatanode datanode, NCbytes* buffer, int istoplevel)
+{
+    OCddsnode node;
+    OCtype octype,atomtype;
+    size_t elemsize;
+    size_t memsize;
+    char* memory;
+    size_t count,rank;
+
+    /* Obtain some information about the node */     
+    FAIL(oc_data_ddsnode(link,datanode,&node));
+    FAIL(oc_dds_octype(link,node,&octype));
+    FAIL(oc_dds_atomictype(link,node,&atomtype));
+    FAIL(oc_dds_rank(link,node,&rank));
+
+    assert(octype == OC_Atomic);
+
+    /* If this variable is top-level then
+       use the oc_dds_read functions
+       in order to test them
+    */
+
+    elemsize = oc_typesize(atomtype);
+    
+    if(rank == 0) {/* Scalar case */
+	memory = calloc(elemsize,1); /* reading only one value */
+        /* read the scalar */
+	if(istoplevel) {
+	    FAIL(oc_dds_read(link,node,NULL,NULL,elemsize,memory));
+	} else {
+	    FAIL(oc_data_read(link,datanode,NULL,NULL,elemsize,memory));
+	}
+        count = 1;
+    } else { 
+	size_t dimsizes[OC_MAX_DIMENSIONS];
+	size_t indices[OC_MAX_DIMENSIONS];
+        FAIL(oc_dds_dimensionsizes(link,node,dimsizes));
+	/* init odometer and get cross-product */
+	count = odom_init(rank,indices,dimsizes);
+        memsize = elemsize*count;
+        memory = calloc(memsize,1);
+    
+#ifdef ALLATONCE /* read all at once */
+        /* indices should be all zeros at this point */
+	if(istoplevel) {
+	    FAIL(oc_dds_read(link,node,indices,dimsizes,memsize,memory));
+	} else {
+	    FAIL(oc_data_read(link,datanode,indices,dimsizes,memsize,memory));
+	}
+#else /* BYITEM */
+        {
+  	    size_t offset;
+	    size_t one[OC_MAX_DIMENSIONS]; 
+            /* Initialize the read-by-one counts */ 
+	    for(i=0;i<rank;i++) one[i]=0; 
+	    one[rank-1] = 1; 
+            /* Read whole atomic array item by item using an odometer */
+	    for(offset=0,i=0;i<count;i++,offset+=elemsize) {
+		if(!odom_more(rank,indices,dimsizes))
+		    abort();
+		if(istoplevel) {
+		    FAIL(oc_dds_read(link,node,
+                                      indices,one,
+				      elemsize,memory+offset));
+		} else {
+	            FAIL(oc_data_read(link,datanode,
+				       indices,one,
+                                       elemsize,memory+offset));
+		}
+		odom_next(rank,indices,dimsizes);
+	    }
+        }
+#endif
+    }
+    dumpdatanode(link,datanode,count,memory,buffer);
+    if(atomtype == OC_String || atomtype == OC_URL)
+	oc_reclaim_strings(count,(char**)memory);
+    free(memory);
+    return OC_NOERR;
+}
+
+static OCerror
+generatedds(OClink link, OCddsnode node, NCbytes* buffer, int depth)
+{
+    size_t i,rank,nattr,nsubnodes;
+    OCtype octype, atomtype;
+    OCddsnode container,field;
+    char id1[1024];
+    char* name;
+
+    ncbytescat(buffer,indent(depth));
+
+    /* get all info about the node */
+    FAIL(oc_dds_properties(link,node,&name,&octype,&atomtype,&container,
+                             &rank,&nsubnodes,&nattr));
+
+    if(octype == OC_Atomic) {
+        ncbytescat(buffer,oc_typetostring(atomtype));
+	ncbytescat(buffer," ");
+	ncbytescat(buffer,idescape(name,id1,sizeof(id1)));
+        /* dump dim info (if any)*/
+	printdims(link,node,buffer);
+        ncbytescat(buffer,";\n");
+        generateddsattributes(link,node,buffer,depth+1);
+    } else { /*must be container*/
+	const char* typename = oc_typetostring(octype);
+        ncbytescat(buffer,typename);
+        ncbytescat(buffer," ");
+        ncbytescat(buffer,LBRACE);
+        ncbytescat(buffer,"\n");
+        for(i=0;i<nsubnodes;i++) {
+	    FAIL(oc_dds_ithfield(link,node,i,&field));
+	    if(octype == OC_Grid) {
+                ncbytescat(buffer,indent(depth));
+		switch (i) {
+		case 0: ncbytescat(buffer,"Array:\n"); break;
+		case 1: ncbytescat(buffer,"Maps:\n"); break;
+		default: break;
+		}
+ 	    }
+	    generatedds(link,field,buffer,depth+1);
+        }
+        ncbytescat(buffer,indent(depth));
+        ncbytescat(buffer,RBRACE);
+        ncbytescat(buffer," ");
+        ncbytescat(buffer,idescape(name,id1,sizeof(id1)));
+	printdims(link,node,buffer);
+        ncbytescat(buffer,";\n");
+        generateddsattributes(link,node,buffer,depth+1);
+    }
+    if(name) free(name);
+    return OC_NOERR;
+}
+
+static OCerror
+printdims(OClink link, OCddsnode node, NCbytes* buffer)
+{
+    int i;
+    size_t rank,size;
+    OCddsnode dimids[OC_MAX_DIMENSIONS];
+    char tmp[1024];
+    char id1[1024];
+
+    FAIL(oc_dds_rank(link,node,&rank));
+    if(rank == 0) return OC_NOERR;
+
+    FAIL(oc_dds_dimensions(link,node,dimids));
+    for(i=0;i<rank;i++) {
+	OCddsnode dim = dimids[i];
+	char* dimname = NULL;
+	FAIL(oc_dimension_properties(link,dim,&size,&dimname));
+	if(dimname == NULL)
+	    snprintf(tmp,sizeof(tmp),"[%lu]",(unsigned long)size);
+        else
+	    snprintf(tmp,sizeof(tmp),"[%s=%lu]",idescape(dimname,id1,sizeof(id1)),(unsigned long)size);
+	ncbytescat(buffer,tmp);
+        if(dimname) free(dimname);
+    }
+    return OC_NOERR;
+}
+
+static OCerror
+generateddsattributes(OClink link, OCddsnode node, NCbytes* buffer, int depth)
+{
+    size_t i,j;
+    char tmp[128];
+    size_t nattrs;
+    char* aname = NULL;
+    char* name = NULL;
+    OCtype atomtype;
+    size_t nvalues;
+    char** values = NULL;
+    char id1[1024];
+
+    FAIL(oc_dds_attr_count(link,node,&nattrs));
+    FAIL(oc_dds_name(link,node,&name));
+
+    if(ocopt.showattributes && nattrs > 0) {
+        for(i=0;i<nattrs;i++) {
+            FAIL(oc_dds_attr(link,node,i,NULL,NULL,&nvalues,NULL));
+   	    values = (char**)malloc(nvalues*sizeof(char*));
+            FAIL(oc_dds_attr(link,node,i,&aname,&atomtype,NULL,values));
+            snprintf(tmp,sizeof(tmp),"%s%s %s:%s = ",indent(depth),
+                        oc_typetostring(atomtype),idescape(name,id1,sizeof(id1)),aname);
+            ncbytescat(buffer,tmp);
+            for(j=0;j<nvalues;j++) {
+                if(j > 0) ncbytescat(buffer,", ");
+		if(needsescapes(values[j])) {
+		    char* escaped = stringescape(values[j]);
+                    ncbytescat(buffer,"\"");
+                    ncbytescat(buffer,escaped);
+                    ncbytescat(buffer,"\"");
+		    if(escaped) free(escaped);
+		} else
+                    ncbytescat(buffer,values[j]);
+            }
+            ncbytescat(buffer,";\n");
+	    oc_reclaim_strings(nvalues,values);
+	    if(values) free(values);
+            if(aname) free(aname);
+	    values = NULL;
+	    aname = NULL;
+        }
+    }
+    if(name) free(name);
+    return OC_NOERR;
+}
+
+static char*
+generatedas(OClink link, OCddsnode root)
+{
+    size_t i, nsubnodes;
+    char* result;
+    NCbytes* buffer = ncbytesnew();
+
+    FAIL(oc_dds_nsubnodes(link,root,&nsubnodes));
+    ncbytescat(buffer,"Attributes {\n");
+    for(i=0;i<nsubnodes;i++) {
+	OCddsnode attr;
+	FAIL(oc_dds_ithfield(link,root,i,&attr));
+        generatedasr(link,attr,buffer,1);
+    }
+    ncbytescat(buffer,"}\n");
+    result = ncbytesdup(buffer);
+    ncbytesfree(buffer);
+    return result;
+}
+
+static OCerror
+generatedasr(OClink link, OCddsnode ddsnode, NCbytes* buffer, int depth)
+{
+    size_t i,nsubnodes;
+    char tmp[256];
+    OCtype octype, atomtype;
+    char* name = NULL;
+    char id1[1024];
+
+    /* get some node info */
+    FAIL(oc_dds_name(link,ddsnode,&name));
+    FAIL(oc_dds_octype(link,ddsnode,&octype));
+    FAIL(oc_dds_atomictype(link,ddsnode,&atomtype));
+
+    if(octype == OC_Attributeset) {
+        /* get node subcount */
+        FAIL(oc_dds_nsubnodes(link,ddsnode,&nsubnodes));
+        snprintf(tmp,sizeof(tmp),"%s%s {\n",indent(depth),idescape(name,id1,sizeof(id1)));
+        ncbytescat(buffer,tmp);
+        for(i=0;i<nsubnodes;i++) {
+	    OCddsnode attr;
+	    FAIL(oc_dds_ithfield(link,ddsnode,i,&attr));
+            generatedasr(link,attr,buffer,depth+1);
+        }
+        ncbytescat(buffer,indent(depth));
+        ncbytescat(buffer,"}\n");
+    } else if(octype == OC_Attribute) {
+        /* get some info about the node */
+	size_t nvalues;
+	FAIL(oc_das_attr_count(link,ddsnode,&nvalues));
+        snprintf(tmp,sizeof(tmp),"%s%s %s",indent(depth),
+                oc_typetostring(atomtype),idescape(name,id1,sizeof(id1)));
+        ncbytescat(buffer,tmp);
+        for(i=0;i<nvalues;i++) {
+            char* value;
+            OCtype ptype;
+            FAIL(oc_das_attr(link,ddsnode,i,&ptype,&value));
+            if(i > 0) ncbytescat(buffer,",");
+            if(ptype == OC_String || ptype == OC_URL) {
+                char* se = stringescape(value);
+                snprintf(tmp,sizeof(tmp)," \"%s\"",se);
+                free(se);
+            } else
+                snprintf(tmp,sizeof(tmp)," %s",value);
+            ncbytescat(buffer,tmp);
+            free(value);
+        }
+        ncbytescat(buffer,";\n");
+    } else {
+        snprintf(tmp,sizeof(tmp),"ocget DAS: unexpected type: %d",(int)octype);
+        ncbytescat(buffer,tmp);
+    }
+    if(name) free(name);
+    return OC_NOERR;
+}
+
+static char hexdigits[] = "0123456789abcdef";
+
+/* Add escape characters to a string */
+static char*
+stringescape(char* s)
+{
+    size_t len;
+    char* p;
+    int c;
+    char* escapedstring;
+
+    if(s == NULL) return NULL;
+    len = strlen(s);
+    escapedstring = (char*)malloc(4*len);
+    p = escapedstring;
+    while((c=*s++)) {
+        if(c == '"' || c == '\\') {*p++ = '\\'; *p++ = c;}
+        else if (c < ' ' || c >= 127) {
+            *p++ = '\\'; *p++ = 'x';
+            *p++ = hexdigits[(c & 0xf0)>>4];
+            *p++ = hexdigits[(c & 0xf)];
+        } else
+            *p++ = c;
+    }
+    *p = '\0';
+    return escapedstring;
+}
+
+static char idchars[] = "_%";
+
+/* Add escape characters to an identifier */
+static char*
+idescape(char* id, char* escapeid, size_t esize)
+{
+    char* p;
+    int c;
+
+    if(id == NULL) return NULL;
+    p = escapeid;
+    *p = '\0';
+    esize--; /* leave room for null */
+    while(esize-- > 0 && (c=*id++)) {
+        if(c >= '0' && c <= '9') {*p++ = c;}
+        else if(c >= 'a' && c <= 'z') {*p++ = c;}
+        else if(c >= 'A' && c <= 'Z') {*p++ = c;}
+        else if(strchr(idchars,c) != NULL) {*p++ = c;}
+        else {
+            *p++ = '%';
+            *p++ = hexdigits[(c & 0xf0)>>4];
+            *p++ = hexdigits[(c & 0xf)];
+        }
+    }
+    *p = '\0';
+    return escapeid;
+}
+
+static char valuechars[] = " \\\"";
+
+/**
+Return 1 if the given string, used as a value, should be escaped.
+*/
+static int
+needsescapes(const char* s)
+{
+    const char* p = s;
+    int c;
+    while((c=*p++)) {
+	if(strchr(valuechars,c) != NULL)
+	    return 1; /* needs to be escaped */
+    }
+    return 0;    
+}
+
+
+static OCerror
+dumpdatanode(OClink link, OCdatanode datanode, size_t count, void* memory, NCbytes* buffer)
+{
+    size_t i;
+    size_t delta;
+    OCddsnode node;
+    OCtype atomtype;
+    OCtype octype;
+    NCbytes* path = NULL;
+    char* name;
+    char id[1024];
+    char tmp[1024];
+    struct DUMPPATH* entry = NULL;
+
+    FAIL(oc_data_ddsnode(link,datanode,&node));
+    FAIL(oc_dds_octype(link,node,&octype));
+    FAIL(oc_dds_atomictype(link,node,&atomtype));
+    delta = oc_typesize(atomtype);
+
+#ifdef TRACK
+    printstack("dumpdatanode");
+#endif
+
+    /* construct the fully qualified name from the stack; watch out for duplicates
+       from e.g. sequence versus record */
+    path = ncbytesnew();
+    for(i=0;i<stacknext;i++) {
+	entry = stack + i;
+	/* check for duplicate */
+	if(i<(stacknext-1) && entry->node == stack[i+1].node) continue;
+
+	/* Get various pieces of additional node information */
+        FAIL(oc_dds_name(glink,entry->node,&name));
+        (void)idescape(name,id,sizeof(id));
+	if(name) free(name);
+
+        switch (entry->octype) {
+
+        case OC_Dataset:
+            break;
+
+        case OC_Structure:
+            ncbytescat(path,"/");
+            ncbytescat(path,id);
+            if(entry->rank > 0) {
+		for(i=0;i<entry->rank;i++) {
+                    sprintf(tmp,"[%lu]",(unsigned long)entry->indices[i]);
+                    ncbytescat(path,tmp);
+		}
+            }
+	    break;
+
+        case OC_Grid:
+            ncbytescat(path,"/");
+            ncbytescat(path,id);
+	    break;
+
+        case OC_Sequence:
+            ncbytescat(path,"/");
+            ncbytescat(path,id);
+            sprintf(tmp,"[%lu]",(unsigned long)entry->indices[0]);
+            ncbytescat(path,tmp);
+            break;
+
+        case OC_Atomic:
+            ncbytescat(path,"/");
+            ncbytescat(path,id);
+            break; /* deal with below */
+
+        default: ncbytescat(path,"?"); break;
+        }
+    }
+    /* work with the final entry */
+    assert(entry == (stack + (stacknext - 1)));
+    assert(datanode == entry->datanode);
+    snprintf(tmp,sizeof(tmp),"%s %s",
+                oc_typetostring(atomtype),
+                ncbytescontents(path));
+    ncbytescat(buffer,tmp);
+    if(entry->rank > 0) {
+	if(ocopt.octest) { /* Match the octest output */
+	    off_t xproduct;
+	    xproduct = totaldimsize(entry->rank,entry->dimsizes);
+            snprintf(tmp,sizeof(tmp),"[0..%lu]",(unsigned long)xproduct-1);
+            ncbytescat(buffer,tmp);
+	} else {
+	    for(i=0;i<entry->rank;i++) {
+                snprintf(tmp,sizeof(tmp),"[0..%lu]",(unsigned long)entry->dimsizes[i]-1);
+                ncbytescat(buffer,tmp);
+	    }
+	}
+    }
+    count = totaldimsize(entry->rank,entry->dimsizes);
+    for(i=0;i<count;i++) {
+        char *memory_local = memory;
+        ncbytescat(buffer," ");
+        oc_typeprint(atomtype,memory_local+(i*delta),sizeof(tmp),tmp);
+        ncbytescat(buffer,tmp);
+    }
+    ncbytescat(buffer,"\n");
+    ncbytesfree(path);
+    return OC_NOERR;
+}
+
+static off_t
+odom_init(size_t rank, size_t* indices, size_t* dimsizes) 
+{ 
+    int i; 
+    off_t count;
+    for(count=1,i=0;i<rank;i++) {
+        indices[i] = 0;
+	count *= dimsizes[i];
+    }
+    return count;
+} 
+
+static void
+odom_next(size_t rank, size_t* indices, size_t* dimsizes) 
+{ 
+    int i; 
+    for(i=rank-1;i>=0;i--) { 
+	indices[i]++; 
+	if(indices[i] < dimsizes[i]) break; 
+	if(i > 0) indices[i] = 0; 
+    } 
+}
+
+/* Return 0 if we have exhausted the indices, 1 otherwise */
+static int
+odom_more(size_t rank, size_t* indices, size_t* dimsizes) 
+{
+    if(indices[0] >= dimsizes[0]) return 0;
+    return 1;
+} 
+
+/* Compute total # of elements if dimensioned */
+static size_t
+totaldimsize(size_t rank, size_t* sizes)
+{
+    unsigned int i;
+    size_t count = 1;
+    for(i=0;i<rank;i++) {
+        count *= sizes[i];
+    }
+    return count;
+}
+
+static char*
+indent(int n)
+{
+    size_t nblanks = BLANKSPERDENT * n;
+    memset(blanks,' ',nblanks);
+    blanks[nblanks] = '\0';
+    return blanks;
+}
+
+static void
+pushstack(OCdatanode datanode)
+{
+    struct DUMPPATH* entry = stack+stacknext;
+    entry->datanode = datanode;
+    FAIL(oc_data_ddsnode(glink,entry->datanode,&entry->node));
+    FAIL(oc_dds_octype(glink,entry->node,&entry->octype));
+    FAIL(oc_dds_rank(glink,entry->node,&entry->rank));
+    if(entry->rank > 0) {
+        FAIL(oc_dds_dimensionsizes(glink,entry->node,entry->dimsizes));
+    }
+    entry->indexed = oc_data_indexed(glink,entry->datanode);
+    if(entry->indexed) {
+	FAIL(oc_data_position(glink,entry->datanode,entry->indices));
+    }
+    stacknext++;
+}
+
+
+#ifdef TRACK
+static void printstack(char* msg)
+{
+    size_t i,j;
+    struct DUMPPATH* entry;
+    fprintf(stderr,"\n%s at stack: %u\n",msg,stacknext);
+    for(entry=stack,i=0;i<stacknext;i++,entry++) {
+	OCdatanode datanode = entry->datanode;
+	OCddsnode node;
+	size_t rank;
+	size_t edges[OC_MAX_DIMENSIONS];
+	char* name;
+        FAIL(oc_dds_rank(glink,entry->node,&rank));
+        if(entry->rank > 0)
+            FAIL(oc_dds_dimensionsizes(glink,entry->node,edges));
+        FAIL(oc_dds_name(glink,node,&name));
+        fprintf(stderr,"    [%d] (%s)",(int)i,name)
+	for(j=0;j<rank;j++) 
+            fprintf(stderr,"[%u]",(unsigned int)edges[j]);
+        fprintf(stderr,"\n");
+    }
+}
+#endif
diff --git a/ncdump/ref_ctest.c b/ncdump/ref_ctest.c
index 753c880..6077b13 100644
--- a/ncdump/ref_ctest.c
+++ b/ncdump/ref_ctest.c
@@ -5,7 +5,7 @@
 void
 check_err(const int stat, const int line, const char *file) {
     if (stat != NC_NOERR) {
-	   (void) fprintf(stderr, "line %d of %s: %s\n", line, file, nc_strerror(stat));
+	   (void) fprintf(stderr, "ZZZ: line %d of %s: %s\n", line, file, nc_strerror(stat));
         exit(1);
     }
 }
diff --git a/ncdump/rewrite-scalar.c b/ncdump/rewrite-scalar.c
index 2215d7c..a8db868 100644
--- a/ncdump/rewrite-scalar.c
+++ b/ncdump/rewrite-scalar.c
@@ -9,7 +9,7 @@
  * $Id: rewrite-scalar.c,v 1.3 2008/10/20 01:48:08 ed Exp $
  *********************************************************************/
 
-#include <config.h>
+#include "config.h"
 #include <stdio.h>
 #include <netcdf.h>
 
diff --git a/ncdump/run_back_comp_tests.sh b/ncdump/run_back_comp_tests.sh
index 14e554d..fa675f8 100755
--- a/ncdump/run_back_comp_tests.sh
+++ b/ncdump/run_back_comp_tests.sh
@@ -1,17 +1,17 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
+
 # This shell script runs the backward compatibility tests.
 
 set -e
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
-
 echo ""
 echo "*** Testing that this version can read data produced by old versions of netCDF."
 echo "*** checking ref_nc_test_netcdf4_4_0.nc..."
-./ncdump $srcdir/ref_nc_test_netcdf4_4_0.nc > tst_nc_test_netcdf4_4_0.cdl
+${NCDUMP} $srcdir/ref_nc_test_netcdf4_4_0.nc > tst_nc_test_netcdf4_4_0.cdl
 # Why drop the first two lines?
 #tail -n +2 < $srcdir/ref_nc_test_netcdf4.cdl > tmp.cdl
 #tail -n +2 < tst_nc_test_netcdf4_4_0.cdl > tmp_4_0.cdl
@@ -20,14 +20,14 @@ diff -b -w $srcdir/ref_nc_test_netcdf4.cdl tst_nc_test_netcdf4_4_0.cdl
 
 # echo "*** Testing that old versions can read data produced by this version of netCDF."
 # echo "*** checking version 4.0..."
-# ../ncgen/ncgen -b -o tst_nc_test_netcdf4 -k nc7 $srcdir/ref_nc_test_netcdf4.cdl
+# ${NCGEN} -b -o tst_nc_test_netcdf4 -k nc7 $srcdir/ref_nc_test_netcdf4.cdl
 # /machine/local_4.0/bin/ncdump tst_nc_test_netcdf4.nc > tst_nc_test_netcdf4.cdl
 # tail -n +2 <$srcdir/ref_nc_test_netcdf4.cdl > tmp.cdl
 # tail -n +2 <tst_nc_test_netcdf4.cdl > tmp_4_0.cdl
 # diff -b -w tmp.cdl tmp_4_0.cdl
 
 # echo "*** checking version 4.1.1..."
-# ../ncgen/ncgen -b -o tst_nc_test_netcdf4 -k nc7 $srcdir/ref_nc_test_netcdf4.cdl
+# ${NCGEN} -b -o tst_nc_test_netcdf4 -k nc7 $srcdir/ref_nc_test_netcdf4.cdl
 # /machine/local_4.1.1/bin/ncdump tst_nc_test_netcdf4.nc > tst_nc_test_netcdf4.cdl
 # tail -n +2 <$srcdir/ref_nc_test_netcdf4.cdl > tmp.cdl
 # tail -n +2 <tst_nc_test_netcdf4.cdl > tmp_4_0.cdl
diff --git a/ncdump/run_ncgen_nc4_tests.sh b/ncdump/run_ncgen_nc4_tests.sh
new file mode 100755
index 0000000..7172102
--- /dev/null
+++ b/ncdump/run_ncgen_nc4_tests.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+# This shell script runs the ncdump tests.
+# $Id: run_nc4_tests.sh,v 1.4 2010/05/18 20:05:23 dmh Exp $
+
+if test "x$srcdir" = x ; then srcdir="."; fi
+. ../test_common.sh
+
+##
+# Function to test a netCDF CDL file.
+# 1. Generate binary nc.
+# Use ncdump to compare against original CDL file.
+# Input: CDL file name, minus the suffix, output filename
+# Other input: arguments.
+#
+# Example:
+#     $ validateNC compound_datasize_test -k nc4
+##
+validateNC() {
+    BASENAME=$1
+    INFILE=$top_srcdir/ncgen/$1.cdl
+    TMPFILE=tst_$2.cdl
+    shift
+    shift
+    ARGS=$@
+
+    echo "*** generating $BASENAME.nc ***"
+    ${NCGEN} $ARGS -o $BASENAME.nc $INFILE
+    ${NCDUMP} $BASENAME.nc | sed 's/e+0/e+/g' > $TMPFILE
+    echo "*** comparing binary against source CDL file *** "
+    diff -b -w $INFILE $TMPFILE
+}
+
+
+
+echo "*** Testing ncgen for netCDF-4."
+set -e
+
+echo "*** creating netCDF-4 file c0_4.nc from c0_4.cdl..."
+validateNC "c0_4" "c0_4" -k nc4 -b -o c0_4.nc
+
+echo "*** creating netCDF-4 classic model file c0_4c.nc from c0.cdl..."
+validateNC "c0" "c0_4c" -k nc7 -b
+
+echo "*** creating C code for CAM file ref_camrun.cdl..."
+${NCGEN} -lc $top_srcdir/ncgen/ref_camrun.cdl >ref_camrun.c
+
+echo "*** test for jira NCF-199 bug"
+validateNC "ncf199" "ncf199" -k nc4
+
+echo "*** creating binary files for github issue 323..."
+echo "*** github issue 323 test 1"
+validateNC "compound_datasize_test" "compound_datasize_test" -k nc4
+
+echo "*** github issue 323 test 2"
+validateNC "compound_datasize_test2" "compound_datasize_test2"  -k nc4
+
+echo "*** Global Attribute with Enum type"
+validateNC "tst_gattenum" "tst_gattenum"  -k nc4
+
+echo "*** Integer constant with just 'u' suffix"
+validateNC "tst_usuffix" "tst_usuffix"  -k nc4
+
+echo "*** Test successful!"
+exit 0
diff --git a/ncdump/run_ncgen_tests.sh b/ncdump/run_ncgen_tests.sh
new file mode 100755
index 0000000..9987c74
--- /dev/null
+++ b/ncdump/run_ncgen_tests.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+# This shell script runs the ncgen tests.
+# $Id: run_tests.sh,v 1.10 2010/04/04 22:06:03 dmh Exp $
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
+echo "*** Testing ncgen."
+set -e
+
+#VALGRIND="valgrind -q --error-exitcode=2 --leak-check=full"
+
+validateNC() {
+    BASENAME=$1
+    INFILE=$top_srcdir/ncgen/$1.cdl
+    TMPFILE=tst_$2.cdl
+    shift
+    shift
+    ARGS=$@
+
+    echo "*** generating $BASENAME.nc ***"
+    if test "x$VALGRIND" = x ; then
+    ${NCGEN} $ARGS -o $BASENAME.nc $INFILE
+    else
+    ${VALGRIND} ${NCGEN} $ARGS -o $BASENAME.nc $INFILE
+    fi
+    ${NCDUMP} $BASENAME.nc | sed 's/e+0/e+/g' > $TMPFILE
+    echo "*** comparing $BASENAME.nc against $INFILE *** "
+    diff -b -w $INFILE $TMPFILE
+}
+
+echo "*** creating classic file c0.nc from c0.cdl..."
+
+validateNC c0 c0 -b
+
+echo "*** creating 64-bit offset file c0_64.nc from c0.cdl..."
+
+validateNC c0 "c0_64" -k 64-bit-offset -b
+
+echo "*** creating 64-bit offset file c5.nc from c5.cdl..."
+${NCGEN} -k 64-bit-data -b -o c5.nc $top_srcdir/ncgen/c5.cdl
+if [ ! -f c5.nc ]; then
+    echo "Failure."
+    exit 1
+fi
+
+echo "*** Test successful!"
+exit 0
diff --git a/ncdump/run_tests.sh b/ncdump/run_tests.sh
index cbf9c0a..f192d8a 100755
--- a/ncdump/run_tests.sh
+++ b/ncdump/run_tests.sh
@@ -1,30 +1,28 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
 # This shell script runs the ncdump tests.
 # $Id: run_tests.sh,v 1.18 2010/05/19 13:43:39 ed Exp $
 
-set -e
-
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
+set -e
 echo ""
 echo "*** Testing ncgen and ncdump using some test CDL files."
 echo "*** creating tst_small.nc from ref_tst_small.cdl..."
-../ncgen/ncgen -b -o tst_small.nc $srcdir/ref_tst_small.cdl
+cat $srcdir/ref_tst_small.cdl
+${NCGEN} -b -o tst_small.nc $srcdir/ref_tst_small.cdl
 echo "*** creating tst_small.cdl from tst_small.nc..."
-./ncdump tst_small.nc > tst_small.cdl
+${NCDUMP} tst_small.nc > tst_small.cdl
 diff -b -w tst_small.cdl $srcdir/ref_tst_small.cdl
 
 echo "*** creating test0.nc from test0.cdl..."
-../ncgen/ncgen -b $srcdir/test0.cdl
+${NCGEN} -b $srcdir/test0.cdl
 echo "*** creating test1.cdl from test0.nc..."
-./ncdump -n test1 test0.nc > test1.cdl
+${NCDUMP} -n test1 test0.nc > test1.cdl
 echo "*** creating test1.nc from test1.cdl..."
-../ncgen/ncgen -b test1.cdl
+${NCGEN} -b test1.cdl
 echo "*** creating test2.cdl from test1.nc..."
-./ncdump test1.nc > test2.cdl
+${NCDUMP} test1.nc > test2.cdl
 echo "*** checking that test1.cdl and test2.cdl are the same..."
 diff -b -w test1.cdl test2.cdl
 
diff --git a/ncdump/run_utf8_nc4_tests.sh b/ncdump/run_utf8_nc4_tests.sh
index 000d808..e013b20 100755
--- a/ncdump/run_utf8_nc4_tests.sh
+++ b/ncdump/run_utf8_nc4_tests.sh
@@ -1,19 +1,20 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+
+. ../test_common.sh
+
 #
 # Moving some netcdf-4 only tests here, out of tst_nccopy and run_utf8_tests.
 # Without this, the tests fail when netcdf-4 is disabled.
 
 set -e
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`;
-fi
-export srcdir
+
 echo ""
 
 rm -f utf8.nc utf8.cdl
 echo "*** creating enhanced file with utf8 characters..."
-../ncgen/ncgen -4 -b -o utf8.nc ${srcdir}/ref_tst_utf8_4.cdl
+${NCGEN} -4 -b -o utf8.nc ${srcdir}/ref_tst_utf8_4.cdl
 echo "*** dump and compare utf8 output..."
-./ncdump utf8.nc > utf8.cdl
+${NCDUMP} utf8.nc > utf8.cdl
 diff -b -w utf8.cdl ${srcdir}/ref_tst_utf8_4.cdl
diff --git a/ncdump/run_utf8_tests.sh b/ncdump/run_utf8_tests.sh
index a409513..1c98e30 100755
--- a/ncdump/run_utf8_tests.sh
+++ b/ncdump/run_utf8_tests.sh
@@ -1,7 +1,9 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script runs ncdump tests relating to the new UTF8 name stuff.
-# $Id:$
 
 set -e
 echo ""
@@ -16,22 +18,22 @@ fi
 
 rm -f utf8.nc utf8.cdl
 echo "*** creating classic offset file with utf8 characters..."
-../ncgen/ncgen -b -o utf8.nc ${srcdir}/ref_tst_utf8.cdl
+${NCGEN} -b -o utf8.nc ${srcdir}/ref_tst_utf8.cdl
 echo "*** dump and compare utf8 output..."
-./ncdump utf8.nc > utf8.cdl
+${NCDUMP} utf8.nc > utf8.cdl
 diff -b -w utf8.cdl ${srcdir}/ref_tst_utf8.cdl
 
 rm -f utf8.nc utf8.cdl
 echo "*** creating 64-bit offset file with utf8 characters..."
-../ncgen/ncgen -k 64-bit-offset -b -o utf8.nc ${srcdir}/ref_tst_utf8.cdl
+${NCGEN} -k 64-bit-offset -b -o utf8.nc ${srcdir}/ref_tst_utf8.cdl
 echo "*** (64 bit) dump and compare utf8 output..."
-./ncdump utf8.nc > utf8.cdl
+${NCDUMP} utf8.nc > utf8.cdl
 diff -b -w utf8.cdl ${srcdir}/ref_tst_utf8.cdl
 
 echo "*** dumping tst_utf8.nc to tst_utf8.cdl..."
 rm -f tst8.cdl
 sed -e 's/^netcdf tst_unicode/netcdf tst_utf8/' <${srcdir}/ref_tst_unicode.cdl >tst8.cdl
-./ncdump tst_utf8.nc > tst_utf8.cdl
+${NCDUMP} tst_utf8.nc > tst_utf8.cdl
 echo "*** comparing tst_utf8.cdl with tst8.cdl..."
 diff -b -w tst_utf8.cdl tst8.cdl
 rm -f tst8.cdl result
diff --git a/ncdump/tst_64bit.sh b/ncdump/tst_64bit.sh
index b8e871e..9baa2f4 100755
--- a/ncdump/tst_64bit.sh
+++ b/ncdump/tst_64bit.sh
@@ -1,19 +1,22 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script runs the ncdump tests.
-# $Id: tst_64bit.sh,v 1.9 2006/03/04 18:50:15 ed Exp $
+
 
 echo ""
 echo "*** Testing ncgen and ncdump with 64-bit offset format."
 set -e
 echo "*** creating test0.nc from test0.cdl..."
-../ncgen/ncgen -b -k2 $srcdir/test0.cdl
+${NCGEN} -b -k2 $srcdir/test0.cdl
 echo "*** creating test1.cdl from test0.nc..."
-./ncdump -n test1 test0.nc > test1.cdl
+${NCDUMP} -n test1 test0.nc > test1.cdl
 echo "*** creating test1.nc from test1.cdl..."
-../ncgen/ncgen -b -k2 test1.cdl
+${NCGEN} -b -k2 test1.cdl
 echo "*** creating test2.cdl from test1.nc..."
-./ncdump test1.nc > test2.cdl
+${NCDUMP} test1.nc > test2.cdl
 cmp test1.cdl test2.cdl
 echo "*** All ncgen and ncdump with 64-bit offset format tests passed!"
 
@@ -21,13 +24,13 @@ echo ""
 echo "*** Testing ncgen and ncdump with CDF5 format."
 set -e
 echo "*** creating test0.nc from test0.cdl..."
-../ncgen/ncgen -b -k5 $srcdir/test0.cdl
+${NCGEN} -b -k5 $srcdir/test0.cdl
 echo "*** creating test1.cdl from test0.nc..."
-./ncdump -n test1 test0.nc > test1.cdl
+${NCDUMP} -n test1 test0.nc > test1.cdl
 echo "*** creating test1.nc from test1.cdl..."
-../ncgen/ncgen -b -k5 test1.cdl
+${NCGEN} -b -k5 test1.cdl
 echo "*** creating test2.cdl from test1.nc..."
-./ncdump test1.nc > test2.cdl
+${NCDUMP} test1.nc > test2.cdl
 cmp test1.cdl test2.cdl
 echo "*** All ncgen and ncdump with CDF5 format tests passed!"
 
diff --git a/ncdump/tst_bom.sh b/ncdump/tst_bom.sh
index 53d2f89..40232a3 100755
--- a/ncdump/tst_bom.sh
+++ b/ncdump/tst_bom.sh
@@ -1,12 +1,12 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script tests BOM support in ncgen
 
 set -e
 
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`; 
-fi
 # add hack for sunos
 export srcdir;
 
@@ -25,12 +25,12 @@ data:
 EOF
 
 echo "*** Generate a cdl file with leading UTF-8 BOM."
-./bom 8 >tst_bom8.cdl
+${execdir}/bom 8 >tst_bom8.cdl
 cat tst_bom.cdl >> tst_bom8.cdl
 
 echo "*** Verify .nc file"
-../ncgen/ncgen -k nc3 -o tst_bom8.nc tst_bom8.cdl
-../ncdump/ncdump -n tst_bom tst_bom8.nc > tmp.cdl
+${NCGEN} -k nc3 -o tst_bom8.nc tst_bom8.cdl
+${NCDUMP} -n tst_bom tst_bom8.nc > tmp.cdl
 diff -w tst_bom.cdl tmp.cdl
 
 # Do it again but with Big-Endian 16; should fail
@@ -38,11 +38,11 @@ diff -w tst_bom.cdl tmp.cdl
 rm -f tmp.cdl tst_bom8.* tst_bom16.*
 
 echo "*** Generate a cdl file with leading UTF-16 BOM."
-./bom 16 >tst_bom16.cdl
+${execdir}/bom 16 >tst_bom16.cdl
 cat tst_bom.cdl >> tst_bom16.cdl
 
 echo "*** Verify UTF-16 file fails"
-if ../ncgen/ncgen -k nc3 -o tst_bom16.nc tst_bom16.cdl ; then
+if ${NCGEN} -k nc3 -o tst_bom16.nc tst_bom16.cdl ; then
 echo 'BOM Big Endian 16 succeeded, but should not'
 exit 1
 else
diff --git a/ncdump/tst_calendars.sh b/ncdump/tst_calendars.sh
index 8d2313f..3f3ca71 100755
--- a/ncdump/tst_calendars.sh
+++ b/ncdump/tst_calendars.sh
@@ -1,15 +1,17 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script tests ncdump -t option for CF calendar attributes
-# $Id $
 
 set -e
 echo ""
 echo "*** Testing ncdump -t output for times with CF calendar attribute"
 echo "*** creating netcdf file tst_calendars.nc from tst_calendars.cdl..."
-../ncgen/ncgen -b -o tst_calendars.nc $srcdir/tst_calendars.cdl
+${NCGEN} -b -o tst_calendars.nc $srcdir/tst_calendars.cdl
 echo "*** creating tst_times.cdl from tst_calendars.nc with ncdump -t ..."
-./ncdump -n tst_times -t tst_calendars.nc > tst_times.cdl
+${NCDUMP} -n tst_times -t tst_calendars.nc > tst_times.cdl
 echo "*** comparing tst_times.cdl with ref_times.cdl..."
 diff -b tst_times.cdl $srcdir/ref_times.cdl
 echo "*** All ncdump test output for -t option with CF calendar atts passed!"
diff --git a/ncdump/tst_charfill.sh b/ncdump/tst_charfill.sh
index 96b7909..e6d9f8c 100755
--- a/ncdump/tst_charfill.sh
+++ b/ncdump/tst_charfill.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script runs an ncgen buf in handling character _Fillvalue.
 set -e
 echo ""
@@ -7,9 +10,9 @@ echo "*** Testing char _Fillvalue bug fix."
 
 # echo "*** Create tst_charfill.nc from tst_charfill.cdl..."
 rm -f tst_charfill.nc tmp_tst_charfill.cdl
-../ncgen/ncgen -b -o tst_charfill.nc $srcdir/tst_charfill.cdl
+${NCGEN} -b -o tst_charfill.nc $srcdir/tst_charfill.cdl
 # echo "*** dumping tst_charfill.nc to tmp_tst_charfill.cdl..."
-./ncdump tst_charfill.nc > tmp_tst_charfill.cdl
+${NCDUMP} tst_charfill.nc > tmp_tst_charfill.cdl
 # echo "*** comparing tmp_tst_charfill.cdl with ref_tst_charfill.cdl..."
 diff -b tmp_tst_charfill.cdl $srcdir/ref_tst_charfill.cdl
 
diff --git a/ncdump/tst_compress.c b/ncdump/tst_compress.c
index 0301129..9be200d 100644
--- a/ncdump/tst_compress.c
+++ b/ncdump/tst_compress.c
@@ -7,7 +7,7 @@
    $Id$
 */
 
-#include <config.h>
+#include "config.h"
 #include <nc_tests.h>
 #include "err_macros.h"
 #include <stdlib.h>
diff --git a/ncdump/tst_dimsizes.c b/ncdump/tst_dimsizes.c
index a38bb94..cb8fe81 100644
--- a/ncdump/tst_dimsizes.c
+++ b/ncdump/tst_dimsizes.c
@@ -30,12 +30,12 @@ main(int argc, char **argv)
     size_t dimsize;
     int dimid;
     int stat = NC_NOERR;
-
+    nc_set_log_level(5);
     printf("\n*** Testing Max Dimension Sizes\n");
 
     printf("\n|size_t|=%lu\n",(unsigned long)sizeof(size_t));
 
-    printf("\n*** Writing Max Dimension Size For NC_CLASSIC\n");
+    printf("\n*** Writing Max Dimension Size (%d) For NC_CLASSIC\n",DIMMAXCLASSIC);
     if ((stat=nc_create(FILECLASSIC, NC_CLOBBER, &ncid))) ERRSTAT(stat);
     dimsize = DIMMAXCLASSIC;
     if ((stat=nc_def_dim(ncid, "testdim", dimsize, &dimid))) ERRSTAT(stat);
@@ -48,10 +48,11 @@ main(int argc, char **argv)
     if(dimsize != DIMMAXCLASSIC) ERR;
     if ((stat=nc_close(ncid))) ERRSTAT(stat);
 
-    printf("\n*** Writing Max Dimension Size For NC_64BIT_OFFSET\n");
+    printf("\n*** Writing Max Dimension Size (%u) For NC_64BIT_OFFSET\n",DIMMAX64OFFSET);
     if ((stat=nc_create(FILE64OFFSET, NC_CLOBBER | NC_64BIT_OFFSET, &ncid))) ERRSTAT(stat);
     dimsize = DIMMAX64OFFSET;
     if ((stat=nc_def_dim(ncid, "testdim", dimsize, &dimid))) ERRSTAT(stat);
+    if ((stat=nc_enddef(ncid))) ERRSTAT(stat);
     if ((stat=nc_close(ncid))) ERRSTAT(stat);
 
     printf("\n*** Reading Max Dimension Size For NC_64BIT_OFFSET\n");
@@ -62,7 +63,7 @@ main(int argc, char **argv)
     if ((stat=nc_close(ncid))) ERRSTAT(stat);
 
     if(sizeof(size_t) == 8) {
-        printf("\n*** Writing Max Dimension Size For NC_64BIT_DATA\n");
+      printf("\n*** Writing Max Dimension Size (%llu) For NC_64BIT_DATA\n",DIMMAX64DATA);
         if ((stat=nc_create(FILE64DATA, NC_CLOBBER | NC_64BIT_DATA, &ncid))) ERRSTAT(stat);
         dimsize = (size_t)DIMMAX64DATA;
         if ((stat=nc_def_dim(ncid, "testdim", dimsize, &dimid))) ERRSTAT(stat);
diff --git a/ncdump/tst_dimsizes.sh b/ncdump/tst_dimsizes.sh
index 521a707..0df2828 100755
--- a/ncdump/tst_dimsizes.sh
+++ b/ncdump/tst_dimsizes.sh
@@ -1,31 +1,27 @@
 #!/bin/sh
 
-echo "*** Test Maximum dimension sizes X mode"
+#set -e
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
 
-set -x
+echo "*** Test Maximum dimension sizes X mode"
 
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
 # This shell script tests max dimension sizes X mode
 
 RETURN=0
 
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`; 
-fi
-# add hack for sunos
-export srcdir;
-
 echo ""
 
 rm -f tst_dimsize_classic.nc tst_dimsize_64offset.nc tst_dimsize_64data.nc
 
 echo "*** Generate: tst_dimsize_classic.nc tst_dimsize_64offset.nc tst_dimsize_64data.nc"
-./tst_dimsizes
+${execdir}/tst_dimsizes
 
 echo "*** Verify that ncdump can read dimsizes"
 
 rm -fr ./tmp
-if ../ncdump/ncdump -h tst_dimsize_classic.nc > ./tmp ; then
+if ${NCDUMP} -h tst_dimsize_classic.nc > ./tmp ; then
 echo "*** PASS: ncdump tst_dimsize_classic.nc"
 else
 echo "*** FAIL: ncdump tst_dimsize_classic.nc"
@@ -33,7 +29,7 @@ RETURN=1
 fi
 
 rm -fr ./tmp
-if ../ncdump/ncdump -h tst_dimsize_64offset.nc > ./tmp ; then
+if ${NCDUMP} -h tst_dimsize_64offset.nc > ./tmp ; then
 echo "*** PASS: ncdump tst_dimsize_64offset.nc"
 else
 echo "*** FAIL: ncdump tst_dimsize_64offset.nc"
@@ -42,7 +38,7 @@ fi
 
 if test -f tst_dimsize_64data.nc ; then
   rm -fr ./tmp
-  if ../ncdump/ncdump -h tst_dimsize_64data.nc > ./tmp ; then
+  if ${NCDUMP} -h tst_dimsize_64data.nc > ./tmp ; then
     echo "*** PASS: ncdump tst_dimsize_64data.nc"
   else
     echo "*** FAIL: ncdump tst_dimsize_64data.nc"
@@ -54,4 +50,3 @@ fi
 rm -f tmp tst_dimsize_classic.nc tst_dimsize_64offset.nc tst_dimsize_64data.nc
 
 exit $RETURN
-
diff --git a/ncdump/tst_fileinfo.sh b/ncdump/tst_fileinfo.sh
index f1f2254..c81d278 100755
--- a/ncdump/tst_fileinfo.sh
+++ b/ncdump/tst_fileinfo.sh
@@ -1,24 +1,10 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
-set -e
-echo ""
-
-if test "x$builddir" = "x"; then builddir=`pwd`; fi
-if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
-
-# Make buildir absolute
-cd $builddir
-builddir=`pwd`
 
-# Make srcdir be absolute
-cd $srcdir
-srcdir=`pwd`
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
-cd $builddir
-
-export verbose
-export srcdir
-export builddir
+set -e
+echo ""
 
 EXIT=0
 
@@ -28,18 +14,18 @@ NF=ref_tst_compounds4.nc
 
 # Do a false negative test 
 rm -f ./tmp
-if $builddir/ncdump -s $builddir/$NF | fgrep '_IsNetcdf4 = 0' > ./tmp ; then
+if $NCDUMP -s $builddir/$NF | fgrep '_IsNetcdf4 = 0' > ./tmp ; then
    echo "Pass: False negative for file: $NF"
 else
    echo "FAIL: False negative for file: $NF"
 fi
 rm -f ./tmp
 
-if ./tst_fileinfo > /dev/null ; then
+if ${execdir}/tst_fileinfo > /dev/null ; then
    # look at the _IsNetcdf4 flag
-   N_IS=`${builddir}/ncdump -s $NCF | fgrep '_IsNetcdf4' | tr -d ' ;'`
+   N_IS=`${NCDUMP} -s $NCF | fgrep '_IsNetcdf4' | tr -d ' ;'`
    N_IS=`echo $N_IS | cut -d= -f2`
-   H_IS=`${builddir}/ncdump -s $HDF | fgrep '_IsNetcdf4' | tr -d ' ;'`
+   H_IS=`${NCDUMP} -s $HDF | fgrep '_IsNetcdf4' | tr -d ' ;'`
    H_IS=`echo $H_IS | cut -d= -f2`
    if test "x$N_IS" = 'x0' ;then
      echo "FAIL: $NCF is marked as not netcdf-4"
diff --git a/ncdump/tst_fillbug.sh b/ncdump/tst_fillbug.sh
index 90361a0..a583e16 100755
--- a/ncdump/tst_fillbug.sh
+++ b/ncdump/tst_fillbug.sh
@@ -1,21 +1,15 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
-# This shell script runs an ncdump bug test for netcdf-4
-# $Id: tst_fillbug.sh,v 1.1 2008/10/02 19:49:52 russ Exp $
-
-set -e
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`;
-fi
-export srcdir
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
+# This shell script runs an ncdump bug test for netcdf-4
 
 echo ""
 echo "*** Running ncdump bug test."
 
 # echo "*** dumping tst_fillbug.nc to tst_fillbug.cdl..."
-./ncdump tst_fillbug.nc > tst_fillbug.cdl
+${NCDUMP} tst_fillbug.nc > tst_fillbug.cdl
 # echo "*** comparing tst_fillbug.cdl with ref_tst_fillbug.cdl..."
 diff -b tst_fillbug.cdl $srcdir/ref_tst_fillbug.cdl
 
diff --git a/ncdump/tst_formatx3.sh b/ncdump/tst_formatx3.sh
index 8105ec6..6021acc 100755
--- a/ncdump/tst_formatx3.sh
+++ b/ncdump/tst_formatx3.sh
@@ -1,12 +1,9 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
-# This shell script tests the output several previous tests.
-# $Id: tst_output.sh,v 1.17 2010/05/14 16:21:15 ed Exp $
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
-if test "x$srcdir" = x ; then
-srcdir="."
-fi
+# This shell script tests the output several previous tests.
 
 ECODE=0
 
@@ -15,8 +12,8 @@ echo "*** Testing extended file format output."
 set -e
 echo "Test extended format output for a netcdf-3 file"
 rm -f tmp
-../ncgen/ncgen -k nc3 -b -o ./test.nc $srcdir/ref_tst_small.cdl
-./ncdump -K test.nc >tmp
+${NCGEN} -k nc3 -b -o ./test.nc $srcdir/ref_tst_small.cdl
+${NCDUMP} -K test.nc >tmp
 if ! grep 'classic mode=00000000' <tmp ; then
 echo "*** Fail: extended format for a classic file"
 ECODE=1
@@ -24,8 +21,8 @@ fi
 
 echo "Test extended format output for a 64-bit offset netcdf-3 file"
 rm -f tmp
-../ncgen/ncgen -k nc6 -b -o ./test.nc $srcdir/ref_tst_small.cdl
-./ncdump -K test.nc >tmp
+${NCGEN} -k nc6 -b -o ./test.nc $srcdir/ref_tst_small.cdl
+${NCDUMP} -K test.nc >tmp
 if ! grep '64-bit offset mode=00000200' <tmp ; then
 echo "*** Fail: extended format for a 64-bit classic file"
 ECODE=1
@@ -33,8 +30,8 @@ fi
 
 echo "Test extended format output for a 64-bit CDF-5 classic file"
 rm -f tmp
-../ncgen/ncgen -k5 -b -o ./test.nc $srcdir/ref_tst_small.cdl
-./ncdump -K test.nc >tmp
+${NCGEN} -k5 -b -o ./test.nc $srcdir/ref_tst_small.cdl
+${NCDUMP} -K test.nc >tmp
 if ! grep -F '64-bit data mode=00000020' <tmp ; then
 echo "*** Fail: extended format for a 64-bit CDF-5 classic file"
 ECODE=1
diff --git a/ncdump/tst_formatx4.sh b/ncdump/tst_formatx4.sh
index fb666c5..8d2a86d 100755
--- a/ncdump/tst_formatx4.sh
+++ b/ncdump/tst_formatx4.sh
@@ -1,11 +1,9 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
-# This shell script tests the output several previous tests.
-# $Id: tst_output.sh,v 1.17 2010/05/14 16:21:15 ed Exp $
 
-if test "x$srcdir" = x ; then
-srcdir="."
-fi
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
+# This shell script tests the output several previous tests.
 
 ECODE=0
 echo ""
@@ -13,8 +11,8 @@ echo "*** Testing extended file format output."
 set -e
 echo "Test extended format output for a netcdf-4 file"
 rm -f tmp
-../ncgen/ncgen -k nc4 -b -o ./test.nc $srcdir/ref_tst_small.cdl
-./ncdump -K test.nc >tmp
+${NCGEN} -k nc4 -b -o ./test.nc $srcdir/ref_tst_small.cdl
+${NCDUMP} -K test.nc >tmp
 if ! grep 'HDF5 mode=00001000' <tmp ; then
 echo "*** Fail: extended format for a netcdf-4 file"
 ECODE=1
@@ -22,8 +20,8 @@ fi
 
 echo "Test extended format output for a classic netcdf-4 file"
 rm -f tmp
-../ncgen/ncgen -k nc7 -b -o ./test.nc $srcdir/ref_tst_small.cdl
-./ncdump -K test.nc >tmp
+${NCGEN} -k nc7 -b -o ./test.nc $srcdir/ref_tst_small.cdl
+${NCDUMP} -K test.nc >tmp
 if ! grep 'HDF5 mode=00001000' <tmp ; then
 echo "*** Fail: extended format for a classic netcdf-4 file"
 ECODE=1
diff --git a/ncdump/tst_grp_spec.sh b/ncdump/tst_grp_spec.sh
index 02c49bb..81e7865 100755
--- a/ncdump/tst_grp_spec.sh
+++ b/ncdump/tst_grp_spec.sh
@@ -1,16 +1,18 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script tests ncdump -g option for specifying groups for
 # which data is to be output.
-# $Id$
 
 set -e
 echo ""
 echo "*** Testing ncdump -g output for specifying group subsets"
 echo "*** creating netcdf file tst_grp_spec.nc from ref_tst_grp_spec0.cdl..."
-../ncgen/ncgen -knc4 -o tmp_all.nc -b $srcdir/ref_tst_grp_spec0.cdl
+${NCGEN} -knc4 -o tmp_all.nc -b $srcdir/ref_tst_grp_spec0.cdl
 echo "*** creating tmp_subset.cdl from tmp_all.nc with ncdump -g ..."
-./ncdump -g g1,g4 -n tmp_subset tmp_all.nc > tmp_subset.cdl
+${NCDUMP} -g g1,g4 -n tmp_subset tmp_all.nc > tmp_subset.cdl
 echo "*** comparing tmp_subset.cdl with ref_tst_grp_spec.cdl..."
 diff -b tmp_subset.cdl $srcdir/ref_tst_grp_spec.cdl
 
diff --git a/ncdump/tst_h_scalar.sh b/ncdump/tst_h_scalar.sh
index 896ee64..7fccec7 100755
--- a/ncdump/tst_h_scalar.sh
+++ b/ncdump/tst_h_scalar.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script runs ncdump to verify scalar attribute and variable output
 
 set -e
@@ -7,7 +10,7 @@ echo ""
 echo "*** Running ncdump scalar test."
 
 # echo "*** dumping tst_h_scalar.nc to tst_h_scalar.cdl..."
-./ncdump tst_h_scalar.nc > tst_h_scalar.cdl
+${NCDUMP} tst_h_scalar.nc > tst_h_scalar.cdl
 # echo "*** comparing tst_h_scalar.cdl with ref_tst_h_scalar.cdl..."
 diff -b tst_h_scalar.cdl $srcdir/cdl/ref_tst_h_scalar.cdl
 
diff --git a/ncdump/tst_inmemory_nc3.sh b/ncdump/tst_inmemory_nc3.sh
index 569f942..8513154 100755
--- a/ncdump/tst_inmemory_nc3.sh
+++ b/ncdump/tst_inmemory_nc3.sh
@@ -1,18 +1,10 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
-verbose=1
-set -e
-if test "x$builddir" = "x"; then builddir=`pwd`; fi
-if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
 
-# Make buildir absolute
-cd $builddir
-builddir=`pwd`
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
-# Make srcdir be absolute
-cd $srcdir
-srcdir=`pwd`
-cd $builddir
+verbose=1
+set -e
 
 # Setup
 PASS=1
@@ -29,9 +21,9 @@ dotest() {
 K=$1
 for f in $2 ; do
   echo "Testing ${f}"
-  ${builddir}/../ncgen/ncgen -$K -o ./results/${f}.nc ${srcdir}/${f}.cdl
-  ./ncdump ./results/${f}.nc > ./results/${f}.cdl
-  ./ncdump -Xm ./results/${f}.nc > ./results/${f}.cdx
+  ${NCGEN} -$K -o ./results/${f}.nc ${srcdir}/${f}.cdl
+  ${NCDUMP} ./results/${f}.nc > ./results/${f}.cdl
+  ${NCDUMP} -Xm ./results/${f}.nc > ./results/${f}.cdx
   diff -w ./results/${f}.cdl ./results/${f}.cdx &> ./results/${f}.diff
   if test -s ./results/${f}.diff ; then
     echo "***FAIL: $f"
diff --git a/ncdump/tst_inmemory_nc4.sh b/ncdump/tst_inmemory_nc4.sh
index 5e46761..2bab172 100755
--- a/ncdump/tst_inmemory_nc4.sh
+++ b/ncdump/tst_inmemory_nc4.sh
@@ -1,18 +1,10 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
-verbose=1
-set -e
-if test "x$builddir" = "x"; then builddir=`pwd`; fi
-if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
 
-# Make buildir absolute
-cd $builddir
-builddir=`pwd`
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
-# Make srcdir be absolute
-cd $srcdir
-srcdir=`pwd`
-cd $builddir
+verbose=1
+set -e
 
 # Setup
 PASS=1
@@ -29,9 +21,9 @@ dotest() {
 K=$1
 for f in $2 ; do
   echo "Testing ${f}"
-  ${builddir}/../ncgen/ncgen -$K -o ./results/${f}.nc ${srcdir}/${f}.cdl
-  ./ncdump ./results/${f}.nc > ./results/${f}.cdl
-  ./ncdump -Xm ./results/${f}.nc > ./results/${f}.cdx
+  ${NCGEN} -$K -o ./results/${f}.nc ${srcdir}/${f}.cdl
+  ${NCDUMP} ./results/${f}.nc > ./results/${f}.cdl
+  ${NCDUMP} -Xm ./results/${f}.nc > ./results/${f}.cdx
   diff -w ./results/${f}.cdl ./results/${f}.cdx &> ./results/${f}.diff
   if test -s ./results/${f}.diff ; then
     echo "***FAIL: $f"
@@ -43,8 +35,8 @@ done
 dotest "3" "$CLASSIC"
 dotest "5" "$EXTENDED5"
 
-if test -f ${builddir}/../config.h ; then
-  if fgrep -e '#define USE_NETCDF4 1' ${builddir}/../config.h >/dev/null ; then
+if test -f ${top_builddir}/config.h ; then
+  if fgrep -e '#define USE_NETCDF4 1' ${top_builddir}/config.h >/dev/null ; then
     dotest "4" "$EXTENDED4"
   fi
 fi
diff --git a/ncdump/tst_inttags.sh b/ncdump/tst_inttags.sh
index e8d53bc..189e656 100755
--- a/ncdump/tst_inttags.sh
+++ b/ncdump/tst_inttags.sh
@@ -1,17 +1,16 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
 set -e
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
 
 echo "*** Test integer constant suffixes"
 echo "*** creating inttags.nc from inttags.cdl..."
-../ncgen/ncgen -lb -o inttags.nc $srcdir/inttags.cdl
+${NCGEN} -lb -o inttags.nc $srcdir/inttags.cdl
 echo "*** creating tst_inttags.cdl from inttags.nc..."
-./ncdump inttags.nc > tst_inttags.cdl
+${NCDUMP} inttags.nc > tst_inttags.cdl
 echo "*** comparing tst_inttags.cdl to ref_inttags.nc..."
 diff -b -w tst_inttags.cdl $srcdir/ref_inttags.cdl
 
diff --git a/ncdump/tst_inttags4.sh b/ncdump/tst_inttags4.sh
index 8fa40e7..f62363c 100755
--- a/ncdump/tst_inttags4.sh
+++ b/ncdump/tst_inttags4.sh
@@ -1,18 +1,16 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
 
-set -e
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
+set -e
 
 echo "*** Test netcdf-4 integer constant suffixes"
 
 echo "*** creating inttags4.nc from inttags4.cdl..."
-../ncgen/ncgen -lb -o inttags4.nc $srcdir/inttags4.cdl
+${NCGEN} -lb -o inttags4.nc $srcdir/inttags4.cdl
 echo "*** creating tst_inttags4.cdl from inttags4.nc..."
-./ncdump inttags4.nc > tst_inttags4.cdl
+${NCDUMP} inttags4.nc > tst_inttags4.cdl
 echo "*** comparing tst_inttags4.cdl to ref_inttags4.nc..."
 diff -b -w tst_inttags4.cdl $srcdir/ref_inttags4.cdl
 
diff --git a/ncdump/tst_iter.sh b/ncdump/tst_iter.sh
index 3f9b165..7eb079a 100755
--- a/ncdump/tst_iter.sh
+++ b/ncdump/tst_iter.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script runs an ncdump bug test for netcdf
 # Test if the nciter code is working [NCF-154]
 
@@ -41,9 +44,9 @@ $CC ./iter.c -o iter.exe
 ./iter.exe >>iter.cdl
 
 # echo "*** create iter.nc "
-../ncgen/ncgen -k nc3 -o iter.nc ./iter.cdl
+${NCGEN} -k nc3 -o iter.nc ./iter.cdl
 echo "*** dumping iter.nc to iter.dmp"
-./ncdump iter.nc > iter.dmp
+${NCDUMP} iter.nc > iter.dmp
 echo "*** reformat iter.dmp"
 mv iter.dmp iter.tmp
 sed -e 's/\([0-9][,]\) /\1@/g' <iter.tmp |tr '@' '\n' |sed -e '/^$/d' >./iter.dmp
diff --git a/ncdump/tst_lengths.sh b/ncdump/tst_lengths.sh
index d61fa1f..4520413 100755
--- a/ncdump/tst_lengths.sh
+++ b/ncdump/tst_lengths.sh
@@ -1,20 +1,14 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
 # It is unreasonable to test actual lengths of files
 # (even netcdf-3 files).
 #However, the files created in this script are used in later ones
 
-../ncgen/ncgen -b ${srcdir}/small.cdl
-../ncgen/ncgen -b ${srcdir}/small2.cdl
-
-exit
-
-
+${NCGEN} -b ${srcdir}/small.cdl
+${NCGEN} -b ${srcdir}/small2.cdl
 
 # This shell script tests lengths of small netcdf files and tests 
 # that rewriting a numeric value doesn't change file length
@@ -50,81 +44,83 @@ exit
 # echo "netcdf small {variables: byte t; data: t = 1;}" > small.cdl
 set -e
 
-
 echo ""
 echo "*** testing length of classic file"
-../ncgen/ncgen -b ${srcdir}/small.cdl
+${NCGEN} -b ${srcdir}/small.cdl
 if test `wc -c < small.nc` != 68; then
     exit 1
 fi
 
 #echo "*** testing length of classic file written with NOFILL"
-#../ncgen/ncgen -b -x ${srcdir}/small.cdl
+#${NCGEN} -b -x ${srcdir}/small.cdl
 #if test `wc -c < small.nc` != 68; then
 #    exit 1
 #fi
 
 echo "*** testing length of rewritten classic file"
-../ncgen/ncgen -b ${srcdir}/small.cdl && ./rewrite-scalar small.nc t
+${NCGEN} -b ${srcdir}/small.cdl && ${execdir}/rewrite-scalar small.nc t
 #if test `wc -c < small.nc` != 68; then
 #    exit 1
 #fi
 
 echo "*** testing length of rewritten classic file written with NOFILL"
-../ncgen/ncgen -b -x ${srcdir}/small.cdl && ./rewrite-scalar small.nc t
+${NCGEN} -b -x ${srcdir}/small.cdl && ${execdir}/rewrite-scalar small.nc t
 #if test `wc -c < small.nc` != 68; then
 #    exit 1
 #fi
 
 echo "*** testing length of 64-bit offset file"
-../ncgen/ncgen -b -k64-bit-offset ${srcdir}/small.cdl
+${NCGEN} -b -k64-bit-offset ${srcdir}/small.cdl
 #if test `wc -c < small.nc` != 72; then
 #    exit 1
 #fi
 
 echo "*** testing length of 64-bit offset file written with NOFILL"
-../ncgen/ncgen -b -k64-bit-offset -x ${srcdir}/small.cdl
+${NCGEN} -b -k64-bit-offset -x ${srcdir}/small.cdl
 #if test `wc -c < small.nc` != 72; then
 #    exit 1
 #fi
 
 echo "*** testing length of rewritten 64-bit offset file"
-../ncgen/ncgen -b -k64-bit-offset ${srcdir}/small.cdl && ./rewrite-scalar small.nc t
+${NCGEN} -b -k64-bit-offset ${srcdir}/small.cdl && ${execdir}/rewrite-scalar small.nc t
 #if test `wc -c < small.nc` != 72; then
 #    exit 1
 #fi
 
 echo "*** testing length of rewritten 64-bit offset file written with NOFILL"
-../ncgen/ncgen -b -k64-bit-offset -x ${srcdir}/small.cdl && ./rewrite-scalar small.nc t
+${NCGEN} -b -k64-bit-offset -x ${srcdir}/small.cdl && ${execdir}/rewrite-scalar small.nc t
 #if test `wc -c < small.nc` != 72; then
 #    exit 1
 #fi
 
 echo "*** testing length of 64-bit data file"
-../ncgen/ncgen -b -k64-bit-data ${srcdir}/small.cdl
+${NCGEN} -b -k64-bit-data ${srcdir}/small.cdl
 if test `wc -c < small.nc` != 104; then
     exit 1
 fi
 
 echo "*** testing length of 64-bit data file"
-../ncgen/ncgen -b -5 ${srcdir}/small.cdl
+${NCGEN} -b -5 ${srcdir}/small.cdl
 if test `wc -c < small.nc` != 104; then
     exit 1
 fi
 echo "*** testing length of 64-bit data file written with NOFILL"
-../ncgen/ncgen -b -5 -x ${srcdir}/small.cdl
+${NCGEN} -b -5 -x ${srcdir}/small.cdl
 #if test `wc -c < small.nc` != 104; then
 #    exit 1
 #fi
 
 echo "*** testing length of rewritten 64-bit data file"
-../ncgen/ncgen -b -5 ${srcdir}/small.cdl && ./rewrite-scalar small.nc t
-if test `wc -c < small.nc` != 104; then
+${NCGEN} -b -5 ${srcdir}/small.cdl && ${execdir}/rewrite-scalar small.nc t
+# Watch out, it appears that the CDF-5 files are being rounded up to next page size
+# So, we need to truncate them wrt nul's in order to check size.
+# Bad hack, but what else can I do?
+if test `${execdir}/nctrunc <small.nc |wc -c` != 104; then
     exit 1
 fi
 
 echo "*** testing length of rewritten 64-bit data file written with NOFILL"
-../ncgen/ncgen -b -5 -x ${srcdir}/small.cdl && ./rewrite-scalar small.nc t
+${NCGEN} -b -5 -x ${srcdir}/small.cdl && ${execdir}/rewrite-scalar small.nc t
 #if test `wc -c < small.nc` != 104; then
 #    exit 1
 #fi
@@ -133,55 +129,55 @@ echo "*** testing length of rewritten 64-bit data file written with NOFILL"
 # test with only one record variable of type byte or short, which need
 # not be 4-byte aligned
 echo "*** testing length of one-record-variable classic file"
-../ncgen/ncgen -b ${srcdir}/small2.cdl
+${NCGEN} -b ${srcdir}/small2.cdl
 #if test `wc -c < small2.nc` != 101; then
 #    exit 1
 #fi
 
 echo "*** testing length of one-record-variable 64-bit data file"
-../ncgen/ncgen -b -5 ${srcdir}/small2.cdl
+${NCGEN} -b -5 ${srcdir}/small2.cdl
 if test `wc -c < small2.nc` != 161; then
     exit 1
 fi
 
 echo "*** testing length of one-record-variable 64-bit data file"
-../ncgen/ncgen -b -5 ${srcdir}/small2.cdl
+${NCGEN} -b -5 ${srcdir}/small2.cdl
 if test `wc -c < small2.nc` != 161; then
     exit 1
 fi
 
 echo "*** testing length of one-record-variable 64-bit data file written with NOFILL"
-../ncgen/ncgen -b -5 -x ${srcdir}/small2.cdl
+${NCGEN} -b -5 -x ${srcdir}/small2.cdl
 if test `wc -c < small2.nc` != 161; then
     exit 1
 fi
 
 echo "*** testing length of one-record-variable classic file written with NOFILL"
-../ncgen/ncgen -b -x ${srcdir}/small2.cdl
+${NCGEN} -b -x ${srcdir}/small2.cdl
 if test `wc -c < small2.nc` != 101; then
     exit 1
 fi
 
 echo "*** testing length of one-record-variable classic file written with NOFILL"
-../ncgen/ncgen -b -x ${srcdir}/small2.cdl
+${NCGEN} -b -x ${srcdir}/small2.cdl
 if test `wc -c < small2.nc` != 101; then
     exit 1
 fi
 
 echo "*** testing length of one-record-variable classic file written with NOFILL"
-../ncgen/ncgen -b -x ${srcdir}/small2.cdl
+${NCGEN} -b -x ${srcdir}/small2.cdl
 #if test `wc -c < small2.nc` != 101; then
 #    exit 1
 #fi
 
 echo "*** testing length of one-record-variable 64-bit offset file"
-../ncgen/ncgen -b -k64-bit-offset ${srcdir}/small2.cdl
+${NCGEN} -b -k64-bit-offset ${srcdir}/small2.cdl
 #if test `wc -c < small2.nc` != 105; then
 #    exit 1
 #fi
 
 echo "*** testing length of one-record-variable 64-bit offset file written with NOFILL"
-../ncgen/ncgen -b -k64-bit-offset -x ${srcdir}/small2.cdl
+${NCGEN} -b -k64-bit-offset -x ${srcdir}/small2.cdl
 #if test `wc -c < small2.nc` != 105; then
 #    exit 1
 #fi
diff --git a/ncdump/tst_mud.sh b/ncdump/tst_mud.sh
index 83bbaa0..89b3e88 100755
--- a/ncdump/tst_mud.sh
+++ b/ncdump/tst_mud.sh
@@ -1,37 +1,35 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script tests ncdump and ncgen on netCDF-4 variables with multiple 
 # unlimited dimensions.
-# $Id $
 
 set -e
 
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`; 
-fi
-# add hack for sunos
-export srcdir;
-
 echo ""
 echo "*** Testing ncdump output for multiple unlimited dimensions"
 echo "*** creating netcdf file tst_mud4.nc from ref_tst_mud4.cdl ..."
-../ncgen/ncgen -4 -b -o tst_mud4.nc $srcdir/ref_tst_mud4.cdl
+${NCGEN} -4 -b -o tst_mud4.nc $srcdir/ref_tst_mud4.cdl
 echo "*** creating tst_mud4.cdl from tst_mud4.nc ..."
-./ncdump tst_mud4.nc > tst_mud4.cdl
+${NCDUMP} tst_mud4.nc > tst_mud4.cdl
 # echo "*** comparing tst_mud4.cdl with ref_tst_mud4.cdl..."
 diff -b tst_mud4.cdl $srcdir/ref_tst_mud4.cdl
 # echo "*** comparing annotation from ncdump -bc tst_mud4.nc with expected output..."
-./ncdump -bc tst_mud4.nc > tst_mud4-bc.cdl
+${NCDUMP} -bc tst_mud4.nc > tst_mud4-bc.cdl
 diff -b tst_mud4-bc.cdl $srcdir/ref_tst_mud4-bc.cdl
 # Now test with char arrays instead of ints
 echo "*** creating netcdf file tst_mud4_chars.nc from ref_tst_mud4_chars.cdl ..."
-../ncgen/ncgen -4 -b -o tst_mud4_chars.nc $srcdir/ref_tst_mud4_chars.cdl
+${NCGEN} -4 -b -o tst_mud4_chars.nc $srcdir/ref_tst_mud4_chars.cdl
 echo "*** creating tst_mud4_chars.cdl from tst_mud4_chars.nc ..."
-./ncdump tst_mud4_chars.nc > tst_mud4_chars.cdl
+${NCDUMP} tst_mud4_chars.nc > tst_mud4_chars.cdl
 # echo "*** comparing tst_mud4_chars.cdl with ref_tst_mud4_chars.cdl..."
 diff -b tst_mud4_chars.cdl $srcdir/ref_tst_mud4_chars.cdl
+exit 0
+# unused
 # echo "*** comparing annotation from ncdump -bc tst_mud4_chars.nc with expected output..."
-# ./ncdump -bc tst_mud4_chars.nc > tst_mud4_chars-bc.cdl
+${NCDUMP} -bc tst_mud4_chars.nc > tst_mud4_chars-bc.cdl
 # diff -b tst_mud4_chars-bc.cdl $srcdir/ref_tst_mud4_chars-bc.cdl
 echo "*** All ncdump test output for multiple unlimited dimensions passed!"
 exit 0
diff --git a/ncdump/tst_nccopy3.sh b/ncdump/tst_nccopy3.sh
index 1482891..28e9a4e 100755
--- a/ncdump/tst_nccopy3.sh
+++ b/ncdump/tst_nccopy3.sh
@@ -1,12 +1,11 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # For a netCDF-3 build, test nccopy on netCDF files in this directory
 
 set -e
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`; 
-fi
-export srcdir
 echo ""
 
 TESTFILES='c0 c0tmp ctest0 ctest0_64 small small2 test0 test1
@@ -15,18 +14,18 @@ TESTFILES='c0 c0tmp ctest0 ctest0_64 small small2 test0 test1
 echo "*** Testing netCDF-3 features of nccopy on ncdump/*.nc files"
 for i in $TESTFILES ; do
     echo "*** Testing nccopy $i.nc copy_of_$i.nc ..."
-    ./nccopy $i.nc copy_of_$i.nc
-    ./ncdump -n copy_of_$i $i.nc > tmp.cdl
-    ./ncdump copy_of_$i.nc > copy_of_$i.cdl
+    ${NCCOPY} $i.nc copy_of_$i.nc
+    ${NCDUMP} -n copy_of_$i $i.nc > tmp.cdl
+    ${NCDUMP} copy_of_$i.nc > copy_of_$i.cdl
     diff copy_of_$i.cdl tmp.cdl
     rm copy_of_$i.nc copy_of_$i.cdl tmp.cdl
 done
 echo "*** Testing nccopy -u"
-../ncgen/ncgen -b $srcdir/tst_brecs.cdl
+${NCGEN} -b $srcdir/tst_brecs.cdl
 # convert record dimension to fixed-size dimension
-./nccopy -u tst_brecs.nc copy_of_tst_brecs.nc
-./ncdump -n copy_of_tst_brecs tst_brecs.nc | sed '/ = UNLIMITED ;/s/\(.*\) = UNLIMITED ; \/\/ (\(.*\) currently)/\1 = \2 ;/' > tmp.cdl
-./ncdump copy_of_tst_brecs.nc >  copy_of_tst_brecs.cdl
+$NCCOPY -u tst_brecs.nc copy_of_tst_brecs.nc
+${NCDUMP} -n copy_of_tst_brecs tst_brecs.nc | sed '/ = UNLIMITED ;/s/\(.*\) = UNLIMITED ; \/\/ (\(.*\) currently)/\1 = \2 ;/' > tmp.cdl
+${NCDUMP} copy_of_tst_brecs.nc >  copy_of_tst_brecs.cdl
 diff -b copy_of_tst_brecs.cdl tmp.cdl
 rm copy_of_tst_brecs.cdl tmp.cdl tst_brecs.nc copy_of_tst_brecs.nc
 
diff --git a/ncdump/tst_nccopy4.sh b/ncdump/tst_nccopy4.sh
index 6b738ff..79caeb1 100755
--- a/ncdump/tst_nccopy4.sh
+++ b/ncdump/tst_nccopy4.sh
@@ -1,12 +1,11 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # For a netCDF-4 build, test nccopy on netCDF files in this directory
 
 set -e
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`;
-fi
-export srcdir
 echo ""
 
 # These files are actually in $srcdir in distcheck builds, so they
@@ -20,9 +19,9 @@ TESTFILES='tst_comp tst_comp2 tst_enum_data tst_fillbug
 echo "*** Testing netCDF-4 features of nccopy on ncdump/*.nc files"
 for i in $TESTFILES ; do
     echo "*** Test nccopy $i.nc copy_of_$i.nc ..."
-    ./nccopy $i.nc copy_of_$i.nc
-    ./ncdump -n copy_of_$i $i.nc > tmp.cdl
-    ./ncdump copy_of_$i.nc > copy_of_$i.cdl
+    $NCCOPY $i.nc copy_of_$i.nc
+${NCDUMP} -n copy_of_$i $i.nc > tmp.cdl
+${NCDUMP} copy_of_$i.nc > copy_of_$i.cdl
 #    echo "*** compare " with copy_of_$i.cdl
     diff copy_of_$i.cdl tmp.cdl
     rm copy_of_$i.nc copy_of_$i.cdl tmp.cdl
@@ -30,28 +29,28 @@ done
 # echo "*** Testing compression of deflatable files ..."
 ./tst_compress
 echo "*** Test nccopy -d1 can compress a classic format file ..."
-./nccopy -d1 tst_inflated.nc tst_deflated.nc
+$NCCOPY -d1 tst_inflated.nc tst_deflated.nc
 if test `wc -c < tst_deflated.nc` -ge  `wc -c < tst_inflated.nc`; then
     exit 1
 fi
 echo "*** Test nccopy -d1 can compress a netCDF-4 format file ..."
-./nccopy -d1 tst_inflated4.nc tst_deflated.nc
+$NCCOPY -d1 tst_inflated4.nc tst_deflated.nc
 if test `wc -c < tst_deflated.nc` -ge  `wc -c < tst_inflated4.nc`; then
     exit 1
 fi
 echo "*** Test nccopy -d1 -s can compress a classic model netCDF-4 file even more ..."
-./nccopy -d1 -s tst_inflated.nc tmp.nc
+$NCCOPY -d1 -s tst_inflated.nc tmp.nc
 if test `wc -c < tmp.nc` -ge  `wc -c < tst_inflated.nc`; then
     exit 1
 fi
 echo "*** Test nccopy -d1 -s can compress a netCDF-4 file even more ..."
-./nccopy -d1 -s tst_inflated4.nc tmp.nc
+$NCCOPY -d1 -s tst_inflated4.nc tmp.nc
 if test `wc -c < tmp.nc` -ge  `wc -c < tst_inflated4.nc`; then
     exit 1
 fi
 echo "*** Test nccopy -d0 turns off compression, shuffling of compressed, shuffled file ..."
-./nccopy -d0 tst_inflated4.nc tmp.nc
-./ncdump -sh tmp.nc > tmp.cdl
+$NCCOPY -d0 tst_inflated4.nc tmp.nc
+${NCDUMP} -sh tmp.nc > tmp.cdl
 if fgrep '_DeflateLevel' < tmp.cdl ; then
     exit 1
 fi
@@ -63,30 +62,30 @@ rm tst_deflated.nc tst_inflated.nc tst_inflated4.nc tmp.nc tmp.cdl
 echo "*** Testing nccopy -d1 -s on ncdump/*.nc files"
 for i in $TESTFILES ; do
     echo "*** Test nccopy -d1 -s $i.nc copy_of_$i.nc ..."
-    ./nccopy -d1 -s $i.nc copy_of_$i.nc
-    ./ncdump -n copy_of_$i $i.nc > tmp.cdl
-    ./ncdump copy_of_$i.nc > copy_of_$i.cdl
+    $NCCOPY -d1 -s $i.nc copy_of_$i.nc
+${NCDUMP} -n copy_of_$i $i.nc > tmp.cdl
+${NCDUMP} copy_of_$i.nc > copy_of_$i.cdl
 #    echo "*** compare " with copy_of_$i.cdl
     diff copy_of_$i.cdl tmp.cdl
     rm copy_of_$i.nc copy_of_$i.cdl tmp.cdl
 done
 ./tst_chunking
 echo "*** Test that nccopy -c can chunk and unchunk files"
-./nccopy tst_chunking.nc tmp.nc
-./ncdump tmp.nc > tmp.cdl
-./nccopy -c dim0/,dim1/1,dim2/,dim3/1,dim4/,dim5/1,dim6/ tst_chunking.nc tmp-chunked.nc
-./ncdump -n tmp tmp-chunked.nc > tmp-chunked.cdl
+$NCCOPY tst_chunking.nc tmp.nc
+${NCDUMP} tmp.nc > tmp.cdl
+$NCCOPY -c dim0/,dim1/1,dim2/,dim3/1,dim4/,dim5/1,dim6/ tst_chunking.nc tmp-chunked.nc
+${NCDUMP} -n tmp tmp-chunked.nc > tmp-chunked.cdl
 diff tmp.cdl tmp-chunked.cdl
-./nccopy -c dim0/,dim1/,dim2/,dim3/,dim4/,dim5/,dim6/ tmp-chunked.nc tmp-unchunked.nc
-./ncdump -n tmp tmp-unchunked.nc > tmp-unchunked.cdl
+$NCCOPY -c dim0/,dim1/,dim2/,dim3/,dim4/,dim5/,dim6/ tmp-chunked.nc tmp-unchunked.nc
+${NCDUMP} -n tmp tmp-unchunked.nc > tmp-unchunked.cdl
 diff tmp.cdl tmp-unchunked.cdl
-./nccopy -c / tmp-chunked.nc tmp-unchunked.nc
-./ncdump -n tmp tmp-unchunked.nc > tmp-unchunked.cdl
+$NCCOPY -c / tmp-chunked.nc tmp-unchunked.nc
+${NCDUMP} -n tmp tmp-unchunked.nc > tmp-unchunked.cdl
 diff tmp.cdl tmp-unchunked.cdl
 echo "*** Test that nccopy -c works as intended for record dimension default (1)"
-../ncgen/ncgen -b -o tst_bug321.nc $srcdir/tst_bug321.cdl
-./nccopy -k nc7 -c"lat/2,lon/2" tst_bug321.nc tmp.nc
-./ncdump -n tst_bug321 tmp.nc > tmp.cdl
+${NCGEN} -b -o tst_bug321.nc $srcdir/tst_bug321.cdl
+$NCCOPY -k nc7 -c"lat/2,lon/2" tst_bug321.nc tmp.nc
+${NCDUMP} -n tst_bug321 tmp.nc > tmp.cdl
 diff $srcdir/tst_bug321.cdl tmp.cdl
 # echo "*** Test that nccopy compression with chunking can improve compression"
 rm tst_chunking.nc tmp.nc tmp.cdl tmp-chunked.nc tmp-chunked.cdl tmp-unchunked.nc tmp-unchunked.cdl
diff --git a/ncdump/tst_ncgen4.sh b/ncdump/tst_ncgen4.sh
index 39d74f4..90fc9d4 100755
--- a/ncdump/tst_ncgen4.sh
+++ b/ncdump/tst_ncgen4.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 verbose=1
 set -e
 
@@ -12,21 +15,8 @@ set -e
 # 4. Add the new files into cdl4/Makefile.am
 #    and expected4/Makefile.am 
 
-if test "x$builddir" = "x"; then builddir=`pwd`; fi
-if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
-
-# Make buildir absolute
-cd $builddir
-builddir=`pwd`
-
-# Make srcdir be absolute
-cd $srcdir
-srcdir=`pwd`
-cd $builddir
 
 export verbose
-export srcdir
-export builddir
 
 KFLAG=1 ; export KFLAG
 echo "*** Performing diff tests: k=1"
diff --git a/ncdump/tst_ncgen4_classic.sh b/ncdump/tst_ncgen4_classic.sh
index e483f19..f704306 100755
--- a/ncdump/tst_ncgen4_classic.sh
+++ b/ncdump/tst_ncgen4_classic.sh
@@ -1,25 +1,13 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
 set -e
 echo ""
 verbose=0
 
-if test "x$builddir" = "x"; then builddir=`pwd`; fi
-if test "x$srcdir" = "x"; then srcdir=`dirname $0`; fi
-
-# Make buildir absolute
-cd $builddir
-builddir=`pwd`
-
-# Make srcdir be absolute
-cd $srcdir
-srcdir=`pwd`
-cd $builddir
-
 export verbose
-export srcdir
-export builddir
 
 KFLAG=1 ; export KFLAG
 sh  ${srcdir}/tst_ncgen4_diff.sh
diff --git a/ncdump/tst_ncgen4_cycle.sh b/ncdump/tst_ncgen4_cycle.sh
index c97d9a3..879eaa2 100755
--- a/ncdump/tst_ncgen4_cycle.sh
+++ b/ncdump/tst_ncgen4_cycle.sh
@@ -1,5 +1,7 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
 . ${srcdir}/tst_ncgen_shared.sh
 
@@ -34,14 +36,14 @@ for x in ${TESTSET} ; do
   else
     rm -f ${x}.nc ${x}.dmp
     # step 1: use original cdl to build the .nc
-    ${builddir}/../ncgen/ncgen -b -k${KFLAG} -o ${x}.nc ${cdl}/${x}.cdl
+    ${NCGEN} -b -k${KFLAG} -o ${x}.nc ${cdl}/${x}.cdl
     # step 2: dump .nc file
-    ${builddir}/../ncdump/ncdump ${headflag} ${specflag} ${x}.nc > ${x}.dmp
+    ${NCDUMP} ${headflag} ${specflag} ${x}.nc > ${x}.dmp
     # step 3: use ncgen and the ncdump output to (re-)build the .nc
     rm -f ${x}.nc
-    ${builddir}/../ncgen/ncgen -b -k${KFLAG} -o ${x}.nc ${x}.dmp
+    ${NCGEN} -b -k${KFLAG} -o ${x}.nc ${x}.dmp
     # step 4: dump .nc file again
-    ${builddir}/../ncdump/ncdump ${headflag} ${specflag} ${x}.nc > ${x}.dmp2
+    ${NCDUMP} ${headflag} ${specflag} ${x}.nc > ${x}.dmp2
     # compare the two ncdump outputs
     if diff -b -w ${x}.dmp ${x}.dmp2 ; then ok=1; else ok=0; fi
     if test "x$ok" = "x1" ; then
diff --git a/ncdump/tst_ncgen4_diff.sh b/ncdump/tst_ncgen4_diff.sh
index 1a2c3f3..de5619f 100755
--- a/ncdump/tst_ncgen4_diff.sh
+++ b/ncdump/tst_ncgen4_diff.sh
@@ -1,11 +1,8 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
 
-if test "x$srcdir" = "x"; then srcdir=`pwd`; fi
-if test "x$builddir" = "x"; then builddir=`pwd`; fi
-#for sunos
-export srcdir;
-export builddir;
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 
 . ${srcdir}/tst_ncgen_shared.sh
 
@@ -38,10 +35,10 @@ for x in ${TESTSET} ; do
 	if test "x${t}" = "x${x}" ; then isxfail=1; fi
 	done
   rm -f ${x}.nc ${x}.dmp
-  ${builddir}/../ncgen/ncgen -b -k${KFLAG} -o ${x}.nc ${cdl}/${x}.cdl
+  ${NCGEN} -b -k${KFLAG} -o ${x}.nc ${cdl}/${x}.cdl
   # dump .nc file
   # if windows, we need to remove any leading 0's in exponents.
-  ${builddir}/../ncdump/ncdump ${headflag} ${specflag} ${x}.nc | sed 's/e+0/e+/g' > ${x}.dmp
+  ${NCDUMP} ${headflag} ${specflag} ${x}.nc | sed 's/e+0/e+/g' > ${x}.dmp
   # compare the expected (silently if XFAIL)
   if test "x$isxfail" = "x1" -a "x$SHOWXFAILS" = "x" ; then
     if diff -b -bw ${expected}/${x}.dmp ${x}.dmp >/dev/null 2>&1; then ok=1; else ok=0; fi
diff --git a/ncdump/tst_ncgen_shared.sh b/ncdump/tst_ncgen_shared.sh
index e4780a1..82c9bdb 100755
--- a/ncdump/tst_ncgen_shared.sh
+++ b/ncdump/tst_ncgen_shared.sh
@@ -1,5 +1,7 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
 # To add a new test,
 # 1. put the .cdl file in the 'cdl' directory
diff --git a/ncdump/tst_netcdf4.sh b/ncdump/tst_netcdf4.sh
index 5c7dafe..6120de9 100755
--- a/ncdump/tst_netcdf4.sh
+++ b/ncdump/tst_netcdf4.sh
@@ -1,42 +1,37 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script tests ncdump for netcdf-4
-# $Id: tst_netcdf4.sh,v 1.34 2009/09/25 18:22:10 dmh Exp $
 
 set -e
 
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`; 
-fi
-# add hack for sunos
-export srcdir;
-
 echo ""
 echo "*** Testing ncgen and ncdump test output for netCDF-4 format."
 # echo "*** creating netcdf-4 file c0_4.nc from c0_4.cdl..."
-../ncgen/ncgen -k nc4 -b -o c0_4.nc $srcdir/../ncgen/c0_4.cdl
-
+${NCGEN} -k nc4 -b -o c0_4.nc ${ncgenc04}
 # echo "*** creating c1_4.cdl from c0_4.nc..."
-./ncdump -n c1 c0_4.nc | sed 's/e+0/e+/g' > c1_4.cdl
+${NCDUMP} -n c1 c0_4.nc | sed 's/e+0/e+/g' > c1_4.cdl
 # echo "*** comparing c1_4.cdl with ref_ctest1_nc4.cdl..."
 diff -b c1_4.cdl $srcdir/ref_ctest1_nc4.cdl
 
 echo "*** Testing ncgen and ncdump test output for netCDF-4 classic format."
 # echo "*** creating netcdf-4 classic file c0.nc from c0.cdl..."
-../ncgen/ncgen -k nc7 -b -o c0.nc $srcdir/../ncgen/c0.cdl
+${NCGEN} -k nc7 -b -o c0.nc ${ncgenc0}
 # echo "*** creating c1.cdl from c0.nc..."
 
 # echo "*** comparing c1.cdl with ref_ctest1_nc4c.cdl..."
 diff -b c1.cdl $srcdir/ref_ctest1_nc4c.cdl
 
 echo "*** Testing ncdump output for netCDF-4 features."
-./ncdump tst_solar_1.nc | sed 's/e+0/e+/g' > tst_solar_1.cdl
+${NCDUMP} tst_solar_1.nc | sed 's/e+0/e+/g' > tst_solar_1.cdl
 # echo "*** comparing tst_solar_1.cdl with ref_tst_solar_1.cdl..."
 diff -b tst_solar_1.cdl $srcdir/ref_tst_solar_1.cdl
-./ncdump tst_solar_2.nc | sed 's/e+0/e+/g' > tst_solar_2.cdl
+${NCDUMP} tst_solar_2.nc | sed 's/e+0/e+/g' > tst_solar_2.cdl
 # echo "*** comparing tst_solar_2.cdl with ref_tst_solar_2.cdl..."
 diff -b tst_solar_2.cdl $srcdir/ref_tst_solar_2.cdl
-./ncdump tst_group_data.nc | sed 's/e+0/e+/g' > tst_group_data.cdl
+${NCDUMP} tst_group_data.nc | sed 's/e+0/e+/g' > tst_group_data.cdl
 # echo "*** comparing tst_group_data.cdl with ref_tst_group_data.cdl..."
 diff -b tst_group_data.cdl $srcdir/ref_tst_group_data.cdl
 
@@ -47,42 +42,42 @@ diff -b tst_group_data.cdl $srcdir/ref_tst_group_data.cdl
 
 if [[ "$OSTYPE" != 'msys' ]]; then
 echo "*** Testing -v option with absolute name and groups..."
-./ncdump -v /g2/g3/var tst_group_data.nc | sed 's/e+0/e+/g' > tst_group_data.cdl
+${NCDUMP} -v /g2/g3/var tst_group_data.nc | sed 's/e+0/e+/g' > tst_group_data.cdl
 # echo "*** comparing tst_group_data.cdl with ref_tst_group_data_v23.cdl..."
 diff -b tst_group_data.cdl $srcdir/ref_tst_group_data_v23.cdl
 fi
 
 
 echo "*** Testing -v option with relative name and groups..."
-./ncdump -v var,var2 tst_group_data.nc | sed 's/e+0/e+/g' > tst_group_data.cdl
+${NCDUMP} -v var,var2 tst_group_data.nc | sed 's/e+0/e+/g' > tst_group_data.cdl
 # echo "*** comparing tst_group_data.cdl with ref_tst_group_data.cdl..."
 diff -b tst_group_data.cdl $srcdir/ref_tst_group_data.cdl
-./ncdump tst_enum_data.nc | sed 's/e+0/e+/g' > tst_enum_data.cdl
+${NCDUMP} tst_enum_data.nc | sed 's/e+0/e+/g' > tst_enum_data.cdl
 # echo "*** comparing tst_enum_data.cdl with ref_tst_enum_data.cdl..."
 diff -b tst_enum_data.cdl $srcdir/ref_tst_enum_data.cdl
-./ncdump tst_opaque_data.nc | sed 's/e+0/e+/g' > tst_opaque_data.cdl
+${NCDUMP} tst_opaque_data.nc | sed 's/e+0/e+/g' > tst_opaque_data.cdl
 # echo "*** comparing tst_opaque_data.cdl with ref_tst_opaque_data.cdl..."
 diff -b tst_opaque_data.cdl $srcdir/ref_tst_opaque_data.cdl
-./ncdump tst_vlen_data.nc | sed 's/e+0/e+/g' > tst_vlen_data.cdl
+${NCDUMP} tst_vlen_data.nc | sed 's/e+0/e+/g' > tst_vlen_data.cdl
 # echo "*** comparing tst_vlen_data.cdl with ref_tst_vlen_data.cdl..."
 diff -b tst_vlen_data.cdl $srcdir/ref_tst_vlen_data.cdl
-./ncdump tst_comp.nc | sed 's/e+0/e+/g' > tst_comp.cdl
+${NCDUMP} tst_comp.nc | sed 's/e+0/e+/g' > tst_comp.cdl
 # echo "*** comparing tst_comp.cdl with ref_tst_comp.cdl..."
 diff -b tst_comp.cdl $srcdir/ref_tst_comp.cdl
 # echo "*** creating tst_nans.cdl from tst_nans.nc"
-./ncdump tst_nans.nc | sed 's/e+0/e+/g' > tst_nans.cdl
+${NCDUMP} tst_nans.nc | sed 's/e+0/e+/g' > tst_nans.cdl
 # echo "*** comparing ncdump of generated file with ref_tst_nans.cdl ..."
 diff -b tst_nans.cdl $srcdir/ref_tst_nans.cdl
 # Do unicode test only if it exists => BUILD_UTF8 is true
 if test -f ./tst_unicode -o -f ./tst_unicode.exe ; then
   echo "*** dumping tst_unicode.nc to tst_unicode.cdl..."
   ./tst_unicode
-  ./ncdump tst_unicode.nc | sed 's/e+0/e+/g' > tst_unicode.cdl
+${NCDUMP} tst_unicode.nc | sed 's/e+0/e+/g' > tst_unicode.cdl
   #echo "*** comparing tst_unicode.cdl with ref_tst_unicode.cdl..."
   #diff -b tst_unicode.cdl $srcdir/ref_tst_unicode.cdl
 fi
-./tst_special_atts
-./ncdump -c -s tst_special_atts.nc \
+${execdir}/tst_special_atts
+${NCDUMP} -c -s tst_special_atts.nc \
     | sed 's/e+0/e+/g' \
     | sed -e 's/netcdflibversion=.*[|]/netcdflibversion=0.0.0|/' \
     | sed -e 's/hdf5libversion=.*"/hdf5libversion=0.0.0"/' \
diff --git a/ncdump/tst_netcdf4_4.sh b/ncdump/tst_netcdf4_4.sh
index 82cfad6..74e3856 100755
--- a/ncdump/tst_netcdf4_4.sh
+++ b/ncdump/tst_netcdf4_4.sh
@@ -1,13 +1,11 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
+
 # This shell script runs extra tests ncdump for netcdf-4
-# $Id: tst_netcdf4_4.sh,v 1.13 2009/05/06 14:51:52 ed Exp $
 
 set -e
-if test "x$srcdir" = "x"; then
-    srcdir=`dirname $0`; 
-fi
-export srcdir
 
 echo ""
 echo "*** Running extra netcdf-4 tests."
@@ -27,7 +25,7 @@ if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then # MINGW Platforms
 
     echo "*** dumping tst_string_data.nc to tst_string_data.cdl..."
 
-    ./ncdump tst_string_data.nc > tst_string_data.cdl
+    ${NCDUMP} tst_string_data.nc > tst_string_data.cdl
     TMPNAME=`head -n 1 tst_string_data.cdl | cut -d" " -f 2`
     NEWNAME=`basename $TMPNAME`
     sed "s,$TMPNAME,$NEWNAME,g" tst_string_data.cdl > tmp.cdl
@@ -36,7 +34,7 @@ if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then # MINGW Platforms
     diff -b tst_string_data.cdl $srcdir/ref_tst_string_data.cdl
 
     echo '*** testing reference file ref_tst_compounds2.nc...'
-    ./ncdump $srcdir/ref_tst_compounds2.nc > tst_compounds2.cdl
+    ${NCDUMP} $srcdir/ref_tst_compounds2.nc > tst_compounds2.cdl
     TMPNAME=`head -n 1 tst_compounds2.cdl | cut -d" " -f 2`
     NEWNAME=`basename $TMPNAME`
     sed "s,$TMPNAME,$NEWNAME,g" tst_compounds2.cdl > tmp.cdl
@@ -44,7 +42,7 @@ if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then # MINGW Platforms
     diff -b tst_compounds2.cdl $srcdir/ref_tst_compounds2.cdl
 
     echo '*** testing reference file ref_tst_compounds3.nc...'
-    ./ncdump $srcdir/ref_tst_compounds3.nc > tst_compounds3.cdl
+    ${NCDUMP} $srcdir/ref_tst_compounds3.nc > tst_compounds3.cdl
     TMPNAME=`head -n 1 tst_compounds3.cdl | cut -d" " -f 2`
     NEWNAME=`basename $TMPNAME`
     sed "s,$TMPNAME,$NEWNAME,g" tst_compounds3.cdl > tmp.cdl
@@ -52,7 +50,7 @@ if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then # MINGW Platforms
     diff -b tst_compounds3.cdl $srcdir/ref_tst_compounds3.cdl
 
     echo '*** testing reference file ref_tst_compounds4.nc...'
-    ./ncdump $srcdir/ref_tst_compounds4.nc > tst_compounds4.cdl
+    ${NCDUMP} $srcdir/ref_tst_compounds4.nc > tst_compounds4.cdl
     TMPNAME=`head -n 1 tst_compounds4.cdl | cut -d" " -f 2`
     NEWNAME=`basename $TMPNAME`
     sed "s,$TMPNAME,$NEWNAME,g" tst_compounds4.cdl > tmp.cdl
@@ -62,29 +60,29 @@ if [ `uname | cut -d "_" -f 1` = "MINGW32" ]; then # MINGW Platforms
 else # Non-MINGW Platforms
 
     echo "*** dumping tst_string_data.nc to tst_string_data.cdl..."
-    ./ncdump tst_string_data.nc > tst_string_data.cdl
+    ${NCDUMP} tst_string_data.nc > tst_string_data.cdl
     echo "*** comparing tst_string_data.cdl with ref_tst_string_data.cdl..."
     diff -b tst_string_data.cdl $srcdir/ref_tst_string_data.cdl
 
 #echo '*** testing non-coordinate variable of same name as dimension...'
-#../ncgen/ncgen -v4 -b -o tst_noncoord.nc $srcdir/ref_tst_noncoord.cdl
+#${NCGEN} -v4 -b -o tst_noncoord.nc $srcdir/ref_tst_noncoord.cdl
 
     echo '*** testing reference file ref_tst_compounds2.nc...'
-    ./ncdump $srcdir/ref_tst_compounds2.nc > tst_compounds2.cdl
+    ${NCDUMP} $srcdir/ref_tst_compounds2.nc > tst_compounds2.cdl
     diff -b tst_compounds2.cdl $srcdir/ref_tst_compounds2.cdl
 
     echo '*** testing reference file ref_tst_compounds3.nc...'
-    ./ncdump $srcdir/ref_tst_compounds3.nc > tst_compounds3.cdl
+    ${NCDUMP} $srcdir/ref_tst_compounds3.nc > tst_compounds3.cdl
     diff -b tst_compounds3.cdl $srcdir/ref_tst_compounds3.cdl
 
     echo '*** testing reference file ref_tst_compounds4.nc...'
-    ./ncdump $srcdir/ref_tst_compounds4.nc > tst_compounds4.cdl
+    ${NCDUMP} $srcdir/ref_tst_compounds4.nc > tst_compounds4.cdl
     diff -b tst_compounds4.cdl $srcdir/ref_tst_compounds4.cdl
 
     # Exercise Jira NCF-213 bug fix
 #    rm -f tst_ncf213.cdl tst_ncf213.nc
-    ../ncgen/ncgen -b -o tst_ncf213.nc $srcdir/ref_tst_ncf213.cdl
-    ./ncdump -s -h tst_ncf213.nc \
+    ${NCGEN} -b -o tst_ncf213.nc $srcdir/ref_tst_ncf213.cdl
+    ${NCDUMP} -s -h tst_ncf213.nc \
     | sed -e 's/netcdflibversion=.*[|]/netcdflibversion=0.0.0|/' \
     | sed -e 's/hdf5libversion=.*"/hdf5libversion=0.0.0"/' \
     | sed -e 's|_SuperblockVersion = [0-9]|_SuperblockVersion = 0|' \
diff --git a/ncdump/tst_opaque_data.c b/ncdump/tst_opaque_data.c
index c814e3b..564c100 100644
--- a/ncdump/tst_opaque_data.c
+++ b/ncdump/tst_opaque_data.c
@@ -7,7 +7,7 @@
    $Id: tst_opaque_data.c,v 1.7 2009/01/28 18:19:49 russ Exp $
 */
 
-#include <config.h>
+#include "config.h"
 #include <nc_tests.h>
 #include "err_macros.h"
 #include <netcdf.h>
diff --git a/ncdump/tst_output.sh b/ncdump/tst_output.sh
index 641d40e..053886e 100755
--- a/ncdump/tst_output.sh
+++ b/ncdump/tst_output.sh
@@ -1,65 +1,67 @@
 #!/bin/sh
-if test "x$SETX" = x1 ; then echo "file=$0"; set -x ; fi
-# This shell script tests the output from several previous tests.
 
-set -e
+export SETX=1
+set -x
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi 
+. ../test_common.sh
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
+# This shell script tests the output from several previous tests.
+set -e
 
 echo ""
 echo "*** Testing ncgen and ncdump test output for classic format."
 echo "*** creating ctest1.cdl from ctest0.nc..."
-./ncdump -n c1 ctest0.nc | sed 's/e+0/e+/g' > ctest1.cdl
+${NCDUMP} -n c1 ${builddir}/ctest0.nc | sed 's/e+0/e+/g' > ctest1.cdl
 echo "*** creating c0.nc from c0.cdl..."
-../ncgen/ncgen -b -o c0.nc $srcdir/../ncgen/c0.cdl
+${NCGEN} -b -o c0.nc ${ncgenc0}
 echo "*** creating c1.cdl from c0.nc..."
-./ncdump -n c1 c0.nc | sed 's/e+0/e+/g' > c1.cdl
+${NCDUMP} -n c1 ${builddir}/c0.nc | sed 's/e+0/e+/g' > c1.cdl
 echo "*** comparing ncdump of C program output (ctest1.cdl) with c1.cdl..."
 diff -b c1.cdl ctest1.cdl
 echo "*** test output for ncdump -k"
-test `./ncdump -k c0.nc` = "classic";
-../ncgen/ncgen -k `./ncdump -k c0.nc` -b -o c0tmp.nc $srcdir/../ncgen/c0.cdl
+KIND=`${NCDUMP} -k c0.nc`
+test "$KIND" = "classic";
+${NCGEN} -k $KIND -b -o c0tmp.nc ${ncgenc0}
 cmp c0tmp.nc c0.nc
 
 echo "*** test output for ncdump -x"
 echo "*** creating tst_ncml.nc from tst_ncml.cdl"
-../ncgen/ncgen -b -o tst_ncml.nc $srcdir/tst_ncml.cdl
+${NCGEN} -b -o tst_ncml.nc $srcdir/tst_ncml.cdl
 echo "*** creating c1.ncml from tst_ncml.nc"
-./ncdump -x tst_ncml.nc | sed 's/e-00/e-0/g' > c1.ncml
+${NCDUMP} -x tst_ncml.nc | sed 's/e-00/e-0/g' > c1.ncml
 echo "*** comparing ncdump -x of generated file with ref1.ncml ..."
 diff -b c1.ncml $srcdir/ref1.ncml
 
 echo "*** test output for ncdump -s"
 echo "*** creating tst_mslp.nc from tst_mslp.cdl"
-../ncgen/ncgen -b -o tst_mslp.nc $srcdir/tst_mslp.cdl
+${NCGEN} -b -o tst_mslp.nc $srcdir/tst_mslp.cdl
 echo "*** creating tst_format_att.cdl from tst_mslp.nc"
-./ncdump -s tst_mslp.nc > tst_format_att.cdl
+${NCDUMP} -s tst_mslp.nc > tst_format_att.cdl
 echo "*** comparing ncdump -s of generated file with ref_tst_format_att.cdl ..."
 diff -b tst_format_att.cdl $srcdir/ref_tst_format_att.cdl
 
 echo "*** All ncgen and ncdump test output for classic format passed!"
 
 echo "*** Testing ncgen and ncdump test output for 64-bit offset format."
-echo "*** creating ctest1.cdl from test0_64.nc..."
-./ncdump -n c1 ctest0_64.nc | sed 's/e+0/e+/g' > ctest1_64.cdl
+echo "*** creating ctest1_64.cdl from test0_64.nc..."
+${NCDUMP} -n c1 ctest0_64.nc | sed 's/e+0/e+/g' > ctest1_64.cdl
 echo "*** creating c0.nc from c0.cdl..."
-../ncgen/ncgen -k nc6 -b -o c0.nc $srcdir/../ncgen/c0.cdl
+${NCGEN} -k nc6 -b -o c0.nc ${ncgenc0}
 echo "*** creating c1.cdl from c0.nc..."
-./ncdump -n c1 c0.nc | sed 's/e+0/e+/g' > c1.cdl
+${NCDUMP} -n c1 c0.nc | sed 's/e+0/e+/g' > c1.cdl
 echo "*** comparing ncdump of C program output (ctest1_64.cdl) with c1.cdl..."
 diff -b c1.cdl ctest1_64.cdl
 echo "*** test output for ncdump -k"
-test "`./ncdump -k c0.nc`" = "64-bit offset";
-../ncgen/ncgen -k nc6 -b -o c0tmp.nc $srcdir/../ncgen/c0.cdl
+test "`${NCDUMP} -k c0.nc`" = "64-bit offset";
+${NCGEN} -k nc6 -b -o c0tmp.nc ${ncgenc0}
 cmp c0tmp.nc c0.nc
 
 echo "*** test output for ncdump -s"
 echo "*** creating tst_mslp_64.nc from tst_mslp.cdl"
-../ncgen/ncgen -k nc6 -b -o tst_mslp_64.nc $srcdir/tst_mslp.cdl
+${NCGEN} -k nc6 -b -o tst_mslp_64.nc ${srcdir}/tst_mslp.cdl
 echo "*** creating tst_format_att_64.cdl from tst_mslp_64.nc"
-./ncdump -s tst_mslp_64.nc | sed 's/e+0/e+/g' > tst_format_att_64.cdl
+${NCDUMP} -s tst_mslp_64.nc | sed 's/e+0/e+/g' > tst_format_att_64.cdl
 echo "*** comparing ncdump -s of generated file with ref_tst_format_att_64.cdl ..."
 diff -b tst_format_att_64.cdl $srcdir/ref_tst_format_att_64.cdl
 
diff --git a/ncdump/tst_utf8.c b/ncdump/tst_utf8.c
index 0d8c0d4..51db4e2 100644
--- a/ncdump/tst_utf8.c
+++ b/ncdump/tst_utf8.c
@@ -9,7 +9,7 @@
    $Id: tst_utf8.c,v 1.10 2008/10/20 01:48:07 ed Exp $
 */
 
-#include <config.h>
+#include "config.h"
 #include <stdlib.h>
 #include <nc_tests.h>
 #include <err_macros.h>
diff --git a/ncdump/utils.h b/ncdump/utils.h
index 9a25e47..6d06ed7 100644
--- a/ncdump/utils.h
+++ b/ncdump/utils.h
@@ -8,7 +8,9 @@
 
 #include "config.h"
 
+#ifndef STREQ
 #define	STREQ(a, b)	(*(a) == *(b) && strcmp((a), (b)) == 0)
+#endif
 
 /* Delimiter for separating netCDF groups in absolute pathnames, same as for HDF5 */
 #define NC_GRP_DELIM '/'
diff --git a/ncdump/vardata.c b/ncdump/vardata.c
index 41b17f0..b31a0ab 100644
--- a/ncdump/vardata.c
+++ b/ncdump/vardata.c
@@ -4,7 +4,7 @@
  *   $Header: /upc/share/CVS/netcdf-3/ncdump/vardata.c,v 1.48 2010/05/05 22:15:39 dmh Exp $
  *********************************************************************/
 
-#include <config.h>
+#include "config.h"
 #include <stdio.h>
 #include <ctype.h>
 #include <stdlib.h>
diff --git a/ncgen/CMakeLists.txt b/ncgen/CMakeLists.txt
index 1e15560..6feb4b9 100644
--- a/ncgen/CMakeLists.txt
+++ b/ncgen/CMakeLists.txt
@@ -1,4 +1,14 @@
-SET(ncgen_FILES generate.c main.c cdata.c bindata.c genchar.c cvt.c data.c debug.c escapes.c genc.c genbin.c generr.c genlib.c getfill.c odom.c offsets.c semantics.c ncgeny.c dump.c util.c bytebuffer.c list.c genf77.c f77data.c genj.c jdata.c nc_iter.c ConvertUTF.c ncgen.h )
+IF(BUILD_SHARED_LIBS AND WIN32)
+  remove_definitions(-DDLL_EXPORT)
+  remove_definitions(-DDLL_NETCDF)
+ENDIF()
+
+SET(ncgen_FILES generate.c main.c cdata.c bindata.c genchar.c cvt.c data.c debug.c escapes.c genc.c genbin.c generr.c genlib.c getfill.c odom.c semantics.c ncgeny.c dump.c util.c bytebuffer.c list.c genf77.c f77data.c genj.c jdata.c nc_iter.c ConvertUTF.c ncgen.h)
+
+# don't add the automatically determined parts of the RPATH
+# which point to directories outside the build tree to the install RPATH
+SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
+
 
 IF(USE_X_GETOPT)
   SET(ncgen_FILES ${ncgen_FILES} XGetopt.c)
@@ -32,10 +42,15 @@ FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
 IF(ENABLE_TESTS)
   FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cdl ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
   FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE)
-  add_sh_test(ncgen run_tests)
-  IF(USE_NETCDF4)
-    add_sh_test(ncgen run_nc4_tests)
-  ENDIF()
+
+  ##
+  # The following tests were moved to ncdump/, to ensure
+  # that they are run in the proper order.
+  ##
+  #add_sh_test(ncgen run_tests)
+  #IF(USE_NETCDF4)
+  #  add_sh_test(ncgen run_nc4_tests)
+  #ENDIF()
 ENDIF()
 
 SET(MAN_FILES ncgen.1)
@@ -70,5 +85,5 @@ ADD_CUSTOM_TARGET(makeparser DEPENDS ncgentab.h)
 
 ## Specify files to be distributed by 'make dist'
 FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
-SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} ncgen.y ncgenl.c ncgen.l internals.html c0.cdl c0_4.cdl ref_camrun.cdl ncf199.cdl CMakeLists.txt Makefile.am ncgen.1)
+SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} ncgen.y ncgenl.c ncgen.l internals.html c0.cdl c0_4.cdl ref_camrun.cdl ncf199.cdl tst_gattenum.cdl CMakeLists.txt Makefile.am ncgen.1)
 ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
diff --git a/ncgen/Makefile.am b/ncgen/Makefile.am
index c13f94e..f7a8a05 100644
--- a/ncgen/Makefile.am
+++ b/ncgen/Makefile.am
@@ -10,9 +10,9 @@ LDADD = ${top_builddir}/liblib/libnetcdf.la
 bin_PROGRAMS = ncgen
 
 ncgen_SOURCES=generate.c main.c cdata.c bindata.c genchar.c cvt.c data.c debug.c	\
-escapes.c genc.c genbin.c generr.c genlib.c getfill.c odom.c offsets.c	\
+escapes.c genc.c genbin.c generr.c genlib.c getfill.c odom.c	\
 semantics.c dump.c util.c bytebuffer.c list.c data.h		\
-debug.h generr.h genlib.h includes.h ncgen.h odom.h offsets.h dump.h	\
+debug.h generr.h genlib.h includes.h ncgen.h odom.h  dump.h	\
 util.h bytebuffer.h list.h genf77.c f77data.c genj.c jdata.c nc_iter.h	\
 nc_iter.c ConvertUTF.c ConvertUTF.h \
 ncgeny.c ncgeny.h
@@ -22,28 +22,36 @@ man_MANS = ncgen.1
 
 # These files all need to be distributed.
 EXTRA_DIST = ncgen.y ncgen.l ncgenl.c $(man_MANS) internals.html	\
-run_tests.sh run_nc4_tests.sh c0.cdl c0_4.cdl ref_camrun.cdl \
+c0.cdl c0_4.cdl ref_camrun.cdl \
 ncf199.cdl CMakeLists.txt XGetopt.c c5.cdl \
-compound_datasize_test.cdl compound_datasize_test2.cdl
+compound_datasize_test.cdl compound_datasize_test2.cdl \
+tst_gattenum.cdl tst_usuffix.cdl
 
 # This shell script causes ncgen to build a classic and a 64-bit
 # offset file from a cdl file shipped with the distribution.
 #if !BUILD_DLL
-TESTS = run_tests.sh
-if USE_NETCDF4
-TESTS += run_nc4_tests.sh
-endif # USE_NETCDF4
+##
+# Moved to ncdump as these tests rely on ncdump having been built.
+##
+#TESTS = run_tests.sh
+#if USE_NETCDF4
+#TESTS += run_nc4_tests.sh
+#endif # USE_NETCDF4
 #endif # !BUILD_DLL
 
 CLEANFILES = c0.nc c0_64.nc c0_4.nc c0_4c.nc ref_camrun.c \
 		ncf199.nc c5.nc compound_datasize_test.nc compound_datasize_test2.nc \
 		tst_compound_datasize_test.cdl tst_compound_datasize_test2.cdl tst_ncf199.cdl \
+		tst_tst_gattenum.cdl tst_gattenum.nc \
+		tst_tst_usuffix.cdl tst_usuffix.nc \
 		tst_c0.cdl tst_c0_4.cdl tst_c0_4c.cdl tst_c0_64.cdl
 
 # These rules are used if someone wants to rebuild ncgenl.c or ncgeny.c
 # Otherwise never invoked, but records how to do it.
 # BTW: note that renaming is essential because otherwise
 # autoconf will forcibly delete files of the name *.tab.*
+# Note also that this should be built under linux or cygwin
+# using bison version 3 or later.
 
 makeparser::
 	flex -Pncg -8 ncgen.l
diff --git a/ncgen/Makefile.in b/ncgen/Makefile.in
index 4e1b874..cea3c3d 100644
--- a/ncgen/Makefile.in
+++ b/ncgen/Makefile.in
@@ -105,7 +105,6 @@ target_triplet = @target@
 # This turns on declspec magic in netcdf.h for windows DLLs.
 @BUILD_DLL_TRUE at am__append_2 = -DDLL_NETCDF
 bin_PROGRAMS = ncgen$(EXEEXT)
- at USE_NETCDF4_TRUE@am__append_3 = run_nc4_tests.sh
 subdir = ncgen
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -126,11 +125,10 @@ am_ncgen_OBJECTS = generate.$(OBJEXT) main.$(OBJEXT) cdata.$(OBJEXT) \
 	data.$(OBJEXT) debug.$(OBJEXT) escapes.$(OBJEXT) \
 	genc.$(OBJEXT) genbin.$(OBJEXT) generr.$(OBJEXT) \
 	genlib.$(OBJEXT) getfill.$(OBJEXT) odom.$(OBJEXT) \
-	offsets.$(OBJEXT) semantics.$(OBJEXT) dump.$(OBJEXT) \
-	util.$(OBJEXT) bytebuffer.$(OBJEXT) list.$(OBJEXT) \
-	genf77.$(OBJEXT) f77data.$(OBJEXT) genj.$(OBJEXT) \
-	jdata.$(OBJEXT) nc_iter.$(OBJEXT) ConvertUTF.$(OBJEXT) \
-	ncgeny.$(OBJEXT)
+	semantics.$(OBJEXT) dump.$(OBJEXT) util.$(OBJEXT) \
+	bytebuffer.$(OBJEXT) list.$(OBJEXT) genf77.$(OBJEXT) \
+	f77data.$(OBJEXT) genj.$(OBJEXT) jdata.$(OBJEXT) \
+	nc_iter.$(OBJEXT) ConvertUTF.$(OBJEXT) ncgeny.$(OBJEXT)
 ncgen_OBJECTS = $(am_ncgen_OBJECTS)
 ncgen_LDADD = $(LDADD)
 ncgen_DEPENDENCIES = ${top_builddir}/liblib/libnetcdf.la
@@ -228,185 +226,8 @@ am__define_uniq_tagged_files = \
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
-am__tty_colors_dummy = \
-  mgn= red= grn= lgn= blu= brg= std=; \
-  am__color_tests=no
-am__tty_colors = { \
-  $(am__tty_colors_dummy); \
-  if test "X$(AM_COLOR_TESTS)" = Xno; then \
-    am__color_tests=no; \
-  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
-    am__color_tests=yes; \
-  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
-    am__color_tests=yes; \
-  fi; \
-  if test $$am__color_tests = yes; then \
-    red=''; \
-    grn=''; \
-    lgn=''; \
-    blu=''; \
-    mgn=''; \
-    brg=''; \
-    std=''; \
-  fi; \
-}
-am__recheck_rx = ^[ 	]*:recheck:[ 	]*
-am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
-am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
-# A command that, given a newline-separated list of test names on the
-# standard input, print the name of the tests that are to be re-run
-# upon "make recheck".
-am__list_recheck_tests = $(AWK) '{ \
-  recheck = 1; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-        { \
-          if ((getline line2 < ($$0 ".log")) < 0) \
-	    recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
-        { \
-          recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
-        { \
-          break; \
-        } \
-    }; \
-  if (recheck) \
-    print $$0; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# A command that, given a newline-separated list of test names on the
-# standard input, create the global log from their .trs and .log files.
-am__create_global_log = $(AWK) ' \
-function fatal(msg) \
-{ \
-  print "fatal: making $@: " msg | "cat >&2"; \
-  exit 1; \
-} \
-function rst_section(header) \
-{ \
-  print header; \
-  len = length(header); \
-  for (i = 1; i <= len; i = i + 1) \
-    printf "="; \
-  printf "\n\n"; \
-} \
-{ \
-  copy_in_global_log = 1; \
-  global_test_result = "RUN"; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-         fatal("failed to read from " $$0 ".trs"); \
-      if (line ~ /$(am__global_test_result_rx)/) \
-        { \
-          sub("$(am__global_test_result_rx)", "", line); \
-          sub("[ 	]*$$", "", line); \
-          global_test_result = line; \
-        } \
-      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
-        copy_in_global_log = 0; \
-    }; \
-  if (copy_in_global_log) \
-    { \
-      rst_section(global_test_result ": " $$0); \
-      while ((rc = (getline line < ($$0 ".log"))) != 0) \
-      { \
-        if (rc < 0) \
-          fatal("failed to read from " $$0 ".log"); \
-        print line; \
-      }; \
-      printf "\n"; \
-    }; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# Restructured Text title.
-am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# Default flags passed to test drivers.
-am__common_driver_flags = \
-  --color-tests "$$am__color_tests" \
-  --enable-hard-errors "$$am__enable_hard_errors" \
-  --expect-failure "$$am__expect_failure"
-# To be inserted before the command running the test.  Creates the
-# directory for the log if needed.  Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log.  Executes the
-# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
-# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
-# will run the test scripts (or their associated LOG_COMPILER, if
-# thy have one).
-am__check_pre = \
-$(am__sh_e_setup);					\
-$(am__vpath_adj_setup) $(am__vpath_adj)			\
-$(am__tty_colors);					\
-srcdir=$(srcdir); export srcdir;			\
-case "$@" in						\
-  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
-    *) am__odir=.;; 					\
-esac;							\
-test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
-  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
-if test -f "./$$f"; then dir=./;			\
-elif test -f "$$f"; then dir=;				\
-else dir="$(srcdir)/"; fi;				\
-tst=$$dir$$f; log='$@'; 				\
-if test -n '$(DISABLE_HARD_ERRORS)'; then		\
-  am__enable_hard_errors=no; 				\
-else							\
-  am__enable_hard_errors=yes; 				\
-fi; 							\
-case " $(XFAIL_TESTS) " in				\
-  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
-    am__expect_failure=yes;;				\
-  *)							\
-    am__expect_failure=no;;				\
-esac; 							\
-$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
-# A shell command to get the names of the tests scripts with any registered
-# extension removed (i.e., equivalently, the names of the test logs, with
-# the '.log' extension removed).  The result is saved in the shell variable
-# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
-# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
-# since that might cause problem with VPATH rewrites for suffix-less tests.
-# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
-am__set_TESTS_bases = \
-  bases='$(TEST_LOGS)'; \
-  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
-  bases=`echo $$bases`
-RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck
-TEST_SUITE_LOG = test-suite.log
-TEST_EXTENSIONS = @EXEEXT@ .test
-LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
-am__set_b = \
-  case '$@' in \
-    */*) \
-      case '$*' in \
-        */*) b='$*';; \
-          *) b=`echo '$@' | sed 's/\.log$$//'`; \
-       esac;; \
-    *) \
-      b='$*';; \
-  esac
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
-TEST_LOGS = $(am__test_logs2:.test.log=.log)
-TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
-	$(TEST_LOG_FLAGS)
 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
-	$(top_srcdir)/lib_flags.am $(top_srcdir)/test-driver
+	$(top_srcdir)/lib_flags.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ALLOCA = @ALLOCA@
@@ -449,6 +270,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -476,12 +298,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -516,6 +340,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -580,13 +405,14 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 LDADD = ${top_builddir}/liblib/libnetcdf.la
 ncgen_SOURCES = generate.c main.c cdata.c bindata.c genchar.c cvt.c data.c debug.c	\
-escapes.c genc.c genbin.c generr.c genlib.c getfill.c odom.c offsets.c	\
+escapes.c genc.c genbin.c generr.c genlib.c getfill.c odom.c	\
 semantics.c dump.c util.c bytebuffer.c list.c data.h		\
-debug.h generr.h genlib.h includes.h ncgen.h odom.h offsets.h dump.h	\
+debug.h generr.h genlib.h includes.h ncgen.h odom.h  dump.h	\
 util.h bytebuffer.h list.h genf77.c f77data.c genj.c jdata.c nc_iter.h	\
 nc_iter.c ConvertUTF.c ConvertUTF.h \
 ncgeny.c ncgeny.h
@@ -597,25 +423,32 @@ man_MANS = ncgen.1
 
 # These files all need to be distributed.
 EXTRA_DIST = ncgen.y ncgen.l ncgenl.c $(man_MANS) internals.html	\
-run_tests.sh run_nc4_tests.sh c0.cdl c0_4.cdl ref_camrun.cdl \
+c0.cdl c0_4.cdl ref_camrun.cdl \
 ncf199.cdl CMakeLists.txt XGetopt.c c5.cdl \
-compound_datasize_test.cdl compound_datasize_test2.cdl
+compound_datasize_test.cdl compound_datasize_test2.cdl \
+tst_gattenum.cdl tst_usuffix.cdl
 
 
 # This shell script causes ncgen to build a classic and a 64-bit
 # offset file from a cdl file shipped with the distribution.
 #if !BUILD_DLL
-TESTS = run_tests.sh $(am__append_3)
+# Moved to ncdump as these tests rely on ncdump having been built.
+#TESTS = run_tests.sh
+#if USE_NETCDF4
+#TESTS += run_nc4_tests.sh
+#endif # USE_NETCDF4
 #endif # !BUILD_DLL
 CLEANFILES = c0.nc c0_64.nc c0_4.nc c0_4c.nc ref_camrun.c \
 		ncf199.nc c5.nc compound_datasize_test.nc compound_datasize_test2.nc \
 		tst_compound_datasize_test.cdl tst_compound_datasize_test2.cdl tst_ncf199.cdl \
+		tst_tst_gattenum.cdl tst_gattenum.nc \
+		tst_tst_usuffix.cdl tst_usuffix.nc \
 		tst_c0.cdl tst_c0_4.cdl tst_c0_4c.cdl tst_c0_64.cdl
 
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
+.SUFFIXES: .c .lo .o .obj
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/lib_flags.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -731,7 +564,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nc_iter.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ncgeny.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/odom.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/offsets.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/semantics.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/util.Po at am__quote@
 
@@ -860,176 +692,6 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-# Recover from deleted '.trs' file; this should ensure that
-# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
-# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
-# to avoid problems with "make -n".
-.log.trs:
-	rm -f $< $@
-	$(MAKE) $(AM_MAKEFLAGS) $<
-
-# Leading 'am--fnord' is there to ensure the list of targets does not
-# expand to empty, as could happen e.g. with make check TESTS=''.
-am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
-am--force-recheck:
-	@:
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
-	@$(am__set_TESTS_bases); \
-	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
-	redo_bases=`for i in $$bases; do \
-	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
-	            done`; \
-	if test -n "$$redo_bases"; then \
-	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
-	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
-	  if $(am__make_dryrun); then :; else \
-	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
-	  fi; \
-	fi; \
-	if test -n "$$am__remaking_logs"; then \
-	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
-	       "recursion detected" >&2; \
-	elif test -n "$$redo_logs"; then \
-	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
-	fi; \
-	if $(am__make_dryrun); then :; else \
-	  st=0;  \
-	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
-	  for i in $$redo_bases; do \
-	    test -f $$i.trs && test -r $$i.trs \
-	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
-	    test -f $$i.log && test -r $$i.log \
-	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
-	  done; \
-	  test $$st -eq 0 || exit 1; \
-	fi
-	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
-	ws='[ 	]'; \
-	results=`for b in $$bases; do echo $$b.trs; done`; \
-	test -n "$$results" || results=/dev/null; \
-	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
-	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
-	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
-	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
-	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
-	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
-	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
-	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
-	  success=true; \
-	else \
-	  success=false; \
-	fi; \
-	br='==================='; br=$$br$$br$$br$$br; \
-	result_count () \
-	{ \
-	    if test x"$$1" = x"--maybe-color"; then \
-	      maybe_colorize=yes; \
-	    elif test x"$$1" = x"--no-color"; then \
-	      maybe_colorize=no; \
-	    else \
-	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
-	    fi; \
-	    shift; \
-	    desc=$$1 count=$$2; \
-	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
-	      color_start=$$3 color_end=$$std; \
-	    else \
-	      color_start= color_end=; \
-	    fi; \
-	    echo "$${color_start}# $$desc $$count$${color_end}"; \
-	}; \
-	create_testsuite_report () \
-	{ \
-	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
-	  result_count $$1 "PASS: " $$pass  "$$grn"; \
-	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
-	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
-	  result_count $$1 "FAIL: " $$fail  "$$red"; \
-	  result_count $$1 "XPASS:" $$xpass "$$red"; \
-	  result_count $$1 "ERROR:" $$error "$$mgn"; \
-	}; \
-	{								\
-	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
-	    $(am__rst_title);						\
-	  create_testsuite_report --no-color;				\
-	  echo;								\
-	  echo ".. contents:: :depth: 2";				\
-	  echo;								\
-	  for b in $$bases; do echo $$b; done				\
-	    | $(am__create_global_log);					\
-	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
-	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
-	if $$success; then						\
-	  col="$$grn";							\
-	 else								\
-	  col="$$red";							\
-	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
-	fi;								\
-	echo "$${col}$$br$${std}"; 					\
-	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
-	echo "$${col}$$br$${std}"; 					\
-	create_testsuite_report --maybe-color;				\
-	echo "$$col$$br$$std";						\
-	if $$success; then :; else					\
-	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
-	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
-	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
-	  fi;								\
-	  echo "$$col$$br$$std";					\
-	fi;								\
-	$$success || exit 1
-
-check-TESTS:
-	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
-	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
-	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-	@set +e; $(am__set_TESTS_bases); \
-	log_list=`for i in $$bases; do echo $$i.log; done`; \
-	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
-	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
-	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
-	exit $$?;
-recheck: all 
-	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-	@set +e; $(am__set_TESTS_bases); \
-	bases=`for i in $$bases; do echo $$i; done \
-	         | $(am__list_recheck_tests)` || exit 1; \
-	log_list=`for i in $$bases; do echo $$i.log; done`; \
-	log_list=`echo $$log_list`; \
-	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
-	        am__force_recheck=am--force-recheck \
-	        TEST_LOGS="$$log_list"; \
-	exit $$?
-run_tests.sh.log: run_tests.sh
-	@p='run_tests.sh'; \
-	b='run_tests.sh'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-run_nc4_tests.sh.log: run_nc4_tests.sh
-	@p='run_nc4_tests.sh'; \
-	b='run_nc4_tests.sh'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-.test.log:
-	@p='$<'; \
-	$(am__set_b); \
-	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
- at am__EXEEXT_TRUE@.test$(EXEEXT).log:
- at am__EXEEXT_TRUE@	@p='$<'; \
- at am__EXEEXT_TRUE@	$(am__set_b); \
- at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
- at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
- at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
- at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
-
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -1061,7 +723,6 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
 all-am: Makefile $(PROGRAMS) $(MANS)
 installdirs:
@@ -1088,9 +749,6 @@ install-strip:
 	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
 	fi
 mostlyclean-generic:
-	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
-	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
-	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
 
 clean-generic:
 	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
@@ -1174,9 +832,9 @@ uninstall-am: uninstall-binPROGRAMS uninstall-man
 
 uninstall-man: uninstall-man1
 
-.MAKE: check-am install-am install-strip
+.MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
 	clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
 	ctags ctags-am distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
@@ -1188,9 +846,8 @@ uninstall-man: uninstall-man1
 	install-strip installcheck installcheck-am installdirs \
 	maintainer-clean maintainer-clean-generic mostlyclean \
 	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am recheck tags tags-am uninstall \
-	uninstall-am uninstall-binPROGRAMS uninstall-man \
-	uninstall-man1
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-man uninstall-man1
 
 .PRECIOUS: Makefile
 
@@ -1199,6 +856,8 @@ uninstall-man: uninstall-man1
 # Otherwise never invoked, but records how to do it.
 # BTW: note that renaming is essential because otherwise
 # autoconf will forcibly delete files of the name *.tab.*
+# Note also that this should be built under linux or cygwin
+# using bison version 3 or later.
 
 makeparser::
 	flex -Pncg -8 ncgen.l
diff --git a/ncgen/cdfdata.c b/ncgen/cdfdata.c
index 6d023fd..45a8eb7 100644
--- a/ncgen/cdfdata.c
+++ b/ncgen/cdfdata.c
@@ -6,7 +6,7 @@
 /* $Header: /upc/share/CVS/netcdf-3/ncgen/cdfdata.c,v 1.4 2010/05/24 19:59:56 dmh Exp $ */
 
 #include "includes.h"
-#include "offsets.h"
+#include "ncoffsets.h"
 
 #ifdef ENABLE_BINARY
 
diff --git a/ncgen/ctests.sh b/ncgen/ctests.sh
index 652efa3..896d4fb 100755
--- a/ncgen/ctests.sh
+++ b/ncgen/ctests.sh
@@ -1,6 +1,5 @@
 #!/bin/sh
-#set -e
-#set -x
+
 echo "*** ctests.sh: testing ncgen4 -lc"
 
 INSTALL=/tmp/install
diff --git a/ncgen/cvt.c b/ncgen/cvt.c
index e7d1646..81113e4 100644
--- a/ncgen/cvt.c
+++ b/ncgen/cvt.c
@@ -18,7 +18,9 @@ convert1(NCConstant* src, NCConstant* dst)
     Constvalue tmp;
     unsigned char* bytes = NULL;
     size_t bytelen;
-
+#ifdef _MSC_VER
+    int byteval;
+#endif
     dst->lineno = src->lineno;
 
     /* Need to translate all possible sources to all possible sinks.*/
@@ -405,10 +407,17 @@ case CASE(NC_DOUBLE,NC_DOUBLE):
     break;
 
 /* Conversion of a string to e.g. an integer should be what?*/
+#ifdef _MSC_VER
+case CASE(NC_STRING,NC_BYTE):
+    sscanf(src->value.stringv.stringv,"%d",&byteval); tmp.int8v = (char)byteval; break;
+case CASE(NC_STRING,NC_UBYTE):
+    sscanf(src->value.stringv.stringv,"%d",&byteval); tmp.uint8v = (unsigned char)byteval; break;
+#else
 case CASE(NC_STRING,NC_BYTE):
     sscanf(src->value.stringv.stringv,"%hhd",&tmp.int8v); break;
 case CASE(NC_STRING,NC_UBYTE):
     sscanf(src->value.stringv.stringv,"%hhu",&tmp.uint8v); break;
+#endif
 case CASE(NC_STRING,NC_USHORT):
     sscanf(src->value.stringv.stringv,"%hu",&tmp.uint16v); break;
 case CASE(NC_STRING,NC_UINT):
diff --git a/ncgen/data.c b/ncgen/data.c
index 1788033..c564ab4 100644
--- a/ncgen/data.c
+++ b/ncgen/data.c
@@ -6,7 +6,7 @@
 /* $Header: /upc/share/CVS/netcdf-3/ncgen/data.c,v 1.7 2010/05/24 19:59:56 dmh Exp $ */
 
 #include        "includes.h"
-#include        "offsets.h"
+#include        "ncoffsets.h"
 #include        "dump.h"
 
 #define XVSNPRINTF vsnprintf
diff --git a/ncgen/ftests.sh b/ncgen/ftests.sh
index ba87743..7458b8e 100755
--- a/ncgen/ftests.sh
+++ b/ncgen/ftests.sh
@@ -1,6 +1,5 @@
 #!/bin/sh
-#set -e
-#set -x
+
 echo "*** ftests.sh: testing ncgen4 -lf77"
 
 INSTALL=/tmp/install
diff --git a/ncgen/generate.c b/ncgen/generate.c
index 5d684e9..9c2449e 100644
--- a/ncgen/generate.c
+++ b/ncgen/generate.c
@@ -6,7 +6,7 @@
 #include "includes.h"
 #include "nc_iter.h"
 #include "odom.h"
-#include "offsets.h"
+#include "ncoffsets.h"
 
 /**************************************************/
 /* Code for generating data lists*/
diff --git a/ncgen/genlib.c b/ncgen/genlib.c
index 990903c..98e845b 100644
--- a/ncgen/genlib.c
+++ b/ncgen/genlib.c
@@ -20,8 +20,8 @@ define_netcdf(void)
 
     /* Rule for specifying the dataset name:
 	1. use -o name
-	2. use input cdl file name
-	3. use the datasetname
+	2. use the datasetname from the .cdl file
+	3. use input cdl file name (with .cdl removed)
 	It would be better if there was some way
 	to specify the datasetname independently of the
 	file name, but oh well.
diff --git a/ncgen/internals.html b/ncgen/internals.html
old mode 100755
new mode 100644
diff --git a/ncgen/jdatajni.c b/ncgen/jdatajni.c
index 46db017..710a553 100644
--- a/ncgen/jdatajni.c
+++ b/ncgen/jdatajni.c
@@ -1,5 +1,5 @@
 #include "includes.h"
-#include "offsets.h"
+#include "ncoffsets.h"
 
 #ifdef ENABLE_JAVA
 
diff --git a/ncgen/jdatastd.c b/ncgen/jdatastd.c
index eecd338..341e00f 100644
--- a/ncgen/jdatastd.c
+++ b/ncgen/jdatastd.c
@@ -6,7 +6,7 @@
 /* $Header: /upc/share/CVS/netcdf-3/ncgen/jdatastd.c,v 1.2 2010/05/24 19:59:57 dmh Exp $ */
 
 #include "includes.h"
-#include "offsets.h"
+#include "ncoffsets.h"
 
 extern List* vlenconstants;  /* List<Constant*>;*/
 
diff --git a/ncgen/lfs-tests b/ncgen/lfs-tests
old mode 100755
new mode 100644
diff --git a/ncgen/main.c b/ncgen/main.c
index b295fc8..50cb65e 100644
--- a/ncgen/main.c
+++ b/ncgen/main.c
@@ -6,7 +6,8 @@
 /* $Header: /upc/share/CVS/netcdf-3/ncgen/main.c,v 1.33 2010/05/26 21:43:36 dmh Exp $ */
 
 #include "includes.h"
-#include "offsets.h"
+#include "ncoffsets.h"
+#include "ncwinpath.h"
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
 #endif
@@ -453,7 +454,7 @@ main(
     if (argc > 0 && strcmp(argv[0], "-") != 0) {
 	char bom[4];
 	size_t count;
-	if ((fp = fopen(argv[0], "r")) == NULL) {
+	if ((fp = NCfopen(argv[0], "r")) == NULL) {
 	    derror ("can't open file %s for reading: ", argv[0]);
 	    perror("");
 	    return(7);
@@ -580,7 +581,6 @@ END_OF_MAIN()
 void
 init_netcdf(void) /* initialize global counts, flags */
 {
-    compute_alignments();
     memset((void*)&nullconstant,0,sizeof(NCConstant));
     fillconstant = nullconstant;
     fillconstant.nctype = NC_FILLVALUE;
diff --git a/ncgen/ncgen.h b/ncgen/ncgen.h
index 386f8af..040b283 100644
--- a/ncgen/ncgen.h
+++ b/ncgen/ncgen.h
@@ -57,6 +57,7 @@
 #define NEGNC_INFINITEF (-NC_INFINITEF)
 #define NEGNC_INFINITE (-NC_INFINITEF)
 #endif
+
 /* nc_class is one of:
         NC_GRP NC_DIM NC_VAR NC_ATT NC_TYPE
 */
diff --git a/ncgen/ncgen.l b/ncgen/ncgen.l
index 3b40244..42ff6dc 100644
--- a/ncgen/ncgen.l
+++ b/ncgen/ncgen.l
@@ -261,7 +261,7 @@ yytext[MAXTRST-1] = '\0';
 
 compound|struct|structure {return lexdebug(COMPOUND);}
 enum				{return lexdebug(ENUM);}
-opaque				{return lexdebug(OPAQUE);}
+opaque				{return lexdebug(OPAQUE_);}
 
 float|real		{return lexdebug(FLOAT_K);}
 char			{return lexdebug(CHAR_K);}
@@ -839,7 +839,7 @@ collecttag(char* text, char** stagp)
     stag[MAXTAGLEN] = '\0';
     if(stag[0] == 'U' || stag[0] == 'u') {
 	hasU = 1;
-    memmove(stag,stag+1,MAXTAGLEN);
+        memmove(stag,stag+1,MAXTAGLEN);
 	staglen--;
     } else if(stag[staglen-1] == 'U' || stag[staglen-1] == 'u') {
 	hasU = 1;
@@ -847,7 +847,7 @@ collecttag(char* text, char** stagp)
 	stag[staglen] = '\0';
     }
     if(strlen(stag) == 0 && hasU) {
-	tag = NC_UINT64;
+	tag = NC_UINT;
     } else if(strlen(stag) == 1) {
 	switch (stag[0]) {
 	case 'B': case 'b': tag = (hasU ? NC_UBYTE : NC_BYTE); break;
diff --git a/ncgen/ncgen.y b/ncgen/ncgen.y
index ba72412..5ccaadd 100644
--- a/ncgen/ncgen.y
+++ b/ncgen/ncgen.y
@@ -13,7 +13,7 @@
 static char SccsId[] = "$Id: ncgen.y,v 1.42 2010/05/18 21:32:46 dmh Exp $";
 */
 #include        "includes.h"
-#include        "offsets.h"
+#include        "ncoffsets.h"
 #include        "ncgeny.h"
 #include        "ncgen.h"
 
@@ -27,7 +27,9 @@ static char SccsId[] = "$Id: ncgen.y,v 1.42 2010/05/18 21:32:46 dmh Exp $";
 #define YY_NO_INPUT 1
 
 /* True if string a equals string b*/
+#ifndef STREQ
 #define STREQ(a, b)     (*(a) == *(b) && strcmp((a), (b)) == 0)
+#endif
 #define VLENSIZE  (sizeof(nc_vlen_t))
 #define MAXFLOATDIM 4294967295.0
 
@@ -175,7 +177,7 @@ NCConstant       constant;
         TYPES
 	COMPOUND
         ENUM
-        OPAQUE
+        OPAQUE_ /* 'OPAQUE' apparently conflicts with HDF4 code */
         OPAQUESTRING    /* 0x<even number of hexdigits> */
         GROUP
 	PATH            /* / or (/IDENT)+(.IDENT)? */
@@ -340,7 +342,7 @@ enumid: ident '=' constint
         }
         ;
 
-opaquedecl: OPAQUE '(' INT_CONST ')' typename
+opaquedecl: OPAQUE_ '(' INT_CONST ')' typename
                 {
 		    vercheck(NC_OPAQUE);
                     addtogroup($5); /*sets prefix*/
diff --git a/ncgen/ncgenl.c b/ncgen/ncgenl.c
index a740978..55cd2ef 100644
--- a/ncgen/ncgenl.c
+++ b/ncgen/ncgenl.c
@@ -1,5 +1,5 @@
 
-#line 3 "ncgenl.c"
+#line 3 "lex.ncg.c"
 
 #define  YY_INT_ALIGNED short int
 
@@ -1320,7 +1320,7 @@ ID ([A-Za-z_]|{UTF8})([A-Z.@#\[\]a-z_0-9+-]|{UTF8})*
 /* Note: this definition of string will work for utf8 as well,
    although it is a very relaxed definition
 */
-#line 1324 "ncgenl.c"
+#line 1324 "lex.ncg.c"
 
 #define INITIAL 0
 #define ST_C_COMMENT 1
@@ -1506,7 +1506,7 @@ YY_DECL
     
 #line 217 "ncgen.l"
 
-#line 1510 "ncgenl.c"
+#line 1510 "lex.ncg.c"
 
 	if ( !(yy_init) )
 		{
@@ -1659,7 +1659,7 @@ YY_RULE_SETUP
 case 7:
 YY_RULE_SETUP
 #line 264 "ncgen.l"
-{return lexdebug(OPAQUE);}
+{return lexdebug(OPAQUE_);}
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
@@ -2119,7 +2119,7 @@ YY_RULE_SETUP
 #line 570 "ncgen.l"
 ECHO;
 	YY_BREAK
-#line 2123 "ncgenl.c"
+#line 2123 "lex.ncg.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(TEXT):
 	yyterminate();
@@ -3391,7 +3391,7 @@ collecttag(char* text, char** stagp)
     stag[MAXTAGLEN] = '\0';
     if(stag[0] == 'U' || stag[0] == 'u') {
 	hasU = 1;
-    memmove(stag,stag+1,MAXTAGLEN);
+        memmove(stag,stag+1,MAXTAGLEN);
 	staglen--;
     } else if(stag[staglen-1] == 'U' || stag[staglen-1] == 'u') {
 	hasU = 1;
@@ -3399,7 +3399,7 @@ collecttag(char* text, char** stagp)
 	stag[staglen] = '\0';
     }
     if(strlen(stag) == 0 && hasU) {
-	tag = NC_UINT64;
+	tag = NC_UINT;
     } else if(strlen(stag) == 1) {
 	switch (stag[0]) {
 	case 'B': case 'b': tag = (hasU ? NC_UBYTE : NC_BYTE); break;
diff --git a/ncgen/ncgeny.c b/ncgen/ncgeny.c
index 1d1378d..61ad4e3 100644
--- a/ncgen/ncgeny.c
+++ b/ncgen/ncgeny.c
@@ -106,7 +106,7 @@
      TYPES = 287,
      COMPOUND = 288,
      ENUM = 289,
-     OPAQUE = 290,
+     OPAQUE_ = 290,
      OPAQUESTRING = 291,
      GROUP = 292,
      PATH = 293,
@@ -160,7 +160,7 @@
 #define TYPES 287
 #define COMPOUND 288
 #define ENUM 289
-#define OPAQUE 290
+#define OPAQUE_ 290
 #define OPAQUESTRING 291
 #define GROUP 292
 #define PATH 293
@@ -190,7 +190,7 @@
 static char SccsId[] = "$Id: ncgen.y,v 1.42 2010/05/18 21:32:46 dmh Exp $";
 */
 #include        "includes.h"
-#include        "offsets.h"
+#include        "ncoffsets.h"
 #include        "ncgeny.h"
 #include        "ncgen.h"
 
@@ -204,7 +204,9 @@ static char SccsId[] = "$Id: ncgen.y,v 1.42 2010/05/18 21:32:46 dmh Exp $";
 #define YY_NO_INPUT 1
 
 /* True if string a equals string b*/
+#ifndef STREQ
 #define STREQ(a, b)     (*(a) == *(b) && strcmp((a), (b)) == 0)
+#endif
 #define VLENSIZE  (sizeof(nc_vlen_t))
 #define MAXFLOATDIM 4294967295.0
 
@@ -328,7 +330,7 @@ extern int lex_init(void);
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 136 "ncgen.y"
+#line 138 "ncgen.y"
 {
 Symbol* sym;
 unsigned long  size; /* allow for zero size to indicate e.g. UNLIMITED*/
@@ -338,7 +340,7 @@ Datalist*      datalist;
 NCConstant       constant;
 }
 /* Line 193 of yacc.c.  */
-#line 342 "ncgeny.c"
+#line 344 "ncgen.tab.c"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -351,7 +353,7 @@ NCConstant       constant;
 
 
 /* Line 216 of yacc.c.  */
-#line 355 "ncgeny.c"
+#line 357 "ncgen.tab.c"
 
 #ifdef short
 # undef short
@@ -696,22 +698,22 @@ static const yytype_int16 yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   216,   216,   222,   224,   231,   238,   238,   241,   250,
-     240,   255,   256,   257,   261,   261,   263,   273,   273,   276,
-     277,   278,   279,   282,   282,   285,   315,   317,   334,   343,
-     355,   369,   402,   403,   406,   420,   421,   422,   423,   424,
-     425,   426,   427,   428,   429,   430,   433,   434,   435,   438,
-     439,   442,   442,   444,   445,   449,   456,   466,   478,   479,
-     480,   483,   484,   487,   487,   489,   511,   515,   519,   546,
-     547,   550,   551,   555,   569,   573,   578,   607,   608,   612,
-     613,   618,   628,   648,   659,   670,   689,   696,   696,   699,
-     701,   703,   705,   707,   716,   727,   729,   731,   733,   735,
-     737,   739,   741,   743,   745,   750,   757,   766,   767,   768,
-     771,   772,   775,   779,   780,   784,   788,   789,   794,   795,
-     799,   800,   801,   802,   803,   804,   808,   812,   816,   818,
-     823,   824,   825,   826,   827,   828,   829,   830,   831,   832,
-     833,   834,   838,   839,   843,   845,   847,   849,   854,   858,
-     859,   865
+       0,   218,   218,   224,   226,   233,   240,   240,   243,   252,
+     242,   257,   258,   259,   263,   263,   265,   275,   275,   278,
+     279,   280,   281,   284,   284,   287,   317,   319,   336,   345,
+     357,   371,   404,   405,   408,   422,   423,   424,   425,   426,
+     427,   428,   429,   430,   431,   432,   435,   436,   437,   440,
+     441,   444,   444,   446,   447,   451,   458,   468,   480,   481,
+     482,   485,   486,   489,   489,   491,   513,   517,   521,   548,
+     549,   552,   553,   557,   571,   575,   580,   609,   610,   614,
+     615,   620,   630,   650,   661,   672,   691,   698,   698,   701,
+     703,   705,   707,   709,   718,   729,   731,   733,   735,   737,
+     739,   741,   743,   745,   747,   752,   759,   768,   769,   770,
+     773,   774,   777,   781,   782,   786,   790,   791,   796,   797,
+     801,   802,   803,   804,   805,   806,   810,   814,   818,   820,
+     825,   826,   827,   828,   829,   830,   831,   832,   833,   834,
+     835,   836,   840,   841,   845,   847,   849,   851,   856,   860,
+     861,   867
 };
 #endif
 
@@ -726,7 +728,7 @@ static const char *const yytname[] =
   "BYTE_CONST", "SHORT_CONST", "INT_CONST", "INT64_CONST", "UBYTE_CONST",
   "USHORT_CONST", "UINT_CONST", "UINT64_CONST", "FLOAT_CONST",
   "DOUBLE_CONST", "DIMENSIONS", "VARIABLES", "NETCDF", "DATA", "TYPES",
-  "COMPOUND", "ENUM", "OPAQUE", "OPAQUESTRING", "GROUP", "PATH",
+  "COMPOUND", "ENUM", "OPAQUE_", "OPAQUESTRING", "GROUP", "PATH",
   "FILLMARKER", "NIL", "_FILLVALUE", "_FORMAT", "_STORAGE", "_CHUNKSIZES",
   "_DEFLATELEVEL", "_SHUFFLE", "_ENDIANNESS", "_NOFILL", "_FLETCHER32",
   "_NCPROPS", "_ISNETCDF4", "_SUPERBLOCK", "DATASETID", "'{'", "'}'",
@@ -1827,17 +1829,17 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 219 "ncgen.y"
+#line 221 "ncgen.y"
     {if (error_count > 0) YYABORT;;}
     break;
 
   case 3:
-#line 222 "ncgen.y"
+#line 224 "ncgen.y"
     {createrootgroup(datasetname);;}
     break;
 
   case 8:
-#line 241 "ncgen.y"
+#line 243 "ncgen.y"
     {
 		Symbol* id = (yyvsp[(2) - (3)].sym);
                 markcdf4("Group specification");
@@ -1848,22 +1850,22 @@ yyreduce:
     break;
 
   case 9:
-#line 250 "ncgen.y"
+#line 252 "ncgen.y"
     {listpop(groupstack);;}
     break;
 
   case 12:
-#line 256 "ncgen.y"
+#line 258 "ncgen.y"
     {;}
     break;
 
   case 13:
-#line 258 "ncgen.y"
+#line 260 "ncgen.y"
     {markcdf4("Type specification");;}
     break;
 
   case 16:
-#line 264 "ncgen.y"
+#line 266 "ncgen.y"
     { /* Use when defining a type */
               (yyvsp[(1) - (1)].sym)->objectclass = NC_TYPE;
               if(dupobjectcheck(NC_TYPE,(yyvsp[(1) - (1)].sym)))
@@ -1874,17 +1876,17 @@ yyreduce:
     break;
 
   case 17:
-#line 273 "ncgen.y"
+#line 275 "ncgen.y"
     {;}
     break;
 
   case 18:
-#line 273 "ncgen.y"
+#line 275 "ncgen.y"
     {;}
     break;
 
   case 25:
-#line 287 "ncgen.y"
+#line 289 "ncgen.y"
     {
 		int i;
                 addtogroup((yyvsp[(3) - (6)].sym)); /* sets prefix*/
@@ -1914,12 +1916,12 @@ yyreduce:
     break;
 
   case 26:
-#line 316 "ncgen.y"
+#line 318 "ncgen.y"
     {(yyval.mark)=listlength(stack); listpush(stack,(void*)(yyvsp[(1) - (1)].sym));;}
     break;
 
   case 27:
-#line 318 "ncgen.y"
+#line 320 "ncgen.y"
     {
 		    int i;
 		    (yyval.mark)=(yyvsp[(1) - (3)].mark);
@@ -1937,7 +1939,7 @@ yyreduce:
     break;
 
   case 28:
-#line 335 "ncgen.y"
+#line 337 "ncgen.y"
     {
             (yyvsp[(1) - (3)].sym)->objectclass=NC_TYPE;
             (yyvsp[(1) - (3)].sym)->subclass=NC_ECONST;
@@ -1947,7 +1949,7 @@ yyreduce:
     break;
 
   case 29:
-#line 344 "ncgen.y"
+#line 346 "ncgen.y"
     {
 		    vercheck(NC_OPAQUE);
                     addtogroup((yyvsp[(5) - (5)].sym)); /*sets prefix*/
@@ -1960,7 +1962,7 @@ yyreduce:
     break;
 
   case 30:
-#line 356 "ncgen.y"
+#line 358 "ncgen.y"
     {
                     Symbol* basetype = (yyvsp[(1) - (5)].sym);
 		    vercheck(NC_VLEN);
@@ -1975,7 +1977,7 @@ yyreduce:
     break;
 
   case 31:
-#line 370 "ncgen.y"
+#line 372 "ncgen.y"
     {
 	    int i,j;
 	    vercheck(NC_COMPOUND);
@@ -2008,17 +2010,17 @@ yyreduce:
     break;
 
   case 32:
-#line 402 "ncgen.y"
+#line 404 "ncgen.y"
     {(yyval.mark)=(yyvsp[(1) - (2)].mark);;}
     break;
 
   case 33:
-#line 403 "ncgen.y"
+#line 405 "ncgen.y"
     {(yyval.mark)=(yyvsp[(1) - (3)].mark);;}
     break;
 
   case 34:
-#line 407 "ncgen.y"
+#line 409 "ncgen.y"
     {
 	    int i;
 	    (yyval.mark)=(yyvsp[(2) - (2)].mark);
@@ -2033,82 +2035,82 @@ yyreduce:
     break;
 
   case 35:
-#line 420 "ncgen.y"
+#line 422 "ncgen.y"
     { (yyval.sym) = primsymbols[NC_CHAR]; ;}
     break;
 
   case 36:
-#line 421 "ncgen.y"
+#line 423 "ncgen.y"
     { (yyval.sym) = primsymbols[NC_BYTE]; ;}
     break;
 
   case 37:
-#line 422 "ncgen.y"
+#line 424 "ncgen.y"
     { (yyval.sym) = primsymbols[NC_SHORT]; ;}
     break;
 
   case 38:
-#line 423 "ncgen.y"
+#line 425 "ncgen.y"
     { (yyval.sym) = primsymbols[NC_INT]; ;}
     break;
 
   case 39:
-#line 424 "ncgen.y"
+#line 426 "ncgen.y"
     { (yyval.sym) = primsymbols[NC_FLOAT]; ;}
     break;
 
   case 40:
-#line 425 "ncgen.y"
+#line 427 "ncgen.y"
     { (yyval.sym) = primsymbols[NC_DOUBLE]; ;}
     break;
 
   case 41:
-#line 426 "ncgen.y"
+#line 428 "ncgen.y"
     { vercheck(NC_UBYTE); (yyval.sym) = primsymbols[NC_UBYTE]; ;}
     break;
 
   case 42:
-#line 427 "ncgen.y"
+#line 429 "ncgen.y"
     { vercheck(NC_USHORT); (yyval.sym) = primsymbols[NC_USHORT]; ;}
     break;
 
   case 43:
-#line 428 "ncgen.y"
+#line 430 "ncgen.y"
     { vercheck(NC_UINT); (yyval.sym) = primsymbols[NC_UINT]; ;}
     break;
 
   case 44:
-#line 429 "ncgen.y"
+#line 431 "ncgen.y"
     { vercheck(NC_INT64); (yyval.sym) = primsymbols[NC_INT64]; ;}
     break;
 
   case 45:
-#line 430 "ncgen.y"
+#line 432 "ncgen.y"
     { vercheck(NC_UINT64); (yyval.sym) = primsymbols[NC_UINT64]; ;}
     break;
 
   case 47:
-#line 434 "ncgen.y"
+#line 436 "ncgen.y"
     {;}
     break;
 
   case 48:
-#line 435 "ncgen.y"
+#line 437 "ncgen.y"
     {;}
     break;
 
   case 51:
-#line 442 "ncgen.y"
+#line 444 "ncgen.y"
     {;}
     break;
 
   case 52:
-#line 442 "ncgen.y"
+#line 444 "ncgen.y"
     {;}
     break;
 
   case 55:
-#line 450 "ncgen.y"
+#line 452 "ncgen.y"
     {
 		(yyvsp[(1) - (3)].sym)->dim.declsize = (size_t)extractint((yyvsp[(3) - (3)].constant));
 #ifdef GENDEBUG1
@@ -2118,7 +2120,7 @@ fprintf(stderr,"dimension: %s = %llu\n",(yyvsp[(1) - (3)].sym)->name,(unsigned l
     break;
 
   case 56:
-#line 457 "ncgen.y"
+#line 459 "ncgen.y"
     {
 		        (yyvsp[(1) - (3)].sym)->dim.declsize = NC_UNLIMITED;
 		        (yyvsp[(1) - (3)].sym)->dim.isunlimited = 1;
@@ -2129,7 +2131,7 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 57:
-#line 467 "ncgen.y"
+#line 469 "ncgen.y"
     {
                      (yyvsp[(1) - (1)].sym)->objectclass=NC_DIM;
                      if(dupobjectcheck(NC_DIM,(yyvsp[(1) - (1)].sym)))
@@ -2142,27 +2144,27 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 59:
-#line 479 "ncgen.y"
+#line 481 "ncgen.y"
     {;}
     break;
 
   case 60:
-#line 480 "ncgen.y"
+#line 482 "ncgen.y"
     {;}
     break;
 
   case 63:
-#line 487 "ncgen.y"
+#line 489 "ncgen.y"
     {;}
     break;
 
   case 64:
-#line 487 "ncgen.y"
+#line 489 "ncgen.y"
     {;}
     break;
 
   case 65:
-#line 490 "ncgen.y"
+#line 492 "ncgen.y"
     {
 		    int i;
 		    stackbase=(yyvsp[(2) - (2)].mark);
@@ -2185,19 +2187,19 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 66:
-#line 512 "ncgen.y"
+#line 514 "ncgen.y"
     {(yyval.mark)=listlength(stack);
                  listpush(stack,(void*)(yyvsp[(1) - (1)].sym));
 		;}
     break;
 
   case 67:
-#line 516 "ncgen.y"
+#line 518 "ncgen.y"
     {(yyval.mark)=(yyvsp[(1) - (3)].mark); listpush(stack,(void*)(yyvsp[(3) - (3)].sym));;}
     break;
 
   case 68:
-#line 520 "ncgen.y"
+#line 522 "ncgen.y"
     {
 		    int i;
 		    Dimset dimset;
@@ -2225,27 +2227,27 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 69:
-#line 546 "ncgen.y"
+#line 548 "ncgen.y"
     {(yyval.mark)=listlength(stack);;}
     break;
 
   case 70:
-#line 547 "ncgen.y"
+#line 549 "ncgen.y"
     {(yyval.mark)=(yyvsp[(2) - (3)].mark);;}
     break;
 
   case 71:
-#line 550 "ncgen.y"
+#line 552 "ncgen.y"
     {(yyval.mark)=listlength(stack); listpush(stack,(void*)(yyvsp[(1) - (1)].sym));;}
     break;
 
   case 72:
-#line 552 "ncgen.y"
+#line 554 "ncgen.y"
     {(yyval.mark)=(yyvsp[(1) - (3)].mark); listpush(stack,(void*)(yyvsp[(3) - (3)].sym));;}
     break;
 
   case 73:
-#line 556 "ncgen.y"
+#line 558 "ncgen.y"
     {Symbol* dimsym = (yyvsp[(1) - (1)].sym);
 		dimsym->objectclass = NC_DIM;
 		/* Find the actual dimension*/
@@ -2259,19 +2261,19 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 74:
-#line 570 "ncgen.y"
+#line 572 "ncgen.y"
     {(yyval.mark)=listlength(stack);
              listpush(stack,(void*)(yyvsp[(1) - (1)].sym));
 	    ;}
     break;
 
   case 75:
-#line 574 "ncgen.y"
+#line 576 "ncgen.y"
     {(yyval.mark)=(yyvsp[(1) - (3)].mark); listpush(stack,(void*)(yyvsp[(3) - (3)].sym));;}
     break;
 
   case 76:
-#line 579 "ncgen.y"
+#line 581 "ncgen.y"
     {
 		int i;
 		Dimset dimset;
@@ -2301,27 +2303,27 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 77:
-#line 607 "ncgen.y"
+#line 609 "ncgen.y"
     {(yyval.mark)=listlength(stack);;}
     break;
 
   case 78:
-#line 608 "ncgen.y"
+#line 610 "ncgen.y"
     {(yyval.mark)=(yyvsp[(2) - (3)].mark);;}
     break;
 
   case 79:
-#line 612 "ncgen.y"
+#line 614 "ncgen.y"
     {(yyval.mark)=listlength(stack); listpush(stack,(void*)(yyvsp[(1) - (1)].sym));;}
     break;
 
   case 80:
-#line 614 "ncgen.y"
+#line 616 "ncgen.y"
     {(yyval.mark)=(yyvsp[(1) - (3)].mark); listpush(stack,(void*)(yyvsp[(3) - (3)].sym));;}
     break;
 
   case 81:
-#line 619 "ncgen.y"
+#line 621 "ncgen.y"
     {  /* Anonymous integer dimension.
 	         Can only occur in type definitions*/
 	     char anon[32];
@@ -2334,7 +2336,7 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 82:
-#line 629 "ncgen.y"
+#line 631 "ncgen.y"
     {  /* Anonymous integer dimension.
 	         Can only occur in type definitions*/
 	     char anon[32];
@@ -2351,7 +2353,7 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 83:
-#line 649 "ncgen.y"
+#line 651 "ncgen.y"
     {Symbol* vsym = (yyvsp[(1) - (1)].sym);
 		if(vsym->objectclass != NC_VAR) {
 		    derror("Undefined or forward referenced variable: %s",vsym->name);
@@ -2362,7 +2364,7 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 84:
-#line 660 "ncgen.y"
+#line 662 "ncgen.y"
     {Symbol* tsym = (yyvsp[(1) - (1)].sym);
 		if(tsym->objectclass != NC_TYPE) {
 		    derror("Undefined or forward referenced type: %s",tsym->name);
@@ -2373,7 +2375,7 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 85:
-#line 671 "ncgen.y"
+#line 673 "ncgen.y"
     {Symbol* tvsym = (yyvsp[(1) - (1)].sym); Symbol* sym;
 		/* disambiguate*/
 		tvsym->objectclass = NC_VAR;
@@ -2395,42 +2397,42 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 86:
-#line 689 "ncgen.y"
+#line 691 "ncgen.y"
     {(yyval.sym)=(yyvsp[(1) - (1)].sym);;}
     break;
 
   case 87:
-#line 696 "ncgen.y"
+#line 698 "ncgen.y"
     {;}
     break;
 
   case 88:
-#line 696 "ncgen.y"
+#line 698 "ncgen.y"
     {;}
     break;
 
   case 89:
-#line 700 "ncgen.y"
+#line 702 "ncgen.y"
     {(yyval.sym) = makespecial(_NCPROPS_FLAG,NULL,NULL,(void*)&(yyvsp[(4) - (4)].constant),ATTRGLOBAL);;}
     break;
 
   case 90:
-#line 702 "ncgen.y"
+#line 704 "ncgen.y"
     {(yyval.sym) = makespecial(_ISNETCDF4_FLAG,NULL,NULL,(void*)&(yyvsp[(4) - (4)].constant),ATTRGLOBAL);;}
     break;
 
   case 91:
-#line 704 "ncgen.y"
+#line 706 "ncgen.y"
     {(yyval.sym) = makespecial(_SUPERBLOCK_FLAG,NULL,NULL,(void*)&(yyvsp[(4) - (4)].constant),ATTRGLOBAL);;}
     break;
 
   case 92:
-#line 706 "ncgen.y"
+#line 708 "ncgen.y"
     { (yyval.sym)=makeattribute((yyvsp[(2) - (4)].sym),NULL,NULL,(yyvsp[(4) - (4)].datalist),ATTRGLOBAL);;}
     break;
 
   case 93:
-#line 708 "ncgen.y"
+#line 710 "ncgen.y"
     {Symbol* tsym = (yyvsp[(1) - (6)].sym); Symbol* vsym = (yyvsp[(2) - (6)].sym); Symbol* asym = (yyvsp[(4) - (6)].sym);
 		if(vsym->objectclass == NC_VAR) {
 		    (yyval.sym)=makeattribute(asym,vsym,tsym,(yyvsp[(6) - (6)].datalist),ATTRVAR);
@@ -2442,7 +2444,7 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 94:
-#line 717 "ncgen.y"
+#line 719 "ncgen.y"
     {Symbol* sym = (yyvsp[(1) - (5)].sym); Symbol* asym = (yyvsp[(3) - (5)].sym);
 		if(sym->objectclass == NC_VAR) {
 		    (yyval.sym)=makeattribute(asym,sym,NULL,(yyvsp[(5) - (5)].datalist),ATTRVAR);
@@ -2456,57 +2458,57 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 95:
-#line 728 "ncgen.y"
+#line 730 "ncgen.y"
     {(yyval.sym) = makespecial(_FILLVALUE_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)(yyvsp[(5) - (5)].datalist),0);;}
     break;
 
   case 96:
-#line 730 "ncgen.y"
+#line 732 "ncgen.y"
     {(yyval.sym) = makespecial(_FILLVALUE_FLAG,(yyvsp[(2) - (6)].sym),(yyvsp[(1) - (6)].sym),(void*)(yyvsp[(6) - (6)].datalist),0);;}
     break;
 
   case 97:
-#line 732 "ncgen.y"
+#line 734 "ncgen.y"
     {(yyval.sym) = makespecial(_STORAGE_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)&(yyvsp[(5) - (5)].constant),1);;}
     break;
 
   case 98:
-#line 734 "ncgen.y"
+#line 736 "ncgen.y"
     {(yyval.sym) = makespecial(_CHUNKSIZES_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)(yyvsp[(5) - (5)].datalist),0);;}
     break;
 
   case 99:
-#line 736 "ncgen.y"
+#line 738 "ncgen.y"
     {(yyval.sym) = makespecial(_FLETCHER32_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)&(yyvsp[(5) - (5)].constant),1);;}
     break;
 
   case 100:
-#line 738 "ncgen.y"
+#line 740 "ncgen.y"
     {(yyval.sym) = makespecial(_DEFLATE_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)&(yyvsp[(5) - (5)].constant),1);;}
     break;
 
   case 101:
-#line 740 "ncgen.y"
+#line 742 "ncgen.y"
     {(yyval.sym) = makespecial(_SHUFFLE_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)&(yyvsp[(5) - (5)].constant),1);;}
     break;
 
   case 102:
-#line 742 "ncgen.y"
+#line 744 "ncgen.y"
     {(yyval.sym) = makespecial(_ENDIAN_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)&(yyvsp[(5) - (5)].constant),1);;}
     break;
 
   case 103:
-#line 744 "ncgen.y"
+#line 746 "ncgen.y"
     {(yyval.sym) = makespecial(_NOFILL_FLAG,(yyvsp[(1) - (5)].sym),NULL,(void*)&(yyvsp[(5) - (5)].constant),1);;}
     break;
 
   case 104:
-#line 746 "ncgen.y"
+#line 748 "ncgen.y"
     {(yyval.sym) = makespecial(_FORMAT_FLAG,NULL,NULL,(void*)&(yyvsp[(4) - (4)].constant),1);;}
     break;
 
   case 105:
-#line 751 "ncgen.y"
+#line 753 "ncgen.y"
     {
 	        (yyval.sym)=(yyvsp[(1) - (1)].sym);
                 (yyvsp[(1) - (1)].sym)->ref.is_ref=1;
@@ -2516,7 +2518,7 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 106:
-#line 758 "ncgen.y"
+#line 760 "ncgen.y"
     {
 	        (yyval.sym)=(yyvsp[(1) - (1)].sym);
                 (yyvsp[(1) - (1)].sym)->ref.is_ref=1;
@@ -2526,213 +2528,213 @@ fprintf(stderr,"dimension: %s = UNLIMITED\n",(yyvsp[(1) - (3)].sym)->name);
     break;
 
   case 108:
-#line 767 "ncgen.y"
+#line 769 "ncgen.y"
     {;}
     break;
 
   case 109:
-#line 768 "ncgen.y"
+#line 770 "ncgen.y"
     {;}
     break;
 
   case 112:
-#line 776 "ncgen.y"
+#line 778 "ncgen.y"
     {(yyvsp[(1) - (3)].sym)->data = (yyvsp[(3) - (3)].datalist);;}
     break;
 
   case 113:
-#line 779 "ncgen.y"
+#line 781 "ncgen.y"
     {(yyval.datalist) = (yyvsp[(1) - (1)].datalist);;}
     break;
 
   case 114:
-#line 780 "ncgen.y"
+#line 782 "ncgen.y"
     {(yyval.datalist) = (yyvsp[(1) - (1)].datalist);;}
     break;
 
   case 115:
-#line 784 "ncgen.y"
+#line 786 "ncgen.y"
     {(yyval.datalist) = builddatalist(0);;}
     break;
 
   case 116:
-#line 788 "ncgen.y"
+#line 790 "ncgen.y"
     {(yyval.datalist) = builddatalist(0); datalistextend((yyval.datalist),&((yyvsp[(1) - (1)].constant)));;}
     break;
 
   case 117:
-#line 790 "ncgen.y"
+#line 792 "ncgen.y"
     {datalistextend((yyvsp[(1) - (3)].datalist),&((yyvsp[(3) - (3)].constant))); (yyval.datalist)=(yyvsp[(1) - (3)].datalist);;}
     break;
 
   case 118:
-#line 794 "ncgen.y"
+#line 796 "ncgen.y"
     {(yyval.constant)=(yyvsp[(1) - (1)].constant);;}
     break;
 
   case 119:
-#line 795 "ncgen.y"
+#line 797 "ncgen.y"
     {(yyval.constant)=builddatasublist((yyvsp[(2) - (3)].datalist));;}
     break;
 
   case 120:
-#line 799 "ncgen.y"
+#line 801 "ncgen.y"
     {(yyval.constant)=(yyvsp[(1) - (1)].constant);;}
     break;
 
   case 121:
-#line 800 "ncgen.y"
+#line 802 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_OPAQUE);;}
     break;
 
   case 122:
-#line 801 "ncgen.y"
+#line 803 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_FILLVALUE);;}
     break;
 
   case 123:
-#line 802 "ncgen.y"
+#line 804 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_NIL);;}
     break;
 
   case 124:
-#line 803 "ncgen.y"
+#line 805 "ncgen.y"
     {(yyval.constant)=(yyvsp[(1) - (1)].constant);;}
     break;
 
   case 126:
-#line 808 "ncgen.y"
+#line 810 "ncgen.y"
     {(yyval.constant) = makeenumconstref((yyvsp[(1) - (1)].sym));;}
     break;
 
   case 127:
-#line 812 "ncgen.y"
+#line 814 "ncgen.y"
     {(yyval.constant)=evaluate((yyvsp[(1) - (4)].sym),(yyvsp[(3) - (4)].datalist));;}
     break;
 
   case 128:
-#line 817 "ncgen.y"
+#line 819 "ncgen.y"
     {(yyval.datalist) = builddatalist(0); datalistextend((yyval.datalist),&((yyvsp[(1) - (1)].constant)));;}
     break;
 
   case 129:
-#line 819 "ncgen.y"
+#line 821 "ncgen.y"
     {datalistextend((yyvsp[(1) - (3)].datalist),&((yyvsp[(3) - (3)].constant))); (yyval.datalist)=(yyvsp[(1) - (3)].datalist);;}
     break;
 
   case 130:
-#line 823 "ncgen.y"
+#line 825 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_CHAR);;}
     break;
 
   case 131:
-#line 824 "ncgen.y"
+#line 826 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_BYTE);;}
     break;
 
   case 132:
-#line 825 "ncgen.y"
+#line 827 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_SHORT);;}
     break;
 
   case 133:
-#line 826 "ncgen.y"
+#line 828 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_INT);;}
     break;
 
   case 134:
-#line 827 "ncgen.y"
+#line 829 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_INT64);;}
     break;
 
   case 135:
-#line 828 "ncgen.y"
+#line 830 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_UBYTE);;}
     break;
 
   case 136:
-#line 829 "ncgen.y"
+#line 831 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_USHORT);;}
     break;
 
   case 137:
-#line 830 "ncgen.y"
+#line 832 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_UINT);;}
     break;
 
   case 138:
-#line 831 "ncgen.y"
+#line 833 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_UINT64);;}
     break;
 
   case 139:
-#line 832 "ncgen.y"
+#line 834 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_FLOAT);;}
     break;
 
   case 140:
-#line 833 "ncgen.y"
+#line 835 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_DOUBLE);;}
     break;
 
   case 141:
-#line 834 "ncgen.y"
+#line 836 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_STRING);;}
     break;
 
   case 142:
-#line 838 "ncgen.y"
+#line 840 "ncgen.y"
     {(yyval.datalist) = builddatalist(0); datalistextend((yyval.datalist),&((yyvsp[(1) - (1)].constant)));;}
     break;
 
   case 143:
-#line 839 "ncgen.y"
+#line 841 "ncgen.y"
     {(yyval.datalist)=(yyvsp[(1) - (3)].datalist); datalistextend((yyvsp[(1) - (3)].datalist),&((yyvsp[(3) - (3)].constant)));;}
     break;
 
   case 144:
-#line 844 "ncgen.y"
+#line 846 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_INT);;}
     break;
 
   case 145:
-#line 846 "ncgen.y"
+#line 848 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_UINT);;}
     break;
 
   case 146:
-#line 848 "ncgen.y"
+#line 850 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_INT64);;}
     break;
 
   case 147:
-#line 850 "ncgen.y"
+#line 852 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_UINT64);;}
     break;
 
   case 148:
-#line 854 "ncgen.y"
+#line 856 "ncgen.y"
     {(yyval.constant)=makeconstdata(NC_STRING);;}
     break;
 
   case 149:
-#line 858 "ncgen.y"
+#line 860 "ncgen.y"
     {(yyval.constant)=(yyvsp[(1) - (1)].constant);;}
     break;
 
   case 150:
-#line 859 "ncgen.y"
+#line 861 "ncgen.y"
     {(yyval.constant)=(yyvsp[(1) - (1)].constant);;}
     break;
 
   case 151:
-#line 865 "ncgen.y"
+#line 867 "ncgen.y"
     {(yyval.sym)=(yyvsp[(1) - (1)].sym);;}
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 2736 "ncgeny.c"
+#line 2738 "ncgen.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2946,7 +2948,7 @@ yyreturn:
 }
 
 
-#line 868 "ncgen.y"
+#line 870 "ncgen.y"
 
 
 #ifndef NO_STDARG
diff --git a/ncgen/ncgeny.h b/ncgen/ncgeny.h
index 6636503..cbd5b52 100644
--- a/ncgen/ncgeny.h
+++ b/ncgen/ncgeny.h
@@ -71,7 +71,7 @@
      TYPES = 287,
      COMPOUND = 288,
      ENUM = 289,
-     OPAQUE = 290,
+     OPAQUE_ = 290,
      OPAQUESTRING = 291,
      GROUP = 292,
      PATH = 293,
@@ -125,7 +125,7 @@
 #define TYPES 287
 #define COMPOUND 288
 #define ENUM 289
-#define OPAQUE 290
+#define OPAQUE_ 290
 #define OPAQUESTRING 291
 #define GROUP 292
 #define PATH 293
@@ -150,7 +150,7 @@
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 136 "ncgen.y"
+#line 138 "ncgen.y"
 {
 Symbol* sym;
 unsigned long  size; /* allow for zero size to indicate e.g. UNLIMITED*/
@@ -160,7 +160,7 @@ Datalist*      datalist;
 NCConstant       constant;
 }
 /* Line 1529 of yacc.c.  */
-#line 164 "ncgeny.h"
+#line 164 "ncgen.tab.h"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
diff --git a/ncgen/offsets.c b/ncgen/offsets.c
deleted file mode 100644
index bd8dee4..0000000
--- a/ncgen/offsets.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/*********************************************************************
- *   Copyright 1993, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Header: /upc/share/CVS/netcdf-3/ncgen/offsets.c,v 1.1 2009/09/25 18:22:40 dmh Exp $
- *********************************************************************/
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group.                                               *
- * Copyright by the Board of Trustees of the University of Illinois.         *
- * All rights reserved.                                                      *
- *                                                                           *
- * This file is part of HDF5.  The full HDF5 copyright notice, including     *
- * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
-This code is a variantion of the H5detect.c code from HDF5.
-Author: D. Heimbigner 10/7/2008
-*/
-
-#ifndef OFFSETTEST
-#include        "includes.h"
-#else
-#include        <stdlib.h>
-#include        <stdio.h>
-#include        <string.h>
-#include        <assert.h>
-#endif
-
-#ifdef OFFSETTEST
-
-static void* emalloc(size_t);
-
-typedef int nc_type;
-typedef struct nc_vlen_t {
-    size_t len;
-    void* p;
-} nc_vlen_t;
-
-#define	NC_NAT 	        0	/* NAT = 'Not A Type' (c.f. NaN) */
-#define	NC_BYTE         1	/* signed 1 byte integer */
-#define	NC_CHAR 	2	/* ISO/ASCII character */
-#define	NC_SHORT 	3	/* signed 2 byte integer */
-#define	NC_INT 	        4	/* signed 4 byte integer */
-#define	NC_FLOAT 	5	/* single precision floating point number */
-#define	NC_DOUBLE 	6	/* double precision floating point number */
-#define	NC_UBYTE 	7	/* unsigned 1 byte int */
-#define	NC_USHORT 	8	/* unsigned 2-byte int */
-#define	NC_UINT 	9	/* unsigned 4-byte int */
-#define	NC_INT64 	10	/* signed 8-byte int */
-#define	NC_UINT64 	11	/* unsigned 8-byte int */
-#define	NC_STRING 	12	/* string */
-#define	NC_STRING 	12	/* string */
-#define	NC_VLEN 	13	
-#define	NC_OPAQUE 	14	
-#define	NC_ENUM 	15	
-#define	NC_COMPOUND 	16	
-#endif
-
-#include        "offsets.h"
-
-
-/*
-The heart of this is the following macro,
-which computes the offset of a field x
-when preceded by a char field.
-The assumptions appear to be as follows:
-1. the offset produced in this situation indicates
-   the alignment for x relative in such a way that it
-   depends only on the types that precede it in the struct.
-2. the compiler does not reorder fields.
-3. arrays are tightly packed.
-4. nested structs are alignd according to their first member
-   (this actually follows from C language requirement that
-    a struct can legally be cast to an instance of its first member).
-Given the alignments for the various common primitive types,
-it is assumed that one can use them anywhere to construct
-the layout of a struct of such types.
-It seems to work for HDF5 for a wide variety of machines.
-Note that technically, this is compiler dependent, but in practice
-all compilers seem to mimic the gcc rules.
-*/
-
-#define COMP_ALIGNMENT(DST,TYPE)  {\
-    struct {char f1; TYPE x;} tmp; \
-    DST.typename = #TYPE ;        \
-    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
-
-char* ctypenames[NCTYPES] = {
-(char*)NULL,
-"char","unsigned char",
-"short","unsigned short",
-"int","unsigned int",
-"long long","unsigned long long",
-"float","double",
-"void*","nc_vlen_t"
-};
-
-static Typealignvec vec[NCTYPES];
-static Typealignset set;
-
-unsigned int
-nctypealignment(nc_type nctype)
-{
-    Alignment* align = NULL;
-    int index = 0;
-    switch (nctype) {
-      case NC_BYTE: index = UCHARINDEX; break;
-      case NC_CHAR: index = CHARINDEX; break;
-      case NC_SHORT: index = SHORTINDEX; break;
-      case NC_INT: index = INTINDEX; break;
-      case NC_FLOAT: index = FLOATINDEX; break;
-      case NC_DOUBLE: index = DOUBLEINDEX; break;
-      case NC_UBYTE: index = UCHARINDEX; break;
-      case NC_USHORT: index = USHORTINDEX; break;
-      case NC_UINT: index = UINTINDEX; break;
-      case NC_INT64: index = LONGLONGINDEX; break;
-      case NC_UINT64: index = ULONGLONGINDEX; break;
-      case NC_STRING: index = PTRINDEX; break;
-      case NC_VLEN: index = NCVLENINDEX; break;
-      case NC_OPAQUE: index = UCHARINDEX; break;
-      default:
-	fprintf(stderr,"nctypealignment: bad type code: %d",nctype);
-	exit(1);
-    }
-    align = &vec[index];
-    return align->alignment;
-}
-
-
-void
-compute_alignments(void)
-{
-    /* Compute the alignments for all the common C data types*/
-    /* First for the struct*/
-    /* initialize*/
-    memset((void*)&set,0,sizeof(set));
-    memset((void*)vec,0,sizeof(vec));
-
-    COMP_ALIGNMENT(set.charalign,char);
-    COMP_ALIGNMENT(set.ucharalign,unsigned char);
-    COMP_ALIGNMENT(set.shortalign,short);
-    COMP_ALIGNMENT(set.ushortalign,unsigned short);
-    COMP_ALIGNMENT(set.intalign,int);
-    COMP_ALIGNMENT(set.uintalign,unsigned int);
-    COMP_ALIGNMENT(set.longlongalign,long long);
-    COMP_ALIGNMENT(set.ulonglongalign,unsigned long long);
-    COMP_ALIGNMENT(set.floatalign,float);
-    COMP_ALIGNMENT(set.doublealign,double);
-    COMP_ALIGNMENT(set.ptralign,void*);
-    COMP_ALIGNMENT(set.ncvlenalign,nc_vlen_t);
-
-    /* Then the vector*/
-    COMP_ALIGNMENT(vec[CHARINDEX],char);
-    COMP_ALIGNMENT(vec[UCHARINDEX],unsigned char); 
-    COMP_ALIGNMENT(vec[SHORTINDEX],short);
-    COMP_ALIGNMENT(vec[USHORTINDEX],unsigned short);
-    COMP_ALIGNMENT(vec[INTINDEX],int);
-    COMP_ALIGNMENT(vec[UINTINDEX],unsigned int);
-    COMP_ALIGNMENT(vec[LONGLONGINDEX],long long);
-    COMP_ALIGNMENT(vec[ULONGLONGINDEX],unsigned long long);
-    COMP_ALIGNMENT(vec[FLOATINDEX],float);
-    COMP_ALIGNMENT(vec[DOUBLEINDEX],double);
-    COMP_ALIGNMENT(vec[PTRINDEX],void*);
-    COMP_ALIGNMENT(vec[NCVLENINDEX],nc_vlen_t);
-}
-
-#ifdef OFFSETTEST
-
-/* Compute the alignment of TYPE when it is preceded
-   by a field of type TYPE1
-*/
-#define COMP_ALIGNMENT1(DST,TYPE1,TYPE)  {\
-    struct {TYPE1 f1; TYPE x;} tmp; \
-    DST.typename = #TYPE ;        \
-    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
-
-/* Compute the alignment of TYPE when it is preceded
-   by a field of type TYPE1 and a field of type TYPE2
-*/
-#define COMP_ALIGNMENT2(DST,TYPE1,TYPE2,TYPE)  {\
-    struct {TYPE1 f1, TYPE2 f2; TYPE x;} tmp;   \
-    DST.typename = #TYPE ;                      \
-    DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));}
-
-/* Compute the alignment of TYPE when it is preceded
-   by a field of type TYPE1 and a field of type TYPE2
-*/
-#define COMP_SIZE0(DST,TYPE1,TYPE2)  {\
-    struct {TYPE1 c; TYPE2 x;} tmp; \
-    DST = sizeof(tmp); }
-
-static char*
-padname(char* name)
-{
-#define MAX 20
-    if(name == NULL) name = "null";
-    int len = strlen(name);
-    if(len > MAX) len = MAX;
-    char* s = (char*)emalloc(MAX+1);
-    memset(s,' ',MAX);
-    s[MAX+1] = '\0';
-    strncpy(s,name,len);
-    return s;
-}
-
-static void
-verify(Typealignvec* vec)
-{
-    int i,j;
-    Typealignvec* vec16;
-    Typealignvec* vec32;
-    int* sizes8;
-    int* sizes16;
-    int* sizes32;
-
-    vec16 = (Typealignvec*)emalloc(sizeof(Typealignvec)*NCTYPES);
-    vec32 = (Typealignvec*)emalloc(sizeof(Typealignvec)*NCTYPES);
-    sizes8 = (int*)emalloc(sizeof(int)*NCTYPES);
-    sizes16 = (int*)emalloc(sizeof(int)*NCTYPES);
-    sizes32 = (int*)emalloc(sizeof(int)*NCTYPES);
-
-    COMP_SIZE0(sizes8[1],char,char);
-    COMP_SIZE0(sizes8[2],unsigned char,char);
-    COMP_SIZE0(sizes8[3],short,char);
-    COMP_SIZE0(sizes8[4],unsigned short,char);
-    COMP_SIZE0(sizes8[5],int,char);
-    COMP_SIZE0(sizes8[6],unsigned int,char);
-    COMP_SIZE0(sizes8[7],long long,char);
-    COMP_SIZE0(sizes8[8],unsigned long long,char);
-    COMP_SIZE0(sizes8[9],float,char);
-    COMP_SIZE0(sizes8[10],double,char) ;
-    COMP_SIZE0(sizes8[11],void*,char);
-    COMP_SIZE0(sizes8[12],nc_vlen_t,char);
-
-    COMP_SIZE0(sizes16[1],char,short);
-    COMP_SIZE0(sizes16[2],unsigned char,short);
-    COMP_SIZE0(sizes16[3],short,short);
-    COMP_SIZE0(sizes16[4],unsigned short,short);
-    COMP_SIZE0(sizes16[5],int,short);
-    COMP_SIZE0(sizes16[6],unsigned int,short);
-    COMP_SIZE0(sizes16[7],long long,short);
-    COMP_SIZE0(sizes16[8],unsigned long long,short);
-    COMP_SIZE0(sizes16[9],float,short);
-    COMP_SIZE0(sizes16[10],double,short) ;
-    COMP_SIZE0(sizes16[11],void*,short);
-    COMP_SIZE0(sizes16[12],nc_vlen_t*,short);
-
-    COMP_SIZE0(sizes32[1],char,int);
-    COMP_SIZE0(sizes32[2],unsigned char,int);
-    COMP_SIZE0(sizes32[3],short,int);
-    COMP_SIZE0(sizes32[4],unsigned short,int);
-    COMP_SIZE0(sizes32[5],int,int);
-    COMP_SIZE0(sizes32[6],unsigned int,int);
-    COMP_SIZE0(sizes32[7],long long,int);
-    COMP_SIZE0(sizes32[8],unsigned long long,int);
-    COMP_SIZE0(sizes32[9],float,int);
-    COMP_SIZE0(sizes32[10],double,int) ;
-    COMP_SIZE0(sizes32[11],void*,int);
-    COMP_SIZE0(sizes32[12],nc_vlen_t*,int);
-
-    COMP_ALIGNMENT1(vec16[1],char,short);
-    COMP_ALIGNMENT1(vec16[2],unsigned char,short);
-    COMP_ALIGNMENT1(vec16[3],short,short);
-    COMP_ALIGNMENT1(vec16[4],unsigned short,short);
-    COMP_ALIGNMENT1(vec16[5],int,short);
-    COMP_ALIGNMENT1(vec16[6],unsigned int,short);
-    COMP_ALIGNMENT1(vec32[7],long long,short);
-    COMP_ALIGNMENT1(vec32[8],unsigned long long,short);
-    COMP_ALIGNMENT1(vec16[9],float,short);
-    COMP_ALIGNMENT1(vec16[10],double,short);
-    COMP_ALIGNMENT1(vec16[11],void*,short);
-    COMP_ALIGNMENT1(vec16[12],nc_vlen_t*,short);
-
-    COMP_ALIGNMENT1(vec32[1],char,short);
-    COMP_ALIGNMENT1(vec32[2],unsigned char,short);
-    COMP_ALIGNMENT1(vec32[3],char,short);
-    COMP_ALIGNMENT1(vec32[4],unsigned short,short);
-    COMP_ALIGNMENT1(vec32[5],int,int);
-    COMP_ALIGNMENT1(vec32[6],unsigned int,int);
-    COMP_ALIGNMENT1(vec32[7],long long,int);
-    COMP_ALIGNMENT1(vec32[8],unsigned long long,int);
-    COMP_ALIGNMENT1(vec32[9],float,int);
-    COMP_ALIGNMENT1(vec32[10],double,int);
-    COMP_ALIGNMENT1(vec32[11],void*,int);
-    COMP_ALIGNMENT1(vec32[12],nc_vlen_t*,int);
-
-    for(i=0;i<NCTYPES;i++) {
-	printf("%s: size=%2d  alignment=%2d\n",
-		padname(vec[i].typename),sizes8[i],vec[i].alignment);
-    }
-    for(i=0;i<NCTYPES;i++) {
-	printf("short vs %s: size=%2d  alignment=%2d\n",
-		padname(vec[i].typename),sizes16[i],vec16[i].alignment);
-    }
-    for(i=0;i<NCTYPES;i++) {
-	printf("int vs %s: size=%2d  alignment=%2d\n",
-		padname(vec[i].typename),sizes32[i],vec32[i].alignment);
-    }
-
-}
-
-void *
-emalloc(size_t bytes) {
-    size_t *memory;
-    memory = malloc(bytes);
-    if(memory == 0) {
-	printf("malloc failed\n");
-	exit(2);
-    }
-    return memory;
-}
-
-int
-main(int argc, char** argv)
-{
-    int i;
-
-    compute_alignments();
-
-    verify(vec);
-
-/*
-    for(i=0;i<NCTYPES;i++) {
-	printf("%s:\talignment=%d\n",vec[i].typename,vec[i].alignment);
-    }
-*/
-    exit(0);
-}
-#endif /*OFFSETTEST*/
diff --git a/ncgen/offsets.h b/ncgen/offsets.h
deleted file mode 100644
index eeef434..0000000
--- a/ncgen/offsets.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*********************************************************************
- *   Copyright 2009, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *********************************************************************/
-/* $Id: offsets.h,v 1.2 2010/05/24 19:59:58 dmh Exp $ */
-/* $Header: /upc/share/CVS/netcdf-3/ncgen/offsets.h,v 1.2 2010/05/24 19:59:58 dmh Exp $ */
-
-#ifndef OFFSETS_H
-#define OFFSETS_H 1
-
-typedef struct Alignment {
-    char* typename;
-    unsigned int alignment;
-} Alignment;
-
-/* Define indices for every primitive C type */
-/* NAT => NOT-A-TYPE*/
-#define NATINDEX       0
-#define CHARINDEX      1
-#define UCHARINDEX     2
-#define SHORTINDEX     3
-#define USHORTINDEX    4
-#define INTINDEX       5
-#define UINTINDEX      6
-#define LONGINDEX      7
-#define ULONGINDEX     8
-#define LONGLONGINDEX  9
-#define ULONGLONGINDEX 10
-#define FLOATINDEX     11
-#define DOUBLEINDEX    12
-#define PTRINDEX       13
-#define NCVLENINDEX    14
-
-#define NCTYPES        15
-
-/* Capture in struct and in a vector*/
-typedef struct Typealignset {
-    Alignment charalign;	/* char*/
-    Alignment ucharalign;	/* unsigned char*/
-    Alignment shortalign;	/* short*/
-    Alignment ushortalign;	/* unsigned short*/
-    Alignment intalign;		/* int*/
-    Alignment uintalign;	/* unsigned int*/
-    Alignment longalign;	/* long*/
-    Alignment ulongalign;	/* unsigned long*/
-    Alignment longlongalign;	/* long long*/
-    Alignment ulonglongalign;	/* unsigned long long*/
-    Alignment floatalign;	/* float*/
-    Alignment doublealign;	/* double*/
-    Alignment ptralign;		/* void**/
-    Alignment ncvlenalign;	/* nc_vlen_t*/
-} Typealignset;
-
-typedef Alignment Typealignvec;
-
-extern char* ctypenames[];
-
-extern void compute_alignments(void);
-extern unsigned int nctypealignment(nc_type nctype);
-
-#endif /*OFFSETS_H*/
diff --git a/ncgen/run_nc4_tests.sh b/ncgen/run_nc4_tests.sh
deleted file mode 100755
index 0c5b067..0000000
--- a/ncgen/run_nc4_tests.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-# This shell script runs the ncdump tests.
-# $Id: run_nc4_tests.sh,v 1.4 2010/05/18 20:05:23 dmh Exp $
-
-if test "x$srcdir" = x ; then srcdir="."; fi
-
-##
-# Function to test a netCDF CDL file.
-# 1. Generate binary nc.
-# Use ncdump to compare against original CDL file.
-# Input: CDL file name, minus the suffix, output filename
-# Other input: arguments.
-#
-# Example:
-#     $ validateNC compound_datasize_test -k nc4
-##
-validateNC() {
-    BASENAME=$1
-    INFILE=$srcdir/$1.cdl
-    TMPFILE=tst_$2.cdl
-    shift
-    shift
-    ARGS=$@
-
-    echo "*** generating $BASENAME.nc ***"
-    ./ncgen $ARGS -o $BASENAME.nc $INFILE
-    ../ncdump/ncdump $BASENAME.nc | sed 's/e+0/e+/g' > $TMPFILE
-    echo "*** comparing binary against source CDL file *** "
-    diff -b -w $INFILE $TMPFILE
-
-}
-
-
-
-echo "*** Testing ncgen for netCDF-4."
-set -e
-
-echo "*** creating netCDF-4 file c0_4.nc from c0_4.cdl..."
-validateNC "c0_4" "c0_4" -k nc4 -b -o c0_4.nc
-
-echo "*** creating netCDF-4 classic model file c0_4c.nc from c0.cdl..."
-validateNC "c0" "c0_4c" -k nc7 -b
-
-echo "*** creating C code for CAM file ref_camrun.cdl..."
-./ncgen -lc $srcdir/ref_camrun.cdl >ref_camrun.c
-
-echo "*** test for jira NCF-199 bug"
-validateNC "ncf199" "ncf199" -k nc4
-
-echo "*** creating binary files for github issue 323..."
-echo "*** github issue 323 test 1"
-validateNC "compound_datasize_test" "compound_datasize_test" -k nc4
-
-echo "*** github issue 323 test 2"
-validateNC "compound_datasize_test2" "compound_datasize_test2"  -k nc4
-
-echo "*** Test successful!"
-exit 0
diff --git a/ncgen/run_tests.sh b/ncgen/run_tests.sh
deleted file mode 100755
index d933d2f..0000000
--- a/ncgen/run_tests.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/sh
-# This shell script runs the ncgen tests.
-# $Id: run_tests.sh,v 1.10 2010/04/04 22:06:03 dmh Exp $
-
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
-
-echo "*** Testing ncgen."
-set -e
-
-validateNC() {
-    BASENAME=$1
-    INFILE=$srcdir/$1.cdl
-    TMPFILE=tst_$2.cdl
-    shift
-    shift
-    ARGS=$@
-
-    echo "*** generating $BASENAME.nc ***"
-    ./ncgen $ARGS -o $BASENAME.nc $INFILE
-    ../ncdump/ncdump $BASENAME.nc | sed 's/e+0/e+/g' > $TMPFILE
-    echo "*** comparing $BASENAME.nc against $INFILE *** "
-    diff -b -w $INFILE $TMPFILE
-}
-
-echo "*** creating classic file c0.nc from c0.cdl..."
-
-validateNC c0 c0 -b
-
-echo "*** creating 64-bit offset file c0_64.nc from c0.cdl..."
-
-validateNC c0 "c0_64" -k 64-bit-offset -b
-
-echo "*** creating 64-bit offset file c5.nc from c5.cdl..."
-./ncgen -k 64-bit-data -b -o c5.nc $srcdir/c5.cdl
-if [ ! -f c5.nc ]; then
-    echo "Failure."
-    exit 1
-fi
-
-echo "*** Test successful!"
-exit 0
diff --git a/ncgen/run_tests2.sh b/ncgen/run_tests2.sh
index eccfb1c..49c65bc 100755
--- a/ncgen/run_tests2.sh
+++ b/ncgen/run_tests2.sh
@@ -2,8 +2,13 @@
 # This shell script runs the ncdump tests.
 # $Id: run_tests2.sh,v 1.2 2005/11/07 20:25:32 ed Exp $
 
+#Ensure srcdir
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+
+. ../test_common.sh
+
 echo "*** creating test0.nc from test0.cdl..."
-if !(../ncdump/ncdump -n c1 $(srcdir)/ctest0.nc > ctest1.cdl); then
+if !(${NCDUMP} -n c1 $(srcdir)/ctest0.nc > ctest1.cdl); then
     echo "ncgen test failed! Sorry!" && exit 1
 fi
 
diff --git a/ncgen/semantics.c b/ncgen/semantics.c
index 018766e..88be73c 100644
--- a/ncgen/semantics.c
+++ b/ncgen/semantics.c
@@ -7,7 +7,7 @@
 
 #include        "includes.h"
 #include        "dump.h"
-#include        "offsets.h"
+#include        "ncoffsets.h"
 
 /* Forward*/
 static void computefqns(void);
@@ -422,6 +422,11 @@ processeconstrefs(void)
 {
     unsigned long i;
     /* locate all the datalist and walk them recursively */
+    for(i=0;i<listlength(gattdefs);i++) {
+	Symbol* att = (Symbol*)listget(gattdefs,i);
+	if(att->data != NULL && listlength(att->data) > 0)
+	    processeconstrefsR(att->data);
+    }
     for(i=0;i<listlength(attdefs);i++) {
 	Symbol* att = (Symbol*)listget(attdefs,i);
 	if(att->data != NULL && listlength(att->data) > 0)
@@ -600,6 +605,7 @@ computesize(Symbol* tsym)
 {
     int i;
     int offset = 0;
+    int largealign;
     unsigned long totaldimsize;
     if(tsym->touched) return;
     tsym->touched=1;
@@ -627,29 +633,27 @@ computesize(Symbol* tsym)
 	    break;
 	case NC_COMPOUND: /* keep if all fields are primitive*/
 	    /* First, compute recursively, the size and alignment of fields*/
-	    for(i=0;i<listlength(tsym->subnodes);i++) {
+            for(i=0;i<listlength(tsym->subnodes);i++) {
 		Symbol* field = (Symbol*)listget(tsym->subnodes,i);
-		ASSERT(field->subclass == NC_FIELD);
+                ASSERT(field->subclass == NC_FIELD);
 		computesize(field);
-		/* alignment of struct is same as alignment of first field*/
 		if(i==0) tsym->typ.alignment = field->typ.alignment;
-	    }
-	    /* now compute the size of the compound based on*/
-	    /* what user specified*/
-	    offset = 0;
-            int largealign = 1;
+            }
+            /* now compute the size of the compound based on what user specified*/
+            offset = 0;
+            largealign = 1;
             for(i=0;i<listlength(tsym->subnodes);i++) {
-              Symbol* field = (Symbol*)listget(tsym->subnodes,i);
-              /* only support 'c' alignment for now*/
-              int alignment = field->typ.alignment;
-	      int padding = getpadding(offset,alignment);
-              offset += padding;
-              field->typ.offset = offset;
-              offset += field->typ.size;
-              if (alignment > largealign) {
-                largealign = alignment;
-              }
-	    }
+                Symbol* field = (Symbol*)listget(tsym->subnodes,i);
+                /* only support 'c' alignment for now*/
+                int alignment = field->typ.alignment;
+                int padding = getpadding(offset,alignment);
+                offset += padding;
+                field->typ.offset = offset;
+                offset += field->typ.size;
+                if (alignment > largealign) {
+                    largealign = alignment;
+                }
+            }
 	    tsym->typ.cmpdalign = largealign; /* total structure size alignment */
             offset += (offset % largealign);
 	    tsym->typ.size = offset;
diff --git a/ncgen/tst_gattenum.cdl b/ncgen/tst_gattenum.cdl
new file mode 100644
index 0000000..47bf651
--- /dev/null
+++ b/ncgen/tst_gattenum.cdl
@@ -0,0 +1,8 @@
+netcdf tst_gattenum {
+types:
+  ubyte enum Bradys {Mike = 0, Carol = 1, Greg = 2, Marsha = 3, Peter = 4, 
+      Jan = 5, Bobby = 6, Whats-her-face = 7, Alice = 8} ;
+
+// global attributes:
+		Bradys :brady_attribute = Mike, Marsha, Alice;
+}
diff --git a/ncgen/tst_usuffix.cdl b/ncgen/tst_usuffix.cdl
new file mode 100644
index 0000000..8b0a7fd
--- /dev/null
+++ b/ncgen/tst_usuffix.cdl
@@ -0,0 +1,9 @@
+netcdf tst_usuffix {
+variables:
+	float att_var ;
+		att_var:uint_att = 73U ;
+		att_var:uint_att2 = 73U ;
+data:
+
+ att_var = 10 ;
+}
diff --git a/ncgen3/Makefile.am b/ncgen3/Makefile.am
index 27950e8..e20f326 100644
--- a/ncgen3/Makefile.am
+++ b/ncgen3/Makefile.am
@@ -2,6 +2,8 @@
 # Copyright 2005, see the COPYRIGHT file for more information.
 # This file builds and runs the ncgen program.
 
+#LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-verbose
+
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 include $(top_srcdir)/lib_flags.am
 
diff --git a/ncgen3/Makefile.in b/ncgen3/Makefile.in
index f442b4c..74a29a7 100644
--- a/ncgen3/Makefile.in
+++ b/ncgen3/Makefile.in
@@ -18,6 +18,8 @@
 # Copyright 2005, see the COPYRIGHT file for more information.
 # This file builds and runs the ncgen program.
 
+#LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-verbose
+
 # This is part of the netCDF package.
 # Copyright 2005 University Corporation for Atmospheric Research/Unidata
 # See COPYRIGHT file for conditions of use.
@@ -442,6 +444,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -469,12 +472,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -509,6 +514,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -573,6 +579,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Put together AM_CPPFLAGS and AM_LDFLAGS.
 
diff --git a/ncgen3/genlib.h b/ncgen3/genlib.h
index 3869ea9..6c6f38a 100644
--- a/ncgen3/genlib.h
+++ b/ncgen3/genlib.h
@@ -5,7 +5,7 @@
  *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
  *   $Header: /upc/share/CVS/netcdf-3/ncgen3/genlib.h,v 1.15 2009/12/29 18:42:35 dmh Exp $
  *********************************************************************/
-#include <config.h>
+#include "config.h"
 #include <stdlib.h>
 #include <limits.h>
 
diff --git a/ncgen3/lfs-tests b/ncgen3/lfs-tests
old mode 100755
new mode 100644
diff --git a/ncgen3/main.c b/ncgen3/main.c
index da8bb91..2e035fe 100644
--- a/ncgen3/main.c
+++ b/ncgen3/main.c
@@ -26,7 +26,8 @@ int optind;
 #include <locale.h>
 #endif
     
-#include <netcdf.h>
+#include "netcdf.h"
+#include "ncwinpath.h"
 
 #include "generic.h"
 #include "ncgen.h"
@@ -229,7 +230,7 @@ main(
 
     fp = stdin;
     if (argc > 0 && strcmp(argv[0], "-") != 0) {
-	if ((fp = fopen(argv[0], "r")) == NULL) {
+	if ((fp = NCfopen(argv[0], "r")) == NULL) {
 	    derror ("can't open file %s for reading: ", argv[0]);
 	    perror("");
 	    return(7);
diff --git a/ncgen3/ncgen.y b/ncgen3/ncgen.y
index f5d5543..5a0a431 100644
--- a/ncgen3/ncgen.y
+++ b/ncgen3/ncgen.y
@@ -29,7 +29,9 @@ typedef struct Symbol {		/* symbol table entry */
 	} *YYSTYPE1;
 
 /* True if string a equals string b*/
+#ifndef STREQ
 #define	STREQ(a, b)	(*(a) == *(b) && strcmp((a), (b)) == 0)
+#endif
 #define NC_UNSPECIFIED ((nc_type)0)	/* unspecified (as yet) type */
 
 #define YYSTYPE YYSTYPE1
diff --git a/ncgen3/run_nc4_tests.sh b/ncgen3/run_nc4_tests.sh
index 4dc8a77..52b3360 100755
--- a/ncgen3/run_nc4_tests.sh
+++ b/ncgen3/run_nc4_tests.sh
@@ -2,16 +2,16 @@
 # This shell script runs the ncdump tests.
 # $Id: run_nc4_tests.sh,v 1.3 2009/09/24 18:19:10 dmh Exp $
 
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 
 echo "*** Testing ncgen3 for netCDF-4."
 set -e
 echo "*** creating netCDF-4 file c0_4.nc from c0.cdl..."
-./ncgen3 -k3 -b -o c0_4.nc $srcdir/c0.cdl
+${NCGEN3} -k3 -b -o c0_4.nc ${ncgen3c0}
 echo "*** creating netCDF-4 classic model file c0_4c.nc from c0.cdl..."
-./ncgen3 -k4 -b -o c0_4c.nc $srcdir/c0.cdl
+${NCGEN3} -k4 -b -o c0_4c.nc ${ncgen3c0}
 
 echo "*** Test successful!"
 exit 0
diff --git a/ncgen3/run_tests.sh b/ncgen3/run_tests.sh
index c31e08a..3289196 100755
--- a/ncgen3/run_tests.sh
+++ b/ncgen3/run_tests.sh
@@ -5,14 +5,13 @@
 echo "*** Testing ncgen3."
 set -e
 
-if test "x$srcdir" = x ;then
-srcdir=`pwd`
-fi
+if test "x$srcdir" = x ;then srcdir=`pwd`; fi
+. ../test_common.sh
 
 echo "*** creating classic file c0.nc from c0.cdl..."
-./ncgen3 -b -o c0.nc $srcdir/c0.cdl
+${NCGEN3} -b -o c0.nc ${ncgen3c0}
 echo "*** creating 64-bit offset file c0_64.nc from c0.cdl..."
-./ncgen3 -k 64-bit-offset -b -o c0_64.nc $srcdir/c0.cdl
+#${NCGEN3} -k 64-bit-offset -b -o c0_64.nc ${ncgen3c0}
 
 echo "*** Test successful!"
 exit 0
diff --git a/ncgen3/run_tests2.sh b/ncgen3/run_tests2.sh
index b7fb7d7..8d3ab6d 100755
--- a/ncgen3/run_tests2.sh
+++ b/ncgen3/run_tests2.sh
@@ -3,7 +3,7 @@
 # $Id: run_tests2.sh,v 1.3 2009/09/24 18:19:11 dmh Exp $
 
 echo "*** creating test0.nc from test0.cdl..."
-if !(../ncdump/ncdump -n c1 $(srcdir)/ctest0.nc > ctest1.cdl); then
+if !(${NCDUMP} -n c1 $(srcdir)/ctest0.nc > ctest1.cdl); then
     echo "ncgen3 test failed! Sorry!" && exit 1
 fi
 
diff --git a/nctest/CMakeLists.txt b/nctest/CMakeLists.txt
index c1f0dda..d04126c 100644
--- a/nctest/CMakeLists.txt
+++ b/nctest/CMakeLists.txt
@@ -12,4 +12,4 @@ TARGET_LINK_LIBRARIES(nctest netcdf)
 ADD_TEST(nctest ${EXECUTABLE_OUTPUT_PATH}/nctest)
 
 add_bin_test_no_prefix(tst_rename)
-add_sh_test(nctest compare_test_files)
\ No newline at end of file
+add_sh_test(nctest compare_test_files)
diff --git a/nctest/Makefile.in b/nctest/Makefile.in
index 580a7eb..81c5cf0 100644
--- a/nctest/Makefile.in
+++ b/nctest/Makefile.in
@@ -451,6 +451,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -478,12 +479,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -518,6 +521,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -582,6 +586,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+AM_TESTS_ENVIRONMENT = export DTOPSRCDIR=${abs_top_srcdir}; export DTOPBUILDDIR=${abs_top_builddir}; 
 
 # Running nctest results in a file testfile.nc, which is then checked
 # to make sure it matches testfile_nc.sav, which was generated under
diff --git a/nctest/atttests.c b/nctest/atttests.c
index f9fe7f2..6cd41bc 100644
--- a/nctest/atttests.c
+++ b/nctest/atttests.c
@@ -698,9 +698,6 @@ test_ncattcopy(path1, path2)
 	error("%s: ncendef failed", pname);
 	ncclose(cdfid); return ++nerrs;
     }
-if(strcmp(path1, "nctest_netcdf4.nc")==0) {
-int x=0;
-}  
     /* first (source) netcdf is in data mode */
     /* create second netCDF to copy attributes to */
     if ((cdfid2 = nccreate(path2, NC_CLOBBER)) == -1) {
diff --git a/nctest/compare_test_files.sh b/nctest/compare_test_files.sh
index 57c6d41..43fc0e1 100755
--- a/nctest/compare_test_files.sh
+++ b/nctest/compare_test_files.sh
@@ -1,8 +1,10 @@
 #!/bin/sh
+
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 set -e
-if test "x$srcdir" = x ; then
-srcdir=`pwd`
-fi
+
 cmp nctest_classic.nc $srcdir/ref_nctest_classic.nc
 cmp nctest_64bit_offset.nc $srcdir/ref_nctest_64bit_offset.nc
 
diff --git a/nctest/run_valgrind_tests.sh b/nctest/run_valgrind_tests.sh
index 256d8d1..29cbcb8 100755
--- a/nctest/run_valgrind_tests.sh
+++ b/nctest/run_valgrind_tests.sh
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+if test "x$srcdir" = x ; then srcdir=`pwd`; fi
+. ../test_common.sh
+
 # This shell runs the tests with valgrind.
 
 # $Id: run_valgrind_tests.sh,v 1.9 2010/01/26 20:24:18 ed Exp $
diff --git a/netCDFConfig.cmake.in b/netCDFConfig.cmake.in
index 6f4ccf8..c89cf3e 100644
--- a/netCDFConfig.cmake.in
+++ b/netCDFConfig.cmake.in
@@ -34,7 +34,9 @@ set(netCDF_HAS_HDF4 @HAS_HDF4@)
 set(netCDF_HAS_HDF5 @HAS_HDF5@)
 set(netCDF_HAS_PNETCDF @HAS_PNETCDF@)
 set(netCDF_HAS_PARALLEL @HAS_PARALLEL@)
-set(netCDF_HAS_DAP @HAS_DAP@)
+set(netCDF_HAS_DAP @HAS_DAP2@)
+set(netCDF_HAS_DAP2 @HAS_DAP2@)
+set(netCDF_HAS_DAP4 @HAS_DAP4@)
 set(netCDF_HAS_DISKLESS @HAS_DISKLESS@)
 set(netCDF_HAS_MMAP @HAS_MMAP@)
 set(netCDF_HAS_JNA @HAS_JNA@)
diff --git a/oc2/CMakeLists.txt b/oc2/CMakeLists.txt
index 0a0fae1..2b75aca 100644
--- a/oc2/CMakeLists.txt
+++ b/oc2/CMakeLists.txt
@@ -1,7 +1,12 @@
-SET(oc_SOURCES oc.c daplex.c dapparse.c dapy.c occlientparams.c occompile.c occurlfunctions.c ocdata.c ocdebug.c ocdump.c ocinternal.c ocnode.c ochttp.c ocrc.c ocread.c ocutil.c ocbytes.c oclist.c ocuri.c oclog.c occurlflags.c xxdr.c)
+SET(oc_SOURCES oc.c daplex.c dapparse.c dapy.c occlientparams.c occompile.c occurlfunctions.c ocdata.c ocdebug.c ocdump.c ocinternal.c ocnode.c ochttp.c ocrc.c ocread.c ocutil.c occurlflags.c xxdr.c)
 
 add_library(oc2 OBJECT ${oc_SOURCES}) 
 
+# Apparently fails under cmake
+#set(ocprint_FILES ocprint.c )
+#ADD_EXECUTABLE(ocprint ${ocprint_FILES})
+#TARGET_LINK_LIBRARIES(ocprint oc2 ${ALL_TLL_LIBS})
+
 ## Specify files to be distributed by 'make dist'
 FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
 SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am)
diff --git a/oc2/Make0 b/oc2/Make0
old mode 100755
new mode 100644
diff --git a/oc2/Makefile.am b/oc2/Makefile.am
old mode 100755
new mode 100644
index df004e9..d85ee81
--- a/oc2/Makefile.am
+++ b/oc2/Makefile.am
@@ -18,7 +18,6 @@ ocdata.c ocdebug.c ocdump.c  \
 ocinternal.c ocnode.c \
 ochttp.c \
 ocrc.c ocread.c ocutil.c \
-ocbytes.c oclist.c ocuri.c oclog.c \
 occurlflags.c \
 xxdr.c
 
@@ -28,16 +27,13 @@ occlientparams.h occompile.h occonstraints.h occurlfunctions.h \
 ocdata.h ocdatatypes.h ocdebug.h ocdump.h \
 ocinternal.h ocnode.h \
 ochttp.h ocread.h ocutil.h \
-ocbytes.h oclist.h ocuri.h oclog.h \
 xxdr.h
 
 EXTRA_DIST = dap.y CMakeLists.txt auth.html.in oc.css
 
-if BUILD_DAP
 noinst_LTLIBRARIES = liboc.la
 liboc_la_SOURCES = $(SRC) $(HDRS) 
 liboc_la_CPPFLAGS = $(AM_CPPFLAGS)
-endif
 
 # These rule are used if someone wants to rebuild the grammar files.
 # Otherwise never invoked, but records how to do it.
diff --git a/oc2/Makefile.in b/oc2/Makefile.in
index 7172477..6872fc0 100644
--- a/oc2/Makefile.in
+++ b/oc2/Makefile.in
@@ -112,32 +112,20 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LTLIBRARIES = $(noinst_LTLIBRARIES)
 liboc_la_LIBADD =
-am__liboc_la_SOURCES_DIST = oc.c daplex.c dapparse.c dapy.c \
-	occlientparams.c occompile.c occurlfunctions.c ocdata.c \
-	ocdebug.c ocdump.c ocinternal.c ocnode.c ochttp.c ocrc.c \
-	ocread.c ocutil.c ocbytes.c oclist.c ocuri.c oclog.c \
-	occurlflags.c xxdr.c oc.h ocx.h dapparselex.h dapy.h \
-	occlientparams.h occompile.h occonstraints.h occurlfunctions.h \
-	ocdata.h ocdatatypes.h ocdebug.h ocdump.h ocinternal.h \
-	ocnode.h ochttp.h ocread.h ocutil.h ocbytes.h oclist.h ocuri.h \
-	oclog.h xxdr.h
 am__objects_1 = liboc_la-oc.lo liboc_la-daplex.lo liboc_la-dapparse.lo \
 	liboc_la-dapy.lo liboc_la-occlientparams.lo \
 	liboc_la-occompile.lo liboc_la-occurlfunctions.lo \
 	liboc_la-ocdata.lo liboc_la-ocdebug.lo liboc_la-ocdump.lo \
 	liboc_la-ocinternal.lo liboc_la-ocnode.lo liboc_la-ochttp.lo \
 	liboc_la-ocrc.lo liboc_la-ocread.lo liboc_la-ocutil.lo \
-	liboc_la-ocbytes.lo liboc_la-oclist.lo liboc_la-ocuri.lo \
-	liboc_la-oclog.lo liboc_la-occurlflags.lo liboc_la-xxdr.lo
+	liboc_la-occurlflags.lo liboc_la-xxdr.lo
 am__objects_2 =
- at BUILD_DAP_TRUE@am_liboc_la_OBJECTS = $(am__objects_1) \
- at BUILD_DAP_TRUE@	$(am__objects_2)
+am_liboc_la_OBJECTS = $(am__objects_1) $(am__objects_2)
 liboc_la_OBJECTS = $(am_liboc_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
- at BUILD_DAP_TRUE@am_liboc_la_rpath =
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -173,7 +161,7 @@ am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = $(liboc_la_SOURCES)
-DIST_SOURCES = $(am__liboc_la_SOURCES_DIST)
+DIST_SOURCES = $(liboc_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -243,6 +231,7 @@ EXEEXT = @EXEEXT@
 FGREP = @FGREP@
 GREP = @GREP@
 HAS_DAP = @HAS_DAP@
+HAS_DAP4 = @HAS_DAP4@
 HAS_DISKLESS = @HAS_DISKLESS@
 HAS_HDF4 = @HAS_HDF4@
 HAS_HDF5 = @HAS_HDF5@
@@ -270,12 +259,14 @@ LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+M4FLAGS = @M4FLAGS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 NC_ENABLE_DOXYGEN_PDF_OUTPUT = @NC_ENABLE_DOXYGEN_PDF_OUTPUT@
 NC_HAS_DAP = @NC_HAS_DAP@
+NC_HAS_DAP4 = @NC_HAS_DAP4@
 NC_HAS_DISKLESS = @NC_HAS_DISKLESS@
 NC_HAS_HDF4 = @NC_HAS_HDF4@
 NC_HAS_HDF5 = @NC_HAS_HDF5@
@@ -310,6 +301,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+RELAX_COORD_BOUND = @RELAX_COORD_BOUND@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -383,7 +375,6 @@ ocdata.c ocdebug.c ocdump.c  \
 ocinternal.c ocnode.c \
 ochttp.c \
 ocrc.c ocread.c ocutil.c \
-ocbytes.c oclist.c ocuri.c oclog.c \
 occurlflags.c \
 xxdr.c
 
@@ -393,13 +384,12 @@ occlientparams.h occompile.h occonstraints.h occurlfunctions.h \
 ocdata.h ocdatatypes.h ocdebug.h ocdump.h \
 ocinternal.h ocnode.h \
 ochttp.h ocread.h ocutil.h \
-ocbytes.h oclist.h ocuri.h oclog.h \
 xxdr.h
 
 EXTRA_DIST = dap.y CMakeLists.txt auth.html.in oc.css
- at BUILD_DAP_TRUE@noinst_LTLIBRARIES = liboc.la
- at BUILD_DAP_TRUE@liboc_la_SOURCES = $(SRC) $(HDRS) 
- at BUILD_DAP_TRUE@liboc_la_CPPFLAGS = $(AM_CPPFLAGS)
+noinst_LTLIBRARIES = liboc.la
+liboc_la_SOURCES = $(SRC) $(HDRS) 
+liboc_la_CPPFLAGS = $(AM_CPPFLAGS)
 all: all-am
 
 .SUFFIXES:
@@ -446,7 +436,7 @@ clean-noinstLTLIBRARIES:
 	}
 
 liboc.la: $(liboc_la_OBJECTS) $(liboc_la_DEPENDENCIES) $(EXTRA_liboc_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(LINK) $(am_liboc_la_rpath) $(liboc_la_OBJECTS) $(liboc_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(LINK)  $(liboc_la_OBJECTS) $(liboc_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -458,7 +448,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-dapparse.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-dapy.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-oc.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocbytes.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-occlientparams.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-occompile.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-occurlflags.Plo at am__quote@
@@ -468,12 +457,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocdump.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ochttp.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocinternal.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-oclist.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-oclog.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocnode.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocrc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocread.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocuri.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-ocutil.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liboc_la-xxdr.Plo at am__quote@
 
@@ -613,34 +599,6 @@ liboc_la-ocutil.lo: ocutil.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o liboc_la-ocutil.lo `test -f 'ocutil.c' || echo '$(srcdir)/'`ocutil.c
 
-liboc_la-ocbytes.lo: ocbytes.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT liboc_la-ocbytes.lo -MD -MP -MF $(DEPDIR)/liboc_la-ocbytes.Tpo -c -o liboc_la-ocbytes.lo `test -f 'ocbytes.c' || echo '$(srcdir)/'`ocbytes.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/liboc_la-ocbytes.Tpo $(DEPDIR)/liboc_la-ocbytes.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ocbytes.c' object='liboc_la-ocbytes.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o liboc_la-ocbytes.lo `test -f 'ocbytes.c' || echo '$(srcdir)/'`ocbytes.c
-
-liboc_la-oclist.lo: oclist.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT liboc_la-oclist.lo -MD -MP -MF $(DEPDIR)/liboc_la-oclist.Tpo -c -o liboc_la-oclist.lo `test -f 'oclist.c' || echo '$(srcdir)/'`oclist.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/liboc_la-oclist.Tpo $(DEPDIR)/liboc_la-oclist.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='oclist.c' object='liboc_la-oclist.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o liboc_la-oclist.lo `test -f 'oclist.c' || echo '$(srcdir)/'`oclist.c
-
-liboc_la-ocuri.lo: ocuri.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT liboc_la-ocuri.lo -MD -MP -MF $(DEPDIR)/liboc_la-ocuri.Tpo -c -o liboc_la-ocuri.lo `test -f 'ocuri.c' || echo '$(srcdir)/'`ocuri.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/liboc_la-ocuri.Tpo $(DEPDIR)/liboc_la-ocuri.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ocuri.c' object='liboc_la-ocuri.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o liboc_la-ocuri.lo `test -f 'ocuri.c' || echo '$(srcdir)/'`ocuri.c
-
-liboc_la-oclog.lo: oclog.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT liboc_la-oclog.lo -MD -MP -MF $(DEPDIR)/liboc_la-oclog.Tpo -c -o liboc_la-oclog.lo `test -f 'oclog.c' || echo '$(srcdir)/'`oclog.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/liboc_la-oclog.Tpo $(DEPDIR)/liboc_la-oclog.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='oclog.c' object='liboc_la-oclog.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o liboc_la-oclog.lo `test -f 'oclog.c' || echo '$(srcdir)/'`oclog.c
-
 liboc_la-occurlflags.lo: occurlflags.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liboc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT liboc_la-occurlflags.lo -MD -MP -MF $(DEPDIR)/liboc_la-occurlflags.Tpo -c -o liboc_la-occurlflags.lo `test -f 'occurlflags.c' || echo '$(srcdir)/'`occurlflags.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/liboc_la-occurlflags.Tpo $(DEPDIR)/liboc_la-occurlflags.Plo
diff --git a/oc2/daplex.c b/oc2/daplex.c
index 08d69ad..00bd0b7 100644
--- a/oc2/daplex.c
+++ b/oc2/daplex.c
@@ -5,6 +5,7 @@
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
+
 #include "dapparselex.h"
 #include "dapy.h"
 
@@ -119,7 +120,7 @@ daplex(YYSTYPE* lvalp, DAPparsestate* state)
     YYSTYPE lval = NULL;
 
     token = 0;
-    ocbytesclear(lexstate->yytext);
+    ncbytesclear(lexstate->yytext);
     /* invariant: p always points to current char */
     for(p=lexstate->next;token==0&&(c=*p);p++) {
 	if(c == '\n') {
@@ -218,7 +219,7 @@ daplex(YYSTYPE* lvalp, DAPparsestate* state)
 #endif
 	    }
 	    /* Special check for Data: */
-	    tmp = ocbytescontents(lexstate->yytext);
+	    tmp = ncbytescontents(lexstate->yytext);
 	    if(strcmp(tmp,"Data")==0 && *p == ':') {
 		dapaddyytext(lexstate,*p); p++;
 		if(p[0] == '\n') {
@@ -246,18 +247,18 @@ daplex(YYSTYPE* lvalp, DAPparsestate* state)
 	}
     }
     lexstate->next = p;
-    strncpy(lexstate->lasttokentext,ocbytescontents(lexstate->yytext),MAX_TOKEN_LENGTH);
+    strncpy(lexstate->lasttokentext,ncbytescontents(lexstate->yytext),MAX_TOKEN_LENGTH);
     lexstate->lasttoken = token;
     if(ocdebug >= 2)
 	dumptoken(lexstate);
 
     /*Put return value onto Bison stack*/
 
-    if(ocbyteslength(lexstate->yytext) == 0)
+    if(ncbyteslength(lexstate->yytext) == 0)
         lval = NULL;
     else {
-        lval = ocbytesdup(lexstate->yytext);
-	oclistpush(lexstate->reclaim,(void*)lval);
+        lval = ncbytesdup(lexstate->yytext);
+	nclistpush(lexstate->reclaim,(void*)lval);
     }
     if(lvalp) *lvalp = lval;
     return token;      /* Return the type of the token.  */
@@ -266,7 +267,7 @@ daplex(YYSTYPE* lvalp, DAPparsestate* state)
 static void
 dapaddyytext(DAPlexstate* lex, int c)
 {
-    ocbytesappend(lex->yytext,c);
+    ncbytesappend(lex->yytext,c);
 }
 
 #ifndef DAP2ENCODE
@@ -283,7 +284,7 @@ tohex(int c)
 static void
 dumptoken(DAPlexstate* lexstate)
 {
-    fprintf(stderr,"TOKEN = |%s|\n",ocbytescontents(lexstate->yytext));
+    fprintf(stderr,"TOKEN = |%s|\n",ncbytescontents(lexstate->yytext));
 }
 
 /*
@@ -324,8 +325,8 @@ daplexinit(char* input, DAPlexstate** lexstatep)
     memset((void*)lexstate,0,sizeof(DAPlexstate));
     lexstate->input = strdup(input);
     lexstate->next = lexstate->input;
-    lexstate->yytext = ocbytesnew();
-    lexstate->reclaim = oclistnew();
+    lexstate->yytext = ncbytesnew();
+    lexstate->reclaim = nclistnew();
     dapsetwordchars(lexstate,0); /* Assume DDS */
 }
 
@@ -336,13 +337,13 @@ daplexcleanup(DAPlexstate** lexstatep)
     if(lexstate == NULL) return;
     if(lexstate->input != NULL) ocfree(lexstate->input);
     if(lexstate->reclaim != NULL) {
-	while(oclistlength(lexstate->reclaim) > 0) {
-	    char* word = (char*)oclistpop(lexstate->reclaim);
+	while(nclistlength(lexstate->reclaim) > 0) {
+	    char* word = (char*)nclistpop(lexstate->reclaim);
 	    if(word) free(word);
 	}
-	oclistfree(lexstate->reclaim);
+	nclistfree(lexstate->reclaim);
     }
-    ocbytesfree(lexstate->yytext);
+    ncbytesfree(lexstate->yytext);
     free(lexstate);
     *lexstatep = NULL;
 }
@@ -364,10 +365,10 @@ dapdecode(DAPlexstate* lexstate, char* name)
 {
     char* decoded = NULL;
 #ifdef DECODE_IDENTIFIERS
-    decoded = ocuridecode(name);
+    decoded = ncuridecode(name);
 #else
-    decoded = ocuridecodeonly(name,decodelist);
+    decoded = ncuridecodeonly(name,decodelist);
 #endif
-    oclistpush(lexstate->reclaim,(void*)decoded);
+    nclistpush(lexstate->reclaim,(void*)decoded);
     return decoded;
 }
diff --git a/oc2/dapparse.c b/oc2/dapparse.c
index 148278a..b7d479f 100644
--- a/oc2/dapparse.c
+++ b/oc2/dapparse.c
@@ -9,12 +9,12 @@
 /* Forward */
 
 static void addedges(OCnode* node);
-static void setroot(OCnode*,OClist*);
+static void setroot(OCnode*,NClist*);
 static int isglobalname(const char* name);
 static int isdodsname(const char* name);
 static OCnode* newocnode(char* name, OCtype octype, DAPparsestate* state);
 static OCtype octypefor(Object etype);
-static OClist* scopeduplicates(OClist* list);
+static NClist* scopeduplicates(NClist* list);
 static int check_int32(char* val, long* value);
 
 
@@ -44,7 +44,7 @@ dap_datasetbody(DAPparsestate* state, Object name, Object decls)
 {
     OCnode* root = newocnode((char*)name,OC_Dataset,state);
     char* dupname = NULL;
-    OClist* dups = scopeduplicates((OClist*)decls);
+    NClist* dups = scopeduplicates((NClist*)decls);
     if(dups != NULL) {
 	/* Sometimes, some servers (i.e. Thredds)
            return a dds with duplicate field names
@@ -55,7 +55,7 @@ dap_datasetbody(DAPparsestate* state, Object name, Object decls)
 	state->error = OC_ENAMEINUSE;
 	return (Object)NULL;
     }
-    root->subnodes = (OClist*)decls;
+    root->subnodes = (NClist*)decls;
     OCASSERT((state->root == NULL));
     state->root = root;
     state->root->root = state->root; /* make sure to cross link */
@@ -69,7 +69,7 @@ dap_attributebody(DAPparsestate* state, Object attrlist)
 {
     OCnode* node;
     /* Check for and remove attribute duplicates */
-    OClist* dups = scopeduplicates((OClist*)attrlist);
+    NClist* dups = scopeduplicates((NClist*)attrlist);
     if(dups != NULL) {
         ocnodes_free(dups);	
 	dap_parse_error(state,"Duplicate attribute names in same scope");
@@ -81,7 +81,7 @@ dap_attributebody(DAPparsestate* state, Object attrlist)
     state->root = node;
     /* make sure to cross link */
     state->root->root = state->root;
-    node->subnodes = (OClist*)attrlist;
+    node->subnodes = (NClist*)attrlist;
     addedges(node);
     return NULL;
 }
@@ -115,22 +115,22 @@ dap_unrecognizedresponse(DAPparsestate* state)
 Object
 dap_declarations(DAPparsestate* state, Object decls, Object decl)
 {
-    OClist* alist = (OClist*)decls;
+    NClist* alist = (NClist*)decls;
     if(alist == NULL)
-	 alist = oclistnew();
+	 alist = nclistnew();
     else
-	oclistpush(alist,(void*)decl);
+	nclistpush(alist,(void*)decl);
     return alist;
 }
 
 Object
 dap_arraydecls(DAPparsestate* state, Object arraydecls, Object arraydecl)
 {
-    OClist* alist = (OClist*)arraydecls;
+    NClist* alist = (NClist*)arraydecls;
     if(alist == NULL)
-	alist = oclistnew();
+	alist = nclistnew();
     else
-	oclistpush(alist,(void*)arraydecl);
+	nclistpush(alist,(void*)arraydecl);
     return alist;
 }
 
@@ -154,12 +154,12 @@ dap_arraydecl(DAPparsestate* state, Object name, Object size)
 Object
 dap_attrlist(DAPparsestate* state, Object attrlist, Object attrtuple)
 {
-    OClist* alist = (OClist*)attrlist;
+    NClist* alist = (NClist*)attrlist;
     if(alist == NULL)
-	alist = oclistnew();
+	alist = nclistnew();
     else {
 	if(attrtuple != NULL) {/* NULL=>alias encountered, ignore */
-            oclistpush(alist,(void*)attrtuple);
+            nclistpush(alist,(void*)attrtuple);
 	}
     }
     return alist;
@@ -168,11 +168,11 @@ dap_attrlist(DAPparsestate* state, Object attrlist, Object attrtuple)
 Object
 dap_attrvalue(DAPparsestate* state, Object valuelist, Object value, Object etype)
 {
-    OClist* alist = (OClist*)valuelist;
-    if(alist == NULL) alist = oclistnew();
+    NClist* alist = (NClist*)valuelist;
+    if(alist == NULL) alist = nclistnew();
     /* Watch out for null values */
     if(value == NULL) value = "";
-    oclistpush(alist,(void*)strdup(value));
+    nclistpush(alist,(void*)strdup(value));
     return alist;
 }
 
@@ -182,7 +182,7 @@ dap_attribute(DAPparsestate* state, Object name, Object values, Object etype)
     OCnode* att;
     att = newocnode((char*)name,OC_Attribute,state);
     att->etype = octypefor(etype);
-    att->att.values = (OClist*)values;
+    att->att.values = (NClist*)values;
     return att;
 }
 
@@ -194,7 +194,7 @@ dap_attrset(DAPparsestate* state, Object name, Object attributes)
     /* Check var set vs global set */
     attset->att.isglobal = isglobalname(name);
     attset->att.isdods = isdodsname(name);
-    attset->subnodes = (OClist*)attributes;
+    attset->subnodes = (NClist*)attributes;
     addedges(attset);
     return attset;
 }
@@ -233,14 +233,14 @@ isnumber(const char* text)
 #endif
 
 static void
-dimension(OCnode* node, OClist* dimensions)
+dimension(OCnode* node, NClist* dimensions)
 {
     unsigned int i;
-    unsigned int rank = oclistlength(dimensions);
-    node->array.dimensions = (OClist*)dimensions;
+    unsigned int rank = nclistlength(dimensions);
+    node->array.dimensions = (NClist*)dimensions;
     node->array.rank = rank;
     for(i=0;i<rank;i++) {
-        OCnode* dim = (OCnode*)oclistget(node->array.dimensions,i);
+        OCnode* dim = (OCnode*)nclistget(node->array.dimensions,i);
         dim->dim.array = node;
 	dim->dim.arrayindex = i;
 #if 0
@@ -266,7 +266,7 @@ dap_makebase(DAPparsestate* state, Object name, Object etype, Object dimensions)
     OCnode* node;
     node = newocnode((char*)name,OC_Atomic,state);
     node->etype = octypefor(etype);
-    dimension(node,(OClist*)dimensions);
+    dimension(node,(NClist*)dimensions);
     return node;
 }
 
@@ -274,7 +274,7 @@ Object
 dap_makestructure(DAPparsestate* state, Object name, Object dimensions, Object fields)
 {
     OCnode* node;
-    OClist* dups = scopeduplicates((OClist*)fields);
+    NClist* dups = scopeduplicates((NClist*)fields);
     if(dups != NULL) {
 	ocnodes_free(dups);
         dap_parse_error(state,"Duplicate structure field names in same structure: %s",(char*)name);
@@ -283,7 +283,7 @@ dap_makestructure(DAPparsestate* state, Object name, Object dimensions, Object f
     }
     node = newocnode(name,OC_Structure,state);
     node->subnodes = fields;
-    dimension(node,(OClist*)dimensions);
+    dimension(node,(NClist*)dimensions);
     addedges(node);
     return node;
 }
@@ -292,7 +292,7 @@ Object
 dap_makesequence(DAPparsestate* state, Object name, Object members)
 {
     OCnode* node;
-    OClist* dups = scopeduplicates((OClist*)members);
+    NClist* dups = scopeduplicates((NClist*)members);
     if(dups != NULL) {
 	ocnodes_free(dups);
         dap_parse_error(state,"Duplicate sequence member names in same sequence: %s",(char*)name);
@@ -309,7 +309,7 @@ dap_makegrid(DAPparsestate* state, Object name, Object arraydecl, Object mapdecl
 {
     OCnode* node;
     /* Check for duplicate map names */
-    OClist* dups = scopeduplicates((OClist*)mapdecls);
+    NClist* dups = scopeduplicates((NClist*)mapdecls);
     if(dups != NULL) {
 	ocnodes_free(dups);
         dap_parse_error(state,"Duplicate grid map names in same grid: %s",(char*)name);
@@ -317,8 +317,8 @@ dap_makegrid(DAPparsestate* state, Object name, Object arraydecl, Object mapdecl
 	return (Object)NULL;
     }
     node = newocnode(name,OC_Grid,state);
-    node->subnodes = (OClist*)mapdecls;
-    oclistinsert(node->subnodes,0,(void*)arraydecl);
+    node->subnodes = (NClist*)mapdecls;
+    nclistinsert(node->subnodes,0,(void*)arraydecl);
     addedges(node);
     return node;
 }
@@ -328,18 +328,18 @@ addedges(OCnode* node)
 {
     unsigned int i;
     if(node->subnodes == NULL) return;
-    for(i=0;i<oclistlength(node->subnodes);i++) {
-        OCnode* subnode = (OCnode*)oclistget(node->subnodes,i);
+    for(i=0;i<nclistlength(node->subnodes);i++) {
+        OCnode* subnode = (OCnode*)nclistget(node->subnodes,i);
 	subnode->container = node;
     }
 }
 
 static void
-setroot(OCnode* root, OClist* ocnodes)
+setroot(OCnode* root, NClist* ocnodes)
 {
     size_t i;
-    for(i=0;i<oclistlength(ocnodes);i++) {
-	OCnode* node = (OCnode*)oclistget(ocnodes,i);
+    for(i=0;i<nclistlength(ocnodes);i++) {
+	OCnode* node = (OCnode*)nclistget(ocnodes,i);
 	node->root = root;
     }
 }
@@ -383,7 +383,7 @@ static OCnode*
 newocnode(char* name, OCtype octype, DAPparsestate* state)
 {
     OCnode* node = ocnode_new(name,octype,state->root);
-    oclistpush(state->ocnodes,(void*)node);
+    nclistpush(state->ocnodes,(void*)node);
     return node;
 }
 
@@ -399,21 +399,21 @@ check_int32(char* val, long* value)
     return ok;
 }
 
-static OClist*
-scopeduplicates(OClist* list)
+static NClist*
+scopeduplicates(NClist* list)
 {
     unsigned int i,j;
-    unsigned int len = oclistlength(list);
-    OClist* dups = NULL;
+    unsigned int len = nclistlength(list);
+    NClist* dups = NULL;
     for(i=0;i<len;i++) {
-	OCnode* io = (OCnode*)oclistget(list,i);
+	OCnode* io = (OCnode*)nclistget(list,i);
 retry:
         for(j=i+1;j<len;j++) {
-	    OCnode* jo = (OCnode*)oclistget(list,j);
+	    OCnode* jo = (OCnode*)nclistget(list,j);
 	    if(strcmp(io->name,jo->name)==0) {
-		if(dups == NULL) dups = oclistnew();
-		oclistpush(dups,jo);
-		oclistremove(list,j);
+		if(dups == NULL) dups = nclistnew();
+		nclistpush(dups,jo);
+		nclistremove(list,j);
 		len--;
 		goto retry;
 	    }
@@ -493,7 +493,7 @@ DAPparse(OCstate* conn, OCtree* tree, char* parsestring)
     DAPparsestate* state = dap_parse_init(parsestring);
     int parseresult;
     OCerror ocerr = OC_NOERR;
-    state->ocnodes = oclistnew();
+    state->ocnodes = nclistnew();
     state->conn = conn;
     if(ocdebug >= 2)
 	dapdebug = 1;
diff --git a/oc2/dapparselex.h b/oc2/dapparselex.h
index 852a721..f2de18f 100644
--- a/oc2/dapparselex.h
+++ b/oc2/dapparselex.h
@@ -20,7 +20,7 @@ typedef void* Object;
 typedef struct DAPlexstate {
     char* input;
     char* next; /* next char in uri.query*/
-    OCbytes* yytext;
+    NCbytes* yytext;
     int lineno;
     /*! Specifies the Lasttoken. */
     int lasttoken;
@@ -28,14 +28,14 @@ typedef struct DAPlexstate {
     char* wordchars1;
     char* wordcharsn;
     char* worddelims;
-    OClist* reclaim; /* reclaim WORD_WORD instances */
+    NClist* reclaim; /* reclaim WORD_WORD instances */
 } DAPlexstate;
 
 /*! Specifies the DAPparsestate. */
 typedef struct DAPparsestate {
     struct OCnode* root;
     DAPlexstate* lexstate;
-    OClist* ocnodes;
+    NClist* ocnodes;
     struct OCstate* conn;
     /* Provide a flag for semantic failures during parse */
     OCerror error; /* OC_EDAPSVC=> we had a server failure; else we had a semantic error */
diff --git a/oc2/oc.c b/oc2/oc.c
index 39f9447..2d9df83 100644
--- a/oc2/oc.c
+++ b/oc2/oc.c
@@ -6,10 +6,11 @@
 #include <assert.h>
 #include <string.h>
 
+#include "netcdf.h"
 #include "ocinternal.h"
 #include "ocdebug.h"
 #include "ocdump.h"
-#include "oclog.h"
+#include "nclog.h"
 #include "occlientparams.h"
 #include "occurlfunctions.h"
 #include "ochttp.h"
@@ -234,12 +235,12 @@ oc_dds_properties(OCobject link,
     if(atomtypep) *atomtypep = node->etype;
     if(rankp) *rankp = node->array.rank;
     if(containerp) *containerp = (OCobject)node->container;
-    if(nsubnodesp) *nsubnodesp = oclistlength(node->subnodes);
+    if(nsubnodesp) *nsubnodesp = nclistlength(node->subnodes);
     if(nattrp) {
         if(node->octype == OC_Attribute) {
-            *nattrp = oclistlength(node->att.values);
+            *nattrp = nclistlength(node->att.values);
         } else {
-            *nattrp = oclistlength(node->attributes);
+            *nattrp = nclistlength(node->attributes);
 	}
     }
     return OCTHROW(OC_NOERR);
@@ -290,7 +291,7 @@ oc_dds_nsubnodes(OCobject link, OCobject ddsnode, size_t* nsubnodesp)
     OCVERIFY(OC_Node,ddsnode);
     OCDEREF(OCnode*,node,ddsnode);
 
-    if(nsubnodesp) *nsubnodesp = oclistlength(node->subnodes);
+    if(nsubnodesp) *nsubnodesp = nclistlength(node->subnodes);
     return OCTHROW(OC_NOERR);
 }
 
@@ -376,9 +377,9 @@ oc_dds_attr_count(OCobject link, OCobject ddsnode, size_t* nattrp)
 
     if(nattrp) {
         if(node->octype == OC_Attribute) {
-            *nattrp = oclistlength(node->att.values);
+            *nattrp = nclistlength(node->att.values);
         } else {
-            *nattrp = oclistlength(node->attributes);
+            *nattrp = nclistlength(node->attributes);
 	}
     }
     return OCTHROW(OC_NOERR);
@@ -454,10 +455,10 @@ oc_dds_ithfield(OCobject link, OCobject ddsnode, size_t index, OCobject* fieldno
     if(!ociscontainer(node->octype))
 	return OCTHROW(OC_EBADTYPE);
 
-    if(index >= oclistlength(node->subnodes))
+    if(index >= nclistlength(node->subnodes))
 	return OCTHROW(OC_EINDEX);
 
-    field = (OCnode*)oclistget(node->subnodes,index);
+    field = (OCnode*)nclistget(node->subnodes,index);
     if(fieldnodep) *fieldnodep = (OCobject)field;
     return OCTHROW(OC_NOERR);
 }
@@ -597,7 +598,7 @@ oc_dds_dimensions(OCobject link, OCobject ddsnode, OCobject* dims)
     if(node->array.rank == 0) return OCTHROW(OCTHROW(OC_ESCALAR));
     if(dims != NULL) {
         for(i=0;i<node->array.rank;i++) {
-            OCnode* dim = (OCnode*)oclistget(node->array.dimensions,i);
+            OCnode* dim = (OCnode*)nclistget(node->array.dimensions,i);
 	    dims[i] = (OCobject)dim;
 	}
     }
@@ -628,7 +629,7 @@ oc_dds_ithdimension(OCobject link, OCobject ddsnode, size_t index, OCobject* dim
 
     if(node->array.rank == 0) return OCTHROW(OCTHROW(OC_ESCALAR));
     if(index >= node->array.rank) return OCTHROW(OCTHROW(OC_EINDEX));
-    dimid = (OCobject)oclistget(node->array.dimensions,index);
+    dimid = (OCobject)nclistget(node->array.dimensions,index);
     if(dimidp) *dimidp = dimid;
     return OCTHROW(OC_NOERR);
 }
@@ -687,7 +688,7 @@ oc_dds_dimensionsizes(OCobject link, OCobject ddsnode, size_t* dimsizes)
     if(dimsizes != NULL) {
 	size_t i;
         for(i=0;i<node->array.rank;i++) {
-            OCnode* dim = (OCnode*)oclistget(node->array.dimensions,i);
+            OCnode* dim = (OCnode*)nclistget(node->array.dimensions,i);
 	    dimsizes[i] = dim->dim.declsize;
 	}
     }
@@ -733,9 +734,9 @@ oc_dds_attr(OCobject link, OCobject ddsnode, size_t index,
     OCVERIFY(OC_Node,ddsnode);
     OCDEREF(OCnode*,node,ddsnode);
 
-    nattrs = oclistlength(node->attributes);
+    nattrs = nclistlength(node->attributes);
     if(index >= nattrs) return OCTHROW(OCTHROW(OC_EINDEX));
-    attr = (OCattribute*)oclistget(node->attributes,index);
+    attr = (OCattribute*)nclistget(node->attributes,index);
     if(namep) *namep = strdup(attr->name);
     if(octypep) *octypep = attr->etype;
     if(nvaluesp) *nvaluesp = attr->nvalues;
@@ -783,7 +784,7 @@ oc_das_attr_count(OCobject link, OCobject dasnode, size_t* nvaluesp)
     OCVERIFY(OC_Node,dasnode);
     OCDEREF(OCnode*,attr,dasnode);
     if(attr->octype != OC_Attribute) return OCTHROW(OCTHROW(OC_EBADTYPE));
-    if(nvaluesp) *nvaluesp = oclistlength(attr->att.values);
+    if(nvaluesp) *nvaluesp = nclistlength(attr->att.values);
     return OCTHROW(OC_NOERR);
 }
 
@@ -818,10 +819,10 @@ oc_das_attr(OCobject link, OCobject dasnode, size_t index, OCtype* atomtypep, ch
     OCDEREF(OCnode*,attr,dasnode);
 
     if(attr->octype != OC_Attribute) return OCTHROW(OCTHROW(OC_EBADTYPE));
-    nvalues = oclistlength(attr->att.values);
+    nvalues = nclistlength(attr->att.values);
     if(index >= nvalues) return OCTHROW(OCTHROW(OC_EINDEX));
     if(atomtypep) *atomtypep = attr->etype;
-    if(valuep) *valuep = nulldup((char*)oclistget(attr->att.values,index));
+    if(valuep) *valuep = nulldup((char*)nclistget(attr->att.values,index));
     return OCTHROW(OC_NOERR);
 }
 
@@ -1966,17 +1967,17 @@ oc_data_ddpath(OCobject link, OCobject datanode, char** resultp)
 {
     OCstate* state;
     OCdata* data;
-    OCbytes* buffer;
+    NCbytes* buffer;
 
     OCVERIFY(OC_State,link);
     OCDEREF(OCstate*,state,link);
     OCVERIFY(OC_Data,datanode);
     OCDEREF(OCdata*,data,datanode);
 
-    buffer = ocbytesnew();
+    buffer = ncbytesnew();
     ocdumpdatapath(state,data,buffer);
-    if(resultp) *resultp = ocbytesdup(buffer);
-    ocbytesfree(buffer);
+    if(resultp) *resultp = ncbytesdup(buffer);
+    ncbytesfree(buffer);
     return OCTHROW(OC_NOERR);
 }
 
@@ -1985,16 +1986,16 @@ oc_data_ddtree(OCobject link, OCobject ddsroot)
 {
     OCstate* state;
     OCdata* data;
-    OCbytes* buffer;
+    NCbytes* buffer;
     OCVERIFY(OC_State,link);
     OCDEREF(OCstate*,state,link);
     OCVERIFY(OC_Data,ddsroot);
     OCDEREF(OCdata*,data,ddsroot);
 
-    buffer = ocbytesnew();
+    buffer = ncbytesnew();
     ocdumpdatatree(state,data,buffer,0);
-    fprintf(stderr,"%s\n",ocbytescontents(buffer));
-    ocbytesfree(buffer);
+    fprintf(stderr,"%s\n",ncbytescontents(buffer));
+    ncbytesfree(buffer);
     return OCTHROW(OC_NOERR);
 }
 
@@ -2083,11 +2084,11 @@ oc_set_netrc(OClink* link, const char* file)
 
     if(file == NULL || strlen(file) == 0)
 	return OC_EINVAL;
-    oclog(OCLOGDBG,"OC: using netrc file: %s",file);
+    nclog(OCLOGDBG,"OC: using netrc file: %s",file);
     /* See if it exists and is readable; complain if not */
     f = fopen(file,"r");
     if(f == NULL)
-	oclog(OCLOGWARN,"OC: netrc file is not readable; continuing");
+	nclog(NCLOGWARN,"OC: netrc file is not readable; continuing");
     else {
 	fclose(f);
     }
diff --git a/oc2/oc.h b/oc2/oc.h
index e0fa0ad..a51dcc9 100644
--- a/oc2/oc.h
+++ b/oc2/oc.h
@@ -582,10 +582,7 @@ extern OCerror oc_ping(const char* url);
    data chunk returned by the server for a given tree.
    Zero implies it is not defined.
 */
-/* For some reason, the MSVC compiler doesn't like this. */
-#ifndef _WIN32
 extern OCerror oc_raw_xdrsize(OClink,OCddsnode,off_t*);
-#endif
 
 #ifdef __cplusplus
 }
diff --git a/oc2/ocbytes.c b/oc2/ocbytes.c
deleted file mode 100644
index b2b3447..0000000
--- a/oc2/ocbytes.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
-   See the COPYRIGHT file for more information. */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "ocbytes.h"
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#define DEFAULTALLOC 1024
-#define ALLOCINCR 1024
-
-static int ocbytesdebug = 1;
-
-static long
-ocbytesfail(void)
-{
-    fflush(stdout);
-    fprintf(stderr,"bytebuffer failure\n");
-    fflush(stderr);
-    if(ocbytesdebug) abort();
-    return FALSE;
-}
-
-OCbytes*
-ocbytesnew(void)
-{
-  OCbytes* bb = (OCbytes*)malloc(sizeof(OCbytes));
-  if(bb == NULL) return (OCbytes*)ocbytesfail();
-  bb->alloc=0;
-  bb->length=0;
-  bb->content=NULL;
-  bb->nonextendible = 0;
-  return bb;
-}
-
-int
-ocbytessetalloc(OCbytes* bb, size_t sz)
-{
-  char* newcontent;
-  if(bb == NULL) return ocbytesfail();
-  if(sz <= 0) {sz = (bb->alloc?2*bb->alloc:DEFAULTALLOC);}
-  if(bb->alloc >= sz) return TRUE;
-  if(bb->nonextendible) return ocbytesfail();
-  newcontent=(char*)calloc(sz,sizeof(char));
-  if(newcontent == NULL) return FALSE;
-  if(bb->alloc > 0 && bb->length > 0 && bb->content != NULL) {
-    memcpy((void*)newcontent,(void*)bb->content,sizeof(char)*bb->length);
-  }
-  if(bb->content != NULL) free(bb->content);
-  bb->content=newcontent;
-  bb->alloc=sz;
-  return TRUE;
-}
-
-void
-ocbytesfree(OCbytes* bb)
-{
-  if(bb == NULL) return;
-  if(!bb->nonextendible && bb->content != NULL) free(bb->content);
-  free(bb);
-}
-
-int
-ocbytessetlength(OCbytes* bb, size_t sz)
-{
-  if(bb == NULL) return ocbytesfail();
-  if(bb->length < sz) {
-      if(sz > bb->alloc) {if(!ocbytessetalloc(bb,sz)) return ocbytesfail();}
-  }
-  bb->length = sz;
-  return TRUE;
-}
-
-int
-ocbytesfill(OCbytes* bb, char fill)
-{
-  size_t i;
-  if(bb == NULL) return ocbytesfail();
-  for(i=0;i<bb->length;i++) bb->content[i] = fill;
-  return TRUE;
-}
-
-int
-ocbytesget(OCbytes* bb, size_t index)
-{
-  if(bb == NULL) return -1;
-  if(index >= bb->length) return -1;
-  return bb->content[index];
-}
-
-int
-ocbytesset(OCbytes* bb, size_t index, char elem)
-{
-  if(bb == NULL) return ocbytesfail();
-  if(index >= bb->length) return ocbytesfail();
-  bb->content[index] = elem;
-  return TRUE;
-}
-
-int
-ocbytesappend(OCbytes* bb, int elem)
-{
-  if(bb == NULL) return ocbytesfail();
-  /* We need space for the char + null */
-  while(bb->length+1 >= bb->alloc) {
-	if(!ocbytessetalloc(bb,0)) return ocbytesfail();
-  }
-  bb->content[bb->length] = (char)elem;
-  bb->length++;
-  bb->content[bb->length] = '\0';
-  return TRUE;
-}
-
-/* This assumes s is a null terminated string*/
-int
-ocbytescat(OCbytes* bb, const char* s)
-{
-    ocbytesappendn(bb,(void*)s,strlen(s)+1); /* include trailing null*/
-    /* back up over the trailing null*/
-    if(bb->length == 0) return ocbytesfail();
-    bb->length--;
-    return 1;
-}
-
-int
-ocbytesappendn(OCbytes* bb, const void* elem, size_t n)
-{
-  if(bb == NULL || elem == NULL) return ocbytesfail();
-  if(n == 0) {n = strlen((char*)elem);}
-  while(!ocbytesavail(bb,n+1)) {
-    if(!ocbytessetalloc(bb,0)) return ocbytesfail();
-  }
-  memcpy((void*)&bb->content[bb->length],(void*)elem,n);
-  bb->length += n;
-  bb->content[bb->length] = '\0';
-  return TRUE;
-}
-
-int
-ocbytesprepend(OCbytes* bb, char elem)
-{
-  int i; /* do not make unsigned */
-  if(bb == NULL) return ocbytesfail();
-  if(bb->length >= bb->alloc) if(!ocbytessetalloc(bb,0)) return ocbytesfail();
-  /* could we trust memcpy? instead */
-  for(i=bb->alloc;i>=1;i--) {bb->content[i]=bb->content[i-1];}
-  bb->content[0] = elem;
-  bb->length++;
-  return TRUE;
-}
-
-char*
-ocbytesdup(OCbytes* bb)
-{
-    char* result = (char*)malloc(bb->length+1);
-    memcpy((void*)result,(const void*)bb->content,bb->length);
-    result[bb->length] = '\0'; /* just in case it is a string*/
-    return result;
-}
-
-char*
-ocbytesextract(OCbytes* bb)
-{
-    char* result = bb->content;
-    bb->alloc = 0;
-    bb->length = 0;
-    bb->content = NULL;
-    return result;
-}
-
-int
-ocbytessetcontents(OCbytes* bb, char* contents, size_t alloc)
-{
-    if(bb == NULL) return ocbytesfail();
-    ocbytesclear(bb);
-    if(!bb->nonextendible && bb->content != NULL) free(bb->content);
-    bb->content = contents;
-    bb->length = 0;
-    bb->alloc = alloc;
-    bb->nonextendible = 1;
-    return 1;
-}
-
-/* Null terminate the byte string without extending its length */
-/* For debugging */
-int
-ocbytesnull(OCbytes* bb)
-{
-    ocbytesappend(bb,'\0');
-    bb->length--;
-    return 1;
-}
-
diff --git a/oc2/ocbytes.h b/oc2/ocbytes.h
deleted file mode 100644
index 55929e1..0000000
--- a/oc2/ocbytes.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
-   See the COPYRIGHT file for more information. */
-
-#ifndef OCBYTES_H
-#define OCBYTES_H 1
-
-typedef struct OCbytes {
-  int nonextendible; /* 1 => fail if an attempt is made to extend this buffer*/
-  size_t alloc;
-  size_t length;
-  char* content;
-} OCbytes;
-
-#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
-#define EXTERNC extern "C"
-#else
-#define EXTERNC extern
-#endif
-
-EXTERNC OCbytes* ocbytesnew(void);
-EXTERNC void ocbytesfree(OCbytes*);
-EXTERNC int ocbytessetalloc(OCbytes*,size_t);
-EXTERNC int ocbytessetlength(OCbytes*,size_t);
-EXTERNC int ocbytesfill(OCbytes*, char fill);
-
-/* Produce a duplicate of the contents*/
-EXTERNC char* ocbytesdup(OCbytes*);
-/* Extract the contents and leave buffer empty */
-EXTERNC char* ocbytesextract(OCbytes*);
-
-/* Return the ith byte; -1 if no such index */
-EXTERNC int ocbytesget(OCbytes*,size_t);
-/* Set the ith byte */
-EXTERNC int ocbytesset(OCbytes*,size_t,char);
-
-/* Append one byte */
-EXTERNC int ocbytesappend(OCbytes*,int); /* Add at Tail */
-/* Append n bytes */
-EXTERNC int ocbytesappendn(OCbytes*,const void*,size_t); /* Add at Tail */
-
-/* Null terminate the byte string without extending its length (for debugging) */
-EXTERNC int ocbytesnull(OCbytes*);
-
-/* Concatenate a null-terminated string to the end of the buffer */
-EXTERNC int ocbytescat(OCbytes*,const char*);
-
-/* Set the contents of the buffer; mark the buffer as non-extendible */
-EXTERNC int ocbytessetcontents(OCbytes*, char*, size_t);
-
-/* Following are always "in-lined"*/
-#define ocbyteslength(bb) ((bb)!=NULL?(bb)->length:0)
-#define ocbytesalloc(bb) ((bb)!=NULL?(bb)->alloc:0)
-#define ocbytescontents(bb) (((bb)!=NULL && (bb)->content!=NULL)?(bb)->content:(char*)"")
-#define ocbytesextend(bb,len) ocbytessetalloc((bb),(len)+(bb->alloc))
-#define ocbytesclear(bb) ((bb)!=NULL?(bb)->length=0:0)
-#define ocbytesavail(bb,n) ((bb)!=NULL?((bb)->alloc - (bb)->length) >= (n):0)
-
-#endif /*OCBYTES_H*/
diff --git a/oc2/occlientparams.c b/oc2/occlientparams.c
index b7f8036..d56cc75 100644
--- a/oc2/occlientparams.c
+++ b/oc2/occlientparams.c
@@ -8,124 +8,22 @@
 #define LBRACKET '['
 #define RBRACKET ']'
 
-
-
-/*
-Client parameters are assumed to be
-one or more instances of bracketed pairs:
-e.g "[...][...]...".
-The bracket content in turn is assumed to be a
-comma separated list of <name>=<value> pairs.
-e.g. x=y,z=,a=b.
-If the same parameter is specifed more than once,
-then the first occurrence is used; this is so that
-is possible to forcibly override user specified
-parameters by prefixing.
-IMPORTANT: client parameter string is assumed to
-have blanks compress out.
-*/
-
-int
-ocparamdecode(OCstate* state)
-{
-    int i;
-    i = ocuridecodeparams(state->uri);
-    return i?OC_NOERR:OC_EBADURL;
-}
-
-
 const char*
 ocparamlookup(OCstate* state, const char* key)
 {
     const char* value = NULL;
     if(state == NULL || key == NULL || state->uri == NULL) return NULL;
-    if(!ocurilookup(state->uri,key,&value))
-	value = NULL;
+    value = ncurilookup(state->uri,key);
     return value;
 }
 
+#if 0
 int
 ocparamset(OCstate* state, const char* params)
 {
     int i;
-    i = ocurisetparams(state->uri,params);
+    i = ncurisetparams(state->uri,params);
     return i?OC_NOERR:OC_EBADURL;
 }
-
-#ifdef OCIGNORE
-void
-ocparamfree(OClist* params)
-{
-    int i;
-    if(params == NULL) return;
-    for(i=0;i<oclistlength(params);i++) {
-	char* s = (char*)oclistget(params,i);
-	if(s != NULL) free((void*)s);
-    }
-    oclistfree(params);
-}
-
-/*
-Delete the entry.
-return value = 1 => found and deleted;
-               0 => param not found
-*/
-int
-ocparamdelete(OClist* params, const char* clientparam)
-{
-    int i,found = 0;
-    if(params == NULL || clientparam == NULL) return 0;
-    for(i=0;i<oclistlength(params);i+=2) {
-	char* name = (char*)oclistget(params,i);
-	if(strcmp(clientparam,name)==0) {found=1; break;}
-    }
-    if(found) {
-	oclistremove(params,i+1); /* remove value */
-	oclistremove(params,i); /* remove name */
-    }
-    return found;
-}
-
-
-/*
-Insert new client param (name,value);
-return value = 1 => not already defined
-               0 => param already defined (no change)
-*/
-int
-ocparaminsert(OClist* params, const char* clientparam, const char* value)
-{
-    int i;
-    if(params == NULL || clientparam == NULL) return 0;
-    for(i=0;i<oclistlength(params);i+=2) {
-	char* name = (char*)oclistget(params,i);
-	if(strcmp(clientparam,name)==0) return 0;
-    }
-    /* not found, append */
-    oclistpush(params,(ocelem)nulldup(clientparam));
-    oclistpush(params,(ocelem)nulldup(value));
-    return 1;
-}
-
-
-/*
-Replace new client param (name,value);
-return value = 1 => replacement performed
-               0 => insertion performed
-*/
-int
-ocparamreplace(OClist* params, const char* clientparam, const char* value)
-{
-    int i;
-    if(params == NULL || clientparam == NULL) return 0;
-    for(i=0;i<oclistlength(params);i+=2) {
-	char* name = (char*)oclistget(params,i);
-	if(strcmp(clientparam,name)==0) {
-	    oclistinsert(params,i+1,(ocelem)nulldup(value));
-	    return 1;
-	}
-    }
-    ocparaminsert(params,clientparam,value);
-    return 0;
-}
 #endif
+
diff --git a/oc2/occlientparams.h b/oc2/occlientparams.h
index c2eda7b..22b58c7 100644
--- a/oc2/occlientparams.h
+++ b/oc2/occlientparams.h
@@ -4,7 +4,7 @@
 #ifndef OCCLIENTPARAMS_H
 #define OCCLIENTPARAMS_H
 
-extern OClist* ocparamdecode(OCstate*);
+extern NClist* ocparamdecode(OCstate*);
 extern const char* ocparamlookup(OCstate*, const char*);
 extern void ocparamset(OCstate*,const char*);
 
diff --git a/oc2/occompile.c b/oc2/occompile.c
index a9c17f0..0c74c49 100644
--- a/oc2/occompile.c
+++ b/oc2/occompile.c
@@ -61,10 +61,10 @@ occompile(OCstate* state, OCnode* xroot)
 
 #ifdef OCDEBUG
 {
-    OCbytes* buffer = ocbytesnew();
+    Ncbytes* buffer = ncbytesnew();
     ocdumpdatatree(state,data,buffer,0);
-    fprintf(stderr,"datatree:\n%s",ocbytescontents(buffer));
-    ocbytesfree(buffer);
+    fprintf(stderr,"datatree:\n%s",ncbytescontents(buffer));
+    ncbytesfree(buffer);
 }
 #endif
     return OCTHROW(ocstat);
@@ -77,7 +77,7 @@ occompile1(OCstate* state, OCnode* xnode, XXDR* xxdrs, OCdata** datap)
     size_t i;
     OCdata* data = NULL;
     size_t nelements = 0;
-    OClist* records = NULL;
+    NClist* records = NULL;
 
     /* Allocate instance for this node */
     data = newocdata(xnode);
@@ -136,10 +136,10 @@ occompile1(OCstate* state, OCnode* xnode, XXDR* xxdrs, OCdata** datap)
 
     case OC_Sequence:
 	/* Since we do not know the # records beforehand,
-           use a oclist to collect the record instances.
+           use a list to collect the record instances.
         */
 	fset(data->datamode,OCDT_SEQUENCE);
-	records = oclistnew();
+	records = nclistnew();
 	for(nelements=0;;nelements++) {
             /* pick up the sequence record begin marker*/
             char tmp[sizeof(unsigned int)];
@@ -154,22 +154,22 @@ occompile1(OCstate* state, OCnode* xnode, XXDR* xxdrs, OCdata** datap)
 		/* Capture the back link */
 		record->container = data;
 		record->index = nelements;
-		oclistpush(records,(void*)record);
+		nclistpush(records,(void*)record);
 		record = NULL;
             } else if(tmp[0] == EndOfSequence) {
                 break; /* we are done with the this sequence instance*/
             } else {
-		oclog(OCLOGERR,"missing/invalid begin/end record marker\n");
+		nclog(NCLOGERR,"missing/invalid begin/end record marker\n");
                 ocstat = OC_EINVALCOORDS;
 		goto fail;
             }
 	}
-        OCASSERT(nelements == oclistlength(records));
+        OCASSERT(nelements == nclistlength(records));
 	/* extract the content */
 	data->ninstances = nelements;
-	data->instances = (OCdata**)oclistdup(records);
+	data->instances = (OCdata**)nclistdup(records);
 	MEMGOTO(data,ocstat,fail);
-	oclistfree(records);	    
+	nclistfree(records);	    
 	records = NULL;
         break;
 
@@ -200,9 +200,9 @@ fail:
     ocerrorstring(xxdrs);
 
     if(records != NULL) {
-	for(i=0;i<oclistlength(records);i++)
-	    ocdata_free(state,(OCdata*)oclistget(records,i));
-	oclistfree(records);
+	for(i=0;i<nclistlength(records);i++)
+	    ocdata_free(state,(OCdata*)nclistget(records,i));
+	nclistfree(records);
     }
 
     if(data != NULL)
@@ -243,7 +243,7 @@ occompilefields(OCstate* state, OCdata* data, XXDR* xxdrs, int istoplevel)
     OCnode* xnode = data->pattern;
 
     assert(data != NULL);
-    nelements = oclistlength(xnode->subnodes);
+    nelements = nclistlength(xnode->subnodes);
     if(nelements == 0)
 	goto done;
     data->instances = (OCdata**)malloc(nelements*sizeof(OCdata*));
@@ -251,7 +251,7 @@ occompilefields(OCstate* state, OCdata* data, XXDR* xxdrs, int istoplevel)
     for(i=0;i<nelements;i++) {
         OCnode* fieldnode;
         OCdata* fieldinstance;
-	fieldnode = (OCnode*)oclistget(xnode->subnodes,i);
+	fieldnode = (OCnode*)nclistget(xnode->subnodes,i);
         ocstat = occompile1(state,fieldnode,xxdrs,&fieldinstance);
 	if(ocstat != OC_NOERR)
 	    goto fail;
@@ -266,7 +266,7 @@ occompilefields(OCstate* state, OCdata* data, XXDR* xxdrs, int istoplevel)
     /* If top-level, then link the OCnode to the OCdata directly */
     if(istoplevel) {
 	for(i=0;i<nelements;i++) {
-            OCnode* fieldnode = (OCnode*)oclistget(xnode->subnodes,i);
+            OCnode* fieldnode = (OCnode*)nclistget(xnode->subnodes,i);
             OCdata* fieldinstance = data->instances[i];
 	    fieldnode->data = fieldinstance;
 	}
@@ -459,7 +459,7 @@ ocerrorstring(XXDR* xdrs)
     if(ocstrncmp(data,tag,sizeof(tag))==0) {
 	char* p;
         if((p=strchr(data,'}')) != NULL) *(++p)='\0';
-        oclog(OCLOGERR,"Server error: %s",data);
+        nclog(NCLOGERR,"Server error: %s",data);
         /* Since important, report to stderr as well */
         fprintf(stderr,"Server error: %s",data);
 	return 1;
diff --git a/oc2/occonstraints.h b/oc2/occonstraints.h
index 2bc5f98..4ea31ef 100644
--- a/oc2/occonstraints.h
+++ b/oc2/occonstraints.h
@@ -15,14 +15,14 @@ typedef struct OCslice {
 
 /*! Specifies a form of path where each element can have a set of associated indices */
 typedef struct OCpath {
-    OClist* names;
-    OClist* indexsets; /* oclist<oclist<Slice>> */
+    NClist* names;
+    NClist* indexsets; /* oclist<oclist<Slice>> */
 } OCpath;
 
 /*! Specifies a ProjectionClause. */
 typedef struct OCprojectionclause {
     char* target; /* "variable name" as mentioned in the projection */
-    OClist* indexsets; /* oclist<oclist<OCslice>> */
+    NClist* indexsets; /* oclist<oclist<OCslice>> */
     struct OCnode* node; /* node with name matching target, if any. */
     int    gridconstraint; /*  used only for testing purposes */
 } OCprojectionclause;
@@ -32,7 +32,7 @@ typedef struct OCselectionclause {
     int op;
     char* value;
     struct OCselectionclause* lhs;
-    OClist* rhs;
+    NClist* rhs;
 } OCselectionclause;
 
 
diff --git a/oc2/occurlfunctions.c b/oc2/occurlfunctions.c
index 38c78a0..c49077e 100644
--- a/oc2/occurlfunctions.c
+++ b/oc2/occurlfunctions.c
@@ -188,7 +188,7 @@ ocset_curlflag(OCstate* state, int flag)
     default: {
 	struct OCCURLFLAG* f = occurlflagbyflag(flag);
 	if(f != NULL)
-	    oclog(OCLOGWARN,"Attempt to update unexpected curl flag: %s",
+	    nclog(NCLOGWARN,"Attempt to update unexpected curl flag: %s",
 				f->name);
 	} break;
     }
@@ -334,8 +334,8 @@ oc_curl_protocols(struct OCGLOBALSTATE* state)
         if(strcmp("http",*proto)==0) {state->curl.proto_https=1;}
     }
     if(ocdebug > 0) {
-        oclog(OCLOGNOTE,"Curl file:// support = %d",state->curl.proto_file);
-        oclog(OCLOGNOTE,"Curl https:// support = %d",state->curl.proto_https);
+        nclog(NCLOGNOTE,"Curl file:// support = %d",state->curl.proto_file);
+        nclog(NCLOGNOTE,"Curl https:// support = %d",state->curl.proto_https);
     }
 }
 
@@ -436,7 +436,7 @@ ocset_curlstate(OCstate* state, int flag, void* value)
     default: {
 	struct OCCURLFLAG* f = occurlflagbyflag(flag);
 	if(f != NULL)
-	    oclog(OCLOGWARN,"Attempt to add unexpected curl flag to state: %s",
+	    nclog(NCLOGWARN,"Attempt to add unexpected curl flag to state: %s",
 				f->name);
 	} break;
     }
diff --git a/oc2/occurlfunctions.h b/oc2/occurlfunctions.h
index 47c8380..f4b00b5 100644
--- a/oc2/occurlfunctions.h
+++ b/oc2/occurlfunctions.h
@@ -30,6 +30,6 @@ extern void oc_curl_protocols(struct OCGLOBALSTATE*);
 extern struct OCCURLFLAG* occurlflags(void);
 extern struct OCCURLFLAG* occurlflagbyname(const char*);
 extern struct OCCURLFLAG* occurlflagbyflag(int);
-extern char*  occombinehostport(const OCURI* uri);
+extern char*  occombinehostport(const NCURI* uri);
 
 #endif /*_CURLFUNCTION_H_*/
diff --git a/oc2/ocdata.c b/oc2/ocdata.c
index cec5880..6adc607 100644
--- a/oc2/ocdata.c
+++ b/oc2/ocdata.c
@@ -14,9 +14,9 @@ static OCerror ocread(OCdata*, XXDR*, char*, size_t, size_t, size_t);
 static void
 octrace(char* proc, OCstate* state, OCdata* data)
 {
-    OCbytes* buffer = ocbytesnew();
+    NCbytes* buffer = ncbytesnew();
     ocdumpdatapath(state,data,buffer);
-    fprintf(stderr,"%s: %s\n",proc,ocbytescontents(buffer));
+    fprintf(stderr,"%s: %s\n",proc,ncbytescontents(buffer));
 }
 
 #else
@@ -320,7 +320,7 @@ ocread(OCdata* data, XXDR* xdrs, char* memory, size_t memsize, size_t start, siz
 
     case OC_Int32: case OC_UInt32: case OC_Float32:
 	xxdr_setpos(xdrs,data->xdroffset+xdrstart);
-	if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {OCTHROW(OC_EDATADDS); goto xdrfail;}
+	if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {goto xdrfail;}
 	if(!xxdr_network_order) {
 	    unsigned int* p;
 	    for(p=(unsigned int*)memory,i=0;i<count;i++,p++) {
@@ -331,7 +331,7 @@ ocread(OCdata* data, XXDR* xdrs, char* memory, size_t memsize, size_t start, siz
 	
     case OC_Int64: case OC_UInt64:
 	xxdr_setpos(xdrs,data->xdroffset+xdrstart);
-	if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {OCTHROW(OC_EDATADDS); goto xdrfail;}
+	if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {goto xdrfail;}
 	if(!xxdr_network_order) {
 	    unsigned long long* llp;
 	    for(llp=(unsigned long long*)memory,i=0;i<count;i++,llp++) {
@@ -342,7 +342,7 @@ ocread(OCdata* data, XXDR* xdrs, char* memory, size_t memsize, size_t start, siz
 
     case OC_Float64:
 	xxdr_setpos(xdrs,data->xdroffset+xdrstart);
-	if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {OCTHROW(OC_EDATADDS); goto xdrfail;}
+	if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {goto xdrfail;}
 	{
 	    double* dp;
 	    for(dp=(double*)memory,i=0;i<count;i++,dp++) {
@@ -360,13 +360,13 @@ ocread(OCdata* data, XXDR* xdrs, char* memory, size_t memsize, size_t start, siz
            its memory size */
         xxdr_setpos(xdrs,data->xdroffset+xdrstart);
         if(scalar) {
-	    if(!xxdr_ushort(xdrs,(unsigned short*)memory)) {OCTHROW(OC_EDATADDS); goto xdrfail;}
+	    if(!xxdr_ushort(xdrs,(unsigned short*)memory)) {goto xdrfail;}
 	} else {
 	    unsigned short* sp = (unsigned short*)memory;
 	    for(i=0;i<count;i++,sp++) {
 	        unsigned int tmp;
 		if(!xxdr_getbytes(xdrs,(char*)&tmp,(off_t)XDRUNIT))
-		    {OCTHROW(OC_EDATADDS); goto xdrfail;}
+		    {goto xdrfail;}
 		/* convert from network order if necessary */
 		if(!xxdr_network_order)
 		    swapinline32(&tmp);
@@ -383,12 +383,12 @@ ocread(OCdata* data, XXDR* xdrs, char* memory, size_t memsize, size_t start, siz
 	if(scalar) {
 	    /* scalar bytes are stored in xdr as int */
 	    xxdr_setpos(xdrs,data->xdroffset+xdrstart);
-	    if(!xxdr_uchar(xdrs,(unsigned char*)memory)) {OCTHROW(OC_EDATADDS); goto xdrfail;}
+	    if(!xxdr_uchar(xdrs,(unsigned char*)memory)) {goto xdrfail;}
 	} else {
 	    /* the xdroffset will always be at the start of the
                packed data, so we need to add the start count to it */
 	    xxdr_setpos(xdrs,data->xdroffset+xdrstart);
-	    if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {OCTHROW(OC_EDATADDS); goto xdrfail;}
+	    if(!xxdr_getbytes(xdrs,memory,xdrtotal)) {goto xdrfail;}
 	}
 	break;
 
@@ -404,7 +404,7 @@ ocread(OCdata* data, XXDR* xdrs, char* memory, size_t memsize, size_t start, siz
             xxdr_setpos(xdrs,offset);
             /* get the string */
 	    if(!xxdr_string(xdrs,sp,&len))
-		{OCTHROW(OC_EDATADDS); goto xdrfail;}
+		{goto xdrfail;}
 	}
         } break;
 
@@ -414,7 +414,7 @@ ocread(OCdata* data, XXDR* xdrs, char* memory, size_t memsize, size_t start, siz
     return OC_NOERR;
 
 xdrfail:
-    oclog(OCLOGERR,"DAP DATADDS packet is apparently too short");
+    nclog(NCLOGERR,"DAP DATADDS packet is apparently too short");
     return OCTHROW(OC_EDATADDS);
 }
 
diff --git a/oc2/ocdebug.c b/oc2/ocdebug.c
index 5776921..986c888 100644
--- a/oc2/ocdebug.c
+++ b/oc2/ocdebug.c
@@ -26,7 +26,7 @@ occatch(OCerror err)
 int
 xxdrerror(void)
 {
-    oclog(OCLOGERR,"xdr failure");
+    nclog(NCLOGERR,"xdr failure");
     return OCCATCH(OC_EDATADDS);
 }
 
@@ -41,7 +41,7 @@ void*
 ocmalloc(size_t size)
 {
     void* memory = calloc(size,1); /* use calloc to zero memory*/
-    if(memory == NULL) oclog(OCLOGERR,"ocmalloc: out of memory");
+    if(memory == NULL) nclog(NCLOGERR,"ocmalloc: out of memory");
     return memory;
 }
 
diff --git a/oc2/ocdebug.h b/oc2/ocdebug.h
index 58e3098..0bae593 100644
--- a/oc2/ocdebug.h
+++ b/oc2/ocdebug.h
@@ -26,7 +26,7 @@
    to catch the failure. Turing it on incurs a significant
    performance penalty, so it is off by default.*/
 
-#define OCCATCHERROR
+#undef OCCATCHERROR
 
 #define OCPANIC(msg) assert(ocpanic(msg))
 #define OCPANIC1(msg,arg) assert(ocpanic(msg,arg))
@@ -96,7 +96,6 @@ extern CURLcode ocreportcurlerror(struct OCstate* state, CURLcode cstat);
 #define OCCATCH(e) (e)
 #define OCCATCHCHK(e)
 #define OCGOTO(label) goto label
-#define CURLERR(s,e) (e)
 #define OCCURLERR(s,e) (e)
 #define CURLERR(e) (e)
 #endif
diff --git a/oc2/ocdump.c b/oc2/ocdump.c
index a5eca30..205b015 100644
--- a/oc2/ocdump.c
+++ b/oc2/ocdump.c
@@ -3,19 +3,10 @@
 */
 
 #include "config.h"
-#include <sys/stat.h>
-
-#ifdef NETINET_IN_H
-#include <netinet/in.h>
-#endif
 
-#ifndef HAVE_SSIZE_T
-#ifdef SSIZE_T
-#define ssize_t SSIZE_T
-#else
-#define ssize_t int
-#endif
-#define HAVE_SSIZE_T
+#include <stdlib.h>
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
 #endif
 
 #include "ocinternal.h"
@@ -48,19 +39,19 @@ static char*
 dent2(int n) {return dent(n+4);}
 
 static void
-tabto(int pos, OCbytes* buffer)
+tabto(int pos, NCbytes* buffer)
 {
     int bol,len,pad;
-    len = ocbyteslength(buffer);
+    len = ncbyteslength(buffer);
     /* find preceding newline */
     for(bol=len-1;;bol--) {
-	int c = ocbytesget(buffer,(size_t)bol);
+	int c = ncbytesget(buffer,(size_t)bol);
 	if(c < 0) break;
 	if(c == '\n') {bol++; break;}
     }
     len = (len - bol);
     pad = (pos - len);
-    while(pad-- > 0) ocbytescat(buffer," ");
+    while(pad-- > 0) ncbytescat(buffer," ");
 }
 
 void
@@ -92,8 +83,8 @@ dumpocnode1(OCnode* node, int depth)
         fprintf(stdout,"[%2d]%s ",depth,dent(depth));
 	fprintf(stdout,"dataset %s\n",
 		(node->name?node->name:""));
-	for(n=0;n<oclistlength(node->subnodes);n++) {
-	    dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1);
+	for(n=0;n<nclistlength(node->subnodes);n++) {
+	    dumpocnode1((OCnode*)nclistget(node->subnodes,n),depth+1);
 	}
     } break;
 
@@ -104,8 +95,8 @@ dumpocnode1(OCnode* node, int depth)
 	dumpdimensions(node);
 	fprintf(stdout," &%lx",(unsigned long)node);
 	fprintf(stdout,"\n");
-	for(n=0;n<oclistlength(node->subnodes);n++) {
-	    dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1);
+	for(n=0;n<nclistlength(node->subnodes);n++) {
+	    dumpocnode1((OCnode*)nclistget(node->subnodes,n),depth+1);
 	}
     } break;
 
@@ -116,8 +107,8 @@ dumpocnode1(OCnode* node, int depth)
 	dumpdimensions(node);
 	fprintf(stdout," &%lx",(unsigned long)node);
 	fprintf(stdout,"\n");
-	for(n=0;n<oclistlength(node->subnodes);n++) {
-	    dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1);
+	for(n=0;n<nclistlength(node->subnodes);n++) {
+	    dumpocnode1((OCnode*)nclistget(node->subnodes,n),depth+1);
 	}
     } break;
 
@@ -130,10 +121,10 @@ dumpocnode1(OCnode* node, int depth)
 	fprintf(stdout," &%lx",(unsigned long)node);
 	fprintf(stdout,"\n");
 	fprintf(stdout,"%sarray:\n",dent2(depth+1));
-	dumpocnode1((OCnode*)oclistget(node->subnodes,0),depth+2);
+	dumpocnode1((OCnode*)nclistget(node->subnodes,0),depth+2);
 	fprintf(stdout,"%smaps:\n",dent2(depth+1));
-	for(i=1;i<oclistlength(node->subnodes);i++) {
-	    dumpocnode1((OCnode*)oclistget(node->subnodes,i),depth+2);
+	for(i=1;i<nclistlength(node->subnodes);i++) {
+	    dumpocnode1((OCnode*)nclistget(node->subnodes,i),depth+2);
 	}
     } break;
 
@@ -141,8 +132,8 @@ dumpocnode1(OCnode* node, int depth)
         fprintf(stdout,"[%2d]%s ",depth,dent(depth));
 	if(node->name == NULL) OCPANIC("Attribute without name");
 	fprintf(stdout,"%s %s",octypetostring(node->etype),node->name);
-	for(n=0;n<oclistlength(node->att.values);n++) {
-	    char* value = (char*)oclistget(node->att.values,n);
+	for(n=0;n<nclistlength(node->att.values);n++) {
+	    char* value = (char*)nclistget(node->att.values,n);
 	    if(n > 0) fprintf(stdout,",");
 	    fprintf(stdout," %s",value);
 	}
@@ -153,8 +144,8 @@ dumpocnode1(OCnode* node, int depth)
     case OC_Attributeset: {
         fprintf(stdout,"[%2d]%s ",depth,dent(depth));
 	fprintf(stdout,"%s:\n",node->name?node->name:"Attributes");
-	for(n=0;n<oclistlength(node->subnodes);n++) {
-	    dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1);
+	for(n=0;n<nclistlength(node->subnodes);n++) {
+	    dumpocnode1((OCnode*)nclistget(node->subnodes,n),depth+1);
 	}
     } break;
 
@@ -164,8 +155,8 @@ dumpocnode1(OCnode* node, int depth)
 
     if(node->attributes != NULL) {
 	unsigned int i;
-	for(i=0;i<oclistlength(node->attributes);i++) {
-	    OCattribute* att = (OCattribute*)oclistget(node->attributes,i);
+	for(i=0;i<nclistlength(node->attributes);i++) {
+	    OCattribute* att = (OCattribute*)nclistget(node->attributes,i);
 	    fprintf(stdout,"%s[%s=",dent2(depth+2),att->name);
 	    if(att->nvalues == 0)
 		OCPANIC("Attribute.nvalues == 0");
@@ -190,7 +181,7 @@ dumpdimensions(OCnode* node)
 {
     unsigned int i;
     for(i=0;i<node->array.rank;i++) {
-        OCnode* dim = (OCnode*)oclistget(node->array.dimensions,i);
+        OCnode* dim = (OCnode*)nclistget(node->array.dimensions,i);
         fprintf(stdout,"[%s=%lu]",
 			(dim->name?dim->name:"?"),
 			(unsigned long)dim->dim.declsize);
@@ -221,18 +212,18 @@ void
 ocdumpclause(OCprojectionclause* ref)
 {
     unsigned int i;
-    OClist* path = oclistnew();
+    NClist* path = nclistnew();
     occollectpathtonode(ref->node,path);
-    for(i=0;i<oclistlength(path);i++) {
-        OClist* sliceset;
-	OCnode* node = (OCnode*)oclistget(path,i);
+    for(i=0;i<nclistlength(path);i++) {
+        NClist* sliceset;
+	OCnode* node = (OCnode*)nclistget(path,i);
 	if(node->tree != NULL) continue; /* leave off the root node*/
 	fprintf(stdout,"%s%s",(i>0?PATHSEPARATOR:""),node->name);
-	sliceset = (OClist*)oclistget(ref->indexsets,i);
+	sliceset = (NClist*)nclistget(ref->indexsets,i);
 	if(sliceset != NULL) {
 	    unsigned int j;
-	    for(j=0;j<oclistlength(sliceset);j++) {
-	        OCslice* slice = (OCslice*)oclistget(sliceset,j);
+	    for(j=0;j<nclistlength(sliceset);j++) {
+	        OCslice* slice = (OCslice*)nclistget(sliceset,j);
 	        ocdumpslice(slice);
 	    }
 	}
@@ -502,34 +493,34 @@ ocdd(OCstate* state, OCnode* root, int xdrencoded, int level)
 }
 
 void
-ocdumpdata(OCstate* state, OCdata* data, OCbytes* buffer, int frominstance)
+ocdumpdata(OCstate* state, OCdata* data, NCbytes* buffer, int frominstance)
 {
     char tmp[1024];
     OCnode* pattern = data->pattern;
     snprintf(tmp,sizeof(tmp),"%lx:",(unsigned long)data);
-    ocbytescat(buffer,tmp);
+    ncbytescat(buffer,tmp);
     if(!frominstance) {
-        ocbytescat(buffer," node=");
-        ocbytescat(buffer,pattern->name);
+        ncbytescat(buffer," node=");
+        ncbytescat(buffer,pattern->name);
     }
     snprintf(tmp,sizeof(tmp)," xdroffset=%ld",(unsigned long)data->xdroffset);
-    ocbytescat(buffer,tmp);
+    ncbytescat(buffer,tmp);
     if(data->pattern->octype == OC_Atomic) {
         snprintf(tmp,sizeof(tmp)," xdrsize=%ld",(unsigned long)data->xdrsize);
-        ocbytescat(buffer,tmp);
+        ncbytescat(buffer,tmp);
     }
     if(ociscontainer(pattern->octype)) {
         snprintf(tmp,sizeof(tmp)," ninstances=%d",(int)data->ninstances);
-        ocbytescat(buffer,tmp);
+        ncbytescat(buffer,tmp);
     } else if(pattern->etype == OC_String || pattern->etype == OC_URL) {
         snprintf(tmp,sizeof(tmp)," nstrings=%d",(int)data->nstrings);
-        ocbytescat(buffer,tmp);
+        ncbytescat(buffer,tmp);
     }
-    ocbytescat(buffer," container=");
+    ncbytescat(buffer," container=");
     snprintf(tmp,sizeof(tmp),"%lx",(unsigned long)data->container);
-    ocbytescat(buffer,tmp);
-    ocbytescat(buffer," mode=");
-    ocbytescat(buffer,ocdtmodestring(data->datamode,0));
+    ncbytescat(buffer,tmp);
+    ncbytescat(buffer," mode=");
+    ncbytescat(buffer,ocdtmodestring(data->datamode,0));
 }
 
 /*
@@ -543,7 +534,7 @@ static const char* header =
 "Depth Offset   Index Flags Size Type     Name\n";
 
 void
-ocdumpdatatree(OCstate* state, OCdata* data, OCbytes* buffer, int depth)
+ocdumpdatatree(OCstate* state, OCdata* data, NCbytes* buffer, int depth)
 {
     size_t i,rank;
     OCnode* pattern;
@@ -554,7 +545,7 @@ ocdumpdatatree(OCstate* state, OCdata* data, OCbytes* buffer, int depth)
 
     /* If this is the first call, then dump a header line */
     if(depth == 0) {
-	ocbytescat(buffer,header);
+	ncbytescat(buffer,header);
     }
 
     /* get info about the pattern */
@@ -567,12 +558,12 @@ ocdumpdatatree(OCstate* state, OCdata* data, OCbytes* buffer, int depth)
 
     /* Dump the depth first */
     snprintf(tmp,sizeof(tmp),"[%03d]",depth);
-    ocbytescat(buffer,tmp);
+    ncbytescat(buffer,tmp);
 
     tabto(tabstops[++tabstop],buffer);
 
     snprintf(tmp,sizeof(tmp),"%08lu",(unsigned long)data->xdroffset);
-    ocbytescat(buffer,tmp);
+    ncbytescat(buffer,tmp);
 
     tabto(tabstops[++tabstop],buffer);
 
@@ -581,13 +572,13 @@ ocdumpdatatree(OCstate* state, OCdata* data, OCbytes* buffer, int depth)
        || fisset(data->datamode,OCDT_ELEMENT)
        || fisset(data->datamode,OCDT_RECORD)) {
         snprintf(tmp,sizeof(tmp),"%04lu ",(unsigned long)data->index);
-        ocbytescat(buffer,tmp);
+        ncbytescat(buffer,tmp);
     }
 
     tabto(tabstops[++tabstop],buffer);
 
     /* Dump the mode flags in compact form */
-    ocbytescat(buffer,ocdtmodestring(data->datamode,1));
+    ncbytescat(buffer,ocdtmodestring(data->datamode,1));
 
     tabto(tabstops[++tabstop],buffer);
 
@@ -598,7 +589,7 @@ ocdumpdatatree(OCstate* state, OCdata* data, OCbytes* buffer, int depth)
     } else {
         snprintf(tmp,sizeof(tmp),"%04lu",(unsigned long)data->xdrsize);
     }
-    ocbytescat(buffer,tmp);
+    ncbytescat(buffer,tmp);
 
     tabto(tabstops[++tabstop],buffer);
 
@@ -607,19 +598,19 @@ ocdumpdatatree(OCstate* state, OCdata* data, OCbytes* buffer, int depth)
     } else { /*must be container*/
 	typename = octypetoddsstring(pattern->octype);
     }
-    ocbytescat(buffer,typename);
+    ncbytescat(buffer,typename);
 
     tabto(tabstops[++tabstop],buffer);
 
     if(!occopycat(tmp,sizeof(tmp),1,pattern->name))
 	return;
-    ocbytescat(buffer,tmp);
+    ncbytescat(buffer,tmp);
 
     if(rank > 0) {
 	snprintf(tmp,sizeof(tmp),"[%lu]",(unsigned long)crossproduct);
-	ocbytescat(buffer,tmp);
+	ncbytescat(buffer,tmp);
     }
-    ocbytescat(buffer,"\n");
+    ncbytescat(buffer,"\n");
 
     /* dump the sub-instance, which might be fields, records, or elements */
     if(!fisset(data->datamode,OCDT_ATOMIC)) {
@@ -629,7 +620,7 @@ ocdumpdatatree(OCstate* state, OCdata* data, OCbytes* buffer, int depth)
 }
 
 void
-ocdumpdatapath(OCstate* state, OCdata* data, OCbytes* buffer)
+ocdumpdatapath(OCstate* state, OCdata* data, NCbytes* buffer)
 {
     int i;
     OCdata* path[1024];
@@ -648,8 +639,8 @@ ocdumpdatapath(OCstate* state, OCdata* data, OCbytes* buffer)
     for(i=i-1;i>=0;i--) {
 	pathdata = path[i];
 	pattern = pathdata->pattern;
-	ocbytescat(buffer,"/");
-	ocbytescat(buffer,pattern->name);
+	ncbytescat(buffer,"/");
+	ncbytescat(buffer,pattern->name);
 	/* Check the mode of the next step in path */
 	if(i > 0) {
 	    OCdata* next = path[i-1];
@@ -657,14 +648,14 @@ ocdumpdatapath(OCstate* state, OCdata* data, OCbytes* buffer)
 		|| fisset(next->datamode,OCDT_ELEMENT)
 		|| fisset(next->datamode,OCDT_RECORD)) {
 		snprintf(tmp,sizeof(tmp),".%lu",(unsigned long)next->index);
-	        ocbytescat(buffer,tmp);
+	        ncbytescat(buffer,tmp);
 	    }
 	}
 	if(pattern->octype == OC_Atomic) {
 	    if(pattern->array.rank > 0) {
 	        off_t xproduct = octotaldimsize(pattern->array.rank,pattern->array.sizes);
 	        snprintf(tmp,sizeof(tmp),"[0..%lu]",(unsigned long)xproduct-1);
-	        ocbytescat(buffer,tmp);
+	        ncbytescat(buffer,tmp);
 	    }
 	}
 	isrecord = 0;
@@ -676,16 +667,16 @@ ocdumpdatapath(OCstate* state, OCdata* data, OCbytes* buffer)
     /* Add suffix to path */
     if(ociscontainer(pattern->octype)) {
         /* add the container type, except distinguish record and sequence */
-	ocbytescat(buffer,":");
+	ncbytescat(buffer,":");
 	if(isrecord)
-	    ocbytescat(buffer,"Record");
+	    ncbytescat(buffer,"Record");
 	else
-	    ocbytescat(buffer,octypetoddsstring(pattern->octype));
+	    ncbytescat(buffer,octypetoddsstring(pattern->octype));
     } else if(ocisatomic(pattern->octype)) {
 	/* add the atomic etype */
-	ocbytescat(buffer,":");
-	ocbytescat(buffer,octypetoddsstring(pattern->etype));
+	ncbytescat(buffer,":");
+	ncbytescat(buffer,octypetoddsstring(pattern->etype));
     }
     snprintf(tmp,sizeof(tmp),"->0x%0lx",(unsigned long)pathdata);
-    ocbytescat(buffer,tmp);
+    ncbytescat(buffer,tmp);
 }
diff --git a/oc2/ocdump.h b/oc2/ocdump.h
index 78e8d9c..c946315 100644
--- a/oc2/ocdump.h
+++ b/oc2/ocdump.h
@@ -13,9 +13,9 @@ extern void ocdumpmemory(char* memory, size_t len, int xdrencoded, int level);
 
 extern void ocdd(OCstate*,OCnode*,int xdrencoded, int level);
 
-extern void ocdumpdata(OCstate*,OCdata*,OCbytes*,int);
+extern void ocdumpdata(OCstate*,OCdata*,NCbytes*,int);
 
-extern void ocdumpdatatree(OCstate*, struct OCdata*, OCbytes* buffer, int depth);
-extern void ocdumpdatapath(OCstate*, struct OCdata*, OCbytes* buffer);
+extern void ocdumpdatatree(OCstate*, struct OCdata*, NCbytes* buffer, int depth);
+extern void ocdumpdatapath(OCstate*, struct OCdata*, NCbytes* buffer);
 
 #endif /*OCDUMP_H*/
diff --git a/oc2/ochttp.c b/oc2/ochttp.c
index 3385336..f756c2d 100644
--- a/oc2/ochttp.c
+++ b/oc2/ochttp.c
@@ -2,11 +2,9 @@
  See the COPYRIGHT file for more information. */
 
 #include "config.h"
-#include <sys/stat.h>
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#include <fcntl.h>
 #include "ocinternal.h"
 #include "ocdebug.h"
 #include "ochttp.h"
@@ -84,12 +82,12 @@ ocfetchurl_file(CURL* curl, const char* url, FILE* stream,
 	return OCTHROW(stat);
 
 fail:
-	oclog(OCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+	nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
 	return OCTHROW(OC_ECURL);
 }
 
 OCerror
-ocfetchurl(CURL* curl, const char* url, OCbytes* buf, long* filetime,
+ocfetchurl(CURL* curl, const char* url, NCbytes* buf, long* filetime,
            struct OCcredentials* creds)
 {
 	OCerror stat = OC_NOERR;
@@ -138,7 +136,7 @@ ocfetchurl(CURL* curl, const char* url, OCbytes* buf, long* filetime,
 
 	if(cstat == CURLE_PARTIAL_FILE) {
 	    /* Log it but otherwise ignore */
-	    oclog(OCLOGWARN, "curl error: %s; ignored",
+	    nclog(NCLOGWARN, "curl error: %s; ignored",
 		   curl_easy_strerror(cstat));
 	    cstat = CURLE_OK;
 	}
@@ -152,17 +150,17 @@ ocfetchurl(CURL* curl, const char* url, OCbytes* buf, long* filetime,
         if(cstat != CURLE_OK) goto fail;
 
 	/* Null terminate the buffer*/
-	len = ocbyteslength(buf);
-	ocbytesappend(buf, '\0');
-	ocbytessetlength(buf, len); /* dont count null in buffer size*/
+	len = ncbyteslength(buf);
+	ncbytesappend(buf, '\0');
+	ncbytessetlength(buf, len); /* dont count null in buffer size*/
 #ifdef OCDEBUG
-	oclog(OCLOGNOTE,"buffersize: %lu bytes",(off_t)ocbyteslength(buf));
+	nclog(NCLOGNOTE,"buffersize: %lu bytes",(off_t)ncbyteslength(buf));
 #endif
 
 	return OCTHROW(stat);
 
 fail:
-	oclog(OCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+	nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
 	switch (httpcode) {
 	case 401: stat = OC_EAUTH; break;
 	case 404: stat = OC_ENOFILE; break;
@@ -181,15 +179,15 @@ WriteFileCallback(void* ptr, size_t size, size_t nmemb,	void* data)
 	struct Fetchdata* fetchdata;
 	fetchdata = (struct Fetchdata*) data;
         if(realsize == 0)
-	    oclog(OCLOGWARN,"WriteFileCallback: zero sized chunk");
+	    nclog(NCLOGWARN,"WriteFileCallback: zero sized chunk");
 	count = fwrite(ptr, size, nmemb, fetchdata->stream);
 	if (count > 0) {
 		fetchdata->size += (count * size);
 	} else {
-	    oclog(OCLOGWARN,"WriteFileCallback: zero sized write");
+	    nclog(NCLOGWARN,"WriteFileCallback: zero sized write");
 	}
 #ifdef OCPROGRESS
-        oclog(OCLOGNOTE,"callback: %lu bytes",(off_t)realsize);
+        nclog(NCLOGNOTE,"callback: %lu bytes",(off_t)realsize);
 #endif
 	return count;
 }
@@ -198,28 +196,28 @@ static size_t
 WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
 {
 	size_t realsize = size * nmemb;
-	OCbytes* buf = (OCbytes*) data;
+	NCbytes* buf = (NCbytes*) data;
         if(realsize == 0)
-	    oclog(OCLOGWARN,"WriteMemoryCallback: zero sized chunk");
+	    nclog(NCLOGWARN,"WriteMemoryCallback: zero sized chunk");
 	/* Optimize for reading potentially large dods datasets */
-	if(!ocbytesavail(buf,realsize)) {
+	if(!ncbytesavail(buf,realsize)) {
 	    /* double the size of the packet */
-	    ocbytessetalloc(buf,2*ocbytesalloc(buf));
+	    ncbytessetalloc(buf,2*ncbytesalloc(buf));
 	}
-	ocbytesappendn(buf, ptr, realsize);
+	ncbytesappendn(buf, ptr, realsize);
 #ifdef OCPROGRESS
-        oclog(OCLOGNOTE,"callback: %lu bytes",(off_t)realsize);
+        nclog(NCLOGNOTE,"callback: %lu bytes",(off_t)realsize);
 #endif
 	return realsize;
 }
 
 #if 0
 static void
-assembleurl(DAPURL* durl, OCbytes* buf, int what)
+assembleurl(DAPURL* durl, NCbytes* buf, int what)
 {
 	encodeurltext(durl->url,buf);
 	if(what & WITHPROJ) {
-		ocbytescat(buf,"?");
+		ncbytescat(buf,"?");
 		encodeurltext(durl->projection,buf);
 	}
 	if(what & WITHSEL) encodeurltext(durl->selection,buf);
@@ -235,7 +233,7 @@ static char hexchars[16] = {
 };
 
 static void
-encodeurltext(char* text, OCbytes* buf)
+encodeurltext(char* text, NCbytes* buf)
 {
 	/* Encode the URL to handle illegal characters */
 	len = strlen(url);
@@ -251,7 +249,7 @@ encodeurltext(char* text, OCbytes* buf)
 			tmp[0] = '0'; tmp[1] = 'x';
 			tmp[2] = hexchars[hex2]; tmp[3] = hexchars[hex1];
 			tmp[4] = '\0';
-			ocbytescat(buf,tmp);
+			ncbytescat(buf,tmp);
 		} else *q++ = (char)c;
 	}
 
@@ -314,7 +312,7 @@ ocfetchlastmodified(CURL* curl, char* url, long* filetime)
     return OCTHROW(stat);
 
 fail:
-    oclog(OCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+    nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
     return OCTHROW(OC_ECURL);
 }
 
@@ -324,7 +322,7 @@ ocping(const char* url)
     int stat = OC_NOERR;
     CURLcode cstat = CURLE_OK;
     CURL* curl = NULL;
-    OCbytes* buf = NULL;
+    NCbytes* buf = NULL;
 
     /* Create a CURL instance */
     stat = occurlopen(&curl);
@@ -339,7 +337,7 @@ ocping(const char* url)
         goto done;
 
     /* use a very short timeout: 10 seconds */
-    cstat = CURLERR(curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)10));
+    cstat = CURLERR(curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)5));
     if (cstat != CURLE_OK)
         goto done;
 
@@ -349,7 +347,7 @@ ocping(const char* url)
         goto done;
 
     /* Try to get the file */
-    buf = ocbytesnew();
+    buf = ncbytesnew();
     stat = ocfetchurl(curl,url,buf,NULL,NULL);
     if(stat == OC_NOERR) {
 	/* Don't trust curl to return an error when request gets 404 */
@@ -365,10 +363,10 @@ ocping(const char* url)
         goto done;
 
 done:
-    ocbytesfree(buf);
+    ncbytesfree(buf);
     occurlclose(curl);
     if(cstat != CURLE_OK) {
-        oclog(OCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
+        nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
         stat = OC_EDAPSVC;
     }
     return OCTHROW(stat);
diff --git a/oc2/ochttp.h b/oc2/ochttp.h
index af74dd4..c7b2371 100644
--- a/oc2/ochttp.h
+++ b/oc2/ochttp.h
@@ -7,7 +7,7 @@
 extern int curlopen(CURL** curlp);
 extern void curlclose(CURL*);
 
-extern OCerror ocfetchurl(CURL*, const char*, OCbytes*, long*, struct OCcredentials*);
+extern OCerror ocfetchurl(CURL*, const char*, NCbytes*, long*, struct OCcredentials*);
 extern OCerror ocfetchurl_file(CURL*, const char*, FILE*, off_t*, long*);
 
 extern long ocfetchhttpcode(CURL* curl);
diff --git a/oc2/ocinternal.c b/oc2/ocinternal.c
index ce9161a..34cd03e 100644
--- a/oc2/ocinternal.c
+++ b/oc2/ocinternal.c
@@ -7,15 +7,17 @@
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
 #endif
-#include <errno.h>
-
-#ifdef _MSC_VER
-typedef int pid_t;
+#if defined(_WIN32) || defined(_WIN64)
+#include <io.h>
+#include <direct.h>
+#include <process.h>
 #endif
 
+#include <errno.h>
+
 #include "ocinternal.h"
 #include "ocdebug.h"
 #include "occlientparams.h"
@@ -53,18 +55,6 @@ static OCerror ocset_curlproperties(OCstate*);
 
 extern OCnode* makeunlimiteddimension(void);
 
-#if defined(_WIN32) || defined(_WIN64)
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-#define _S_IREAD 256
-#define _S_IWRITE 128
-#else
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#endif
-
 /* Collect global state info in one place */
 struct OCGLOBALSTATE ocglobalstate;
 
@@ -84,6 +74,10 @@ ocinternalinitialize(void)
 #endif
 
     if(!ocglobalstate.initialized) {
+      CURLcode cstat = CURLE_OK;
+      cstat = curl_global_init(CURL_GLOBAL_ALL);
+      if(cstat != CURLE_OK)
+	fprintf(stderr,"curl_global_init failed!\n");
       memset((void*)&ocglobalstate,0,sizeof(ocglobalstate));
       ocglobalstate.initialized = 1;
     }
@@ -150,7 +144,7 @@ ocinternalinitialize(void)
     /* Compute some xdr related flags */
     xxdr_init();
 
-    ocloginit();
+    ncloginit();
 
     oc_curl_protocols(&ocglobalstate); /* see what protocols are supported */
 
@@ -164,10 +158,10 @@ ocopen(OCstate** statep, const char* url)
 {
     int stat = OC_NOERR;
     OCstate * state = NULL;
-    OCURI* tmpurl = NULL;
+    NCURI* tmpurl = NULL;
     CURL* curl = NULL; /* curl handle*/
 
-    if(!ocuriparse(url,&tmpurl)) {OCTHROWCHK(stat=OC_EBADURL); goto fail;}
+    if(ncuriparse(url,&tmpurl) != NCU_OK) {OCTHROWCHK(stat=OC_EBADURL); goto fail;}
 
     stat = occurlopen(&curl);
     if(stat != OC_NOERR) {OCTHROWCHK(stat); goto fail;}
@@ -179,13 +173,11 @@ ocopen(OCstate** statep, const char* url)
     state->header.magic = OCMAGIC;
     state->header.occlass = OC_State;
     state->curl = curl;
-    state->trees = oclistnew();
+    state->trees = nclistnew();
     state->uri = tmpurl;
-    if(!ocuridecodeparams(state->uri)) {
-	oclog(OCLOGWARN,"Could not parse client parameters");
-    }
-    state->packet = ocbytesnew();
-    ocbytessetalloc(state->packet,DFALTPACKETSIZE); /*initial reasonable size*/
+
+    state->packet = ncbytesnew();
+    ncbytessetalloc(state->packet,DFALTPACKETSIZE); /*initial reasonable size*/
 
     /* capture curl properties for this link from rc file1*/
     stat = ocset_curlproperties(state);
@@ -204,7 +196,7 @@ ocopen(OCstate** statep, const char* url)
     return OCTHROW(stat);
 
 fail:
-    ocurifree(tmpurl);
+    ncurifree(tmpurl);
     if(state != NULL) ocfree(state);
     if(curl != NULL) occurlclose(curl);
     return OCTHROW(stat);
@@ -232,20 +224,20 @@ ocfetch(OCstate* state, const char* constraint, OCdxd kind, OCflags flags,
     if((stat=ocset_flags_perfetch(state))!= OC_NOERR) goto fail;
 #endif
 
-    ocbytesclear(state->packet);
+    ncbytesclear(state->packet);
 
     switch (kind) {
     case OCDAS:
         stat = readDAS(state,tree);
 	if(stat == OC_NOERR) {
-            tree->text = ocbytesdup(state->packet);
+            tree->text = ncbytesdup(state->packet);
 	    if(tree->text == NULL) stat = OC_EDAS;
 	}
 	break;
     case OCDDS:
         stat = readDDS(state,tree);
 	if(stat == OC_NOERR) {
-            tree->text = ocbytesdup(state->packet);
+            tree->text = ncbytesdup(state->packet);
 	    if(tree->text == NULL) stat = OC_EDDS;
 	}
 	break;
@@ -278,9 +270,9 @@ ocfetch(OCstate* state, const char* constraint, OCdxd kind, OCflags flags,
     state->error.httpcode = ocfetchhttpcode(state->curl);
     if(stat != OC_NOERR) {
 	if(state->error.httpcode >= 400) {
-	    oclog(OCLOGWARN,"oc_open: Could not read url; http error = %l",state->error.httpcode);
+	    nclog(NCLOGWARN,"oc_open: Could not read url; http error = %l",state->error.httpcode);
 	} else {
-	    oclog(OCLOGWARN,"oc_open: Could not read url");
+	    nclog(NCLOGWARN,"oc_open: Could not read url");
 	}
 	goto fail;
     }
@@ -289,7 +281,7 @@ ocfetch(OCstate* state, const char* constraint, OCdxd kind, OCflags flags,
     stat = DAPparse(state,tree,tree->text);
     /* Check and report on an error return from the server */
     if(stat == OC_EDAPSVC  && state->error.code != NULL) {
-	oclog(OCLOGERR,"oc_open: server error retrieving url: code=%s message=\"%s\"",
+	nclog(NCLOGERR,"oc_open: server error retrieving url: code=%s message=\"%s\"",
 		  state->error.code,
 		  (state->error.message?state->error.message:""));
     }
@@ -346,7 +338,7 @@ fprintf(stderr,"ocfetch.datadds.memory: datasize=%lu bod=%lu\n",
          */
 	if(dataError(tree->data.xdrs,state)) {
 	    stat = OC_EDATADDS;
-	    oclog(OCLOGERR,"oc_open: server error retrieving url: code=%s message=\"%s\"",
+	    nclog(NCLOGERR,"oc_open: server error retrieving url: code=%s message=\"%s\"",
 		  state->error.code,
 		  (state->error.message?state->error.message:""));
 	    goto fail;
@@ -359,7 +351,7 @@ fprintf(stderr,"ocfetch.datadds.memory: datasize=%lu bod=%lu\n",
     }
 
     /* Put root into the state->trees list */
-    oclistpush(state->trees,(void*)root);
+    nclistpush(state->trees,(void*)root);
 
     if(rootp) *rootp = root;
     return stat;
@@ -391,7 +383,7 @@ createtempfile(OCstate* state, OCtree* tree)
     free(path);
     if(stat != OC_NOERR) goto fail;
 #ifdef OCDEBUG
-    oclog(OCLOGNOTE,"oc_open: creating tmp file: %s",name);
+    nclog(NCLOGNOTE,"oc_open: creating tmp file: %s",name);
 #endif
     tree->data.filename = name; /* remember our tmp file name */
     name = NULL;
@@ -403,10 +395,10 @@ createtempfile(OCstate* state, OCtree* tree)
 
 fail:
     if(name != NULL) {
-        oclog(OCLOGERR,"oc_open: attempt to create tmp file failed: %s",name);
+        nclog(NCLOGERR,"oc_open: attempt to create tmp file failed: %s",name);
 	free(name);
     } else {
-        oclog(OCLOGERR,"oc_open: attempt to create tmp file failed: NULL");
+        nclog(NCLOGERR,"oc_open: attempt to create tmp file failed: NULL");
     }
     return OCTHROW(stat);
 }
@@ -419,13 +411,13 @@ occlose(OCstate* state)
 
     /* Warning: ocfreeroot will attempt to remove the root from state->trees */
     /* Ok in this case because we are popping the root out of state->trees */
-    for(i=0;i<oclistlength(state->trees);i++) {
-	OCnode* root = (OCnode*)oclistpop(state->trees);
+    for(i=0;i<nclistlength(state->trees);i++) {
+	OCnode* root = (OCnode*)nclistpop(state->trees);
 	ocroot_free(root);
     }
-    oclistfree(state->trees);
-    ocurifree(state->uri);
-    ocbytesfree(state->packet);
+    nclistfree(state->trees);
+    ncurifree(state->uri);
+    ncbytesfree(state->packet);
     ocfree(state->error.code);
     ocfree(state->error.message);
     ocfree(state->curlflags.useragent);
@@ -471,12 +463,12 @@ ocextractddsinmemory(OCstate* state, OCtree* tree, OCflags flags)
     /* copy out the dds */
     if(ddslen > 0) {
         tree->text = (char*)ocmalloc(ddslen+1);
-        memcpy((void*)tree->text,(void*)ocbytescontents(state->packet),ddslen);
+        memcpy((void*)tree->text,(void*)ncbytescontents(state->packet),ddslen);
         tree->text[ddslen] = '\0';
     } else
 	tree->text = NULL;
     /* Extract the inmemory contents */
-    tree->data.memory = ocbytesextract(state->packet);
+    tree->data.memory = ncbytesextract(state->packet);
 #ifdef OCIGNORE
     /* guarantee the data part is on an 8 byte boundary */
     if(tree->data.bod % 8 != 0) {
@@ -498,7 +490,7 @@ ocextractddsinfile(OCstate* state, OCtree* tree, OCflags flags)
     size_t ddslen, bod, bodfound;
 
     /* Read until we find the separator (or EOF)*/
-    ocbytesclear(state->packet);
+    ncbytesclear(state->packet);
     rewind(tree->data.file);
     bodfound = 0;
     do {
@@ -507,7 +499,7 @@ ocextractddsinfile(OCstate* state, OCtree* tree, OCflags flags)
 	/* read chunks of the file until we find the separator*/
         count = fread(chunk,1,sizeof(chunk),tree->data.file);
 	if(count <= 0) break; /* EOF;*/
-        ocbytesappendn(state->packet,chunk,count);
+        ncbytesappendn(state->packet,chunk,count);
 	bodfound = ocfindbod(state->packet,&bod,&ddslen);
     } while(!bodfound);
     if(!bodfound) {/* No BOD; pretend */
@@ -523,7 +515,7 @@ fprintf(stderr,"missing bod: ddslen=%lu bod=%lu\n",
     /* copy out the dds */
     if(ddslen > 0) {
         tree->text = (char*)ocmalloc(ddslen+1);
-        memcpy((void*)tree->text,(void*)ocbytescontents(state->packet),ddslen);
+        memcpy((void*)tree->text,(void*)ncbytescontents(state->packet),ddslen);
         tree->text[ddslen] = '\0';
     } else
 	tree->text = NULL;
@@ -574,7 +566,7 @@ ocupdatelastmodifieddata(OCstate* state)
     OCerror status = OC_NOERR;
     long lastmodified;
     char* base = NULL;
-    base = ocuribuild(state->uri,NULL,NULL,OCURIENCODE);
+    base = ncuribuild(state->uri,NULL,NULL,NCURIENCODE);
     status = ocfetchlastmodified(state->curl, base, &lastmodified);
     free(base);
     if(status == OC_NOERR) {
@@ -616,7 +608,11 @@ ocset_curlproperties(OCstate* state)
 	/* If no cookie file was defined, define a default */
 	char tmp[OCPATHMAX+1];
         int stat;
+#if defined(_WIN32) || defined(_WIN64)
+	int pid = _getpid();
+#else
 	pid_t pid = getpid();
+#endif
 	snprintf(tmp,sizeof(tmp)-1,"%s/%s.%ld/",ocglobalstate.tempdir,OCDIR,(long)pid);
 #ifdef _WIN32
 	stat = mkdir(tmp);
@@ -670,7 +666,7 @@ ocset_curlproperties(OCstate* state)
 	/* WARNING: it appears that a user+pwd was specified specifically, then
            the netrc file will be completely disabled. */
 	if(state->creds.userpwd != NULL) {
-  	    oclog(OCLOGWARN,"The rc file specifies both netrc and user+pwd; this will cause curl to ignore the netrc file");
+  	    nclog(NCLOGWARN,"The rc file specifies both netrc and user+pwd; this will cause curl to ignore the netrc file");
 	}
 	stat = oc_build_netrc(state);
     }
diff --git a/oc2/ocinternal.h b/oc2/ocinternal.h
index be20ac0..b1a75a0 100644
--- a/oc2/ocinternal.h
+++ b/oc2/ocinternal.h
@@ -40,9 +40,10 @@
 #define CURL_DISABLE_TYPECHECK 1
 #include <curl/curl.h>
 
-#include "oclist.h"
-#include "ocbytes.h"
-#include "ocuri.h"
+#include "netcdf.h"
+#include "nclist.h"
+#include "ncbytes.h"
+#include "ncuri.h"
 
 #ifndef HAVE_STRNDUP
 /* Not all systems have strndup, so provide one*/
@@ -69,10 +70,10 @@ typedef struct OCdata OCdata;
 struct OCTriplestore;
 
 /* Define the internal node classification values */
-#define OC_None  0
-#define OC_State 1
-#define OC_Node  2
-#define OC_Data  3
+#define OC_None  ((unsigned int)0)
+#define OC_State ((unsigned int)1)
+#define OC_Node  ((unsigned int)2)
+#define OC_Data  ((unsigned int)3)
 
 /* Define a magic number to mark externally visible oc objects */
 #define OCMAGIC ((unsigned int)0x0c0c0c0c) /*clever, huh*/
@@ -96,7 +97,7 @@ typedef struct OCheader {
 #include "ocdata.h"
 #include "occonstraints.h"
 #include "ocutil.h"
-#include "oclog.h"
+#include "nclog.h"
 #include "xxdr.h"
 #include "ocdatatypes.h"
 #include "occompile.h"
@@ -134,7 +135,9 @@ typedef struct OCheader {
 #define DFALTMAXPACKETSIZE 0x3000000 /*approximately 50M bytes*/
 
 /* Default user agent string (will have version appended)*/
+#ifndef DFALTUSERAGENT
 #define DFALTUSERAGENT "oc"
+#endif
 
 /* Hold known curl flags */
 
@@ -175,9 +178,9 @@ extern struct OCGLOBALSTATE {
 /*! Specifies the OCstate = non-opaque version of OClink */
 struct OCstate {
     OCheader header; /* class=OC_State */
-    OClist* trees; /* list<OCNODE*> ; all root objects */
-    OCURI* uri; /* base URI*/
-    OCbytes* packet; /* shared by all trees during construction */
+    NClist* trees; /* list<OCNODE*> ; all root objects */
+    NCURI* uri; /* base URI*/
+    NCbytes* packet; /* shared by all trees during construction */
     struct OCerrdata {/* Hold info for an error return from server */
 	char* code;
 	char* message;
@@ -234,7 +237,7 @@ typedef struct OCtree
     char* text;
     struct OCnode* root; /* cross link */
     struct OCstate* state; /* cross link */
-    OClist* nodes; /* all nodes in tree*/
+    NClist* nodes; /* all nodes in tree*/
     /* when dxdclass == OCDATADDS */
     struct {
 	char*   memory;   /* allocated memory if OC_ONDISK is not set */
@@ -256,7 +259,7 @@ typedef struct OCtree
 #if 0
 /* Location: ceparselex.c*/
 extern int cedebug;
-extern OClist* CEparse(OCstate*,char* input);
+extern NClist* CEparse(OCstate*,char* input);
 #endif
 
 extern OCerror ocopen(OCstate** statep, const char* url);
diff --git a/oc2/oclist.c b/oc2/oclist.c
deleted file mode 100644
index 821c558..0000000
--- a/oc2/oclist.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
-   See the COPYRIGHT file for more information. */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "oclist.h"
-
-int oclistnull(void* e) {return e == NULL;}
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#define DEFAULTALLOC 16
-#define ALLOCINCR 16
-
-OClist* oclistnew(void)
-{
-  OClist* l;
-/*
-  if(!ocinitialized) {
-    memset((void*)&ocDATANULL,0,sizeof(void*));
-    ocinitialized = 1;
-  }
-*/
-  l = (OClist*)malloc(sizeof(OClist));
-  if(l) {
-    l->alloc=0;
-    l->length=0;
-    l->content=NULL;
-  }
-  return l;
-}
-
-int
-oclistfree(OClist* l)
-{
-  if(l) {
-    l->alloc = 0;
-    if(l->content != NULL) {free(l->content); l->content = NULL;}
-    free(l);
-  }
-  return TRUE;
-}
-
-int
-oclistsetalloc(OClist* l, size_t sz)
-{
-  void** newcontent = NULL;
-  if(l == NULL) return FALSE;
-  if(sz <= 0) {sz = (l->length?2*l->length:DEFAULTALLOC);}
-  if(l->alloc >= sz) {return TRUE;}
-  newcontent=(void**)calloc(sz,sizeof(void*));
-  if(newcontent != NULL && l->alloc > 0 && l->length > 0 && l->content != NULL) {
-    memcpy((void*)newcontent,(void*)l->content,sizeof(void*)*l->length);
-  }
-  if(l->content != NULL) free(l->content);
-  l->content=newcontent;
-  l->alloc=sz;
-  return TRUE;
-}
-
-int
-oclistsetlength(OClist* l, size_t sz)
-{
-  if(l == NULL) return FALSE;
-  if(sz > l->alloc && !oclistsetalloc(l,sz)) return FALSE;
-  l->length = sz;
-  return TRUE;
-}
-
-void*
-oclistget(OClist* l, size_t index)
-{
-  if(l == NULL || l->length == 0) return NULL;
-  if(index >= l->length) return NULL;
-  return l->content[index];
-}
-
-int
-oclistset(OClist* l, size_t index, void* elem)
-{
-  if(l == NULL) return FALSE;
-  if(index >= l->length) return FALSE;
-  l->content[index] = elem;
-  return TRUE;
-}
-
-/* Insert at position i of l; will push up elements i..|seq|. */
-int
-oclistinsert(OClist* l, size_t index, void* elem)
-{
-  int i; /* do not make unsigned */
-  if(l == NULL) return FALSE;
-  if(index > l->length) return FALSE;
-  oclistsetalloc(l,0);
-  for(i=(int)l->length;i>index;i--) l->content[i] = l->content[i-1];
-  l->content[index] = elem;
-  l->length++;
-  return TRUE;
-}
-
-int
-oclistpush(OClist* l, void* elem)
-{
-  if(l == NULL) return FALSE;
-  if(l->length >= l->alloc) oclistsetalloc(l,0);
-  l->content[l->length] = elem;
-  l->length++;
-  return TRUE;
-}
-
-void*
-oclistpop(OClist* l)
-{
-  if(l == NULL || l->length == 0) return NULL;
-  l->length--;  
-  return l->content[l->length];
-}
-
-void*
-oclisttop(OClist* l)
-{
-  if(l == NULL || l->length == 0) return NULL;
-  return l->content[l->length - 1];
-}
-
-void*
-oclistremove(OClist* l, size_t i)
-{
-  size_t len;
-  void* elem;
-  if(l == NULL || (len=l->length) == 0) return NULL;
-  if(i >= len) return NULL;
-  elem = l->content[i];
-  for(i+=1;i<len;i++) l->content[i-1] = l->content[i];
-  l->length--;
-  return elem;  
-}
-
-/* Duplicate and return the content (null terminate) */
-void**
-oclistdup(OClist* l)
-{
-    void** result = (void**)malloc(sizeof(void*)*(l->length+1));
-    if(result != NULL) {
-	if(l != NULL && oclistlength(l) != 0)
-            memcpy((void*)result,(void*)l->content,sizeof(void*)*l->length);
-        result[l->length] = (void*)0;
-    }
-    return result;
-}
-
-int
-oclistcontains(OClist* l, void* elem)
-{
-    size_t i;
-    for(i=0;i<oclistlength(l);i++) {
-	if(elem == oclistget(l,i)) return 1;
-    }
-    return 0;
-}
-
-/* Remove element by value; only removes first encountered */
-int
-oclistelemremove(OClist* l, void* elem)
-{
-  size_t len;
-  size_t i;
-  int found = 0;
-  if(l == NULL || (len=l->length) == 0) return 0;
-  for(i=0;i<oclistlength(l);i++) {
-    void* candidate = l->content[i];
-    if(elem == candidate) {
-      for(i+=1;i<len;i++) l->content[i-1] = l->content[i];
-      l->length--;
-      found = 1;
-      break;
-    }
-  }
-  return found;
-}
-
-
-
-
-/* Extends oclist to include a unique operator 
-   which remove duplicate values; NULL values removed
-   return value is always 1.
-*/
-
-int
-oclistunique(OClist* l)
-{
-    size_t i,j,k,len;
-    void** content;
-    if(l == NULL || l->length == 0) return 1;
-    len = l->length;
-    content = l->content;
-    for(i=0;i<len;i++) {
-        for(j=i+1;j<len;j++) {
-	    if(content[i] == content[j]) {
-		/* compress out jth element */
-                for(k=j+1;k<len;k++) content[k-1] = content[k];	
-		len--;
-	    }
-	}
-    }
-    l->length = len;
-    return 1;
-}
-
-OClist*
-oclistclone(OClist* l)
-{
-    OClist* clone = oclistnew();
-    *clone = *l;
-    clone->content = oclistdup(l);
-    return clone;
-}
diff --git a/oc2/oclist.h b/oc2/oclist.h
deleted file mode 100644
index 7b8901c..0000000
--- a/oc2/oclist.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
-   See the COPYRIGHT file for more information. */
-#ifndef OCLIST_H
-#define OCLIST_H 1
-
-/* Define the type of the elements in the list*/
-
-#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__)
-#define EXTERNC extern "C"
-#else
-#define EXTERNC extern
-#endif
-
-EXTERNC int oclistnull(void*);
-
-typedef struct OClist {
-  size_t alloc;
-  size_t length;
-  void** content;
-} OClist;
-
-EXTERNC OClist* oclistnew(void);
-EXTERNC int oclistfree(OClist*);
-EXTERNC int oclistsetalloc(OClist*,size_t);
-EXTERNC int oclistsetlength(OClist*,size_t);
-
-/* Set the ith element */
-EXTERNC int oclistset(OClist*,size_t,void*);
-/* Get value at position i */
-EXTERNC void* oclistget(OClist*,size_t);/* Return the ith element of l */
-/* Insert at position i; will push up elements i..|seq|. */
-EXTERNC int oclistinsert(OClist*,size_t,void*);
-/* Remove element at position i; will move higher elements down */
-EXTERNC void* oclistremove(OClist* l, size_t i);
-
-/* Tail operations */
-EXTERNC int oclistpush(OClist*,void*); /* Add at Tail */
-EXTERNC void* oclistpop(OClist*);
-EXTERNC void* oclisttop(OClist*);
-
-/* Duplicate and return the content (null terminate) */
-EXTERNC void** oclistdup(OClist*);
-
-/* Look for value match */
-EXTERNC int oclistcontains(OClist*, void*);
-
-/* Remove element by value; only removes first encountered */
-EXTERNC int oclistelemremove(OClist* l, void* elem);
-
-/* remove duplicates */
-EXTERNC int oclistunique(OClist*);
-
-/* Create a clone of a list */
-EXTERNC OClist* oclistclone(OClist*);
-
-/* Following are always "in-lined"*/
-#define oclistclear(l) oclistsetlength((l),0)
-#define oclistextend(l,len) oclistsetalloc((l),(len)+(l->alloc))
-#define oclistcontents(l)  ((l)==NULL?NULL:(l)->content)
-#define oclistlength(l)  ((l)==NULL?0:(l)->length)
-
-#endif /*OCLIST_H*/
diff --git a/oc2/oclog.c b/oc2/oclog.c
deleted file mode 100644
index 7c17ad2..0000000
--- a/oc2/oclog.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/*********************************************************************
- *   Copyright 2010, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Header$
- *********************************************************************/
-
-#include "config.h"
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-
-#include "oclog.h"
-
-#define PREFIXLEN 8
-#define MAXTAGS 256
-#define OCTAGDFALT "Log";
-
-static int oclogginginitialized = 0;
-static int oclogging = 0;
-static int ocsystemfile = 0; /* 1 => we are logging to file we did not open */
-static char* oclogfile = NULL;
-static FILE* oclogstream = NULL;
-
-static int octagsize = 0;
-static char** octagset = NULL;
-static char* octagdfalt = NULL;
-static char* octagsetdfalt[] = {"Warning","Error","Note","Debug"};
-static char* octagname(int tag);
-
-/*!\defgroup OClog OClog Management
-@{*/
-
-/*!\internal
-*/
-
-void
-ocloginit(void)
-{
-    const char* file;
-    if(oclogginginitialized)
-	return;
-    oclogginginitialized = 1;
-    file = getenv(OCENVFLAG);
-    ocsetlogging(0);
-    oclogfile = NULL;
-    oclogstream = NULL;
-    /* Use environment variables to preset oclogging state*/
-    /* I hope this is portable*/
-    if(file != NULL && strlen(file) > 0) {
-        if(oclogopen(file)) {
-	    ocsetlogging(1);
-	}
-    }
-    octagdfalt = OCTAGDFALT;
-    octagset = octagsetdfalt;
-}
-
-/*!
-Enable/Disable logging.
-
-\param[in] tf If 1, then turn on logging, if 0, then turn off logging.
-
-\return The previous value of the logging flag.
-*/
-
-int
-ocsetlogging(int tf)
-{
-    int was;
-    if(!oclogginginitialized) ocloginit();
-    was = oclogging;
-    oclogging = tf;
-    return was;
-}
-
-/*!
-Specify a file into which to place logging output.
-
-\param[in] file The name of the file into which to place logging output.
-If the file has the value NULL, then send logging output to
-stderr.
-
-\return zero if the open failed, one otherwise.
-*/
-
-int
-oclogopen(const char* file)
-{
-    if(!oclogginginitialized) ocloginit();
-    oclogclose();
-    if(file == NULL || strlen(file) == 0) {
-	/* use stderr*/
-	oclogstream = stderr;
-	oclogfile = NULL;
-	ocsystemfile = 1;
-    } else if(strcmp(file,"stdout") == 0) {
-	/* use stdout*/
-	oclogstream = stdout;
-	oclogfile = NULL;
-	ocsystemfile = 1;
-    } else if(strcmp(file,"stderr") == 0) {
-	/* use stderr*/
-	oclogstream = stderr;
-	oclogfile = NULL;
-	ocsystemfile = 1;
-    } else {
-	int fd;
-	oclogfile = strdup(file);
-	oclogstream = NULL;
-	/* We need to deal with this file carefully
-	   to avoid unauthorized access*/
-	fd = open(oclogfile,O_WRONLY|O_APPEND|O_CREAT,0600);
-	if(fd >= 0) {
-	    oclogstream = fdopen(fd,"a");
-	} else {
-	    free(oclogfile);
-	    oclogfile = NULL;
-	    oclogstream = NULL;
-	    ocsetlogging(0);
-	    return 0;
-	}
-	ocsystemfile = 0;
-    }
-    return 1;
-}
-
-void
-oclogclose(void)
-{
-    if(!oclogginginitialized) ocloginit();
-    if(oclogstream != NULL && !ocsystemfile) {
-	fclose(oclogstream);
-    }
-    if(oclogfile != NULL) free(oclogfile);
-    oclogstream = NULL;
-    oclogfile = NULL;
-    ocsystemfile = 0;
-}
-
-/*!
-Send logging messages. This uses a variable
-number of arguments and operates like the stdio
-printf function.
-
-\param[in] tag Indicate the kind of this log message.
-\param[in] fmt Format specification as with printf.
-*/
-
-void
-oclog(int tag, const char* fmt, ...)
-{
-    va_list args;
-    char* prefix;
-
-    if(!oclogginginitialized) ocloginit();
-
-    if(!oclogging || oclogstream == NULL) return;
-
-    prefix = octagname(tag);
-    fprintf(oclogstream,"%s:",prefix);
-
-    if(fmt != NULL) {
-      va_start(args, fmt);
-      vfprintf(oclogstream, fmt, args);
-      va_end( args );
-    }
-    fprintf(oclogstream, "\n" );
-    fflush(oclogstream);
-}
-
-void
-oclogtext(int tag, const char* text)
-{
-    oclogtextn(tag,text,strlen(text));
-}
-
-/*!
-Send arbitrarily long text as a logging message.
-Each line will be sent using oclog with the specified tag.
-
-\param[in] tag Indicate the kind of this log message.
-\param[in] text Arbitrary text to send as a logging message.
-\param[in] count Maximum ength of the text to write.
-*/
-
-void
-oclogtextn(int tag, const char* text, size_t count)
-{
-    if(!oclogging || oclogstream == NULL) return;
-    fwrite(text,1,count,oclogstream);
-    fflush(oclogstream);
-}
-
-/* The tagset is null terminated */
-void
-oclogsettags(char** tagset, char* dfalt)
-{
-    octagdfalt = dfalt;
-    if(tagset == NULL) {
-	octagsize = 0;
-    } else {
-        int i;
-	/* Find end of the tagset */
-	for(i=0;i<MAXTAGS;i++) {if(tagset[i]==NULL) break;}
-	octagsize = i;
-    }
-    octagset = tagset;
-}
-
-static char*
-octagname(int tag)
-{
-    if(tag < 0 || tag >= octagsize) {
-	return octagdfalt;
-    } else {
-	return octagset[tag];
-    }
-}
-
-/**@}*/
diff --git a/oc2/oclog.h b/oc2/oclog.h
deleted file mode 100644
index c696ef1..0000000
--- a/oc2/oclog.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*********************************************************************
- *   Copyright 2010, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
- *   $Header$
- *********************************************************************/
-
-#ifndef OCLOG_H
-#define OCLOG_H
-
-#define OCENVFLAG "OCLOGFILE"
-
-/* Suggested tag values */
-#define OCLOGNOTE 0
-#define OCLOGWARN 1
-#define OCLOGERR 2
-#define OCLOGDBG 3
-
-extern void ocloginit(void);
-extern int ocsetlogging(int tf);
-extern int oclogopen(const char* file);
-extern void oclogclose(void);
-
-/* The tag value is an arbitrary integer */
-extern void oclog(int tag, const char* fmt, ...);
-extern void oclogtext(int tag, const char* text);
-extern void oclogtextn(int tag, const char* text, size_t count);
-
-/* Provide printable names for tags */
-extern void oclogsettags(char** tagset, char* dfalt);
-
-#endif /*OCLOG_H*/
diff --git a/oc2/ocnode.c b/oc2/ocnode.c
index 1bbc92c..e4f0e8f 100644
--- a/oc2/ocnode.c
+++ b/oc2/ocnode.c
@@ -11,29 +11,31 @@ static const unsigned int MAX_UINT = 0xffffffff;
 static OCerror mergedas1(OCnode* dds, OCnode* das);
 static OCerror mergedods1(OCnode* dds, OCnode* das);
 static OCerror mergeother1(OCnode* root, OCnode* das);
-static char* pathtostring(OClist* path, char* separator);
+static char* pathtostring(NClist* path, char* separator);
 static void computefullname(OCnode* node);
+static OCerror mergeother1(OCnode* root, OCnode* das);
+static OCerror mergeother(OCnode* ddsroot, NClist* dasnodes);
 
 /* Process ocnodes to fix various semantic issues*/
 void
-occomputesemantics(OClist* ocnodes)
+occomputesemantics(NClist* ocnodes)
 {
     unsigned int i,j;
     OCASSERT((ocnodes != NULL));
-    for(i=0;i<oclistlength(ocnodes);i++) {
-	OCnode* node = (OCnode*)oclistget(ocnodes,i);
+    for(i=0;i<nclistlength(ocnodes);i++) {
+	OCnode* node = (OCnode*)nclistget(ocnodes,i);
 	/* set the container for dims*/
 	if(node->octype == OC_Dimension && node->dim.array != NULL) {
 	    node->container = node->dim.array->container;
 	}
     }
     /* Fill in array.sizes */
-    for(i=0;i<oclistlength(ocnodes);i++) {
-	OCnode* node = (OCnode*)oclistget(ocnodes,i);
+    for(i=0;i<nclistlength(ocnodes);i++) {
+	OCnode* node = (OCnode*)nclistget(ocnodes,i);
 	if(node->array.rank > 0) {
 	    node->array.sizes = (size_t*)malloc(node->array.rank*sizeof(size_t));
 	    for(j=0;j<node->array.rank;j++) {
-		OCnode* dim = (OCnode*)oclistget(node->array.dimensions,j);
+		OCnode* dim = (OCnode*)nclistget(node->array.dimensions,j);
 		node->array.sizes[j] = dim->dim.declsize;		
 	    }
 	}
@@ -46,8 +48,8 @@ occomputefullnames(OCnode* root)
     unsigned int i;
     if(root->name != NULL) computefullname(root);
     if(root->subnodes != NULL) { /* recurse*/
-        for(i=0;i<oclistlength(root->subnodes);i++) {
-	    OCnode* node = (OCnode*)oclistget(root->subnodes,i);
+        for(i=0;i<nclistlength(root->subnodes);i++) {
+	    OCnode* node = (OCnode*)nclistget(root->subnodes,i);
 	    occomputefullnames(node);
 	}
     }
@@ -58,12 +60,12 @@ computefullname(OCnode* node)
 {
     char* tmp;
     char* fullname;
-    OClist* path;
+    NClist* path;
 
     OCASSERT((node->name != NULL));
     if(node->fullname != NULL)
 	return;
-    path = oclistnew();
+    path = nclistnew();
     occollectpathtonode(node,path);
     tmp = pathtostring(path,PATHSEPARATOR);
     if(tmp == NULL) {
@@ -72,20 +74,20 @@ computefullname(OCnode* node)
         fullname = tmp;
     }
     node->fullname = fullname;
-    oclistfree(path);
+    nclistfree(path);
 }
 
 /* Convert path to a string */
 static char*
-pathtostring(OClist* path, char* separator)
+pathtostring(NClist* path, char* separator)
 {
     int slen,i,len;
     char* pathname;
     if(path == NULL) return NULL;
-    len = oclistlength(path);
+    len = nclistlength(path);
     if(len == 0) return NULL;
     for(i=0,slen=0;i<len;i++) {
-	OCnode* node = (OCnode*)oclistget(path,(size_t)i);
+	OCnode* node = (OCnode*)nclistget(path,(size_t)i);
 	if(node->container == NULL || node->name == NULL) continue;
 	slen += strlen(node->name);
     }
@@ -95,7 +97,7 @@ pathtostring(OClist* path, char* separator)
     MEMCHECK(pathname,NULL);
     pathname[0] = '\0';
     for(i=0;i<len;i++) {
-	OCnode* node = (OCnode*)oclistget(path,(size_t)i);
+	OCnode* node = (OCnode*)nclistget(path,(size_t)i);
 	if(node->container == NULL || node->name == NULL) continue;
 	if(strlen(pathname) > 0) strcat(pathname,separator);
         strcat(pathname,node->name);
@@ -105,11 +107,11 @@ pathtostring(OClist* path, char* separator)
 
 /* Collect the set of nodes ending in "node"*/
 void
-occollectpathtonode(OCnode* node, OClist* path)
+occollectpathtonode(OCnode* node, NClist* path)
 {
     if(node == NULL) return;
     occollectpathtonode(node->container,path);
-    oclistpush(path,(void*)node);
+    nclistpush(path,(void*)node);
 }
 
 OCnode*
@@ -128,19 +130,19 @@ ocnode_new(char* name, OCtype ptype, OCnode* root)
 }
 
 static OCattribute*
-makeattribute(char* name, OCtype ptype, OClist* values)
+makeattribute(char* name, OCtype ptype, NClist* values)
 {
     OCattribute* att = (OCattribute*)ocmalloc(sizeof(OCattribute)); /* ocmalloc zeros*/
     MEMCHECK(att,(OCattribute*)NULL);
     att->name = nulldup(name);
     att->etype = ptype;
-    att->nvalues = oclistlength(values);
+    att->nvalues = nclistlength(values);
     att->values = NULL;
     if(att->nvalues > 0) {
 	int i;
         att->values = (char**)ocmalloc(sizeof(char*)*att->nvalues);
         for(i=0;i<att->nvalues;i++)
-	    att->values[i] = nulldup((char*)oclistget(values,(size_t)i));
+	    att->values[i] = nulldup((char*)nclistget(values,(size_t)i));
     }
     return att;
 }
@@ -161,10 +163,10 @@ ocroot_free(OCnode* root)
     if(tree->data.data != NULL)
 	ocdata_free(state,tree->data.data);
 
-    for(i=0;i<oclistlength(state->trees);i++) {
-	OCnode* node = (OCnode*)oclistget(state->trees,(size_t)i);
+    for(i=0;i<nclistlength(state->trees);i++) {
+	OCnode* node = (OCnode*)nclistget(state->trees,(size_t)i);
 	if(root == node)
-	    oclistremove(state->trees,(size_t)i);
+	    nclistremove(state->trees,(size_t)i);
     }
     /* Note: it is ok if state->trees does not contain this root */    
     octree_free(tree);
@@ -187,19 +189,19 @@ octree_free(OCtree* tree)
 }
 
 void
-ocnodes_free(OClist* nodes)
+ocnodes_free(NClist* nodes)
 {
     unsigned int i,j;
-    for(i=0;i<oclistlength(nodes);i++) {
-	OCnode* node = (OCnode*)oclistget(nodes,i);
+    for(i=0;i<nclistlength(nodes);i++) {
+	OCnode* node = (OCnode*)nclistget(nodes,i);
         ocfree(node->name);
         ocfree(node->fullname);
-        while(oclistlength(node->att.values) > 0) {
-	    char* value = (char*)oclistpop(node->att.values);
+        while(nclistlength(node->att.values) > 0) {
+	    char* value = (char*)nclistpop(node->att.values);
 	    ocfree(value);
         }
-        while(oclistlength(node->attributes) > 0) {
-            OCattribute* attr = (OCattribute*)oclistpop(node->attributes);
+        while(nclistlength(node->attributes) > 0) {
+            OCattribute* attr = (OCattribute*)nclistpop(node->attributes);
 	    ocfree(attr->name);
 #if 0
 	    /* If the attribute type is string, then we need to free them*/
@@ -213,14 +215,14 @@ all values are strings now
 	    ocfree(attr->values);
 	    ocfree(attr);
         }
-        if(node->array.dimensions != NULL) oclistfree(node->array.dimensions);
-        if(node->subnodes != NULL) oclistfree(node->subnodes);
-        if(node->att.values != NULL) oclistfree(node->att.values);
-        if(node->attributes != NULL) oclistfree(node->attributes);
+        if(node->array.dimensions != NULL) nclistfree(node->array.dimensions);
+        if(node->subnodes != NULL) nclistfree(node->subnodes);
+        if(node->att.values != NULL) nclistfree(node->att.values);
+        if(node->attributes != NULL) nclistfree(node->attributes);
 	if(node->array.sizes != NULL) free(node->array.sizes);
         ocfree(node);
     }
-    oclistfree(nodes);
+    nclistfree(nodes);
 }
 
 /*
@@ -245,11 +247,11 @@ OCerror
 ocddsdasmerge(OCstate* state, OCnode* dasroot, OCnode* ddsroot)
 {
     OCerror stat = OC_NOERR;
-    OClist* dasglobals = oclistnew();
-    OClist* dodsglobals = oclistnew(); /* top-level DODS_XXX {...} */
-    OClist* dasnodes = oclistnew();
-    OClist* varnodes = oclistnew();
-    OClist* ddsnodes;
+    NClist* dasglobals = nclistnew();
+    NClist* dodsglobals = nclistnew(); /* top-level DODS_XXX {...} */
+    NClist* dasnodes = nclistnew();
+    NClist* varnodes = nclistnew();
+    NClist* ddsnodes;
     unsigned int i,j;
 
     if(dasroot->tree == NULL || dasroot->tree->dxdclass != OCDAS)
@@ -266,39 +268,39 @@ ocddsdasmerge(OCstate* state, OCnode* dasroot, OCnode* ddsroot)
           Simultaneously look for potential ambiguities
           if found; complain but continue: result are indeterminate.
           also collect globals separately*/
-    for(i=0;i<oclistlength(dasroot->tree->nodes);i++) {
-	OCnode* das = (OCnode*)oclistget(dasroot->tree->nodes,i);
+    for(i=0;i<nclistlength(dasroot->tree->nodes);i++) {
+	OCnode* das = (OCnode*)nclistget(dasroot->tree->nodes,i);
 	int hasattributes = 0;
 	if(das->octype == OC_Attribute) continue; /* ignore these for now*/
 	if(das->name == NULL || das->att.isglobal) {
-	    oclistpush(dasglobals,(void*)das);
+	    nclistpush(dasglobals,(void*)das);
 	    continue;
 	}
 	if(das->att.isdods) {
-	    oclistpush(dodsglobals,(void*)das);
+	    nclistpush(dodsglobals,(void*)das);
 	    continue;
 	}
-	for(j=0;j<oclistlength(das->subnodes);j++) {
-	    OCnode* subnode = (OCnode*)oclistget(das->subnodes,j);
+	for(j=0;j<nclistlength(das->subnodes);j++) {
+	    OCnode* subnode = (OCnode*)nclistget(das->subnodes,j);
 	    if(subnode->octype == OC_Attribute) {hasattributes = 1; break;}
 	}
 	if(hasattributes) {
 	    /* Look for previously collected nodes with same name*/
-            for(j=0;j<oclistlength(dasnodes);j++) {
-	        OCnode* das2 = (OCnode*)oclistget(dasnodes,j);
+            for(j=0;j<nclistlength(dasnodes);j++) {
+	        OCnode* das2 = (OCnode*)nclistget(dasnodes,j);
 		if(das->name == NULL || das2->name == NULL) continue;
 		if(strcmp(das->name,das2->name)==0) {
-		    oclog(OCLOGWARN,"oc_mergedas: potentially ambiguous DAS name: %s",das->name);
+		    nclog(NCLOGWARN,"oc_mergedas: potentially ambiguous DAS name: %s",das->name);
 		}
 	    }
-	    oclistpush(dasnodes,(void*)das);
+	    nclistpush(dasnodes,(void*)das);
 	}
     }
 
     /* 2. collect all the leaf DDS nodes (of type OC_Atomic)*/
-    for(i=0;i<oclistlength(ddsnodes);i++) {
-	OCnode* dds = (OCnode*)oclistget(ddsnodes,i);
-	if(dds->octype == OC_Atomic) oclistpush(varnodes,(void*)dds);
+    for(i=0;i<nclistlength(ddsnodes);i++) {
+	OCnode* dds = (OCnode*)nclistget(ddsnodes,i);
+	if(dds->octype == OC_Atomic) nclistpush(varnodes,(void*)dds);
     }
 
     /* 3. For each das node, locate matching DDS node(s) and attach
@@ -308,46 +310,47 @@ ocddsdasmerge(OCstate* state, OCnode* dasroot, OCnode* ddsroot)
           2. DAS->name :: DDS->fullname (support DAS names with embedded '.')
           3. DAS->name :: DDS->name
     */
-    for(i=0;i<oclistlength(dasnodes);i++) {
-	OCnode* das = (OCnode*)oclistget(dasnodes,i);
-        for(j=0;j<oclistlength(varnodes);j++) {
-	    OCnode* dds = (OCnode*)oclistget(varnodes,j);
+    for(i=0;i<nclistlength(dasnodes);i++) {
+	OCnode* das = (OCnode*)nclistget(dasnodes,i);
+        for(j=0;j<nclistlength(varnodes);j++) {
+	    OCnode* dds = (OCnode*)nclistget(varnodes,j);
 	    if(strcmp(das->fullname,dds->fullname)==0
 	       || strcmp(das->name,dds->fullname)==0
 	       || strcmp(das->name,dds->name)==0) {
 		mergedas1(dds,das);
 		/* remove from dasnodes list*/
-		oclistset(dasnodes,i,(void*)NULL);
+		nclistset(dasnodes,i,(void*)NULL);
 	    }
 	}
     }
 
     /* 4. Assign globals*/
-    for(i=0;i<oclistlength(dasglobals);i++) {
-	OCnode* das = (OCnode*)oclistget(dasglobals,i);
+    for(i=0;i<nclistlength(dasglobals);i++) {
+	OCnode* das = (OCnode*)nclistget(dasglobals,i);
 	if(das == NULL) continue;
 	mergedas1(ddsroot,das);
     }
     /* 5. Assign DODS_*/
-    for(i=0;i<oclistlength(dodsglobals);i++) {
-	OCnode* das = (OCnode*)oclistget(dodsglobals,i);
+    for(i=0;i<nclistlength(dodsglobals);i++) {
+	OCnode* das = (OCnode*)nclistget(dodsglobals,i);
 	if(das == NULL) continue;
 	mergedods1(ddsroot,das);
     }
+
     /* 6. Assign other orphan attributes, which means
-	  construct their full name and assign as a global attribute. */
-    for(i=0;i<oclistlength(dasnodes);i++) {
-	OCnode* das = (OCnode*)oclistget(dasnodes,i);
-	if(das == NULL) continue;
-	mergeother1(ddsroot, das);
-    }
+	  construct their full name and assign as a global attribute.
+	  This is complicated because some servers (e.g. thredds) returns
+          attributes for variables that were not referenced in the DDS.
+          These we continue to suppress.
+     */
+    mergeother(ddsroot,dasnodes);
 
 done:
     /* cleanup*/
-    oclistfree(dasglobals);
-    oclistfree(dodsglobals);
-    oclistfree(dasnodes);
-    oclistfree(varnodes);
+    nclistfree(dasglobals);
+    nclistfree(dodsglobals);
+    nclistfree(dasnodes);
+    nclistfree(varnodes);
     return OCTHROW(stat);
 }
 
@@ -357,15 +360,20 @@ mergedas1(OCnode* dds, OCnode* das)
     unsigned int i;
     OCerror stat = OC_NOERR;
     if(das == NULL) return OC_NOERR; /* nothing to do */
-    if(dds->attributes == NULL) dds->attributes = oclistnew();
+    if(dds->attributes == NULL) dds->attributes = nclistnew();
     /* assign the simple attributes in the das set to this dds node*/
-    for(i=0;i<oclistlength(das->subnodes);i++) {
-	OCnode* attnode = (OCnode*)oclistget(das->subnodes,i);
+    for(i=0;i<nclistlength(das->subnodes);i++) {
+	OCnode* attnode = (OCnode*)nclistget(das->subnodes,i);
 	if(attnode->octype == OC_Attribute) {
+	    if(dds->octype == OC_Atomic
+		|| dds->octype == OC_Sequence
+		|| dds->octype == OC_Structure
+		|| dds->octype == OC_Grid)
+	        attnode->att.var = dds;
 	    OCattribute* att = makeattribute(attnode->name,
 						attnode->etype,
 						attnode->att.values);
-            oclistpush(dds->attributes,(void*)att);
+            nclistpush(dds->attributes,(void*)att);
 	}
     }
     return OCTHROW(stat);
@@ -378,12 +386,12 @@ mergedods1(OCnode* dds, OCnode* dods)
     OCerror stat = OC_NOERR;
     if(dods == NULL) return OC_NOERR; /* nothing to do */
     OCASSERT(dods->octype == OC_Attributeset);
-    if(dds->attributes == NULL) dds->attributes = oclistnew();
+    if(dds->attributes == NULL) dds->attributes = nclistnew();
     /* assign the simple attributes in the das set to this dds node
        with renaming to tag as DODS_
     */
-    for(i=0;i<oclistlength(dods->subnodes);i++) {
-	OCnode* attnode = (OCnode*)oclistget(dods->subnodes,i);
+    for(i=0;i<nclistlength(dods->subnodes);i++) {
+	OCnode* attnode = (OCnode*)nclistget(dods->subnodes,i);
 	if(attnode->octype == OC_Attribute) {
 	    OCattribute* att;
 	    /* prefix the attribute name with the name of the attribute
@@ -400,37 +408,54 @@ mergedods1(OCnode* dds, OCnode* dods)
 	    strcat(newname,attnode->name);
 	    att = makeattribute(newname,attnode->etype,attnode->att.values);
 	    free(newname);
-            oclistpush(dds->attributes,(void*)att);
+            nclistpush(dds->attributes,(void*)att);
 	}
     }
     return OCTHROW(stat);
 }
 
 static OCerror
+mergeother(OCnode* ddsroot, NClist* dasnodes)
+{
+    OCerror stat = OC_NOERR;
+    int i;
+    for(i=0;i<nclistlength(dasnodes);i++) {
+	OCnode* das = (OCnode*)nclistget(dasnodes,i);
+	if(das == NULL) continue;
+	if((stat = mergeother1(ddsroot, das))) break;
+    }
+    return stat;
+}
+
+static OCerror
 mergeother1(OCnode* root, OCnode* das)
 {
     OCerror stat = OC_NOERR;
     OCattribute* att = NULL;
 
     OCASSERT(root != NULL);
-    if(root->attributes == NULL) root->attributes = oclistnew();
+    if(root->attributes == NULL) root->attributes = nclistnew();
+
+    /* Only include if this is not connected to a variable */
+    if(das->att.var != NULL) goto done;
 
     if(das->octype == OC_Attribute) {
         /* compute the full name of this attribute */
         computefullname(das);
         /* create attribute */
         att = makeattribute(das->fullname,das->etype,das->att.values);	
-        oclistpush(root->attributes,(void*)att);
+        nclistpush(root->attributes,(void*)att);
     } else if(das->octype == OC_Attributeset) {
 	int i;
 	/* Recurse */
-        for(i=0;i<oclistlength(das->subnodes);i++) {
-	    OCnode* sub = (OCnode*)oclistget(das->subnodes,i);
+        for(i=0;i<nclistlength(das->subnodes);i++) {
+	    OCnode* sub = (OCnode*)nclistget(das->subnodes,i);
 	    if(sub == NULL) continue;
 	    mergeother1(root,sub);
 	}	
     } else
 	stat = OC_EDAS;
+done:
     return OCTHROW(stat);
 }
 
@@ -440,8 +465,8 @@ ocuncorrelate(OCnode* root)
     OCtree* tree = root->tree;
     unsigned int i;
     if(tree == NULL) return;
-    for(i=0;i<oclistlength(tree->nodes);i++) {
-	OCnode* node = (OCnode*)oclistget(tree->nodes,i);
+    for(i=0;i<nclistlength(tree->nodes);i++) {
+	OCnode* node = (OCnode*)nclistget(tree->nodes,i);
 	node->datadds = NULL;
     }        
 }
@@ -474,10 +499,10 @@ occorrelater(OCnode* dds, OCnode* dxd)
     case OC_Grid:
     case OC_Sequence:
 	/* Remember: there may be fewer datadds fields than dds fields */
-	for(i=0;i<oclistlength(dxd->subnodes);i++) {
-	    OCnode* dxd1 = (OCnode*)oclistget(dxd->subnodes,(size_t)i);
-	    for(j=0;j<oclistlength(dds->subnodes);j++) {
-		OCnode* dds1 = (OCnode*)oclistget(dds->subnodes,(size_t)j);
+	for(i=0;i<nclistlength(dxd->subnodes);i++) {
+	    OCnode* dxd1 = (OCnode*)nclistget(dxd->subnodes,(size_t)i);
+	    for(j=0;j<nclistlength(dds->subnodes);j++) {
+		OCnode* dds1 = (OCnode*)nclistget(dds->subnodes,(size_t)j);
 		if(strcmp(dxd1->name,dds1->name) == 0) {
 		    ocstat = occorrelater(dds1,dxd1);
 		    if(ocstat != OC_NOERR) {OCTHROWCHK(ocstat); goto fail;}
@@ -493,9 +518,9 @@ occorrelater(OCnode* dds, OCnode* dxd)
     }
     /* Correlate the dimensions */
     if(dds->array.rank > 0) {
-	for(i=0;i<oclistlength(dxd->subnodes);i++) {
-	    OCnode* ddsdim = (OCnode*)oclistget(dds->array.dimensions,(size_t)i);
-	    OCnode* dxddim = (OCnode*)oclistget(dxd->array.dimensions,(size_t)i);
+	for(i=0;i<nclistlength(dxd->subnodes);i++) {
+	    OCnode* ddsdim = (OCnode*)nclistget(dds->array.dimensions,(size_t)i);
+	    OCnode* dxddim = (OCnode*)nclistget(dxd->array.dimensions,(size_t)i);
 	    ocstat = occorrelater(ddsdim,dxddim);
 	    if(!ocstat) goto fail;	    
 	}	
@@ -525,20 +550,20 @@ ocmarkcacheable(OCstate* state, OCnode* ddsroot)
 #if 0
     int ok;
 #endif
-    OClist* treenodes = ddsroot->tree->nodes;
-    OClist* path = oclistnew();
-    for(i=0;i<oclistlength(treenodes);i++) {
-        OCnode* node = (OCnode*)oclistget(treenodes,(size_t)i);
+    NClist* treenodes = ddsroot->tree->nodes;
+    NClist* path = nclistnew();
+    for(i=0;i<nclistlength(treenodes);i++) {
+        OCnode* node = (OCnode*)nclistget(treenodes,(size_t)i);
 	if(node->octype != OC_Atomic) continue;
 	if(node->etype != OC_String && node->etype != OC_URL) continue;
 	/* collect node path */
-        oclistclear(path);
+        nclistclear(path);
         occollectpathtonode(node,path);	
 #if 0
         ok = 1;
 #endif
-	for(j=1;j<oclistlength(path)-1;j++) {/* skip top level dataset and node itself*/
-            OCnode* pathnode = (OCnode*)oclistget(path,(size_t)j);
+	for(j=1;j<nclistlength(path)-1;j++) {/* skip top level dataset and node itself*/
+            OCnode* pathnode = (OCnode*)nclistget(path,(size_t)j);
 	    if(pathnode->octype != OC_Structure
 		|| pathnode->array.rank > 0) {
 #if 0
@@ -554,7 +579,7 @@ ocmarkcacheable(OCstate* state, OCnode* ddsroot)
 	}
 #endif
     }
-    oclistfree(path);
+    nclistfree(path);
 }
 
 #if 0
@@ -564,30 +589,30 @@ ocddsdasmerge(OCstate* state, OCnode* ddsroot, OCnode* dasroot)
 {
     int i,j;
     OCerror stat = OC_NOERR;
-    OClist* globals = oclistnew();
+    NClist* globals = nclistnew();
     if(dasroot == NULL) return OCTHROW(stat);
     /* Start by looking for global attributes*/
-    for(i=0;i<oclistlength(dasroot->subnodes);i++) {
-	OCnode* node = (OCnode*)oclistget(dasroot->subnodes,i);
+    for(i=0;i<nclistlength(dasroot->subnodes);i++) {
+	OCnode* node = (OCnode*)nclistget(dasroot->subnodes,i);
 	if(node->att.isglobal) {
-	    for(j=0;j<oclistlength(node->subnodes);j++) {
-		OCnode* attnode = (OCnode*)oclistget(node->subnodes,j);
+	    for(j=0;j<nclistlength(node->subnodes);j++) {
+		OCnode* attnode = (OCnode*)nclistget(node->subnodes,j);
 		Attribute* att = makeattribute(attnode->name,
 						attnode->etype,
 						attnode->att.values);
-		oclistpush(globals,(void*)att);
+		nclistpush(globals,(void*)att);
 	    }
 	}
     }
     ddsroot->attributes = globals;
     /* Now try to match subnode names with attribute set names*/
-    for(i=0;i<oclistlength(dasroot->subnodes);i++) {
-	OCnode* das = (OCnode*)oclistget(dasroot->subnodes,i);
+    for(i=0;i<nclistlength(dasroot->subnodes);i++) {
+	OCnode* das = (OCnode*)nclistget(dasroot->subnodes,i);
 	int match = 0;
         if(das->att.isglobal) continue;
         if(das->octype == OC_Attributeset) {
-            for(j=0;j<oclistlength(ddsroot->subnodes) && !match;j++) {
-	        OCnode* dds = (OCnode*)oclistget(ddsroot->subnodes,j);
+            for(j=0;j<nclistlength(ddsroot->subnodes) && !match;j++) {
+	        OCnode* dds = (OCnode*)nclistget(ddsroot->subnodes,j);
 	        if(strcmp(das->name,dds->name) == 0) {
 		    match = 1;
 	            stat = mergedas1(dds,das);
@@ -608,24 +633,24 @@ mergedas1(OCnode* dds, OCnode* das)
 {
     int i,j;
     int stat = OC_NOERR;
-    if(dds->attributes == NULL) dds->attributes = oclistnew();
+    if(dds->attributes == NULL) dds->attributes = nclistnew();
     /* assign the simple attributes in the das set to this dds node*/
-    for(i=0;i<oclistlength(das->subnodes);i++) {
-	OCnode* attnode = (OCnode*)oclistget(das->subnodes,i);
+    for(i=0;i<nclistlength(das->subnodes);i++) {
+	OCnode* attnode = (OCnode*)nclistget(das->subnodes,i);
 	if(attnode->octype == OC_Attribute) {
 	    Attribute* att = makeattribute(attnode->name,
 						attnode->etype,
 						attnode->att.values);
-            oclistpush(dds->attributes,(void*)att);
+            nclistpush(dds->attributes,(void*)att);
 	}
     }
     /* Try to merge any enclosed sets with subnodes of dds*/
-    for(i=0;i<oclistlength(das->subnodes);i++) {
-	OCnode* dasnode = (OCnode*)oclistget(das->subnodes,i);
+    for(i=0;i<nclistlength(das->subnodes);i++) {
+	OCnode* dasnode = (OCnode*)nclistget(das->subnodes,i);
 	int match = 0;
         if(dasnode->octype == OC_Attribute) continue; /* already dealt with above*/
-        for(j=0;j<oclistlength(dds->subnodes) && !match;j++) {
-	    OCnode* ddsnode = (OCnode*)oclistget(dds->subnodes,j);
+        for(j=0;j<nclistlength(dds->subnodes) && !match;j++) {
+	    OCnode* ddsnode = (OCnode*)nclistget(dds->subnodes,j);
 	    if(strcmp(dasnode->name,ddsnode->name) == 0) {
 	        match = 1;
 	        stat = mergedas1(ddsnode,dasnode);
diff --git a/oc2/ocnode.h b/oc2/ocnode.h
index 12cf0a9..23f9967 100644
--- a/oc2/ocnode.h
+++ b/oc2/ocnode.h
@@ -17,7 +17,7 @@ typedef struct OCdiminfo {
 /*! Specifies the Arrayinfo.*/
 typedef struct OCarrayinfo {
     /* The complete set of dimension info applicable to this node*/
-    OClist*  dimensions;
+    NClist*  dimensions;
     /* convenience (because they are computed so often*/
     size_t rank; /* == |dimensions|*/
     size_t* sizes;
@@ -36,7 +36,8 @@ typedef struct OCattribute {
 typedef struct OCattinfo {
     int isglobal; /* is this supposed to be a global attribute set?*/
     int isdods;   /* is this a global DODS_XXX  attribute set */
-    OClist* values; /* oclist<char*>*/
+    NClist* values; /* oclist<char*>*/
+    struct OCnode* var; /* containing var else null */
 } OCattinfo;
 
 /*! Specifies the OCnode. */
@@ -54,9 +55,9 @@ struct OCnode {
     OCarrayinfo     array;     /* octype == {OC_Structure, OC_Primitive}*/
     OCattinfo       att;       /* octype == OC_Attribute */
     /* primary edge info*/
-    OClist* subnodes; /*oclist<OCnode*>*/
+    NClist* subnodes; /*oclist<OCnode*>*/
     /*int     attributed;*/ /* 1 if merge was done*/
-    OClist* attributes; /* oclist<OCattribute*>*/
+    NClist* attributes; /* oclist<OCattribute*>*/
     OCdata* data; /* Defined only if this node is a top-level atomic variable*/
 };
 
@@ -68,18 +69,18 @@ struct OCnode {
 #endif
 
 extern OCnode* ocnode_new(char* name, OCtype ptype, OCnode* root);
-extern void occollectpathtonode(OCnode* node, OClist* path);
+extern void occollectpathtonode(OCnode* node, NClist* path);
 extern void occomputefullnames(OCnode* root);
-extern void occomputesemantics(OClist*);
+extern void occomputesemantics(NClist*);
 extern void ocaddattribute(OCattribute* attr, OCnode* parent);
-extern OCattribute* ocmakeattribute(char* name, OCtype ptype, OClist* values);
+extern OCattribute* ocmakeattribute(char* name, OCtype ptype, NClist* values);
 extern size_t ocsetsize(OCnode* node);
 extern OCerror occorrelate(OCnode*,OCnode*);
 extern void ocmarkcacheable(OCstate* state, OCnode* ddsroot);
 
 extern void octree_free(struct OCtree* tree);
 extern void ocroot_free(OCnode* root);
-extern void ocnodes_free(OClist*);
+extern void ocnodes_free(NClist*);
 
 /* Merge DAS with DDS or DATADDS*/
 extern OCerror ocddsdasmerge(struct OCstate*, OCnode* das, OCnode* dds);
diff --git a/oc2/ocrc.c b/oc2/ocrc.c
index 239c73b..6ffc6a9 100644
--- a/oc2/ocrc.c
+++ b/oc2/ocrc.c
@@ -9,9 +9,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "netcdf.h"
 #include "ocinternal.h"
 #include "ocdebug.h"
-#include "oclog.h"
+#include "nclog.h"
 
 #define OCRCFILEENV "DAPRCFILE"
 
@@ -49,20 +50,20 @@ occredentials_in_url(const char *url)
 static OCerror
 ocextract_credentials(const char *url, char **userpwd, char **result_url)
 {
-    OCURI* parsed = NULL;
-    if(!ocuriparse(url,&parsed))
+    NCURI* parsed = NULL;
+    if(ncuriparse(url,&parsed) != NCU_OK)
 	return OCTHROW(OC_EBADURL);
-    if(parsed->userpwd == NULL) {
-	ocurifree(parsed);
+    if(parsed->user != NULL || parsed->password == NULL) {
+	ncurifree(parsed);
 	return OCTHROW(OC_EBADURL);
     }
-    if(userpwd) *userpwd = strdup(parsed->userpwd);
-    ocurifree(parsed);
+    if(userpwd) *userpwd = combinecredentials(parsed->user,parsed->password);
+    ncurifree(parsed);
     return OC_NOERR;
 }
 
 char*
-occombinehostport(const OCURI* uri)
+occombinehostport(const NCURI* uri)
 {
     char* hp;
     int len = 0;
@@ -95,7 +96,7 @@ combinecredentials(const char* user, const char* pwd)
     userPassSize = strlen(user) + strlen(pwd) + 2;
     userPassword = malloc(sizeof(char) * userPassSize);
     if (!userPassword) {
-        oclog(OCLOGERR,"Out of Memory\n");
+        nclog(NCLOGERR,"Out of Memory\n");
 	return NULL;
     }
     occopycat(userPassword,userPassSize-1,3,user,":",pwd);
@@ -204,11 +205,11 @@ ocparseproxy(OCstate* state, char* v)
      state->proxy.password[p_len] = '\0';
 #endif /*0*/
      if (ocdebug > 1) {
-         oclog(OCLOGNOTE,"host name: %s", state->proxy.host);
+         nclog(NCLOGNOTE,"host name: %s", state->proxy.host);
 #ifdef INSECURE
-         oclog(OCLOGNOTE,"user+pwd: %s", state->proxy.userpwd);
+         nclog(NCLOGNOTE,"user+pwd: %s", state->proxy.userpwd);
 #endif
-         oclog(OCLOGNOTE,"port number: %d", state->proxy.port);
+         nclog(NCLOGNOTE,"port number: %d", state->proxy.port);
     }
     if(v) free(v);
     return OC_NOERR;
@@ -228,7 +229,7 @@ sorttriplestore(struct OCTriplestore* store)
 
     sorted = (struct OCTriple*)malloc(sizeof(struct OCTriple)*store->ntriples);
     if(sorted == NULL) {
-        oclog(OCLOGERR,"sorttriplestore: out of memory");
+        nclog(NCLOGERR,"sorttriplestore: out of memory");
         return;
     }
 
@@ -280,7 +281,7 @@ ocrc_compile(const char* path)
 
     in_file = fopen(path, "r"); /* Open the file to read it */
     if (in_file == NULL) {
-        oclog(OCLOGERR, "Could not open configuration file: %s",path);
+        nclog(NCLOGERR, "Could not open configuration file: %s",path);
         return OC_EPERM;
     }
 
@@ -290,7 +291,7 @@ ocrc_compile(const char* path)
         if(!rcreadline(in_file,line0,sizeof(line0))) break;
         linecount++;
         if(linecount >= MAXRCLINES) {
-            oclog(OCLOGERR, ".rc has too many lines");
+            nclog(NCLOGERR, ".rc has too many lines");
             return 0;
         }
         line = line0;
@@ -300,7 +301,7 @@ ocrc_compile(const char* path)
         rctrim(line);  /* trim leading and trailing blanks */
 	if(strlen(line) == 0) continue;
         if(strlen(line) >= MAXRCLINESIZE) {
-            oclog(OCLOGERR, "%s line too long: %s",path,line0);
+            nclog(NCLOGERR, "%s line too long: %s",path,line0);
             continue; /* ignore it */
         }
         /* setup */
@@ -308,18 +309,18 @@ ocrc_compile(const char* path)
         ocrc->triples[ocrc->ntriples].key[0] = '\0';
         ocrc->triples[ocrc->ntriples].value[0] = '\0';
         if(line[0] == LTAG) {
-	    OCURI* uri;
+	    NCURI* uri;
             char* url = ++line;
             char* rtag = strchr(line,RTAG);
             if(rtag == NULL) {
-                oclog(OCLOGERR, "Malformed [url] in %s entry: %s",path,line);
+                nclog(NCLOGERR, "Malformed [url] in %s entry: %s",path,line);
                 continue;
             }
             line = rtag + 1;
             *rtag = '\0';
             /* compile the url and pull out the host */
-	    if(!ocuriparse(url,&uri)) {
-                oclog(OCLOGERR, "Malformed [url] in %s entry: %s",path,line);
+	    if(ncuriparse(url,&uri) != NCU_OK) {
+                nclog(NCLOGERR, "Malformed [url] in %s entry: %s",path,line);
 		continue;
 	    }
             strncpy(ocrc->triples[ocrc->ntriples].host,uri->host,MAXRCLINESIZE-1);
@@ -327,7 +328,7 @@ ocrc_compile(const char* path)
                 strncat(ocrc->triples[ocrc->ntriples].host,":",MAXRCLINESIZE-1);
                 strncat(ocrc->triples[ocrc->ntriples].host,uri->port,MAXRCLINESIZE-1);
 	    }
-	    ocurifree(uri);
+	    ncurifree(uri);
         }
         /* split off key and value */
         key=line;
@@ -363,7 +364,7 @@ ocrc_load(void)
     char* path = NULL;
 
     if(ocglobalstate.rc.ignore) {
-        oclog(OCLOGDBG,"No runtime configuration file specified; continuing");
+        nclog(NCLOGDBG,"No runtime configuration file specified; continuing");
 	return OC_NOERR;
     }
     if(ocglobalstate.rc.loaded) return OC_NOERR;
@@ -392,12 +393,12 @@ ocrc_load(void)
 	}
     }
     if(path == NULL) {
-        oclog(OCLOGDBG,"Cannot find runtime configuration file; continuing");
+        nclog(NCLOGDBG,"Cannot find runtime configuration file; continuing");
     } else {
 	if(ocdebug > 0)
 	    fprintf(stderr, "RC file: %s\n", path);
         if(ocrc_compile(path) == 0) {
-	    oclog(OCLOGERR, "Error parsing %s\n",path);
+	    nclog(NCLOGERR, "Error parsing %s\n",path);
 	    stat = OC_ERCFILE;
 	}
     }
@@ -413,7 +414,7 @@ ocrc_process(OCstate* state)
 {
     OCerror stat = OC_NOERR;
     char* value = NULL;
-    OCURI* uri = state->uri;
+    NCURI* uri = state->uri;
     char* url_userpwd = NULL;
     char* url_hostport = NULL;
 
@@ -426,7 +427,7 @@ ocrc_process(OCstate* state)
        to getinfo e.g. user:pwd from url
     */
 
-    url_userpwd = uri->userpwd;
+    url_userpwd = combinecredentials(uri->user,uri->password);
     url_hostport = occombinehostport(uri);
     if(url_hostport == NULL)
 	return OC_ENOMEM;
@@ -435,23 +436,23 @@ ocrc_process(OCstate* state)
     if(value != NULL) {
         if(atoi(value)) state->curlflags.compress = 1;
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.DEFLATE: %ld", state->curlflags.compress);
+            nclog(NCLOGNOTE,"HTTP.DEFLATE: %ld", state->curlflags.compress);
     }
     if((value = ocrc_lookup("HTTP.VERBOSE",url_hostport)) != NULL) {
         if(atoi(value)) state->curlflags.verbose = 1;
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.VERBOSE: %ld", state->curlflags.verbose);
+            nclog(NCLOGNOTE,"HTTP.VERBOSE: %ld", state->curlflags.verbose);
     }
     if((value = ocrc_lookup("HTTP.TIMEOUT",url_hostport)) != NULL) {
         if(atoi(value)) state->curlflags.timeout = atoi(value);
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.TIMEOUT: %ld", state->curlflags.timeout);
+            nclog(NCLOGNOTE,"HTTP.TIMEOUT: %ld", state->curlflags.timeout);
     }
     if((value = ocrc_lookup("HTTP.USERAGENT",url_hostport)) != NULL) {
         if(atoi(value)) state->curlflags.useragent = strdup(value);
         if(state->curlflags.useragent == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.USERAGENT: %s", state->curlflags.useragent);
+            nclog(NCLOGNOTE,"HTTP.USERAGENT: %s", state->curlflags.useragent);
     }
 
     if(
@@ -463,14 +464,14 @@ ocrc_process(OCstate* state)
         state->curlflags.cookiejar = strdup(value);
         if(state->curlflags.cookiejar == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.COOKIEJAR: %s", state->curlflags.cookiejar);
+            nclog(NCLOGNOTE,"HTTP.COOKIEJAR: %s", state->curlflags.cookiejar);
     }
 
     if((value = ocrc_lookup("HTTP.PROXY_SERVER",url_hostport)) != NULL) {
         stat = ocparseproxy(state,value);
         if(stat != OC_NOERR) goto done;
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.PROXY_SERVER: %s", value);
+            nclog(NCLOGNOTE,"HTTP.PROXY_SERVER: %s", value);
     }
 
     if((value = ocrc_lookup("HTTP.SSL.VALIDATE",url_hostport)) != NULL) {
@@ -478,7 +479,7 @@ ocrc_process(OCstate* state)
 	    state->ssl.verifypeer = 1;
 	    state->ssl.verifyhost = 1;
             if(ocdebug > 0)
-                oclog(OCLOGNOTE,"HTTP.SSL.VALIDATE: %ld", 1);
+                nclog(NCLOGNOTE,"HTTP.SSL.VALIDATE: %ld", 1);
 	}
     }
 
@@ -486,35 +487,35 @@ ocrc_process(OCstate* state)
         state->ssl.certificate = strdup(value);
         if(state->ssl.certificate == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.SSL.CERTIFICATE: %s", state->ssl.certificate);
+            nclog(NCLOGNOTE,"HTTP.SSL.CERTIFICATE: %s", state->ssl.certificate);
     }
 
     if((value = ocrc_lookup("HTTP.SSL.KEY",url_hostport)) != NULL) {
         state->ssl.key = strdup(value);
         if(state->ssl.key == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.SSL.KEY: %s", state->ssl.key);
+            nclog(NCLOGNOTE,"HTTP.SSL.KEY: %s", state->ssl.key);
     }
 
     if((value = ocrc_lookup("HTTP.SSL.KEYPASSWORD",url_hostport)) != NULL) {
         state->ssl.keypasswd = strdup(value);
         if(state->ssl.keypasswd == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.SSL.KEYPASSWORD: %s", state->ssl.keypasswd);
+            nclog(NCLOGNOTE,"HTTP.SSL.KEYPASSWORD: %s", state->ssl.keypasswd);
     }
 
     if((value = ocrc_lookup("HTTP.SSL.CAINFO",url_hostport)) != NULL) {
         state->ssl.cainfo = strdup(value);
         if(state->ssl.cainfo == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.SSL.CAINFO: %s", state->ssl.cainfo);
+            nclog(NCLOGNOTE,"HTTP.SSL.CAINFO: %s", state->ssl.cainfo);
     }
 
     if((value = ocrc_lookup("HTTP.SSL.CAPATH",url_hostport)) != NULL) {
         state->ssl.capath = strdup(value);
         if(state->ssl.capath == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.SSL.CAPATH: %s", state->ssl.capath);
+            nclog(NCLOGNOTE,"HTTP.SSL.CAPATH: %s", state->ssl.capath);
     }
 
     if((value = ocrc_lookup("HTTP.SSL.VERIFYPEER",url_hostport)) != NULL) {
@@ -528,7 +529,7 @@ ocrc_process(OCstate* state)
             tf = 1; /* default if not null */
         state->ssl.verifypeer = tf;
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.SSL.VERIFYPEER: %d", state->ssl.verifypeer);
+            nclog(NCLOGNOTE,"HTTP.SSL.VERIFYPEER: %d", state->ssl.verifypeer);
 	free(s);
     }
 
@@ -538,7 +539,7 @@ ocrc_process(OCstate* state)
         state->curlflags.netrc = strdup(value);
         if(state->curlflags.netrc == NULL) {stat = OC_ENOMEM; goto done;}
         if(ocdebug > 0)
-            oclog(OCLOGNOTE,"HTTP.NETRC: %s", state->curlflags.netrc);
+            nclog(NCLOGNOTE,"HTTP.NETRC: %s", state->curlflags.netrc);
     }
 
     { /* Handle various cases for user + password */
@@ -673,12 +674,12 @@ ocreadrc(void)
 	}
     }
     if(path == NULL) {
-        oclog(OCLOGDBG,"Cannot find runtime configuration file; continuing");
+        nclog(NCLOGDBG,"Cannot find runtime configuration file; continuing");
     } else {
 	if(ocdebug > 0)
 	    fprintf(stderr, "DODS RC file: %s\n", path);
         if(ocdodsrc_read(path) == 0) {
-	    oclog(OCLOGERR, "Error parsing %s\n",path);
+	    nclog(NCLOGERR, "Error parsing %s\n",path);
 	    stat = OC_ERCFILE;
 	}
     }
@@ -715,7 +716,7 @@ rc_search(const char* prefix, const char* rcname, char** pathp)
     /* see if file is readable */
     f = fopen(path,"r");
     if(f != NULL)
-        oclog(OCLOGDBG, "Found rc file=%s",path);
+        nclog(NCLOGDBG, "Found rc file=%s",path);
 done:
     if(f == NULL || stat != OC_NOERR) {
       if(path != NULL)
diff --git a/oc2/ocread.c b/oc2/ocread.c
index b0dfe1e..aec7232 100644
--- a/oc2/ocread.c
+++ b/oc2/ocread.c
@@ -2,18 +2,12 @@
    See the COPYRIGHT file for more information. */
 
 #include "config.h"
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
 #ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
 #endif
@@ -27,8 +21,8 @@
 #include "occurlfunctions.h"
 
 /*Forward*/
-static int readpacket(OCstate* state, OCURI*, OCbytes*, OCdxd, long*);
-static int readfile(const char* path, const char* suffix, OCbytes* packet);
+static int readpacket(OCstate* state, NCURI*, NCbytes*, OCdxd, long*);
+static int readfile(const char* path, const char* suffix, NCbytes* packet);
 static int readfiletofile(const char* path, const char* suffix, FILE* stream, off_t*);
 
 int
@@ -37,7 +31,7 @@ readDDS(OCstate* state, OCtree* tree)
     int stat = OC_NOERR;
     long lastmodified = -1;
 
-    ocurisetconstraints(state->uri,tree->constraint);
+    ncurisetquery(state->uri,tree->constraint);
 
 #ifdef OCDEBUG
 fprintf(stderr,"readDDS:\n");
@@ -54,7 +48,7 @@ readDAS(OCstate* state, OCtree* tree)
 {
     int stat = OC_NOERR;
 
-    ocurisetconstraints(state->uri,tree->constraint);
+    ncurisetquery(state->uri,tree->constraint);
 #ifdef OCDEBUG
 fprintf(stderr,"readDAS:\n");
 #endif
@@ -65,7 +59,7 @@ fprintf(stderr,"readDAS:\n");
 
 #if 0
 int
-readversion(OCstate* state, OCURI* url, OCbytes* packet)
+readversion(OCstate* state, NCURI* url, NCbytes* packet)
 {
    return readpacket(state,url,packet,OCVER,NULL);
 }
@@ -84,7 +78,7 @@ ocdxdextension(OCdxd dxd)
 }
 
 static int
-readpacket(OCstate* state, OCURI* url,OCbytes* packet,OCdxd dxd,long* lastmodified)
+readpacket(OCstate* state, NCURI* url,NCbytes* packet,OCdxd dxd,long* lastmodified)
 {
    int stat = OC_NOERR;
    int fileprotocol = 0;
@@ -97,15 +91,13 @@ readpacket(OCstate* state, OCURI* url,OCbytes* packet,OCdxd dxd,long* lastmodifi
    if(fileprotocol && !state->curlflags.proto_file) {
         /* Short circuit file://... urls*/
 	/* We do this because the test code always needs to read files*/
-	fetchurl = ocuribuild(url,NULL,NULL,0);
+	fetchurl = ncuribuild(url,NULL,NULL,NCURIBASE);
 	stat = readfile(fetchurl,suffix,packet);
     } else {
-	int flags = 0;
-	if(!fileprotocol) {
-	    flags |= OCURICONSTRAINTS;
-	}
-	flags |= OCURIENCODE;
-        fetchurl = ocuribuild(url,NULL,suffix,flags);
+	int flags = NCURIBASE;
+	if(!fileprotocol) flags |= NCURIQUERY;
+	flags |= NCURIENCODE;
+        fetchurl = ncuribuild(url,NULL,suffix,flags);
 	MEMCHECK(fetchurl,OC_ENOMEM);
 	if(ocdebug > 0)
             {fprintf(stderr,"fetch url=%s\n",fetchurl); fflush(stderr);}
@@ -119,7 +111,7 @@ readpacket(OCstate* state, OCURI* url,OCbytes* packet,OCdxd dxd,long* lastmodifi
 #ifdef OCDEBUG
   {
 fprintf(stderr,"readpacket: packet.size=%lu\n",
-		(unsigned long)ocbyteslength(packet));
+		(unsigned long)ncbyteslength(packet));
   }
 #endif
     return OCTHROW(stat);
@@ -135,28 +127,27 @@ readDATADDS(OCstate* state, OCtree* tree, OCflags flags)
 fprintf(stderr,"readDATADDS:\n");
 #endif
     if((flags & OCONDISK) == 0) {
-        ocurisetconstraints(state->uri,tree->constraint);
+        ncurisetquery(state->uri,tree->constraint);
         stat = readpacket(state,state->uri,state->packet,OCDATADDS,&lastmod);
         if(stat == OC_NOERR)
             state->datalastmodified = lastmod;
-        tree->data.datasize = ocbyteslength(state->packet);
+        tree->data.datasize = ncbyteslength(state->packet);
     } else { /*((flags & OCONDISK) != 0) */
-        OCURI* url = state->uri;
+        NCURI* url = state->uri;
         int fileprotocol = 0;
         char* readurl = NULL;
 
         fileprotocol = (strcmp(url->protocol,"file")==0);
 
         if(fileprotocol && !state->curlflags.proto_file) {
-            readurl = ocuribuild(url,NULL,NULL,0);
+            readurl = ncuribuild(url,NULL,NULL,NCURIBASE);
             stat = readfiletofile(readurl, ".dods", tree->data.file, &tree->data.datasize);
         } else {
-            int flags = 0;
-            if(!fileprotocol) flags |= OCURICONSTRAINTS;
-            flags |= OCURIENCODE;
-	    flags |= OCURIUSERPWD;
-            ocurisetconstraints(url,tree->constraint);
-            readurl = ocuribuild(url,NULL,".dods",flags);
+            int flags = NCURIBASE;
+            if(!fileprotocol) flags |= NCURIQUERY;
+            flags |= NCURIENCODE;
+            ncurisetquery(url,tree->constraint);
+            readurl = ncuribuild(url,NULL,".dods",flags);
             MEMCHECK(readurl,OC_ENOMEM);
             if (ocdebug > 0) 
                 {fprintf(stderr, "fetch url=%s\n", readurl);fflush(stderr);}
@@ -176,21 +167,21 @@ static int
 readfiletofile(const char* path, const char* suffix, FILE* stream, off_t* sizep)
 {
     int stat = OC_NOERR;
-    OCbytes* packet = ocbytesnew();
+    NCbytes* packet = ncbytesnew();
     size_t len;
     /* check for leading file:/// */
     if(ocstrncmp(path,"file:///",8)==0) path += 7; /* assume absolute path*/
     stat = readfile(path,suffix,packet);
 #ifdef OCDEBUG
 fprintf(stderr,"readfiletofile: packet.size=%lu\n",
-		(unsigned long)ocbyteslength(packet));
+		(unsigned long)ncbyteslength(packet));
 #endif
     if(stat != OC_NOERR) goto unwind;
-    len = oclistlength(packet);
+    len = nclistlength(packet);
     if(stat == OC_NOERR) {
 	size_t written;
         fseek(stream,0,SEEK_SET);
-	written = fwrite(ocbytescontents(packet),1,len,stream);
+	written = fwrite(ncbytescontents(packet),1,len,stream);
 	if(written != len) {
 #ifdef OCDEBUG
 fprintf(stderr,"readfiletofile: written!=length: %lu :: %lu\n",
@@ -201,12 +192,12 @@ fprintf(stderr,"readfiletofile: written!=length: %lu :: %lu\n",
     }
     if(sizep != NULL) *sizep = len;
 unwind:
-    ocbytesfree(packet);
+    ncbytesfree(packet);
     return OCTHROW(stat);
 }
 
 static int
-readfile(const char* path, const char* suffix, OCbytes* packet)
+readfile(const char* path, const char* suffix, NCbytes* packet)
 {
     int stat = OC_NOERR;
     char buf[1024];
@@ -225,14 +216,14 @@ readfile(const char* path, const char* suffix, OCbytes* packet)
 #endif
     fd = open(filename,flags);
     if(fd < 0) {
-	oclog(OCLOGERR,"open failed:%s",filename);
+	nclog(NCLOGERR,"open failed:%s",filename);
 	return OCTHROW(OC_EOPEN);
     }
     /* Get the file size */
     filesize = lseek(fd,(off_t)0,SEEK_END);
     if(filesize < 0) {
 	stat = OC_EIO;
-	oclog(OCLOGERR,"lseek failed: %s",filename);
+	nclog(NCLOGERR,"lseek failed: %s",filename);
 	goto done;
     }
     /* Move file pointer back to the beginning of the file */
@@ -244,15 +235,15 @@ readfile(const char* path, const char* suffix, OCbytes* packet)
 	    break; /*eof*/
 	else if(count <  0) {
 	    stat = OC_EIO;
-	    oclog(OCLOGERR,"read failed: %s",filename);
+	    nclog(NCLOGERR,"read failed: %s",filename);
 	    goto done;
 	}
-	ocbytesappendn(packet,buf,(unsigned long)count);
+	ncbytesappendn(packet,buf,(unsigned long)count);
 	totalread += count;
     }
     if(totalread < filesize) {
 	stat = OC_EIO;
-	oclog(OCLOGERR,"short read: |%s|=%lu read=%lu\n",
+	nclog(NCLOGERR,"short read: |%s|=%lu read=%lu\n",
 		filename,(unsigned long)filesize,(unsigned long)totalread);
         goto done;
     }
diff --git a/oc2/ocuri.c b/oc2/ocuri.c
deleted file mode 100644
index a8fe65d..0000000
--- a/oc2/ocuri.c
+++ /dev/null
@@ -1,848 +0,0 @@
-/*********************************************************************
- *   Copyright 2010, UCAR/Unidata
- *   See netcdf/COPYRIGHT file for copying and redistribuution conditions.
- *   $Header$
- *********************************************************************/
-
-#include "config.h"
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <assert.h>
-
-#include "oc.h"
-#include "ocuri.h"
-
-#undef OCURIDEBUG
-
-#ifdef OCURIDEBUG
-static int failpoint = 0;
-#define THROW(n) {failpoint=(n); goto fail;}
-#else
-#define THROW(n)
-#endif
-
-
-#define PADDING 8
-
-#define LBRACKET '['
-#define RBRACKET ']'
-#define EOFCHAR '\0'
-
-#ifndef FIX
-#define FIX(s) ((s)==NULL?"NULL":(s))
-#endif
-
-#ifndef NILLEN
-#define NILLEN(s) ((s)==NULL?0:strlen(s))
-#endif
-
-#ifdef HAVE_STRDUP
-#ifndef nulldup
-#define nulldup(s) ((s)==NULL?NULL:strdup(s))
-#endif
-#endif
-
-#ifndef HAVE_STRDUP
-static char* nulldup(char* s)
-{
-    char* dup = NULL;
-    if(s != NULL) {
-	dup = (char*)malloc(strlen(s)+1);
-	if(dup != NULL)
-	    strcpy(dup,s);
-    }
-    return dup;
-}
-#endif
-
-#define terminate(p) {*(p) = EOFCHAR;}
-
-#define endof(p) ((p)+strlen(p))
-
-static struct OC_ProtocolInfo {
-char* name;
-int   filelike; /* 1=>this protocol has no host, user+pwd, or port */
-} legalprotocols[] = {
-{"file",1},
-{"http",0},
-{"https",0},
-{"ftp",0},
-};
-
-/* Allowable character sets for encode */
-static char* fileallow =
-"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$&'()*+,-./:;=?@_~";
-
-static char* queryallow =
-"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$&'()*+,-./:;=?@_~";
-
-/* Forward */
-static void ocparamfree(char** params);
-static int ocfind(char** params, const char* key);
-static void oclshift1(char* p);
-static void ocrshift1(char* p);
-static char* oclocate(char* p, const char* charlist);
-static void ocappendparams(char* newuri, char** p);
-
-/* Do a simple uri parse: return 0 if fail, 1 otherwise*/
-int
-ocuriparse(const char* uri0, OCURI** durip)
-{
-    OCURI* duri = NULL;
-    char* uri = NULL;
-    char* p;
-    char* q;
-    struct OC_ProtocolInfo* proto;
-    int i,nprotos;
-
-    /* accumulate parse points*/
-    char* protocol = NULL;
-    char* host = NULL;
-    char* port = NULL;
-    char* constraint = NULL;
-    char* userpwd = NULL;
-    char* file = NULL;
-    char* prefixparams = NULL;
-    char* suffixparams = NULL;
-
-    if(uri0 == NULL || strlen(uri0) == 0)
-	{THROW(1); goto fail;}
-
-    duri = (OCURI*)calloc(1,sizeof(OCURI));
-    if(duri == NULL)
-	{THROW(2); goto fail;}
-
-    /* save original uri */
-    duri->uri = nulldup(uri0);
-
-    /* make local copy of uri */
-    uri = (char*)malloc(strlen(uri0)+1+PADDING); /* +1 for trailing null,
-                                                    +PADDING for shifting */
-    if(uri == NULL)
-	{THROW(3); goto fail;}
-
-    /* strings will be broken into pieces with intermixed '\0; characters;
-       first char is guaranteed to be '\0' */
-
-    duri->strings = uri;
-    uri++;
-
-    /* dup the incoming url */
-    strcpy(uri,uri0);
-
-    /* Walk the uri and do the following:
-	1. remove all whitespace
-	2. remove all '\\' (Temp hack to remove escape characters
-                            inserted by Windows or MinGW)
-    */
-    for(q=uri,p=uri;*p;p++) {
-	if(*p != '\\' && *p >= ' ') /* compress out */
-	    *q++=*p;
-    }
-    p = uri;
-
-    /* break up the uri string into big chunks: prefixparams, protocol,
-       host section, and the file section (i.e. remainder)
-    */
-
-    /* collect any prefix bracketed parameters */
-    if(*p == LBRACKET) {
-	p++;
-	prefixparams = p;
-	/* find end of the clientparams; convert LB,RB to '&' */
-        for(q=p;*p;p++) {
-	    if(p[0] == RBRACKET && p[1] == LBRACKET) {
-		*q++ = '&';
-		p++;
-	    } else if(p[0] == RBRACKET && p[1] != LBRACKET)
-		break;
-	    else
-		*q++=*p;
-	}
-	if(*p == 0)
-	    {THROW(4); goto fail; /* malformed client params*/}
-        terminate(q); /* nul term the prefixparams */
-	p++; /* move past the final RBRACKET */
-    }
-
-    /* Tag the protocol */
-    protocol = p;
-    p = strchr(p,':');
-    if(!p)
-	{THROW(5); goto fail;}
-    terminate(p); /*overwrite colon*/
-    p++; /* skip the colon */
-
-    /* verify that the uri starts with an acceptable protocol*/
-    nprotos = (sizeof(legalprotocols)/sizeof(struct OC_ProtocolInfo));
-    proto = NULL;
-    for(i=0;i<nprotos;i++) {
-        if(strcmp(protocol,legalprotocols[i].name)==0) {
-	    proto = &legalprotocols[i];
-	    break;
-	}
-    }
-    if(proto == NULL)
-	{THROW(6); goto fail; /* illegal protocol*/}
-
-    /* skip // */
-    if(p[0] != '/' || p[1] != '/')
-	{THROW(7); goto fail;}
-    p += 2;
-
-    /* If this is all we have (proto://) then fail */
-    if(*p == EOFCHAR)
-	{THROW(8); goto fail;}
-
-    /* establish the start of the file section */
-    if(proto->filelike) {/* everything after proto:// */
-	file = p;
-	host = NULL; /* and no host section */
-    } else { /*!proto->filelike => This means there should be a host section */
-        /* locate the end of the host section and therefore the start
-           of the file section */
-	host = p;
-        p  = oclocate(p,"/?#");
-	if(p == NULL) {
-	    file = endof(host); /* there is no file section */
-	} else {
-	    ocrshift1(p); /* make room to terminate the host section
-                             without overwriting the leading character */
-	    terminate(p); /* terminate the host section */
-	    file = p+1; /* +1 becauseof the shift */
-	}
-    }
-
-    /* If you shift in the code below, you must reset file beginning */
-
-    if(host != NULL) {/* Parse the host section */
-	/* Check for leading user:pwd@ */
-        p = strchr(host,'@');
-        if(p) {
-	    if(p == host)
-		{THROW(9); goto fail; /* we have proto://@ */}
-	    userpwd = host;
-	    terminate(p); /* overwrite '@' */
-	    host = p+1; /* start of host ip name */
-	}
-
-        /* extract host and port */
-	p = host;
-        p = strchr(p,':');
-        if(p != NULL) {
-	    terminate(p);
-	    p++;
-	    port = p;
-	    if(*port == EOFCHAR)
-		{THROW(11); goto fail; /* we have proto://...:/ */}
-	    /* The port must look something like a number */
-	    for(;*p;p++) {
-	        if(strchr("0123456789-",*p) == NULL)
-		    {THROW(12); goto fail;  /* probably not a real port, fail */}
-	    }
-	} /* else *p == NULL */
-
-
-        /* check for empty host section */
-	if(*host == EOFCHAR)
-	    {THROW(13); goto fail;}
-
-    }
-
-    assert(file != NULL);
-    p = file;
-
-    /* find the end of the file section and the start of the
-       constraints and/or suffixparams
-    */
-    p = oclocate(p,"?#");
-    if(p != NULL) { /* we have constraint and/or suffixparams */
-	char* fileend = p; /* save the end of the file section */
-	char* constraintend = NULL;
-	if(*p == '?')
-            constraint = p+1;
-	else
-	    constraint = NULL;
-	p = strchr(p,'#'); /* may repeat effect of oclocate above */
-	if(p != NULL) {
-	    constraintend = p;
-	    suffixparams = p+1;
-	} else
-	    suffixparams = NULL;
-	/* Ok, terminate the pieces */
-	terminate(fileend); /* terminate file section */
-	if(constraint != NULL && constraintend != NULL)
-	    terminate(constraintend);
-	/* Suffix params are already terminated
-           since they should be the last section
-           of the original url
-        */
-    }
-
-    /* check for empty sections */
-    if(file != NULL && *file == EOFCHAR)
-	file = NULL; /* empty file section */
-    if(constraint != NULL && *constraint == EOFCHAR)
-	constraint = NULL; /* empty constraint section */
-    if(suffixparams != NULL && *suffixparams == EOFCHAR)
-	suffixparams = NULL; /* empty suffixparams section */
-
-    if(suffixparams != NULL) {
-	if(*suffixparams == EOFCHAR)
-	    suffixparams = NULL; /* suffixparams are empty */
-    }
-
-    /* do last minute empty check */
-    if(protocol != NULL && *protocol == EOFCHAR) protocol = NULL;
-    if(userpwd != NULL && *userpwd == EOFCHAR) userpwd = NULL;
-    if(host != NULL && *host == EOFCHAR) host = NULL;
-    if(port != NULL && *port == EOFCHAR) port = NULL;
-    if(file != NULL && *file == EOFCHAR) file = NULL;
-    if(constraint != NULL && *constraint == EOFCHAR) constraint = NULL;
-
-    /* assemble the component pieces */
-    duri->protocol = protocol;
-    duri->userpwd = userpwd;
-    duri->host = host;
-    duri->port = port;
-    duri->file = file;
-
-    ocurisetconstraints(duri,constraint);
-
-    /* concat suffix and prefix params */
-    if(prefixparams != NULL || suffixparams != NULL) {
-	size_t plen = prefixparams ? strlen(prefixparams) : 0;
-	size_t slen = suffixparams ? strlen(suffixparams) : 0;
-	size_t space = plen + slen + 1;
-	/* add 1 for an extra ampersand if both are defined */
-    if(plen > 0 && slen > 0) space++;
-    /* Add an extra char for null termination. */
-    duri->params = (char*)malloc(space+1);
-    if(duri->params == NULL)
-      return 0;
-    duri->params[0] = EOFCHAR; /* so we can use strcat */
-	if(plen > 0) {
-      strncat(duri->params,prefixparams,space);
-      if(slen > 0)
-		strncat(duri->params,"&",space);
-	}
-	if(slen > 0)
-      strncat(duri->params,suffixparams,space);
-    }
-
-#ifdef OCURIDEBUG
-	{
-	int i,nparms;
-	char** p;
-        fprintf(stderr,"duri:");
-        fprintf(stderr," protocol=|%s|",FIX(duri->protocol));
-        fprintf(stderr," host=|%s|",FIX(duri->host));
-        fprintf(stderr," port=|%s|",FIX(duri->port));
-        fprintf(stderr," file=|%s|",FIX(duri->file));
-        fprintf(stderr," constraint=|%s|",FIX(duri->constraint));
-        fprintf(stderr," params=|%s|",FIX(duri->params));
-        fprintf(stderr,"\n");
-	if(duri->paramlist == NULL) {
-	    if(!ocuridecodeparams(duri)) {
-		fprintf(stderr,"DEBUG: param decode failed\n");
-		duri->paramlist = NULL;
-	    }
-	}
-	if(duri->paramlist != NULL) {
-	    for(p=duri->paramlist,nparms=0;*p;p++,nparms++);
-	    nparms = nparms / 2;
-	    fprintf(stderr,"params:");
-	    for(i=0;i<nparms;i++) {
-	        char** pos = duri->paramlist+(i*2);
-	        fprintf(stderr," %s=|%s|",pos[0],pos[1]);
-	    }
-            fprintf(stderr,"\n");
-	}
-    }
-#endif
-    if(durip != NULL) *durip = duri; else free(duri);
-    return 1;
-
-fail:
-    if(duri != NULL) {
-	ocurifree(duri);
-    }
-    return 0;
-}
-
-void
-ocurifree(OCURI* duri)
-{
-    if(duri == NULL) return;
-    if(duri->uri != NULL) {free(duri->uri);}
-    if(duri->params != NULL) {free(duri->params);}
-    if(duri->paramlist != NULL) ocparamfree(duri->paramlist);
-    if(duri->strings != NULL) {free(duri->strings);}
-    if(duri->constraint != NULL) {free(duri->constraint);}
-    if(duri->projection != NULL) {free(duri->projection);}
-    if(duri->selection != NULL) {free(duri->selection);}
-    free(duri);
-}
-
-/* Replace the constraints */
-void
-ocurisetconstraints(OCURI* duri,const char* constraints)
-{
-    char* proj = NULL;
-    char* select = NULL;
-    const char* p;
-
-    if(duri->constraint != NULL) free(duri->constraint);
-    if(duri->projection != NULL) free(duri->projection);
-    if(duri->selection != NULL) free(duri->selection);
-    duri->constraint = NULL;
-    duri->projection = NULL;
-    duri->selection = NULL;
-
-    if(constraints == NULL || strlen(constraints)==0) return;
-
-    duri->constraint = nulldup(constraints);
-    if(*duri->constraint == '?')
-	oclshift1(duri->constraint);
-
-    p = duri->constraint;
-    proj = (char*) p;
-    select = strchr(proj,'&');
-    if(select != NULL) {
-        size_t plen = (select - proj);
-	if(plen == 0) {
-	    proj = NULL;
-	} else {
-	    proj = (char*)malloc(plen+1);
-	    memcpy((void*)proj,p,plen);
-	    proj[plen] = EOFCHAR;
-	}
-	select = nulldup(select);
-    } else {
-	proj = nulldup(proj);
-	select = NULL;
-    }
-    duri->projection = proj;
-    duri->selection = select;
-}
-
-
-/* Construct a complete OC URI.
-   Optionally with the constraints.
-   Optionally with the user parameters.
-   Caller frees returned string.
-   Optionally encode the pieces.
-*/
-
-char*
-ocuribuild(OCURI* duri, const char* prefix, const char* suffix, int flags)
-{
-    size_t len = 0;
-    char* newuri;
-    char* tmpfile;
-    char* tmpsuffix;
-    char* tmpquery;
-    int nparams = 0;
-    int paramslen = 0;
-
-    /* if both are specified, prefix has priority */
-    int withsuffixparams = ((flags&OCURISUFFIXPARAMS)!=0
-				&& duri->params != NULL);
-    int withprefixparams = ((flags&OCURIPREFIXPARAMS)!=0
-				&& duri->params != NULL);
-    int withuserpwd = ((flags&OCURIUSERPWD)!=0
-	               && duri->userpwd != NULL);
-    int withconstraints = ((flags&OCURICONSTRAINTS)!=0
-	                   && duri->constraint != NULL);
-#ifdef NEWESCAPE
-    int encode = (flags&OCURIENCODE);
-#else
-    int encode = 0;
-#endif
-
-    if(prefix != NULL) len += NILLEN(prefix);
-    len += (NILLEN(duri->protocol)+NILLEN("://"));
-    if(withuserpwd)
-	len += (NILLEN(duri->userpwd)+NILLEN("@"));
-    len += (NILLEN(duri->host));
-    if(duri->port != NULL) {
-	len += (NILLEN(":")+NILLEN(duri->port));
-    }
-
-    tmpfile = duri->file;
-    if(encode)
-	tmpfile = ocuriencode(tmpfile,fileallow);
-    len += (NILLEN(tmpfile));
-
-    if(suffix != NULL) {
-        tmpsuffix = (char*)suffix;
-        if(encode)
-	    tmpsuffix = ocuriencode(tmpsuffix,fileallow);
-        len += (NILLEN(tmpsuffix));
-    }
-
-    if(withconstraints) {
-	tmpquery = duri->constraint;
-        if(encode)
-	    tmpquery = ocuriencode(tmpquery,queryallow);
-        len += (NILLEN("?")+NILLEN(tmpquery));
-    }
-
-    if(withprefixparams || withsuffixparams) {
-	char** p;
-	if(duri->paramlist == NULL)
-	    if(!ocuridecodeparams(duri))
-		return NULL;
-	for(paramslen=0,nparams=0,p=duri->paramlist;*p;p++) {
-	    nparams++;
-	    paramslen += NILLEN(*p);
-	}
-	if(nparams % 2 == 1)
-	    return NULL; /* malformed */
-	nparams = (nparams / 2);
-	len += paramslen;
-	len += 3*nparams; /* for brackets for every param plus possible = */
-	if(withsuffixparams)
-	    len += strlen("#");
-    }
-
-    len += 1; /* null terminator */
-
-    newuri = (char*)malloc(len);
-    if(newuri == NULL) return NULL;
-
-    newuri[0] = EOFCHAR;
-    if(prefix != NULL) strcat(newuri,prefix);
-    if(withprefixparams) {
-	ocappendparams(newuri,duri->paramlist);
-    }
-    if(duri->protocol != NULL)
-	strcat(newuri,duri->protocol);
-    strcat(newuri,"://");
-    if(withuserpwd) {
-        strcat(newuri,duri->userpwd);
-        strcat(newuri,"@");
-    }
-    if(duri->host != NULL) { /* may be null if using file: protocol */
-        strcat(newuri,duri->host);
-    }
-    if(duri->port != NULL) {
-        strcat(newuri,":");
-        strcat(newuri,duri->port);
-    }
-
-    if(tmpfile != NULL) {
-        strcat(newuri,tmpfile);
-        if(suffix != NULL) strcat(newuri,tmpsuffix);
-    }
-    if(withconstraints) {
-	strcat(newuri,"?");
-	strcat(newuri,tmpquery);
-    }
-    if(withsuffixparams & !withprefixparams) {
-	strcat(newuri,"#");
-	ocappendparams(newuri,duri->paramlist);
-    }
-    return newuri;
-}
-
-static void
-ocappendparams(char* newuri, char** p)
-{
-	while(*p) {
-	    strcat(newuri,"[");
-	    strcat(newuri,*p++);
-	    if(strlen(*p) > 0) {
-	        strcat(newuri,"=");
-	        strcat(newuri,*p);
-	    }
-	    p++;
-	    strcat(newuri,"]");
-	}
-}
-
-/**************************************************/
-/* Parameter support */
-
-/*
-In the original url, client parameters are assumed to be one
-or more instances of bracketed pairs: e.g "[...][...]...".
-prefixed to the url. This model has been extended to support
-specification of the parameters as semicolon separated key=value
-pairs in the fragment part of the url.  The fragment part
-starts with a '#' and is the last part of the url.
-
-After the url is parsed, the parameter list
-is converted to a semicolon separated list with all
-whitespace removed.
-In any case, each parameter in turn is assumed to be a
-of the form <name>=<value> or <name>.
-e.g. x=y,z,a=b,w.  If the same parameter is specified more
-than once, then the last occurrence is used; this is so
-that is possible to forcibly override user specified
-parameters by suffixing.  IMPORTANT: client parameter string
-is assumed to have blanks compressed out.  Returns 1 if parse
-succeeded, 0 otherwise; */
-
-int
-ocuridecodeparams(OCURI* ocuri)
-{
-    char* p;
-    int i,c;
-    int nparams;
-    char* params = NULL;
-    char** plist;
-
-    if(ocuri == NULL) return 0;
-    if(ocuri->params == NULL) return 1;
-
-    params = strdup(ocuri->params);
-    if(params == NULL)
-	return 0; /* no memory */
-
-    /* Pass 1:  break string into pieces at the ampersands
-       and count # of pairs */
-    nparams=0;
-    for(p=params;*p;p++) {
-	c = *p;
-	if(c == '&') {*p = EOFCHAR; nparams++;}
-    }
-    nparams++; /* for last one */
-
-    /* plist will be an env style list */
-    plist = (char**)calloc(1,sizeof(char*)*(2*nparams+1)); /* +1 for null termination */
-    if(plist == NULL) {
-	free(params);
-	return 0;
-    }
-
-    /* Break up each param into a (name,value) pair*/
-    /* and insert into the param list */
-    /* parameters of the form name name= are converted to name=""*/
-    for(p=params,i=0;i<nparams;i++) {
-      char* next = p+strlen(p)+1; /* save ptr to next pair*/
-      char* vp;
-      /*break up the ith param*/
-      vp = strchr(p,'=');
-      if(vp != NULL) {*vp = EOFCHAR; vp++;} else {vp = "";}
-      plist[2*i] = nulldup(p);
-      plist[2*i+1] = nulldup(vp);
-      p = next;
-    }
-    plist[2*nparams] = NULL;
-    free(params);
-    if(ocuri->paramlist != NULL)
-	ocparamfree(ocuri->paramlist);
-    ocuri->paramlist = plist;
-    return 1;
-}
-
-int
-ocurilookup(OCURI* uri, const char* key, const char** resultp)
-{
-    int i;
-    char* value = NULL;
-    if(uri == NULL || key == NULL || uri->params == NULL) return 0;
-    if(uri->paramlist == NULL) {
-	i = ocuridecodeparams(uri);
-	if(!i) return 0;
-    }
-    i = ocfind(uri->paramlist,key);
-    if(i < 0)
-	return 0;
-    value = uri->paramlist[(2*i)+1];
-    if(resultp) *resultp = value;
-    return 1;
-}
-
-int
-ocurisetparams(OCURI* uri, const char* newparams)
-{
-    if(uri == NULL) return 0;
-    if(uri->paramlist != NULL) ocparamfree(uri->paramlist);
-    uri->paramlist = NULL;
-    if(uri->params != NULL) free(uri->params);
-    uri->params = nulldup(newparams);
-    return 1;
-}
-
-/* Internal version of lookup; returns the paired index of the key */
-static int
-ocfind(char** params, const char* key)
-{
-    int i;
-    char** p;
-    for(i=0,p=params;*p;p+=2,i++) {
-	if(strcmp(key,*p)==0) return i;
-    }
-    return -1;
-}
-
-static void
-ocparamfree(char** params)
-{
-    char** p;
-    if(params == NULL) return;
-    for(p=params;*p;p+=2) {
-	free(*p);
-	if(p[1] != NULL) free(p[1]);
-    }
-    free(params);
-}
-
-
-/* Return the ptr to the first occurrence of
-   any char in the list. Return NULL if no
-   occurrences
-*/
-static char*
-oclocate(char* p, const char* charlist)
-{
-    for(;*p;p++) {
-	if(strchr(charlist,*p) != NULL)
-	    return p;
-    }
-    return NULL;
-}
-
-
-/* Shift every char starting at p 1 place to the left */
-static void
-oclshift1(char* p)
-{
-    if(p != NULL && *p != EOFCHAR) {
-	char* q = p++;
-	while((*q++=*p++));
-    }
-}
-
-/* Shift every char starting at p 1 place to the right */
-static void
-ocrshift1(char* p)
-{
-    char cur;
-    cur = 0;
-    do {
-	char next = *p;
-	*p++ = cur;
-	cur = next;
-    } while(cur != 0);
-    *p = 0; /* make sure we are still null terminated */
-}
-
-
-/* Provide % encoders and decoders */
-
-
-static char* hexchars = "0123456789abcdefABCDEF";
-
-static void
-toHex(int b, char* hex)
-{
-    hex[0] = hexchars[(b >> 4) & 0xff];
-    hex[1] = hexchars[(b) & 0xff];
-}
-
-
-static int
-fromHex(int c)
-{
-    if(c >= '0' && c <= '9') return (c - '0');
-    if(c >= 'a' && c <= 'f') return (10 + (c - 'a'));
-    if(c >= 'A' && c <= 'F') return (10 + (c - 'A'));
-    return -1;
-}
-
-
-/* Return a string representing encoding of input; caller must free;
-   watch out: will encode whole string, so watch what you give it.
-   Allowable argument specifies characters that do not need escaping.
- */
-
-char*
-ocuriencode(char* s, char* allowable)
-{
-    size_t slen;
-    char* encoded;
-    char* inptr;
-    char* outptr;
-
-    if(s == NULL) return NULL;
-
-    slen = strlen(s);
-    encoded = (char*)malloc((3*slen) + 1); /* max possible size */
-
-    for(inptr=s,outptr=encoded;*inptr;) {
-	int c = *inptr++;
-        if(c == ' ') {
-	    *outptr++ = '+';
-        } else {
-            /* search allowable */
-            int c2;
-	    char* a = allowable;
-	    while((c2=*a++)) {
-		if(c == c2) break;
-	    }
-            if(c2) {*outptr++ = c;}
-            else {
-		char hex[2];
-		toHex(c,hex);
-		*outptr++ = '%';
-		*outptr++ = hex[0];
-		*outptr++ = hex[1];
-            }
-        }
-    }
-    *outptr = EOFCHAR;
-    return encoded;
-}
-
-/* Return a string representing decoding of input; caller must free;*/
-char*
-ocuridecode(char* s)
-{
-    return ocuridecodeonly(s,NULL);
-}
-
-/* Return a string representing decoding of input only for specified
-   characters;  caller must free
-*/
-char*
-ocuridecodeonly(char* s, char* only)
-{
-    size_t slen;
-    char* decoded;
-    char* outptr;
-    char* inptr;
-    unsigned int c;
-
-    if (s == NULL) return NULL;
-    if(only == NULL) only = "";
-
-    slen = strlen(s);
-    decoded = (char*)malloc(slen+1); /* Should be max we need */
-
-    outptr = decoded;
-    inptr = s;
-    while((c = *inptr++)) {
-	if(c == '+' && strchr(only,'+') != NULL)
-	    *outptr++ = ' ';
-	else if(c == '%') {
-            /* try to pull two hex more characters */
-	    if(inptr[0] != EOFCHAR && inptr[1] != EOFCHAR
-		&& strchr(hexchars,inptr[0]) != NULL
-		&& strchr(hexchars,inptr[1]) != NULL) {
-		/* test conversion */
-		int xc = (fromHex(inptr[0]) << 4) | (fromHex(inptr[1]));
-		if(strchr(only,xc) != NULL) {
-		    inptr += 2; /* decode it */
-		    c = xc;
-                }
-            }
-        }
-        *outptr++ = c;
-    }
-    *outptr = EOFCHAR;
-    return decoded;
-}
diff --git a/oc2/ocuri.h b/oc2/ocuri.h
deleted file mode 100644
index 525a656..0000000
--- a/oc2/ocuri.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
-   See the COPYRIGHT file for more information. */
-
-#ifndef OCURI_H
-#define OCURI_H
-
-/*! This is an open structure meaning
-	it is ok to directly access its fields*/
-typedef struct OCURI {
-    char* uri;        /* as passed buy the caller */
-    char* params;     /* all params */
-    char** paramlist;    /*!<null terminated list */
-    char* constraint; /*!< projection+selection */
-    char* projection; /*!< without leading '?'*/
-    char* selection;  /*!< with leading '&'*/
-    char* strings;    /* first char of strings is always '\0' */
-    /* Following all point into the strings field */
-    char* protocol;
-    char* userpwd; /* from user:password@ */
-    char* host;	      /*!< host*/
-    char* port;	      /*!< host */
-    char* file;	      /*!< file */
-} OCURI;
-
-extern int ocuriparse(const char* s, OCURI** ocuri);
-extern void ocurifree(OCURI* ocuri);
-
-/* Replace the constraints */
-extern void ocurisetconstraints(OCURI*,const char* constraints);
-
-/* Construct a complete OC URI; caller frees returned string */
-
-/* Define flags to control what is included */
-#define OCURICONSTRAINTS	 1
-#define OCURIUSERPWD	  	 2
-#define OCURIPREFIXPARAMS  	 4
-#define OCURISUFFIXPARAMS	 8
-#define OCURIPARAMS	  	OCURIPREFIXPARAMS
-#define OCURIENCODE		16 /* If output should be encoded */
-#define OCURISTD	  	(OCURICONSTRAINTS|OCURIUSERPWD)
-#define OCURIALL	  	(0xFFFF)
-
-extern char* ocuribuild(OCURI*,const char* prefix, const char* suffix, int flags);
-
-
-/* Param Management */
-extern int ocuridecodeparams(OCURI* ocuri);
-extern int ocurisetparams(OCURI* ocuri,const char*);
-
-/*! 0 result => entry not found; 1=>found; result holds value (may be null).
-    In any case, the result is imutable and should not be free'd.
-*/
-extern int ocurilookup(OCURI*, const char* param, const char** result);
-
-extern char* ocuriencode(char* s, char* allowable);
-extern char* ocuridecode(char* s);
-extern char* ocuridecodeonly(char* s, char*);
-
-#endif /*OCURI_H*/
diff --git a/oc2/ocutil.c b/oc2/ocutil.c
index e1ea1d4..5ad4200 100644
--- a/oc2/ocutil.c
+++ b/oc2/ocutil.c
@@ -2,18 +2,19 @@
    See the COPYRIGHT file for more information. */
 
 #include "config.h"
+#include <errno.h>
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
 #ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif
-#include <errno.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
 
 #if defined(_WIN32) || defined(_WIN64)
+#include <io.h>
 #define mode_t int
 #endif
 
@@ -57,15 +58,15 @@ ocstrncmp(const char* s1, const char* s2, size_t len)
 
 #if 0
 void
-makedimlist(OClist* path, OClist* dims)
+makedimlist(Nclist* path, Nclist* dims)
 {
     unsigned int i,j;
-    for(i=0;i<oclistlength(path);i++) {
-	OCnode* node = (OCnode*)oclistget(path,i);
+    for(i=0;i<nclistlength(path);i++) {
+	OCnode* node = (OCnode*)nclistget(path,i);
         unsigned int rank = node->array.rank;
 	for(j=0;j<rank;j++) {
-	    OCnode* dim = (OCnode*)oclistget(node->array.dimensions,j);
-	    oclistpush(dims,(void*)dim);
+	    OCnode* dim = (OCnode*)nclistget(node->array.dimensions,j);
+	    nclistpush(dims,(void*)dim);
         }
     }
 }
@@ -75,25 +76,25 @@ void
 ocfreeprojectionclause(OCprojectionclause* clause)
 {
     if(clause->target != NULL) free(clause->target);
-    while(oclistlength(clause->indexsets) > 0) {
-	OClist* slices = (OClist*)oclistpop(clause->indexsets);
-        while(oclistlength(slices) > 0) {
-	    OCslice* slice = (OCslice*)oclistpop(slices);
+    while(nclistlength(clause->indexsets) > 0) {
+	NClist* slices = (NClist*)nclistpop(clause->indexsets);
+        while(nclistlength(slices) > 0) {
+	    OCslice* slice = (OCslice*)nclistpop(slices);
 	    if(slice != NULL) free(slice);
 	}
-        oclistfree(slices);
+        nclistfree(slices);
     }
-    oclistfree(clause->indexsets);
+    nclistfree(clause->indexsets);
     free(clause);
 }
 
 #if 0
 void
-freeAttributes(OClist* attset)
+freeAttributes(NClist* attset)
 {
     unsigned int i,j;
-    for(i=0;i<oclistlength(attset);i++) {
-	OCattribute* att = (OCattribute*)oclistget(attset,i);
+    for(i=0;i<nclistlength(attset);i++) {
+	OCattribute* att = (OCattribute*)nclistget(attset,i);
 	if(att->name != NULL) free(att->name);
 	if(att->etype == OC_String || att->etype == OC_URL) {
 	    for(j=0;j<att->nvalues;j++) {
@@ -118,26 +119,26 @@ freeOCnode(OCnode* cdf, int deep)
     if(cdf->attributes != NULL) freeAttributes(cdf->attributes);
     if(cdf->subnodes != NULL) {
 	if(deep) {
-            for(i=0;i<oclistlength(cdf->subnodes);i++) {
-	        OCnode* node = (OCnode*)oclistget(cdf->subnodes,i);
+            for(i=0;i<nclistlength(cdf->subnodes);i++) {
+	        OCnode* node = (OCnode*)nclistget(cdf->subnodes,i);
 		freeOCnode(node,deep);
 	    }
 	}
-        oclistfree(cdf->subnodes);
+        nclistfree(cdf->subnodes);
     }
     free(cdf);
 }
 #endif
 
 int
-ocfindbod(OCbytes* buffer, size_t* bodp, size_t* ddslenp)
+ocfindbod(NCbytes* buffer, size_t* bodp, size_t* ddslenp)
 {
     unsigned int i;
     char* content;
-    size_t len = ocbyteslength(buffer);
+    size_t len = ncbyteslength(buffer);
     char** marks;
     
-    content = ocbytescontents(buffer);
+    content = ncbytescontents(buffer);
 
     for(marks = DDSdatamarks;*marks;marks++) {
 	char* mark = *marks;
@@ -455,7 +456,7 @@ ocdataddsmsg(OCstate* state, OCtree* tree)
 		if(c > 0 && (c < ' ' || c >= '\177'))
 		    contents[i+j] = ERRFILL;
 	    }
-	    oclog(OCLOGERR,"DATADDS failure, possible message: '%s'\n",
+	    nclog(NCLOGERR,"DATADDS failure, possible message: '%s'\n",
 			contents+i);
 	    goto done;
 	}
@@ -694,7 +695,7 @@ ocmktmp(const char* base, char** tmpnamep)
 {
     int fd;
     char tmpname[OCPATHMAX+1];
-    mode_t mask;
+
     if(!occopycat(tmpname,sizeof(tmpname)-1,1,base)) {
 	return OC_EOVERRUN;
     }
@@ -704,10 +705,11 @@ ocmktmp(const char* base, char** tmpnamep)
     }
     /* Note Potential problem: old versions of this function
        leave the file in mode 0666 instead of 0600 */
-
-    mask=umask(0077);
-    fd = mkstemp(tmpname);
-    (void)umask(mask);
+    {
+	mode_t mask=umask(0077);
+	fd = mkstemp(tmpname);
+	(void)umask(mask);
+    }
 #else /* !HAVE_MKSTEMP */
     /* Need to simulate by using some kind of pseudo-random number */
     {
diff --git a/oc2/ocutil.h b/oc2/ocutil.h
index 0f1b082..453efa5 100644
--- a/oc2/ocutil.h
+++ b/oc2/ocutil.h
@@ -33,9 +33,9 @@ extern size_t ocedgeoffset(size_t rank, size_t*, size_t*);
 
 extern int ocvalidateindices(size_t rank, size_t*, size_t*);
 
-extern void ocmakedimlist(OClist* path, OClist* dims);
+extern void ocmakedimlist(NClist* path, NClist* dims);
 
-extern int ocfindbod(OCbytes* buffer, size_t*, size_t*);
+extern int ocfindbod(NCbytes* buffer, size_t*, size_t*);
 
 /* Reclaimers*/
 extern void ocfreeprojectionclause(OCprojectionclause* clause);
diff --git a/postinstall.sh.in b/postinstall.sh.in
old mode 100755
new mode 100644
diff --git a/test-driver-verbose b/test-driver-verbose
new file mode 100644
index 0000000..d7f96cd
--- /dev/null
+++ b/test-driver-verbose
@@ -0,0 +1,167 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2017-04-02.20; # UTC
+
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+#
+# This program is free software; you can 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, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+  echo "$0: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+              [--expect-failure={yes|no}] [--color-tests={yes|no}]
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+isshellscript()
+{
+    iss_cmd="$1"
+    iss_base=`basename ${iss_cmd}`
+    iss_sh=`basename ${iss_cmd} .sh`
+    if test "x${iss_base}" = "x${iss_sh}" ; then
+      return 1
+    else
+      return 0
+    fi
+}
+
+
+test_name= # Used for reporting.
+log_file=  # Where to save the output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "test-driver $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) enable_hard_errors=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+   *) break;;
+  esac
+  shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+  red='' # Red.
+  grn='' # Green.
+  lgn='' # Light green.
+  blu='' # Blue.
+  mgn='' # Magenta.
+  std=''     # No color.
+else
+  red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+#if isshellscript $1 ; then
+#bash -x "$@" >$log_file 2>&1
+#estatus=$?
+#else
+"$@" >$log_file 2>&1
+estatus=$?
+#fi
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
+  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
+  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;
+  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;
+  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+if test "x$res" != "x0" ; then cat $log_file ; fi
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/test_common.in b/test_common.in
new file mode 100644
index 0000000..553b242
--- /dev/null
+++ b/test_common.in
@@ -0,0 +1,132 @@
+set -e
+
+TOPSRCDIR=@TOPSRCDIR@
+TOPBUILDDIR=@TOPBUILDDIR@
+
+# Figure out various locations in the src/build tree.
+# This is relatively fragile code and is essentially
+# specific to netcdf-c. It does, however, have the virtue
+# of isolating all this nonsense into one place.
+# This will get somewhat simplified (I hope) when
+# we move to a separate test_utilities directory
+
+# This code is intended to provide constants
+# for accessing various objects in the src/build
+# tree(s) across multiple ways of building netcdf-c.
+# Currently, the following build situations are supported.
+# 1. Autoconf with make check: the src and build trees are the same
+# 2. Autoconf with make distcheck: the src and build trees are distinct
+# 3. Cmake on a *nix platform using e.g. gcc:
+#    the src and build trees are distinct.
+# 4. Cmake on windows using cygwin or msys.
+#    The src and build trees are distinct.
+# 
+# For now, an explicit build using the Visual C(++) compiler
+# is not supported. The big issue is the handling of executables
+# and the notion of a VS configuration/build type like Debug or Release.
+# When using VS, executables are placed in a subdirectory of the
+# build directory. That subdirectory is named by the configuration type.
+# Thus one finds ncdump.exe in $top_builddir/ncdump/Debug instead of
+# $top_builddir/ncdump. An additional issue is the extension of an
+# executable: .exe vs nothing. This code attempts to figure out which is used.
+# 
+# For possible future fixes, a placeholder is left in place in the
+# following code named VS. If it were set to the build type, then,
+# in theory, this code would work with Visual C. It is disabled for now.
+# 
+# The goal, then, of this common code is to set up some useful
+#constants for use in test shell scripts.
+# 1. srcdir - absolute path to the source dir (e.g. ${top_srcdir}/ncgen)
+# 2. top_srcdir - absolute path to the root of the source
+# 3. top_builddir - absolute path to the root of the build directory;
+#                   may be same as top_srcdir (e.g. #1).
+# 4. builddir - absolute path of th the directory into which generated
+#               stuff (.nc, .cdl, etc) is stored.
+# 5. execdir - absolute path of the directory into which executables are
+#              placed. For all but the VS case, execdir == builddir.
+#
+# The following are defined to support inter-directory references.
+# 6. NCDUMP - absolute path to the ncdump.exe executable
+# 7. NCCOPY - absolute path to the nccopy.exe executable
+# 8. NCGEN - absolute path to ncgen.exe
+# 9. NCGEN3 - absolute path to ncgen3.exe
+
+# Allow global set -x mechanism for debugging.
+if test "x$SETX" = x1 ; then set -x ; fi
+
+# We assume that TOPSRCDIR and TOPBUILDDIR are defined
+# At the top of this shell script
+top_srcdir="$TOPSRCDIR"
+top_builddir="$TOPBUILDDIR"
+
+# Currently not used, but left as a Visual Studio placeholder.
+# VS=Debug
+
+# srcdir may or may not be defined, but if not, then create it
+if test "x$srcdir" = x ; then
+  # we need to figure out our directory
+  # pick off the last component as the relative name of this directory
+  srcdir=`pwd`
+  current=`basename $srcdir`
+  srcdir="${top_srcdir}/$current"
+fi
+
+# We also assume we are executing in builddir
+builddir=`pwd`
+
+# execdir is an alias for builddir except
+# in the currently unsupported case of using Visual Studio
+execdir="${builddir}$VS"
+
+# pick off the last component as the relative name of this directory
+thisdir=`basename $srcdir`
+
+WD=`pwd`
+# Absolutize paths of interest
+cd $srcdir; srcdir=`pwd` ; cd $WD
+cd $top_srcdir; top_srcdir=`pwd` ; cd $WD
+cd $builddir; builddir=`pwd` ; cd $WD
+cd $top_builddir; top_builddir=`pwd` ; cd $WD
+cd $execdir; execdir=`pwd` ; cd $WD
+
+# If we have cygpath (which only exists under CYGWIN),
+# then try to normalize selected file paths.
+
+# So are we operating under CYGWIN? (test using uname)
+tcc=`uname | cut -d '_'  -f 1`
+if test "x$tcc_os" = xCYGWIN ; then ISCYGWIN=1; fi
+
+# Normalize selected paths
+#if test "x$ISCYGWIN" = x1; then
+#srcdir=`cygpath -mla $srcdir`
+#top_srcdir=`cygpath -mla $top_srcdir`
+#builddir=`cygpath -mla $builddir`
+#top_builddir=`cygpath -mla $top_builddir`
+#execdir=`cygpath -mla $execdir`
+#fi
+
+# For sun os
+export srcdir top_srcdir builddir top_builddir execdir
+
+# Figure out executable extension (probably a better way)
+if test -e "${top_builddir}/ncdump${VS}/ncdump.exe" ; then
+  ext=".exe"
+else
+  ext=""
+fi
+
+# We need to locate certain executables (and other things)
+# and capture absolute paths
+NCDUMP="${top_builddir}/ncdump${VS}/ncdump${ext}"
+NCCOPY="${top_builddir}/ncdump${VS}/nccopy${ext}"
+NCGEN="${top_builddir}/ncgen${VS}/ncgen${ext}"
+NCGEN3="${top_builddir}/ncgen3${VS}/ncgen3${ext}"
+
+# Temporary hacks (until we have a test_utils directory)
+# to locate certain specific test files
+ncgen3c0="${top_srcdir}/ncgen3/c0.cdl"
+ncgenc0="${top_srcdir}/ncgen/c0.cdl"
+ncgenc04="${top_srcdir}/ncgen/c0_4.cdl"
+
+# Make sure we are in builddir (not execdir)
+cd $builddir

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/netcdf.git



More information about the Pkg-grass-devel mailing list